UNPKG

rekwest

Version:

The robust request library that humanity deserves 🌐

57 lines (56 loc) 1.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.retries = void 0; var _nodeHttp = _interopRequireDefault(require("node:http2")); var _nodeStream = require("node:stream"); var _promises = require("node:timers/promises"); var _errors = require("./errors.cjs"); var _index = _interopRequireDefault(require("./index.cjs")); var _utils = require("./utils.cjs"); function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } const { HTTP2_HEADER_RETRY_AFTER, HTTP2_METHOD_GET, HTTP2_METHOD_HEAD } = _nodeHttp.default.constants; const retries = (ex, options) => { const { body, maxRetryAfter, method, retry, url } = options; if (retry?.attempts > 0) { if (![HTTP2_METHOD_GET, HTTP2_METHOD_HEAD].includes(method) && (0, _utils.isPipeStream)(body) && !(0, _nodeStream.isReadable)(body)) { throw new _errors.RequestError('Request stream already read.', { cause: ex }); } if (retry.errorCodes?.includes(ex.code) || retry.statusCodes?.includes(ex.statusCode)) { let { interval } = retry; if (retry.retryAfter && ex.headers?.[HTTP2_HEADER_RETRY_AFTER]) { interval = ex.headers[HTTP2_HEADER_RETRY_AFTER]; interval = Math.abs(Number(interval) * 1e3 || new Date(interval) - Date.now()) || 0; if (interval > maxRetryAfter) { throw new _errors.RequestError(`Maximum '${HTTP2_HEADER_RETRY_AFTER}' limit exceeded: ${interval} ms.`, { cause: ex }); } } else { interval = new Function('interval', `return Math.ceil(${retry.backoffStrategy});`)(interval); } if (interval < 0) { interval = 0; } retry.attempts--; retry.interval = interval; return (0, _promises.setTimeout)(interval).then(() => (0, _index.default)(url, options)); } } }; exports.retries = retries;