// Created on savesnippets.com ยท https://savesnippets.com/ZaMDFuRcKQwadu async function retryWithBackoff(fn, { retries = 3, baseDelay = 300, maxDelay = 5000, jitter = true, shouldRetry = () => true, } = {}) { let lastErr; for (let attempt = 0; attempt <= retries; attempt++) { try { return await fn(attempt); } catch (err) { lastErr = err; if (attempt === retries || !shouldRetry(err, attempt)) throw err; let delay = Math.min(baseDelay * 2 ** attempt, maxDelay); if (jitter) delay *= (0.5 + Math.random() * 0.5); await new Promise((r) => setTimeout(r, delay)); } } throw lastErr; } // Usage const data = await retryWithBackoff( () => fetch('/api/data').then((r) => r.json()), { retries: 4, shouldRetry: (err) => err.status !== 401 } );