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 });