-
Notifications
You must be signed in to change notification settings - Fork 0
/
serviceworker.js
119 lines (100 loc) · 4.25 KB
/
serviceworker.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
// Names of the two caches used in this version of the service worker.
// Change to vxxx, etc. when you update any of the local resources, which will
// in turn trigger the install event again.
const PRECACHE = 'precache-v${BUILD_NUMBER}'
const RUNTIME = 'runtime-v${BUILD_NUMBER}'
// A list of local resources we always want to be cached.
const PRECACHE_URLS = [
'/', // Alias for index.html
'main.bundle.js?v=${BUILD_NUMBER}',
'manifest.json?v=${BUILD_NUMBER}',
'favicon.ico'
]
// a list of cross origin domains that we want to cache
const HOSTS = [
'https://fonts.googleapis.com',
'https://maxcdn.bootstrapcdn.com',
'https://cdnjs.cloudflare.com',
'https://firebasestorage.googleapis.com'
]
// The install handler takes care of precaching the resources we always need.
self.addEventListener('install', event => {
event.waitUntil(
caches.open(PRECACHE)
.then(cache => cache.addAll(PRECACHE_URLS))
.then(self.skipWaiting())
)
})
self.addEventListener('activate', event => {
const expectedCaches = [PRECACHE, RUNTIME];
// delete any caches that aren't in expectedCaches
event.waitUntil(
// clear all caches
/*caches.keys().then(function(names) {
for (let name of names)
caches.delete(name)
})*/
// update caches
caches.keys().then(keys => {
keys.forEach(key => {
caches.open(key).then(cache => {
cache.keys().then((requests) => {
if(key.startsWith('runtime-')) {
requests.forEach(async request => {
// the cache option set to reload will force the browser to
// request any of these resources via the network,
// which avoids caching older files again
const req = new Request(request.url, {cache: 'reload'})
console.log('fetch ' + request.url)
fetch(req).then(res => {
if (res && res.status === 200) {
caches.open(RUNTIME).then((cache) => {
console.log('cache ' + request.url)
cache.put(req, res.clone())
})
}
})
})
}
if (!expectedCaches.includes(key)) {
caches.delete(key).then(()=>{
console.log('cache key '+key+' deleted')
})
}
})
})
})
})
)
})
// The fetch handler serves responses for same-origin resources from a cache.
// If no response is found, it populates the runtime cache with the response
// from the network before returning it to the page.
self.addEventListener('fetch', event => {
if (event.request.cache === 'only-if-cached' && event.request.mode !== 'same-origin') {
return
}
if (event.request.url==='/graphql' || event.request.url.indexOf('/uploads/') >= 0 || event.request.url.indexOf('/lunucapi/') >= 0) {
return
}
// Skip cross-origin requests, like those for Google Analytics.
if (event.request.method == 'GET' && (event.request.url.startsWith(self.location.origin) ||
HOSTS.some((host) => event.request.url.startsWith(host))
)) {
event.respondWith(
caches.match(event.request).then((resp) => {
return resp && !resp.redirected ? resp : fetch(event.request).then((response) => {
let responseClone = response.clone()
caches.open(RUNTIME).then((cache) => {
if(responseClone && responseClone.status===200) {
cache.put(event.request, responseClone)
}
})
return response
}).catch(error=>{
console.log(error)
})
})
)
}
})