From 03423707ebd061fb27bdb1a5305336e8dae34afc Mon Sep 17 00:00:00 2001 From: Your Name Date: Sun, 12 Oct 2025 16:09:43 -0700 Subject: [PATCH 1/2] Simplify the service worker's onfetch handler --- docroot/stream-helper.js | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/docroot/stream-helper.js b/docroot/stream-helper.js index ac5e191..514f8e9 100644 --- a/docroot/stream-helper.js +++ b/docroot/stream-helper.js @@ -40,7 +40,7 @@ let appStreams = {}; self.onmessage = e => { const id = e.data.streamId; if (id in appStreams) { - appStreams[id].then(f => f(e.data)); + appStreams[id](e.data); delete appStreams[id]; } }; @@ -51,16 +51,14 @@ self.onfetch = e => { const pos = e.request.url.lastIndexOf(streamWord); if (pos === -1) return; const id = e.request.url.substring(pos+streamWord.length); - appStreams[id] = new Promise(r1 => { - e.respondWith(new Promise(r2 => r1(data => r2(makeResponse(data))))); - }); - self.clients.get(e.clientId) - .then(c => { - if (!c) { - appStreams[id].then(f => f(null)); - delete appStreams[id]; - return; - } - c.postMessage({streamId: id}); - }); + e.respondWith(new Promise(resolve => { + self.clients.get(e.clientId).then(c => { + if (c) { + appStreams[id] = data => resolve(makeResponse(data)); + c.postMessage({streamId: id}); + } else { + resolve(null); + } + }); + })); }; From b8aa30f8a99f848f2fbfa6bfea2a432b6776c4f4 Mon Sep 17 00:00:00 2001 From: Robin Thellend Date: Sun, 12 Oct 2025 16:49:15 -0700 Subject: [PATCH 2/2] Add timeout --- docroot/stream-helper.js | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/docroot/stream-helper.js b/docroot/stream-helper.js index 514f8e9..0b8d6ae 100644 --- a/docroot/stream-helper.js +++ b/docroot/stream-helper.js @@ -53,12 +53,19 @@ self.onfetch = e => { const id = e.request.url.substring(pos+streamWord.length); e.respondWith(new Promise(resolve => { self.clients.get(e.clientId).then(c => { - if (c) { - appStreams[id] = data => resolve(makeResponse(data)); - c.postMessage({streamId: id}); - } else { - resolve(null); + if (!c) { + resolve(new Response('client not found', {status: 404, statusText: 'Not Found'})); + return; } + const timeoutId = setTimeout(() => { + delete appStreams[id]; + resolve(new Response('client did not respond in time', {status: 504, statusText: 'Gateway Timeout'})); + }, 5000); + appStreams[id] = data => { + clearTimeout(timeoutId); + resolve(makeResponse(data)); + }; + c.postMessage({streamId: id}); }); })); };