You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
92 lines
2.4 KiB
92 lines
2.4 KiB
var cacheName = 'onionite-cache-v1';
|
|
var offlineUrl = '/no-connection';
|
|
|
|
// Install
|
|
self.addEventListener('install', function(event) {
|
|
|
|
// Cache assets
|
|
event.waitUntil(
|
|
caches.open(cacheName)
|
|
.then(function(cache) {
|
|
return cache.addAll([
|
|
offlineUrl,
|
|
'/',
|
|
'/about',
|
|
'/assets/style.css',
|
|
'/assets/enhancements.js?v2',
|
|
'/assets/iconfont.woff',
|
|
'/assets/heart.svg'
|
|
]);
|
|
})
|
|
);
|
|
});
|
|
|
|
// Fetch
|
|
self.addEventListener('fetch', function(event) {
|
|
var requestUrl = new URL(event.request.url);
|
|
|
|
// Only do stuff with our own urls
|
|
if(requestUrl.origin !== location.origin) {
|
|
return;
|
|
}
|
|
|
|
// Try cache first for assets
|
|
if(requestUrl.pathname.startsWith('/assets/')) {
|
|
event.respondWith(
|
|
caches.match(event.request)
|
|
.then(function(response) {
|
|
|
|
// If we don't have it make the request
|
|
return response || fetch(event.request);
|
|
}
|
|
)
|
|
);
|
|
return;
|
|
}
|
|
|
|
// If we navigate to a page
|
|
if (
|
|
event.request.mode === 'navigate' ||
|
|
(event.request.method === 'GET' && event.request.headers.get('accept').includes('text/html'))
|
|
) {
|
|
event.respondWith(
|
|
|
|
// Make the request
|
|
fetch(event.request)
|
|
.then(function(response) {
|
|
|
|
// If it's the homepage or a node page
|
|
if(requestUrl.pathname === '/' || requestUrl.pathname.startsWith('/node/')) {
|
|
|
|
// Clone the response and read the html
|
|
response.clone().text().then(function(html) {
|
|
|
|
// Modify the html so we know when it was cached
|
|
html = html.replace('window.cacheDate=false;', 'window.cacheDate="'+Date()+'";');
|
|
var modifiedResponse = new Response(new Blob([html]), { headers: response.headers });
|
|
|
|
// Cache the modified response
|
|
caches.open(cacheName).then(function(cache) {
|
|
cache.put(event.request, modifiedResponse);
|
|
});
|
|
});
|
|
}
|
|
|
|
// Always return the original response
|
|
return response;
|
|
})
|
|
|
|
// If it fails
|
|
.catch(function() {
|
|
|
|
// Try and return a previously cached version
|
|
return caches.match(event.request)
|
|
.then(function(response) {
|
|
|
|
// If we don't have a cached version show pretty offline page
|
|
return response || caches.match(offlineUrl);
|
|
});
|
|
})
|
|
);
|
|
}
|
|
});
|
|
|