MediBot / public /sw.js
github-actions[bot]
Deploy MedOS Global from ef736eb7
cb6a2d8
/**
* MedOS Global - Service Worker
* Provides offline support via caching strategies:
* 1. App Shell: cache-first (HTML, CSS, JS)
* 2. API calls: network-first, fallback to cached FAQ
* 3. Static assets: cache-first
*/
const CACHE_NAME = 'medos-v1';
const APP_SHELL_CACHE = 'medos-shell-v1';
const FAQ_CACHE = 'medos-faq-v1';
const APP_SHELL_URLS = [
'/',
'/manifest.json',
];
// Install: cache app shell
self.addEventListener('install', (event) => {
event.waitUntil(
caches.open(APP_SHELL_CACHE).then((cache) => {
return cache.addAll(APP_SHELL_URLS);
})
);
self.skipWaiting();
});
// Activate: clean old caches
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then((cacheNames) => {
return Promise.all(
cacheNames
.filter(
(name) =>
name !== APP_SHELL_CACHE &&
name !== FAQ_CACHE &&
name !== CACHE_NAME
)
.map((name) => caches.delete(name))
);
})
);
self.clients.claim();
});
// Fetch: network-first for API, cache-first for static
self.addEventListener('fetch', (event) => {
const { request } = event;
const url = new URL(request.url);
// API calls: network-first
if (url.pathname.startsWith('/api/')) {
event.respondWith(
fetch(request)
.then((response) => {
// Cache successful GET responses
if (request.method === 'GET' && response.ok) {
const cloned = response.clone();
caches.open(CACHE_NAME).then((cache) => cache.put(request, cloned));
}
return response;
})
.catch(() => {
// Return cached version if network fails
return caches.match(request).then((cached) => {
if (cached) return cached;
return new Response(
JSON.stringify({
error: 'offline',
message: 'You are currently offline. Please try again when connected.',
}),
{
status: 503,
headers: { 'Content-Type': 'application/json' },
}
);
});
})
);
return;
}
// Static assets: cache-first
event.respondWith(
caches.match(request).then((cached) => {
if (cached) return cached;
return fetch(request).then((response) => {
if (response.ok && request.method === 'GET') {
const cloned = response.clone();
caches.open(CACHE_NAME).then((cache) => cache.put(request, cloned));
}
return response;
});
})
);
});