sw.js (1.6 KB)


 1 const CACHE_NAME = 'matryoshka-v1.5';
 2 const ASSETS = [
 3 	'./',
 4 	'index.html',
 5 	'manifest.json',
 6 	'resources/main.css',
 7 	'resources/state.js',
 8 	'resources/storage.js',
 9 	'resources/task-model.js',
10 	'resources/multi-select.js',
11 	'resources/navigation.js',
12 	'resources/reorganize.js',
13 	'resources/keyboard.js',
14 	'resources/render.js',
15 	'resources/task-element.js',
16 	'resources/theme.js',
17 	'resources/main.js',
18 	'resources/icons/icon.png',
19 	'resources/fonts/Basteleur-Moonlight.ttf',
20 ];
21 
22 // Cache assets on install
23 self.addEventListener('install', (event) => {
24 	event.waitUntil(
25 		caches.open(CACHE_NAME)
26 			.then((cache) => cache.addAll(ASSETS))
27 			.then(() => self.skipWaiting())
28 	);
29 });
30 
31 // Clean up old caches on activate
32 self.addEventListener('activate', (event) => {
33 	event.waitUntil(
34 		caches.keys()
35 			.then((keys) => Promise.all(
36 				keys.filter((key) => key !== CACHE_NAME)
37 					.map((key) => caches.delete(key))
38 			))
39 			.then(() => self.clients.claim())
40 	);
41 });
42 
43 // Serve from cache, fall back to network, and update cache
44 self.addEventListener('fetch', (event) => {
45 	event.respondWith(
46 		caches.open(CACHE_NAME).then((cache) => cache.match(event.request)).then((cached) => {
47 			const fetchPromise = fetch(event.request).then((response) => {
48 				// Only cache same-origin, successful GET requests
49 				if (response.ok && event.request.method === 'GET') {
50 					const clone = response.clone();
51 					caches.open(CACHE_NAME).then((cache) => {
52 						cache.put(event.request, clone);
53 					});
54 				}
55 				return response;
56 			}).catch(() => cached);
57 
58 			return cached || fetchPromise;
59 		})
60 	);
61 });