40 lines
1.7 KiB
JavaScript
40 lines
1.7 KiB
JavaScript
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
const is_1 = require("@sindresorhus/is");
|
|
const errors_1 = require("./errors");
|
|
const retryAfterStatusCodes = new Set([413, 429, 503]);
|
|
const isErrorWithResponse = (error) => (error instanceof errors_1.HTTPError || error instanceof errors_1.ParseError || error instanceof errors_1.MaxRedirectsError);
|
|
const calculateRetryDelay = ({ attemptCount, retryOptions, error }) => {
|
|
if (attemptCount > retryOptions.limit) {
|
|
return 0;
|
|
}
|
|
const hasMethod = retryOptions.methods.includes(error.options.method);
|
|
const hasErrorCode = Reflect.has(error, 'code') && retryOptions.errorCodes.includes(error.code);
|
|
const hasStatusCode = isErrorWithResponse(error) && retryOptions.statusCodes.includes(error.response.statusCode);
|
|
if (!hasMethod || (!hasErrorCode && !hasStatusCode)) {
|
|
return 0;
|
|
}
|
|
if (isErrorWithResponse(error)) {
|
|
const { response } = error;
|
|
if (response && Reflect.has(response.headers, 'retry-after') && retryAfterStatusCodes.has(response.statusCode)) {
|
|
let after = Number(response.headers['retry-after']);
|
|
if (is_1.default.nan(after)) {
|
|
after = Date.parse(response.headers['retry-after']) - Date.now();
|
|
}
|
|
else {
|
|
after *= 1000;
|
|
}
|
|
if (after > retryOptions.maxRetryAfter) {
|
|
return 0;
|
|
}
|
|
return after;
|
|
}
|
|
if (response.statusCode === 413) {
|
|
return 0;
|
|
}
|
|
}
|
|
const noise = Math.random() * 100;
|
|
return ((2 ** (attemptCount - 1)) * 1000) + noise;
|
|
};
|
|
exports.default = calculateRetryDelay;
|