credix
Version:
Official SDK for Credix Credit Management System
74 lines • 2.39 kB
JavaScript
;
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