/* ===================================================================== sw.js — minimaler Service Worker für DOGFATHER UNIVERSE Zweck: NICHT primär Offline-Funktionalität, sondern die technische Voraussetzung, damit Chrome/Edge auf dem Desktop den "App installieren"- Prompt zuverlässig anzeigt (Chrome verlangt dafür einen registrierten Service Worker mit fetch()-Handler, siehe developer.chrome.com/blog/ update-install-criteria, Stand 2026). Nebenbei cached er die wichtigsten Shell-Dateien, damit die Seite bei Verbindungsabbruch nicht komplett leer bleibt — bewusst simpel gehalten (kein Offline-Vollausbau). ===================================================================== */ const CACHE_NAME = "dogfather-universe-shell-v1"; const SHELL_ASSETS = [ "/", "/index.html", "/assets/css/main.css", "/assets/css/theme-dogfather.css", "/assets/css/theme-hasidog.css", "/assets/css/theme-spicymedia.css", "/assets/js/main.js", "/assets/img/favicon.png", "/assets/img/icon-192.png", "/assets/img/icon-512.png", ]; self.addEventListener("install", (event) => { event.waitUntil( caches .open(CACHE_NAME) .then((cache) => cache.addAll(SHELL_ASSETS)) .catch(() => { /* Einzelne Assets könnten fehlen (z.B. beim allerersten Deploy) — soll die Installation des Service Workers nicht blockieren. */ }) ); self.skipWaiting(); }); self.addEventListener("activate", (event) => { event.waitUntil( caches .keys() .then((keys) => Promise.all( keys .filter((key) => key !== CACHE_NAME) .map((key) => caches.delete(key)) ) ) .then(() => self.clients.claim()) ); }); /* Network-first mit Cache-Fallback: liefert immer die aktuellste Version, greift nur bei echtem Verbindungsausfall auf den Cache zurück — damit Änderungen an der Seite nicht durch veraltete Caches verdeckt werden. */ self.addEventListener("fetch", (event) => { if (event.request.method !== "GET") return; const url = new URL(event.request.url); if (url.origin !== self.location.origin) return; event.respondWith( fetch(event.request) .then((response) => { const copy = response.clone(); caches.open(CACHE_NAME).then((cache) => cache.put(event.request, copy)); return response; }) .catch(() => caches.match(event.request)) ); });