@typespec/ts-http-runtime
Version:
Isomorphic client library for making HTTP requests in node.js and browser.
128 lines (127 loc) • 5.13 kB
JavaScript
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
var retryPolicy_exports = {};
__export(retryPolicy_exports, {
retryPolicy: () => retryPolicy
});
module.exports = __toCommonJS(retryPolicy_exports);
var import_helpers = require("../util/helpers.js");
var import_restError = require("../restError.js");
var import_AbortError = require("../abort-controller/AbortError.js");
var import_logger = require("../logger/logger.js");
var import_constants = require("../constants.js");
const retryPolicyLogger = (0, import_logger.createClientLogger)("ts-http-runtime retryPolicy");
const retryPolicyName = "retryPolicy";
function retryPolicy(strategies, options = { maxRetries: import_constants.DEFAULT_RETRY_POLICY_COUNT }) {
const logger = options.logger || retryPolicyLogger;
return {
name: retryPolicyName,
async sendRequest(request, next) {
let response;
let responseError;
let retryCount = -1;
retryRequest: while (true) {
retryCount += 1;
response = void 0;
responseError = void 0;
try {
logger.info(`Retry ${retryCount}: Attempting to send request`, request.requestId);
response = await next(request);
logger.info(`Retry ${retryCount}: Received a response from request`, request.requestId);
} catch (e) {
logger.error(`Retry ${retryCount}: Received an error from request`, request.requestId);
if (!(0, import_restError.isRestError)(e)) {
throw e;
}
responseError = e;
response = e.response;
}
if (request.abortSignal?.aborted) {
logger.error(`Retry ${retryCount}: Request aborted.`);
const abortError = new import_AbortError.AbortError();
throw abortError;
}
if (retryCount >= (options.maxRetries ?? import_constants.DEFAULT_RETRY_POLICY_COUNT)) {
logger.info(
`Retry ${retryCount}: Maximum retries reached. Returning the last received response, or throwing the last received error.`
);
if (responseError) {
throw responseError;
} else if (response) {
return response;
} else {
throw new Error("Maximum retries reached with no response or error to throw");
}
}
logger.info(`Retry ${retryCount}: Processing ${strategies.length} retry strategies.`);
strategiesLoop: for (const strategy of strategies) {
const strategyLogger = strategy.logger || logger;
strategyLogger.info(`Retry ${retryCount}: Processing retry strategy ${strategy.name}.`);
const modifiers = strategy.retry({
retryCount,
response,
responseError
});
if (modifiers.skipStrategy) {
strategyLogger.info(`Retry ${retryCount}: Skipped.`);
continue strategiesLoop;
}
const { errorToThrow, retryAfterInMs, redirectTo } = modifiers;
if (errorToThrow) {
strategyLogger.error(
`Retry ${retryCount}: Retry strategy ${strategy.name} throws error:`,
errorToThrow
);
throw errorToThrow;
}
if (retryAfterInMs || retryAfterInMs === 0) {
strategyLogger.info(
`Retry ${retryCount}: Retry strategy ${strategy.name} retries after ${retryAfterInMs}`
);
await (0, import_helpers.delay)(retryAfterInMs, void 0, { abortSignal: request.abortSignal });
continue retryRequest;
}
if (redirectTo) {
strategyLogger.info(
`Retry ${retryCount}: Retry strategy ${strategy.name} redirects to ${redirectTo}`
);
request.url = redirectTo;
continue retryRequest;
}
}
if (responseError) {
logger.info(
`None of the retry strategies could work with the received error. Throwing it.`
);
throw responseError;
}
if (response) {
logger.info(
`None of the retry strategies could work with the received response. Returning it.`
);
return response;
}
}
}
};
}
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
retryPolicy
});
//# sourceMappingURL=retryPolicy.js.map