Files
hack/tools/scripts/llm-key-hunter/results/_cache/content/carlosgalera-a11y_filehub2026-pages.json
T

1 line
11 KiB
JSON

{"repo": "carlosgalera-a11y/filehub2026-pages", "files": {"sw.js": {"2ad5507c93a40e3a1b0e99eae7ac146161b24c00": {"t": 1785746021.0257807, "n": 5070, "h": "6c34fbe9305a1d73", "c": "/**\n * FileHub Service Worker v30\n * Network-first for HTML (always fresh in PWA)\n * Cache-first for hashed assets only\n *\n * Soporta TANTO root (arditifilehub.com/) COMO subpath\n * (carlosgalera-a11y.github.io/filehub2026-pages/) derivando la base\n * automáticamente desde el scope del SW.\n */\n\nconst CACHE_VERSION = 'filehub-v261';\nconst STATIC_CACHE = `${CACHE_VERSION}-static`;\n\n// Deriva la base del scope del SW. Ej:\n// scope https://arditifilehub.com/ → SW_BASE = '/'\n// scope https://x.github.io/filehub2026-pages/ → SW_BASE = '/filehub2026-pages/'\nconst SW_BASE = new URL(self.registration?.scope || self.location.href).pathname;\nconst OFFLINE_PAGE = SW_BASE + 'index.html';\n\nconst PRECACHE_URLS = [\n SW_BASE,\n SW_BASE + 'index.html',\n SW_BASE + 'manifest.json',\n SW_BASE + 'icon.svg',\n SW_BASE + 'icon-maskable.svg',\n SW_BASE + 'apple-touch-icon.png',\n SW_BASE + 'icon-192.png',\n SW_BASE + 'icon-512.png',\n SW_BASE + 'icon-maskable-512.png',\n];\n\nconst NO_CACHE = [\n 'supabase.co','api.anthropic.com','api.deepseek.com','api.groq.com',\n 'openrouter.ai','railway.app','corsproxy.io','allorigins.win',\n 'api.moonshot.cn','wttr.in','calendar.google.com',\n];\n\nself.addEventListener('install', event => {\n // Sin skipWaiting() automático: el SW nuevo espera a que el usuario toque\n // el banner «versión nueva» (mensaje SKIP_WAITING) — así nunca recargamos\n // la app en mitad de una grabación o un formulario.\n event.waitUntil(\n caches.open(STATIC_CACHE).then(c => c.addAll(PRECACHE_URLS).catch(() => {}))\n );\n});\n\nself.addEventListener('activate', event => {\n event.waitUntil(\n caches.keys().then(keys =>\n Promise.all(keys.filter(k => !k.startsWith(CACHE_VERSION)).map(k => caches.delete(k)))\n ).then(() => self.clients.claim())\n );\n});\n\nself.addEventListener('fetch', event => {\n const req = event.request;\n const url = new URL(req.url);\n if (req.method !== 'GET' || !url.protocol.startsWith('http')) return;\n if (NO_CACHE.some(p => url.hostname.includes(p))) return;\n\n // Hashed bundles → cache first\n if (url.pathname.includes('/assets/') && /\\.(js|css)$/.test(url.pathname)) {\n event.respondWith(\n caches.match(req).then(c => c || fetch(req).then(r => {\n if (r.ok) { const cl = r.clone(); caches.open(STATIC_CACHE).then(ca => ca.put(req, cl)); }\n return r;\n })).catch(() => caches.match(OFFLINE_PAGE))\n );\n return;\n }\n\n // All other (HTML, nav) → network first\n event.respondWith(\n fetch(req).then(r => {\n if (r.ok) { const cl = r.clone(); caches.open(STATIC_CACHE).then(ca => ca.put(req, cl)); }\n return r;\n }).catch(() => caches.match(req).then(c => c || caches.match(OFFLINE_PAGE)))\n );\n});\n\nself.addEventListener('message', event => {\n if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\n});\n\n// ─── PUSH NOTIFICATIONS ──────────────────────────────────────────────\n// Recibe push del server (NucBox o Cloudflare Worker con VAPID) o\n// local notifications via reg.showNotification().\nself.addEventListener('push', event => {\n let payload = { title: 'FileHub', body: 'Nueva notificación', url: '/' };\n try {\n if (event.data) {\n const text = event.data.text();\n try { payload = { ...payload, ...JSON.parse(text) }; }\n catch { payload.body = text; }\n }\n } catch (err) {\n console.warn('[sw] push payload parse:', err);\n }\n\n const { title, body, url, tag, icon, badge, data, ...rest } = payload;\n // Una notificación de LLAMADA (tag \"call-…\") se trata distinto: se queda FIJA\n // en pantalla (requireInteraction), vibra en patrón de timbre y se re-anuncia\n // si vuelve a llegar. Es lo máximo que iOS deja hacer a una PWA (no hay\n // pantalla de llamada tipo teléfono para web).\n const isCall = typeof tag === 'string' && tag.startsWith('call-');\n event.waitUntil(\n self.registration.showNotification(title || 'FileHub', {\n body: body || '',\n icon: icon || 'https://img.icons8.com/ios-filled/512/4f46e5/lightning-bolt.png',\n badge: badge || 'https://img.icons8.com/ios-filled/512/4f46e5/lightning-bolt.png',\n tag: tag || 'filehub-notif',\n data: { url: url || '/', ...(data || {}) },\n requireInteraction: isCall,\n renotify: isCall,\n vibrate: isCall ? [300, 150, 300, 150, 300] : undefined,\n ...rest,\n })\n );\n});\n\n// Al hacer click en la notification, abre la URL guardada en data.url\nself.addEventListener('notificationclick', event => {\n event.notification.close();\n const target = event.notification.data?.url || SW_BASE;\n event.waitUntil(\n self.clients.matchAll({ type: 'window', includeUncontrolled: true }).then(clients => {\n // Si ya hay una ventana abierta de la app, foco + navega\n for (const c of clients) {\n if ((c.url.includes('filehub2026') || c.url.includes('arditifilehub.com')) && 'focus' in c) {\n c.focus();\n if ('navigate' in c) c.navigate(target);\n return;\n }\n }\n // Si no, abre nueva\n if (self.clients.openWindow) return self.clients.openWindow(target);\n })\n );\n});\n"}, "b0f1832b223262fb6ca2d5e1b1e478e7809d3f21": {"t": 1785758861.5395894, "n": 5070, "h": "d931b3ff17ad10e3", "c": "/**\n * FileHub Service Worker v30\n * Network-first for HTML (always fresh in PWA)\n * Cache-first for hashed assets only\n *\n * Soporta TANTO root (arditifilehub.com/) COMO subpath\n * (carlosgalera-a11y.github.io/filehub2026-pages/) derivando la base\n * automáticamente desde el scope del SW.\n */\n\nconst CACHE_VERSION = 'filehub-v262';\nconst STATIC_CACHE = `${CACHE_VERSION}-static`;\n\n// Deriva la base del scope del SW. Ej:\n// scope https://arditifilehub.com/ → SW_BASE = '/'\n// scope https://x.github.io/filehub2026-pages/ → SW_BASE = '/filehub2026-pages/'\nconst SW_BASE = new URL(self.registration?.scope || self.location.href).pathname;\nconst OFFLINE_PAGE = SW_BASE + 'index.html';\n\nconst PRECACHE_URLS = [\n SW_BASE,\n SW_BASE + 'index.html',\n SW_BASE + 'manifest.json',\n SW_BASE + 'icon.svg',\n SW_BASE + 'icon-maskable.svg',\n SW_BASE + 'apple-touch-icon.png',\n SW_BASE + 'icon-192.png',\n SW_BASE + 'icon-512.png',\n SW_BASE + 'icon-maskable-512.png',\n];\n\nconst NO_CACHE = [\n 'supabase.co','api.anthropic.com','api.deepseek.com','api.groq.com',\n 'openrouter.ai','railway.app','corsproxy.io','allorigins.win',\n 'api.moonshot.cn','wttr.in','calendar.google.com',\n];\n\nself.addEventListener('install', event => {\n // Sin skipWaiting() automático: el SW nuevo espera a que el usuario toque\n // el banner «versión nueva» (mensaje SKIP_WAITING) — así nunca recargamos\n // la app en mitad de una grabación o un formulario.\n event.waitUntil(\n caches.open(STATIC_CACHE).then(c => c.addAll(PRECACHE_URLS).catch(() => {}))\n );\n});\n\nself.addEventListener('activate', event => {\n event.waitUntil(\n caches.keys().then(keys =>\n Promise.all(keys.filter(k => !k.startsWith(CACHE_VERSION)).map(k => caches.delete(k)))\n ).then(() => self.clients.claim())\n );\n});\n\nself.addEventListener('fetch', event => {\n const req = event.request;\n const url = new URL(req.url);\n if (req.method !== 'GET' || !url.protocol.startsWith('http')) return;\n if (NO_CACHE.some(p => url.hostname.includes(p))) return;\n\n // Hashed bundles → cache first\n if (url.pathname.includes('/assets/') && /\\.(js|css)$/.test(url.pathname)) {\n event.respondWith(\n caches.match(req).then(c => c || fetch(req).then(r => {\n if (r.ok) { const cl = r.clone(); caches.open(STATIC_CACHE).then(ca => ca.put(req, cl)); }\n return r;\n })).catch(() => caches.match(OFFLINE_PAGE))\n );\n return;\n }\n\n // All other (HTML, nav) → network first\n event.respondWith(\n fetch(req).then(r => {\n if (r.ok) { const cl = r.clone(); caches.open(STATIC_CACHE).then(ca => ca.put(req, cl)); }\n return r;\n }).catch(() => caches.match(req).then(c => c || caches.match(OFFLINE_PAGE)))\n );\n});\n\nself.addEventListener('message', event => {\n if (event.data?.type === 'SKIP_WAITING') self.skipWaiting();\n});\n\n// ─── PUSH NOTIFICATIONS ──────────────────────────────────────────────\n// Recibe push del server (NucBox o Cloudflare Worker con VAPID) o\n// local notifications via reg.showNotification().\nself.addEventListener('push', event => {\n let payload = { title: 'FileHub', body: 'Nueva notificación', url: '/' };\n try {\n if (event.data) {\n const text = event.data.text();\n try { payload = { ...payload, ...JSON.parse(text) }; }\n catch { payload.body = text; }\n }\n } catch (err) {\n console.warn('[sw] push payload parse:', err);\n }\n\n const { title, body, url, tag, icon, badge, data, ...rest } = payload;\n // Una notificación de LLAMADA (tag \"call-…\") se trata distinto: se queda FIJA\n // en pantalla (requireInteraction), vibra en patrón de timbre y se re-anuncia\n // si vuelve a llegar. Es lo máximo que iOS deja hacer a una PWA (no hay\n // pantalla de llamada tipo teléfono para web).\n const isCall = typeof tag === 'string' && tag.startsWith('call-');\n event.waitUntil(\n self.registration.showNotification(title || 'FileHub', {\n body: body || '',\n icon: icon || 'https://img.icons8.com/ios-filled/512/4f46e5/lightning-bolt.png',\n badge: badge || 'https://img.icons8.com/ios-filled/512/4f46e5/lightning-bolt.png',\n tag: tag || 'filehub-notif',\n data: { url: url || '/', ...(data || {}) },\n requireInteraction: isCall,\n renotify: isCall,\n vibrate: isCall ? [300, 150, 300, 150, 300] : undefined,\n ...rest,\n })\n );\n});\n\n// Al hacer click en la notification, abre la URL guardada en data.url\nself.addEventListener('notificationclick', event => {\n event.notification.close();\n const target = event.notification.data?.url || SW_BASE;\n event.waitUntil(\n self.clients.matchAll({ type: 'window', includeUncontrolled: true }).then(clients => {\n // Si ya hay una ventana abierta de la app, foco + navega\n for (const c of clients) {\n if ((c.url.includes('filehub2026') || c.url.includes('arditifilehub.com')) && 'focus' in c) {\n c.focus();\n if ('navigate' in c) c.navigate(target);\n return;\n }\n }\n // Si no, abre nueva\n if (self.clients.openWindow) return self.clients.openWindow(target);\n })\n );\n});\n"}}}}