diff --git a/ui/public/navidrome-service-worker.js b/ui/public/navidrome-service-worker.js new file mode 100644 index 00000000..2cc12ab9 --- /dev/null +++ b/ui/public/navidrome-service-worker.js @@ -0,0 +1,48 @@ +// documentation: https://developers.google.com/web/tools/workbox/modules/workbox-sw +importScripts("https://storage.googleapis.com/workbox-cdn/releases/6.1.2/workbox-sw.js"); + +workbox.loadModule('workbox-core'); +workbox.loadModule('workbox-strategies'); +workbox.loadModule('workbox-routing'); +workbox.loadModule('workbox-navigation-preload'); + +workbox.core.clientsClaim(); +self.skipWaiting(); + +addEventListener('message', (event) => { + if (event.data && event.data.type === 'SKIP_WAITING') { + skipWaiting(); + } +}); + + +const CACHE_NAME = 'offline-html'; +// This assumes /offline.html is a URL for your self-contained +// (no external images or styles) offline page. +const FALLBACK_HTML_URL = './offline.html'; +// Populate the cache with the offline HTML page when the +// service worker is installed. +self.addEventListener('install', async (event) => { + event.waitUntil( + caches.open(CACHE_NAME) + .then((cache) => cache.add(FALLBACK_HTML_URL)) + ); +}); + +const networkOnly = new workbox.strategies.NetworkOnly(); +const navigationHandler = async (params) => { + try { + // Attempt a network request. + return await networkOnly.handle(params); + } catch (error) { + // If it fails, return the cached HTML. + return caches.match(FALLBACK_HTML_URL, { + cacheName: CACHE_NAME, + }); + } +}; + +// Register this strategy to handle all navigations. +workbox.routing.registerRoute( + new workbox.routing.NavigationRoute(navigationHandler) +); diff --git a/ui/public/offline.html b/ui/public/offline.html new file mode 100644 index 00000000..72f2d04a --- /dev/null +++ b/ui/public/offline.html @@ -0,0 +1,10 @@ + + +
+It looks like we are having trouble connecting.
+
+Please check your internet connection and try again.