fix(sw): ship self-unregistering tombstone to kill stale Void 1 service worker
This commit is contained in:
30
public/sw.js
Normal file
30
public/sw.js
Normal file
@@ -0,0 +1,30 @@
|
||||
// Self-unregistering "tombstone" service worker.
|
||||
//
|
||||
// Void 1 ran at this same origin (void.hynesy.com) and registered a caching
|
||||
// service worker at /sw.js. Void 2 ships NO service worker, so that old worker
|
||||
// would otherwise persist forever in returning visitors' browsers, intercepting
|
||||
// fetches and serving stale assets that even a hard reload cannot bypass.
|
||||
//
|
||||
// Serving this self-destructing worker at the same /sw.js URL means the browser's
|
||||
// periodic SW update check (which bypasses the HTTP cache and is not intercepted
|
||||
// by the old worker) replaces the old worker with this one. On activation it
|
||||
// wipes every cache, unregisters itself, and reloads open tabs — after which the
|
||||
// page loads fresh from the network with no controlling service worker.
|
||||
//
|
||||
// Keep serving this indefinitely so any device that ever ran Void 1 self-heals.
|
||||
|
||||
self.addEventListener('install', () => self.skipWaiting());
|
||||
|
||||
self.addEventListener('activate', (event) => {
|
||||
event.waitUntil((async () => {
|
||||
try {
|
||||
const keys = await caches.keys();
|
||||
await Promise.all(keys.map((k) => caches.delete(k)));
|
||||
} catch (_) { /* best effort */ }
|
||||
try { await self.registration.unregister(); } catch (_) { /* best effort */ }
|
||||
const clients = await self.clients.matchAll({ type: 'window' });
|
||||
for (const client of clients) {
|
||||
try { client.navigate(client.url); } catch (_) { /* best effort */ }
|
||||
}
|
||||
})());
|
||||
});
|
||||
Reference in New Issue
Block a user