From 763f496575b9edf3f0af6eb8e7c68e0325bb6d6d Mon Sep 17 00:00:00 2001 From: admin Date: Fri, 7 Aug 2026 04:14:32 +0000 Subject: [PATCH] Modified by www.SourceFiles.app --- src/server.ts | 54 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 src/server.ts diff --git a/src/server.ts b/src/server.ts new file mode 100644 index 0000000..0f25494 --- /dev/null +++ b/src/server.ts @@ -0,0 +1,54 @@ +import "./lib/error-capture"; + +import { consumeLastCapturedError } from "./lib/error-capture"; +import { renderErrorPage } from "./lib/error-page"; + +type ServerEntry = { + fetch: (request: Request, env: unknown, ctx: unknown) => Promise | Response; +}; + +let serverEntryPromise: Promise | undefined; + +async function getServerEntry(): Promise { + if (!serverEntryPromise) { + serverEntryPromise = import("@tanstack/react-start/server-entry").then( + (m) => (m.default ?? m) as ServerEntry, + ); + } + return serverEntryPromise; +} + +// h3 swallows in-handler throws into a normal 500 Response with body +// {"unhandled":true,"message":"HTTPError"} — try/catch alone never fires for those. +async function normalizeCatastrophicSsrResponse(response: Response): Promise { + if (response.status < 500) return response; + const contentType = response.headers.get("content-type") ?? ""; + if (!contentType.includes("application/json")) return response; + + const body = await response.clone().text(); + if (!body.includes('"unhandled":true') || !body.includes('"message":"HTTPError"')) { + return response; + } + + console.error(consumeLastCapturedError() ?? new Error(`h3 swallowed SSR error: ${body}`)); + return new Response(renderErrorPage(), { + status: 500, + headers: { "content-type": "text/html; charset=utf-8" }, + }); +} + +export default { + async fetch(request: Request, env: unknown, ctx: unknown) { + try { + const handler = await getServerEntry(); + const response = await handler.fetch(request, env, ctx); + return await normalizeCatastrophicSsrResponse(response); + } catch (error) { + console.error(error); + return new Response(renderErrorPage(), { + status: 500, + headers: { "content-type": "text/html; charset=utf-8" }, + }); + } + }, +};