cache-kit
Version:
A simple caching layer for fetch requests — supports memory, browser (localStorage), and Node.js (filesystem) adapters with smart strategies.
2 lines (1 loc) • 1.85 kB
JavaScript
import{_ as e}from"./index-CYMT_vcm.js";import{m as t,g as s}from"./common.util-DAI6ETz-.js";const o={set:function(s,o){return e(this,void 0,void 0,(function*(){const e=t(s),r={responseBody:yield o.response.clone().text(),expiredAt:o.expiredAt,headers:Object.fromEntries(o.response.headers.entries()),status:o.response.status,statusText:o.response.statusText};window.localStorage.setItem(e,JSON.stringify(r))}))},get:function(e){const s=t(e),o=localStorage.getItem(s);if(!o)return null;try{const e=JSON.parse(o),{responseBody:t,expiredAt:s,headers:r,status:n,statusText:a}=e;return{expiredAt:s,response:new Response(t,{headers:r,status:n,statusText:a})}}catch(e){return null}},has:function(e){const s=t(e);return null!==localStorage.getItem(s)},delete:function(e){const s=t(e);localStorage.removeItem(s)},clear:function(){const e=Object.keys(localStorage);for(const t of e)t.startsWith("__CACHE_KIT__::")&&localStorage.removeItem(t)}},r=(t,r,n)=>e(void 0,void 0,void 0,(function*(){const e=t;let a;if("cache-first"===n.strategy)if(o.has(e)&&o.get(e).expiredAt>Date.now())a=o.get(e).response.clone();else{const i=yield fetch(t,r),l={response:i.clone(),expiredAt:s(null==n?void 0:n.revalidate)};yield o.set(e,l),a=i}else if("network-first"===n.strategy){let i;try{i=yield fetch(t,r);const l={response:i.clone(),expiredAt:s(null==n?void 0:n.revalidate)};yield o.set(e,l),a=i}catch(t){if(!(o.has(e)&&o.get(e).expiredAt>Date.now()))throw new Error(`Network fetch failed and no cache available: ${t}`);a=o.get(e).response.clone()}}else"stale-while-revalidate"===n.strategy&&(o.has(e)&&(a=o.get(e).response.clone()),fetch(t,r).then((t=>o.set(e,{response:t,expiredAt:s(null==n?void 0:n.revalidate)}))).catch((e=>{console.warn("Background revalidation failed:",e)})));if(!a)throw new Error("No valid response available.");return a}));export{r as default};