posimai-root/posimai-sc/sw.js

60 lines
1.4 KiB
JavaScript
Raw Normal View History

// posimai-sc SW — same-origin の静的資産のみキャッシュCDN は対象外)
const CACHE = 'posimai-sc-v5';
const STATIC = [
'/',
'/index.html',
'/manifest.json',
'/logo.png',
'/js/app.js',
'/js/data/drills.js',
'/js/data/categories.js'
];
self.addEventListener('install', e => {
e.waitUntil(
Promise.all([
caches.open(CACHE).then(c =>
c.addAll(
STATIC.filter(u => {
try {
new URL(u, self.location.origin);
return true;
} catch {
return false;
}
})
)
),
self.skipWaiting()
])
);
});
self.addEventListener('activate', e => {
e.waitUntil(
caches
.keys()
.then(keys => Promise.all(keys.filter(k => k !== CACHE).map(k => caches.delete(k))))
.then(() => self.clients.claim())
);
});
self.addEventListener('fetch', e => {
if (e.request.method !== 'GET') return;
if (!e.request.url.startsWith(self.location.origin)) return;
e.respondWith(
caches.open(CACHE).then(cache =>
cache.match(e.request).then(cached => {
const network = fetch(e.request)
.then(res => {
if (res.ok && res.type === 'basic') cache.put(e.request, res.clone());
return res;
})
.catch(() => cached || new Response('Offline', { status: 503, statusText: 'Service Unavailable' }));
return cached || network;
})
)
);
});