UNPKG

keep-trying

Version:

A function for creating retryable promises with configurable limit and backoff.

42 lines (41 loc) 1.59 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const jitter_1 = require("./jitter"); const backoff_1 = require("./backoff"); ; const noOpLogger = () => { }; const defaults = { baseTime: 150, maxAttempts: 5, maxTime: 5000, backoffStrategy: 'exponential', jitterStrategy: 'equal', logger: noOpLogger }; const keepTrying = (fn, options = {}) => { const jitter = jitter_1.choose(options.jitterStrategy || defaults.jitterStrategy); const backoff = backoff_1.choose(options.backoffStrategy || defaults.backoffStrategy); const maxAttempts = (typeof options.maxAttempts === 'number') ? options.maxAttempts : defaults.maxAttempts; const logger = options.logger || defaults.logger; const maxTime = options.maxTime || defaults.maxTime; const baseTime = options.baseTime || defaults.baseTime; const retry = (attempt = 1) => { return fn().catch((err) => { if (attempt < maxAttempts) { const nextAttemptIn = jitter(backoff(baseTime, attempt, maxTime)); logger({ attempt, maxAttempts, nextAttemptIn, state: 'retrying', error: err }); return new Promise(function (resolve) { setTimeout(function () { resolve(retry(attempt + 1)); }, nextAttemptIn); }); } else { logger({ attempt, maxAttempts, state: 'failed', error: err }); throw err; } }); }; return retry(); }; exports.default = keepTrying;