UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 4.39 kB
const t="t",a="v",e=t=>null==t,n=(t,a,n)=>e(t)?n?.():a(t),s=t=>Array.isArray(t),r=(t,a,e)=>t.slice(a,e),o=t=>t.length,i=()=>{},c=t=>{throw Error(t)},u=async(t,a,e)=>{try{return await t()}catch(t){a?.(t)}},y=(t,a)=>t.forEach(a),l=(t,...a)=>t.push(...a),g=t=>t.shift(),d=Object,w=t=>d.getPrototypeOf(t),p=d.entries,h=d.keys,v=d.freeze,f=(t,a)=>y(p(t),(([t,e])=>a(e,t))),S=t=>(t=>!e(t)&&n(w(t),(t=>t==d.prototype||e(w(t))),(()=>!0)))(t)&&0==(t=>o(h(t)))(t),C=(t,a,e)=>(((t,a)=>a in t)(t,a)||(t[a]=e()),t[a]),A=JSON.stringify,b=t=>e(t)||0==(t=>t?.size??0)(t),L=(t,a)=>t?.forEach(a),M=(t,a)=>t?.delete(a),E=t=>new Map(t),O=(t,a)=>t?.get(a),P=(t,a,n)=>e(n)?(M(t,a),t):t?.set(a,n),T=(t,a,e,n)=>{var s,r;return s=t,r=a,s?.has(r)?n?.(O(t,a)):P(t,a,e()),O(t,a)},x=(t,a,e,s,r=0)=>n((e?T:O)(t,a[r],r>o(a)-2?e:E),(n=>{if(r>o(a)-2)return s?.(n)&&P(t,a[r]),n;const i=x(n,a,e,s,r+1);return b(n)&&P(t,a[r]),i})),z=(t,a,e)=>{a>t[1]&&(t[1]=a),t[2]=e>>>0},D=/^\d+$/,J=t=>new Set(s(t)||e(t)?t:[t]),N=E(),j=E(),k=(t,a,r,i,d,w,p,h={},f=0,C=[])=>{let A,z,k,F=0,W=0,$=0;T(N,C,(()=>0)),T(j,C,(()=>[]));const m=E(),[q,B,G,H,I]=((t=1,a,e)=>1!=t&&a.isMergeable()?[1,a.getMergeableContent,()=>a.getTransactionMergeableChanges(!e),([[t],[a]])=>!S(t)||!S(a),a.setDefaultContent]:2!=t?[0,a.getContent,a.getTransactionChanges,([t,a])=>!S(t)||!S(a),a.setContent]:c("Store type not supported by this Persister"))(p,t,f),[K,Q,R]=(()=>{let t;const[a,s]=(()=>{const t=[];let a=0;return[e=>(e?g(t):null)??""+a++,a=>{D.test(a)&&o(t)<1e3&&l(t,a)}]})(),r=E();return[(e,n,s,o=[],i=()=>[])=>{t??=st;const c=a(1);var u,y;return P(r,c,[e,n,s,o,i]),u=x(n,s??[""],J),y=c,u?.add(y),c},(a,e,...n)=>y(((t,a=[""])=>{const e=[],n=(t,s)=>s==o(a)?l(e,t):null===a[s]?L(t,(t=>n(t,s+1))):y([a[s],null],(a=>n(O(t,a),s+1)));return n(t,0),e})(a,e),(a=>L(a,(a=>O(r,a)[0](t,...e??[],...n))))),t=>n(O(r,t),(([,a,e])=>(x(a,e??[""],void 0,(a=>(M(a,t),b(a)?1:0))),P(r,t),s(t),e))),a=>n(O(r,a),(([a,,n=[],s,r])=>{const i=(...c)=>{const u=o(c);u==o(n)?a(t,...c,...r(c)):e(n[u])?y(s[u]?.(...c)??[],(t=>i(...c,t))):i(...c,n[u])};i()}))]})(),U=t=>{t!=F&&(F=t,Q(m,void 0,F))},V=a=>{(q&&s(a?.[0])?1===a?.[2]?t.applyMergeableChanges:t.setMergeableContent:1===a?.[2]?t.applyChanges:t.setContent)(a)},X=async t=>(2!=F&&(U(1),W++,await nt((async()=>{await u((async()=>{const e=await a();s(e)?V(e):t?I(t):c("Content is not an array: "+e)}),(()=>{t&&I(t)})),U(0)}))),st),Y=async t=>(Z(),await X(t),await u((async()=>z=await i((async(t,a)=>{a||t?2!=F&&(U(1),W++,V(a??t),U(0)):await X()}))),w),st),Z=async()=>(z&&(await u((()=>d(z)),w),z=void 0),st),_=async t=>(1!=F&&(U(2),$++,await nt((async()=>{await u((()=>r(B,t)),w),U(0)}))),st),tt=async()=>(at(),await _(),k=t.addDidFinishTransactionListener((()=>{const t=G();H(t)&&_(t)})),st),at=async()=>(k&&(t.delListener(k),k=void 0),st),et=async(t=!1)=>{const[a,e]=t?[at,Z]:[Z,at];return await a(),await e(),st},nt=async(...t)=>(l(O(j,C),...t),await(async()=>{if(!O(N,C)){for(P(N,C,1);!e(A=g(O(j,C)));)await u(A,w);P(N,C,0)}})(),st),st={load:X,startAutoLoad:Y,stopAutoLoad:Z,isAutoLoading:()=>!e(z),save:_,startAutoSave:tt,stopAutoSave:at,isAutoSaving:()=>!e(k),startAutoPersisting:async(t,a=!1)=>{const[e,n]=a?[tt,Y]:[Y,tt];return await e(t),await n(t),st},stopAutoPersisting:et,getStatus:()=>F,addStatusListener:t=>K(t,m),delListener:a=>(R(a),t),schedule:nt,getStore:()=>t,destroy:()=>(O(j,C).splice(0,void 0),et()),getStats:()=>({loads:W,saves:$}),...h};return v(st)},F=()=>[{},"",0],W=(e,s,o="",c)=>{const u=(t,...a)=>o+t+r(A(a,((t,a)=>void 0===a?"":a)),1,-1);return k(e,(async()=>{const e=[{},"",0],i=[{},"",0];return(await s.list({prefix:o})).forEach((async([s,c,u],y)=>n((e=>{if(n=o,e.startsWith(n)){const n=r(e,o.length,1);return n==t||n==a?[n,...JSON.parse("["+r(e,o.length+1)+"]")]:void 0}var n})(y),(([r,...o])=>r==t?n(o[0],(t=>{const a=C(e[0],t,F);n(o[1],(t=>{const e=C(a[0],t,F);n(o[2],(t=>e[0][t]=[s,c,u]),(()=>z(e,c,u)))}),(()=>z(a,c,u)))}),(()=>z(e,c,u))):r==a?n(o[0],(t=>i[0][t]=[s,c,u]),(()=>z(i,c,u))):0)))),[e,i]}),(async(e,[[n,r,o],[i,c,y]]=e())=>{const l=E();P(l,u(t),[0,r,o]),f(n,(([a,e,n],s)=>{P(l,u(t,s),[0,e,n]),f(a,(([a,e,n],r)=>{P(l,u(t,s,r),[0,e,n]),f(a,((a,e)=>P(l,u(t,s,r,e),a)))}))})),P(l,u(a),[0,c,y]),f(i,((t,e)=>P(l,u(a,e),t))),await s.put((t=>{const a={};return L(t,((t,e)=>{{const n=t;a[e]=n}})),a})(l))}),i,i,c,2,{getStorage:()=>s})};export{W as createDurableObjectStoragePersister};