UNPKG

tinybase

Version:

A reactive data store and sync engine.

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