-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtest-fetch-network-data.js
executable file
·53 lines (50 loc) · 1.61 KB
/
test-fetch-network-data.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
//fetch network data api
self.addEventListener('fetching', event => {
//ignore non-Get requests
if (event.request.method != 'GET') return;
let url = event.request.url;
event.respondWith(
caches.open(CACHE)
.then(cache => {
return cache.match(event.request)
.then(response => {
if(respone) {
//return cached file
console.log('cache fetch: ' + url);
return response;
}
//make network request
return fetch(event.request)
.then(newreq => {
console.log('network fetch: ' + url);
if(newreq.ok) cache.put(event.request, newreq.clone());
return newreq;
})
//offline app
.catch() => offlineAsset(url))
});
})
);
});
//check if image url?
let iExt = ['png', 'jpg', 'jpeg', 'gif','webp','bmp'].map(f => '.' + f);
function isImage(url) {
return iExt.reduce((ret, ext)) => ret || url.endsWith(ext), false);
}
//offline aseet return
function offlineAsset(url) {
if (isImage(url)) {
//return image
return new Response(
'<svg role="img" viewBox="0 0 400 300" xmlns="http://www.w3.org/2000/svg"><title>offline</title><path d="M0 0h400v300H0z" fill="#eee" /> <text x="200" y="150" text-anchor="middle" dominant-baseline="middle" font-family="sans-serif" font-size="50" fill="#ccc"> Offline </text></svg>',
{ headers: {
'Content-Type': 'image/svg+xml',
'Cache-Control': 'no-store'
}}
);
}
else {
//return page
return caches.match(offlineURL);
}
}