UNPKG

popsicle-retry

Version:
63 lines 1.98 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); /** * Check if the request should be attempted again. */ function retryAllowed(error, response) { if (error) { if (error.code === "EUNAVAILABLE") { if (process.browser) { return navigator.onLine !== false; } return true; } return false; } if (response) return ~~(response.status / 100) === 5; return false; } exports.retryAllowed = retryAllowed; /** * Init a default retry function. */ function retries(count = 3, isRetryAllowed = retryAllowed) { // Source: https://github.com/sindresorhus/got/blob/814bcacd1433d8f62dbb81260526b9ff56b26934/index.js#L261-L268 return function (error, response, iter) { if (iter > count || !isRetryAllowed(error, response)) { return -1; } const noise = Math.random() * 100; return 2 ** (iter - 1) * 1000 + noise; }; } exports.retries = retries; /** * Middleware for running retry logic. */ function retry(fn, shouldRetry = retries(), preFlight = req => req) { return async function retry(request, next) { let iter = 0; // Attempt a retry. function attempt(error, response, result) { const delay = shouldRetry(error, response, ++iter); if (delay < 0) return result; return new Promise(resolve => { setTimeout(() => resolve(run(request.clone())), delay); }); } async function run(req) { try { const res = await fn(preFlight(req, iter, request), next); return attempt(undefined, res, Promise.resolve(res)); } catch (err) { return attempt(err, undefined, Promise.reject(err)); } } return run(request.clone()); }; } exports.retry = retry; //# sourceMappingURL=index.js.map