UNPKG

tinybase

Version:

A reactive data store and sync engine.

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