blob: 69fe5889368e411ff7c52065a38d3c2d973e0b98 [file] [log] [blame]
---
---
// Useful resources:
// - https://eduardoboucas.com/blog/2015/06/04/supercharging-jekyll-with-a-serviceworker.html
// - https://jakearchibald.com/2014/offline-cookbook
var newCacheName = 'pouchdb-assets-cache-v{{ site.time }}';
var criticalAssets = [
'/offline.html',
'/static/css/pouchdb.css',
];
var pages = [
{% for page in site.pages %}
{% if page.url != '/manifest.appcache' %}
'{{ page.url | replace:'index.html','' }}',
{% endif %}
{% endfor %}
{% for page in site.guides %}
'{{ page.url | replace:'index.html','' }}',
{% endfor %}
];
var blogPosts = [
{% for page in site.posts %}
'{{ page.url | replace:'index.html','' }}',
{% endfor %}
];
// Only cache the first blog page
var nonCriticalAssets =
[
'/static/favicon.ico',
'/static/js/code.min.js',
'https://code.jquery.com/jquery.min.js',
'https://netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js',
'https://cdn.jsdelivr.net/npm/pouchdb/dist/pouchdb.min.js',
]
.concat(pages)
.filter(function(file) {
return file.indexOf('/blog/page') === -1;
})
.concat(blogPosts.slice(0, 5)); // Let's only cache the first five by default
self.addEventListener('install', function(event) {
event.waitUntil(
caches.open(newCacheName)
.then(function(cache) {
cache.addAll(nonCriticalAssets);
// Only return the criticalAssets to waitUntil
// This will allow the noncritical assets to fail
return cache.addAll(criticalAssets);
})
.then(function() {
return self.skipWaiting();
})
);
});
self.addEventListener('activate', function(event) {
// remove caches beginning "pouchdb-" that aren't the new cache
event.waitUntil(
caches.keys()
.then(function(cacheNames) {
return Promise.all(
cacheNames.map(function(cacheName) {
if (!/^pouchdb-/.test(cacheName)) {
return;
}
if (newCacheName !== cacheName) {
return caches.delete(cacheName);
}
})
);
})
.then(function() {
return self.clients.claim();
})
);
});
self.addEventListener('fetch', function(event) {
// Try the cache, if it's not in there try the network, then cache that response
// if that network request fails show the offline.html page.
event.respondWith(
caches.open(newCacheName).then(function(cache) {
return cache.match(event.request).then(function (response) {
return response || fetch(event.request).then(function(response) {
cache.put(event.request, response.clone());
return response;
}).catch(function () {
return cache.match('/offline.html');
});
});
})
);
});