summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDax Raad <[email protected]>2025-12-16 14:45:03 -0500
committerDax Raad <[email protected]>2025-12-16 14:45:03 -0500
commit4e2d1acf7d1570f7d4738c03636be77541e73c14 (patch)
tree160a3a4943a394f874567b750c8b75fe14f0aab2
parent40d63cd1e32b20279d8292f376606637bdd00aca (diff)
downloadopencode-4e2d1acf7d1570f7d4738c03636be77541e73c14.tar.gz
opencode-4e2d1acf7d1570f7d4738c03636be77541e73c14.zip
core: fix Tauri desktop app SSE connection timeout
- Add heartbeat events to /global/event and /event SSE endpoints - Send server.heartbeat event every 30s to prevent WKWebView 60s timeout - Fixes desktop app disconnecting from global events after 1 minute
-rw-r--r--packages/opencode/src/server/server.ts26
1 files changed, 26 insertions, 0 deletions
diff --git a/packages/opencode/src/server/server.ts b/packages/opencode/src/server/server.ts
index f1d4ecd8d..d30fe63b8 100644
--- a/packages/opencode/src/server/server.ts
+++ b/packages/opencode/src/server/server.ts
@@ -139,8 +139,22 @@ export namespace Server {
})
}
GlobalBus.on("event", handler)
+
+ // Send heartbeat every 30s to prevent WKWebView timeout (60s default)
+ const heartbeat = setInterval(() => {
+ stream.writeSSE({
+ data: JSON.stringify({
+ payload: {
+ type: "server.heartbeat",
+ properties: {},
+ },
+ }),
+ })
+ }, 30000)
+
await new Promise<void>((resolve) => {
stream.onAbort(() => {
+ clearInterval(heartbeat)
GlobalBus.off("event", handler)
resolve()
log.info("global event disconnected")
@@ -2470,8 +2484,20 @@ export namespace Server {
stream.close()
}
})
+
+ // Send heartbeat every 30s to prevent WKWebView timeout (60s default)
+ const heartbeat = setInterval(() => {
+ stream.writeSSE({
+ data: JSON.stringify({
+ type: "server.heartbeat",
+ properties: {},
+ }),
+ })
+ }, 30000)
+
await new Promise<void>((resolve) => {
stream.onAbort(() => {
+ clearInterval(heartbeat)
unsub()
resolve()
log.info("event disconnected")