aboutsummaryrefslogtreecommitdiffstats
path: root/assets/sw.js
diff options
context:
space:
mode:
Diffstat (limited to 'assets/sw.js')
-rw-r--r--assets/sw.js61
1 files changed, 61 insertions, 0 deletions
diff --git a/assets/sw.js b/assets/sw.js
new file mode 100644
index 0000000..e6b6538
--- /dev/null
+++ b/assets/sw.js
@@ -0,0 +1,61 @@
+import metadata from "/assets/metadata.js"
+
+const data = metadata()
+
+const sw_cache = {
+ offline: "/offline.html",
+ default: [
+ "/assets/index.css",
+ "/vendor/prism.css",
+ "/assets/index.js",
+ "/favicon/icon.svg",
+ "/offline.html",
+ ],
+ store: data.version,
+};
+
+(function() {
+ self.addEventListener("install", event => {
+ self.skipWaiting();
+ event.waitUntil((async() => {
+ const cache = await self.caches.open(sw_cache.store);
+ return cache.addAll(sw_cache.default);
+ })());
+ });
+
+ self.addEventListener("activate", event => {
+ event.waitUntil((async() => {
+ const keys = await self.caches.keys();
+ return Promise.all(keys.map(key => {
+ if (key !== sw_cache.store) {
+ return self.caches.delete(key);
+ }
+ }));
+ })());
+ });
+
+ self.addEventListener("fetch", event => {
+ event.respondWith((async() => {
+ if (event.request.method != "GET") {
+ return fetch(event.request);
+ }
+
+ const req_url = new URL(event.request.url);
+ if (req_url.origin != self.location.origin) {
+ return fetch(event.request);
+ }
+
+ const cacheres = await self.caches.match(event.request);
+ return cacheres || (async() => {
+ try {
+ const response = await self.fetch(event.request);
+ const cache = await self.caches.open(sw_cache.store);
+ cache.put(event.request, response.clone());
+ return response;
+ } catch {
+ return self.caches.match(sw_cache.offline);
+ }
+ })();
+ })());
+ });
+})(); \ No newline at end of file