PageSourceSearch

https://candy.ai/service-worker.js

js candy.ai collected 2026-09-26 02:59:36 UTC 2,303 bytes, 63 lines download raw bytes

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.