diff options
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/async/retry.ts | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/src/lib/async/retry.ts b/src/lib/async/retry.ts new file mode 100644 index 000000000..f14ae6cf6 --- /dev/null +++ b/src/lib/async/retry.ts @@ -0,0 +1,29 @@ +import {isNetworkError} from 'lib/strings/errors' + +export async function retry<P>( + retries: number, + cond: (err: any) => boolean, + fn: () => Promise<P>, +): Promise<P> { + let lastErr + while (retries > 0) { + try { + return await fn() + } catch (e: any) { + lastErr = e + if (cond(e)) { + retries-- + continue + } + throw e + } + } + throw lastErr +} + +export async function networkRetry<P>( + retries: number, + fn: () => Promise<P>, +): Promise<P> { + return retry(retries, isNetworkError, fn) +} |