UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 3.83 kB
const t=t=>(a,e,n)=>t(a)?n?.():e(a),a=clearInterval,e=t=>null==t,n=t=>void 0===t,s=t=>null===t,r=t(e),o=t(n),i=t=>Array.isArray(t),c=t=>t.length,y=t=>{throw Error(t)},l=async(t,a,e)=>{try{return await t()}catch(t){a?.(t)}},u=(t,a)=>t.forEach(a),d=(t,...a)=>t.push(...a),w=t=>t.shift(),g=Object,h=t=>g.getPrototypeOf(t),p=g.keys,v=g.freeze,f=t=>(t=>!e(t)&&r(h(t),t=>t==g.prototype||e(h(t)),()=>!0))(t)&&0==(t=>c(p(t)))(t),C=JSON.stringify,S=JSON.parse,A=t=>n(t)||0==(t=>t?.size??0)(t),b=(t,a)=>t?.forEach(a),M=(t,a)=>t?.delete(a),L=Map,E=t=>new L(t),T=(t,a)=>t?.get(a),O=(t,a,e)=>n(e)?(M(t,a),t):t?.set(a,e),P=(t,a,e,n)=>{var s,r;return s=t,r=a,s?.has(r)?n?.(T(t,a)):O(t,a,e()),T(t,a)},m=(t,a,e,n,s=0)=>o((e?P:T)(t,a[s],s>c(a)-2?e:E),r=>{if(s>c(a)-2)return n?.(r)&&O(t,a[s]),r;const o=m(r,a,e,n,s+1);return A(r)&&O(t,a[s]),o}),D=/^\d+$/,j=t=>new Set(i(t)||n(t)?t:[t]),x=E(),z=E(),I=(t,a,e,r,g,h,p,C={},S=0,L=[])=>{let I,J,N,k=0,F=0,H=0;P(x,L,()=>0),P(z,L,()=>[]);const U=E(),[$,q,B,G,K]=((t=1,a,e)=>1!=t&&a.isMergeable()?[1,a.getMergeableContent,()=>a.getTransactionMergeableChanges(!e),([[t],[a]])=>!f(t)||!f(a),a.setDefaultContent]:2!=t?[0,a.getContent,a.getTransactionChanges,([t,a])=>!f(t)||!f(a),a.setContent]:y("Store type not supported by this Persister"))(p,t,S),[Q,R,V]=(()=>{let t;const[a,e]=(()=>{const t=[];let a=0;return[e=>(e?w(t):null)??""+a++,a=>{D.test(a)&&c(t)<1e3&&d(t,a)}]})(),n=E();return[(e,s,r,o=[],i=()=>[])=>{t??=it;const c=a(1);var y,l;return O(n,c,[e,s,r,o,i]),y=m(s,r??[""],j),l=c,y?.add(l),c},(a,e,...r)=>u(((t,a=[""])=>{const e=[],n=(t,r)=>r==c(a)?d(e,t):s(a[r])?b(t,t=>n(t,r+1)):u([a[r],null],a=>n(T(t,a),r+1));return n(t,0),e})(a,e),a=>b(a,a=>T(n,a)[0](t,...e??[],...r))),t=>o(T(n,t),([,a,s])=>(m(a,s??[""],void 0,a=>(M(a,t),A(a)?1:0)),O(n,t),e(t),s)),a=>o(T(n,a),([a,,e=[],n,r])=>{const o=(...i)=>{const y=c(i);y==c(e)?a(t,...i,...r(i)):s(e[y])?u(n[y]?.(...i)??[],t=>o(...i,t)):o(...i,e[y])};o()})]})(),W=t=>{t!=k&&(k=t,R(U,void 0,k))},X=a=>{($&&i(a?.[0])?1===a?.[2]?t.applyMergeableChanges:t.setMergeableContent:1===a?.[2]?t.applyChanges:t.setContent)(a)},Y=async()=>{st()&&t.hadMutated?.()&&await at()},Z=async t=>(2!=k&&(W(1),F++,await ot(async()=>{await l(async()=>{const e=await a();i(e)?X(e):t?K(t):y("Content is not an array: "+e)},()=>{t&&K(t)}),W(0),await Y()})),it),_=async t=>(tt(),await Z(t),await l(async()=>J=await r(async(t,a)=>{a||t?2!=k&&(W(1),F++,X(a??t),W(0),await Y()):await Z()}),h),it),tt=async()=>(J&&(await l(()=>g(J),h),J=void 0),it),at=async t=>(1!=k&&(W(2),H++,await ot(async()=>{await l(()=>e(q,t),h),W(0)})),it),et=async()=>(nt(),await at(),N=t.addDidFinishTransactionListener(()=>{const t=B();G(t)&&at(t)}),it),nt=async()=>(N&&(t.delListener(N),N=void 0),it),st=()=>!n(N),rt=async(t=!1)=>{const[a,e]=t?[nt,tt]:[tt,nt];return await a(),await e(),it},ot=async(...t)=>(d(T(z,L),...t),await(async()=>{if(!T(x,L)){for(O(x,L,1);!n(I=w(T(z,L)));)await l(I,h);O(x,L,0)}})(),it),it={load:Z,startAutoLoad:_,stopAutoLoad:tt,isAutoLoading:()=>!n(J),save:at,startAutoSave:et,stopAutoSave:nt,isAutoSaving:st,startAutoPersisting:async(t,a=!1)=>{const[e,n]=a?[et,_]:[_,et];return await e(t),await n(t),it},stopAutoPersisting:rt,getStatus:()=>k,addStatusListener:t=>Q(t,U),delListener:a=>(V(a),t),schedule:ot,getStore:()=>t,destroy:()=>(T(z,L).splice(0,void 0),rt()),getStats:()=>({loads:F,saves:H}),...C};return v(it)},J=t=>t.headers.get("ETag"),N=(t,e,n,r=5,o)=>{let i;return I(t,async()=>{const t=await fetch(e);return i=J(t),S(await t.text())},async t=>{return await fetch(n,{method:"POST",headers:{"Content-Type":"application/json"},body:(a=t(),C(a,(t,a)=>a instanceof Map?g.fromEntries([...a]):a))});var a},t=>setInterval(async()=>{const a=await fetch(e,{method:"HEAD"}),n=J(a);s(i)||s(n)||n==i||(i=n,t())},1e3*r),t=>a(t),o,1,{getUrls:()=>[e,n]})};export{N as createRemotePersister};