diff options
Diffstat (limited to 'packages/util/src/retry.ts')
| -rw-r--r-- | packages/util/src/retry.ts | 41 |
1 files changed, 0 insertions, 41 deletions
diff --git a/packages/util/src/retry.ts b/packages/util/src/retry.ts deleted file mode 100644 index 0014a604c..000000000 --- a/packages/util/src/retry.ts +++ /dev/null @@ -1,41 +0,0 @@ -export interface RetryOptions { - attempts?: number - delay?: number - factor?: number - maxDelay?: number - retryIf?: (error: unknown) => boolean -} - -const TRANSIENT_MESSAGES = [ - "load failed", - "network connection was lost", - "network request failed", - "failed to fetch", - "econnreset", - "econnrefused", - "etimedout", - "socket hang up", -] - -function isTransientError(error: unknown): boolean { - if (!error) return false - const message = String(error instanceof Error ? error.message : error).toLowerCase() - return TRANSIENT_MESSAGES.some((m) => message.includes(m)) -} - -export async function retry<T>(fn: () => Promise<T>, options: RetryOptions = {}): Promise<T> { - const { attempts = 3, delay = 500, factor = 2, maxDelay = 10000, retryIf = isTransientError } = options - - let lastError: unknown - for (let attempt = 0; attempt < attempts; attempt++) { - try { - return await fn() - } catch (error) { - lastError = error - if (attempt === attempts - 1 || !retryIf(error)) throw error - const wait = Math.min(delay * Math.pow(factor, attempt), maxDelay) - await new Promise((resolve) => setTimeout(resolve, wait)) - } - } - throw lastError -} |
