UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 5.67 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=t=>new Map(t),z=(t,e)=>t?.get(e),R=(t,e,a)=>c(a)?(C(t,e),t):t?.set(e,a),V=(t,e,a,n)=>{var s,r;return s=t,r=e,s?.has(r)?n?.(z(t,e)):R(t,e,a()),z(t,e)},O=(t,e,a,n,s=0)=>u((a?V:z)(t,e[s],s>d(e)-2?a:E),r=>{if(s>d(e)-2)return n?.(r)&&R(t,e[s]),r;const o=O(r,e,a,n,s+1);return b(r)&&R(t,e[s]),o}),$=t("-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz"),j=n.crypto?t=>n.crypto.getRandomValues(t):t=>(t=>t.map(()=>o(256*r.random())))(t),k=(t=16)=>{return e=(t,e)=>t+$[63&e],j(new Uint8Array(t)).reduce(e,"");var e},x=(t,e)=>e?[t,e]:[t],F=(t,e)=>((t??"")>(e??"")?t:e)??"",N=(t="")=>x(((t=[])=>A.fromEntries(t))(),t),U=/^\d+$/,q=t=>new Set(y(t)||c(t)?t:[t]),B=E(),G=E(),I=(t,e,a,n,s,r,o,i={},g=0,A=[])=>{let S,m,L,H=0,D=0,$=0;V(B,A,()=>0),V(G,A,()=>[]);const j=E(),[k,x,F,N,I]=((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=>{U.test(e)&&d(t)<1e3&&f(t,e)}]})(),n=E();return[(a,s,r,o=[],i=()=>[])=>{t??=rt;const c=e(1);var l,g;return R(n,c,[a,s,r,o,i]),l=O(s,r??[""],q),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(z(t,e),s+1));return n(t,0),a})(e,a),e=>M(e,e=>z(n,e)[0](t,...a??[],...s))),t=>u(z(n,t),([,e,s])=>(O(e,s??[""],void 0,e=>(C(e,t),b(e)?1:0)),R(n,t),a(t),s)),e=>u(z(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 t=>(2!=H&&(W(1),D++,await st(async()=>{await h(async()=>{const a=await e();y(a)?X(a):t?I(t):w("Content is not an array: "+a)},()=>{t&&I(t)}),W(0)})),rt),Z=async t=>(_(),await Y(t),await h(async()=>m=await n(async(t,e)=>{e||t?2!=H&&(W(1),D++,X(e??t),W(0)):await Y()}),r),rt),_=async()=>(m&&(await h(()=>s(m),r),m=void 0),rt),tt=async t=>(1!=H&&(W(2),$++,await st(async()=>{await h(()=>a(x,t),r),W(0)})),rt),et=async()=>(at(),await tt(),L=t.addDidFinishTransactionListener(()=>{const t=F();N(t)&&tt(t)}),rt),at=async()=>(L&&(t.delListener(L),L=void 0),rt),nt=async(t=!1)=>{const[e,a]=t?[at,_]:[_,at];return await e(),await a(),rt},st=async(...t)=>(f(z(G,A),...t),await(async()=>{if(!z(B,A)){for(R(B,A,1);!c(S=v(z(G,A)));)await h(S,r);R(B,A,0)}})(),rt),rt={load:Y,startAutoLoad:Z,stopAutoLoad:_,isAutoLoading:()=>!c(m),save:tt,startAutoSave:et,stopAutoSave:at,isAutoSaving:()=>!c(L),startAutoPersisting:async(t,e=!1)=>{const[a,n]=e?[et,Z]:[Z,et];return await a(t),await n(t),rt},stopAutoPersisting:nt,getStatus:()=>H,addStatusListener:t=>J(t,j),delListener:e=>(Q(e),t),schedule:st,getStore:()=>t,destroy:()=>(z(G,A).splice(0,void 0),nt()),getStats:()=>({loads:D,saves:$}),...i};return T(rt)},J=E(),K=(t,a,n,r)=>{const o=k();return((t,a,n,r,o,i,g,y,d={})=>{let w,p=0,f=0,v=0;const b=E(),M=()=>k(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+"."+k(4),l=s(()=>{C(b,c),i(`No response from ${t??"anyone"} to ${c}, `+a)},o);R(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,N);H(e,([t,e],a)=>{const n=D(s[0],a,N);H(t,([t,e],a)=>n[0][a]=x(t,e)),n[1]=F(n[1],e)}),s[1]=F(s[1],a)}),t[1]=F(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=N();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?N():(await S(e,7,t.getMergeableValueHashes(),n))[0],1]},y),T=I(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(z(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(J,(t,e)=>s(e,t))):z(J,t)?.(o,e,a,n);var s}),t=>{R(J,o,t)},()=>{C(J,o)},.01,a,n,r)};export{K as createLocalSynchronizer};