keep-trying
Version:
A function for creating retryable promises with configurable limit and backoff.
42 lines (41 loc) • 1.59 kB
JavaScript
;
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;