import { NetworkFailureKind } from "./types"; export class ObservedFetchError extends Error { kind: NetworkFailureKind; status?: number; retryable: boolean; constructor(message: string, kind: NetworkFailureKind, options?: { status?: number; retryable?: boolean; cause?: unknown }) { super(message); this.name = "ObservedFetchError"; this.kind = kind; this.status = options?.status; this.retryable = options?.retryable ?? false; if (options?.cause !== undefined) { (this as Error & { cause?: unknown }).cause = options.cause; } } } export const isObservedFetchError = (error: unknown): error is ObservedFetchError => error instanceof ObservedFetchError || (typeof error === "object" && error !== null && (error as any).name === "ObservedFetchError"); export const shouldRetryNetworkError = (error: unknown) => { if (isObservedFetchError(error)) { return error.retryable; } const message = String((error as any)?.message ?? error); return message.includes("Network request failed") || message.includes("AbortError"); };