appcache-polyfill-sw
Version:
A service worker implementation of the behavior defined in a page's App Cache manifest.
3 lines (2 loc) • 3.36 kB
JavaScript
async function t(t,e,n){try{const e=await fetch(t);if(!e.ok||new URL(e.url).origin!==location.origin)throw Error("Fallback request failure.");return e}catch(t){return(await caches.open(n)).match(e)}}function e(t,e){return t.filter(t=>e.startsWith(t)).reduce((t,e)=>t.length>=e.length?t:e,"")}function n(t){const e=new URL(t);return e.hash="",e.href}function r(t){return new Promise((e,n)=>{t.oncomplete=t.onsuccess=()=>e(t.result),t.onabort=t.onerror=()=>n(t.error)})}let a;function o(){return a||(a=function(t,e){const n=indexedDB.open("keyval-store");n.onupgradeneeded=()=>n.result.createObjectStore("keyval");const a=r(n);return(t,e)=>a.then(n=>e(n.transaction("keyval",t).objectStore("keyval")))}()),a}function s(t,e,n=o()){return n("readwrite",n=>(n.put(e,t),r(n.transaction)))}async function c(t){return await function(t,e=o()){return e("readonly",e=>r(e.get(t)))}(t)||{}}async function i(t,e){const n=(await c("ManifestURLToHashes"))[t];if(n)return n.get(e)}async function u(r,a,o,s){const c=n(r.request.url);if(a.cache.indexOf(c)>=0||c===s)return(await caches.open(o)).match(c);const i=e(Object.keys(a.fallback),c);return i?t(r.request,a.fallback[i],o):a.network.indexOf(c)>=0||a.network.indexOf("*")>=0?fetch(r.request):Response.error()}async function f(r){const a=await async function(r){if("true"===r.request.headers.get("X-Use-Fetch"))return fetch(r.request);const a=new URL(n(r.request.url));if("GET"!==r.request.method||a.protocol!==location.protocol)return fetch(r.request);const o=n(await async function(t){return t.clientId?(await self.clients.get(t.clientId)).url:"navigate"===t.request.mode?t.request.url:t.request.referrer}(r)),f=(await c("PageURLToManifestURL"))[o];return f?async function(t,e,n){if(t.clientId){const r=(await c("ClientIdToHash"))[t.clientId];if(r){const a=await i(e,r);if(a)return u(t,a,r,n)}}const r=await async function(t){const e=await c("ManifestURLToHashes");if(!e)return;const n=e[t];if(!n)return;const r=Array.from(n.keys());return r[r.length-1]}(e);if(r){t.clientId&&await async function(t,e){if(t){const n=await c("ClientIdToHash");n[t]=e,await s("ClientIdToHash",n)}}(t.clientId,r);const a=await i(e,r);if(a)return u(t,a,r,n)}return Response.error()}(r,f,o):async function(n){const r=await c("ManifestURLToHashes");let a,o="",s="";for(const t of Object.values(r)){const r=Array.from(t.entries()),[c,i]=r[r.length-1],u=e(Object.keys(i.fallback),n.request.url);u&&u.length>=o.length&&(a=i,o=u,s=c)}return a&&o&&s?t(n.request,a.fallback[o],s):fetch(n.request)}(r)}(r);return"navigate"===r.request.mode&&r.waitUntil(async function(){const t=(await self.clients.matchAll()).map(t=>t.id),e=await async function(t){const e=[],n=await c("ClientIdToHash"),r=Object.entries(n);for(const[a,o]of r)-1===t.indexOf(a)&&(delete n[a],e.push(o));return await s("ClientIdToHash",n),e}(t),n=await async function(){const t=new Set,e=await c("ManifestURLToHashes");for(const n of Object.values(e)){const e=Array.from(n.keys());for(const n of e.slice(0,e.length-1))t.add(n)}return t}(),r=Array.from(n).filter(t=>e.includes(t));await async function(t){const e=await c("ManifestURLToHashes");for(const n of Object.values(e))for(const e of Object.keys(n))t.includes(e)&&n.delete(e);await s("ManifestURLToHashes",e)}(r),await Promise.all(r.map(t=>caches.delete(t)))}()),a}export{f as handle};
//# sourceMappingURL=index.modern.js.map