diff --git a/public/service-worker.js b/public/sw-full.js similarity index 95% rename from public/service-worker.js rename to public/sw-full.js index 0f24862..7c0bc02 100644 --- a/public/service-worker.js +++ b/public/sw-full.js @@ -1,5 +1,5 @@ const cacheVersion = '1.5'; -const cacheName = `minexlauncher-v${cacheVersion}`; +const cacheName = `minexlauncher-full-v${cacheVersion}`; self.addEventListener('install', (event) => { event.waitUntil( diff --git a/public/sw.js b/public/sw.js new file mode 100644 index 0000000..a3e4109 --- /dev/null +++ b/public/sw.js @@ -0,0 +1,73 @@ +const cacheVersion = '1.5'; +const cacheName = `minexlauncher-v${cacheVersion}`; +const offlineUrl = '/offline.html'; +const cacheAssets = [ + offlineUrl, + '/resources/images/icons/favicon.webp', + '/resources/scripts/google-tag.js', + '/resources/scripts/main.js', + '/resources/styles/mobile.css', + '/resources/styles/themes/default.css', + '/resources/styles/themes/light.css', + '/resources/styles/themes/hyperdark.css', + '/resources/styles/themes/overworld.css', + '/resources/styles/themes/nether.css', + '/resources/styles/themes/the-end.css', + '/resources/styles/themes/cherry-blossom.css', + '/resources/styles/themes/retro.css', + '/resources/styles/themes/starfall.css', + '/resources/styles/themes/campfire.css', + '/resources/images/backgrounds/themes/overworld.webp', + '/resources/images/backgrounds/themes/nether.webp', + '/resources/images/backgrounds/themes/the-end.webp', + '/resources/images/backgrounds/themes/cherry-blossom.webp', + '/resources/images/backgrounds/themes/retro.webp', + '/resources/images/backgrounds/themes/starfall.webp', + '/resources/images/backgrounds/themes/campfire.webp', +]; + +self.addEventListener('install', (event) => { + event.waitUntil( + caches.open(cacheName).then(async (cache) => { + const totalAssets = cacheAssets.length; + let cachedAssets = 0; + + for (const asset of cacheAssets) { + await cache.add(asset); + const progress = `${++cachedAssets}/${totalAssets}`; + + console.log(`Cached: ${asset} (${progress})`); + } + }) + ); +}); + +self.addEventListener('activate', (event) => { + event.waitUntil( + caches.keys().then((keyList) => { + return Promise.all( + keyList.map((key) => { + if (key !== cacheName) { + return caches.delete(key); + } + }) + ); + }) + ); +}); + +self.addEventListener('fetch', (event) => { + if (event.request.mode === 'navigate') { + event.respondWith( + fetch(event.request).catch(() => { + return caches.match(offlineUrl); + }) + ); + } else { + event.respondWith( + fetch(event.request).catch(() => { + return caches.match(event.request); + }) + ); + } +}); diff --git a/src/resources/scripts/main.ts b/src/resources/scripts/main.ts index 8bf3080..1377698 100644 --- a/src/resources/scripts/main.ts +++ b/src/resources/scripts/main.ts @@ -266,10 +266,10 @@ const detect = { }; const serviceworker = { - register: function () { + register: function (url: string) { if ('serviceWorker' in navigator) { window.addEventListener('load', () => { - navigator.serviceWorker.register('/service-worker.js').then(() => { + navigator.serviceWorker.register(url).then(() => { navigator.serviceWorker.addEventListener('message', (event) => { if (event.origin === window.location.origin) { if (event.data.title === 'sw-install-complete') { @@ -281,23 +281,6 @@ const serviceworker = { }); } }, - unregister: function () { - if ('serviceWorker' in navigator) { - navigator.serviceWorker.getRegistrations().then((registrations) => { - for (const registration of registrations) { - registration.unregister().then(() => { - caches.keys().then((keyList) => { - return Promise.all( - keyList.map((key) => { - return caches.delete(key); - }) - ); - }); - }); - } - }); - } - }, }; if (window.location.pathname === '/') { @@ -310,9 +293,9 @@ if (window.location.pathname === '/') { }); if (storage.local.get('offlineCache') === true) { - serviceworker.register(); + serviceworker.register('/sw-full.js'); } else { - serviceworker.unregister(); + serviceworker.register('/sw.js'); } } else { document.addEventListener('DOMContentLoaded', () => { diff --git a/src/resources/scripts/settings.ts b/src/resources/scripts/settings.ts index 5f81663..aa7c8e8 100644 --- a/src/resources/scripts/settings.ts +++ b/src/resources/scripts/settings.ts @@ -28,10 +28,10 @@ if (window.location.pathname === '/settings/') { offlineCheckbox.addEventListener('change', () => { storage.local.set('offlineCache', offlineCheckbox.checked); if (offlineCheckbox.checked) { - serviceworker.register(); + serviceworker.register('/sw-full.js'); alert('Offline cache is now downloading.\nThe download size is about 1GB, so it may take a while.'); } else { - serviceworker.unregister(); + serviceworker.register('/sw.js'); alert('Offline cache has been deleted.'); } }); @@ -74,14 +74,16 @@ if (window.location.pathname === '/welcome.html') { storage.local.set('lastVersion', launcherVersion); if (offlineCheckbox.checked) { - serviceworker.register(); + serviceworker.register('/sw-full.js'); alert('Offline cache is now downloading.\nThe download size is about 1GB, so it may take a while.'); try { // @ts-expect-error installPwaEvent.prompt(); } catch (error) { - console.log('Failed to prompt PWA install:', error); + console.error('Failed to prompt PWA install:', error); } + } else { + serviceworker.register('/sw.js'); } // @ts-expect-error