async function fetchWithRetry(url, options, maxRetries = 3) {
let retries = 0;
while (retries < maxRetries) {
try {
const response = await fetch(url, options);
if (response.status !== 429) {
return response;
}
const data = await response.json();
const retryAfter = data.error.retry_after || Math.pow(2, retries);
console.log(`Rate limited. Retrying after ${retryAfter} seconds...`);
await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000));
retries++;
} catch (error) {
if (retries === maxRetries - 1) {
throw error;
}
const backoffTime = Math.pow(2, retries) * 1000;
console.log(
`Error: ${error.message}. Retrying after ${backoffTime / 1000} seconds...`,
);
await new Promise((resolve) => setTimeout(resolve, backoffTime));
retries++;
}
}
throw new Error('Maximum retries reached');
}