New Research: Supply Chain Attack on Axios Pulls Malicious Dependency from npm.Details
Socket
Book a DemoSign in
Socket

angular-http-handler

Package Overview
Dependencies
Maintainers
1
Versions
6
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

angular-http-handler - npm Package Compare versions

Comparing version
1.0.0
to
1.0.1
+18
-11
esm2022/lib/http-handler.mjs

@@ -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>;
{
"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.
```