UNPKG

@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

44 lines 7.89 kB
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'; const DEFAULT_RETRY_COUNT = 2; const ERROR_CODE_TOO_MANY_REQUESTS = 429; const ERROR_CODE_500_MIN = 500; const ERROR_CODE_500_MAX = 599; export const httpRetryer = ({ retries = DEFAULT_RETRY_COUNT, delayCalculator = exponentialBackoffDelayCalculator({}), scheduler = async, }) => retryWhen((errors) => zip(errors, range(1, retries + 1)).pipe(mergeMap(([err, retry]) => { if (retry > retries || !isConsideredError(err)) { return throwError(err); } let waitTime = delayCalculator(retry); if (err.status === ERROR_CODE_TOO_MANY_REQUESTS) { const headerWaitTime = extractRetryAfterTime(err); waitTime = headerWaitTime || waitTime; } return timer(waitTime, scheduler).pipe(take(1)); }))); /** * @param err */ function extractRetryAfterTime(err) { const 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')) { const 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXRyeWVyLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRlcm1pbnVzL25neC10b29scy91dGlsaXRpZXMvIiwic291cmNlcyI6WyJodHRwLXJldHJ5ZXIvaHR0cC1yZXRyeWVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFDTCxrQkFBa0IsRUFDbEIsb0JBQW9CLEdBQ3JCLE1BQU0sOEJBQThCLENBQUM7QUFDdEMsT0FBTyxFQUdMLEtBQUssRUFFTCxVQUFVLEVBQ1YsS0FBSyxFQUNMLEdBQUcsR0FDSixNQUFNLE1BQU0sQ0FBQztBQUNkLE9BQU8sRUFBRSxLQUFLLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUN0RCxPQUFPLEVBQ0wsUUFBUSxFQUNSLFNBQVMsRUFDVCxJQUFJLEdBQ0wsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4QixPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQWEzRixNQUFNLG1CQUFtQixHQUFHLENBQUMsQ0FBQztBQUM5QixNQUFNLDRCQUE0QixHQUFHLEdBQUcsQ0FBQztBQUN6QyxNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUMvQixNQUFNLGtCQUFrQixHQUFHLEdBQUcsQ0FBQztBQUUvQixNQUFNLENBQUMsTUFBTSxXQUFXLEdBQUcsQ0FBSSxFQUM3QixPQUFPLEdBQUcsbUJBQW1CLEVBQzdCLGVBQWUsR0FBRyxpQ0FBaUMsQ0FBQyxFQUFFLENBQUMsRUFDdkQsU0FBUyxHQUFHLEtBQUssR0FDYSxFQUErQixFQUFFLENBQUMsU0FBUyxDQUFDLENBQUMsTUFBNkMsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUM5SCxNQUFNLEVBQ04sS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLEdBQUcsQ0FBQyxDQUFDLENBQ3RCLENBQUMsSUFBSSxDQUNKLFFBQVEsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7SUFDeEIsSUFBSSxLQUFLLEdBQUcsT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEVBQUU7UUFDOUMsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDeEI7SUFFRCxJQUFJLFFBQVEsR0FBa0IsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBRXJELElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyw0QkFBNEIsRUFBRTtRQUMvQyxNQUFNLGNBQWMsR0FBRyxxQkFBcUIsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNsRCxRQUFRLEdBQUcsY0FBYyxJQUFJLFFBQVEsQ0FBQztLQUN2QztJQUVELE9BQU8sS0FBSyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEQsQ0FBQyxDQUFDLENBQ0gsQ0FBQyxDQUFDO0FBRUw7O0dBRUc7QUFDSCxTQUFTLHFCQUFxQixDQUFDLEdBQXNCO0lBQ25ELE1BQU0sZ0JBQWdCLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUM7SUFFeEQsSUFBSSxnQkFBZ0IsRUFBRTtRQUNwQixPQUFPLG9CQUFvQixDQUFDLGdCQUFnQixFQUFFLElBQUksQ0FBQztlQUM5QyxrQkFBa0IsQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsQ0FBQztLQUNqRDtJQUNELE9BQU8sSUFBSSxDQUFDO0FBQ2QsQ0FBQztBQUVEOztHQUVHO0FBQ0gsU0FBUyxpQkFBaUIsQ0FBQyxHQUE4QjtJQUN2RCxJQUFJLEdBQUcsQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLElBQUksR0FBRyxDQUFDLGNBQWMsQ0FBQyxTQUFTLENBQUMsRUFBRTtRQUNqRSxNQUFNLENBQUMsR0FBRyxHQUF3QixDQUFDO1FBQ25DLE9BQU8sQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDO2VBQ2hCLENBQUMsQ0FBQyxNQUFNLEtBQUssNEJBQTRCO2VBQ3pDLENBQUMsQ0FBQyxDQUFDLE1BQU0sSUFBSSxrQkFBa0IsSUFBSSxDQUFDLENBQUMsTUFBTSxJQUFJLGtCQUFrQixDQUFDLENBQUM7S0FDekU7SUFDRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBIdHRwRXJyb3JSZXNwb25zZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7XG4gIGNvZXJjZURhdGVQcm9wZXJ0eSxcbiAgY29lcmNlTnVtYmVyUHJvcGVydHksXG59IGZyb20gJ0B0ZXJtaW51cy9uZ3gtdG9vbHMvY29lcmNpb24nO1xuaW1wb3J0IHtcbiAgTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uLFxuICBPYnNlcnZhYmxlLFxuICByYW5nZSxcbiAgU2NoZWR1bGVyLFxuICB0aHJvd0Vycm9yLFxuICB0aW1lcixcbiAgemlwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGFzeW5jIH0gZnJvbSAncnhqcy9pbnRlcm5hbC9zY2hlZHVsZXIvYXN5bmMnO1xuaW1wb3J0IHtcbiAgbWVyZ2VNYXAsXG4gIHJldHJ5V2hlbixcbiAgdGFrZSxcbn0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBleHBvbmVudGlhbEJhY2tvZmZEZWxheUNhbGN1bGF0b3IgfSBmcm9tICcuLi9yZXRyeS13aXRoLWJhY2tvZmYvZGVsYXktY2FsY3VsYXRvcic7XG5cblxuZXhwb3J0IGludGVyZmFjZSBIdHRwUmV0cnlXaXRoQmFja29mZiB7XG4gIHJldHJpZXM6IG51bWJlcjtcbiAgZGVsYXlDYWxjdWxhdG9yOiAoYXR0ZW1wdDogbnVtYmVyKSA9PiBudW1iZXI7XG4gIC8vIFRPRE86IFNjaGVkdWxlciBpcyBtYXJrZWQgYXMgZGVwcmVjYXRlZCB0byBzdG9wIG90aGVycyBmcm9tIHVzaW5nIGFsdGhvdWdoIGl0IGlzIG5vdCB0ZWNobmljYWxseSBkZXByZWNhdGVkIGZyb21cbiAgLy8gIHdoYXQgSSBjYW4gdGVsbC4gVGhlICdjb3JyZWN0JyBwYXRoIHdvdWxkIGJlIHRvIGNyZWF0ZSBvdXIgb3duIGNsYXNzIGV4dGVuZGluZyBgU2NoZWR1bGVyTGlrZWAuXG4gIC8vICBodHRwczovL2dpdGh1Yi5jb20vR2V0VGVybWludXMvbmd4LXRvb2xzL2lzc3Vlcy8yODdcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGRlcHJlY2F0aW9uL2RlcHJlY2F0aW9uLCBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gIHNjaGVkdWxlcjogU2NoZWR1bGVyIHwgYW55O1xufVxuXG5jb25zdCBERUZBVUxUX1JFVFJZX0NPVU5UID0gMjtcbmNvbnN0IEVSUk9SX0NPREVfVE9PX01BTllfUkVRVUVTVFMgPSA0Mjk7XG5jb25zdCBFUlJPUl9DT0RFXzUwMF9NSU4gPSA1MDA7XG5jb25zdCBFUlJPUl9DT0RFXzUwMF9NQVggPSA1OTk7XG5cbmV4cG9ydCBjb25zdCBodHRwUmV0cnllciA9IDxUPih7XG4gIHJldHJpZXMgPSBERUZBVUxUX1JFVFJZX0NPVU5ULFxuICBkZWxheUNhbGN1bGF0b3IgPSBleHBvbmVudGlhbEJhY2tvZmZEZWxheUNhbGN1bGF0b3Ioe30pLFxuICBzY2hlZHVsZXIgPSBhc3luYyxcbn06IFBhcnRpYWw8SHR0cFJldHJ5V2l0aEJhY2tvZmY+KTogTW9ub1R5cGVPcGVyYXRvckZ1bmN0aW9uPFQ+ID0+IHJldHJ5V2hlbigoZXJyb3JzOiBPYnNlcnZhYmxlPEh0dHBFcnJvclJlc3BvbnNlIHwgRXJyb3I+KSA9PiB6aXAoXG4gICAgZXJyb3JzLFxuICAgIHJhbmdlKDEsIHJldHJpZXMgKyAxKSxcbiAgKS5waXBlKFxuICAgIG1lcmdlTWFwKChbZXJyLCByZXRyeV0pID0+IHtcbiAgICAgIGlmIChyZXRyeSA+IHJldHJpZXMgfHwgIWlzQ29uc2lkZXJlZEVycm9yKGVycikpIHtcbiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKTtcbiAgICAgIH1cblxuICAgICAgbGV0IHdhaXRUaW1lOiBudW1iZXIgfCBEYXRlID0gZGVsYXlDYWxjdWxhdG9yKHJldHJ5KTtcblxuICAgICAgaWYgKGVyci5zdGF0dXMgPT09IEVSUk9SX0NPREVfVE9PX01BTllfUkVRVUVTVFMpIHtcbiAgICAgICAgY29uc3QgaGVhZGVyV2FpdFRpbWUgPSBleHRyYWN0UmV0cnlBZnRlclRpbWUoZXJyKTtcbiAgICAgICAgd2FpdFRpbWUgPSBoZWFkZXJXYWl0VGltZSB8fCB3YWl0VGltZTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIHRpbWVyKHdhaXRUaW1lLCBzY2hlZHVsZXIpLnBpcGUodGFrZSgxKSk7XG4gICAgfSksXG4gICkpO1xuXG4vKipcbiAqIEBwYXJhbSBlcnJcbiAqL1xuZnVuY3Rpb24gZXh0cmFjdFJldHJ5QWZ0ZXJUaW1lKGVycjogSHR0cEVycm9yUmVzcG9uc2UpOiBudW1iZXIgfCBEYXRlIHwgbnVsbCB7XG4gIGNvbnN0IHJldHJ5SGVhZGVyVmFsdWUgPSBlcnIuaGVhZGVycy5nZXQoJ1JldHJ5LUFmdGVyJyk7XG5cbiAgaWYgKHJldHJ5SGVhZGVyVmFsdWUpIHtcbiAgICByZXR1cm4gY29lcmNlTnVtYmVyUHJvcGVydHkocmV0cnlIZWFkZXJWYWx1ZSwgbnVsbClcbiAgICAgIHx8IGNvZXJjZURhdGVQcm9wZXJ0eShyZXRyeUhlYWRlclZhbHVlLCBudWxsKTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLyoqXG4gKiBAcGFyYW0gZXJyXG4gKi9cbmZ1bmN0aW9uIGlzQ29uc2lkZXJlZEVycm9yKGVycjogSHR0cEVycm9yUmVzcG9uc2UgfCBFcnJvcik6IGVyciBpcyBIdHRwRXJyb3JSZXNwb25zZSB7XG4gIGlmIChlcnIuaGFzT3duUHJvcGVydHkoJ3N0YXR1cycpICYmIGVyci5oYXNPd25Qcm9wZXJ0eSgnaGVhZGVycycpKSB7XG4gICAgY29uc3QgZSA9IGVyciBhcyBIdHRwRXJyb3JSZXNwb25zZTtcbiAgICByZXR1cm4gZS5zdGF0dXMgPT09IDBcbiAgICAgIHx8IGUuc3RhdHVzID09PSBFUlJPUl9DT0RFX1RPT19NQU5ZX1JFUVVFU1RTXG4gICAgICB8fCAoZS5zdGF0dXMgPj0gRVJST1JfQ09ERV81MDBfTUlOICYmIGUuc3RhdHVzIDw9IEVSUk9SX0NPREVfNTAwX01BWCk7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufVxuIl19