@terminus/ngx-tools
Version:
[![CircleCI][circle-badge]][circle-link] [![codecov][codecov-badge]][codecov-project] [![semantic-release][semantic-release-badge]][semantic-release] [![MIT License][license-image]][license-url] <br> [![NPM version][npm-version-image]][npm-url] [![Github
49 lines • 8.19 kB
JavaScript
import { __read } from "tslib";
import { coerceDateProperty, coerceNumberProperty, } from '@terminus/ngx-tools/coercion';
import { range, throwError, timer, zip, } from 'rxjs';
import { async } from 'rxjs/internal/scheduler/async';
import { mergeMap, retryWhen, take, } from 'rxjs/operators';
import { exponentialBackoffDelayCalculator } from '../retry-with-backoff/delay-calculator';
var DEFAULT_RETRY_COUNT = 2;
var ERROR_CODE_TOO_MANY_REQUESTS = 429;
var ERROR_CODE_500_MIN = 500;
var ERROR_CODE_500_MAX = 599;
export var httpRetryer = function (_a) {
var _b = _a.retries, retries = _b === void 0 ? DEFAULT_RETRY_COUNT : _b, _c = _a.delayCalculator, delayCalculator = _c === void 0 ? exponentialBackoffDelayCalculator({}) : _c, _d = _a.scheduler, scheduler = _d === void 0 ? async : _d;
return retryWhen(function (errors) { return zip(errors, range(1, retries + 1)).pipe(mergeMap(function (_a) {
var _b = __read(_a, 2), err = _b[0], retry = _b[1];
if (retry > retries || !isConsideredError(err)) {
return throwError(err);
}
var waitTime = delayCalculator(retry);
if (err.status === ERROR_CODE_TOO_MANY_REQUESTS) {
var headerWaitTime = extractRetryAfterTime(err);
waitTime = headerWaitTime || waitTime;
}
return timer(waitTime, scheduler).pipe(take(1));
})); });
};
/**
* @param err
*/
function extractRetryAfterTime(err) {
var retryHeaderValue = err.headers.get('Retry-After');
if (retryHeaderValue) {
return coerceNumberProperty(retryHeaderValue, null)
|| coerceDateProperty(retryHeaderValue, null);
}
return null;
}
/**
* @param err
*/
function isConsideredError(err) {
if (err.hasOwnProperty('status') && err.hasOwnProperty('headers')) {
var e = err;
return e.status === 0
|| e.status === ERROR_CODE_TOO_MANY_REQUESTS
|| (e.status >= ERROR_CODE_500_MIN && e.status <= ERROR_CODE_500_MAX);
}
return false;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXRyeWVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRlcm1pbnVzL25neC10b29scy91dGlsaXRpZXMvIiwic291cmNlcyI6WyJodHRwLXJldHJ5ZXIvaHR0cC1yZXRyeWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFDQSxPQUFPLEVBQ0wsa0JBQWtCLEVBQ2xCLG9CQUFvQixHQUNyQixNQUFNLDhCQUE4QixDQUFDO0FBQ3RDLE9BQU8sRUFHTCxLQUFLLEVBRUwsVUFBVSxFQUNWLEtBQUssRUFDTCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDdEQsT0FBTyxFQUNMLFFBQVEsRUFDUixTQUFTLEVBQ1QsSUFBSSxHQUNMLE1BQU0sZ0JBQWdCLENBQUM7QUFFeEIsT0FBTyxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sd0NBQXdDLENBQUM7QUFhM0YsSUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsSUFBTSw0QkFBNEIsR0FBRyxHQUFHLENBQUM7QUFDekMsSUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFDL0IsSUFBTSxrQkFBa0IsR0FBRyxHQUFHLENBQUM7QUFFL0IsTUFBTSxDQUFDLElBQU0sV0FBVyxHQUFHLFVBQUksRUFJQztRQUg5QixlQUE2QixFQUE3QixrREFBNkIsRUFDN0IsdUJBQXVELEVBQXZELDRFQUF1RCxFQUN2RCxpQkFBaUIsRUFBakIsc0NBQWlCO0lBQytDLE9BQUEsU0FBUyxDQUFDLFVBQUMsTUFBNkMsSUFBSyxPQUFBLEdBQUcsQ0FDOUgsTUFBTSxFQUNOLEtBQUssQ0FBQyxDQUFDLEVBQUUsT0FBTyxHQUFHLENBQUMsQ0FBQyxDQUN0QixDQUFDLElBQUksQ0FDSixRQUFRLENBQUMsVUFBQyxFQUFZO1lBQVosa0JBQVksRUFBWCxXQUFHLEVBQUUsYUFBSztRQUNuQixJQUFJLEtBQUssR0FBRyxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUM5QyxPQUFPLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztTQUN4QjtRQUVELElBQUksUUFBUSxHQUFrQixlQUFlLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckQsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLDRCQUE0QixFQUFFO1lBQy9DLElBQU0sY0FBYyxHQUFHLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ2xELFFBQVEsR0FBRyxjQUFjLElBQUksUUFBUSxDQUFDO1NBQ3ZDO1FBRUQsT0FBTyxLQUFLLENBQUMsUUFBUSxFQUFFLFNBQVMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNsRCxDQUFDLENBQUMsQ0FDSCxFQWxCNEgsQ0FrQjVILENBQUM7QUFsQjhELENBa0I5RCxDQUFDO0FBRUw7O0dBRUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLEdBQXNCO0lBQ25ELElBQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFeEQsSUFBSSxnQkFBZ0IsRUFBRTtRQUNwQixPQUFPLG9CQUFvQixDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQztlQUM5QyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNqRDtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxHQUE4QjtJQUN2RCxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUNqRSxJQUFNLENBQUMsR0FBRyxHQUF3QixDQUFDO1FBQ25DLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO2VBQ2hCLENBQUMsQ0FBQyxNQUFNLEtBQUssNEJBQTRCO2VBQ3pDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxrQkFBa0IsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLGtCQUFrQixDQUFDLENBQUM7S0FDekU7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIGNvZXJjZURhdGVQcm9wZXJ0eSxcbiAgY29lcmNlTnVtYmVyUHJvcGVydHksXG59IGZyb20gJ0B0ZXJtaW51cy9uZ3gtdG9vbHMvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uLFxuICBPYnNlcnZhYmxlLFxuICByYW5nZSxcbiAgU2NoZWR1bGVyLFxuICB0aHJvd0Vycm9yLFxuICB0aW1lcixcbiAgemlwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGFzeW5jIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMnO1xuaW1wb3J0IHtcbiAgbWVyZ2VNYXAsXG4gIHJldHJ5V2hlbixcbiAgdGFrZSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBleHBvbmVudGlhbEJhY2tvZmZEZWxheUNhbGN1bGF0b3IgfSBmcm9tICcuLi9yZXRyeS13aXRoLWJhY2tvZmYvZGVsYXktY2FsY3VsYXRvcic7XG5cblxuZXhwb3J0IGludGVyZmFjZSBIdHRwUmV0cnlXaXRoQmFja29mZiB7XG4gIHJldHJpZXM6IG51bWJlcjtcbiAgZGVsYXlDYWxjdWxhdG9yOiAoYXR0ZW1wdDogbnVtYmVyKSA9PiBudW1iZXI7XG4gIC8vIFRPRE86IFNjaGVkdWxlciBpcyBtYXJrZWQgYXMgZGVwcmVjYXRlZCB0byBzdG9wIG90aGVycyBmcm9tIHVzaW5nIGFsdGhvdWdoIGl0IGlzIG5vdCB0ZWNobmljYWxseSBkZXByZWNhdGVkIGZyb21cbiAgLy8gIHdoYXQgSSBjYW4gdGVsbC4gVGhlICdjb3JyZWN0JyBwYXRoIHdvdWxkIGJlIHRvIGNyZWF0ZSBvdXIgb3duIGNsYXNzIGV4dGVuZGluZyBgU2NoZWR1bGVyTGlrZWAuXG4gIC8vICBodHRwczovL2dpdGh1Yi5jb20vR2V0VGVybWludXMvbmd4LXRvb2xzL2lzc3Vlcy8yODdcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHNjaGVkdWxlcjogU2NoZWR1bGVyIHwgYW55O1xufVxuXG5jb25zdCBERUZBVUxUX1JFVFJZX0NPVU5UID0gMjtcbmNvbnN0IEVSUk9SX0NPREVfVE9PX01BTllfUkVRVUVTVFMgPSA0Mjk7XG5jb25zdCBFUlJPUl9DT0RFXzUwMF9NSU4gPSA1MDA7XG5jb25zdCBFUlJPUl9DT0RFXzUwMF9NQVggPSA1OTk7XG5cbmV4cG9ydCBjb25zdCBodHRwUmV0cnllciA9IDxUPih7XG4gIHJldHJpZXMgPSBERUZBVUxUX1JFVFJZX0NPVU5ULFxuICBkZWxheUNhbGN1bGF0b3IgPSBleHBvbmVudGlhbEJhY2tvZmZEZWxheUNhbGN1bGF0b3Ioe30pLFxuICBzY2hlZHVsZXIgPSBhc3luYyxcbn06IFBhcnRpYWw8SHR0cFJldHJ5V2l0aEJhY2tvZmY+KTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFQ+ID0+IHJldHJ5V2hlbigoZXJyb3JzOiBPYnNlcnZhYmxlPEh0dHBFcnJvclJlc3BvbnNlIHwgRXJyb3I+KSA9PiB6aXAoXG4gICAgZXJyb3JzLFxuICAgIHJhbmdlKDEsIHJldHJpZXMgKyAxKSxcbiAgKS5waXBlKFxuICAgIG1lcmdlTWFwKChbZXJyLCByZXRyeV0pID0+IHtcbiAgICAgIGlmIChyZXRyeSA+IHJldHJpZXMgfHwgIWlzQ29uc2lkZXJlZEVycm9yKGVycikpIHtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHdhaXRUaW1lOiBudW1iZXIgfCBEYXRlID0gZGVsYXlDYWxjdWxhdG9yKHJldHJ5KTtcblxuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IEVSUk9SX0NPREVfVE9PX01BTllfUkVRVUVTVFMpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyV2FpdFRpbWUgPSBleHRyYWN0UmV0cnlBZnRlclRpbWUoZXJyKTtcbiAgICAgICAgd2FpdFRpbWUgPSBoZWFkZXJXYWl0VGltZSB8fCB3YWl0VGltZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRpbWVyKHdhaXRUaW1lLCBzY2hlZHVsZXIpLnBpcGUodGFrZSgxKSk7XG4gICAgfSksXG4gICkpO1xuXG4vKipcbiAqIEBwYXJhbSBlcnJcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFJldHJ5QWZ0ZXJUaW1lKGVycjogSHR0cEVycm9yUmVzcG9uc2UpOiBudW1iZXIgfCBEYXRlIHwgbnVsbCB7XG4gIGNvbnN0IHJldHJ5SGVhZGVyVmFsdWUgPSBlcnIuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJyk7XG5cbiAgaWYgKHJldHJ5SGVhZGVyVmFsdWUpIHtcbiAgICByZXR1cm4gY29lcmNlTnVtYmVyUHJvcGVydHkocmV0cnlIZWFkZXJWYWx1ZSwgbnVsbClcbiAgICAgIHx8IGNvZXJjZURhdGVQcm9wZXJ0eShyZXRyeUhlYWRlclZhbHVlLCBudWxsKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZXJyXG4gKi9cbmZ1bmN0aW9uIGlzQ29uc2lkZXJlZEVycm9yKGVycjogSHR0cEVycm9yUmVzcG9uc2UgfCBFcnJvcik6IGVyciBpcyBIdHRwRXJyb3JSZXNwb25zZSB7XG4gIGlmIChlcnIuaGFzT3duUHJvcGVydHkoJ3N0YXR1cycpICYmIGVyci5oYXNPd25Qcm9wZXJ0eSgnaGVhZGVycycpKSB7XG4gICAgY29uc3QgZSA9IGVyciBhcyBIdHRwRXJyb3JSZXNwb25zZTtcbiAgICByZXR1cm4gZS5zdGF0dXMgPT09IDBcbiAgICAgIHx8IGUuc3RhdHVzID09PSBFUlJPUl9DT0RFX1RPT19NQU5ZX1JFUVVFU1RTXG4gICAgICB8fCAoZS5zdGF0dXMgPj0gRVJST1JfQ09ERV81MDBfTUlOICYmIGUuc3RhdHVzIDw9IEVSUk9SX0NPREVfNTAwX01BWCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19