SiteWebAstrolabe/src/_includes/partials/global/service-worker.js

89 lines
2.3 KiB
JavaScript
Raw Normal View History

2020-06-19 23:47:44 +02:00
const CACHE_KEYS = {
PRE_CACHE: `precache-${VERSION}`,
RUNTIME: `runtime-${VERSION}`
};
// URLS that we dont want to end up in the cache
const EXCLUDED_URLS = [
'/contact',
'/thank-you'
];
// URLS that we want to be cached when the worker is installed
const PRE_CACHE_URLS = ['/', '/fonts/VarelaRound-Regular.ttf', '/fonts/OpenSans-Bold.ttf', '/fonts/OpenSans-SemiBold.ttf', '/fonts/OpenSans-Regular.ttf'];
// You might want to bypass a certain host
const IGNORED_HOSTS = ['localhost', 'unpkg.com', ];
/**
* Takes an array of strings and puts them in a named cache store
*
* @param {String} cacheName
* @param {Array} items=[]
*/
const addItemsToCache = function(cacheName, items = []) {
caches.open(cacheName).then(cache => cache.addAll(items));
};
self.addEventListener('install', evt => {
self.skipWaiting();
addItemsToCache(CACHE_KEYS.PRE_CACHE, PRE_CACHE_URLS);
});
self.addEventListener('activate', evt => {
// Look for any old caches that don't match our set and clear them out
evt.waitUntil(
caches
.keys()
.then(cacheNames => {
return cacheNames.filter(item => !Object.values(CACHE_KEYS).includes(item));
})
.then(itemsToDelete => {
return Promise.all(
itemsToDelete.map(item => {
return caches.delete(item);
})
);
})
.then(() => self.clients.claim())
);
});
self.addEventListener('fetch', evt => {
const {hostname} = new URL(evt.request.url);
// Check we don't want to ignore this host
if (IGNORED_HOSTS.indexOf(hostname) >= 0) {
return;
}
// Check we don't want to ignore this URL
if (EXCLUDED_URLS.some(page => evt.request.url.indexOf(page) > -1)) {
return;
}
evt.respondWith(
caches.match(evt.request).then(cachedResponse => {
// Item found in cache so return
if (cachedResponse) {
return cachedResponse;
}
// Nothing found so load up the request from the network
return caches.open(CACHE_KEYS.RUNTIME).then(cache => {
return fetch(evt.request)
.then(response => {
// Put the new response in cache and return it
return cache.put(evt.request, response.clone()).then(() => {
return response;
});
})
.catch(ex => {
return;
});
});
})
);
});