tinybase
Version:
A reactive data store and sync engine.
2 lines (1 loc) • 4.35 kB
JavaScript
const t=t=>typeof t,e="",a=t(e),s="message",n=t=>(e,a,s)=>t(e)?s?.():a(e),r=t=>null==t,o=t=>void 0===t,i=t=>null===t,c=n(r),d=n(o),y=e=>t(e)==a,u=t=>Array.isArray(t),l=t=>t.length,g=t=>{throw Error(t)},w=async(t,e,a)=>{try{return await t()}catch(t){e?.(t)}},p=(t,e)=>t.forEach(e),h=(t,e)=>t.map(e),v=(t,...e)=>t.push(...e),f=t=>t.shift(),C=Object,S=t=>C.getPrototypeOf(t),m=C.entries,A=t=>!r(t)&&c(S(t),t=>t==C.prototype||r(S(t)),()=>!0),L=C.keys,P=C.freeze,b=t=>A(t)&&0==(t=>l(L(t)))(t),M=JSON.stringify,E=JSON.parse,O=t=>""===t?void 0:u(t)?h(t,O):A(t)?((t,e)=>((t=[])=>C.fromEntries(t))(((t,e)=>h(m(t),([t,a])=>e(a,t)))(t,(t,a)=>[a,e(t,a)])))(t,O):t,T=t=>o(t)||0==(t=>t?.size??0)(t),j=(t,e)=>t?.forEach(e),k=(t,e)=>t?.delete(e),x=Map,z=t=>new x(t),D=(t,e)=>t?.get(e),J=(t,e,a)=>o(a)?(k(t,e),t):t?.set(e,a),N=(t,e,a,s)=>{var n,r;return n=t,r=e,n?.has(r)?s?.(D(t,e)):J(t,e,a()),D(t,e)},F=(t,e,a,s,n=0)=>d((a?N:D)(t,e[n],n>l(e)-2?a:z),r=>{if(n>l(e)-2)return s?.(r)&&J(t,e[n]),r;const o=F(r,e,a,s,n+1);return T(r)&&J(t,e[n]),o}),U=/^\d+$/,W=t=>new Set(u(t)||o(t)?t:[t]),$=z(),q=z(),B=(t,a,s,n,r,c,y,h={},C=0,S=[])=>{let m,A,L,M=0,E=0,O=0;N($,S,()=>0),N(q,S,()=>[]);const x=z(),[B,G,H,I,K]=((t=1,e,a)=>1!=t&&e.isMergeable()?[1,e.getMergeableContent,()=>e.getTransactionMergeableChanges(!a),([[t],[e]])=>!b(t)||!b(e),e.setDefaultContent]:2!=t?[0,e.getContent,e.getTransactionChanges,([t,e])=>!b(t)||!b(e),e.setContent]:g("Store type not supported by this Persister"))(y,t,C),[Q,R,V]=(()=>{let t;const[a,s]=(()=>{const t=[];let a=0;return[s=>(s?f(t):null)??e+a++,e=>{U.test(e)&&l(t)<1e3&&v(t,e)}]})(),n=z();return[(s,r,o,i=[],c=()=>[])=>{t??=ct;const d=a(1);var y,u;return J(n,d,[s,r,o,i,c]),y=F(r,o??[e],W),u=d,y?.add(u),d},(a,s,...r)=>p(((t,a=[e])=>{const s=[],n=(t,e)=>e==l(a)?v(s,t):i(a[e])?j(t,t=>n(t,e+1)):p([a[e],null],a=>n(D(t,a),e+1));return n(t,0),s})(a,s),e=>j(e,e=>D(n,e)[0](t,...s??[],...r))),t=>d(D(n,t),([,a,r])=>(F(a,r??[e],void 0,e=>(k(e,t),T(e)?1:0)),J(n,t),s(t),r)),e=>d(D(n,e),([e,,a=[],s,n])=>{const r=(...o)=>{const c=l(o);c==l(a)?e(t,...o,...n(o)):i(a[c])?p(s[c]?.(...o)??[],t=>r(...o,t)):r(...o,a[c])};r()})]})(),X=t=>{t!=M&&(M=t,R(x,void 0,M))},Y=e=>{(B&&u(e?.[0])?1===e?.[2]?t.applyMergeableChanges:t.setMergeableContent:1===e?.[2]?t.applyChanges:t.setContent)(e)},Z=async()=>{rt()&&t.hadMutated?.()&&await at()},_=async t=>(2!=M&&(X(1),E++,await it(async()=>{await w(async()=>{const e=await a();u(e)?Y(e):t?K(t):g("Content is not an array: "+e)},()=>{t&&K(t)}),X(0),await Z()})),ct),tt=async t=>(et(),await _(t),await w(async()=>A=await n(async(t,e)=>{e||t?2!=M&&(X(1),E++,Y(e??t),X(0),await Z()):await _()}),c),ct),et=async()=>(A&&(await w(()=>r(A),c),A=void 0),ct),at=async t=>(1!=M&&(X(2),O++,await it(async()=>{await w(()=>s(G,t),c),X(0)})),ct),st=async()=>(nt(),await at(),L=t.addDidFinishTransactionListener(()=>{const t=H();I(t)&&at(t)}),ct),nt=async()=>(L&&(t.delListener(L),L=void 0),ct),rt=()=>!o(L),ot=async(t=!1)=>{const[e,a]=t?[nt,et]:[et,nt];return await e(),await a(),ct},it=async(...t)=>(v(D(q,S),...t),await(async()=>{if(!D($,S)){for(J($,S,1);!o(m=f(D(q,S)));)await w(m,c);J($,S,0)}})(),ct),ct={load:_,startAutoLoad:tt,stopAutoLoad:et,isAutoLoading:()=>!o(A),save:at,startAutoSave:st,stopAutoSave:nt,isAutoSaving:rt,startAutoPersisting:async(t,e=!1)=>{const[a,s]=e?[st,tt]:[tt,st];return await a(t),await s(t),ct},stopAutoPersisting:ot,getStatus:()=>M,addStatusListener:t=>Q(t,x),delListener:e=>(V(e),t),schedule:it,getStore:()=>t,destroy:()=>(D(q,S).splice(0,void 0),ot()),getStats:()=>({loads:E,saves:O}),...h};return P(ct)},G="/store",H=(t,a,n,r)=>{const{host:i,room:c}=a.partySocketOptions,{storeProtocol:u="https",storePath:g=G,messagePrefix:w=e}={...y(n)?{storeProtocol:n}:n},p=u+"://"+i+"/parties/"+a.name+"/"+c+g,h=async t=>{return await(await fetch(p,{...t?{method:"PUT",body:(e=t,M(e,(t,e)=>e instanceof Map?C.fromEntries([...e]):e))}:{},mode:"cors",cache:"no-store"})).json();var e};return B(t,h,async(t,e)=>{var s;e?a.send(w+"s"+(y(s=e)?s:M(s,(t,e)=>o(e)?"":e))):await h(t())},t=>{const e=e=>d(((t,e)=>{const a=l(t);return((t,e)=>t.startsWith(e))(e,t)?[e[a],(n=e,r=a+1,s=n.slice(r,void 0),O(E(s)))]:void 0;var s,n,r})(w,e.data),([e,a])=>{"s"==e&&t(void 0,a)});return a.addEventListener(s,e),e},t=>{a.removeEventListener(s,t)},r,1,{getConnection:()=>a})};export{H as createPartyKitPersister};