Repository navigation
Expand file tree
/
Copy pathsw.js
More file actions
71 lines (64 loc) · 1.96 KB
/
Copy pathsw.js
File metadata and controls
71 lines (64 loc) · 1.96 KB
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
/* Chained Timers — Service Worker */
const CACHE = 'chained-timers-v1.4.24';
const ASSETS = [
'./',
'./index.html',
'./css/styles.css',
'./css/fonts.css',
'./js/app.js',
'./manifest.webmanifest',
'./icons/icon.svg',
'./icons/icon-192.png',
'./icons/icon-512.png',
'./icons/icon-maskable-192.png',
'./icons/icon-maskable-512.png',
];
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE).then(c => c.addAll(ASSETS).catch(() => {}))
);
self.skipWaiting();
});
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then(keys => Promise.all(
keys.filter(k => k !== CACHE).map(k => caches.delete(k))
)).then(() => self.clients.claim())
);
});
self.addEventListener('fetch', (event) => {
const req = event.request;
if (req.method !== 'GET') return;
// network-first for HTML so updates roll out without manual refresh
const url = new URL(req.url);
const isHTML = req.mode === 'navigate' || (req.headers.get('accept') || '').includes('text/html');
if (isHTML) {
event.respondWith(
fetch(req).then(res => {
const copy = res.clone();
caches.open(CACHE).then(c => c.put(req, copy));
return res;
}).catch(() => caches.match(req).then(r => r || caches.match('./index.html')))
);
return;
}
// cache-first for static assets
event.respondWith(
caches.match(req).then(cached => cached || fetch(req).then(res => {
if (res.ok && url.origin === location.origin) {
const copy = res.clone();
caches.open(CACHE).then(c => c.put(req, copy));
}
return res;
}).catch(() => cached))
);
});
self.addEventListener('notificationclick', (event) => {
event.notification.close();
event.waitUntil(
self.clients.matchAll({ type: 'window' }).then(list => {
for (const c of list) { if ('focus' in c) return c.focus(); }
if (self.clients.openWindow) return self.clients.openWindow('./');
})
);
});