async function fetchWithRetry(url, options, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const response = await fetch(url, options);
if (response.status === 429) {
const resetAt = response.headers.get("X-RateLimit-Reset");
const waitMs = resetAt
? parseInt(resetAt) * 1000 - Date.now()
: Math.pow(2, attempt) * 1000 + Math.random() * 1000;
await new Promise((resolve) => setTimeout(resolve, Math.max(waitMs, 1000)));
continue;
}
return response;
}
throw new Error("Max retries exceeded");
}