| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- 'use strict';
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.retryAsPromised = exports.TimeoutError = void 0;
- class TimeoutError extends Error {
- constructor(message, previousError) {
- super(message);
- this.name = "TimeoutError";
- this.previous = previousError;
- }
- }
- exports.TimeoutError = TimeoutError;
- function matches(match, err) {
- if (typeof match === 'function') {
- try {
- if (err instanceof match)
- return true;
- }
- catch (_) {
- return !!match(err);
- }
- }
- if (match === err.toString())
- return true;
- if (match === err.message)
- return true;
- return match instanceof RegExp
- && (match.test(err.message) || match.test(err.toString()));
- }
- function retryAsPromised(callback, optionsInput) {
- if (!callback || !optionsInput) {
- throw new Error('retry-as-promised must be passed a callback and a options set');
- }
- optionsInput = (typeof optionsInput === "number" ? { max: optionsInput } : optionsInput);
- const options = {
- $current: "$current" in optionsInput ? optionsInput.$current : 1,
- max: optionsInput.max,
- timeout: optionsInput.timeout || undefined,
- match: optionsInput.match ? Array.isArray(optionsInput.match) ? optionsInput.match : [optionsInput.match] : [],
- backoffBase: optionsInput.backoffBase === undefined ? 100 : optionsInput.backoffBase,
- backoffExponent: optionsInput.backoffExponent || 1.1,
- report: optionsInput.report,
- name: optionsInput.name || callback.name || 'unknown'
- };
- if (options.match && !Array.isArray(options.match))
- options.match = [options.match];
- if (options.report)
- options.report('Trying ' + options.name + ' #' + options.$current + ' at ' + new Date().toLocaleTimeString(), options);
- return new Promise(function (resolve, reject) {
- let timeout;
- let backoffTimeout;
- let lastError;
- if (options.timeout) {
- timeout = setTimeout(function () {
- if (backoffTimeout)
- clearTimeout(backoffTimeout);
- reject(new TimeoutError(options.name + ' timed out', lastError));
- }, options.timeout);
- }
- Promise.resolve(callback({ current: options.$current }))
- .then(resolve)
- .then(function () {
- if (timeout)
- clearTimeout(timeout);
- if (backoffTimeout)
- clearTimeout(backoffTimeout);
- })
- .catch(function (err) {
- if (timeout)
- clearTimeout(timeout);
- if (backoffTimeout)
- clearTimeout(backoffTimeout);
- lastError = err;
- if (options.report)
- options.report((err && err.toString()) || err, options, err);
- // Should not retry if max has been reached
- var shouldRetry = options.$current < options.max;
- if (!shouldRetry)
- return reject(err);
- shouldRetry = options.match.length === 0 || options.match.some(function (match) {
- return matches(match, err);
- });
- if (!shouldRetry)
- return reject(err);
- var retryDelay = options.backoffBase * Math.pow(options.backoffExponent, options.$current - 1);
- // Do some accounting
- options.$current++;
- if (options.report)
- options.report(`Retrying ${options.name} (${options.$current})`, options);
- if (retryDelay) {
- // Use backoff function to ease retry rate
- if (options.report)
- options.report(`Delaying retry of ${options.name} by ${retryDelay}`, options);
- backoffTimeout = setTimeout(function () {
- retryAsPromised(callback, options)
- .then(resolve)
- .catch(reject);
- }, retryDelay);
- }
- else {
- retryAsPromised(callback, options)
- .then(resolve)
- .catch(reject);
- }
- });
- });
- }
- exports.retryAsPromised = retryAsPromised;
- ;
- exports.default = retryAsPromised;
|