mirror of
https://github.com/MadeBaruna/paimon-moe.git
synced 2024-11-25 00:09:33 +01:00
Add service worker
This commit is contained in:
parent
1cd1e40c77
commit
00f8b192af
2 changed files with 96 additions and 1 deletions
|
@ -30,9 +30,14 @@
|
|||
|
||||
startClient();
|
||||
|
||||
page.subscribe(() => {
|
||||
let broadcastChannel;
|
||||
page.subscribe((p) => {
|
||||
try {
|
||||
window.reloadAdSlots();
|
||||
broadcastChannel.postMessage({
|
||||
type: 'fetch-doc',
|
||||
path: p.url.pathname,
|
||||
});
|
||||
} catch (error) {}
|
||||
});
|
||||
|
||||
|
@ -46,6 +51,24 @@
|
|||
});
|
||||
window.localforage = localforage;
|
||||
await checkLocalSave();
|
||||
|
||||
if ('serviceWorker' in navigator) {
|
||||
broadcastChannel = new BroadcastChannel('paimonmoe-sw');
|
||||
broadcastChannel.addEventListener('message', (event) => {
|
||||
if (event.data.type === 'update') window.location.reload();
|
||||
});
|
||||
|
||||
navigator.serviceWorker.register('/service-worker.js').then(
|
||||
function () {
|
||||
console.log('service worker registration succeeded');
|
||||
},
|
||||
function (error) {
|
||||
console.log('service worker registration failed:', error);
|
||||
},
|
||||
);
|
||||
} else {
|
||||
console.log('service workers are not supported');
|
||||
}
|
||||
});
|
||||
|
||||
$: segment = $page.url.pathname.substring(1).split('/')[0];
|
||||
|
|
72
src/service-worker.js
Normal file
72
src/service-worker.js
Normal file
|
@ -0,0 +1,72 @@
|
|||
import { version } from '$service-worker';
|
||||
|
||||
const CACHE = `cache${version}`;
|
||||
const channel = new BroadcastChannel('paimonmoe-sw');
|
||||
|
||||
self.addEventListener('install', (event) => {
|
||||
event.waitUntil(self.skipWaiting());
|
||||
});
|
||||
|
||||
async function fetchAddCache(url) {
|
||||
try {
|
||||
const cache = await caches.open(CACHE);
|
||||
const cachedRes = await cache.match(url);
|
||||
|
||||
if (cachedRes) return;
|
||||
|
||||
const res = await fetch(url);
|
||||
cache.put(url, res.clone());
|
||||
} catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
|
||||
self.addEventListener('activate', (event) => {
|
||||
event.waitUntil(
|
||||
caches.keys().then(async (keys) => {
|
||||
let needUpdate = false;
|
||||
// delete old caches
|
||||
for (const key of keys) {
|
||||
if (key !== CACHE) {
|
||||
await caches.delete(key);
|
||||
needUpdate = true;
|
||||
}
|
||||
}
|
||||
|
||||
self.clients.claim();
|
||||
console.log('SW NEED UPDATE', needUpdate);
|
||||
if (needUpdate) {
|
||||
channel.postMessage({
|
||||
type: 'update',
|
||||
version,
|
||||
});
|
||||
}
|
||||
|
||||
fetchAddCache('/');
|
||||
channel.addEventListener('message', (event) => {
|
||||
if (event.data.type === 'fetch-doc') {
|
||||
fetchAddCache(event.data.path);
|
||||
}
|
||||
});
|
||||
}),
|
||||
);
|
||||
});
|
||||
|
||||
self.addEventListener('fetch', async (event) => {
|
||||
if (!event.request.url.startsWith(self.location.origin) || event.request.method !== 'GET') return;
|
||||
|
||||
event.respondWith(
|
||||
(async () => {
|
||||
const cache = await caches.open(CACHE);
|
||||
const cachedRes = await cache.match(event.request);
|
||||
|
||||
if (cachedRes) {
|
||||
return cachedRes;
|
||||
}
|
||||
|
||||
const res = await fetch(event.request);
|
||||
cache.put(event.request, res.clone());
|
||||
return res;
|
||||
})(),
|
||||
);
|
||||
});
|
Loading…
Reference in a new issue