UNPKG

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.65 kB
import{_ as e}from"./index-CYMT_vcm.js";import{g as t}from"./common.util-DAI6ETz-.js";import r from"fs";import s from"path";class i{constructor(e="cache"){this.baseDir=s.resolve(e),r.existsSync(this.baseDir)||r.mkdirSync(this.baseDir,{recursive:!0})}getFilePath(e){return s.resolve(this.baseDir,`${e}.json`)}set(e,t){r.writeFileSync(this.getFilePath(e),JSON.stringify(t))}get(e){try{const t=r.readFileSync(this.getFilePath(e),"utf8");return JSON.parse(t)}catch(e){return null}}has(e){return r.existsSync(this.getFilePath(e))}delete(e){const t=this.getFilePath(e);r.existsSync(t)&&r.unlinkSync(t)}clear(){const e=r.readdirSync(this.baseDir);for(const t of e)t.endsWith(".json")&&r.unlinkSync(s.join(this.baseDir,t))}}let n=null;const o=(r,s,o)=>e(void 0,void 0,void 0,(function*(){const e=btoa(r);if(!n){const e=(null==o?void 0:o.folderName)||"cache-kit-data";n=new i(e)}let a;if("cache-first"===o.strategy){if(n.has(e)){const t=n.get(e);if(t.expiredAt>Date.now())return t.response.clone()}const i=yield fetch(r,s);return n.set(e,{response:i.clone(),expiredAt:t(o.revalidate)}),i}if("network-first"===o.strategy)try{const i=yield fetch(r,s);return n.set(e,{response:i.clone(),expiredAt:t(o.revalidate)}),i}catch(t){if(n.has(e)){const t=n.get(e);if(t.expiredAt>Date.now())return t.response.clone()}throw new Error("Network failed and no valid cache found")}else if("stale-while-revalidate"===o.strategy){if(n.has(e)){a=n.get(e).response.clone()}return fetch(r,s).then((r=>{n.set(e,{response:r,expiredAt:t(o.revalidate)})})).catch((e=>{console.warn("Revalidation failed:",e)})),a}throw new Error("No valid response available.")}));export{o as default};