UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 4.37 kB
const t=Promise,e=t=>(e,a,n)=>t(e)?n?.():a(e),a=globalThis.window,n=clearInterval,s=t=>null==t,r=t=>void 0===t,o=t=>null===t,i=e(s),c=e(r),l=t=>Array.isArray(t),d=t=>t.length,u=e=>new t(e),y=async e=>t.all(e),w=t=>{throw Error(t)},g=async(t,e,a)=>{try{return await t()}catch(t){e?.(t)}},p=(t,e)=>t.forEach(e),v=(t,e)=>t.map(e),h=(t,...e)=>t.push(...e),b=t=>t.shift(),A=Object,S=t=>A.getPrototypeOf(t),C=A.entries,f=A.keys,L=A.freeze,M=t=>(t=>!s(t)&&i(S(t),t=>t==A.prototype||s(S(t)),()=>!0))(t)&&0==(t=>d(f(t)))(t),D=t=>r(t)||0==(t=>t?.size??0)(t),P=(t,e)=>t?.forEach(e),k=(t,e)=>t?.delete(e),j=Map,m=t=>new j(t),x=(t,e)=>t?.get(e),E=(t,e,a)=>r(a)?(k(t,e),t):t?.set(e,a),T=(t,e,a,n)=>{var s,r;return s=t,r=e,s?.has(r)?n?.(x(t,e)):E(t,e,a()),x(t,e)},B=(t,e,a,n,s=0)=>c((a?T:x)(t,e[s],s>d(e)-2?a:m),r=>{if(s>d(e)-2)return n?.(r)&&E(t,e[s]),r;const o=B(r,e,a,n,s+1);return D(r)&&E(t,e[s]),o}),O=/^\d+$/,z=t=>new Set(l(t)||r(t)?t:[t]),I=m(),$=m(),F=(t,e,a,n,s,i,u,y={},v=0,A=[])=>{let S,C,f,j=0,F=0,K=0;T(I,A,()=>0),T($,A,()=>[]);const N=m(),[q,G,H,J,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]:w("Store type not supported by this Persister"))(u,t,v),[R,U,V]=(()=>{let t;const[e,a]=(()=>{const t=[];let e=0;return[a=>(a?b(t):null)??""+e++,e=>{O.test(e)&&d(t)<1e3&&h(t,e)}]})(),n=m();return[(a,s,r,o=[],i=()=>[])=>{t??=it;const c=e(1);var l,d;return E(n,c,[a,s,r,o,i]),l=B(s,r??[""],z),d=c,l?.add(d),c},(e,a,...s)=>p(((t,e=[""])=>{const a=[],n=(t,s)=>s==d(e)?h(a,t):o(e[s])?P(t,t=>n(t,s+1)):p([e[s],null],e=>n(x(t,e),s+1));return n(t,0),a})(e,a),e=>P(e,e=>x(n,e)[0](t,...a??[],...s))),t=>c(x(n,t),([,e,s])=>(B(e,s??[""],void 0,e=>(k(e,t),D(e)?1:0)),E(n,t),a(t),s)),e=>c(x(n,e),([e,,a=[],n,s])=>{const r=(...i)=>{const c=d(i);c==d(a)?e(t,...i,...s(i)):o(a[c])?p(n[c]?.(...i)??[],t=>r(...i,t)):r(...i,a[c])};r()})]})(),W=t=>{t!=j&&(j=t,U(N,void 0,j))},X=e=>{(q&&l(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!=j&&(W(1),F++,await ot(async()=>{await g(async()=>{const a=await e();l(a)?X(a):t?Q(t):w("Content is not an array: "+a)},()=>{t&&Q(t)}),W(0),await Y()})),it),_=async t=>(tt(),await Z(t),await g(async()=>C=await n(async(t,e)=>{e||t?2!=j&&(W(1),F++,X(e??t),W(0),await Y()):await Z()}),i),it),tt=async()=>(C&&(await g(()=>s(C),i),C=void 0),it),et=async t=>(1!=j&&(W(2),K++,await ot(async()=>{await g(()=>a(G,t),i),W(0)})),it),at=async()=>(nt(),await et(),f=t.addDidFinishTransactionListener(()=>{const t=H();J(t)&&et(t)}),it),nt=async()=>(f&&(t.delListener(f),f=void 0),it),st=()=>!r(f),rt=async(t=!1)=>{const[e,a]=t?[nt,tt]:[tt,nt];return await e(),await a(),it},ot=async(...t)=>(h(x($,A),...t),await(async()=>{if(!x(I,A)){for(E(I,A,1);!r(S=b(x($,A)));)await g(S,i);E(I,A,0)}})(),it),it={load:Z,startAutoLoad:_,stopAutoLoad:tt,isAutoLoading:()=>!r(C),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:()=>j,addStatusListener:t=>R(t,N),delListener:e=>(V(e),t),schedule:ot,getStore:()=>t,destroy:()=>(x($,A).splice(0,void 0),rt()),getStats:()=>({loads:F,saves:K}),...y};return L(it)},K=["t","v"],N={keyPath:"k"},q=async(t,e)=>{const a=(e=>v(C(e),([e,a])=>G(t,"put",{k:e,v:a})))(e);v(await G(t,"getAllKeys"),n=>((t,e)=>e in t)(e,n)?0:h(a,G(t,"delete",n))),await y(a)},G=async(t,e,a)=>u((n,s)=>{const r=t[e](a);r.onsuccess=()=>n(r.result),r.onerror=()=>s(`objectStore.${e} error`)}),H=(t,e,s=1,r)=>{const o=async(t,n=[],s=0)=>u((r,o)=>{const i=(a?a.indexedDB:indexedDB).open(e,s?2:void 0);i.onupgradeneeded=()=>s&&v(K,t=>g(()=>i.result.createObjectStore(t,N))),i.onsuccess=()=>g(async()=>{const e=i.result.transaction(K,"readwrite"),a=await y(v(K,(a,s)=>t(e.objectStore(a),n[s])));i.result.close(),r(a)},t=>{i.result.close(),o(t)}),i.onerror=()=>o("indexedDB.open error")});return F(t,async()=>await o(async t=>((t=[])=>A.fromEntries(t))(v(await G(t,"getAll"),({k:t,v:e})=>[t,e]))),t=>o((t,e)=>q(t,e),t(),1),t=>setInterval(t,1e3*s),t=>n(t),r,1,{getDbName:()=>e})};export{H as createIndexedDbPersister,q as objectStoreMatch};