about summary refs log tree commit diff
path: root/src/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/async/retry.ts29
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)
+}