diff --git a/apps/hub/src/live-app/proxy.ts b/apps/hub/src/live-app/proxy.ts index c22f77d3..201540be 100644 --- a/apps/hub/src/live-app/proxy.ts +++ b/apps/hub/src/live-app/proxy.ts @@ -145,8 +145,11 @@ export function createLiveAppProxy(options: { if (!(await allows(request, entry))) return new Response(liveAppWording.signIn, { status: 401 }); entry.lastUsed = Date.now(); - if (request.headers.get("upgrade")?.toLowerCase() !== "websocket") + if (request.headers.get("upgrade")?.toLowerCase() !== "websocket") { + // The app decides how long a response may stay quiet, not Bun's 10-second default. + server.timeout(request, 0); return forward(request, entry); + } const url = new URL(request.url); const socketUrl = new URL(url.pathname + url.search, entry.target); socketUrl.protocol = "ws:"; diff --git a/apps/hub/src/server.ts b/apps/hub/src/server.ts index 3e6e60b4..73d18e68 100644 --- a/apps/hub/src/server.ts +++ b/apps/hub/src/server.ts @@ -11,6 +11,8 @@ if (import.meta.main) { const server = Bun.serve({ hostname: runtime.hostname, port: runtime.port, + // Bun's 10-second default drops slow routes; the run stream's 5-second heartbeat stays well inside this. + idleTimeout: 120, fetch: runtime.app.fetch, websocket: runtime.websocket, });