@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
34 lines • 4.27 kB
JavaScript
import { range, throwError, timer, zip, } from 'rxjs';
import { mergeMap, retryWhen, } from 'rxjs/operators';
import { exponentialBackoffDelayCalculator } from './delay-calculator';
const DEFAULT_RETRY_COUNT = 3;
/**
* Return the difference in time in words
*
* @param options - The options object
* - `retries`: How many times it should retry before throwing an error
* - `delayCalculator`: The calculator to determine the delay timing
* @returns The observable timer
*
* @example
* return this.exampleDatabase.getSomething()
* .pipe(
* map((res: MyResponse) => {
* if (res) {
* return res;
* } else {
* return null;
* }
* }),
* retryWithBackoff({}), // Using default options
* )
* ;
*/
export const retryWithBackoff = ({ retries = DEFAULT_RETRY_COUNT, delayCalculator = exponentialBackoffDelayCalculator({}), }) => retryWhen(errors => zip(errors, range(1, retries))
.pipe(mergeMap(([err, retry]) => {
if (retry >= retries) {
return throwError(err);
}
return timer(delayCalculator(retry));
})));
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmV0cnktd2l0aC1iYWNrb2ZmLmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHRlcm1pbnVzL25neC10b29scy91dGlsaXRpZXMvIiwic291cmNlcyI6WyJyZXRyeS13aXRoLWJhY2tvZmYvcmV0cnktd2l0aC1iYWNrb2ZmLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCxLQUFLLEVBQ0wsVUFBVSxFQUNWLEtBQUssRUFDTCxHQUFHLEdBQ0osTUFBTSxNQUFNLENBQUM7QUFDZCxPQUFPLEVBQ0wsUUFBUSxFQUNSLFNBQVMsR0FDVixNQUFNLGdCQUFnQixDQUFDO0FBRXhCLE9BQU8sRUFBRSxpQ0FBaUMsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBV3ZFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxDQUFDO0FBRzlCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7R0FxQkc7QUFDSCxNQUFNLENBQUMsTUFBTSxnQkFBZ0IsR0FBRyxDQUFJLEVBQ2xDLE9BQU8sR0FBRyxtQkFBbUIsRUFDN0IsZUFBZSxHQUFHLGlDQUFpQyxDQUFDLEVBQUUsQ0FBQyxHQUM3QixFQUErQixFQUFFLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUNqRixNQUFNLEVBQ04sS0FBSyxDQUFDLENBQUMsRUFBRSxPQUFPLENBQUMsQ0FDbEI7S0FDRSxJQUFJLENBQ0gsUUFBUSxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtJQUN4QixJQUFJLEtBQUssSUFBSSxPQUFPLEVBQUU7UUFDcEIsT0FBTyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDeEI7SUFDRCxPQUFPLEtBQUssQ0FBQyxlQUFlLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztBQUN2QyxDQUFDLENBQUMsQ0FDSCxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb24sXG4gIHJhbmdlLFxuICB0aHJvd0Vycm9yLFxuICB0aW1lcixcbiAgemlwLFxufSBmcm9tICdyeGpzJztcbmltcG9ydCB7XG4gIG1lcmdlTWFwLFxuICByZXRyeVdoZW4sXG59IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHsgZXhwb25lbnRpYWxCYWNrb2ZmRGVsYXlDYWxjdWxhdG9yIH0gZnJvbSAnLi9kZWxheS1jYWxjdWxhdG9yJztcblxuXG4vKipcbiAqIFRoZSBvcHRpb25zIG9iamVjdCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gYHJldHJ5V2l0aEJhY2tvZmZgXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgUmV0cnlXaXRoQmFja29mZiB7XG4gIHJldHJpZXM6IG51bWJlcjtcbiAgZGVsYXlDYWxjdWxhdG9yOiAoYXR0ZW1wdDogbnVtYmVyKSA9PiBudW1iZXI7XG59XG5cbmNvbnN0IERFRkFVTFRfUkVUUllfQ09VTlQgPSAzO1xuXG5cbi8qKlxuICogUmV0dXJuIHRoZSBkaWZmZXJlbmNlIGluIHRpbWUgaW4gd29yZHNcbiAqXG4gKiBAcGFyYW0gb3B0aW9ucyAtIFRoZSBvcHRpb25zIG9iamVjdFxuICogICAtIGByZXRyaWVzYDogSG93IG1hbnkgdGltZXMgaXQgc2hvdWxkIHJldHJ5IGJlZm9yZSB0aHJvd2luZyBhbiBlcnJvclxuICogICAtIGBkZWxheUNhbGN1bGF0b3JgOiBUaGUgY2FsY3VsYXRvciB0byBkZXRlcm1pbmUgdGhlIGRlbGF5IHRpbWluZ1xuICogQHJldHVybnMgVGhlIG9ic2VydmFibGUgdGltZXJcbiAqXG4gKiBAZXhhbXBsZVxuICogcmV0dXJuIHRoaXMuZXhhbXBsZURhdGFiYXNlLmdldFNvbWV0aGluZygpXG4gKiAgIC5waXBlKFxuICogICAgIG1hcCgocmVzOiBNeVJlc3BvbnNlKSA9PiB7XG4gKiAgICAgICBpZiAocmVzKSB7XG4gKiAgICAgICAgIHJldHVybiByZXM7XG4gKiAgICAgICB9IGVsc2Uge1xuICogICAgICAgICByZXR1cm4gbnVsbDtcbiAqICAgICAgIH1cbiAqICAgICB9KSxcbiAqICAgICByZXRyeVdpdGhCYWNrb2ZmKHt9KSwgLy8gVXNpbmcgZGVmYXVsdCBvcHRpb25zXG4gKiAgIClcbiAqIDtcbiAqL1xuZXhwb3J0IGNvbnN0IHJldHJ5V2l0aEJhY2tvZmYgPSA8VD4oe1xuICByZXRyaWVzID0gREVGQVVMVF9SRVRSWV9DT1VOVCxcbiAgZGVsYXlDYWxjdWxhdG9yID0gZXhwb25lbnRpYWxCYWNrb2ZmRGVsYXlDYWxjdWxhdG9yKHt9KSxcbn06IFBhcnRpYWw8UmV0cnlXaXRoQmFja29mZj4pOiBNb25vVHlwZU9wZXJhdG9yRnVuY3Rpb248VD4gPT4gcmV0cnlXaGVuKGVycm9ycyA9PiB6aXAoXG4gICAgZXJyb3JzLFxuICAgIHJhbmdlKDEsIHJldHJpZXMpLFxuICApXG4gICAgLnBpcGUoXG4gICAgICBtZXJnZU1hcCgoW2VyciwgcmV0cnldKSA9PiB7XG4gICAgICAgIGlmIChyZXRyeSA+PSByZXRyaWVzKSB7XG4gICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoZXJyKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGltZXIoZGVsYXlDYWxjdWxhdG9yKHJldHJ5KSk7XG4gICAgICB9KSxcbiAgICApKTtcbiJdfQ==