Files
lidify/frontend/public/sw.js
2025-12-25 18:58:06 -06:00

91 lines
2.3 KiB
JavaScript

// Lidify Service Worker
const CACHE_NAME = 'lidify-v1';
// Assets to cache on install (app shell)
const PRECACHE_ASSETS = [
'/',
'/manifest.webmanifest',
'/assets/images/LIDIFY.webp',
];
// Install event - cache app shell
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(CACHE_NAME).then((cache) => {
return cache.addAll(PRECACHE_ASSETS);
})
);
// Take control immediately
self.skipWaiting();
});
// Activate event - clean up old caches
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames
.filter((name) => name !== CACHE_NAME)
.map((name) => caches.delete(name))
);
})
);
// Take control of all clients immediately
self.clients.claim();
});
// Fetch event - network first, fallback to cache
self.addEventListener('fetch', (event) => {
const { request } = event;
const url = new URL(request.url);
// Skip non-GET requests
if (request.method !== 'GET') return;
// Skip non-http(s) URLs (chrome-extension://, etc.)
if (!url.protocol.startsWith('http')) return;
// Skip API requests - always go to network
if (url.pathname.startsWith('/api/')) return;
// Skip streaming endpoints
if (url.pathname.includes('/stream')) return;
// Skip Next.js image optimization endpoint
if (url.pathname.startsWith('/_next/image')) return;
// For everything else, try network first, then cache
event.respondWith(
fetch(request)
.then((response) => {
// Clone the response before caching
const responseClone = response.clone();
// Cache successful responses
if (response.status === 200) {
caches.open(CACHE_NAME).then((cache) => {
cache.put(request, responseClone);
});
}
return response;
})
.catch(() => {
// Network failed, try cache
return caches.match(request).then((cachedResponse) => {
if (cachedResponse) {
return cachedResponse;
}
// Return a fallback for navigation requests
if (request.mode === 'navigate') {
return caches.match('/');
}
return new Response('Offline', { status: 503 });
});
})
);
});