Files
dogfather-universe/sw.js
T
DogFatherGitandClaude Opus 5 6541ecbfa7 Alte Symboldateien tragen jetzt auch das neue Bild
Filipe hat die Verknuepfungen dreimal neu angelegt und sah trotzdem das
alte Symbol. Die Ursache lag nicht an den neuen Dateien - die werden
nachweislich korrekt ausgeliefert (36 von 36 live byteweise geprueft),
sondern an vier Altlasten:

  /assets/img/favicon.png          256x256
  /assets/img/apple-touch-icon.png 180x180
  /assets/img/icon-192.png         192x192
  /assets/img/icon-512.png         512x512

Die stammen aus der Zeit vor dem Umbau auf app-symbole/ und werden von
KEINER Seite mehr verlinkt - geprueft mit einer Suche ueber alle html,
js, json und webmanifest: nur noch sw.js und main.js nennen sie.

Aber Chrome hat sich das Favicon dieser Domain gemerkt, als favicon.png
noch verlinkt war, und gibt es nicht mehr her: Beim Anlegen einer
Verknuepfung nimmt Windows dieses alte Bild, egal was im HTML steht. Auf
Filipes Bildschirm trugen deshalb ZWEI verschiedene Verknuepfungen
dasselbe Symbol - das war der entscheidende Hinweis, denn zwei Apps mit
verschiedenen Manifesten koennen unmoeglich dasselbe Symbol haben.

Statt zu hoffen, dass ein Zwischenspeicher irgendwann aufgibt, tragen die
alten Adressen jetzt einfach dasselbe Bild wie die neuen. Damit ist es
egal, welche ein Programm nimmt.

Dazu im Service Worker: CACHE_NAME auf v2 hochgezaehlt - activate()
loescht dadurch den alten Zwischenspeicher samt altem Symbol. Und
SHELL_ASSETS zeigt nicht mehr auf die verwaisten icon-192/-512, sondern
auf die Adressen aus dem Manifest.

Co-Authored-By: Claude Opus 5 <[email protected]>
2026-09-06 00:32:59 +02:00

80 lines
2.9 KiB
JavaScript

/* =====================================================================
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).
===================================================================== */
/* Die Zahl am Ende MUSS hochgezaehlt werden, wenn sich hier etwas aendert:
activate() loescht jeden Zwischenspeicher, dessen Name nicht genau so
heisst. Ohne das Hochzaehlen behaelt ein Geraet den alten Inhalt
beliebig lange — am 06.09.2026 war genau das der Fall, ein Geraet hielt
noch das alte Symbol fest. */
const CACHE_NAME = "dogfather-universe-shell-v2";
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",
/* Symbole: die Adressen, auf die das Manifest zeigt. Bis 06.09.2026
standen hier /assets/img/icon-192.png und -512.png — die benutzt
seit dem Umbau auf app-symbole/ keine Seite mehr. */
"/assets/img/favicon.png",
"/assets/img/app-symbole/universe-192.png",
"/assets/img/app-symbole/universe-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))
);
});