const precacheVersion = 1; const precacheName = 'precache-v' + precacheVersion; const precacheFiles = [ '/', '/bg-error.png', '/api/2.0/modules', '/api/2.0/people/info.json', '/api/2.0/people/@self.json', '/api/2.0/settings.json', ]; self.addEventListener('install', (e) => { self.skipWaiting(); e.waitUntil( caches.open(precacheName).then((cache) => { return cache.addAll(precacheFiles); }) ); }); self.addEventListener('activate', (e) => { e.waitUntil( caches.keys().then((cacheNames) => { return Promise.all(cacheNames.map((thisCacheName) => { if (thisCacheName.includes("precache") && thisCacheName !== precacheName) { console.log('[ServiceWorker] Removing cached files from old cache - ', thisCacheName); return caches.delete(thisCacheName); } })); }) ); }); self.addEventListener('fetch', (e) => { e.respondWith( fetch(e.request) .then((fetchResponse) => { e.waitUntil( update(e.request).then(refresh) ); return fetchResponse; }) .catch((err) => { return caches.match(e.request) .then((cachesResponse) =>{ if(cachesResponse){ return cachesResponse; }else{ return useFallback(); } }) }) ); }); function update(request) { return caches.open(precacheName).then((cache) => { caches.match(request).then((cachesResponse) => { if(cachesResponse){ fetch(request).then((response) => cache.put(request, response.clone()).then(() => response) ).catch((err) => console.log(`[ServiceWorker] ${err}`)); } }) } ); } const fallback = '
'+ '
\n'+ '

No internet connection found.

\n'+ '
\n'+ '
'; function useFallback() { return Promise.resolve(new Response(fallback, { headers: { 'Content-Type': 'text/html; charset=utf-8' }})); } function refresh(response) { //Send data update messages to all clients /*return self.clients.matchAll().then((clients) => { clients.forEach((client) => { const message = { type: 'refresh', url: response.url, eTag: response.headers.get('ETag') }; client.postMessage(JSON.stringify(message)); }); });*/ }