tinybase
Version:
A reactive data store and sync engine.
2 lines (1 loc) • 4.7 kB
JavaScript
import{Map as t}from"yjs";const e="t",n="v",a=t=>null==t,s=(t,e,n)=>a(t)?n?.():e(t),o=t=>Array.isArray(t),r=t=>t.length,i=t=>{throw Error(t)},c=(t,e)=>t.forEach(e),l=(t,...e)=>t.push(...e),g=t=>t.shift(),u=t=>a(t)||0==(t=>t?.size??0)(t),d=(t,e)=>t?.forEach(e),y=(t,e)=>t?.delete(e),p=Object,h=t=>p.getPrototypeOf(t),v=p.entries,w=p.keys,S=p.freeze,f=(t=[])=>p.fromEntries(t),C=(t,e)=>e in t,b=(t,e)=>f(((t,e)=>((t,e)=>t.map(e))(v(t),(([t,n])=>e(n,t))))(t,((t,n)=>[n,e(t,n)]))),A=t=>(t=>!a(t)&&s(h(t),(t=>t==p.prototype||a(h(t))),(()=>!0)))(t)&&0==(t=>r(w(t)))(t),M=(t,e,n)=>(C(t,e)||(t[e]=n()),t[e]),O=t=>new Map(t),L=(t,e)=>t?.get(e),J=(t,e)=>d(t,((t,n)=>e(n,t))),N=(t,e,n)=>a(n)?(y(t,e),t):t?.set(e,n),z=(t,e,n,a)=>{var s,o;return s=t,o=e,s?.has(o)?a?.(L(t,e)):N(t,e,n()),L(t,e)},D=(t,e,n,a,o=0)=>s((n?z:L)(t,e[o],o>r(e)-2?n:O),(s=>{if(o>r(e)-2)return a?.(s)&&N(t,e[o]),s;const i=D(s,e,n,a,o+1);return u(s)&&N(t,e[o]),i})),E=/^\d+$/,m=t=>new Set(o(t)||a(t)?t:[t]),T=O(),j=O(),k=(t,e,n,p,h,v,w,f={},C=0,b=[])=>{let M,J,k,P=0,x=0,F=0;z(T,b,(()=>0)),z(j,b,(()=>[]));const Y=O(),[$,q,B,G,H]=((t=1,e,n)=>1!=t&&e.isMergeable()?[1,e.getMergeableContent,()=>e.getTransactionMergeableChanges(!n),([[t],[e]])=>!A(t)||!A(e),e.setDefaultContent]:2!=t?[0,e.getContent,e.getTransactionChanges,([t,e])=>!A(t)||!A(e),e.setContent]:i("Store type not supported by this Persister"))(w,t,C),[I,K,Q]=(()=>{let t;const[e,n]=(()=>{const t=[];let e=0;return[n=>(n?g(t):null)??""+e++,e=>{E.test(e)&&r(t)<1e3&&l(t,e)}]})(),o=O();return[(n,a,s,r=[],i=()=>[])=>{t??=tt;const c=e(1);var l,g;return N(o,c,[n,a,s,r,i]),l=D(a,s??[""],m),g=c,l?.add(g),c},(e,n,...a)=>c(((t,e=[""])=>{const n=[],a=(t,s)=>s==r(e)?l(n,t):null===e[s]?d(t,(t=>a(t,s+1))):c([e[s],null],(e=>a(L(t,e),s+1)));return a(t,0),n})(e,n),(e=>d(e,(e=>L(o,e)[0](t,...n??[],...a))))),t=>s(L(o,t),(([,e,a])=>(D(e,a??[""],void 0,(e=>(y(e,t),u(e)?1:0))),N(o,t),n(t),a))),e=>s(L(o,e),(([e,,n=[],s,o])=>{const i=(...l)=>{const g=r(l);g==r(n)?e(t,...l,...o(l)):a(n[g])?c(s[g]?.(...l)??[],(t=>i(...l,t))):i(...l,n[g])};i()}))]})(),R=t=>{t!=P&&(P=t,K(Y,void 0,P))},U=e=>{($&&o(e?.[0])?1===e?.[2]?t.applyMergeableChanges:t.setMergeableContent:1===e?.[2]?t.applyChanges:t.setContent)(e)},V=async t=>(2!=P&&(R(1),x++,await _((async()=>{try{const n=await e();o(n)?U(n):t?H(t):i("Content is not an array: "+n)}catch(e){v?.(e),t&&H(t)}R(0)}))),tt),W=()=>(J&&(h(J),J=void 0),tt),X=async t=>(1!=P&&(R(2),F++,await _((async()=>{try{await n(q,t)}catch(t){v?.(t)}R(0)}))),tt),Z=()=>(k&&(t.delListener(k),k=void 0),tt),_=async(...t)=>(l(L(j,b),...t),await(async()=>{if(!L(T,b)){for(N(T,b,1);!a(M=g(L(j,b)));)try{await M()}catch(t){v?.(t)}N(T,b,0)}})(),tt),tt={load:V,startAutoLoad:async t=>{W(),await V(t);try{J=await p((async(t,e)=>{e||t?2!=P&&(R(1),x++,U(e??t),R(0)):await V()}))}catch(t){v?.(t)}return tt},stopAutoLoad:W,isAutoLoading:()=>!a(J),save:X,startAutoSave:async()=>(Z(),await X(),k=t.addDidFinishTransactionListener((()=>{const t=B();G(t)&&X(t)})),tt),stopAutoSave:Z,isAutoSaving:()=>!a(k),getStatus:()=>P,addStatusListener:t=>I(t,Y),delListener:e=>(Q(e),t),schedule:_,getStore:()=>t,destroy:()=>(L(j,b).splice(0,void 0),W().stopAutoSave()),getStats:()=>({loads:x,saves:F}),...f};return S(tt)},P="delete",x=t=>[t.get(e),t.get(n)],F=(e,n,s,o)=>{const r=a(n)?e:e.get(n)??e.set(n,new t);let i;return b(s,((t,e)=>{o(r,e,t)&&(i=1)})),r.forEach(((t,e)=>{C(s,e)||(r.delete(e),i=1)})),a(n)||r.size||e.delete(n),i},Y=(o,i,l="tinybase",u)=>{const d=i.getMap(l);return k(o,(async()=>d.size?[d.get(e).toJSON(),d.get(n).toJSON()]:void 0),(async(o,r)=>i.transact((()=>((o,r,i)=>{o.size||(o.set(e,new t),o.set(n,new t));const[c,l]=x(o),g=()=>{u=1};let u=1;if(s(i,(([t,e])=>{u=0,b(t,((t,e)=>u?0:a(t)?c.delete(e):s(c.get(e),(e=>b(t,((t,n)=>u?0:a(t)?e.delete(n):s(e.get(n),(e=>b(t,((t,n)=>a(t)?e.delete(n):e.set(n,t)))),g)))),g))),b(e,((t,e)=>u?0:a(t)?l.delete(e):l.set(e,t)))})),u){const[t,e]=r();F(c,void 0,t,((t,e,n)=>F(c,e,n,((t,e,n)=>F(t,e,n,((t,e,n)=>{if(t.get(e)!==n)return t.set(e,n),1})))))),F(l,void 0,e,((t,e,n)=>{l.get(e)!==n&&l.set(e,n)}))}})(d,o,r)))),(t=>{const a=a=>t(void 0,((t,a)=>{if(1==r(a)&&(o=a[0].path,0==r(o)))return[t.get(e).toJSON(),t.get(n).toJSON(),1];var o;const[i,l]=x(t),u={},d={};return c(a,(({path:t,changes:{keys:n}})=>g(t)==e?s(g(t),(e=>{const a=M(u,e,f),o=i.get(e);s(g(t),(t=>{const e=M(a,t,f),s=o.get(t);J(n,((t,{action:n})=>e[t]=n==P?null:s.get(t)))}),(()=>J(n,((t,{action:e})=>a[t]=e==P?null:o.get(t)?.toJSON()))))}),(()=>J(n,((t,{action:e})=>u[t]=e==P?null:i.get(t)?.toJSON())))):J(n,((t,{action:e})=>d[t]=e==P?null:l.get(t))))),[u,d,1]})(d,a));return d.observeDeep(a),a}),(t=>{d.unobserveDeep(t)}),u,1,{getYDoc:()=>i})};export{Y as createYjsPersister};