// Service Worker — generado automaticamente // Estrategia: cache-first para assets, network-first para API const CACHE_NAME = 'voice-guide-v1'; const PRECACHE_URLS = [ '/', '/index.html', '/manifest.json', ]; const NETWORK_FIRST_PATTERNS = [ '/api/', ]; // ── install ────────────────────────────────────────────────────────────────── // Pre-cachea los assets estaticos esenciales al instalar el SW. self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME).then((cache) => { return cache.addAll(PRECACHE_URLS); }) ); self.skipWaiting(); }); // ── activate ───────────────────────────────────────────────────────────────── // Limpia caches de versiones anteriores al activar la nueva version del SW. self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames .filter((name) => name !== CACHE_NAME) .map((name) => caches.delete(name)) ); }) ); self.clients.claim(); }); // ── fetch ───────────────────────────────────────────────────────────────────── // Intercepta peticiones: // - URLs que coinciden con NETWORK_FIRST_PATTERNS → network-first con fallback a cache // - El resto → cache-first con fallback a network (y guarda en cache la respuesta) self.addEventListener('fetch', (event) => { const url = event.request.url; const isNetworkFirst = url.includes('/api/'); if (isNetworkFirst) { // Network-first: intenta red, si falla usa cache event.respondWith( fetch(event.request) .then((response) => { if (response && response.status === 200) { const responseClone = response.clone(); caches.open(CACHE_NAME).then((cache) => { cache.put(event.request, responseClone); }); } return response; }) .catch(() => caches.match(event.request)) ); } else { // Cache-first: sirve desde cache, si no existe va a red y guarda en cache event.respondWith( caches.match(event.request).then((cached) => { if (cached) { return cached; } return fetch(event.request).then((response) => { if (response && response.status === 200) { const responseClone = response.clone(); caches.open(CACHE_NAME).then((cache) => { cache.put(event.request, responseClone); }); } return response; }); }) ); } });