Files
brk/website/service-worker.js
2024-09-19 21:03:50 +02:00

82 lines
2.0 KiB
JavaScript

// @ts-check
const version = "v1";
self.addEventListener("install", (_event) => {
const event = /** @type {any} */ (_event);
event.waitUntil(
caches.open(version).then((cache) => {
return cache.addAll([
"/",
"/index.html",
"/script.js",
"/packages/solid-signals/2024-04-17/script.js",
"/packages/ufuzzy/2024-02-21/script.js",
"/packages/lean-qr/v2.3.4/script.js",
"/packages/lightweight-charts/v4.2.0/script.js",
"/fonts/satoshi/2024-09/font.var.woff2",
]);
})
);
// @ts-ignore
self.skipWaiting();
});
/**
* @param {Response | undefined} cachedResponse
* @param {Response | undefined} badResponse
*/
function pickCorrectResponse(cachedResponse, badResponse) {
if (cachedResponse) {
return cachedResponse;
} else {
return caches
.match("/")
.then((response) => {
return response ?? badResponse;
})
.catch(() => {
return badResponse;
});
}
}
self.addEventListener("fetch", (_event) => {
const event = /** @type {any} */ (_event);
/** @type {Request} */
const request = event.request;
const { url, method } = request;
console.log(`service-worker: fetching: ${url}`);
event.respondWith(
caches.match(request).then((cachedResponse) => {
return fetch(request)
.then((response) => {
const { status } = response;
// @ts-ignore
if (url.includes("/api/")) {
return response;
}
return caches.open(version).then((cache) => {
if (status === 200 || status === 304) {
if (status === 200 && method === "GET") {
cache.put(request, response.clone());
}
return response;
}
return pickCorrectResponse(cachedResponse, response);
});
})
.catch(() => {
return pickCorrectResponse(cachedResponse, undefined);
});
})
);
});