1const WASM_CACHE = 'playsvideo-wasm-v1'; 2 3self.addEventListener('install', () => { 4 self.skipWaiting(); 5}); 6 7self.addEventListener('activate', (event) => { 8 event.waitUntil( 9 caches.keys().then((keys) => 10 Promise.all( 11 keys.filter((k) => k !== WASM_CACHE && k !== 'playsvideo-shared').map((k) => caches.delete(k)) 12 ) 13 ) 14 ); 15 self.clients.claim(); 16}); 17 18self.addEventListener('fetch', (event) => { 19 const url = new URL(event.request.url); 20 21 // Handle share target POST (Android share sheet) 22 if (url.pathname === '/player/share-target' && event.request.method === 'POST') { 23 event.respondWith(handleShareTarget(event.request)); 24 return; 25 } 26 27 // Only handle GET requests for same-origin resources 28 if (event.request.method !== 'GET') return; 29 if (url.origin !== self.location.origin) return; 30 31 // Cache-first only for .wasm files; everything else goes to network 32 if (url.pathname.endsWith('.wasm')) { 33 event.respondWith( 34 caches.open(WASM_CACHE).then((cache) => 35 cache.match(event.request).then((cached) => 36 cached || fetch(event.request).then((resp) => { 37 cache.put(event.request, resp.clone()); 38 return resp; 39 }) 40 ) 41 ) 42 ); 43 } 44}); 45 46async function handleShareTarget(request) { 47 const formData = await request.formData(); 48 const videoFile = formData.get('video'); 49 50 if (videoFile) { 51 // Stash the shared file so the client page can pick it up 52 const cache = await caches.open('playsvideo-shared'); 53 await cache.put('/shared-video-file', new Response(videoFile)); 54 } 55 56 return Response.redirect('/player?source=share', 303); 57}
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.