diff --git a/apps/relay/src/index.ts b/apps/relay/src/index.ts index 7e3a21e0053..8c4c7d03859 100644 --- a/apps/relay/src/index.ts +++ b/apps/relay/src/index.ts @@ -28,6 +28,13 @@ const redactingLogger = logger((message, ...rest) => { initSentry(); +process.on("uncaughtException", (err) => { + console.error("[relay] uncaughtException (suppressed)", err); +}); +process.on("unhandledRejection", (reason) => { + console.error("[relay] unhandledRejection (suppressed)", reason); +}); + type AppContext = { Variables: { auth: AuthContext; @@ -43,6 +50,14 @@ const { injectWebSocket, upgradeWebSocket } = createNodeWebSocket({ app }); app.use("*", redactingLogger); app.use("*", cors()); +app.onError((err, c) => { + captureSentryException(err, { + op: "hono.onError", + path: new URL(c.req.url).pathname, + }); + return c.json({ error: "Internal server error" }, 500); +}); + app.get("/health", (c) => c.json({ ok: true, region: env.FLY_REGION })); // ── Auth ──────────────────────────────────────────────────────────── diff --git a/apps/relay/src/sentry.ts b/apps/relay/src/sentry.ts index 0964c684c0b..9918d524bbf 100644 --- a/apps/relay/src/sentry.ts +++ b/apps/relay/src/sentry.ts @@ -11,6 +11,15 @@ export function initSentry(): void { release: process.env.FLY_IMAGE_REF, environment: process.env.FLY_APP_NAME ?? "relay-local", tracesSampleRate: 0, + _experiments: { enableLogs: true }, + integrations: [ + Sentry.consoleLoggingIntegration({ + levels: ["log", "info", "warn", "error"], + }), + Sentry.onUncaughtExceptionIntegration({ + exitEvenIfOtherHandlersAreRegistered: false, + }), + ], initialScope: { tags: { region: env.FLY_REGION, diff --git a/packages/host-service/src/tunnel/tunnel-client.ts b/packages/host-service/src/tunnel/tunnel-client.ts index f65d676f164..22e39cadad2 100644 --- a/packages/host-service/src/tunnel/tunnel-client.ts +++ b/packages/host-service/src/tunnel/tunnel-client.ts @@ -302,7 +302,14 @@ export class TunnelClient { private cleanupChannels(): void { for (const channel of this.localChannels.values()) { - channel.ws.close(1001, "Tunnel disconnected"); + try { + channel.ws.close(1000, "Tunnel disconnected"); + } catch (err) { + console.warn( + "[host-service:tunnel] error closing local channel ws", + err, + ); + } } this.localChannels.clear(); }