aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2024-11-28 14:30:00 -0800
committerAdam Soltys <[email protected]>2024-11-28 14:30:00 -0800
commit92aaa392926982d95845d5482842b1a46719dafe (patch)
tree7310fcd4349a88479e3d15dd1bd31d696ab268b9 /src
parente3a25b5a5269f752d320e9c0d8c2034ffa492fb9 (diff)
downloadcoinos-ui-92aaa392926982d95845d5482842b1a46719dafe.tar.gz
coinos-ui-92aaa392926982d95845d5482842b1a46719dafe.zip
caching in service worker
Diffstat (limited to 'src')
-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..488b36b4 100644
--- a/src/service-worker.js
+++ b/src/service-worker.js
@@ -1,8 +1,84 @@
+/// <reference types="@sveltejs/kit" />
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);
+
+ // `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";