-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsw.js
103 lines (85 loc) · 2.99 KB
/
sw.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
"use strict";
const version = 1,
name = `my-app-v${version}`,
timeout = 1800,
urls = [],
hosts = [],
reload = false,
safari = true,
announce = true,
cacheable = arg => (arg.includes("no-store") || arg.includes("max-age=0")) === false;
function log (arg) {
console.log(`[serviceWorker:${new Date().getTime()}] ${arg}`);
}
if (safari || (/Version\/[\d+\.]+ Safari/).test(navigator.userAgent) === false) {
self.addEventListener("activate", ev => ev.waitUntil(caches.keys().then(args => {
const invalid = args.filter(i => i !== name);
let result;
if (args.includes(name) === false) {
caches.open(name).then(cache => {
log("type=activate, cached=false, message=\"Caching core assets\"");
return cache.addAll(urls);
}).catch(err => log(`type=error, action=activate, message="${err.message}"`));
} else {
log("type=activate, cached=true, message=\"Reusing cached core assets\"");
}
if (announce) {
self.clients.claim();
self.clients.matchAll().then(clients => clients.forEach(client => client.postMessage(`version_${version}`)));
}
if (invalid.length === 0) {
log("type=delete, message=\"No stale caches\"");
result = Promise.resolve();
} else {
log(`type=delete, message="Stale caches: ${invalid.toString()}"`);
result = Promise.all(invalid.map(i => {
log(`type=delete, message="Deleted stale cache ${i}"`);
caches.delete(i);
if (reload) {
self.clients.claim();
self.clients.matchAll().then(clients => clients.forEach(client => {
log("type=reload, message=\"Loading new version of application\"");
client.postMessage("reload");
}));
}
}));
}
return result;
}).catch(() => void 0)));
self.addEventListener("install", ev => {
self.skipWaiting();
ev.waitUntil(() => log("type=install, message=\"New service worker installed\""));
});
self.addEventListener("fetch", ev => {
const method = ev.request.method,
http = (/^https?\:/).test(ev.request.url),
handle = hosts.length === 0 || hosts.includes(new URL(ev.request.url).hostname);
let result;
if (http && handle && method === "GET") {
result = ev.respondWith(caches.open(name).then(cache => {
return cache.match(ev.request).then(cached => {
const now = new Date().getTime();
let lresult;
if (cached !== void 0) {
const url = new URL(cached.url),
cdate = cached.headers.get("date"),
then = (cdate !== null ? new Date(cdate) : new Date()).getTime() + Number((cached.headers.get("cache-control") || "").replace(/[^\d]/g, "") || timeout) * 1e3;
if (urls.includes(url.pathname) || then > now) {
lresult = cached.clone();
}
}
if (lresult === void 0) {
lresult = fetch(ev.request).then(res => {
if ((res.type === "basic" || res.type === "cors") && res.status === 200 && cacheable(res.headers.get("cache-control") || "")) {
cache.put(ev.request, res.clone());
}
return res;
});
}
return lresult;
});
}).catch(() => void 0));
}
return result;
});
}