UNPKG

credix

Version:

Official SDK for Credix Credit Management System

74 lines 2.39 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.withRetry = withRetry; exports.createRetryWrapper = createRetryWrapper; const index_js_1 = require("../errors/index.js"); /** * Default retry configuration */ const DEFAULT_RETRY_CONFIG = { maxRetries: 3, retryDelay: 1000, maxRetryDelay: 10000, retryCondition: (error) => { // Retry on network errors and timeouts if (error instanceof index_js_1.NetworkError || error instanceof index_js_1.TimeoutError) { return true; } // Retry on 5xx errors if (error && typeof error === 'object' && 'statusCode' in error) { const statusCode = error.statusCode; return statusCode >= 500 && statusCode < 600; } return false; }, }; /** * Exponential backoff with jitter */ function calculateDelay(attempt, baseDelay, maxDelay) { const exponentialDelay = baseDelay * 2 ** (attempt - 1); const jitter = Math.random() * 0.3 * exponentialDelay; // 30% jitter return Math.min(exponentialDelay + jitter, maxDelay); } /** * Sleep utility */ function sleep(ms) { return new Promise((resolve) => setTimeout(resolve, ms)); } /** * Retry wrapper for async functions */ async function withRetry(fn, config) { const finalConfig = { ...DEFAULT_RETRY_CONFIG, ...config }; let lastError; for (let attempt = 1; attempt <= finalConfig.maxRetries; attempt++) { try { return await fn(); } catch (error) { lastError = error; // Check if we should retry if (attempt === finalConfig.maxRetries || !finalConfig.retryCondition(error)) { throw error; } // Call retry callback if provided if (config?.onRetry) { config.onRetry(error, attempt); } // Calculate delay and wait const delay = calculateDelay(attempt, finalConfig.retryDelay, finalConfig.maxRetryDelay); await sleep(delay); } } // This should never be reached, but TypeScript doesn't know that throw lastError; } /** * Creates a retry wrapper with preset configuration */ function createRetryWrapper(defaultConfig) { return (fn, config) => withRetry(fn, { ...defaultConfig, ...config }); } //# sourceMappingURL=retry.js.map