fix(pwa): Zombie-waiting-SW via GET_VERSION erkennen (Live-Bug)
All checks were successful
Build & Publish Docker Image / build-and-push (push) Successful in 1m21s
All checks were successful
Build & Publish Docker Image / build-and-push (push) Successful in 1m21s
Das reine Workbox-Handshake-Pattern ausc2074c9reicht für dieses Deploy nicht. Live-Analyse mit Playwright ergibt reproduzierbar nach dem Reload-Klick: - active-SW: Version 1776527907402 - waiting-SW: Version 1776527907402 (bit-identisch!) - Nur ein einziger shell-Cache - Server-Response: gleiche Version → Toast kommt bei jedem Reload erneut. Vermutung: Race zwischen Chromium-SW-Update-Check (der parallel zum SKIP_WAITING läuft) und activate. Der Browser hält den zweiten Installation-Versuch mit identischen Bytes im waiting-Slot. Fix: SW bekommt GET_VERSION-Handler, Client fragt via MessageChannel active und waiting nach Version. Bei Gleichheit räumt er den Zombie stumm auf (SKIP_WAITING ohne Toast), bei Versions-Unterschied zeigt er den Toast. Der refreshing-Flag-Reload-Guard ausc2074c9bleibt erhalten. Industry-Standard-Pattern bleibt die Basis; GET_VERSION ist ein defensiver Zusatz für einen reproduzierbaren Browser-Edge-Case, den Workbox nicht abfängt. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -99,6 +99,14 @@ self.addEventListener('message', (event) => {
|
||||
} else if (data.type === 'SKIP_WAITING') {
|
||||
// Wird vom pwaStore nach User-Klick auf "Neu laden" geschickt.
|
||||
void self.skipWaiting();
|
||||
} else if (data.type === 'GET_VERSION') {
|
||||
// Zombie-Schutz: Chromium hält nach einem SKIP_WAITING-Zyklus
|
||||
// mitunter einen bit-identischen waiting-SW im Registration-Slot
|
||||
// (Race zwischen SW-Update-Check während activate). Ohne diesen
|
||||
// Version-Handshake zeigt init() den „Neue Version"-Toast bei jedem
|
||||
// Reload erneut, obwohl es nichts zu aktualisieren gibt.
|
||||
const port = event.ports[0] as MessagePort | undefined;
|
||||
port?.postMessage({ version });
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
Reference in New Issue
Block a user