diff --git a/src/js/service-worker.js b/src/js/service-worker.js index 3524148e..4f4b3f10 100644 --- a/src/js/service-worker.js +++ b/src/js/service-worker.js @@ -3,13 +3,15 @@ const CACHE_VERSION = 1; const BASE_CACHE_FILES = [ '/css/style.min.css', '/js/theme.min.js', - '/site.webmanifest' + '/site.webmanifest', + '/images/fixit.svg' ]; const OFFLINE_CACHE_FILES = [ '/css/style.min.css', '/js/theme.min.js', '/site.webmanifest', + '/images/fixit.svg', '/offline/' ]; @@ -17,6 +19,7 @@ const NOT_FOUND_CACHE_FILES = [ '/css/style.min.css', '/js/theme.min.js', '/site.webmanifest', + '/images/fixit.svg', '/404.html' ]; diff --git a/static/images/fixit.svg b/static/images/fixit.svg index 28f64b1b..d07d5ad6 100644 --- a/static/images/fixit.svg +++ b/static/images/fixit.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/static/service-worker.min.js b/static/service-worker.min.js index b9e9b217..26fbad4d 100644 --- a/static/service-worker.min.js +++ b/static/service-worker.min.js @@ -1,3 +1,3 @@ -"use strict";function _createForOfIteratorHelper(a,b){var c="undefined"!=typeof Symbol&&a[Symbol.iterator]||a["@@iterator"];if(!c){if(Array.isArray(a)||(c=_unsupportedIterableToArray(a))||b&&a&&"number"==typeof a.length){c&&(a=c);var d=0,e=function(){};return{s:e,n:function n(){return d>=a.length?{done:!0}:{done:!1,value:a[d++]}},e:function e(a){throw a},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var f,g=!0,h=!1;return{s:function s(){c=c.call(a)},n:function n(){var a=c.next();return g=a.done,a},e:function e(a){h=!0,f=a},f:function f(){try{g||null==c.return||c.return()}finally{if(h)throw f}}}}function _unsupportedIterableToArray(a,b){if(a){if("string"==typeof a)return _arrayLikeToArray(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);return"Object"===c&&a.constructor&&(c=a.constructor.name),"Map"===c||"Set"===c?Array.from(a):"Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c)?_arrayLikeToArray(a,b):void 0}}function _arrayLikeToArray(a,b){(null==b||b>a.length)&&(b=a.length);for(var c=0,d=Array(b);ci?new Promise(function(d){return fetch(a.request.clone()).then(function(e){e?(b.put(a.request,e.clone()),d(e)):d(c)}).catch(function(){d(c)})}).catch(function(a){return console.log(a),c}):c}return c}return null}).then(function(c){return c?c:fetch(a.request.clone()).then(function(c){return 400>c.status?(~SUPPORTED_METHODS.indexOf(a.request.method)&&!isBlacklisted(a.request.url)&&"http"===a.request.url.slice(0,4)&&b.put(a.request,c.clone()),c):caches.open(CACHE_VERSIONS.notFound).then(function(a){return a.match(NOT_FOUND_PAGE)})}).then(function(a){if(a)return a}).catch(function(){return caches.open(CACHE_VERSIONS.offline).then(function(a){return a.match(OFFLINE_PAGE)})})}).catch(function(a){throw console.error(" Error in fetch handler:",a),a})}))}); +"use strict";function _createForOfIteratorHelper(a,b){var c="undefined"!=typeof Symbol&&a[Symbol.iterator]||a["@@iterator"];if(!c){if(Array.isArray(a)||(c=_unsupportedIterableToArray(a))||b&&a&&"number"==typeof a.length){c&&(a=c);var d=0,e=function(){};return{s:e,n:function n(){return d>=a.length?{done:!0}:{done:!1,value:a[d++]}},e:function e(a){throw a},f:e}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var f,g=!0,h=!1;return{s:function s(){c=c.call(a)},n:function n(){var a=c.next();return g=a.done,a},e:function e(a){h=!0,f=a},f:function f(){try{g||null==c.return||c.return()}finally{if(h)throw f}}}}function _unsupportedIterableToArray(a,b){if(a){if("string"==typeof a)return _arrayLikeToArray(a,b);var c=Object.prototype.toString.call(a).slice(8,-1);return"Object"===c&&a.constructor&&(c=a.constructor.name),"Map"===c||"Set"===c?Array.from(a):"Arguments"===c||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(c)?_arrayLikeToArray(a,b):void 0}}function _arrayLikeToArray(a,b){(null==b||b>a.length)&&(b=a.length);for(var c=0,d=Array(b);ci?new Promise(function(d){return fetch(a.request.clone()).then(function(e){e?(b.put(a.request,e.clone()),d(e)):d(c)}).catch(function(){d(c)})}).catch(function(a){return console.log(a),c}):c}return c}return null}).then(function(c){return c?c:fetch(a.request.clone()).then(function(c){return 400>c.status?(~SUPPORTED_METHODS.indexOf(a.request.method)&&!isBlacklisted(a.request.url)&&"http"===a.request.url.slice(0,4)&&b.put(a.request,c.clone()),c):caches.open(CACHE_VERSIONS.notFound).then(function(a){return a.match(NOT_FOUND_PAGE)})}).then(function(a){if(a)return a}).catch(function(){return caches.open(CACHE_VERSIONS.offline).then(function(a){return a.match(OFFLINE_PAGE)})})}).catch(function(a){throw console.error(" Error in fetch handler:",a),a})}))}); //# sourceMappingURL=service-worker.min.js.map \ No newline at end of file diff --git a/static/service-worker.min.js.map b/static/service-worker.min.js.map index 493c2179..6d854a1a 100644 --- a/static/service-worker.min.js.map +++ b/static/service-worker.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/js/service-worker.js"],"names":[],"mappings":"+pCAAM,CAAA,aAAa,CAAG,C,CAEhB,gBAAgB,CAAG,CACvB,oBADuB,CAEvB,kBAFuB,CAGvB,mBAHuB,C,CAMnB,mBAAmB,CAAG,CAC1B,oBAD0B,CAE1B,kBAF0B,CAG1B,mBAH0B,CAI1B,WAJ0B,C,CAOtB,qBAAqB,CAAG,CAC5B,oBAD4B,CAE5B,kBAF4B,CAG5B,mBAH4B,CAI5B,WAJ4B,C,CAOxB,YAAY,CAAG,W,CACf,cAAc,CAAG,W,CAEjB,cAAc,CAAG,CACrB,MAAM,YADe,CAErB,OAAO,aAFc,CAGrB,OAAO,aAHc,CAIrB,QAAQ,SAJa,C,CAQjB,OAAO,CAAG,CACd,IAAK,IADS,CAEd,IAAI,CAAE,IAFQ,CAGd,IAAI,CAAE,KAHQ,CAId,EAAE,CAAE,KAJU,CAKd,GAAG,CAAE,KALS,C,CAQV,eAAe,CAAG,CACtB,SAAC,CAAD,CAAS,CACP,MAAO,CAAC,CAAG,CAAC,UAAJ,CAAe,kBAAf,CACT,CAHqB,C,CAMlB,iBAAiB,CAAG,CAAC,KAAD,C,CAO1B,QAAS,CAAA,aAAT,CAAuB,CAAvB,CAA4B,CAC1B,SAAgC,CAAzB,CAAA,eAAe,CAAC,MAAvB,GACI,CAAC,eAAe,CAAC,MAAhB,CAAuB,SAAC,CAAD,CAAU,SACZ,UAAhB,QAAO,CAAA,CADqB,GAEvB,CAAC,CAAI,CAAC,CAAD,CAIf,CANA,EAME,MAER,CAOD,QAAS,CAAA,gBAAT,CAA0B,CAA1B,CAA+B,CAC7B,GAAM,CAAA,CAAS,CAAG,CAAG,CAAC,KAAJ,CAAU,GAAV,EAAe,OAAf,GAAyB,CAAzB,EAA4B,KAA5B,CAAkC,GAAlC,EAAuC,CAAvC,CAAlB,CACA,MAAO,CAAA,CAAS,CAAC,QAAV,CAAmB,GAAnB,EAA0B,GAA1B,CAAgC,CACxC,CAMD,QAAS,CAAA,MAAT,CAAgB,CAAhB,CAAqB,CACnB,GAAmB,QAAf,QAAO,CAAA,CAAX,CAA6B,CAC3B,GAAM,CAAA,CAAS,CAAG,gBAAgB,CAAC,CAAD,CAAlC,CAD2B,MAEO,QAA9B,QAAO,CAAA,OAAO,CAAC,CAAD,CAFS,CAGlB,OAAO,CAAC,CAAD,CAHW,CAKlB,IAEV,CACC,MAAO,KAEV,CAMD,QAAS,CAAA,oBAAT,EAAgC,CAC9B,MAAO,CAAA,OAAO,CAAC,GAAR,CAAY,CACjB,MAAM,CAAC,IAAP,CAAY,cAAc,CAAC,MAA3B,EAAmC,IAAnC,CAAwC,SAAC,CAAD,CAAW,CACjD,MAAO,CAAA,CAAK,CAAC,MAAN,CAAa,gBAAb,CACR,CAFD,CADiB,CAIjB,MAAM,CAAC,IAAP,CAAY,cAAc,CAAC,OAA3B,EAAoC,IAApC,CAAyC,SAAC,CAAD,CAAW,CAClD,MAAO,CAAA,CAAK,CAAC,MAAN,CAAa,mBAAb,CACR,CAFD,CAJiB,CAOjB,MAAM,CAAC,IAAP,CAAY,cAAc,CAAC,QAA3B,EAAqC,IAArC,CAA0C,SAAC,CAAD,CAAW,CACnD,MAAO,CAAA,CAAK,CAAC,MAAN,CAAa,qBAAb,CACR,CAFD,CAPiB,CAAZ,EAUJ,IAVI,CAUC,UAAM,CACZ,MAAO,CAAA,IAAI,CAAC,WAAL,EACR,CAZM,CAaR,CAMD,QAAS,CAAA,kBAAT,EAA8B,CAC5B,GAAM,CAAA,CAAa,CAAG,MAAM,CAAC,IAAP,CAAY,cAAZ,EAA4B,GAA5B,CAAgC,SAAC,CAAD,CAAS,CAC7D,MAAO,CAAA,cAAc,CAAC,CAAD,CACtB,CAFqB,CAAtB,CAIA,MAAO,IAAI,CAAA,OAAJ,CAAY,SAAC,CAAD,CAAU,CAAV,CAAqB,CACtC,MAAM,CACH,IADH,GAEG,IAFH,CAEQ,SAAC,CAAD,CAAU,CACd,MAAO,CAAA,CAAI,CAAC,MAAL,CAAY,SAAC,CAAD,CAAS,CAC1B,MAAO,CAAC,CAAC,CAAa,CAAC,OAAd,CAAsB,CAAtB,CACV,CAFM,CAGR,CANH,EAOG,IAPH,CAOQ,SAAC,CAAD,CAAY,CACZ,CAAM,CAAC,MADK,CAEd,OAAO,CAAC,GAAR,CACE,CAAM,CAAC,GAAP,CAAW,SAAC,CAAD,CAAe,CACxB,MAAO,CAAA,MAAM,CAAC,MAAP,CAAc,CAAd,CACR,CAFD,CADF,EAKG,IALH,CAKQ,UAAM,CACV,CAAO,EACR,CAPH,EAQG,KARH,CAQS,SAAC,CAAD,CAAS,CACd,CAAM,CAAC,CAAD,CACP,CAVH,CAFc,CAcd,CAAO,EAEV,CAvBH,EAwBG,KAxBH,CAwBS,SAAC,CAAD,CAAS,CACd,CAAM,CAAC,CAAD,CACP,CA1BH,CA2BD,CA5BM,CA6BR,CAED,IAAI,CAAC,gBAAL,CAAsB,SAAtB,CAAiC,SAAC,CAAD,CAAW,CAC1C,CAAK,CAAC,SAAN,CAAgB,OAAO,CAAC,GAAR,CAAY,CAAC,oBAAoB,EAArB,CAAyB,IAAI,CAAC,WAAL,EAAzB,CAAZ,CAAhB,CACD,CAFD,C,CAKA,IAAI,CAAC,gBAAL,CAAsB,UAAtB,CAAkC,SAAC,CAAD,CAAW,CAC3C,CAAK,CAAC,SAAN,CACE,OAAO,CAAC,GAAR,CAAY,CACV,kBAAkB,EADR,CAEV,IAAI,CAAC,OAAL,CAAa,KAAb,EAFU,CAGV,IAAI,CAAC,WAAL,EAHU,CAAZ,EAIG,KAJH,CAIS,SAAC,CAAD,CAAS,CAChB,OAAO,CAAC,GAAR,CAAY,CAAZ,CADgB,CAEhB,IAAI,CAAC,WAAL,EACD,CAPD,CADF,CAUD,CAXD,C,CAaA,IAAI,CAAC,gBAAL,CAAsB,OAAtB,CAA+B,SAAC,CAAD,CAAW,CACxC,CAAK,CAAC,WAAN,CACE,MAAM,CAAC,IAAP,CAAY,cAAc,CAAC,OAA3B,EAAoC,IAApC,CAAyC,SAAC,CAAD,CAAW,CAClD,MAAO,CAAA,CAAK,CACT,KADI,CACE,CAAK,CAAC,OADR,EAEJ,IAFI,CAEC,SAAC,CAAD,CAAc,CAClB,GAAI,CAAJ,CAAc,OACN,CAAO,CAAG,CAAQ,CAAC,OAAT,CAAiB,OAAjB,EADJ,CAER,CAAI,CAAG,IAFC,8BAIO,CAJP,MAIZ,2BAA4B,IAAjB,CAAA,CAAiB,SACV,MAAZ,GAAA,CAAI,CAAC,CAAD,CADkB,GAExB,CAAI,CAAG,GAAI,CAAA,IAAJ,CAAS,CAAI,CAAC,CAAD,CAAb,CAFiB,CAI3B,CARW,+BASZ,GAAI,CAAJ,CAAU,IACF,CAAA,CAAG,CAAG,QAAQ,CAClB,CAAC,GAAI,CAAA,IAAJ,GAAW,OAAX,GAAuB,CAAI,CAAC,OAAL,EAAxB,EAA0C,GADxB,CADZ,CAIF,CAAG,CAAG,MAAM,CAAC,CAAK,CAAC,OAAN,CAAc,GAAf,CAJV,OAMJ,CAAA,CAAG,EAAI,CAAG,CAAG,CANT,CAOC,GAAI,CAAA,OAAJ,CAAY,SAAC,CAAD,CAAa,CAC9B,MAAO,CAAA,KAAK,CAAC,CAAK,CAAC,OAAN,CAAc,KAAd,EAAD,CAAL,CACJ,IADI,CACC,SAAC,CAAD,CAAqB,CACrB,CADqB,EAEvB,CAAK,CAAC,GAAN,CAAU,CAAK,CAAC,OAAhB,CAAyB,CAAe,CAAC,KAAhB,EAAzB,CAFuB,CAGvB,CAAO,CAAC,CAAD,CAHgB,EAKvB,CAAO,CAAC,CAAD,CAEV,CARI,EASJ,KATI,CASE,UAAM,CACX,CAAO,CAAC,CAAD,CACR,CAXI,CAYR,CAbM,EAaJ,KAbI,CAaE,SAAC,CAAD,CAAS,CAEhB,MADA,CAAA,OAAO,CAAC,GAAR,CAAY,CAAZ,CACA,CAAO,CACR,CAhBM,CAPD,CAyBC,CAEV,CACC,MAAO,CAAA,CAEV,CACC,MAAO,KAEV,CA7CI,EA8CJ,IA9CI,CA8CC,SAAC,CAAD,CAAc,OACd,CAAA,CADc,CAET,CAFS,CAIT,KAAK,CAAC,CAAK,CAAC,OAAN,CAAc,KAAd,EAAD,CAAL,CACJ,IADI,CACC,SAAC,CAAD,CAAc,OACI,IAAlB,CAAA,CAAQ,CAAC,MADK,EAGd,CAAC,iBAAiB,CAAC,OAAlB,CAA0B,CAAK,CAAC,OAAN,CAAc,MAAxC,CAAD,EACA,CAAC,aAAa,CAAC,CAAK,CAAC,OAAN,CAAc,GAAf,CADd,EAEkC,MAAlC,GAAA,CAAK,CAAC,OAAN,CAAc,GAAd,CAAkB,KAAlB,CAAwB,CAAxB,CAA2B,CAA3B,CALc,EAOd,CAAK,CAAC,GAAN,CAAU,CAAK,CAAC,OAAhB,CAAyB,CAAQ,CAAC,KAAT,EAAzB,CAPc,CAST,CATS,EAWT,MAAM,CAAC,IAAP,CAAY,cAAc,CAAC,QAA3B,EAAqC,IAArC,CAA0C,SAAC,CAAD,CAAW,CAC1D,MAAO,CAAA,CAAK,CAAC,KAAN,CAAY,cAAZ,CACR,CAFM,CAIV,CAhBI,EAiBJ,IAjBI,CAiBC,SAAC,CAAD,CAAc,CAClB,GAAI,CAAJ,CACE,MAAO,CAAA,CAEV,CArBI,EAsBJ,KAtBI,CAsBE,UAAM,CACX,MAAO,CAAA,MAAM,CACV,IADI,CACC,cAAc,CAAC,OADhB,EAEJ,IAFI,CAEC,SAAC,CAAD,CAAkB,CACtB,MAAO,CAAA,CAAY,CAAC,KAAb,CAAmB,YAAnB,CACR,CAJI,CAKR,CA5BI,CA8BV,CAhFI,EAiFJ,KAjFI,CAiFE,SAAC,CAAD,CAAW,CAEhB,KADA,CAAA,OAAO,CAAC,KAAR,CAAc,2BAAd,CAA2C,CAA3C,CACA,CAAM,CACP,CApFI,CAqFR,CAtFD,CADF,CAyFD,CA1FD,C","file":"service-worker.min.js","sourcesContent":["const CACHE_VERSION = 1;\r\n\r\nconst BASE_CACHE_FILES = [\r\n '/css/style.min.css',\r\n '/js/theme.min.js',\r\n '/site.webmanifest'\r\n];\r\n\r\nconst OFFLINE_CACHE_FILES = [\r\n '/css/style.min.css',\r\n '/js/theme.min.js',\r\n '/site.webmanifest',\r\n '/offline/'\r\n];\r\n\r\nconst NOT_FOUND_CACHE_FILES = [\r\n '/css/style.min.css',\r\n '/js/theme.min.js',\r\n '/site.webmanifest',\r\n '/404.html'\r\n];\r\n\r\nconst OFFLINE_PAGE = '/offline/';\r\nconst NOT_FOUND_PAGE = '/404.html';\r\n\r\nconst CACHE_VERSIONS = {\r\n assets: 'assets-v' + CACHE_VERSION,\r\n content: 'content-v' + CACHE_VERSION,\r\n offline: 'offline-v' + CACHE_VERSION,\r\n notFound: '404-v' + CACHE_VERSION\r\n};\r\n\r\n// Define MAX_TTL's in SECONDS for specific file extensions\r\nconst MAX_TTL = {\r\n '/': 3600,\r\n html: 3600,\r\n json: 86400,\r\n js: 86400,\r\n css: 86400\r\n};\r\n\r\nconst CACHE_BLACKLIST = [\r\n (str) => {\r\n return !str.startsWith('http://localhost');\r\n }\r\n];\r\n\r\nconst SUPPORTED_METHODS = ['GET'];\r\n\r\n/**\r\n * isBlackListed\r\n * @param {string} url\r\n * @returns {boolean}\r\n */\r\nfunction isBlacklisted(url) {\r\n return CACHE_BLACKLIST.length > 0\r\n ? !CACHE_BLACKLIST.filter((rule) => {\r\n if (typeof rule === 'function') {\r\n return !rule(url);\r\n } else {\r\n return false;\r\n }\r\n }).length\r\n : false;\r\n}\r\n\r\n/**\r\n * getFileExtension\r\n * @param {string} url\r\n * @returns {string}\r\n */\r\nfunction getFileExtension(url) {\r\n const extension = url.split('.').reverse()[0].split('?')[0];\r\n return extension.endsWith('/') ? '/' : extension;\r\n}\r\n\r\n/**\r\n * getTTL\r\n * @param {string} url\r\n */\r\nfunction getTTL(url) {\r\n if (typeof url === 'string') {\r\n const extension = getFileExtension(url);\r\n if (typeof MAX_TTL[extension] === 'number') {\r\n return MAX_TTL[extension];\r\n } else {\r\n return null;\r\n }\r\n } else {\r\n return null;\r\n }\r\n}\r\n\r\n/**\r\n * installServiceWorker\r\n * @returns {Promise}\r\n */\r\nfunction installServiceWorker() {\r\n return Promise.all([\r\n caches.open(CACHE_VERSIONS.assets).then((cache) => {\r\n return cache.addAll(BASE_CACHE_FILES);\r\n }),\r\n caches.open(CACHE_VERSIONS.offline).then((cache) => {\r\n return cache.addAll(OFFLINE_CACHE_FILES);\r\n }),\r\n caches.open(CACHE_VERSIONS.notFound).then((cache) => {\r\n return cache.addAll(NOT_FOUND_CACHE_FILES);\r\n })\r\n ]).then(() => {\r\n return self.skipWaiting();\r\n });\r\n}\r\n\r\n/**\r\n * cleanupLegacyCache\r\n * @returns {Promise}\r\n */\r\nfunction cleanupLegacyCache() {\r\n const currentCaches = Object.keys(CACHE_VERSIONS).map((key) => {\r\n return CACHE_VERSIONS[key];\r\n });\r\n\r\n return new Promise((resolve, reject) => {\r\n caches\r\n .keys()\r\n .then((keys) => {\r\n return keys.filter((key) => {\r\n return !~currentCaches.indexOf(key);\r\n });\r\n })\r\n .then((legacy) => {\r\n if (legacy.length) {\r\n Promise.all(\r\n legacy.map((legacyKey) => {\r\n return caches.delete(legacyKey);\r\n })\r\n )\r\n .then(() => {\r\n resolve();\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n } else {\r\n resolve();\r\n }\r\n })\r\n .catch((err) => {\r\n reject(err);\r\n });\r\n });\r\n}\r\n\r\nself.addEventListener('install', (event) => {\r\n event.waitUntil(Promise.all([installServiceWorker(), self.skipWaiting()]));\r\n});\r\n\r\n// The activate handler takes care of cleaning up old caches.\r\nself.addEventListener('activate', (event) => {\r\n event.waitUntil(\r\n Promise.all([\r\n cleanupLegacyCache(),\r\n self.clients.claim(),\r\n self.skipWaiting()\r\n ]).catch((err) => {\r\n console.log(err);\r\n self.skipWaiting();\r\n })\r\n );\r\n});\r\n\r\nself.addEventListener('fetch', (event) => {\r\n event.respondWith(\r\n caches.open(CACHE_VERSIONS.content).then((cache) => {\r\n return cache\r\n .match(event.request)\r\n .then((response) => {\r\n if (response) {\r\n const headers = response.headers.entries();\r\n let date = null;\r\n\r\n for (const pair of headers) {\r\n if (pair[0] === 'date') {\r\n date = new Date(pair[1]);\r\n }\r\n }\r\n if (date) {\r\n const age = parseInt(\r\n (new Date().getTime() - date.getTime()) / 1000\r\n );\r\n const ttl = getTTL(event.request.url);\r\n\r\n if (ttl && age > ttl) {\r\n return new Promise((resolve) => {\r\n return fetch(event.request.clone())\r\n .then((updatedResponse) => {\r\n if (updatedResponse) {\r\n cache.put(event.request, updatedResponse.clone());\r\n resolve(updatedResponse);\r\n } else {\r\n resolve(response);\r\n }\r\n })\r\n .catch(() => {\r\n resolve(response);\r\n });\r\n }).catch((err) => {\r\n console.log(err);\r\n return response;\r\n });\r\n } else {\r\n return response;\r\n }\r\n } else {\r\n return response;\r\n }\r\n } else {\r\n return null;\r\n }\r\n })\r\n .then((response) => {\r\n if (response) {\r\n return response;\r\n } else {\r\n return fetch(event.request.clone())\r\n .then((response) => {\r\n if (response.status < 400) {\r\n if (\r\n ~SUPPORTED_METHODS.indexOf(event.request.method) &&\r\n !isBlacklisted(event.request.url) &&\r\n event.request.url.slice(0, 4) === 'http'\r\n ) {\r\n cache.put(event.request, response.clone());\r\n }\r\n return response;\r\n } else {\r\n return caches.open(CACHE_VERSIONS.notFound).then((cache) => {\r\n return cache.match(NOT_FOUND_PAGE);\r\n });\r\n }\r\n })\r\n .then((response) => {\r\n if (response) {\r\n return response;\r\n }\r\n })\r\n .catch(() => {\r\n return caches\r\n .open(CACHE_VERSIONS.offline)\r\n .then((offlineCache) => {\r\n return offlineCache.match(OFFLINE_PAGE);\r\n });\r\n });\r\n }\r\n })\r\n .catch((error) => {\r\n console.error(' Error in fetch handler:', error);\r\n throw error;\r\n });\r\n })\r\n );\r\n});\r\n"]} \ No newline at end of file +{"version":3,"sources":["../src/js/service-worker.js"],"names":[],"mappings":"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","file":"service-worker.min.js","sourcesContent":["const CACHE_VERSION = 1;\n\nconst BASE_CACHE_FILES = [\n '/css/style.min.css',\n '/js/theme.min.js',\n '/site.webmanifest',\n '/images/fixit.svg'\n];\n\nconst OFFLINE_CACHE_FILES = [\n '/css/style.min.css',\n '/js/theme.min.js',\n '/site.webmanifest',\n '/images/fixit.svg',\n '/offline/'\n];\n\nconst NOT_FOUND_CACHE_FILES = [\n '/css/style.min.css',\n '/js/theme.min.js',\n '/site.webmanifest',\n '/images/fixit.svg',\n '/404.html'\n];\n\nconst OFFLINE_PAGE = '/offline/';\nconst NOT_FOUND_PAGE = '/404.html';\n\nconst CACHE_VERSIONS = {\n assets: 'assets-v' + CACHE_VERSION,\n content: 'content-v' + CACHE_VERSION,\n offline: 'offline-v' + CACHE_VERSION,\n notFound: '404-v' + CACHE_VERSION\n};\n\n// Define MAX_TTL's in SECONDS for specific file extensions\nconst MAX_TTL = {\n '/': 3600,\n html: 3600,\n json: 86400,\n js: 86400,\n css: 86400\n};\n\nconst CACHE_BLACKLIST = [\n (str) => {\n return !str.startsWith('http://localhost');\n }\n];\n\nconst SUPPORTED_METHODS = ['GET'];\n\n/**\n * isBlackListed\n * @param {string} url\n * @returns {boolean}\n */\nfunction isBlacklisted(url) {\n return CACHE_BLACKLIST.length > 0\n ? !CACHE_BLACKLIST.filter((rule) => {\n if (typeof rule === 'function') {\n return !rule(url);\n } else {\n return false;\n }\n }).length\n : false;\n}\n\n/**\n * getFileExtension\n * @param {string} url\n * @returns {string}\n */\nfunction getFileExtension(url) {\n const extension = url.split('.').reverse()[0].split('?')[0];\n return extension.endsWith('/') ? '/' : extension;\n}\n\n/**\n * getTTL\n * @param {string} url\n */\nfunction getTTL(url) {\n if (typeof url === 'string') {\n const extension = getFileExtension(url);\n if (typeof MAX_TTL[extension] === 'number') {\n return MAX_TTL[extension];\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\n/**\n * installServiceWorker\n * @returns {Promise}\n */\nfunction installServiceWorker() {\n return Promise.all([\n caches.open(CACHE_VERSIONS.assets).then((cache) => {\n return cache.addAll(BASE_CACHE_FILES);\n }),\n caches.open(CACHE_VERSIONS.offline).then((cache) => {\n return cache.addAll(OFFLINE_CACHE_FILES);\n }),\n caches.open(CACHE_VERSIONS.notFound).then((cache) => {\n return cache.addAll(NOT_FOUND_CACHE_FILES);\n })\n ]).then(() => {\n return self.skipWaiting();\n });\n}\n\n/**\n * cleanupLegacyCache\n * @returns {Promise}\n */\nfunction cleanupLegacyCache() {\n const currentCaches = Object.keys(CACHE_VERSIONS).map((key) => {\n return CACHE_VERSIONS[key];\n });\n\n return new Promise((resolve, reject) => {\n caches\n .keys()\n .then((keys) => {\n return keys.filter((key) => {\n return !~currentCaches.indexOf(key);\n });\n })\n .then((legacy) => {\n if (legacy.length) {\n Promise.all(\n legacy.map((legacyKey) => {\n return caches.delete(legacyKey);\n })\n )\n .then(() => {\n resolve();\n })\n .catch((err) => {\n reject(err);\n });\n } else {\n resolve();\n }\n })\n .catch((err) => {\n reject(err);\n });\n });\n}\n\nself.addEventListener('install', (event) => {\n event.waitUntil(Promise.all([installServiceWorker(), self.skipWaiting()]));\n});\n\n// The activate handler takes care of cleaning up old caches.\nself.addEventListener('activate', (event) => {\n event.waitUntil(\n Promise.all([\n cleanupLegacyCache(),\n self.clients.claim(),\n self.skipWaiting()\n ]).catch((err) => {\n console.log(err);\n self.skipWaiting();\n })\n );\n});\n\nself.addEventListener('fetch', (event) => {\n event.respondWith(\n caches.open(CACHE_VERSIONS.content).then((cache) => {\n return cache\n .match(event.request)\n .then((response) => {\n if (response) {\n const headers = response.headers.entries();\n let date = null;\n\n for (const pair of headers) {\n if (pair[0] === 'date') {\n date = new Date(pair[1]);\n }\n }\n if (date) {\n const age = parseInt(\n (new Date().getTime() - date.getTime()) / 1000\n );\n const ttl = getTTL(event.request.url);\n\n if (ttl && age > ttl) {\n return new Promise((resolve) => {\n return fetch(event.request.clone())\n .then((updatedResponse) => {\n if (updatedResponse) {\n cache.put(event.request, updatedResponse.clone());\n resolve(updatedResponse);\n } else {\n resolve(response);\n }\n })\n .catch(() => {\n resolve(response);\n });\n }).catch((err) => {\n console.log(err);\n return response;\n });\n } else {\n return response;\n }\n } else {\n return response;\n }\n } else {\n return null;\n }\n })\n .then((response) => {\n if (response) {\n return response;\n } else {\n return fetch(event.request.clone())\n .then((response) => {\n if (response.status < 400) {\n if (\n ~SUPPORTED_METHODS.indexOf(event.request.method) &&\n !isBlacklisted(event.request.url) &&\n event.request.url.slice(0, 4) === 'http'\n ) {\n cache.put(event.request, response.clone());\n }\n return response;\n } else {\n return caches.open(CACHE_VERSIONS.notFound).then((cache) => {\n return cache.match(NOT_FOUND_PAGE);\n });\n }\n })\n .then((response) => {\n if (response) {\n return response;\n }\n })\n .catch(() => {\n return caches\n .open(CACHE_VERSIONS.offline)\n .then((offlineCache) => {\n return offlineCache.match(OFFLINE_PAGE);\n });\n });\n }\n })\n .catch((error) => {\n console.error(' Error in fetch handler:', error);\n throw error;\n });\n })\n );\n});\n"]} \ No newline at end of file