popsicle-retry
Version:
Enable request retry for Popsicle
63 lines • 1.98 kB
JavaScript
;
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