From 39d8f010d61d191d200e9c0ed588893b3891946b Mon Sep 17 00:00:00 2001 From: "posthog[bot]" <206114724+posthog[bot]@users.noreply.github.com> Date: Mon, 28 Sep 2026 14:55:48 +0000 Subject: [PATCH 1/2] fix(router): stop reporting browser network failures from route loaders A route loader fetch that gets no response rejects with a bare TypeError, for example when the browser cancels the request during a full-page navigation. The router defaultOnCatch sent these to error tracking as new issues. Skip capture for known browser network-failure TypeErrors. Co-Authored-By: Claude Opus 5.5 Generated-By: PostHog Desktop Task-Id: bcaca723-7de3-463d-a541-1453786b8141 --- src/lib/network-error.test.ts | 19 +++++++++++++++++++ src/lib/network-error.ts | 12 ++++++++++++ src/router.tsx | 5 +++++ 3 files changed, 36 insertions(+) create mode 100644 src/lib/network-error.test.ts create mode 100644 src/lib/network-error.ts diff --git a/src/lib/network-error.test.ts b/src/lib/network-error.test.ts new file mode 100644 index 000000000..af28d7b30 --- /dev/null +++ b/src/lib/network-error.test.ts @@ -0,0 +1,19 @@ +import { describe, expect, it } from "vitest"; + +import { isNetworkError } from "#/lib/network-error"; + +describe("isNetworkError", () => { + it("matches browser fetch network failures", () => { + expect(isNetworkError(new TypeError("Failed to fetch"))).toBe(true); + expect(isNetworkError(new TypeError("NetworkError when attempting to fetch resource."))).toBe( + true, + ); + expect(isNetworkError(new TypeError("Load failed"))).toBe(true); + }); + + it("does not match other errors", () => { + expect(isNetworkError(new Error("Failed to fetch"))).toBe(false); + expect(isNetworkError(new TypeError("Cannot read properties of undefined"))).toBe(false); + expect(isNetworkError("Failed to fetch")).toBe(false); + }); +}); diff --git a/src/lib/network-error.ts b/src/lib/network-error.ts new file mode 100644 index 000000000..481dddcff --- /dev/null +++ b/src/lib/network-error.ts @@ -0,0 +1,12 @@ +// Browsers reject fetch with a bare TypeError when a request gets no response, +// including requests cancelled by a page unload. Messages vary by engine. +const networkErrorMessages = new Set([ + "Failed to fetch", + "NetworkError when attempting to fetch resource.", + "Load failed", + "Network request failed", +]); + +export function isNetworkError(error: unknown) { + return error instanceof TypeError && networkErrorMessages.has(error.message); +} diff --git a/src/router.tsx b/src/router.tsx index ec256561f..80b6cd0bc 100644 --- a/src/router.tsx +++ b/src/router.tsx @@ -4,6 +4,7 @@ import AppErrorScreen from "./components/AppErrorScreen"; import AppNotFoundScreen from "./components/AppNotFoundScreen"; import { capturePostHogClientException } from "./integrations/posthog/provider"; import { getContext } from "./integrations/tanstack-query/root-provider"; +import { isNetworkError } from "./lib/network-error"; import { routeTree } from "./routeTree.gen"; export function getRouter() { @@ -16,6 +17,10 @@ export function getRouter() { defaultPreloadStaleTime: 0, defaultErrorComponent: AppErrorScreen, defaultOnCatch: (error, errorInfo) => { + if (isNetworkError(error)) { + return; + } + capturePostHogClientException(error, { component_stack: errorInfo.componentStack, error_boundary: "TanStackRouter", From fe49390ce5afc0675ced2dac4ec563c992162521 Mon Sep 17 00:00:00 2001 From: "posthog[bot]" <206114724+posthog[bot]@users.noreply.github.com> Date: Mon, 28 Sep 2026 14:56:26 +0000 Subject: [PATCH 2/2] refactor(router): drop non-browser network error message Co-Authored-By: Claude Opus 5.5 Generated-By: PostHog Desktop Task-Id: bcaca723-7de3-463d-a541-1453786b8141 --- src/lib/network-error.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/lib/network-error.ts b/src/lib/network-error.ts index 481dddcff..f4d00012f 100644 --- a/src/lib/network-error.ts +++ b/src/lib/network-error.ts @@ -4,7 +4,6 @@ const networkErrorMessages = new Set([ "Failed to fetch", "NetworkError when attempting to fetch resource.", "Load failed", - "Network request failed", ]); export function isNetworkError(error: unknown) {