UNPKG

tinybase

Version:

A reactive data store and sync engine.

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