UNPKG

@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.

66 lines (62 loc) 1.94 kB
'use strict'; var chunkO5HDCTOE_cjs = require('./chunk-O5HDCTOE.cjs'); // src/helpers/apiUtils.ts var logger = chunkO5HDCTOE_cjs.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"); } exports.RetryAbortError = RetryAbortError; exports.apiCallWithRetry = apiCallWithRetry;