Skip to content

Instantly share code, notes, and snippets.

View osvaldasvalutis's full-sized avatar

Osvaldas Valutis osvaldasvalutis

View GitHub Profile
self.addEventListener('fetch', event => {
var type = event.request.headers.get('Accept');
// network-first for HTML documents
if(type.includes('text/html')) {
event.respondWith(
// respondWith code from network-first section
);
}
// cache-first for assets
else {
event.respondWith(caches.match(request).then(response => {
return response // cache-first
|| fetch(request).then(response => { // network
// ...
})
.catch(() => { // offline
if(type.startsWith('image')) {
return new Response('<svg...', {headers: {'Content-Type': 'image/svg+xml', 'Cache-Control': 'no-store'}});
}
else {
event.respondWith(caches.match(request).then(response => {
return response // cache-first
|| fetch(request).then(response => { // network
// ...
})
.catch(() => { // offline
if(type.startsWith('image')) {
return caches.match('/offline.jpg');
}
else {
const version = '1-',
criticalsCacheName = `${version}critical`,
otherCacheName = `${version}other`,
imagesCacheName = `${version}images`;
const addToCache = (cacheName, request, response) => {
caches.open(cacheName).then(cache => cache.put(request, response));
};
const clearOldCaches = () => {
return caches.keys().then(keys => {
return Promise.all(keys.filter(key => !key.startsWith(version)).map(key => caches.delete(key)));
});
};
self.addEventListener('activate', event => {
event.waitUntil(clearOldCaches().then(() => self.clients.claim()));
});
if('serviceWorker' in navigator) {
navigator.serviceWorker.register('/serviceworker.js');
if(navigator.serviceWorker.controller) {
navigator.serviceWorker.controller.postMessage({'command': 'trimCache'});
}
}
const trimCache = (cacheName, maxItems) => {
caches.open(cacheName).then(cache => {
cache.keys().then(keys => {
if(keys.length > maxItems)
cache.delete(keys[0]).then(trimCache(cacheName, maxItems));
});
});
};
self.addEventListener('message', event => {
if(criticalResources.includes(url.pathname))
addToCache(criticalsCacheName, request, responseCopy);
else if(type.startsWith('image'))
addToCache(imagesCacheName, request, responseCopy);
else
addToCache(otherCacheName, request, responseCopy);
var thirdPartyExceptions = [
'https://code.jquery.com/jquery.min.js'
];
// ...
event.respondWith(fetch(request).then(response => { // network
// cache only resources from this domain as well as the exceptions
if(location.origin === url.origin ||
thirdPartyExceptions.includes(url.href)) {
// addToCache use
}