|
1 |
{% load gadjo %}
|
|
2 |
/* global self, caches, fetch, URL, Response */
|
|
3 |
'use strict';
|
|
4 |
|
|
5 |
var config = {
|
|
6 |
version: 'v{% start_timestamp %}',
|
|
7 |
staticCacheItems: [
|
|
8 |
'/offline/'
|
|
9 |
],
|
|
10 |
cachePathPattern: /^\/static\/.*/,
|
|
11 |
handleFetchPathPattern: /.*/,
|
|
12 |
offlinePage: '/offline/'
|
|
13 |
};
|
|
14 |
|
|
15 |
function cacheName (key, opts) {
|
|
16 |
return `${opts.version}-${key}`;
|
|
17 |
}
|
|
18 |
|
|
19 |
function addToCache (cacheKey, request, response) {
|
|
20 |
if (response.ok && cacheKey !== null) {
|
|
21 |
var copy = response.clone();
|
|
22 |
caches.open(cacheKey).then( cache => {
|
|
23 |
cache.put(request, copy);
|
|
24 |
});
|
|
25 |
}
|
|
26 |
return response;
|
|
27 |
}
|
|
28 |
|
|
29 |
function fetchFromCache (event) {
|
|
30 |
return caches.match(event.request).then(response => {
|
|
31 |
if (!response) {
|
|
32 |
throw Error(`${event.request.url} not found in cache`);
|
|
33 |
}
|
|
34 |
return response;
|
|
35 |
});
|
|
36 |
}
|
|
37 |
|
|
38 |
function offlineResponse (resourceType, opts) {
|
|
39 |
if (resourceType === 'content') {
|
|
40 |
return caches.match(opts.offlinePage);
|
|
41 |
}
|
|
42 |
return undefined;
|
|
43 |
}
|
|
44 |
|
|
45 |
self.addEventListener('install', event => {
|
|
46 |
function onInstall (event, opts) {
|
|
47 |
var cacheKey = cacheName('static', opts);
|
|
48 |
return caches.open(cacheKey)
|
|
49 |
.then(cache => cache.addAll(opts.staticCacheItems));
|
|
50 |
}
|
|
51 |
|
|
52 |
event.waitUntil(
|
|
53 |
onInstall(event, config).then( () => self.skipWaiting() )
|
|
54 |
);
|
|
55 |
});
|
|
56 |
|
|
57 |
self.addEventListener('activate', event => {
|
|
58 |
function onActivate (event, opts) {
|
|
59 |
return caches.keys()
|
|
60 |
.then(cacheKeys => {
|
|
61 |
var oldCacheKeys = cacheKeys.filter(key => key.indexOf(opts.version) !== 0);
|
|
62 |
var deletePromises = oldCacheKeys.map(oldKey => caches.delete(oldKey));
|
|
63 |
return Promise.all(deletePromises);
|
|
64 |
});
|
|
65 |
}
|
|
66 |
|
|
67 |
event.waitUntil(
|
|
68 |
onActivate(event, config)
|
|
69 |
.then( () => self.clients.claim() )
|
|
70 |
);
|
|
71 |
});
|
|
72 |
|
|
73 |
self.addEventListener('fetch', event => {
|
|
74 |
|
|
75 |
function shouldHandleFetch (event, opts) {
|
|
76 |
var request = event.request;
|
|
77 |
var url = new URL(request.url);
|
|
78 |
var criteria = {
|
|
79 |
matchesPathPattern: opts.handleFetchPathPattern.test(url.pathname),
|
|
80 |
isGETRequest : request.method === 'GET',
|
|
81 |
isFromMyOrigin : url.origin === self.location.origin
|
|
82 |
};
|
|
83 |
var failingCriteria = Object.keys(criteria)
|
|
84 |
.filter(criteriaKey => !criteria[criteriaKey]);
|
|
85 |
return !failingCriteria.length;
|
|
86 |
}
|
|
87 |
|
|
88 |
function onFetch (event, opts) {
|
|
89 |
var request = event.request;
|
|
90 |
var url = new URL(request.url);
|
|
91 |
var acceptHeader = request.headers.get('Accept');
|
|
92 |
var resourceType = 'static';
|
|
93 |
var cacheKey;
|
|
94 |
|
|
95 |
if (acceptHeader.indexOf('text/html') !== -1) {
|
|
96 |
resourceType = 'content';
|
|
97 |
} else if (acceptHeader.indexOf('image') !== -1) {
|
|
98 |
resourceType = 'image';
|
|
99 |
}
|
|
100 |
|
|
101 |
cacheKey = null;
|
|
102 |
if (opts.cachePathPattern.test(url.pathname)) {
|
|
103 |
cacheKey = cacheName(resourceType, opts);
|
|
104 |
}
|
|
105 |
|
|
106 |
/* always network first */
|
|
107 |
if (true || resourceType === 'content') {
|
|
108 |
event.respondWith(
|
|
109 |
fetch(request)
|
|
110 |
.then(response => addToCache(cacheKey, request, response))
|
|
111 |
.catch(() => fetchFromCache(event))
|
|
112 |
.catch(() => offlineResponse(resourceType, opts))
|
|
113 |
);
|
|
114 |
} else {
|
|
115 |
event.respondWith(
|
|
116 |
fetchFromCache(event)
|
|
117 |
.catch(() => fetch(request))
|
|
118 |
.then(response => addToCache(cacheKey, request, response))
|
|
119 |
.catch(() => offlineResponse(resourceType, opts))
|
|
120 |
);
|
|
121 |
}
|
|
122 |
}
|
|
123 |
if (shouldHandleFetch(event, config)) {
|
|
124 |
onFetch(event, config);
|
|
125 |
}
|
|
126 |
});
|