tinybase
Version:
A reactive data store and sync engine.
2 lines (1 loc) • 4.45 kB
JavaScript
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,d=()=>{},l=t=>{throw Error(t)},g=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=Map,z=t=>new x(t),D=(t,a)=>t?.get(a),J=(t,a,e)=>s(e)?(T(t,a),t):t?.set(a,e),N=(t,a,e,n)=>{var s,r;return s=t,r=a,s?.has(r)?n?.(D(t,a)):J(t,a,e()),D(t,a)},j=(t,a,e,n,s=0)=>i((e?N:D)(t,a[s],s>y(a)-2?e:z),r=>{if(s>y(a)-2)return n?.(r)&&J(t,a[s]),r;const o=j(r,a,e,n,s+1);return O(r)&&J(t,a[s]),o}),k=(t,a,e)=>{a>t[1]&&(t[1]=a),t[2]=e>>>0},F=/^\d+$/,W=t=>new Set(c(t)||s(t)?t:[t]),$=z(),m=z(),q=(t,a,e,n,o,u,d,v={},f=0,S=[])=>{let C,b,M,E=0,x=0,k=0;N($,S,()=>0),N(m,S,()=>[]);const q=z(),[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]:l("Store type not supported by this Persister"))(d,t,f),[Q,R,U]=(()=>{let t;const[a,e]=(()=>{const t=[];let a=0;return[e=>(e?h(t):null)??""+a++,a=>{F.test(a)&&y(t)<1e3&&p(t,a)}]})(),n=z();return[(e,s,r,o=[],i=()=>[])=>{t??=it;const c=a(1);var u,y;return J(n,c,[e,s,r,o,i]),u=j(s,r??[""],W),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(D(t,a),s+1));return n(t,0),e})(a,e),a=>P(a,a=>D(n,a)[0](t,...e??[],...s))),t=>i(D(n,t),([,a,s])=>(j(a,s??[""],void 0,a=>(T(a,t),O(a)?1:0)),J(n,t),e(t),s)),a=>i(D(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()=>{st()&&t.hadMutated?.()&&await at()},Z=async t=>(2!=E&&(V(1),x++,await ot(async()=>{await g(async()=>{const e=await a();c(e)?X(e):t?K(t):l("Content is not an array: "+e)},()=>{t&&K(t)}),V(0),await Y()})),it),_=async t=>(tt(),await Z(t),await g(async()=>b=await n(async(t,a)=>{a||t?2!=E&&(V(1),x++,X(a??t),V(0),await Y()):await Z()}),u),it),tt=async()=>(b&&(await g(()=>o(b),u),b=void 0),it),at=async t=>(1!=E&&(V(2),k++,await ot(async()=>{await g(()=>e(G,t),u),V(0)})),it),et=async()=>(nt(),await at(),M=t.addDidFinishTransactionListener(()=>{const t=H();I(t)&&at(t)}),it),nt=async()=>(M&&(t.delListener(M),M=void 0),it),st=()=>!s(M),rt=async(t=!1)=>{const[a,e]=t?[nt,tt]:[tt,nt];return await a(),await e(),it},ot=async(...t)=>(p(D(m,S),...t),await(async()=>{if(!D($,S)){for(J($,S,1);!s(C=h(D(m,S)));)await g(C,u);J($,S,0)}})(),it),it={load:Z,startAutoLoad:_,stopAutoLoad:tt,isAutoLoading:()=>!s(b),save:at,startAutoSave:et,stopAutoSave:nt,isAutoSaving:st,startAutoPersisting:async(t,a=!1)=>{const[e,n]=a?[et,_]:[_,et];return await e(t),await n(t),it},stopAutoPersisting:rt,getStatus:()=>E,addStatusListener:t=>Q(t,q),delListener:a=>(U(a),t),schedule:ot,getStore:()=>t,destroy:()=>(D(m,S).splice(0,void 0),rt()),getStats:()=>({loads:x,saves:k}),...v};return A(it)},B=()=>[{},"",0],G=(e,n,r="",o)=>{const c=(t,...a)=>r+t+u(E(a,(t,a)=>s(a)?"":a),1,-1);return q(e,async()=>{const e=[{},"",0],s=[{},"",0];return(await n.list({prefix:r})).forEach(async([n,o,c],d)=>i((e=>{if(n=r,e.startsWith(n)){const n=u(e,y(r),y(r)+1);return n==t||n==a?[n,...JSON.parse("["+u(e,y(r)+1)+"]")]:void 0}var n})(d),([r,...u])=>r==t?i(u[0],t=>{const a=M(e[0],t,B);i(u[1],t=>{const e=M(a[0],t,B);i(u[2],t=>e[0][t]=[n,o,c],()=>k(e,o,c))},()=>k(a,o,c))},()=>k(e,o,c)):r==a?i(u[0],t=>s[0][t]=[n,o,c],()=>k(s,o,c)):0)),L(e[0])&&L(s[0])?void 0:[e,s]},async(e,[[s,r,o],[i,u,y]]=e())=>{const d=z();J(d,c(t),[0,r,o]),b(s,([a,e,n],s)=>{J(d,c(t,s),[0,e,n]),b(a,([a,e,n],r)=>{J(d,c(t,s,r),[0,e,n]),b(a,(a,e)=>J(d,c(t,s,r,e),a))})}),J(d,c(a),[0,u,y]),b(i,(t,e)=>J(d,c(a,e),t)),await n.put((t=>{const a={};return P(t,(t,e)=>{{const n=t;a[e]=n}}),a})(d))},d,d,o,2,{getStorage:()=>n})};export{G as createDurableObjectStoragePersister};