JezK
Edit File: ifpwap-sw.js
'use strict'; const cacheName = 'ifpwap-1.0.0'; const startPage = 'https://www.postofday.com/home'; const offlinePage = 'https://www.postofday.com/'; const filesToCache = [startPage, offlinePage,'']; const neverCacheUrls = [/\/wp-admin/, /\/wp-login/, /preview=true/, /\/cart/, /ajax/, /login/,'']; self.addEventListener('install', (e) => { console.log('PWA service worker installation'); e.waitUntil( caches.open(cacheName).then((cache) => { console.log('PWA service worker caching dependencies'); return cache.addAll(filesToCache); }) ); }); self.addEventListener('activate', (e) => { console.log('PWA service worker activation'); e.waitUntil( caches.keys().then((keyList) => { return Promise.all( keyList.map((key) => { if (key !== cacheName) { console.log('PWA old cache removed', key); return caches.delete(key); } }) ); }) ); return self.clients.claim(); }); self.addEventListener('fetch', (e) => { if (!neverCacheUrls.every(checkNeverCacheList, e.request.url)) { console.log('PWA: Current request is excluded from cache.'); return; } if (!e.request.url.startsWith('http')) { return; } // start external url cache js // end external url cache js if (e.request.method !== 'GET') { e.respondWith( fetch(e.request) .catch(() => { return caches.match(offlinePage); }) ); return; } if (e.request.headers.get('range')) { fetchRangeData(e); return; } let responsePromise; if ((e.request.mode === 'navigate' || e.request.mode === 'cors') && navigator.onLine) { responsePromise = fetch(e.request) .then((response) => { return caches.open(cacheName).then((cache) => { cache.put(e.request, response.clone()); return response; }); }) .catch(() => { return caches.match(e.request.url); }); } else { // start caching type script switch ('network_first') { case 'network_first': responsePromise = networkFirstStrategy(e); break; case 'cache_first': responsePromise = cacheFirstStrategy(e); break; case 'steal_while_revalidate': responsePromise = stealWhileRevalidateStrategy(e); break; case 'cache_only': responsePromise = cacheOnlyStrategy(e); break; case 'network_only': responsePromise = networkOnlyStrategy(e); break; default: // Default strategy responsePromise = defaultStrategy(e); } } e.respondWith(responsePromise); }); // Define caching strategy functions function networkFirstStrategy(e) { return caches.match(e.request) .then((response) => { return response || fetch(e.request) .then((fetchResponse) => { return caches.open(cacheName).then((cache) => { cache.put(e.request, fetchResponse.clone()); return fetchResponse; }); }) .catch(() => { return caches.match(offlinePage); }); }); } function cacheFirstStrategy(e) { return caches.open(cacheName) .then((cache) => cache.match(e.request) .then((cacheResponse) => { return cacheResponse || fetch(e.request) .then((networkResponse) => { cache.put(e.request, networkResponse.clone()); return networkResponse; }); }) ) .catch(() => { return fetch(e.request.url) .then((response) => { return caches.open(cacheName) .then((cache) => { cache.put(e.request, response.clone()); return response; }); }); }); } function stealWhileRevalidateStrategy(e) { return caches.open(cacheName) .then((cache) => cache.match(e.request) .then((cacheResponse) => { return fetch(e.request) .then((networkResponse) => { cache.put(e.request, networkResponse.clone()); return cacheResponse || networkResponse; }); }) ); } function cacheOnlyStrategy(e) { return caches.open(cacheName) .then((cache) => cache.match(e.request)); } function networkOnlyStrategy(e) { return fetch(e.request); } function defaultStrategy(e) { console.log('defaultStrategy'); } const fetchRangeData = (event) => { const pos = Number(/^bytes=(\d+)-$/g.exec(event.request.headers.get('range'))[1]); console.log('Range request for', event.request.url, ', starting position:', pos); event.respondWith( caches.open(cacheName) .then((cache) => cache.match(event.request.url)) .then((res) => { if (!res) { return fetch(event.request) .then((res) => { return res.arrayBuffer(); }); } return res.arrayBuffer(); }) .then((ab) => { return new Response( ab.slice(pos), { status: 206, statusText: 'Partial Content', headers: [ ['Content-Range', 'bytes ' + pos + '-' + (ab.byteLength - 1) + '/' + ab.byteLength] ], } ); }) ); }; function checkNeverCacheList(url) { return !this.match(url); }