Changeset 31e63d1 in Klonkt


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.

Location:
src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • src/assets/js/guardian.js

    r44c9f3f r31e63d1  
    453453    actRow.appendChild(rel);
    454454    act.appendChild(actRow);
    455     panel.appendChild(act);
     455    // Bovenaan, niet onderaan: zwaaien en loslaten zijn de dingen die je DOET.
     456    // De rest van het paneel is lezen -- instellingen, wie er nog meer op let,
     457    // wat er binnenkwam. Wie het paneel opent om iets te doen hoorde eerst langs
     458    // vijf secties te scrollen.
     459    panel.insertBefore(act, panel.firstChild);
    456460    return panel;
    457461  }
     
    706710
    707711  renderAll(); pushState(); loadFeed(); loadFollowReqs();
    708   setInterval(refresh, 45000);   // live-ish while open
     712
     713  // De push die de melding brengt is meteen het teken dat de staat veranderd is.
     714  // Daarmee hoeft er geen tweede, open verbinding bij: hetzelfde kanaal doet het
     715  // werk, en het werkt ook als de app dicht is.
     716  if ('serviceWorker' in navigator) {
     717    navigator.serviceWorker.addEventListener('message', function (e) {
     718      if (e.data && e.data.klonkt === 'push') refresh();
     719    });
     720  }
     721  // Het tikje blijft als vangnet -- niet elke verandering geeft een melding, en
     722  // niet iedereen heeft meldingen aanstaan. Maar niet tikken terwijl niemand
     723  // kijkt: dat waren verzoeken voor een tabblad op de achtergrond. Bij terugkomen
     724  // meteen een keer, want dan is de kans op nieuws het grootst.
     725  setInterval(function () { if (!document.hidden) refresh(); }, 45000);
     726  document.addEventListener('visibilitychange', function () { if (!document.hidden) refresh(); });
    709727  } catch (e) {
    710728    fatal((e && e.message) || String(e));
  • 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.