1 /* global self, caches, fetch, URL, Response */
14 function cacheName (key, opts) {
15 return `${opts.version}-${key}`;
18 function addToCache (cacheKey, request, response) {
20 var copy = response.clone();
21 caches.open(cacheKey).then( cache => {
22 cache.put(request, copy);
28 function fetchFromCache (event) {
29 return caches.match(event.request).then(response => {
31 throw Error(`${event.request.url} not found in cache`);
37 function offlineResponse (resourceType, opts) {
41 self.addEventListener('install', event => {
42 function onInstall (event, opts) {
43 var cacheKey = cacheName('static', opts);
44 return caches.open(cacheKey)
45 .then(cache => cache.addAll(opts.staticCacheItems));
49 onInstall(event, config).then( () => self.skipWaiting() )
53 self.addEventListener('activate', event => {
54 function onActivate (event, opts) {
57 var oldCacheKeys = cacheKeys.filter(key => key.indexOf(opts.version) !== 0);
58 var deletePromises = oldCacheKeys.map(oldKey => caches.delete(oldKey));
59 return Promise.all(deletePromises);
64 onActivate(event, config)
65 .then( () => self.clients.claim() )
69 self.addEventListener('fetch', event => {
71 function shouldHandleFetch (event, opts) {
72 var request = event.request;
73 var url = new URL(request.url);
75 isGETRequest : request.method === 'GET',
76 isFromMyOrigin : url.origin === self.location.origin
78 var failingCriteria = Object.keys(criteria)
79 .filter(criteriaKey => !criteria[criteriaKey]);
80 return !failingCriteria.length;
83 function onFetch (event, opts) {
84 var request = event.request;
85 var acceptHeader = request.headers.get('Accept');
86 var resourceType = 'static';
89 if (acceptHeader.indexOf('text/html') !== -1) {
90 resourceType = 'content';
91 } else if (acceptHeader.indexOf('image') !== -1) {
92 resourceType = 'image';
95 cacheKey = cacheName(resourceType, opts);
97 if (resourceType === 'content') {
100 .then(response => addToCache(cacheKey, request, response))
101 .catch(() => fetchFromCache(event))
102 .catch(() => offlineResponse(resourceType, opts))
106 fetchFromCache(event)
107 .catch(() => fetch(request))
108 .then(response => addToCache(cacheKey, request, response))
109 .catch(() => offlineResponse(resourceType, opts))
113 if (shouldHandleFetch(event, config)) {
114 onFetch(event, config);