'use strict'; /* ================================== */ /* NOTE: Registration done in main.js */ /* ================================== */ /* =================================== */ /* NOTE: CacheKey & FilesToCache Lists */ /* =================================== */ const version = '1'; const appPrefix = 'ohmnews-'; const staticCacheKey = appPrefix + 'static-v' + version; const dataCacheKey = appPrefix + 'content-data'; var allCacheKey = [ staticCacheKey, dataCacheKey ]; /* ================================== */ /* NOTE: Install: Save files to cache */ /* ================================== */ // Install new service worker even when old version still in use. // Install happens only once a lifetime of a service worker. const cacheResources = async () => { const staticFilesToCache = [ './', 'favicon.ico', 'index.html', 'main.js', 'manifest.json', 'font/flUhRq6tzZclQEJ-Vdg-IuiaDsNc.woff2', 'font/KFOlCnqEu92Fr1MmEU9fBBc4.woff2', 'font/KFOlCnqEu92Fr1MmEU9fChc4EsA.woff2', 'font/KFOlCnqEu92Fr1MmSU5fBBc4.woff2', 'font/KFOlCnqEu92Fr1MmSU5fChc4EsA.woff2', 'font/KFOlCnqEu92Fr1MmWUlfBBc4.woff2', 'font/KFOlCnqEu92Fr1MmWUlfChc4EsA.woff2', 'font/KFOmCnqEu92Fr1Mu4mxK.woff2', 'font/KFOmCnqEu92Fr1Mu7GxKOzY.woff2', 'img/launcher/launcher_app_icon_152.png', 'img/launcher/launcher_app_icon_167.png', 'img/launcher/launcher_app_icon_180.png', 'img/launcher/launcher_app_icon_192.png', 'img/launcher/launcher_app_icon_512.png', 'img/app_icon.png', 'img/launcher_app_icon.png', 'img/profil_icon.png', 'lib/bootstrap-font-and-icons.css', 'lib/bootstrap-material-design.js', 'lib/bootstrap-material-design.min.css', 'lib/jquery-3.3.1.min.js', 'lib/popper-1.12.6.js', 'lib/vue-router.js', 'lib/vue.js', 'routes/bookmark.js', 'routes/createMessage.js', 'routes/files.js', 'routes/home.js', 'routes/messageData.js', 'routes/msgCard.js', 'routes/profil.js', 'routes/profilCard.js', 'routes/profilData.js', 'style/style.css', ]; const dataFilesToCache = []; const cacheStatic = await caches.open(staticCacheKey); cacheStatic.addAll(staticFilesToCache); console.log('[ServiceWorker] Cache static files.'); const cacheData = await caches.open(dataCacheKey); cacheData.addAll(dataFilesToCache); console.log('[ServiceWorker] Cache data files.'); return; } self.addEventListener('install', event => { // don't wait self.skipWaiting(); // cache static files event.waitUntil(cacheResources()) console.log('[ServiceWorker] Install'); }); /* ================================================================ */ /* NOTE: Activate: new service worker and delete old cache versions */ /* ================================================================ */ // No fetch or pull is called before succesfull activate event. const cacheCleanUp = async () => { const cacheKeyList = await caches.keys(); const deletions = cacheKeyList .filter(key => key.startsWith(appPrefix) && !allCacheKey.includes(key)) .map(key => { caches.delete(key) console.log('[ServiceWorker] Removing old cache', key); }); for (const success of deletions) { await success; } return; } self.addEventListener('activate', event => { event.waitUntil(cacheCleanUp()); clients.claim(); console.log('[ServiceWorker] Activate'); }); /* ========================================= */ /* NOTE: Fetch: Update logic for cache files */ /* ========================================= */ self.addEventListener('fetch', event => { // Provide HTTPS URL for query data. const dataUrl = 'https://me.efi.th-nuernberg.de/om/'; // Parse the URL: const requestURL = new URL(event.request.url); // Start the network request as soon as possible. //const networkPromise = fetch('/data.json'); event.respondWith( caches.match(event.request) .then(cachedResponse => { if (cachedResponse) { return cachedResponse; } console.log('[ServiceWorker] Fetch', requestURL.href); return fetch(event.request).then(response => { // Check if we received a valid response // - Ensure the response is valid. // - Check the status is 200 on the response. // - Make sure the response type is basic, which indicates that it's a request from our origin. // This means that requests to third party assets aren't cached as well. if (!response || response.status !== 200 || response.type !== 'basic') { return response; } // We have to clone the response here because request bodies // can only be read once. Placing a response in the cache // counts as a read and so does the `res.json` call below. var responseToCache = response.clone(); caches.open(staticCacheKey).then(cache => { cache.put(event.request, responseToCache); }); return response; }); }) ); });