docbrown/app/assets/javascripts/serviceworker.js.erb
Mac Siri 0af2a0a7dc Update Service Worker and Favicon (#3142)
* Update favicon

* Update ServiceWorker with error logging
2019-06-13 11:39:03 -04:00

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)