async function fetchWithRetry(url: string, options: RequestInit, retries = 5, backoff = 500) {
try {
const res = await fetch(url, options);
if (res.status === 429 && retries > 0) {
const retryAfter = Number(res.headers.get('Retry-After')) * 1000 || backoff;
// Add random jitter between 0ms and 200ms
const jitter = Math.random() * 200;
await new Promise(r => setTimeout(r, retryAfter + jitter));
return fetchWithRetry(url, options, retries - 1, backoff * 2);
}
return res;
} catch (err) {
if (retries > 0) {
await new Promise(r => setTimeout(r, backoff));
return fetchWithRetry(url, options, retries - 1, backoff * 2);
}
throw err;
}
}