diff options
Diffstat (limited to 'src/assets/sw.mjs')
-rw-r--r-- | src/assets/sw.mjs | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/assets/sw.mjs b/src/assets/sw.mjs new file mode 100644 index 0000000..432e630 --- /dev/null +++ b/src/assets/sw.mjs @@ -0,0 +1,63 @@ +const cache_name = "v3" + +const install_sw = async event => { + const precache = async() => { + const cache = await caches.open(cache_name); + return cache.addAll([ + '/index.css', + '/prism.css', + '/index.js', + '/sw.js', + '/favicon.svg', + '/offline.html', + '/' + ]) + } + event.waitUntil(precache()) +} + +const activate_sw = async event => { + const cachepreserve = ['v3']; + + const invalidatecache = async() => { + const keys = await caches.keys() + Promise.all( + keys.map((key) => { + if (cachepreserve.indexOf(key) === -1) { + return caches.delete(key) + } + })) + } + event.waitUntil(invalidatecache()) +} + +const fetch_sw = async event => { + const cache_fetch = async() => { + if (event.request.method != 'GET') { + return + } + const cacheres = await caches.match(event.request) + if (cacheres !== undefined) { + return cacheres + } + try { + const response = await fetch(event.request) + const cache = await caches.open(cache_name) + cache.put(event.request, response.clone()) + return response + } catch { + return caches.match('/offline.html') + } + } + + event.respondWith(cache_fetch()) +} + +const main = async() => { + self.addEventListener('install', install_sw) + self.addEventListener('activate', activate_sw) + self.addEventListener('fetch', fetch_sw) + +} + +main()
\ No newline at end of file |