From d4f1d8abbf08c1ce4afdf6889dc2f65c177b8f7f Mon Sep 17 00:00:00 2001 From: Bohdan Triapitsyn Date: Thu, 22 Jan 2026 12:30:33 +0200 Subject: [PATCH] feat: add workbox-window and improve event stream cleanup Add workbox-window dependency to bun.lock and web package.json Cancel and release the stream reader on disconnect to avoid leaks --- bun.lock | 1 + packages/web/package.json | 3 ++- packages/web/server/index.js | 10 ++++++++-- 3 files changed, 11 insertions(+), 3 deletions(-) diff --git a/bun.lock b/bun.lock index 693f8639..625bb185 100644 --- a/bun.lock +++ b/bun.lock @@ -303,6 +303,7 @@ "typescript-eslint": "^8.39.1", "vite": "^7.1.2", "vite-plugin-pwa": "^1.0.3", + "workbox-window": "^7.4.0", }, }, }, diff --git a/packages/web/package.json b/packages/web/package.json index cf17edce..10903d92 100644 --- a/packages/web/package.json +++ b/packages/web/package.json @@ -85,7 +85,8 @@ "typescript": "~5.8.3", "typescript-eslint": "^8.39.1", "vite": "^7.1.2", - "vite-plugin-pwa": "^1.0.3" + "vite-plugin-pwa": "^1.0.3", + "workbox-window": "^7.4.0" }, "files": [ "dist", diff --git a/packages/web/server/index.js b/packages/web/server/index.js index bb50785e..e80c39c8 100644 --- a/packages/web/server/index.js +++ b/packages/web/server/index.js @@ -1339,6 +1339,7 @@ const startGlobalEventWatcher = async () => { while (!signal.aborted) { attempt += 1; let upstream; + let reader; try { const url = buildOpenCodeUrl('/global/event', ''); upstream = await fetch(url, { @@ -1357,7 +1358,7 @@ const startGlobalEventWatcher = async () => { console.log('[PushWatcher] connected'); const decoder = new TextDecoder(); - const reader = upstream.body.getReader(); + reader = upstream.body.getReader(); let buffer = ''; while (!signal.aborted) { @@ -1383,7 +1384,12 @@ const startGlobalEventWatcher = async () => { console.warn('[PushWatcher] disconnected', error?.message ?? error); } finally { try { - upstream?.body?.cancel?.(); + if (reader) { + await reader.cancel(); + reader.releaseLock(); + } else if (upstream?.body && !upstream.body.locked) { + await upstream.body.cancel(); + } } catch { // ignore }