@enjoys/react-api
Version:
2 lines • 4.13 kB
JavaScript
var react=require('react'),jsxRuntime=require('react/jsx-runtime');var o=class{constructor(e="api-cache"){this.metaKey="cache://__meta__";this.cacheName=e;}async getCache(){return await caches.open(this.cacheName)}toCacheKey(e){return `${e}`}async loadMeta(){let a=await(await this.getCache()).match(this.metaKey);return a?await a.json():{}}async saveMeta(e){let a=await this.getCache(),t=new Response(JSON.stringify(e),{headers:{"Content-Type":"application/json"}});await a.put(this.metaKey,t);}async updateMeta(e,a){let t=await this.loadMeta();t[e]={key:e,createdAt:Date.now(),...a?{ttl:a}:{}},await this.saveMeta(t);}async isExpired(e){return e.ttl?Date.now()-e.createdAt>e.ttl*1e3:false}async put(e,a,t){let s=await this.getCache(),n=new Response(JSON.stringify(a),{headers:{"Content-Type":"application/json"}});await s.put(this.toCacheKey(String(e)),n),await this.updateMeta(String(e),t);}async get(e){let a=(await this.loadMeta())[String(e)];if(a&&await this.isExpired(a)){await this.delete(String(e));return}let s=await(await this.getCache()).match(this.toCacheKey(String(e)));if(s?.headers.get("Content-Type")?.includes("application/json"))return await s.json()}async putHTML(e,a,t){let s=await this.getCache(),n=new Response(a,{headers:{"Content-Type":"text/html"}});await s.put(this.toCacheKey(e),n),await this.updateMeta(e,t);}async getHTML(e){let a=(await this.loadMeta())[e];if(a&&await this.isExpired(a))return await this.delete(e),null;let s=await(await this.getCache()).match(this.toCacheKey(e));return s?await s.text():null}async putBlob(e,a,t){await(await this.getCache()).put(this.toCacheKey(e),new Response(a)),await this.updateMeta(e,t);}async getBlob(e){let a=(await this.loadMeta())[e];if(a&&await this.isExpired(a))return await this.delete(e),null;let s=await(await this.getCache()).match(this.toCacheKey(e));return s?await s.blob():null}async putArrayBuffer(e,a,t){await this.putBlob(e,new Blob([a]),t);}async getArrayBuffer(e){let a=await this.getBlob(e);return a?await a.arrayBuffer():null}async putFile(e,a,t){await this.putBlob(e,a,t);}async getFile(e){let a=await this.getBlob(e);return a?new File([a],e,{type:a.type}):null}async delete(e){await(await this.getCache()).delete(this.toCacheKey(e));let t=await this.loadMeta();delete t[e],await this.saveMeta(t);}async has(e){let a=await this.loadMeta();return a[e]&&await this.isExpired(a[e])?(await this.delete(e),false):!!await(await this.getCache()).match(this.toCacheKey(e))}async keys(){let e=await this.loadMeta();return Object.keys(e)}async select(e){let a=await this.loadMeta(),t=[];for(let[s,n]of Object.entries(a))await this.isExpired(n)||await e(s,n)&&t.push(s);return t}async clear(){await caches.delete(this.cacheName);}async size(){return (await this.keys()).length}};function p(){let r=react.createContext(void 0);return {CacheProvider:({namespace:t,children:s})=>{let n=new o;return jsxRuntime.jsx(r.Provider,{value:{cache:n,namespace:t||"api-cache-v1"},children:s})},useCacheStorage:()=>{let t=react.useContext(r);if(!t)throw new Error("useCacheStorage must be used within CacheProvider");let{cache:s,namespace:n}=t;return {put:(i,c,h)=>s.put(`${n}${String(i)}`,c,h),get:i=>s.get(`${n}${String(i)}`),delete:i=>s.delete(`${n}${String(i)}`),has:i=>s.has(`${n}${String(i)}`),keys:()=>s.select(i=>i.startsWith(n)),clear:()=>s.select(i=>i.startsWith(n)).then(i=>i.forEach(c=>s.delete(c))),size:()=>s.select(i=>i.startsWith(n)).then(i=>i.length),select:i=>s.select((c,h)=>c.startsWith(n)&&i(c,h))}}}}var {CacheProvider:f,useCacheStorage:b}=p();function T(r){return react.useMemo(()=>{let e=r?`${r}/`:"",a=new o;return {put:(t,s,n)=>a.put(e+t,s,n),get:t=>a.get(e+t),putFile:(t,s,n)=>a.putFile(e+t,s,n),getFile:t=>a.getFile(e+t),delete:t=>a.delete(e+t),has:t=>a.has(e+t),keys:()=>a.select(t=>t.startsWith(e)),clear:()=>a.select(t=>t.startsWith(e)).then(t=>t.forEach(s=>a.delete(s))),size:()=>a.select(t=>t.startsWith(e)).then(t=>t.length),select:t=>a.select((s,n)=>s.startsWith(e)&&t(s,n))}},[r])}
exports.CacheProvider=f;exports.CacheStorageUtil=o;exports.createCacheProvider=p;exports.useCacheStorage=b;exports.useCacheStorage2=T;
;