UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 4.36 kB
const t=t=>(e,a,n)=>t(e)?n?.():a(e),e=t=>null==t,a=t=>void 0===t,n=t=>null===t,s=t(e),r=t(a),o=t=>Array.isArray(t),i=t=>t.length,c=t=>{throw Error(t)},u=async(t,e,a)=>{try{return await t()}catch(t){e?.(t)}},d=(t,e)=>t.forEach(e),l=(t,...e)=>t.push(...e),y=t=>t.shift(),g=Object,w=t=>g.getPrototypeOf(t),h=g.entries,v=g.keys,p=g.freeze,f=(t=[])=>g.fromEntries(t),C=(t,e)=>r(t,t=>t[e]),A=(t,e)=>e in t,S=(t,e)=>(delete t[e],t),b=(t,e)=>f(((t,e)=>((t,e)=>t.map(e))(h(t),([t,a])=>e(a,t)))(t,(t,a)=>[a,e(t,a)])),L=t=>i(v(t)),M=t=>(t=>!e(t)&&s(w(t),t=>t==g.prototype||e(w(t)),()=>!0))(t)&&0==L(t),E=(t,e,a)=>(A(t,e)||(t[e]=a()),t[e]),P=t=>a(t)||0==(t=>t?.size??0)(t),m=(t,e)=>t?.forEach(e),D=(t,e)=>t?.delete(e),T=t=>new Map(t),z=(t,e)=>t?.get(e),O=(t,e,n)=>a(n)?(D(t,e),t):t?.set(e,n),j=(t,e,a,n)=>{var s,r;return s=t,r=e,s?.has(r)?n?.(z(t,e)):O(t,e,a()),z(t,e)},k=(t,e,a,n,s=0)=>r((a?j:z)(t,e[s],s>i(e)-2?a:T),r=>{if(s>i(e)-2)return n?.(r)&&O(t,e[s]),r;const o=k(r,e,a,n,s+1);return P(r)&&O(t,e[s]),o}),x=/^\d+$/,F=t=>new Set(o(t)||a(t)?t:[t]),H=T(),$=T(),q=(t,e,s,g,w,h,v,f={},C=0,A=[])=>{let S,b,L,E=0,q=0,B=0;j(H,A,()=>0),j($,A,()=>[]);const G=T(),[I,J,K,N,Q]=((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]:c("Store type not supported by this Persister"))(v,t,C),[R,U,V]=(()=>{let t;const[e,a]=(()=>{const t=[];let e=0;return[a=>(a?y(t):null)??""+e++,e=>{x.test(e)&&i(t)<1e3&&l(t,e)}]})(),s=T();return[(a,n,r,o=[],i=()=>[])=>{t??=rt;const c=e(1);var u,d;return O(s,c,[a,n,r,o,i]),u=k(n,r??[""],F),d=c,u?.add(d),c},(e,a,...r)=>d(((t,e=[""])=>{const a=[],s=(t,r)=>r==i(e)?l(a,t):n(e[r])?m(t,t=>s(t,r+1)):d([e[r],null],e=>s(z(t,e),r+1));return s(t,0),a})(e,a),e=>m(e,e=>z(s,e)[0](t,...a??[],...r))),t=>r(z(s,t),([,e,n])=>(k(e,n??[""],void 0,e=>(D(e,t),P(e)?1:0)),O(s,t),a(t),n)),e=>r(z(s,e),([e,,a=[],s,r])=>{const o=(...c)=>{const u=i(c);u==i(a)?e(t,...c,...r(c)):n(a[u])?d(s[u]?.(...c)??[],t=>o(...c,t)):o(...c,a[u])};o()})]})(),W=t=>{t!=E&&(E=t,U(G,void 0,E))},X=e=>{(I&&o(e?.[0])?1===e?.[2]?t.applyMergeableChanges:t.setMergeableContent:1===e?.[2]?t.applyChanges:t.setContent)(e)},Y=async t=>(2!=E&&(W(1),q++,await st(async()=>{await u(async()=>{const a=await e();o(a)?X(a):t?Q(t):c("Content is not an array: "+a)},()=>{t&&Q(t)}),W(0)})),rt),Z=async t=>(_(),await Y(t),await u(async()=>b=await g(async(t,e)=>{e||t?2!=E&&(W(1),q++,X(e??t),W(0)):await Y()}),h),rt),_=async()=>(b&&(await u(()=>w(b),h),b=void 0),rt),tt=async t=>(1!=E&&(W(2),B++,await st(async()=>{await u(()=>s(J,t),h),W(0)})),rt),et=async()=>(at(),await tt(),L=t.addDidFinishTransactionListener(()=>{const t=K();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)=>(l(z($,A),...t),await(async()=>{if(!z(H,A)){for(O(H,A,1);!a(S=y(z($,A)));)await u(S,h);O(H,A,0)}})(),rt),rt={load:Y,startAutoLoad:Z,stopAutoLoad:_,isAutoLoading:()=>!a(b),save:tt,startAutoSave:et,stopAutoSave:at,isAutoSaving:()=>!a(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:()=>E,addStatusListener:t=>R(t,G),delListener:e=>(V(e),t),schedule:st,getStore:()=>t,destroy:()=>(z($,A).splice(0,void 0),nt()),getStats:()=>({loads:q,saves:B}),...f};return p(rt)},B=(t,e)=>[t[e].t,t[e].v],G=(t,e,n,s)=>{const r=a(e)?t:E(t,e,()=>({}));let o;return b(n,(t,e)=>{s(r,e,t)&&(o=1)}),b(r,(t,e)=>{A(n,e)||(S(r,e),o=1)}),!a(e)&&M(r)&&S(t,e),o},I=(t,e,n="tinybase",s)=>(e.change(t=>E(t,n,f)),q(t,async()=>{const t=e.doc();return 2==L(t?.[n])?B(t,n):void 0},async(t,s)=>e.change(e=>((t,e,n,s)=>{((t,e)=>{M(t[e])&&(t[e]={t:{},v:{}})})(t,e);const[o,i]=B(t,e),c=()=>{u=1};let u=1;if(r(s,([t,e])=>{u=0,b(t,(t,e)=>u?0:a(t)?S(o,e):r(o[e],e=>b(t,(t,n)=>u?0:a(t)?S(e,n):r(C(e,n),e=>b(t,(t,n)=>a(t)?S(e,n):e[n]=t),c)),c)),b(e,(t,e)=>u?0:a(t)?S(i,e):i[e]=t)}),u){const[t,e]=n();G(o,void 0,t,(t,e,a)=>G(o,e,a,(t,e,a)=>G(t,e,a,(t,e,a)=>{if(C(t,e)!==a)return t[e]=a,1}))),G(i,void 0,e,(t,e,a)=>{C(i,e)!==a&&(i[e]=a)})}})(e,n,t,s)),t=>{const a=({doc:e})=>t(B(e,n));return e.on("change",a),a},t=>{e.removeListener("change",t)},s,1,{getDocHandle:()=>e}));export{I as createAutomergePersister};