diff options
| author | Kit La Touche <kit@transneptune.net> | 2026-02-11 14:56:58 -0500 |
|---|---|---|
| committer | Kit La Touche <kit@transneptune.net> | 2026-02-11 14:56:58 -0500 |
| commit | eae9c15a7cd76d886337b8034d9802ac9d9d7c2d (patch) | |
| tree | ee5cee40b98dfbabc8b2e32cb1a4781ee28d1fcc | |
| parent | 4336d175ab7199368084f846806f319a696ad145 (diff) | |
Clean up service worker logic
There's an asymmetry between client/sw message passing, and push event
messages. I found that out experimentally. I was also mistakenly
assigning to the wrong attribute of the unread-status object.
Tentatively good now, but I need real new-message-events from the server
to be sure.
| -rw-r--r-- | ui/routes/(app)/c/[conversation]/+page.svelte | 8 | ||||
| -rw-r--r-- | ui/service-worker.js | 17 |
2 files changed, 20 insertions, 5 deletions
diff --git a/ui/routes/(app)/c/[conversation]/+page.svelte b/ui/routes/(app)/c/[conversation]/+page.svelte index 24baa47..5a832ee 100644 --- a/ui/routes/(app)/c/[conversation]/+page.svelte +++ b/ui/routes/(app)/c/[conversation]/+page.svelte @@ -56,6 +56,14 @@ if (!!at) { session.local.updateLastReadAt(conversationId, at); } + + navigator.serviceWorker.ready.then((registration) => { + registration.active.postMessage({ + type: 'CONVERSATION_READ', + conversationId, + at, + }); + }); } $effect(() => { diff --git a/ui/service-worker.js b/ui/service-worker.js index 56bfca9..67391f7 100644 --- a/ui/service-worker.js +++ b/ui/service-worker.js @@ -34,9 +34,11 @@ self.addEventListener('push', (event) => { body: event.data.text(), }), ); + + const data = event.data?.json(); // Now we can do slower things that might fail: - conversationReadStatus[event.conversationId] ||= { lastRead: null, lastMessage: null }; - conversationReadStatus[event.conversationId].lastMessage = new Date(); + conversationReadStatus[data.conversationId] ||= { lastRead: null, lastMessage: null }; + conversationReadStatus[data.conversationId].lastMessage = new Date(); event.waitUntil( (async () => { if (navigator.setAppBadge) { @@ -48,10 +50,15 @@ self.addEventListener('push', (event) => { // The client has to tell us when it has read a conversation: self.addEventListener('message', (event) => { - switch (event.data?.type) { + const data = event.data; + switch (data.type) { case 'CONVERSATION_READ': - conversationReadStatus[event.data.conversationId] ||= { lastRead: null, lastMessage: null }; - conversationReadStatus[event.data.conversationId].lastMessage = event.data.at || new Date(); + conversationReadStatus[data.conversationId] ||= { lastRead: null, lastMessage: null }; + if (data.at) { + conversationReadStatus[data.conversationId].lastRead = new Date(data.at.ts); + } else { + conversationReadStatus[data.conversationId].lastRead = new Date(); + } event.waitUntil( (async () => { if (navigator.setAppBadge) { |
