angular-http-handler
Advanced tools
@@ -1,16 +0,20 @@ | ||
| import { catchError, finalize, of, retry, tap } from "rxjs"; | ||
| import { BehaviorSubject, catchError, finalize, of, retry, tap } from "rxjs"; | ||
| 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 configureHandler(config) { | ||
| defaultErrorHandler = config.defaultErrorHandler; | ||
| defaultRetryCount = config.defaultRetryCount ?? 0; | ||
| defaultRetryDelay = config.defaultRetryDelay ?? 0; | ||
| } | ||
| let requestCount = 0; | ||
| let requestsSubject = new BehaviorSubject(0); | ||
| let requests$ = requestsSubject.asObservable(); | ||
| export function pendingRequestsCount() { | ||
| return requests$; | ||
| } | ||
| export function handle(dataSetter, loadingSetter, fallbackValue, errorHandler, retryCount = defaultRetryCount, retryDelay = defaultRetryDelay) { | ||
| return (source$) => { | ||
| requestCount++; | ||
| requestsSubject.next(requestCount); | ||
| if (loadingSetter) { | ||
@@ -23,3 +27,3 @@ loadingSetter(true); | ||
| resetOnSuccess: true | ||
| }), tap((data) => dataSetter(data)), catchError((error, caught) => { | ||
| }), tap((data) => dataSetter(data)), catchError((error) => { | ||
| if (errorHandler) { | ||
@@ -37,2 +41,5 @@ errorHandler(error); | ||
| }), finalize(() => { | ||
| requestCount--; | ||
| requestCount = requestCount < 0 ? 0 : requestCount; | ||
| requestsSubject.next(requestCount); | ||
| if (loadingSetter) { | ||
@@ -44,2 +51,2 @@ loadingSetter(false); | ||
| } | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1odHRwLWhhbmRsZXIvc3JjL2xpYi9odHRwLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLEtBQUssRUFBRSxHQUFHLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFeEUsSUFBSSxtQkFBcUUsQ0FBQztBQUMxRSxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FBMkM7SUFDaEYsbUJBQW1CLEdBQUcsT0FBTyxDQUFDO0FBQ2hDLENBQUM7QUFFRCxJQUFJLGlCQUFpQixHQUFXLENBQUMsQ0FBQztBQUNsQyxNQUFNLFVBQVUsb0JBQW9CLENBQUMsS0FBYTtJQUNoRCxpQkFBaUIsR0FBRyxLQUFLLENBQUM7QUFDNUIsQ0FBQztBQUVELElBQUksaUJBQWlCLEdBQVcsQ0FBQyxDQUFDO0FBQ2xDLE1BQU0sVUFBVSxvQkFBb0IsQ0FBQyxLQUFhO0lBQ2hELGlCQUFpQixHQUFHLEtBQUssQ0FBQztBQUM1QixDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsVUFBaUMsRUFDakMsYUFBMEMsRUFDMUMsYUFBbUIsRUFDbkIsWUFBaUQsRUFDakQsYUFBcUIsaUJBQWlCLEVBQ3RDLGFBQXFCLGlCQUFpQjtJQUV0QyxPQUFPLENBQUMsT0FBc0IsRUFBRSxFQUFFO1FBQ2hDLElBQUcsYUFBYSxFQUFDO1lBQ2YsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1NBQ3JCO1FBQ0QsT0FBTyxPQUFPLENBQUMsSUFBSSxDQUVqQixLQUFLLENBQUM7WUFDSixLQUFLLEVBQUUsVUFBVTtZQUNqQixLQUFLLEVBQUUsVUFBVTtZQUNqQixjQUFjLEVBQUUsSUFBSTtTQUNyQixDQUFDLEVBRUYsR0FBRyxDQUFDLENBQUMsSUFBTyxFQUFFLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsRUFFbEMsVUFBVSxDQUFDLENBQUMsS0FBd0IsRUFBRSxNQUFxQixFQUFFLEVBQUU7WUFDN0QsSUFBSSxZQUFZLEVBQUU7Z0JBQ2hCLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUNyQjtpQkFBTSxJQUFJLG1CQUFtQixFQUFFO2dCQUM5QixtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUM1QjtZQUVELElBQUcsYUFBYSxLQUFLLFNBQVMsRUFBQztnQkFDN0IsVUFBVSxDQUFDLGFBQWtCLENBQUMsQ0FBQztnQkFDL0IsT0FBTyxFQUFFLENBQUMsYUFBa0IsQ0FBQyxDQUFDO2FBQy9CO1lBQ0QsT0FBTyxFQUFFLENBQUMsSUFBUyxDQUFDLENBQUM7UUFDdkIsQ0FBQyxDQUFDLEVBRUYsUUFBUSxDQUFDLEdBQUcsRUFBRTtZQUNaLElBQUcsYUFBYSxFQUFDO2dCQUNmLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQzthQUN0QjtRQUNILENBQUMsQ0FBQyxDQUVILENBQUM7SUFDSixDQUFDLENBQUE7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tIFwiQGFuZ3VsYXIvY29tbW9uL2h0dHBcIjtcclxuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmluYWxpemUsIE9ic2VydmFibGUsIG9mLCByZXRyeSwgdGFwIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmxldCBkZWZhdWx0RXJyb3JIYW5kbGVyOiAoKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdm9pZCkgfCB1bmRlZmluZWQ7XHJcbmV4cG9ydCBmdW5jdGlvbiBzZXREZWZhdWx0RXJyb3JIYW5kbGVyKGhhbmRsZXI6IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHZvaWQpIHtcclxuICBkZWZhdWx0RXJyb3JIYW5kbGVyID0gaGFuZGxlcjtcclxufVxyXG5cclxubGV0IGRlZmF1bHRSZXRyeUNvdW50OiBudW1iZXIgPSAwO1xyXG5leHBvcnQgZnVuY3Rpb24gc2V0RGVmYXVsdFJldHJ5Q291bnQoY291bnQ6IG51bWJlcikge1xyXG4gIGRlZmF1bHRSZXRyeUNvdW50ID0gY291bnQ7XHJcbn1cclxuXHJcbmxldCBkZWZhdWx0UmV0cnlEZWxheTogbnVtYmVyID0gMDtcclxuZXhwb3J0IGZ1bmN0aW9uIHNldERlZmF1bHRSZXRyeURlbGF5KGRlbGF5OiBudW1iZXIpIHtcclxuICBkZWZhdWx0UmV0cnlEZWxheSA9IGRlbGF5O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gaGFuZGxlPFQ+KFxyXG4gICAgZGF0YVNldHRlcjogKHJlc3BvbnNlOiBUKSA9PiB2b2lkLFxyXG4gICAgbG9hZGluZ1NldHRlcj86IChsb2FkaW5nOiBib29sZWFuKSA9PiB2b2lkLFxyXG4gICAgZmFsbGJhY2tWYWx1ZT86IGFueSxcclxuICAgIGVycm9ySGFuZGxlcj86IChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHZvaWQsXHJcbiAgICByZXRyeUNvdW50OiBudW1iZXIgPSBkZWZhdWx0UmV0cnlDb3VudCxcclxuICAgIHJldHJ5RGVsYXk6IG51bWJlciA9IGRlZmF1bHRSZXRyeURlbGF5LFxyXG4gICk6IChzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+KSA9PiBPYnNlcnZhYmxlPFQ+IHtcclxuICAgIHJldHVybiAoc291cmNlJDogT2JzZXJ2YWJsZTxUPikgPT4ge1xyXG4gICAgICBpZihsb2FkaW5nU2V0dGVyKXtcclxuICAgICAgICBsb2FkaW5nU2V0dGVyKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzb3VyY2UkLnBpcGUoXHJcblxyXG4gICAgICAgIHJldHJ5KHtcclxuICAgICAgICAgIGNvdW50OiByZXRyeUNvdW50LFxyXG4gICAgICAgICAgZGVsYXk6IHJldHJ5RGVsYXksXHJcbiAgICAgICAgICByZXNldE9uU3VjY2VzczogdHJ1ZVxyXG4gICAgICAgIH0pLFxyXG5cclxuICAgICAgICB0YXAoKGRhdGE6IFQpID0+IGRhdGFTZXR0ZXIoZGF0YSkpLFxyXG5cclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UsIGNhdWdodDogT2JzZXJ2YWJsZTxUPikgPT4ge1xyXG4gICAgICAgICAgaWYgKGVycm9ySGFuZGxlcikge1xyXG4gICAgICAgICAgICBlcnJvckhhbmRsZXIoZXJyb3IpO1xyXG4gICAgICAgICAgfSBlbHNlIGlmIChkZWZhdWx0RXJyb3JIYW5kbGVyKSB7XHJcbiAgICAgICAgICAgIGRlZmF1bHRFcnJvckhhbmRsZXIoZXJyb3IpO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIGlmKGZhbGxiYWNrVmFsdWUgIT09IHVuZGVmaW5lZCl7XHJcbiAgICAgICAgICAgIGRhdGFTZXR0ZXIoZmFsbGJhY2tWYWx1ZSBhcyBUKTtcclxuICAgICAgICAgICAgcmV0dXJuIG9mKGZhbGxiYWNrVmFsdWUgYXMgVCk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgICByZXR1cm4gb2YobnVsbCBhcyBUKTtcclxuICAgICAgICB9KSxcclxuXHJcbiAgICAgICAgZmluYWxpemUoKCkgPT4ge1xyXG4gICAgICAgICAgaWYobG9hZGluZ1NldHRlcil7XHJcbiAgICAgICAgICAgIGxvYWRpbmdTZXR0ZXIoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG4iXX0= | ||
| //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci1odHRwLWhhbmRsZXIvc3JjL2xpYi9odHRwLWhhbmRsZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGVBQWUsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBUXpGLElBQUksbUJBQXFFLENBQUM7QUFDMUUsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDMUIsSUFBSSxpQkFBaUIsR0FBRyxDQUFDLENBQUM7QUFDMUIsTUFBTSxVQUFVLGdCQUFnQixDQUFDLE1BQXNCO0lBQ3JELG1CQUFtQixHQUFHLE1BQU0sQ0FBQyxtQkFBbUIsQ0FBQztJQUNqRCxpQkFBaUIsR0FBRyxNQUFNLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDO0lBQ2xELGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsSUFBSSxDQUFDLENBQUM7QUFDcEQsQ0FBQztBQUdELElBQUksWUFBWSxHQUFHLENBQUMsQ0FBQztBQUNyQixJQUFJLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBUyxDQUFDLENBQUMsQ0FBQztBQUNyRCxJQUFJLFNBQVMsR0FBRyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUM7QUFFL0MsTUFBTSxVQUFVLG9CQUFvQjtJQUNsQyxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQsTUFBTSxVQUFVLE1BQU0sQ0FDbEIsVUFBaUMsRUFDakMsYUFBMEMsRUFDMUMsYUFBbUIsRUFDbkIsWUFBaUQsRUFDakQsYUFBcUIsaUJBQWlCLEVBQ3RDLGFBQXFCLGlCQUFpQjtJQUV0QyxPQUFPLENBQUMsT0FBc0IsRUFBRSxFQUFFO1FBQ2hDLFlBQVksRUFBRSxDQUFDO1FBQ2YsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUNuQyxJQUFHLGFBQWEsRUFBQztZQUNmLGFBQWEsQ0FBQyxJQUFJLENBQUMsQ0FBQztTQUNyQjtRQUNELE9BQU8sT0FBTyxDQUFDLElBQUksQ0FFakIsS0FBSyxDQUFDO1lBQ0osS0FBSyxFQUFFLFVBQVU7WUFDakIsS0FBSyxFQUFFLFVBQVU7WUFDakIsY0FBYyxFQUFFLElBQUk7U0FDckIsQ0FBQyxFQUVGLEdBQUcsQ0FBQyxDQUFDLElBQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBRWxDLFVBQVUsQ0FBQyxDQUFDLEtBQXdCLEVBQUUsRUFBRTtZQUN0QyxJQUFJLFlBQVksRUFBRTtnQkFDaEIsWUFBWSxDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQ3JCO2lCQUFNLElBQUksbUJBQW1CLEVBQUU7Z0JBQzlCLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxDQUFDO2FBQzVCO1lBRUQsSUFBRyxhQUFhLEtBQUssU0FBUyxFQUFDO2dCQUM3QixVQUFVLENBQUMsYUFBa0IsQ0FBQyxDQUFDO2dCQUMvQixPQUFPLEVBQUUsQ0FBQyxhQUFrQixDQUFDLENBQUM7YUFDL0I7WUFDRCxPQUFPLEVBQUUsQ0FBQyxJQUFTLENBQUMsQ0FBQztRQUN2QixDQUFDLENBQUMsRUFFRixRQUFRLENBQUMsR0FBRyxFQUFFO1lBQ1osWUFBWSxFQUFFLENBQUM7WUFDZixZQUFZLEdBQUcsWUFBWSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUM7WUFDbkQsZUFBZSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztZQUNuQyxJQUFHLGFBQWEsRUFBQztnQkFDZixhQUFhLENBQUMsS0FBSyxDQUFDLENBQUM7YUFDdEI7UUFDSCxDQUFDLENBQUMsQ0FFSCxDQUFDO0lBQ0osQ0FBQyxDQUFBO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCI7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY2F0Y2hFcnJvciwgZmluYWxpemUsIE9ic2VydmFibGUsIG9mLCByZXRyeSwgdGFwIH0gZnJvbSBcInJ4anNcIjtcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSUhhbmRsZXJDb25maWcge1xyXG4gIGRlZmF1bHRSZXRyeUNvdW50PzogbnVtYmVyO1xyXG4gIGRlZmF1bHRSZXRyeURlbGF5PzogbnVtYmVyO1xyXG4gIGRlZmF1bHRFcnJvckhhbmRsZXI/OiAoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB2b2lkO1xyXG59IFxyXG5cclxubGV0IGRlZmF1bHRFcnJvckhhbmRsZXI6ICgoZXJyb3I6IEh0dHBFcnJvclJlc3BvbnNlKSA9PiB2b2lkKSB8IHVuZGVmaW5lZDtcclxubGV0IGRlZmF1bHRSZXRyeUNvdW50ID0gMDtcclxubGV0IGRlZmF1bHRSZXRyeURlbGF5ID0gMDtcclxuZXhwb3J0IGZ1bmN0aW9uIGNvbmZpZ3VyZUhhbmRsZXIoY29uZmlnOiBJSGFuZGxlckNvbmZpZykge1xyXG4gIGRlZmF1bHRFcnJvckhhbmRsZXIgPSBjb25maWcuZGVmYXVsdEVycm9ySGFuZGxlcjtcclxuICBkZWZhdWx0UmV0cnlDb3VudCA9IGNvbmZpZy5kZWZhdWx0UmV0cnlDb3VudCA/PyAwO1xyXG4gIGRlZmF1bHRSZXRyeURlbGF5ID0gY29uZmlnLmRlZmF1bHRSZXRyeURlbGF5ID8/IDA7XHJcbn1cclxuXHJcblxyXG5sZXQgcmVxdWVzdENvdW50ID0gMDtcclxubGV0IHJlcXVlc3RzU3ViamVjdCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigwKTtcclxubGV0IHJlcXVlc3RzJCA9IHJlcXVlc3RzU3ViamVjdC5hc09ic2VydmFibGUoKTtcclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBwZW5kaW5nUmVxdWVzdHNDb3VudCgpOiBPYnNlcnZhYmxlPG51bWJlcj4ge1xyXG4gIHJldHVybiByZXF1ZXN0cyQ7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBoYW5kbGU8VD4oXHJcbiAgICBkYXRhU2V0dGVyOiAocmVzcG9uc2U6IFQpID0+IHZvaWQsXHJcbiAgICBsb2FkaW5nU2V0dGVyPzogKGxvYWRpbmc6IGJvb2xlYW4pID0+IHZvaWQsXHJcbiAgICBmYWxsYmFja1ZhbHVlPzogYW55LFxyXG4gICAgZXJyb3JIYW5kbGVyPzogKGVycm9yOiBIdHRwRXJyb3JSZXNwb25zZSkgPT4gdm9pZCxcclxuICAgIHJldHJ5Q291bnQ6IG51bWJlciA9IGRlZmF1bHRSZXRyeUNvdW50LFxyXG4gICAgcmV0cnlEZWxheTogbnVtYmVyID0gZGVmYXVsdFJldHJ5RGVsYXksXHJcbiAgKTogKHNvdXJjZSQ6IE9ic2VydmFibGU8VD4pID0+IE9ic2VydmFibGU8VD4ge1xyXG4gICAgcmV0dXJuIChzb3VyY2UkOiBPYnNlcnZhYmxlPFQ+KSA9PiB7XHJcbiAgICAgIHJlcXVlc3RDb3VudCsrO1xyXG4gICAgICByZXF1ZXN0c1N1YmplY3QubmV4dChyZXF1ZXN0Q291bnQpO1xyXG4gICAgICBpZihsb2FkaW5nU2V0dGVyKXtcclxuICAgICAgICBsb2FkaW5nU2V0dGVyKHRydWUpO1xyXG4gICAgICB9XHJcbiAgICAgIHJldHVybiBzb3VyY2UkLnBpcGUoXHJcblxyXG4gICAgICAgIHJldHJ5KHtcclxuICAgICAgICAgIGNvdW50OiByZXRyeUNvdW50LFxyXG4gICAgICAgICAgZGVsYXk6IHJldHJ5RGVsYXksXHJcbiAgICAgICAgICByZXNldE9uU3VjY2VzczogdHJ1ZVxyXG4gICAgICAgIH0pLFxyXG5cclxuICAgICAgICB0YXAoKGRhdGE6IFQpID0+IGRhdGFTZXR0ZXIoZGF0YSkpLFxyXG5cclxuICAgICAgICBjYXRjaEVycm9yKChlcnJvcjogSHR0cEVycm9yUmVzcG9uc2UpID0+IHtcclxuICAgICAgICAgIGlmIChlcnJvckhhbmRsZXIpIHtcclxuICAgICAgICAgICAgZXJyb3JIYW5kbGVyKGVycm9yKTtcclxuICAgICAgICAgIH0gZWxzZSBpZiAoZGVmYXVsdEVycm9ySGFuZGxlcikge1xyXG4gICAgICAgICAgICBkZWZhdWx0RXJyb3JIYW5kbGVyKGVycm9yKTtcclxuICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICBpZihmYWxsYmFja1ZhbHVlICE9PSB1bmRlZmluZWQpe1xyXG4gICAgICAgICAgICBkYXRhU2V0dGVyKGZhbGxiYWNrVmFsdWUgYXMgVCk7XHJcbiAgICAgICAgICAgIHJldHVybiBvZihmYWxsYmFja1ZhbHVlIGFzIFQpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwgYXMgVCk7XHJcbiAgICAgICAgfSksXHJcblxyXG4gICAgICAgIGZpbmFsaXplKCgpID0+IHtcclxuICAgICAgICAgIHJlcXVlc3RDb3VudC0tO1xyXG4gICAgICAgICAgcmVxdWVzdENvdW50ID0gcmVxdWVzdENvdW50IDwgMCA/IDAgOiByZXF1ZXN0Q291bnQ7XHJcbiAgICAgICAgICByZXF1ZXN0c1N1YmplY3QubmV4dChyZXF1ZXN0Q291bnQpO1xyXG4gICAgICAgICAgaWYobG9hZGluZ1NldHRlcil7XHJcbiAgICAgICAgICAgIGxvYWRpbmdTZXR0ZXIoZmFsc2UpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICApO1xyXG4gICAgfVxyXG59XHJcblxyXG4iXX0= |
@@ -1,17 +0,21 @@ | ||
| import { retry, tap, catchError, of, finalize } from 'rxjs'; | ||
| import { BehaviorSubject, retry, tap, catchError, of, finalize } from 'rxjs'; | ||
| let defaultErrorHandler; | ||
| function setDefaultErrorHandler(handler) { | ||
| defaultErrorHandler = handler; | ||
| } | ||
| let defaultRetryCount = 0; | ||
| function setDefaultRetryCount(count) { | ||
| defaultRetryCount = count; | ||
| } | ||
| let defaultRetryDelay = 0; | ||
| function setDefaultRetryDelay(delay) { | ||
| defaultRetryDelay = delay; | ||
| function configureHandler(config) { | ||
| defaultErrorHandler = config.defaultErrorHandler; | ||
| defaultRetryCount = config.defaultRetryCount ?? 0; | ||
| defaultRetryDelay = config.defaultRetryDelay ?? 0; | ||
| } | ||
| let requestCount = 0; | ||
| let requestsSubject = new BehaviorSubject(0); | ||
| let requests$ = requestsSubject.asObservable(); | ||
| function pendingRequestsCount() { | ||
| return requests$; | ||
| } | ||
| function handle(dataSetter, loadingSetter, fallbackValue, errorHandler, retryCount = defaultRetryCount, retryDelay = defaultRetryDelay) { | ||
| return (source$) => { | ||
| requestCount++; | ||
| requestsSubject.next(requestCount); | ||
| if (loadingSetter) { | ||
@@ -24,3 +28,3 @@ loadingSetter(true); | ||
| resetOnSuccess: true | ||
| }), tap((data) => dataSetter(data)), catchError((error, caught) => { | ||
| }), tap((data) => dataSetter(data)), catchError((error) => { | ||
| if (errorHandler) { | ||
@@ -38,2 +42,5 @@ errorHandler(error); | ||
| }), finalize(() => { | ||
| requestCount--; | ||
| requestCount = requestCount < 0 ? 0 : requestCount; | ||
| requestsSubject.next(requestCount); | ||
| if (loadingSetter) { | ||
@@ -50,3 +57,3 @@ loadingSetter(false); | ||
| export { handle, setDefaultErrorHandler, setDefaultRetryCount, setDefaultRetryDelay }; | ||
| export { configureHandler, handle, pendingRequestsCount }; | ||
| //# 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\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;;;;"} | ||
| {"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 { BehaviorSubject, catchError, finalize, Observable, of, retry, tap } from \"rxjs\";\r\n\r\nexport interface IHandlerConfig {\r\n defaultRetryCount?: number;\r\n defaultRetryDelay?: number;\r\n defaultErrorHandler?: (error: HttpErrorResponse) => void;\r\n} \r\n\r\nlet defaultErrorHandler: ((error: HttpErrorResponse) => void) | undefined;\r\nlet defaultRetryCount = 0;\r\nlet defaultRetryDelay = 0;\r\nexport function configureHandler(config: IHandlerConfig) {\r\n defaultErrorHandler = config.defaultErrorHandler;\r\n defaultRetryCount = config.defaultRetryCount ?? 0;\r\n defaultRetryDelay = config.defaultRetryDelay ?? 0;\r\n}\r\n\r\n\r\nlet requestCount = 0;\r\nlet requestsSubject = new BehaviorSubject<number>(0);\r\nlet requests$ = requestsSubject.asObservable();\r\n\r\nexport function pendingRequestsCount(): Observable<number> {\r\n return requests$;\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 requestCount++;\r\n requestsSubject.next(requestCount);\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) => {\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 requestCount--;\r\n requestCount = requestCount < 0 ? 0 : requestCount;\r\n requestsSubject.next(requestCount);\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":";;AASA,IAAI,mBAAqE,CAAC;AAC1E,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAC1B,IAAI,iBAAiB,GAAG,CAAC,CAAC;AACpB,SAAU,gBAAgB,CAAC,MAAsB,EAAA;AACrD,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,CAAC,CAAC;AAClD,IAAA,iBAAiB,GAAG,MAAM,CAAC,iBAAiB,IAAI,CAAC,CAAC;AACpD,CAAC;AAGD,IAAI,YAAY,GAAG,CAAC,CAAC;AACrB,IAAI,eAAe,GAAG,IAAI,eAAe,CAAS,CAAC,CAAC,CAAC;AACrD,IAAI,SAAS,GAAG,eAAe,CAAC,YAAY,EAAE,CAAC;SAE/B,oBAAoB,GAAA;AAClC,IAAA,OAAO,SAAS,CAAC;AACnB,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,YAAY,EAAE,CAAC;AACf,QAAA,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACnC,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;AACrB,SAAA,CAAC,EAEF,GAAG,CAAC,CAAC,IAAO,KAAK,UAAU,CAAC,IAAI,CAAC,CAAC,EAElC,UAAU,CAAC,CAAC,KAAwB,KAAI;AACtC,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,YAAY,EAAE,CAAC;AACf,YAAA,YAAY,GAAG,YAAY,GAAG,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;AACnD,YAAA,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;AACnC,YAAA,IAAG,aAAa,EAAC;gBACf,aAAa,CAAC,KAAK,CAAC,CAAC;AACtB,aAAA;SACF,CAAC,CAEH,CAAC;AACJ,KAAC,CAAA;AACL;;AC5EA;;AAEG;;;;"} |
| import { HttpErrorResponse } from "@angular/common/http"; | ||
| import { Observable } from "rxjs"; | ||
| export declare function setDefaultErrorHandler(handler: (error: HttpErrorResponse) => void): void; | ||
| export declare function setDefaultRetryCount(count: number): void; | ||
| export declare function setDefaultRetryDelay(delay: number): void; | ||
| export interface IHandlerConfig { | ||
| defaultRetryCount?: number; | ||
| defaultRetryDelay?: number; | ||
| defaultErrorHandler?: (error: HttpErrorResponse) => void; | ||
| } | ||
| export declare function configureHandler(config: IHandlerConfig): void; | ||
| export declare function pendingRequestsCount(): Observable<number>; | ||
| 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": "1.0.0", | ||
| "version": "1.0.1", | ||
| "description": "This is the http handler utility for Angular http requests", | ||
@@ -5,0 +5,0 @@ "keywords": [ |
+42
-24
@@ -14,3 +14,4 @@ # Angular HTTP Handler | ||
| - Provides a fallback value when the request fails | ||
| - Can return empty arrays or null based on the response type | ||
| - Provides a global loading indicator | ||
| - Provides a global request count | ||
@@ -25,2 +26,3 @@ ## Installation | ||
| ## Usage | ||
@@ -70,5 +72,3 @@ | ||
| ## API | ||
| ### API | ||
| The `handle` function manages HTTP requests with loading state, error handling and retry. | ||
@@ -99,8 +99,11 @@ Parameters: | ||
| 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: | ||
| ## Configuration (Optional) | ||
| If you want to define custom default parameters you should do it in your root component before any http call. | ||
| - The `defaultErrorHandler` set default error handler for every request wrapped by handler. In case custom error handler is passed as a parameter to handle function it will overwrite the default one. | ||
| - The `defaultRetryCount` and `defaultRetryDelay` set default number of retry in case of error and time between the calls. | ||
| ```typescript | ||
| import { HttpErrorResponse } from '@angular/common/http'; | ||
| import { Component, OnInit } from '@angular/core'; | ||
| import { setDefaultErrorHandler } from 'angular-http-handler'; | ||
| import { defaultErrorHandler } from 'angular-http-handler'; | ||
@@ -113,6 +116,11 @@ @Component({ | ||
| export class AppComponent implements OnInit { | ||
| ngOnInit(): void { | ||
| setDefaultErrorHandler((error: HttpErrorResponse) => { | ||
| console.log('deafult handler', error); | ||
| customErrorHandlerFuction(error); | ||
| configureHandler({ | ||
| defaultErrorHandler: (error: HttpErrorResponse) => { | ||
| console.log('deafult handler', error); | ||
| }, | ||
| defaultRetryCount: 0, | ||
| defaultRetryDelay: 0 | ||
| }); | ||
@@ -123,10 +131,16 @@ } | ||
| ### Fallback Response Behavior | ||
| 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: | ||
| 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. | ||
| ## Aditional Options | ||
| ### `pendingRequestsCount()` | ||
| This function returns an Observable<number> that emits the total number of pending requests. It helps track how many requests wrapped by handler are still in progress. | ||
| ```typescript | ||
| import { HttpErrorResponse } from '@angular/common/http'; | ||
| import { Component, OnInit } from '@angular/core'; | ||
| import { setDefaultRetryCount, setDefaultRetryDelay } from 'angular-http-handler'; | ||
| import { Component, OnDestroy, OnInit } from '@angular/core'; | ||
| import { pendingRequestsCount } from 'angular-http-handler'; | ||
| import { Subscription } from 'rxjs'; | ||
| @Component({ | ||
@@ -137,13 +151,17 @@ selector: 'app-root', | ||
| }) | ||
| export class AppComponent implements OnInit { | ||
| export class AppComponent implements OnInit, OnDestroy { | ||
| subs = new Subscription; | ||
| ngOnInit(): void { | ||
| setDefaultRetryCount(2); | ||
| setDefaultRetryDelay(500); | ||
| this.subs = pendingRequestsCount().subscribe(count => { | ||
| console.log('Pending request count: ', count); | ||
| }); | ||
| } | ||
| ngOnDestroy(): void { | ||
| this.subs.unsubscribe(); | ||
| } | ||
| } | ||
| ``` | ||
| ## 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. | ||
| ``` |
20939
18.05%122
17.31%160
12.68%