UNPKG

tinybase

Version:

A reactive data store and sync engine.

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