67 lines
2.3 KiB
JavaScript
67 lines
2.3 KiB
JavaScript
const CACHE = 'stackchain-dashboard-shell-v7';
|
|
const OUTAGE_STATUSES = new Set([500, 502, 503, 504]);
|
|
const BASE = new URL('./', self.location.href).pathname;
|
|
const SHELL = [
|
|
BASE,
|
|
BASE + 'manifest.webmanifest',
|
|
BASE + 'static/icons/stackchain-192.png',
|
|
BASE + 'static/icons/stackchain-512.png',
|
|
BASE + 'static/markdown.js',
|
|
BASE + 'static/commands.js',
|
|
BASE + 'static/search-preview.js',
|
|
BASE + 'static/widgets.js',
|
|
BASE + 'static/drafts.js',
|
|
BASE + 'static/issue-outbox.js',
|
|
BASE + 'static/authored-outbox.js',
|
|
BASE + 'static/offline-work.js',
|
|
BASE + 'static/my-work.js',
|
|
BASE + 'static/pick-work.js',
|
|
BASE + 'static/conversation.js',
|
|
BASE + 'static/issue-sheet.js',
|
|
BASE + 'static/create-issue-sheet.js',
|
|
BASE + 'static/pull-sheet.js',
|
|
BASE + 'static/review-sheet.js',
|
|
BASE + 'static/work-route.js',
|
|
BASE + 'static/context-poller.js',
|
|
BASE + 'static/mobile-task-dock.js',
|
|
];
|
|
|
|
self.addEventListener('install', event => {
|
|
event.waitUntil(caches.open(CACHE).then(cache => cache.addAll(SHELL)).then(() => self.skipWaiting()));
|
|
});
|
|
|
|
self.addEventListener('activate', event => {
|
|
event.waitUntil(caches.keys().then(keys => Promise.all(
|
|
keys.filter(key => key.startsWith('stackchain-dashboard-') && key !== CACHE)
|
|
.map(key => caches.delete(key))
|
|
)).then(() => self.clients.claim()));
|
|
});
|
|
|
|
self.addEventListener('fetch', event => {
|
|
const request = event.request;
|
|
if (request.method !== 'GET' || request.url.includes('/api/')) return;
|
|
const url = new URL(request.url);
|
|
if (url.origin !== self.location.origin || !url.pathname.startsWith(BASE)) return;
|
|
if (request.mode === 'navigate') {
|
|
event.respondWith(
|
|
fetch(request).then(async response => {
|
|
const cache = await caches.open(CACHE);
|
|
if (response.ok) {
|
|
await cache.put(BASE, response.clone());
|
|
} else if (OUTAGE_STATUSES.has(response.status)) {
|
|
const cached = await cache.match(BASE);
|
|
if (cached) return cached;
|
|
}
|
|
return response;
|
|
}).catch(async () => {
|
|
const cache = await caches.open(CACHE);
|
|
return cache.match(BASE);
|
|
})
|
|
);
|
|
return;
|
|
}
|
|
if (url.origin === self.location.origin && SHELL.includes(url.pathname)) {
|
|
event.respondWith(caches.match(request).then(cached => cached || fetch(request)));
|
|
}
|
|
});
|