@huddle01/web-core
Version:
The Huddle01 Javascript SDK offers a comprehensive suite of methods and event listeners that allow for seamless real-time audio and video communication with minimal coding required.
63 lines (60 loc) • 1.86 kB
JavaScript
import { mainLogger } from './chunk-TOCFOGTC.js';
// src/helpers/apiUtils.ts
var logger = mainLogger.createSubLogger("apiUtils");
var defaultRetryConfig = {
maxRetries: 3,
initialDelay: 1e3,
factor: 2,
jitter: true
};
var RetryAbortError = class extends Error {
constructor(message) {
super(message);
this.name = "RetryAbortError";
}
};
async function apiCallWithRetry(apiCall, config = {}, abortSignal) {
const retryConfig = {
...defaultRetryConfig,
...config
};
let delay = retryConfig.initialDelay ?? defaultRetryConfig.initialDelay;
for (let attempt = 0; attempt <= retryConfig.maxRetries; attempt++) {
try {
if (abortSignal?.aborted) {
throw new RetryAbortError("API call aborted");
}
return await apiCall();
} catch (error) {
if (error instanceof RetryAbortError) {
logger.warn("API call aborted", error);
throw error;
}
if (attempt === retryConfig.maxRetries) {
logger.error(
`API call failed after ${retryConfig.maxRetries} retries`,
error
);
throw error;
}
logger.warn(`API call attempt ${attempt + 1} failed. Retrying...`, error);
const factor = retryConfig.factor ?? defaultRetryConfig.factor;
if (retryConfig.jitter) {
delay = Math.random() * delay * (factor ?? 2);
} else {
delay *= factor;
}
await new Promise((resolve, reject) => {
const timeoutId = setTimeout(resolve, delay);
if (abortSignal) {
abortSignal.addEventListener("abort", () => {
clearTimeout(timeoutId);
reject(new RetryAbortError("API call aborted during delay"));
});
}
});
}
}
throw new Error("Unexpected error: all retries exhausted");
}
export { RetryAbortError, apiCallWithRetry };