From de7f7984cdd0255e6f84414b0861d547511248a4 Mon Sep 17 00:00:00 2001 From: Outvi V Date: Sun, 1 Jun 2025 06:30:28 +0800 Subject: [PATCH] chore: move `retryOnThrottled` to frontend-shared --- .../frontend-shared/js/retry-on-throttled.ts | 40 +++++++++++++++++ .../src/components/page/page.note.vue | 44 +------------------ 2 files changed, 42 insertions(+), 42 deletions(-) create mode 100644 packages/frontend-shared/js/retry-on-throttled.ts diff --git a/packages/frontend-shared/js/retry-on-throttled.ts b/packages/frontend-shared/js/retry-on-throttled.ts new file mode 100644 index 0000000000..4234a18b51 --- /dev/null +++ b/packages/frontend-shared/js/retry-on-throttled.ts @@ -0,0 +1,40 @@ +async function sleep(ms: number): Promise { + return new Promise((resolve) => { + window.setTimeout(() => { + resolve(); + }, ms); + }); +} + +export async function retryOnThrottled(f: ()=>Promise, retryCount = 5): Promise { + let lastOk = false; + let lastResultOrError: T; + for (let i = 0; i < retryCount; i++) { + const [ok, resultOrError] = await f() + .then(result => [true, result]) + .catch(err => [false, err]); + + lastOk = ok; + lastResultOrError = resultOrError; + + if (ok) { + break; + } + + // RATE_LIMIT_EXCEEDED + if (resultOrError?.id === 'd5826d14-3982-4d2e-8011-b9e9f02499ef') { + await sleep(resultOrError?.info?.fullResetMs ?? 1000); + continue; + } + + // Throw for non-throttling errors + throw resultOrError; + } + + if (lastOk) { + return lastResultOrError!; + } else { + // Give up after getting throttled too many times + throw lastResultOrError!; + } +} \ No newline at end of file diff --git a/packages/frontend/src/components/page/page.note.vue b/packages/frontend/src/components/page/page.note.vue index cc1075d42a..3a3c0e4c7b 100644 --- a/packages/frontend/src/components/page/page.note.vue +++ b/packages/frontend/src/components/page/page.note.vue @@ -13,6 +13,7 @@ SPDX-License-Identifier: AGPL-3.0-only