|
|
|
// PWA Code adapted from https://github.com/pwa-builder/PWABuilder
|
|
|
|
const CACHE = "pwa-precache-v1";
|
|
|
|
const precacheFiles = [
|
|
|
|
"/index.html",
|
|
|
|
"/js/predictions.js",
|
|
|
|
"/js/scripts.js",
|
|
|
|
"/css/styles.css",
|
|
|
|
"https://code.jquery.com/jquery-3.4.1.min.js",
|
|
|
|
];
|
|
|
|
|
|
|
|
self.addEventListener("install", function (event) {
|
|
|
|
console.log("[PWA] Install Event processing");
|
|
|
|
|
|
|
|
console.log("[PWA] Skip waiting on install");
|
|
|
|
self.skipWaiting();
|
|
|
|
|
|
|
|
event.waitUntil(
|
|
|
|
caches.open(CACHE).then(function (cache) {
|
|
|
|
console.log("[PWA] Caching pages during install");
|
|
|
|
return cache.addAll(precacheFiles);
|
|
|
|
})
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
// Allow sw to control of current page
|
|
|
|
self.addEventListener("activate", function (event) {
|
|
|
|
console.log("[PWA] Claiming clients for current page");
|
|
|
|
event.waitUntil(self.clients.claim());
|
|
|
|
});
|
|
|
|
|
|
|
|
// If any fetch fails, it will look for the request in the cache and serve it from there first
|
|
|
|
self.addEventListener("fetch", function (event) {
|
|
|
|
if (event.request.method !== "GET") return;
|
|
|
|
|
|
|
|
event.respondWith(
|
|
|
|
(async () => {
|
|
|
|
let response;
|
|
|
|
try {
|
|
|
|
// Fetch from network first.
|
|
|
|
response = await fetch(event.request);
|
|
|
|
event.waitUntil(updateCache(event.request, response.clone()));
|
|
|
|
} catch (error) {
|
|
|
|
try {
|
|
|
|
// Try if there's locally cached version.
|
|
|
|
response = await fromCache(event.request);
|
|
|
|
} catch (error) {
|
|
|
|
console.log("[PWA] Network request failed and no cache." + error);
|
|
|
|
throw error;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return response;
|
|
|
|
})()
|
|
|
|
);
|
|
|
|
});
|
|
|
|
|
|
|
|
function fromCache(request) {
|
|
|
|
// Check to see if you have it in the cache
|
|
|
|
// Return response
|
|
|
|
// If not in the cache, then return
|
|
|
|
return caches.open(CACHE).then(function (cache) {
|
|
|
|
return cache.match(request).then(function (matching) {
|
|
|
|
if (!matching || matching.status === 404) {
|
|
|
|
return Promise.reject("no-match");
|
|
|
|
}
|
|
|
|
|
|
|
|
return matching;
|
|
|
|
});
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
|
|
|
function updateCache(request, response) {
|
|
|
|
return caches.open(CACHE).then(function (cache) {
|
|
|
|
return cache.put(request, response);
|
|
|
|
});
|
|
|
|
}
|