aboutsummaryrefslogtreecommitdiffstats
path: root/src/service-worker.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2024-11-29 21:31:25 -0800
committerAdam Soltys <[email protected]>2024-11-29 21:31:25 -0800
commit644d7963b8d108304ba75bb87cacadab66199feb (patch)
tree5dcffee7b489f193dd7ff4ae234f5f1d9c356fab /src/service-worker.js
parentc43d415f3b473367b5de44fd0719241961cb740d (diff)
downloadcoinos-ui-644d7963b8d108304ba75bb87cacadab66199feb.tar.gz
coinos-ui-644d7963b8d108304ba75bb87cacadab66199feb.zip
try service worker again
Diffstat (limited to 'src/service-worker.js')
-rw-r--r--src/service-worker.js82
1 files changed, 79 insertions, 3 deletions
diff --git a/src/service-worker.js b/src/service-worker.js
index fa934333..febb8cd8 100644
--- a/src/service-worker.js
+++ b/src/service-worker.js
@@ -1,8 +1,84 @@
import { build, files, version } from "$service-worker";
-self.addEventListener("install", (event) => {});
-self.addEventListener("activate", (event) => {});
-self.addEventListener("fetch", (event) => {});
+// Create a unique cache name for this deployment
+const CACHE = `cache-${version}`;
+
+const ASSETS = [
+ ...build, // the app itself
+ ...files, // everything in `static`
+];
+
+self.addEventListener("install", (event) => {
+ // Create a new cache and add all files to it
+ async function addFilesToCache() {
+ const cache = await caches.open(CACHE);
+ await cache.addAll(ASSETS);
+ }
+
+ event.waitUntil(addFilesToCache());
+});
+
+self.addEventListener("activate", (event) => {
+ // Remove previous cached data from disk
+ async function deleteOldCaches() {
+ for (const key of await caches.keys()) {
+ if (key !== CACHE) await caches.delete(key);
+ }
+ }
+
+ event.waitUntil(deleteOldCaches());
+});
+
+self.addEventListener("fetch", (event) => {
+ // ignore POST requests etc
+ if (event.request.method !== "GET") return;
+
+ async function respond() {
+ const url = new URL(event.request.url);
+ const cache = await caches.open(CACHE);
+ console.log(url.pathname);
+
+ // `build`/`files` can always be served from the cache
+ if (ASSETS.includes(url.pathname)) {
+ const response = await cache.match(url.pathname);
+
+ if (response) {
+ return response;
+ }
+ }
+
+ // for everything else, try the network first, but
+ // fall back to the cache if we're offline
+ try {
+ const response = await fetch(event.request);
+
+ // if we're offline, fetch can return a value that is not a Response
+ // instead of throwing - and we can't pass this non-Response to respondWith
+ if (!(response instanceof Response)) {
+ throw new Error("invalid response from fetch");
+ }
+
+ if (response.status === 200) {
+ cache.put(event.request, response.clone());
+ }
+
+ return response;
+ } catch (err) {
+ const response = await cache.match(event.request);
+
+ if (response) {
+ return response;
+ }
+
+ // if there's no cache, then just error out
+ // as there is nothing we can do to respond to this request
+ throw err;
+ }
+ }
+
+ event.respondWith(respond());
+});
+
self.addEventListener("push", (event) => {
const { title, body, url } = event.data.json();
const icon = "/images/icon.png";