super-project
Version:
Base framework for Super Project.
113 lines (100 loc) • 3.35 kB
JavaScript
// https://github.com/14islands/vecka.14islands.com
// Created using this tutorial
// https://developers.google.com/web/fundamentals/primers/service-worker/?hl=en
const CACHE_NAME = 'super-cache'
const urlsToCache = [/* APPEND URLS HERE */]
function addToCache(request, response) {
if (response.ok) {
const copy = response.clone()
caches.open(CACHE_NAME).then(cache => {
cache.put(request, copy)
})
return response
}
}
function fetchFromCache(event) {
return caches.match(event.request).then(response => {
if (!response) {
// A synchronous error that will kick off the catch handler
throw Error(`${event.request.url} not found in cache`)
}
return response
})
}
function offlineResponse() {
return new Response('Sorry, the application is offline.')
}
function respondFromNetworkThenCache(event) {
// console.log('Network first ', event.request.url)
// Check network first, then cache
const request = event.request
event.respondWith(
fetch(request)
.then(response => addToCache(request, response))
.catch(() => fetchFromCache(event))
.catch(() => offlineResponse())
)
}
function respondFromCacheThenNetwork(event) {
// console.log('Cache first ', event.request.url)
// Check cache first, then network
const request = event.request
event.respondWith(
fetchFromCache(event)
.catch(() => fetch(request))
.then(response => addToCache(request, response))
.catch(() => offlineResponse())
)
}
function shouldHandleFetch(event) {
return (
event.request.method.toLowerCase() === 'get'
&& (event.request.url.indexOf(location.origin) > -1)
&& (event.request.url.indexOf('google-analytics.com') === -1)
&& (event.request.url.indexOf(location.origin + '/api') < 0)
)
}
function shouldRespondFromNetworkThenCache(event) {
return (
event.request.headers.get('Accept').indexOf('text/html') >= 0
// || /chunk.+\.js$/.test(event.request.url)
)
}
// Open cache and store assets
self.addEventListener('install', (event) => {
// console.log('Service Worker - INSTALL')
// Perform install steps
event.waitUntil(
caches.open(CACHE_NAME)
.then((cache) => {
// console.log(urlsToCache)
return cache.addAll(urlsToCache);
})
)
})
self.addEventListener('fetch', (event) => {
if (shouldHandleFetch(event)) {
// console.log('Service Worker - FETCH', event.request)
if (shouldRespondFromNetworkThenCache(event)) {
respondFromNetworkThenCache(event)
} else {
respondFromCacheThenNetwork(event)
}
}
})
self.addEventListener('activate', (event) => {
// console.log('Service Worker - ACTIVATE')
var cacheWhitelist = [CACHE_NAME]
// Clean up old cache versions
event.waitUntil(
caches.keys().then(function (cacheNames) {
return Promise.all(
cacheNames.map(function (cacheName) {
if (cacheWhitelist.indexOf(cacheName) === -1) {
return caches.delete(cacheName);
}
})
)
})
)
})