UNPKG

got

Version:

Human-friendly and powerful HTTP request library for Node.js

40 lines (39 loc) 1.71 kB
"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;