41 lines
1.5 KiB
JavaScript
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();
|
|
});
|
|
}
|