UNPKG

tinybase

Version:

A reactive data store and sync engine.

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