// Nombre del caché para la aplicación const CACHE_NAME = 'radius-nucleo-cache-v3'; // Archivos que se almacenarán en caché durante la instalación const URLS_TO_CACHE = [ '/', '/index.html', '/manifest.json', '/sw.js', // Iconos '/icons/icon-192.png', '/icons/icon-512.png', '/icons/icon-192-maskable.png', '/icons/icon-512-maskable.png', '/icons/icon-192-black.png', '/icons/icon-512-black.png', // Capturas de pantalla '/screenshots/screenshot-desktop.png', '/screenshots/screenshot-mobile.png' ]; // Evento de instalación: almacena los archivos definidos en la caché self.addEventListener('install', (event) => { event.waitUntil( caches.open(CACHE_NAME) .then((cache) => cache.addAll(URLS_TO_CACHE)) ); }); // Evento de activación: limpia los caches antiguos self.addEventListener('activate', (event) => { event.waitUntil( caches.keys().then((cacheNames) => { return Promise.all( cacheNames.map((cacheName) => { if (cacheName !== CACHE_NAME) { return caches.delete(cacheName); } }) ); }) ); }); // Evento de recuperación (fetch): estrategia inteligente según el tipo de recurso self.addEventListener('fetch', (event) => { const url = new URL(event.request.url); // Excluir las peticiones a /api/* del Service Worker // Estas peticiones requieren autenticación y no deben ser cacheadas if (url.pathname.startsWith('/api/')) { return; } // Para archivos de build (JS/CSS en /assets/): Network-first con cache fallback // Esto asegura que siempre se intente obtener la versión más reciente if (url.pathname.startsWith('/assets/')) { event.respondWith( fetch(event.request) .then((response) => { // Guardar en cache la nueva versión const responseClone = response.clone(); caches.open(CACHE_NAME).then((cache) => { cache.put(event.request, responseClone); }); return response; }) .catch(() => { // Si falla la red, usar cache return caches.match(event.request); }) ); return; } // Para HTML: Network-first siempre if (url.pathname.endsWith('.html') || url.pathname === '/') { event.respondWith( fetch(event.request) .catch(() => { // Solo si falla la red, usar cache return caches.match(event.request); }) ); return; } // Para recursos estáticos (iconos, manifest, etc.): Cache-first // Estos archivos rara vez cambian event.respondWith( caches.match(event.request) .then((response) => { if (response) { return response; } return fetch(event.request).then((response) => { // Guardar en cache si es exitoso if (response.status === 200) { const responseClone = response.clone(); caches.open(CACHE_NAME).then((cache) => { cache.put(event.request, responseClone); }); } return response; }); }) ); });