UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 5.62 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};