144 lines
4.2 KiB
Text
144 lines
4.2 KiB
Text
var CACHE_VERSION = 'v2.7.1';
|
|
var CACHE_NAME = CACHE_VERSION + ':sw-cache::';
|
|
var REQUESTS_LIMIT = 40;
|
|
|
|
function onInstall(event) {
|
|
event.waitUntil(
|
|
caches.open(CACHE_NAME).then(function prefill(cache) {
|
|
return cache.addAll([
|
|
'<%= asset_path "base.js" %>',
|
|
'<%= asset_path "minimal.css" %>',
|
|
'/offline.html',
|
|
'<%= asset_path "devword.png" %>',
|
|
'<%= asset_path "wires.png" %>',
|
|
'<%= asset_path "comments-bubble.png" %>',
|
|
'<%= asset_path "reactions-stack.png" %>',
|
|
'<%= asset_path "emoji/emoji-one-heart.png" %>',
|
|
'<%= asset_path "emoji/emoji-one-unicorn.png" %>',
|
|
'<%= asset_path "emoji/emoji-one-bookmark.png" %>',
|
|
'<%= asset_path "emoji/apple-fire.png" %>',
|
|
]).then(function () {
|
|
console.log("WORKER: Install completed");
|
|
});
|
|
})
|
|
);
|
|
}
|
|
|
|
function onActivate(event) {
|
|
console.log('[Serviceworker]', "Activating!", event);
|
|
event.waitUntil(
|
|
caches.keys().then(function(cacheNames) {
|
|
return Promise.all(
|
|
cacheNames.filter(function(cacheName) {
|
|
// Return true if you want to remove this cache,
|
|
return cacheName.indexOf(CACHE_NAME) !== 0;
|
|
}).map(function(cacheName) {
|
|
return caches.delete(cacheName);
|
|
})
|
|
);
|
|
})
|
|
);
|
|
}
|
|
|
|
function onFetch(event) {
|
|
if ( requestBlackListed(event.request) ) { return; }
|
|
event.respondWith(
|
|
caches.match(event.request).then(function (cached) {
|
|
if (cached && shouldReturnStraightFromCache(event.request.url)) {
|
|
return cached;
|
|
}
|
|
return fetch(event.request)
|
|
.then(fetchedFromNetwork)
|
|
.catch(function fallback(err) {
|
|
console.log(err)
|
|
return cached || caches.match('/offline.html');
|
|
})
|
|
}
|
|
)
|
|
);
|
|
|
|
|
|
function requestBlackListed(request){
|
|
var url = new URL(request.url);
|
|
var test = (event.request.method !== 'GET' ||
|
|
event.request.url.match(/\/notifications(\?|\/)/) ||
|
|
url.host.indexOf("facebook") > -1 ||
|
|
url.host.indexOf("google") > -1 )
|
|
return test
|
|
}
|
|
|
|
function shouldReturnStraightFromCache(url) {
|
|
return (url === "<%= asset_path "base.js" %>" ||
|
|
url === "<%= asset_path "minimal.css" %>" ||
|
|
url.indexOf(".self-") > -1 ||
|
|
(url.indexOf("search?") > -1 && url.indexOf("&i=i") > -1) ||
|
|
url.indexOf("freetls.fastly.net") > -1)
|
|
}
|
|
|
|
function fetchedFromNetwork(response) {
|
|
var cacheCopy = response.clone();
|
|
caches
|
|
.open(CACHE_NAME + 'pages')
|
|
.then(function add(cache) {
|
|
if ( shouldReturnStraightFromCache(event.request.url) ) {
|
|
cache.put(event.request, cacheCopy);
|
|
}
|
|
garbageCollect(cache);
|
|
})
|
|
return response;
|
|
}
|
|
|
|
function garbageCollect(cache) {
|
|
cache.keys().then(function count(keys) {
|
|
if (keys.length > REQUESTS_LIMIT) {
|
|
cache.delete(keys[0]);
|
|
cache.delete(keys[1]);
|
|
cache.delete(keys[2]);
|
|
cache.delete(keys[3]);
|
|
cache.delete(keys[4]);
|
|
cache.delete(keys[5]);
|
|
cache.delete(keys[6]);
|
|
cache.delete(keys[7]);
|
|
cache.delete(keys[8]);
|
|
cache.delete(keys[9]);
|
|
cache.delete(keys[10]);
|
|
}
|
|
})
|
|
}
|
|
|
|
function unableToResolve () {
|
|
console.log('WORKER: fetch request failed in both cache and network.');
|
|
return caches.match('/offline.html')
|
|
}
|
|
};
|
|
|
|
function onPush(event) {
|
|
var title = 'DEV Connect 👋 ';
|
|
var body = event.data.text();
|
|
var icon = '<%= image_path "devlogo-pwa-128.png" %>';
|
|
var tag = 'default-tag' + body;
|
|
event.waitUntil(
|
|
self.registration.showNotification(title, {
|
|
body: body,
|
|
icon: icon,
|
|
tag: tag,
|
|
data: {
|
|
url: 'https://dev.to/connect'
|
|
}
|
|
})
|
|
);
|
|
};
|
|
|
|
function onNotificationClick(event) {
|
|
if (Notification.prototype.hasOwnProperty('data')) {
|
|
var url = event.notification.data.url;
|
|
event.waitUntil(clients.openWindow(url));
|
|
}
|
|
}
|
|
|
|
|
|
self.addEventListener('install', onInstall);
|
|
self.addEventListener('activate', onActivate);
|
|
self.addEventListener('fetch', onFetch);
|
|
self.addEventListener('push', onPush);
|
|
self.addEventListener('notificationclick', onNotificationClick)
|