src/service-worker.tsTypeScript
@@ -0,0 +1,47 @@
1+
/// <reference lib="webworker" />2+
3+
declare const self: ServiceWorkerGlobalScope;4+
5+
const CACHE_NAME = "app-shell-v7";6+
const CORE_ASSETS = ["/index.html", "/assets/app.css", "/assets/app.js"];7+
8+
self.addEventListener("install", (event) => {9+
event.waitUntil(10+
caches.open(CACHE_NAME).then((cache) => cache.addAll(CORE_ASSETS)),11+
);12+
void self.skipWaiting();13+
});14+
15+
self.addEventListener("activate", (event) => {16+
event.waitUntil(17+
caches.keys().then(async (names) => {18+
await Promise.all(19+
names20+
.filter((name) => name !== CACHE_NAME)21+
.map((name) => caches.delete(name)),22+
);23+
}),24+
);25+
void self.clients.claim();26+
});27+
28+
self.addEventListener("fetch", (event) => {29+
if (event.request.method !== "GET") {30+
return;31+
}32+
33+
event.respondWith(34+
caches.open(CACHE_NAME).then(async (cache) => {35+
const cached = await cache.match(event.request);36+
if (cached) {37+
return cached;38+
}39+
40+
const response = await fetch(event.request);41+
await cache.put(event.request, response);42+
return response;43+
}),44+
);45+
});46+
47+
export {};