/** * Simple retry wrapper with exponential backoff. * Usage: await withRetry(() => someAsyncCall(), { retries: 3 }) */ async function withRetry(fn, options = {}) { const { retries = 3, initialDelayMs = 500, maxDelayMs = 5000, factor = 2, onRetry = null, } = options; let attempt = 0; let delay = initialDelayMs; while (true) { try { return await fn(); } catch (err) { attempt++; if (attempt > retries) { throw err; } if (onRetry) { onRetry(err, attempt); } await new Promise(resolve => setTimeout(resolve, delay)); delay = Math.min(delay * factor, maxDelayMs); } } } module.exports = { withRetry };