svgomg-ui/sw.js.map

1 line
15 KiB
Plaintext
Raw Normal View History

{"version":3,"file":"sw.js","sources":["../../src/js/sw/index.js","../../src/js/utils/storage.js"],"sourcesContent":["import {idbKeyval as storage} from '../utils/storage.js';\n\nconst version = SVGOMG_VERSION;\nconst cachePrefix = 'svgomg-';\nconst staticCacheName = `${cachePrefix}static-${version}`;\nconst fontCacheName = `${cachePrefix}fonts`;\nconst expectedCaches = [staticCacheName, fontCacheName];\n\naddEventListener('install', event => {\n event.waitUntil((async () => {\n const activeVersionPromise = storage.get('active-version');\n const cache = await caches.open(staticCacheName);\n\n await cache.addAll([\n './',\n 'imgs/icon.png',\n 'css/all.css',\n 'js/gzip-worker.js',\n 'js/page.js',\n 'js/prism-worker.js',\n 'js/svgo-worker.js',\n 'changelog.json',\n 'https://fonts.googleapis.com/css?family=Roboto:400,700|Inconsolata'\n ]);\n\n const activeVersion = await activeVersionPromise;\n\n // If it's a major version change, don't skip waiting\n if (!activeVersion || activeVersion.split('.')[0] === version.split('.')[0]) {\n self.skipWaiting();\n }\n })());\n});\n\naddEventListener('activate', event => {\n event.waitUntil((async () => {\n // remove caches beginning \"svgomg-\" that aren't in expectedCaches\n for (const cacheName of await caches.keys()) {\n if (!cacheName.startsWith(cachePrefix)) continue;\n if (!expectedCaches.includes(cacheName)) await caches.delete(cacheName);\n }\n\n await storage.set('active-version', version);\n })());\n});\n\nasync function handleFontRequest(request) {\n const match = await caches.match(request);\n if (match) return match;\n\n const [response, fontCache] = await Promise.all([\n fetch(request),\n caches.open(fontCacheName)\n ]);\n\n fontCache.put(request, response.clone());\n return response;\n}\n\naddEventListener('fetch', event => {\n const url = new URL(event.request.url);\n\n if (url.host == 'fonts.gstatic.com') {\n event.respondWith(handleFontRequest(event.request));\n return;\n }\n event.respondWith(\n caches.match(event.request).then(r => r || fetch(event.request))\n );\n});\n","export let idbKeyval = (() => {\n let db;\n\n function getDB() {\n if (!db) {\n db = new Promise((resolve, reject) => {\n const openreq = indexedDB.open('svgo-keyval', 1);\n\n openreq.onerror = () => {\n reject(openreq.error);\n };\n\n openreq.onupgradeneeded = () => {\n // First time setup: create an empty object store\n openreq.result.createObjectStore('keyval');\n };\n\n openreq.onsuccess = () => {\n resolve(openreq.result);\n };\n });\n }\n return db;\n }\n\n async function withStore(type, callback) {\n const db = await getDB();\n return new Promise((resolve, reject) => {\n const transaction = db.transaction('keyval', type);\n transaction.oncomplete = () => resolve();\n transaction.onerror = () => reject(transaction.error);\n callback(transaction.objectStore('keyval'));\n });\n }\n\n return {\n async get(key) {\n let req;\n await withStore('readonly', store => {\n req = store.get(key);\n });\n return req.result;\n },\n set(key, value) {\n return withStore('readwrite', store => {\n store.put(value, key);\n });\n },\n delete(key) {\n return withStore('readwrite', store => {\n store.delete(key);\n });\n }\n };\n})();\n\n// iOS add-to-homescreen is missing IDB, or at least it used to.\n// I haven't tested this in a while.\nif (!self.indexedDB) {\n idbKeyval = {\n get: key => Promise.resolve(localStorage.getItem(key)),\n set: (key, val) => Promise.resolve(localStorage.setItem(key, val)),\n delete: key => Promise.resolve(localStorage.removeItem(key))\n };\n}\n"],"names":["caches","match","Promise","all","fetch","open","put","clone","indexedDB","onerror","error","onupgradeneeded","result","createObjectStore","onsuccess","transaction","oncomplete","obje