1const BACKUP_HOSTNAME = "www.candyai.com"; 2const DELAY_BEFORE_SECOND_MAIN_ATTEMPT = 500; 3 4self.addEventListener('install', event => { 5 self.skipWaiting(); 6}); 7 8self.addEventListener('activate', event => { 9 event.waitUntil(self.clients.claim()); 10}); 11 12self.addEventListener('fetch', event => { 13 if (event.request.mode === 'navigate') { 14 event.respondWith(handleNavigationRequest(event.request)); 15 } 16}); 17 18async function handleNavigationRequest(request) { 19 // --- First Main Attempt --- 20 try { 21 // Return any response from the main domain (even if non-OK). 22 console.log('[ServiceWorker] First main fetch attempt for:', request.url); 23 return await fetch(request); 24 } catch (error) { 25 console.error('[ServiceWorker] First main fetch error for:', request.url, error); 26 } 27 28 // --- Check Secondary Domain --- 29 let backupUrl; 30 let backupCheckSuccessful = false; 31 try { 32 backupUrl = new URL(request.url); 33 backupUrl.protocol = 'https:'; // Force HTTPS. 34 backupUrl.hostname = BACKUP_HOSTNAME; // Use the backup domain. 35 backupUrl.port = ''; // Remove any port. 36 console.log('[ServiceWorker] Checking secondary domain (HEAD, no-cors):', backupUrl.toString()); 37 await fetch(backupUrl.toString(), { method: 'HEAD', mode: 'no-cors' }); 38 backupCheckSuccessful = true; 39 console.log('[ServiceWorker] Secondary domain check successful.'); 40 } catch (error) { 41 console.error('[ServiceWorker] Secondary domain check failed for:', backupUrl?.toString(), error); 42 } 43 44 // --- Delay Before Second Main Attempt --- 45 await new Promise(resolve => setTimeout(resolve, DELAY_BEFORE_SECOND_MAIN_ATTEMPT)); 46 47 // --- Second Main Attempt --- 48 try { 49 console.log('[ServiceWorker] Second main fetch attempt for:', request.url); 50 return await fetch(request); 51 } catch (error) { 52 console.error('[ServiceWorker] Second main fetch error for:', request.url, error); 53 } 54 55 // --- Decide on Redirect or Fail --- 56 if (backupCheckSuccessful) { 57 console.log('[ServiceWorker] Both main attempts failed; redirecting to secondary domain:', backupUrl.toString()); 58 return Response.redirect(backupUrl.toString(), 302); 59 } 60 61 console.error('[ServiceWorker] Navigation fetch failed for:', request.url); 62 throw new Error('Navigation fetch failed'); 63}
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.