Spaces:
Paused
Paused
| // IronGuard Service Worker - Offline First Strategy | |
| const CACHE_NAME = 'ironguard-v1.0.0'; | |
| const urlsToCache = [ | |
| '/', | |
| '/static/css/style.css', | |
| '/static/js/main.js', | |
| '/manifest.json' | |
| ]; | |
| // Install event - cache resources | |
| self.addEventListener('install', (event) => { | |
| event.waitUntil( | |
| caches.open(CACHE_NAME) | |
| .then((cache) => { | |
| console.log('📦 Caching app shell'); | |
| return cache.addAll(urlsToCache); | |
| }) | |
| ); | |
| self.skipWaiting(); | |
| }); | |
| // Fetch event - serve from cache, fallback to network | |
| self.addEventListener('fetch', (event) => { | |
| event.respondWith( | |
| caches.match(event.request) | |
| .then((response) => { | |
| // Cache hit - return response | |
| if (response) { | |
| return response; | |
| } | |
| // Clone request | |
| const fetchRequest = event.request.clone(); | |
| return fetch(fetchRequest).then((response) => { | |
| // Check if valid response | |
| if (!response || response.status !== 200 || response.type !== 'basic') { | |
| return response; | |
| } | |
| // Clone response | |
| const responseToCache = response.clone(); | |
| caches.open(CACHE_NAME) | |
| .then((cache) => { | |
| cache.put(event.request, responseToCache); | |
| }); | |
| return response; | |
| }); | |
| }) | |
| ); | |
| }); | |
| // Activate event - clean old caches | |
| self.addEventListener('activate', (event) => { | |
| event.waitUntil( | |
| caches.keys().then((cacheNames) => { | |
| return Promise.all( | |
| cacheNames.map((cacheName) => { | |
| if (cacheName !== CACHE_NAME) { | |
| console.log('🗑️ Deleting old cache:', cacheName); | |
| return caches.delete(cacheName); | |
| } | |
| }) | |
| ); | |
| }) | |
| ); | |
| self.clients.claim(); | |
| }); | |