32 lines
1.1 KiB
TypeScript
32 lines
1.1 KiB
TypeScript
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");
|
|
};
|