apx-toolkit
Version:
Automatically discover APIs and generate complete integration packages: code in 12 languages, TypeScript types, test suites, SDK packages, API documentation, mock servers, performance reports, and contract tests. Saves 2-4 weeks of work in seconds.
60 lines • 2.02 kB
JavaScript
/**
* Retry Logic with Exponential Backoff
* Improves reliability and user experience
*/
const DEFAULT_OPTIONS = {
maxAttempts: 3,
initialDelay: 1000,
maxDelay: 10000,
backoffMultiplier: 2,
retryableErrors: [
'ETIMEDOUT',
'ECONNRESET',
'ENOTFOUND',
'ECONNREFUSED',
'timeout',
'network',
'429', // Rate limit
'500', // Server error
'502', // Bad gateway
'503', // Service unavailable
'504', // Gateway timeout
],
};
/**
* Retries a function with exponential backoff
*/
export async function retryWithBackoff(fn, options = {}) {
const opts = { ...DEFAULT_OPTIONS, ...options };
let lastError;
let delay = opts.initialDelay;
for (let attempt = 1; attempt <= opts.maxAttempts; attempt++) {
try {
return await fn();
}
catch (error) {
lastError = error;
// Check if error is retryable
const errorMessage = error instanceof Error ? error.message : String(error);
const isRetryable = opts.retryableErrors.some((pattern) => errorMessage.toLowerCase().includes(pattern.toLowerCase()));
// Don't retry if it's the last attempt or error is not retryable
if (attempt === opts.maxAttempts || !isRetryable) {
throw error;
}
// Wait before retrying (exponential backoff)
if (attempt < opts.maxAttempts) {
await new Promise((resolve) => setTimeout(resolve, delay));
delay = Math.min(delay * opts.backoffMultiplier, opts.maxDelay);
}
}
}
throw lastError;
}
/**
* Checks if an error is retryable
*/
export function isRetryableError(error) {
const errorMessage = error instanceof Error ? error.message : String(error);
return DEFAULT_OPTIONS.retryableErrors.some((pattern) => errorMessage.toLowerCase().includes(pattern.toLowerCase()));
}
//# sourceMappingURL=retry.js.map