rekwest
Version:
The robust request library that humanity deserves 🌐
57 lines (56 loc) • 1.92 kB
JavaScript
;
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;