From 66ca109c77927514b11eb23d65fff7218ba32644 Mon Sep 17 00:00:00 2001 From: Alexandre Brandizzi Date: Tue, 14 Jul 2026 21:23:59 -0300 Subject: [PATCH] fix: sanitize timeout error message --- src/api/api-error.ts | 7 ++++++- src/test/api/api-error.test.ts | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/api/api-error.ts b/src/api/api-error.ts index 4dc288e3..6746359a 100644 --- a/src/api/api-error.ts +++ b/src/api/api-error.ts @@ -1,4 +1,4 @@ -import { isHTTPError, isNetworkError } from "ky"; +import { isHTTPError, isNetworkError, isTimeoutError } from "ky"; export function mapHttpStatusToMessage(status: number, data?: unknown): string { if (status === 401) { @@ -36,5 +36,10 @@ export function normalizeApiRequestError(error: Error): Error { return error; } + if (isTimeoutError(error)) { + error.message = "The request timed out. Please try again."; + return error; + } + return error; } diff --git a/src/test/api/api-error.test.ts b/src/test/api/api-error.test.ts index 17ef48a7..71c3d1c9 100644 --- a/src/test/api/api-error.test.ts +++ b/src/test/api/api-error.test.ts @@ -39,7 +39,7 @@ describe("normalizeApiRequestError", () => { ); }); - it("preserves the original message for timeouts", async () => { + it("returns a friendly timeout message", async () => { const fetchImpl = vi.fn((_input: RequestInfo | URL, init?: RequestInit) => { const signal = init?.signal; return new Promise((_resolve, reject) => { @@ -48,7 +48,7 @@ describe("normalizeApiRequestError", () => { }) as unknown as typeof fetch; await expect(createClient(fetchImpl).get(RESOURCE_URL).json()).rejects.toThrow( - "Request timed out", + "The request timed out. Please try again.", ); }); });