Changeset 31e63d1 in Klonkt for src/server.js


Ignore:
Timestamp:
08/07/2026 10:15:44 AM (5 weeks ago)
Author:
roboburr <roboburr@…>
Branches:
main
Children:
f889429
Parents:
44c9f3f
git-author:
Robin <roboburr@…> (08/07/2026 10:15:42 AM)
git-committer:
roboburr <roboburr@…> (08/07/2026 10:15:44 AM)
Message:

Acties bovenaan, en de push wekt een openstaande pagina (Guardian PWA)

ACTIES BOVENAAN. Zwaaien en loslaten zijn de dingen die je DOET; de rest van het
ward-paneel is lezen. Wie het paneel opende om iets te doen moest eerst langs
vijf secties scrollen.

DE PUSH ALS LIVE-SIGNAAL. Op de vraag of het paneel een long-poll kon worden: dat
hoeft niet. De service worker kreeg de push al binnen en toonde de melding, maar
zei niets tegen een pagina die openstond -- die wachtte tot het volgende tikje
van 45 seconden. Nu stuurt de worker een postMessage naar elk open venster en
ververst de pagina meteen.

Waarom dit beter is dan een tweede, open verbinding: het is hetzelfde kanaal, en
dat kanaal werkt ook als de app DICHT is. Een long-poll zou alleen werken zolang
je kijkt, en dan naast een push-kanaal staan dat hetzelfde nog eens doet. Een
kanaal, twee doelen.

Het tikje blijft als vangnet -- niet elke verandering geeft een melding, en niet
iedereen heeft meldingen aanstaan -- maar tikt niet meer terwijl niemand kijkt.
Dat waren verzoeken voor een tabblad op de achtergrond. Bij terugkomen ververst
hij meteen een keer, want dan is de kans op nieuws het grootst.

Niet gedekt door de suite: dit is client-code en een inline service worker.
Nagelopen op de uitgeleverde /sw.js.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/server.js

    r44c9f3f r31e63d1  
    546546  try { d = e.data ? e.data.json() : {}; } catch (err) { /* non-JSON push */ }
    547547  const title = d.title || 'Klonkt';
    548   e.waitUntil(self.registration.showNotification(title, {
    549     body: d.body || '',
    550     icon: '/favicon.svg',
    551     badge: '/favicon.svg',
    552     tag: d.type ? ('klonkt-' + d.type) : undefined,   // collapse same-type bursts
    553     data: { url: d.url || '/' },
    554   }));
     548  e.waitUntil(Promise.all([
     549    self.registration.showNotification(title, {
     550      body: d.body || '',
     551      icon: '/favicon.svg',
     552      badge: '/favicon.svg',
     553      tag: d.type ? ('klonkt-' + d.type) : undefined,   // collapse same-type bursts
     554      data: { url: d.url || '/' },
     555    }),
     556    // Wek ook een pagina die al openstaat. De push IS het teken dat er iets
     557    // veranderd is, dus een aparte live-verbinding ernaast zou hetzelfde nog
     558    // eens doen -- en die tweede zou alleen werken zolang de app open is,
     559    // terwijl dit kanaal er ook is als hij dicht is. Een kanaal, twee doelen.
     560    self.clients.matchAll({ type: 'window', includeUncontrolled: true })
     561      .then(list => { for (const c of list) c.postMessage({ klonkt: 'push', type: d.type || null }); })
     562      .catch(() => { /* geen open venster: niets te wekken */ }),
     563  ]));
    555564});
    556565self.addEventListener('notificationclick', e => {
Note: See TracChangeset for help on using the changeset viewer.