UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 5.71 kB
const t=(t,e="",a)=>t.split(e,a),e=Promise,a=globalThis,n=(t,e=0)=>setTimeout(t,1e3*e),s=Math,r=s.floor,o=t=>null==t,i=(t,e,a)=>o(t)?a?.():e(t),c=t=>Array.isArray(t),l=t=>t.length,g=t=>{throw Error(t)},u=async(t,e,a)=>{try{return await t()}catch(t){e?.(t)}},y=(t,e)=>t.forEach(e),d=(t,...e)=>t.push(...e),w=t=>t.shift(),h=t=>o(t)||0==(t=>t?.size??0)(t),p=(t,e)=>t?.forEach(e),f=(t,e)=>t?.delete(e),v=Object,b=t=>v.getPrototypeOf(t),M=v.entries,C=v.keys,A=v.freeze,S=(t,e)=>y(M(t),(([t,a])=>e(a,t))),m=t=>(t=>!o(t)&&i(b(t),(t=>t==v.prototype||o(b(t))),(()=>!0)))(t)&&0==(t=>l(C(t)))(t),L=(t,e,a)=>(((t,e)=>e in t)(t,e)||(t[e]=a()),t[e]),T=t=>new Map(t),H=(t,e)=>t?.get(e),P=(t,e,a)=>o(a)?(f(t,e),t):t?.set(e,a),D=(t,e,a,n)=>{var s,r;return s=t,r=e,s?.has(r)?n?.(H(t,e)):P(t,e,a()),H(t,e)},E=(t,e,a,n,s=0)=>i((a?D:H)(t,e[s],s>l(e)-2?a:T),(r=>{if(s>l(e)-2)return n?.(r)&&P(t,e[s]),r;const o=E(r,e,a,n,s+1);return h(r)&&P(t,e[s]),o})),z=t("-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"),R=a.crypto?t=>a.crypto.getRandomValues(t):t=>(t=>t.map((()=>r(256*s.random()))))(t),V=(t=16)=>{return e=(t,e)=>t+z[63&e],R(new Uint8Array(t)).reduce(e,"");var e},O=(t,e)=>e?[t,e]:[t],$=(t,e)=>((t??"")>(e??"")?t:e)??"",j=(t="")=>O(((t=[])=>v.fromEntries(t))(),t),k=/^\d+$/,x=t=>new Set(c(t)||o(t)?t:[t]),F=T(),N=T(),U=(t,e,a,n,s,r,v,b={},M=0,C=[])=>{let S,L,z,R=0,V=0,O=0;D(F,C,(()=>0)),D(N,C,(()=>[]));const $=T(),[j,U,q,B,G]=((t=1,e,a)=>1!=t&&e.isMergeable()?[1,e.getMergeableContent,()=>e.getTransactionMergeableChanges(!a),([[t],[e]])=>!m(t)||!m(e),e.setDefaultContent]:2!=t?[0,e.getContent,e.getTransactionChanges,([t,e])=>!m(t)||!m(e),e.setContent]:g("Store type not supported by this Persister"))(v,t,M),[I,J,K]=(()=>{let t;const[e,a]=(()=>{const t=[];let e=0;return[a=>(a?w(t):null)??""+e++,e=>{k.test(e)&&l(t)<1e3&&d(t,e)}]})(),n=T();return[(a,s,r,o=[],i=()=>[])=>{t??=st;const c=e(1);var l,g;return P(n,c,[a,s,r,o,i]),l=E(s,r??[""],x),g=c,l?.add(g),c},(e,a,...s)=>y(((t,e=[""])=>{const a=[],n=(t,s)=>s==l(e)?d(a,t):null===e[s]?p(t,(t=>n(t,s+1))):y([e[s],null],(e=>n(H(t,e),s+1)));return n(t,0),a})(e,a),(e=>p(e,(e=>H(n,e)[0](t,...a??[],...s))))),t=>i(H(n,t),(([,e,s])=>(E(e,s??[""],void 0,(e=>(f(e,t),h(e)?1:0))),P(n,t),a(t),s))),e=>i(H(n,e),(([e,,a=[],n,s])=>{const r=(...i)=>{const c=l(i);c==l(a)?e(t,...i,...s(i)):o(a[c])?y(n[c]?.(...i)??[],(t=>r(...i,t))):r(...i,a[c])};r()}))]})(),Q=t=>{t!=R&&(R=t,J($,void 0,R))},W=e=>{(j&&c(e?.[0])?1===e?.[2]?t.applyMergeableChanges:t.setMergeableContent:1===e?.[2]?t.applyChanges:t.setContent)(e)},X=async t=>(2!=R&&(Q(1),V++,await nt((async()=>{await u((async()=>{const a=await e();c(a)?W(a):t?G(t):g("Content is not an array: "+a)}),(()=>{t&&G(t)})),Q(0)}))),st),Y=async t=>(Z(),await X(t),await u((async()=>L=await n((async(t,e)=>{e||t?2!=R&&(Q(1),V++,W(e??t),Q(0)):await X()}))),r),st),Z=async()=>(L&&(await u((()=>s(L)),r),L=void 0),st),_=async t=>(1!=R&&(Q(2),O++,await nt((async()=>{await u((()=>a(U,t)),r),Q(0)}))),st),tt=async()=>(et(),await _(),z=t.addDidFinishTransactionListener((()=>{const t=q();B(t)&&_(t)})),st),et=async()=>(z&&(t.delListener(z),z=void 0),st),at=async(t=!1)=>{const[e,a]=t?[et,Z]:[Z,et];return await e(),await a(),st},nt=async(...t)=>(d(H(N,C),...t),await(async()=>{if(!H(F,C)){for(P(F,C,1);!o(S=w(H(N,C)));)await u(S,r);P(F,C,0)}})(),st),st={load:X,startAutoLoad:Y,stopAutoLoad:Z,isAutoLoading:()=>!o(L),save:_,startAutoSave:tt,stopAutoSave:et,isAutoSaving:()=>!o(z),startAutoPersisting:async(t,e=!1)=>{const[a,n]=e?[tt,Y]:[Y,tt];return await a(t),await n(t),st},stopAutoPersisting:at,getStatus:()=>R,addStatusListener:t=>I(t,$),delListener:e=>(K(e),t),schedule:nt,getStore:()=>t,destroy:()=>(H(N,C).splice(0,void 0),at()),getStats:()=>({loads:V,saves:O}),...b};return A(st)},q=T(),B=(t,a,s,r)=>{const c=V();return((t,a,s,r,c,l,g,y,d={})=>{let w,h=0,p=0,v=0;const b=T(),M=()=>V(11),C=(t,e,n,s)=>{p++,l?.(t,e,n,s),a(t,e,n,s)},A=async(t,a,s,r)=>new e(((e,o)=>{const i=r+"."+V(4),l=n((()=>{f(b,i),o(`No response from ${t??"anyone"} to ${i}, `+a)}),c);P(b,i,[t,(t,a)=>{clearTimeout(l),f(b,i),e([t,a,r])}]),C(t,i,a,s)})),D=(t,[e,a])=>{S(e,(([e,a],n)=>{const s=L(t[0],n,j);S(e,(([t,e],a)=>{const n=L(s[0],a,j);S(t,(([t,e],a)=>n[0][a]=O(t,e))),n[1]=$(n[1],e)})),s[1]=$(s[1],a)})),t[1]=$(t[1],a)},E=(e=null,a,n=M())=>u((async()=>{o(a)&&([a,e,n]=await A(null,1,"",n));const[s,r]=a,[i,c]=t.getMergeableContentHashes();let l=j();if(i!=s){const[a,s]=(await A(e,4,t.getMergeableTableHashes(),n))[0];if(l=a,!m(s)){const[a,r]=(await A(e,5,t.getMergeableRowHashes(s),n))[0];if(D(l,a),!m(r)){const a=(await A(e,6,t.getMergeableCellHashes(r),n))[0];D(l,a)}}}return[l,c==r?j():(await A(e,7,t.getMergeableValueHashes(),n))[0],1]}),y),z=U(t,(async()=>{const t=await E();return!t||m(t[0][0])&&m(t[1][0])?void 0:t}),(async(e,a)=>a?C(null,M(),3,a):C(null,M(),2,t.getMergeableContentHashes())),(t=>w=t),(()=>w=void 0),y,2,{startSync:async t=>(h=1,await z.startAutoPersisting(t)),stopSync:async()=>(h=0,await z.stopAutoPersisting(),z),destroy:async()=>(await z.stopSync(),r(),z),getSynchronizerStats:()=>({sends:p,receives:v}),...d},1);return s(((e,a,n,s)=>{const r=h||z.isAutoLoading();v++,g?.(e,a,n,s),0==n?i(H(b,a),(([t,a])=>o(t)||t==e?a(s,e):0)):2==n&&r?E(e,s,a??void 0).then((t=>{w?.(void 0,t)})).catch(y):3==n&&r?w?.(void 0,s):i(1==n&&(h||z.isAutoSaving())?t.getMergeableContentHashes():4==n?t.getMergeableTableDiff(s):5==n?t.getMergeableRowDiff(s):6==n?t.getMergeableCellDiff(s):7==n?t.getMergeableValueDiff(s):void 0,(t=>{C(e,a,0,t)}))})),z})(t,((t,e,a,s)=>n((()=>{return o(t)?(n=(t,n)=>t!=c?n(c,e,a,s):0,p(q,((t,e)=>n(e,t)))):H(q,t)?.(c,e,a,s);var n}))),(t=>{P(q,c,t)}),(()=>{f(q,c)}),.01,a,s,r)};export{B as createLocalSynchronizer};