aboutsummaryrefslogtreecommitdiffstats
path: root/src/service-worker.js
diff options
context:
space:
mode:
authorAdam Soltys <[email protected]>2024-04-11 13:35:06 -0700
committerAdam Soltys <[email protected]>2024-04-11 13:35:06 -0700
commit9d55044d4321233f6ffdbada737bccb5894a0f2a (patch)
treeeadaa34e2c9e4e61184d4d0634cdbab3b4ac5d67 /src/service-worker.js
parentc92dce530d00edad2447daba619514f50418f0ac (diff)
downloadcoinos-ui-9d55044d4321233f6ffdbada737bccb5894a0f2a.tar.gz
coinos-ui-9d55044d4321233f6ffdbada737bccb5894a0f2a.zip
service worker for pwa
Diffstat (limited to 'src/service-worker.js')
-rw-r--r--src/service-worker.js83
1 files changed, 83 insertions, 0 deletions
diff --git a/src/service-worker.js b/src/service-worker.js
new file mode 100644
index 00000000..a95ff268
--- /dev/null
+++ b/src/service-worker.js
@@ -0,0 +1,83 @@
+/// <reference types="@sveltejs/kit" />
+import { build, files, version } from "$service-worker";
+
+// 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) => {
+ console.log("SW installed");
+
+ // 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) => {
+ console.log("FETCH")
+ // 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());
+});