Files
kochwas/src/lib/client/sw-register.ts
hsiegeln 51a88a4c58
All checks were successful
Build & Publish Docker Image / build-and-push (push) Successful in 1m19s
feat(pwa): SW Pre-Cache-Orchestrator mit Fortschritt + Delta-Sync
Message-Handler für sync-start (initial: alle Rezepte cachen) und
sync-check (delta: nur neue nachladen, gelöschte räumen). Vor dem
Sync ein Storage-Quota-Check (<100 MB frei → abbrechen mit Fehler-
Broadcast). Concurrency-Pool mit 4 parallelen Downloads pro
Rezept (HTML, API-JSON, Bild). Fortschritt per postMessage an
alle Clients, die über den sync-status-Store den SyncIndicator
füllen. Das Cache-Manifest wird als JSON-Response unter
/__cache-manifest__ im kochwas-meta Cache persistiert.

Client triggert beim App-Start entweder sync-check (bereits
kontrollierter SW) oder sync-start (erstmaliger SW-Install).

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-18 16:44:48 +02:00

34 lines
1.4 KiB
TypeScript

// Registriert den Service-Worker und verdrahtet ihn mit dem
// Sync-Status-Store. Im Dev-Modus läuft Kochwas über HTTP; die
// SW-API ist da nur auf localhost verfügbar. SvelteKit liefert den
// SW unter /service-worker.js im Production-Build.
import { syncStatus, type SWMessage } from '$lib/client/sync-status.svelte';
export async function registerServiceWorker(): Promise<void> {
if (typeof navigator === 'undefined' || !('serviceWorker' in navigator)) return;
try {
await navigator.serviceWorker.register('/service-worker.js', { type: 'module' });
} catch (e) {
console.warn('SW-Registrierung fehlgeschlagen', e);
return;
}
navigator.serviceWorker.addEventListener('message', (event) => {
const data = event.data as SWMessage | undefined;
if (data && typeof data === 'object' && 'type' in data) {
syncStatus.handle(data);
}
});
// Beim App-Start: wenn wir einen aktiven SW haben, frage ihn, ob er
// neu synct (initial oder Delta).
if (navigator.serviceWorker.controller) {
navigator.serviceWorker.controller.postMessage({ type: 'sync-check' });
} else {
// Erste Session: SW kommt erst mit dem nächsten Reload zum Einsatz.
// Beim nächsten Start triggert sync-check dann den Initial-Sync.
navigator.serviceWorker.ready.then((reg) => {
reg.active?.postMessage({ type: 'sync-start' });
});
}
}