angular-http-handler
Advanced tools
| import { catchError, finalize, of, retry, tap } from "rxjs"; | ||
| export function handle(dataSetter, loadingSetter, errorHandler, retryCount = 0, retryDelay) { | ||
| return (source$) => source$.pipe(tap(() => { | ||
| let defaultErrorHandler; | ||
| export function setDefaultErrorHandler(handler) { | ||
| defaultErrorHandler = handler; | ||
| } | ||
| let defaultRetryCount = 0; | ||
| export function setDefaultRetryCount(count) { | ||
| defaultRetryCount = count; | ||
| } | ||
| let defaultRetryDelay = 0; | ||
| export function setDefaultRetryDelay(delay) { | ||
| defaultRetryDelay = delay; | ||
| } | ||
| export function handle(dataSetter, loadingSetter, fallbackValue, errorHandler, retryCount = defaultRetryCount, retryDelay = defaultRetryDelay) { | ||
| return (source$) => { | ||
| if (loadingSetter) { | ||
| loadingSetter(true); | ||
| } | ||
| }), retry({ | ||
| count: retryCount, | ||
| delay: retryDelay, | ||
| resetOnSuccess: true | ||
| }), tap((data) => dataSetter(data)), catchError((error) => { | ||
| /* const errorMsg = error.error instanceof ErrorEvent | ||
| ? `Error: ${error.error.message}` // Client-side error | ||
| : `Error Code: ${error.status}, Message: ${error.message}`; // Server-side error | ||
| console.error(errorMsg); */ | ||
| // Call the provided error handler if it exists | ||
| if (errorHandler) { | ||
| errorHandler(error); | ||
| } | ||
| const fallback = (Array.isArray([]) ? [] : null); | ||
| dataSetter(fallback); | ||
| return of(fallback); | ||
| }), finalize(() => { | ||
| if (loadingSetter) { | ||
| loadingSetter(false); | ||
| } | ||
| })); | ||
| return source$.pipe(retry({ | ||
| count: retryCount, | ||
| delay: retryDelay, | ||
| resetOnSuccess: true | ||
| }), tap((data) => dataSetter(data)), catchError((error, caught) => { | ||
| if (errorHandler) { | ||
| errorHandler(error); | ||
| } | ||
| else if (defaultErrorHandler) { | ||
| defaultErrorHandler(error); | ||
| } | ||
| if (fallbackValue !== undefined) { | ||
| dataSetter(fallbackValue); | ||
| return of(fallbackValue); | ||
| } | ||
| return of(null); | ||
| }), finalize(() => { | ||
| if (loadingSetter) { | ||
| loadingSetter(false); | ||
| } | ||
| })); | ||
| }; | ||
| } | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1odHRwLWhhbmRsZXIvc3JjL2xpYi9odHRwLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFeEUsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsVUFBaUMsRUFDakMsYUFBMEMsRUFDMUMsWUFBaUQsRUFDakQsYUFBcUIsQ0FBQyxFQUN0QixVQUFtQjtJQUVuQixPQUFPLENBQUMsT0FBc0IsRUFBRSxFQUFFLENBQ2hDLE9BQU8sQ0FBQyxJQUFJLENBQ1YsR0FBRyxDQUFDLEdBQUcsRUFBRTtRQUNQLElBQUcsYUFBYSxFQUFDO1lBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JCO0lBQ0gsQ0FBQyxDQUFDLEVBQ0YsS0FBSyxDQUFDO1FBQ0osS0FBSyxFQUFFLFVBQVU7UUFDakIsS0FBSyxFQUFFLFVBQVU7UUFDakIsY0FBYyxFQUFFLElBQUk7S0FDckIsQ0FBQyxFQUNGLEdBQUcsQ0FBQyxDQUFDLElBQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQ2xDLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQzdCOzs7K0NBR3VDO1FBRTNCLCtDQUErQztRQUMvQyxJQUFJLFlBQVksRUFBRTtZQUNkLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN2QjtRQUVELE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxFQUFrQixDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFNLENBQUM7UUFFdEUsVUFBVSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQ3JCLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ3hCLENBQUMsQ0FBQyxFQUNGLFFBQVEsQ0FBQyxHQUFHLEVBQUU7UUFDWixJQUFHLGFBQWEsRUFBQztZQUNmLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUN0QjtJQUNILENBQUMsQ0FBQyxDQUNMLENBQUM7QUFDSixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUsIE9ic2VydmFibGUsIG9mLCByZXRyeSwgdGFwIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGU8VD4oXHJcbiAgICBkYXRhU2V0dGVyOiAocmVzcG9uc2U6IFQpID0+IHZvaWQsXHJcbiAgICBsb2FkaW5nU2V0dGVyPzogKGxvYWRpbmc6IGJvb2xlYW4pID0+IHZvaWQsXHJcbiAgICBlcnJvckhhbmRsZXI/OiAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB2b2lkLFxyXG4gICAgcmV0cnlDb3VudDogbnVtYmVyID0gMCxcclxuICAgIHJldHJ5RGVsYXk/OiBudW1iZXIsXHJcbiAgKTogKHNvdXJjZSQ6IE9ic2VydmFibGU8VD4pID0+IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIChzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+KSA9PlxyXG4gICAgICBzb3VyY2UkLnBpcGUoXHJcbiAgICAgICAgdGFwKCgpID0+IHtcclxuICAgICAgICAgIGlmKGxvYWRpbmdTZXR0ZXIpe1xyXG4gICAgICAgICAgICBsb2FkaW5nU2V0dGVyKHRydWUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHJldHJ5KHtcclxuICAgICAgICAgIGNvdW50OiByZXRyeUNvdW50LFxyXG4gICAgICAgICAgZGVsYXk6IHJldHJ5RGVsYXksXHJcbiAgICAgICAgICByZXNldE9uU3VjY2VzczogdHJ1ZVxyXG4gICAgICAgIH0pLFxyXG4gICAgICAgIHRhcCgoZGF0YTogVCkgPT4gZGF0YVNldHRlcihkYXRhKSksXHJcbiAgICAgICAgY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcclxuLyogICAgICAgICAgICAgY29uc3QgZXJyb3JNc2cgPSBlcnJvci5lcnJvciBpbnN0YW5jZW9mIEVycm9yRXZlbnQgXHJcbiAgICAgICAgICAgID8gYEVycm9yOiAke2Vycm9yLmVycm9yLm1lc3NhZ2V9YCAvLyBDbGllbnQtc2lkZSBlcnJvclxyXG4gICAgICAgICAgICA6IGBFcnJvciBDb2RlOiAke2Vycm9yLnN0YXR1c30sIE1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gOyAvLyBTZXJ2ZXItc2lkZSBlcnJvclxyXG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTXNnKTsgKi9cclxuICAgICAgICBcclxuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgcHJvdmlkZWQgZXJyb3IgaGFuZGxlciBpZiBpdCBleGlzdHNcclxuICAgICAgICAgICAgaWYgKGVycm9ySGFuZGxlcikge1xyXG4gICAgICAgICAgICAgICAgZXJyb3JIYW5kbGVyKGVycm9yKTtcclxuICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgY29uc3QgZmFsbGJhY2sgPSAoQXJyYXkuaXNBcnJheShbXSBhcyB1bmtub3duIGFzIFQpID8gW10gOiBudWxsKSBhcyBUO1xyXG4gICAgICAgICAgICBcclxuICAgICAgICAgICAgZGF0YVNldHRlcihmYWxsYmFjayk7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihmYWxsYmFjayk7XHJcbiAgICAgICAgfSksXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgaWYobG9hZGluZ1NldHRlcil7XHJcbiAgICAgICAgICAgIGxvYWRpbmdTZXR0ZXIoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG4gIH0iXX0= | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1odHRwLWhhbmRsZXIvc3JjL2xpYi9odHRwLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFeEUsSUFBSSxtQkFBcUUsQ0FBQztBQUMxRSxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBMkM7SUFDaEYsbUJBQW1CLEdBQUcsT0FBTyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxJQUFJLGlCQUFpQixHQUFXLENBQUMsQ0FBQztBQUNsQyxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBYTtJQUNoRCxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQztBQUVELElBQUksaUJBQWlCLEdBQVcsQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxLQUFhO0lBQ2hELGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsVUFBaUMsRUFDakMsYUFBMEMsRUFDMUMsYUFBbUIsRUFDbkIsWUFBaUQsRUFDakQsYUFBcUIsaUJBQWlCLEVBQ3RDLGFBQXFCLGlCQUFpQjtJQUV0QyxPQUFPLENBQUMsT0FBc0IsRUFBRSxFQUFFO1FBQ2hDLElBQUcsYUFBYSxFQUFDO1lBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUVqQixLQUFLLENBQUM7WUFDSixLQUFLLEVBQUUsVUFBVTtZQUNqQixLQUFLLEVBQUUsVUFBVTtZQUNqQixjQUFjLEVBQUUsSUFBSTtTQUNyQixDQUFDLEVBRUYsR0FBRyxDQUFDLENBQUMsSUFBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFFbEMsVUFBVSxDQUFDLENBQUMsS0FBd0IsRUFBRSxNQUFxQixFQUFFLEVBQUU7WUFDN0QsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtpQkFBTSxJQUFJLG1CQUFtQixFQUFFO2dCQUM5QixtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QjtZQUVELElBQUcsYUFBYSxLQUFLLFNBQVMsRUFBQztnQkFDN0IsVUFBVSxDQUFDLGFBQWtCLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxFQUFFLENBQUMsYUFBa0IsQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBUyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLEVBRUYsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUcsYUFBYSxFQUFDO2dCQUNmLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUVILENBQUM7SUFDSixDQUFDLENBQUE7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUsIE9ic2VydmFibGUsIG9mLCByZXRyeSwgdGFwIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmxldCBkZWZhdWx0RXJyb3JIYW5kbGVyOiAoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0RXJyb3JIYW5kbGVyKGhhbmRsZXI6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHZvaWQpIHtcclxuICBkZWZhdWx0RXJyb3JIYW5kbGVyID0gaGFuZGxlcjtcclxufVxyXG5cclxubGV0IGRlZmF1bHRSZXRyeUNvdW50OiBudW1iZXIgPSAwO1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFJldHJ5Q291bnQoY291bnQ6IG51bWJlcikge1xyXG4gIGRlZmF1bHRSZXRyeUNvdW50ID0gY291bnQ7XHJcbn1cclxuXHJcbmxldCBkZWZhdWx0UmV0cnlEZWxheTogbnVtYmVyID0gMDtcclxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRSZXRyeURlbGF5KGRlbGF5OiBudW1iZXIpIHtcclxuICBkZWZhdWx0UmV0cnlEZWxheSA9IGRlbGF5O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlPFQ+KFxyXG4gICAgZGF0YVNldHRlcjogKHJlc3BvbnNlOiBUKSA9PiB2b2lkLFxyXG4gICAgbG9hZGluZ1NldHRlcj86IChsb2FkaW5nOiBib29sZWFuKSA9PiB2b2lkLFxyXG4gICAgZmFsbGJhY2tWYWx1ZT86IGFueSxcclxuICAgIGVycm9ySGFuZGxlcj86IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHZvaWQsXHJcbiAgICByZXRyeUNvdW50OiBudW1iZXIgPSBkZWZhdWx0UmV0cnlDb3VudCxcclxuICAgIHJldHJ5RGVsYXk6IG51bWJlciA9IGRlZmF1bHRSZXRyeURlbGF5LFxyXG4gICk6IChzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+KSA9PiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiAoc291cmNlJDogT2JzZXJ2YWJsZTxUPikgPT4ge1xyXG4gICAgICBpZihsb2FkaW5nU2V0dGVyKXtcclxuICAgICAgICBsb2FkaW5nU2V0dGVyKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzb3VyY2UkLnBpcGUoXHJcblxyXG4gICAgICAgIHJldHJ5KHtcclxuICAgICAgICAgIGNvdW50OiByZXRyeUNvdW50LFxyXG4gICAgICAgICAgZGVsYXk6IHJldHJ5RGVsYXksXHJcbiAgICAgICAgICByZXNldE9uU3VjY2VzczogdHJ1ZVxyXG4gICAgICAgIH0pLFxyXG5cclxuICAgICAgICB0YXAoKGRhdGE6IFQpID0+IGRhdGFTZXR0ZXIoZGF0YSkpLFxyXG5cclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UsIGNhdWdodDogT2JzZXJ2YWJsZTxUPikgPT4ge1xyXG4gICAgICAgICAgaWYgKGVycm9ySGFuZGxlcikge1xyXG4gICAgICAgICAgICBlcnJvckhhbmRsZXIoZXJyb3IpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0RXJyb3JIYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRFcnJvckhhbmRsZXIoZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmKGZhbGxiYWNrVmFsdWUgIT09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgIGRhdGFTZXR0ZXIoZmFsbGJhY2tWYWx1ZSBhcyBUKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbGxiYWNrVmFsdWUgYXMgVCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCBhcyBUKTtcclxuICAgICAgICB9KSxcclxuXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgaWYobG9hZGluZ1NldHRlcil7XHJcbiAgICAgICAgICAgIGxvYWRpbmdTZXR0ZXIoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG4iXX0= |
@@ -1,29 +0,42 @@ | ||
| import { tap, retry, catchError, of, finalize } from 'rxjs'; | ||
| import { retry, tap, catchError, of, finalize } from 'rxjs'; | ||
| function handle(dataSetter, loadingSetter, errorHandler, retryCount = 0, retryDelay) { | ||
| return (source$) => source$.pipe(tap(() => { | ||
| let defaultErrorHandler; | ||
| function setDefaultErrorHandler(handler) { | ||
| defaultErrorHandler = handler; | ||
| } | ||
| let defaultRetryCount = 0; | ||
| function setDefaultRetryCount(count) { | ||
| defaultRetryCount = count; | ||
| } | ||
| let defaultRetryDelay = 0; | ||
| function setDefaultRetryDelay(delay) { | ||
| defaultRetryDelay = delay; | ||
| } | ||
| function handle(dataSetter, loadingSetter, fallbackValue, errorHandler, retryCount = defaultRetryCount, retryDelay = defaultRetryDelay) { | ||
| return (source$) => { | ||
| if (loadingSetter) { | ||
| loadingSetter(true); | ||
| } | ||
| }), retry({ | ||
| count: retryCount, | ||
| delay: retryDelay, | ||
| resetOnSuccess: true | ||
| }), tap((data) => dataSetter(data)), catchError((error) => { | ||
| /* const errorMsg = error.error instanceof ErrorEvent | ||
| ? `Error: ${error.error.message}` // Client-side error | ||
| : `Error Code: ${error.status}, Message: ${error.message}`; // Server-side error | ||
| console.error(errorMsg); */ | ||
| // Call the provided error handler if it exists | ||
| if (errorHandler) { | ||
| errorHandler(error); | ||
| } | ||
| const fallback = (Array.isArray([]) ? [] : null); | ||
| dataSetter(fallback); | ||
| return of(fallback); | ||
| }), finalize(() => { | ||
| if (loadingSetter) { | ||
| loadingSetter(false); | ||
| } | ||
| })); | ||
| return source$.pipe(retry({ | ||
| count: retryCount, | ||
| delay: retryDelay, | ||
| resetOnSuccess: true | ||
| }), tap((data) => dataSetter(data)), catchError((error, caught) => { | ||
| if (errorHandler) { | ||
| errorHandler(error); | ||
| } | ||
| else if (defaultErrorHandler) { | ||
| defaultErrorHandler(error); | ||
| } | ||
| if (fallbackValue !== undefined) { | ||
| dataSetter(fallbackValue); | ||
| return of(fallbackValue); | ||
| } | ||
| return of(null); | ||
| }), finalize(() => { | ||
| if (loadingSetter) { | ||
| loadingSetter(false); | ||
| } | ||
| })); | ||
| }; | ||
| } | ||
@@ -35,3 +48,3 @@ | ||
| export { handle }; | ||
| export { handle, setDefaultErrorHandler, setDefaultRetryCount, setDefaultRetryDelay }; | ||
| //# sourceMappingURL=angular-http-handler.mjs.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"angular-http-handler.mjs","sources":["../../../projects/angular-http-handler/src/lib/http-handler.ts","../../../projects/angular-http-handler/src/angular-http-handler.ts"],"sourcesContent":["import { HttpErrorResponse } from \"@angular/common/http\";\r\nimport { catchError, finalize, Observable, of, retry, tap } from \"rxjs\";\r\n\r\nexport function handle<T>(\r\n dataSetter: (response: T) => void,\r\n loadingSetter?: (loading: boolean) => void,\r\n errorHandler?: (error: HttpErrorResponse) => void,\r\n retryCount: number = 0,\r\n retryDelay?: number,\r\n ): (source$: Observable<T>) => Observable<T> {\r\n return (source$: Observable<T>) =>\r\n source$.pipe(\r\n tap(() => {\r\n if(loadingSetter){\r\n loadingSetter(true);\r\n }\r\n }),\r\n retry({\r\n count: retryCount,\r\n delay: retryDelay,\r\n resetOnSuccess: true\r\n }),\r\n tap((data: T) => dataSetter(data)),\r\n catchError((error) => {\r\n/* const errorMsg = error.error instanceof ErrorEvent \r\n ? `Error: ${error.error.message}` // Client-side error\r\n : `Error Code: ${error.status}, Message: ${error.message}`; // Server-side error\r\n console.error(errorMsg); */\r\n \r\n // Call the provided error handler if it exists\r\n if (errorHandler) {\r\n errorHandler(error);\r\n }\r\n\r\n const fallback = (Array.isArray([] as unknown as T) ? [] : null) as T;\r\n \r\n dataSetter(fallback);\r\n return of(fallback);\r\n }),\r\n finalize(() => {\r\n if(loadingSetter){\r\n loadingSetter(false);\r\n }\r\n })\r\n );\r\n }","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAGgB,SAAA,MAAM,CAClB,UAAiC,EACjC,aAA0C,EAC1C,YAAiD,EACjD,UAAA,GAAqB,CAAC,EACtB,UAAmB,EAAA;AAEnB,IAAA,OAAO,CAAC,OAAsB,KAC5B,OAAO,CAAC,IAAI,CACV,GAAG,CAAC,MAAK;AACP,QAAA,IAAG,aAAa,EAAC;YACf,aAAa,CAAC,IAAI,CAAC,CAAC;AACrB,SAAA;KACF,CAAC,EACF,KAAK,CAAC;AACJ,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,KAAK,EAAE,UAAU;AACjB,QAAA,cAAc,EAAE,IAAI;AACrB,KAAA,CAAC,EACF,GAAG,CAAC,CAAC,IAAO,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,EAClC,UAAU,CAAC,CAAC,KAAK,KAAI;AAC7B;;;AAGuC;;AAG3B,QAAA,IAAI,YAAY,EAAE;YACd,YAAY,CAAC,KAAK,CAAC,CAAC;AACvB,SAAA;AAED,QAAA,MAAM,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,EAAkB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAM,CAAC;QAEtE,UAAU,CAAC,QAAQ,CAAC,CAAC;AACrB,QAAA,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC;AACxB,KAAC,CAAC,EACF,QAAQ,CAAC,MAAK;AACZ,QAAA,IAAG,aAAa,EAAC;YACf,aAAa,CAAC,KAAK,CAAC,CAAC;AACtB,SAAA;KACF,CAAC,CACL,CAAC;AACJ;;AC7CF;;AAEG;;;;"} | ||
| {"version":3,"file":"angular-http-handler.mjs","sources":["../../../projects/angular-http-handler/src/lib/http-handler.ts","../../../projects/angular-http-handler/src/angular-http-handler.ts"],"sourcesContent":["import { HttpErrorResponse } from \"@angular/common/http\";\r\nimport { catchError, finalize, Observable, of, retry, tap } from \"rxjs\";\r\n\r\nlet defaultErrorHandler: ((error: HttpErrorResponse) => void) | undefined;\r\nexport function setDefaultErrorHandler(handler: (error: HttpErrorResponse) => void) {\r\n defaultErrorHandler = handler;\r\n}\r\n\r\nlet defaultRetryCount: number = 0;\r\nexport function setDefaultRetryCount(count: number) {\r\n defaultRetryCount = count;\r\n}\r\n\r\nlet defaultRetryDelay: number = 0;\r\nexport function setDefaultRetryDelay(delay: number) {\r\n defaultRetryDelay = delay;\r\n}\r\n\r\nexport function handle<T>(\r\n dataSetter: (response: T) => void,\r\n loadingSetter?: (loading: boolean) => void,\r\n fallbackValue?: any,\r\n errorHandler?: (error: HttpErrorResponse) => void,\r\n retryCount: number = defaultRetryCount,\r\n retryDelay: number = defaultRetryDelay,\r\n ): (source$: Observable<T>) => Observable<T> {\r\n return (source$: Observable<T>) => {\r\n if(loadingSetter){\r\n loadingSetter(true);\r\n }\r\n return source$.pipe(\r\n\r\n retry({\r\n count: retryCount,\r\n delay: retryDelay,\r\n resetOnSuccess: true\r\n }),\r\n\r\n tap((data: T) => dataSetter(data)),\r\n\r\n catchError((error: HttpErrorResponse, caught: Observable<T>) => {\r\n if (errorHandler) {\r\n errorHandler(error);\r\n } else if (defaultErrorHandler) {\r\n defaultErrorHandler(error);\r\n }\r\n\r\n if(fallbackValue !== undefined){\r\n dataSetter(fallbackValue as T);\r\n return of(fallbackValue as T);\r\n }\r\n return of(null as T);\r\n }),\r\n\r\n finalize(() => {\r\n if(loadingSetter){\r\n loadingSetter(false);\r\n }\r\n })\r\n\r\n );\r\n }\r\n}\r\n\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;AAGA,IAAI,mBAAqE,CAAC;AACpE,SAAU,sBAAsB,CAAC,OAA2C,EAAA;IAChF,mBAAmB,GAAG,OAAO,CAAC;AAChC,CAAC;AAED,IAAI,iBAAiB,GAAW,CAAC,CAAC;AAC5B,SAAU,oBAAoB,CAAC,KAAa,EAAA;IAChD,iBAAiB,GAAG,KAAK,CAAC;AAC5B,CAAC;AAED,IAAI,iBAAiB,GAAW,CAAC,CAAC;AAC5B,SAAU,oBAAoB,CAAC,KAAa,EAAA;IAChD,iBAAiB,GAAG,KAAK,CAAC;AAC5B,CAAC;AAEe,SAAA,MAAM,CAClB,UAAiC,EACjC,aAA0C,EAC1C,aAAmB,EACnB,YAAiD,EACjD,UAAA,GAAqB,iBAAiB,EACtC,aAAqB,iBAAiB,EAAA;IAEtC,OAAO,CAAC,OAAsB,KAAI;AAChC,QAAA,IAAG,aAAa,EAAC;YACf,aAAa,CAAC,IAAI,CAAC,CAAC;AACrB,SAAA;AACD,QAAA,OAAO,OAAO,CAAC,IAAI,CAEjB,KAAK,CAAC;AACJ,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,KAAK,EAAE,UAAU;AACjB,YAAA,cAAc,EAAE,IAAI;SACrB,CAAC,EAEF,GAAG,CAAC,CAAC,IAAO,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,EAElC,UAAU,CAAC,CAAC,KAAwB,EAAE,MAAqB,KAAI;AAC7D,YAAA,IAAI,YAAY,EAAE;gBAChB,YAAY,CAAC,KAAK,CAAC,CAAC;AACrB,aAAA;AAAM,iBAAA,IAAI,mBAAmB,EAAE;gBAC9B,mBAAmB,CAAC,KAAK,CAAC,CAAC;AAC5B,aAAA;YAED,IAAG,aAAa,KAAK,SAAS,EAAC;gBAC7B,UAAU,CAAC,aAAkB,CAAC,CAAC;AAC/B,gBAAA,OAAO,EAAE,CAAC,aAAkB,CAAC,CAAC;AAC/B,aAAA;AACD,YAAA,OAAO,EAAE,CAAC,IAAS,CAAC,CAAC;AACvB,SAAC,CAAC,EAEF,QAAQ,CAAC,MAAK;AACZ,YAAA,IAAG,aAAa,EAAC;gBACf,aAAa,CAAC,KAAK,CAAC,CAAC;AACtB,aAAA;SACF,CAAC,CAEH,CAAC;AACJ,KAAC,CAAA;AACL;;AC9DA;;AAEG;;;;"} |
| import { HttpErrorResponse } from "@angular/common/http"; | ||
| import { Observable } from "rxjs"; | ||
| export declare function handle<T>(dataSetter: (response: T) => void, loadingSetter?: (loading: boolean) => void, errorHandler?: (error: HttpErrorResponse) => void, retryCount?: number, retryDelay?: number): (source$: Observable<T>) => Observable<T>; | ||
| export declare function setDefaultErrorHandler(handler: (error: HttpErrorResponse) => void): void; | ||
| export declare function setDefaultRetryCount(count: number): void; | ||
| export declare function setDefaultRetryDelay(delay: number): void; | ||
| export declare function handle<T>(dataSetter: (response: T) => void, loadingSetter?: (loading: boolean) => void, fallbackValue?: any, errorHandler?: (error: HttpErrorResponse) => void, retryCount?: number, retryDelay?: number): (source$: Observable<T>) => Observable<T>; |
+1
-1
| { | ||
| "name": "angular-http-handler", | ||
| "version": "0.0.2", | ||
| "version": "1.0.0", | ||
| "description": "This is the http handler utility for Angular http requests", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
+55
-12
@@ -56,2 +56,3 @@ # Angular HTTP Handler | ||
| }, | ||
| [], // OPTIONAL - custom fallback value | ||
| (error) => { // OPTIONAL - custom error handler | ||
@@ -68,16 +69,6 @@ console.log(error); | ||
| ## Fallback Response Behavior | ||
| The `handle` function guarantees that a fallback response will always be returned in case of an error, based on the type of the response (`T`). | ||
| - **If the expected response is an array type (e.g., `string[]`, `any[]`)**, the fallback will be an empty array (`[]`). | ||
| - **If the expected response is any other type (e.g., `string`, `number`, `object`)**, the fallback will be `null`. | ||
| This ensures that the `dataSetter` will always receive a value of type `T` even in the case of an error, simplifying error handling and avoiding undefined values in your application. | ||
| ## API | ||
| The handle function manages HTTP requests with loading state, error handling and retry. | ||
| The `handle` function manages HTTP requests with loading state, error handling and retry. | ||
| Parameters: | ||
@@ -91,2 +82,5 @@ | ||
| - fallbackValue?: any | ||
| Value that will be returned in case of error. | ||
| - errorHandler?: (error: HttpErrorResponse) => void | ||
@@ -102,2 +96,51 @@ Optional function to handle errors (e.g., console.error(error)). | ||
| - Returns | ||
| An Observable<T> that handles the request, error, retry. | ||
| An Observable<T> that handles the request, error, retry. | ||
| The `setDefaultErrorHandler` set default error handler for every handler request. In case custom error handler is passed as a parameter to handle function it will overwrite the default one. | ||
| Use it on root component on init method: | ||
| ```typescript | ||
| import { HttpErrorResponse } from '@angular/common/http'; | ||
| import { Component, OnInit } from '@angular/core'; | ||
| import { setDefaultErrorHandler } from 'angular-http-handler'; | ||
| @Component({ | ||
| selector: 'app-root', | ||
| templateUrl: './app.component.html', | ||
| styleUrls: ['./app.component.css'] | ||
| }) | ||
| export class AppComponent implements OnInit { | ||
| ngOnInit(): void { | ||
| setDefaultErrorHandler((error: HttpErrorResponse) => { | ||
| console.log('deafult handler', error); | ||
| customErrorHandlerFuction(error); | ||
| }); | ||
| } | ||
| } | ||
| ``` | ||
| The `defaultRetryCount` and `setDefaultRetryDelay` set default number of retry in case of error and time between the calls. If you pass it as a parameter it will overwrite the default value. | ||
| Use it on root component on init method: | ||
| ```typescript | ||
| import { HttpErrorResponse } from '@angular/common/http'; | ||
| import { Component, OnInit } from '@angular/core'; | ||
| import { setDefaultRetryCount, setDefaultRetryDelay } from 'angular-http-handler'; | ||
| @Component({ | ||
| selector: 'app-root', | ||
| templateUrl: './app.component.html', | ||
| styleUrls: ['./app.component.css'] | ||
| }) | ||
| export class AppComponent implements OnInit { | ||
| ngOnInit(): void { | ||
| setDefaultRetryCount(2); | ||
| setDefaultRetryDelay(500); | ||
| } | ||
| } | ||
| ``` | ||
| ## Fallback Response Behavior | ||
| The `handle` function returns a fallback response in case you define it as a 3rd parameter. In case you do not define it it will remain undefined and it will not trigger dataSetter function. |
No v1
QualityPackage is not semver >=1. This means it is not stable and does not support ^ ranges.
Found 1 instance in 1 package
17738
25.17%104
38.67%0
-100%142
43.43%