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

32 lines
684 B
TypeScript
Raw Normal View History

2025-06-01 17:35:53 +00:00
/*
* SPDX-FileCopyrightText: outvi and other Sharkey contributors
* SPDX-License-Identifier: AGPL-3.0-only
*/
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();
2025-06-01 13:30:24 +08:00
} catch (err: any) {
2025-06-01 13:07:57 +08:00
// RATE_LIMIT_EXCEEDED
2025-06-01 13:30:24 +08:00
if (err?.id === 'd5826d14-3982-4d2e-8011-b9e9f02499ef') {
2025-06-01 13:07:57 +08:00
lastError = err;
2025-06-01 13:30:24 +08:00
await sleep(err?.info?.fullResetMs ?? 1000);
2025-06-01 13:07:57 +08:00
} 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
}