diff --git a/src/lib/error-capture.ts b/src/lib/error-capture.ts new file mode 100644 index 0000000..171c9b5 --- /dev/null +++ b/src/lib/error-capture.ts @@ -0,0 +1,27 @@ +// Captures the original Error out-of-band so server.ts can recover the stack +// when h3 has already swallowed the throw into a generic 500 Response. + +let lastCapturedError: { error: unknown; at: number } | undefined; +const TTL_MS = 5_000; + +function record(error: unknown) { + lastCapturedError = { error, at: Date.now() }; +} + +if (typeof globalThis.addEventListener === "function") { + globalThis.addEventListener("error", (event) => record((event as ErrorEvent).error ?? event)); + globalThis.addEventListener("unhandledrejection", (event) => + record((event as PromiseRejectionEvent).reason), + ); +} + +export function consumeLastCapturedError(): unknown { + if (!lastCapturedError) return undefined; + if (Date.now() - lastCapturedError.at > TTL_MS) { + lastCapturedError = undefined; + return undefined; + } + const { error } = lastCapturedError; + lastCapturedError = undefined; + return error; +}