UNPKG

super-project

Version:
113 lines (100 loc) 3.35 kB
// 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); } }) ) }) ) })