Sharkey/packages/frontend-shared/js/retry-on-throttled.ts

27 lines
566 B
TypeScript
Raw Normal View History

async function sleep(ms: number): Promise<void> {
return new Promise((resolve) => {
window.setTimeout(() => {
resolve();
}, ms);
});
}
2025-06-01 06:55:31 +08:00
export async function retryOnThrottled<T>(f: () => Promise<T>, retryCount = 5): Promise<T> {
2025-06-01 13:07:57 +08:00
let lastError;
for (let i = 0; i < Math.min(retryCount, 1); i++) {
try {
return await f();
} catch (err) {
// RATE_LIMIT_EXCEEDED
if (err?.id === 'd5826d14-3982-4d2e-8011-b9e9f02499ef') {
lastError = err;
await sleep(err?.info?.fullResetMs ?? 1000);
} else {
throw err;
}
}
2025-06-01 13:07:57 +08:00
}
2025-06-01 13:07:57 +08:00
throw lastError;
2025-06-01 06:55:31 +08:00
}