Files
oikos/public/sw-register.js
T

41 lines
1.5 KiB
JavaScript

/**
* Modul: Service Worker Registrierung
* Zweck: Ausgelagert aus index.html um CSP-Inline-Script-Verletzung zu vermeiden.
* Handhabt nahtlose Updates via controllerchange.
* Abhängigkeiten: keine
*/
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/sw.js', { updateViaCache: 'none' })
.then((registration) => registration.update())
.catch((err) => {
console.warn('[SW] Registrierung fehlgeschlagen:', err);
});
});
// SW-Update: Auf iOS-PWA fuehrt ein sofortiger Reload bei controllerchange
// zu Timing-Problemen (leere Seite, verlorene Cookies). Stattdessen nur
// nachladen wenn die Seite gerade nicht mitten im Initialisieren ist.
let refreshing = false;
navigator.serviceWorker.addEventListener('controllerchange', () => {
if (refreshing) return;
refreshing = true;
// Kurz warten damit der neue SW vollstaendig aktiviert ist und
// clients.claim() abgeschlossen hat, bevor die Seite neu laedt.
// Auf iOS-Standalone verhindert das den "leere Seite"-Bug.
setTimeout(() => window.location.reload(), 200);
});
const refreshSw = () => {
navigator.serviceWorker.getRegistration()
.then((registration) => registration?.update())
.catch(() => {});
};
window.addEventListener('focus', refreshSw);
document.addEventListener('visibilitychange', () => {
if (document.visibilityState === 'visible') refreshSw();
});
}