1// FlatFast PWA Service Worker 2const CACHE_NAME = 'ff-pwa-palo2-1789823826731'; 3 4// Install event - activate worker immediately 5self.addEventListener('install', (event) => { 6 self.skipWaiting(); 7}); 8 9// Activate event - clean up stale caches 10self.addEventListener('activate', (event) => { 11 event.waitUntil( 12 caches.keys().then((cacheNames) => { 13 return Promise.all( 14 cacheNames 15 .filter((name) => name.startsWith('ff-pwa-cache-') && name !== CACHE_NAME) 16 .map((name) => caches.delete(name)) 17 ); 18 }).then(() => self.clients.claim()) 19 ); 20}); 21 22// Fetch event - cache-first with network fallback for static assets, network-first for navigation 23self.addEventListener('fetch', (event) => { 24 const request = event.request; 25 26 // Only handle GET requests and http/https schemes 27 if (request.method !== 'GET') return; 28 if (!request.url.startsWith('http://') && !request.url.startsWith('https://')) return; 29 30 // Audio / video range requests or special endpoints pass directly to network 31 if (request.headers.get('range')) return; 32 33 event.respondWith( 34 caches.open(CACHE_NAME).then(async (cache) => { 35 const cachedResponse = await cache.match(request); 36 if (cachedResponse) { 37 // Fetch in background to update cache (stale-while-revalidate) 38 fetch(request) 39 .then((networkResponse) => { 40 if (networkResponse && networkResponse.status === 200 && networkResponse.type === 'basic') { 41 cache.put(request, networkResponse.clone()); 42 } 43 }) 44 .catch(() => { /* ignore offline / network errors in background update */ }); 45 return cachedResponse; 46 } 47 48 // If not in cache, fetch from network and cache 49 return fetch(request) 50 .then((networkResponse) => { 51 if (networkResponse && networkResponse.status === 200 && networkResponse.type === 'basic') { 52 cache.put(request, networkResponse.clone()); 53 } 54 return networkResponse; 55 }) 56 .catch(() => { 57 // If offline and requesting html navigation, fallback to root index 58 if (request.mode === 'navigate') { 59 return cache.match('./index.html') || cache.match('./'); 60 } 61 }); 62 }) 63 ); 64});
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.