/* ===================================================================== Service Worker des Creator Workspace. Er hat GENAU EINE Aufgabe: Benachrichtigungen entgegennehmen und anzeigen. ⚠️ BEWUSST OHNE ZWISCHENSPEICHER. Der naheliegende Zusatz waere, hier auch Seiten und Dateien vorzuhalten ("offline verfuegbar"). Genau das waere hier falsch: * Der Workspace liegt hinter einer Anmeldung. Ein Service Worker, der Antworten aufhebt, hebt damit AUCH persoenliche Daten auf -- auf einem Geraet, das jemand anderem gehoeren kann. * Die Seiten aendern sich haeufig. Ein Zwischenspeicher, der etwas Falsches zeigt, ist schlimmer als gar keiner -- man glaubt ihm ja. Die Versionsstempel loesen das Problem bereits. Wer spaeter Offline-Faehigkeit will, faengt hier NICHT einfach an, sondern klaert vorher, was zwischengespeichert werden darf. ===================================================================== */ /* Beim Einbauen sofort uebernehmen, statt auf das Schliessen aller Reiter zu warten. Ohne diese zwei Zeilen wuerde eine neue Fassung erst Tage spaeter aktiv -- und niemand wuesste, welche gerade laeuft. */ self.addEventListener("install", (e) => { self.skipWaiting(); }); self.addEventListener("activate", (e) => { e.waitUntil(self.clients.claim()); }); /* --------------------------------------------------------------------- Eine Benachrichtigung kommt an. ------------------------------------------------------------------ */ self.addEventListener("push", (e) => { /* Ohne Daten trotzdem etwas anzeigen: Manche Push-Dienste schicken im Zweifel eine leere Nachricht, und ein Browser, der eine Push-Berechtigung hat, MUSS etwas anzeigen -- sonst entzieht er sie nach mehrmaligem Schweigen wieder. */ let d = { titel: "Creator Workspace", text: "Es gibt etwas Neues.", ziel: "/workspace/start.html" }; try { if (e.data) d = { ...d, ...e.data.json() }; } catch { try { d.text = e.data.text() || d.text; } catch { /* dann die Vorgabe */ } } e.waitUntil(self.registration.showNotification(d.titel, { body: d.text, icon: "/assets/img/app-symbole/workspace-192.png", badge: "/assets/img/app-symbole/workspace-192.png", /* Gleiche Art ersetzt sich gegenseitig, statt sich zu stapeln -- drei Meldungen "Aufgabe ueberfaellig" untereinander helfen niemandem. */ tag: d.art || "workspace", renotify: false, data: { ziel: d.ziel || "/workspace/start.html" }, /* Kein `requireInteraction`: Eine Benachrichtigung, die stehen bleibt, bis man sie wegklickt, ist eine Zumutung. */ })); }); /* --------------------------------------------------------------------- Jemand tippt die Benachrichtigung an. Ist der Workspace schon offen, wird DIESES Fenster benutzt und dort hingesteuert -- sonst sammeln sich mit der Zeit fuenf Reiter mit derselben Seite. Nur wenn keines offen ist, wird eines geoeffnet. ------------------------------------------------------------------ */ self.addEventListener("notificationclick", (e) => { e.notification.close(); const ziel = e.notification.data?.ziel || "/workspace/start.html"; e.waitUntil((async () => { const fenster = await self.clients.matchAll({ type: "window", includeUncontrolled: true }); for (const f of fenster) { if (f.url.includes("/workspace/")) { await f.focus(); if ("navigate" in f) { try { await f.navigate(ziel); } catch { /* schon dort */ } } return; } } await self.clients.openWindow(ziel); })()); });