tempest.games 0.1.30 → 0.1.31
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +7 -0
- package/app/assets/{index-Bi0ww1qK.js → index-BU9K6Wtr.js} +17 -17
- package/app/index.html +1 -1
- package/bin/backend.bun.js +27 -27
- package/bin/backend.worker.game.bun.js +10 -10
- package/bin/backend.worker.tribunal.bun.js +44 -44
- package/bin/frontend.bun.js +18 -18
- package/bin/setup-db.bun.js +50 -50
- package/package.json +9 -9
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
3
|
-
var
|
|
3
|
+
var dt=Object.create;var{getPrototypeOf:St,defineProperty:Ve,getOwnPropertyNames:ut}=Object;var kt=Object.prototype.hasOwnProperty;var $t=(e,o,t)=>{t=e!=null?dt(St(e)):{};let n=o||!e||!e.__esModule?Ve(t,"default",{value:e,enumerable:!0}):t;for(let i of ut(e))if(!kt.call(n,i))Ve(n,i,{get:()=>e[i],enumerable:!0});return n};var Jt=(e,o)=>()=>(o||e((o={exports:{}}).exports,o),o.exports);var Ot=(e,o)=>{for(var t in o)Ve(e,t,{get:o[t],enumerable:!0,configurable:!0,set:(n)=>o[t]=()=>n})};var ht=import.meta.require;function Je(e=Math.random){return e().toString(36).slice(2)}class ke extends Promise{fate;resolve;reject;done=!1;constructor(e){let o,t;super((n,i)=>{o=n,t=i});this.resolve=o,this.reject=t,this.use(e instanceof Promise?e:new Promise(e))}pass(e,o){if(e===this.fate)this.resolve(o),this.done=!0}fail(e,o){if(e===this.fate)this.reject(o),this.done=!0}use(e){if(e instanceof Promise){let o=e;this.fate=o,o.then((t)=>{this.pass(o,t)},(t)=>{this.fail(o,t)})}else this.resolve(e),this.fate=void 0}}function Wt(e){return Object.entries(e)}var ko=(e,o,t=C.STORE)=>{return be(t,{key:`${e.key}:JSON`,get:({get:n})=>o.toJson(n(e)),set:({set:n},i)=>{n(e,o.fromJson(i))}})};function f(e){while(e.child!==null)e=e.child;return e}class g{Subscriber;subscribers=new Map;subscribe(e,o){return this.subscribers.set(e,o),()=>{this.unsubscribe(e)}}unsubscribe(e){this.subscribers.delete(e)}next(e){let o=this.subscribers.values();for(let t of o)t(e)}}class Xe extends g{state;constructor(e){super();this.state=e}next(e){this.state=e,super.next(e)}}function Q(e,o,t){let n={key:o.key,type:"atom_family"},i=e.families.get(o.key);if(i)e.logger.error("\u2757","atom_family",o.key,`Overwriting an existing ${U(i)} "${i.key}" in store "${e.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);let r=new g,s=Object.assign((l)=>{let m=x(l),y={key:o.key,subKey:m},c=`${o.key}(${m})`,T=f(e),d=o.default,k={key:c,default:d instanceof Function?d(l):d};if(o.effects)k.effects=o.effects(l);let M=Z(T,k,y);return r.next({type:"state_creation",token:M}),M},n,{subject:r,install:(l)=>Q(l,o),internalRoles:t});return e.families.set(o.key,s),e.defaults.set(o.key,o.default),n}function bo(e,o){if("mutable"in o)return xe(e,o);return Q(e,o)}function ee(e,o,t){let n={key:o.key,type:"readonly_selector_family"},i=e.families.get(o.key);if(i)e.logger.error("\u2757","readonly_selector_family",o.key,`Overwriting an existing ${U(i)} "${i.key}" in store "${e.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);let r=new g,s=Object.assign((l)=>{let m=x(l),y={key:o.key,subKey:m},c=`${o.key}(${m})`,T=f(e),d=Ae(T,{key:c,get:o.get(l)},y);return r.next({type:"state_creation",token:d}),d},n,{internalRoles:t,subject:r,install:(l)=>ee(l,o),default:(l)=>{return o.get(l)({get:(...y)=>J(e,...y),find:(y,c)=>u(e,y,c),seek:(y,c)=>z(e,y,c),json:(y)=>I(e,y)})}});return e.families.set(o.key,s),n}function De(e,o){if("set"in o)return ge(e,o);return ee(e,o)}class Oe{_buffer;_index=0;constructor(e){let o;if(typeof e==="number")o=e;else o=e.length;this._buffer=Array.from({length:o})}get buffer(){return this._buffer}get index(){return this._index}add(e){this._buffer[this._index]=e,this._index=(this._index+1)%this._buffer.length}copy(){let e=new Oe([...this._buffer]);return e._index=this._index,e}}var bt={atom_family:"atom",mutable_atom_family:"mutable_atom",selector_family:"selector",readonly_selector_family:"readonly_selector",molecule_family:"molecule"};function xo(e,o){let t=x(o),n=`${e.key}(${t})`,i=bt[e.type],r={key:n,type:i};return Object.assign(r,{family:{key:e.key,subKey:t}}),Object.assign(r,{counterfeit:!0}),r}function Y(e){let o={key:e.key,type:e.type};if("family"in e)o.family=e.family;return o}function se(e){return Ao(C.STORE,e)}function ne(e){return bo(C.STORE,e)}var Ne=(e)=>(o,t,n,i,...r)=>{console[e](`${o} ${t} "${n}" ${i}`,...r)},xt={error:Ne("error"),info:Ne("info"),warn:Ne("warn")};class qe{logLevel;filter;logger;constructor(e,o,t=xt){this.logLevel=e;this.filter=o;this.logger=t}error=(...e)=>{if((this.filter?.(...e)??!0)&&this.logLevel!==null)this.logger.error(...e)};info=(...e)=>{if((this.filter?.(...e)??!0)&&this.logLevel==="info")this.logger.info(...e)};warn=(...e)=>{if((this.filter?.(...e)??!0)&&this.logLevel!=="error"&&this.logLevel!==null)this.logger.warn(...e)}}var Tn=Symbol("claim");class go{store;constructor(e=C.STORE){this.store=e,Co("root",e)}allocate(e,o,t){return ie(this.store,e,o,t)}fuse(e,o,t){return Fo(this.store,e,o,t)}deallocate(e){re(this.store,e)}claim(e,o,t){return me(this.store,e,o,t)}}class Ue{store;realm;constructor(e=C.STORE){this.store=e,this.realm=new go(e)}allocate(e,o,t){ie(this.store,e,o,t)}deallocate(e){re(this.store,e)}claim(e,o,t){me(this.store,e,o,t)}}function he(e){return De(C.STORE,e)}function W(e){return"epoch"in e.transactionMeta}function K(e){return"phase"in e.transactionMeta}var Ro=(e)=>{let o=f(e);if(!K(o)){e.logger.warn("\uD83D\uDC1E","transaction","???","abortTransaction called outside of a transaction. This is probably a bug in AtomIO.");return}e.logger.info("\uD83E\uDE82","transaction",o.transactionMeta.update.key,"Aborting transaction"),o.parent.child=null};var At=(e)=>e[0].toUpperCase()+e.slice(1);function U(e){return e.type.split("_").map(At).join(" ")}class ae extends Error{constructor(e,o){super(`${U(e)} ${x(e.key)} not found in store "${o.config.name}".`)}}function ye(e,o,t){return(...n)=>{let i=F(e,t);if(i)return i.run(n,o);throw new ae(e,t)}}var Be=(e)=>(o)=>e instanceof Function?e(o):e;var oe=(e,o)=>{if(o.valueMap.has(e.key))return o.logger.info("\uD83D\uDCD6",e.type,e.key,"reading cached value"),Ko(e,o);if(e.type==="selector"||e.type==="readonly_selector")return o.logger.info("\uD83E\uDDEE",e.type,e.key,"computing value"),e.get();let t=e.default instanceof Function?e.default():e.default;return o.logger.info("\uD83D\uDC81","atom",e.key,"could not find cached value; using default",t),e.default instanceof Function?e.default():e.default};var Mo=(e,o)=>{if(e.operation.open){let t=performance.now();return e.logger.info("\u2757",o.type,o.key,`deferring setState at T-${t} until setState for "${e.operation.token.key}" is done`),t}e.operation={open:!0,done:new Set,prev:new Map,time:Date.now(),token:o},e.logger.info("\u2B55",o.type,o.key,`operation start in store "${e.config.name}"${!K(e)?"":` ${e.transactionMeta.phase} "${e.transactionMeta.update.key}"`}`)},$o=(e)=>{if(e.operation.open)e.logger.info("\uD83D\uDD34",e.operation.token.type,e.operation.token.key,`operation done in store "${e.config.name}"`);e.operation={open:!1},e.on.operationClose.next(e.operation)},Jo=(e,o)=>{if(!e.operation.open)return e.logger.error("\uD83D\uDC1E","unknown",o,"isDone called outside of an operation. This is probably a bug in AtomIO."),!0;return e.operation.done.has(o)},ce=(e,o)=>{if(!e.operation.open){e.logger.error("\uD83D\uDC1E","unknown",o,"markDone called outside of an operation. This is probably a bug in AtomIO.");return}e.operation.done.add(o)};var Oo=(e,o,t)=>{switch(e.type){case"mutable_atom":t.logger.info("\uD83D\uDCE2",e.type,e.key,"is now (",o.newValue,") subscribers:",e.subject.subscribers);break;default:t.logger.info("\uD83D\uDCE2",e.type,e.key,"went (",o.oldValue,"->",o.newValue,") subscribers:",e.subject.subscribers)}e.subject.next(o)};var Ye=(e,o)=>{let t=f(o),n=t.selectorAtoms.getRelatedKeys(e.key);if(t.logger.info("\uD83E\uDDF9",e.type,e.key,n?`evicting ${n.size} states downstream:`:"no downstream states",n??"to evict"),n){if(t.operation.open)t.logger.info("\uD83E\uDDF9",e.type,e.key,`[ ${[...t.operation.done].join(", ")} ] already done`);for(let i of n){if(Jo(t,i))continue;ho(i,t),ce(t,i)}}};function gt(e,o){if(wo(o.newValue))return!1;if(e.includes("\uD83D\uDD0D"))return!1;return!0}var Bo=(e,o,t)=>{let{key:n}=e,i=f(t);if(!K(i)||i.transactionMeta.phase!=="building"){t.logger.error("\uD83D\uDC1E","atom",n,"stowUpdate called outside of a transaction. This is probably a bug.");return}if(!gt(n,o))return;let a={type:"atom_update",key:n,...o};if(e.family)a.family=e.family;i.transactionMeta.update.updates.push(a),t.logger.info("\uD83D\uDCC1","atom",n,"stowed (",o.oldValue,"->",o.newValue,")")};var Io=(e,o,t)=>{let n=oe(e,t),i=n;if(e.type==="mutable_atom"&&K(t)){let{parent:a}=t;i=Ce(e,a,t)}if(i=Be(o)(i),t.logger.info("\uD83D\uDCDD","atom",e.key,"set to",i),i=X(e.key,i,e.subject,t),Wo(e.key,t))Eo(e.key,t);ce(t,e.key),Ye(e,t);let r={oldValue:n,newValue:i};if(W(t))Oo(e,r,t);else if(t.parent){if(t.on.transactionApplying.state===null)Bo(e,r,t);else if(e.key.startsWith("*")){let a=e.key.slice(1),s=t.atoms.get(a),l=t.valueMap.get(a);if(s.type==="mutable_atom"&&K(t)){let{parent:y}=t;l=Ce(s,y,t)}if(l.do(r.newValue)===null)Ye(s,t)}}};var we=(e,o,t)=>{switch(e.type){case"atom":case"mutable_atom":Io(e,o,t);break;case"selector":e.set(o);break}};function _o(e,o){if(o.family){let t=e.families.get(o.family.key);if(t)return t}}function B(e,...o){let t,n,i,r;if(o.length===2){if(t=o[0],r=o[1],n=_o(e,t)??null,n)i=t.family?w(t.family.subKey):null,t=u(e,n,i)}else n=o[0],i=o[1],r=o[2],t=u(e,n,i);if("counterfeit"in t&&"family"in t){let l=t.family.subKey,m=e.disposalTraces.buffer.find((y)=>y?.key===l);e.logger.error("\u274C",t.type,t.key,`could not be set because it was not found in the store "${e.config.name}".`,m?`This state was previously disposed:
|
|
4
|
+
${m.trace}`:"No previous disposal trace was found.");return}let a=Mo(e,t);if(a){let l=e.on.operationClose.subscribe(`waiting to set "${t.key}" at T-${a}`,()=>{l(),e.logger.info("\uD83D\uDFE2",t.type,t.key,`resuming deferred setState from T-${a}`),B(e,t,r)});return}let s=F(t,e);we(s,r,e),$o(e)}function Ie(e,o,t){let{key:n,newValue:i,oldValue:r}=o,a=e==="newValue"?i:r,s={key:n,type:"atom"};if(o.family)Object.assign(s,{family:o.family});B(t,s,a)}function vo(e){let{stack:o}=e;if(o)return`
|
|
5
|
+
`+o.split(`
|
|
6
|
+
`)?.slice(1)?.join(`
|
|
7
|
+
`);return""}function Co(e,o=C.STORE){let t={key:e,stringKey:x(e),dependsOn:"any"};return o.molecules.set(x(e),t),e}function ie(e,o,t,n="any"){let i=o,r=x(t),a=[],s=f(e);if(Array.isArray(i))for(let y of i){let c=x(y);if(s.molecules.get(c))e.moleculeGraph.set(c,r,{source:c});else a.push(c)}else{let y=x(i);if(s.molecules.get(y))e.moleculeGraph.set(y,r,{source:y});else a.push(y)}if(a.length===0)s.molecules.set(r,{key:t,stringKey:r,dependsOn:n});let l={type:"molecule_creation",key:t,provenance:i};if(K(s)&&s.transactionMeta.phase==="building")s.transactionMeta.update.updates.push(l);else s.on.moleculeCreation.next(l);for(let y of a){let c=e.disposalTraces.buffer.find((T)=>T?.key===y);e.logger.error("\u274C","molecule",t,"allocation failed:",`Could not allocate to ${y} in store "${e.config.name}".`,c?`
|
|
4
8
|
${y} was most recently disposed
|
|
5
|
-
${c.trace}`:`No previous disposal trace for ${y} was found.`)}return t}function
|
|
9
|
+
${c.trace}`:`No previous disposal trace for ${y} was found.`)}return t}function Fo(e,o,t,n){let i=`T$--${o}==${t}++${n}`;return ie(e,[t,n],i,"all"),i}function re(e,o){let t=x(o),n=e.molecules.get(t);if(!n){let d=e.disposalTraces.buffer.find((k)=>k?.key===t);e.logger.error("\u274C","molecule",o,"deallocation failed:",`Could not find allocation for ${t} in store "${e.config.name}".`,d?`
|
|
6
10
|
This state was most recently deallocated
|
|
7
|
-
${
|
|
11
|
+
${d.trace}`:`No previous disposal trace for ${t} was found.`);return}let i=e.moleculeJoins.getRelatedKeys(n.key);if(i)for(let d of i){let k=e.joins.get(d);if(k)k.relations.delete(n.key),k.molecules.delete(n.stringKey)}e.moleculeJoins.delete(n.stringKey);let r=[],a=[],s={type:"molecule_disposal",key:n.key,values:a,provenance:r},l=f(e);l.molecules.delete(t);let m=K(l)&&l.transactionMeta.phase==="building";if(m)l.transactionMeta.update.updates.push(s);let y=e.moleculeGraph.getRelationEntries({downstreamMoleculeKey:n.stringKey});if(y)for(let[d,{source:k}]of y)if(k===n.stringKey){let M=w(d);re(e,M)}else r.push(k);let c=l.moleculeData.getRelatedKeys(n.stringKey);if(c)for(let d of c){let k=l.families.get(d),M=u(e,k,n.key);a.push([k.key,M]),le(e,M)}if(l.moleculeGraph.delete(n.stringKey),l.moleculeJoins.delete(n.stringKey),l.moleculeData.delete(n.stringKey),!m)l.on.moleculeDisposal.next(s);l.molecules.delete(n.stringKey);let T=vo(new Error);e.disposalTraces.add({key:t,trace:T})}function me(e,o,t,n){let i=x(t),r=f(e),a=r.molecules.get(i);if(!a){let T=e.disposalTraces.buffer.find((d)=>d?.key===i);return e.logger.error("\u274C","molecule",t,"claim failed:",`Could not allocate to ${i} in store "${e.config.name}".`,T?`
|
|
8
12
|
${i} was most recently disposed
|
|
9
|
-
${
|
|
13
|
+
${T.trace}`:`No previous disposal trace for ${i} was found.`),t}let s=x(o),l=r.molecules.get(s);if(!l){let T=e.disposalTraces.buffer.find((d)=>d?.key===s);return e.logger.error("\u274C","molecule",t,"claim failed:",`Could not allocate to ${s} in store "${e.config.name}".`,T?`
|
|
10
14
|
${s} was most recently disposed
|
|
11
|
-
${p.trace}`:`No previous disposal trace for ${s} was found.`),t}let m=e.moleculeGraph.getRelationEntries({downstreamMoleculeKey:a.stringKey}).filter(([,{source:p}])=>p!==i).map(([p])=>B(p));if(n)r.moleculeGraph.delete(i);r.moleculeGraph.set({upstreamMoleculeKey:l.stringKey,downstreamMoleculeKey:a.stringKey},{source:l.stringKey});let y={type:"molecule_transfer",key:a.key,from:m,to:[l.key]};if(K(r)&&r.transactionMeta.phase==="building")r.transactionMeta.update.updates.push(y);return t}class go{store;constructor(e=R.STORE){this.store=e,xo("root",e)}allocate(e,o,t){return ae(this.store,e,o,t)}fuse(e,o,t){return bt(this.store,e,o,t)}deallocate(e){le(this.store,e)}claim(e,o,t){return ge(this.store,e,o,t)}}class Ve{store;realm;constructor(e=R.STORE){this.store=e,this.realm=new go(e)}allocate(e,o,t){ae(this.store,e,o,t)}deallocate(e){le(this.store,e)}claim(e,o,t){ge(this.store,e,o,t)}}function se(e){return Fo(R.STORE,e)}function re(e){return bo(R.STORE,e)}var qe=(e)=>(o,t,n,i,...r)=>{console[e](`${o} ${t} "${n}" ${i}`,...r)},At={error:qe("error"),info:qe("info"),warn:qe("warn")};class Ue{logLevel;filter;logger;constructor(e,o,t=At){this.logLevel=e;this.filter=o;this.logger=t}error=(...e)=>{if((this.filter?.(...e)??!0)&&this.logLevel!==null)this.logger.error(...e)};info=(...e)=>{if((this.filter?.(...e)??!0)&&this.logLevel==="info")this.logger.info(...e)};warn=(...e)=>{if((this.filter?.(...e)??!0)&&this.logLevel!=="error"&&this.logLevel!==null)this.logger.warn(...e)}}function he(e){return Ne(R.STORE,e)}function Re(e){return Ye(e,R.STORE)}class _{a;b;cardinality;relations=new Map;contents=new Map;isAType;isBType;isContent;makeContentKey=(e,o)=>`${e}:${o}`;warn;getRelatedKeys(e){return this.relations.get(e)}addRelation(e,o){let t=this.relations.get(e),n=this.relations.get(o);if(t)t.add(o);else t=new Set([o]),this.relations.set(e,t);if(n)n.add(e);else n=new Set([e]),this.relations.set(o,n)}deleteRelation(e,o){let t=this.relations.get(e);if(t){if(t.delete(o),t.size===0)this.relations.delete(e);let n=this.relations.get(o);if(n){if(n.delete(e),n.size===0)this.relations.delete(o)}}}replaceRelationsUnsafely(e,o){this.relations.set(e,new Set(o));for(let t of o){let n=new Set().add(e);this.relations.set(t,n)}}replaceRelationsSafely(e,o){let t=this.relations.get(e),n=this.isAType?.(e)?e:void 0,i=n===void 0?e:void 0;if(t)for(let r of t){n??=r,i??=r;let a=this.relations.get(r);if(a){if(a.size===1)this.relations.delete(r);else a.delete(e);this.contents.delete(this.makeContentKey(n,i))}}this.relations.set(e,new Set(o));for(let r of o){let a=this.relations.get(r);if(a)a.add(e);else a=new Set().add(e),this.relations.set(r,a)}}getContentInternal(e){return this.contents.get(e)}setContent(e,o){this.contents.set(e,o)}deleteContent(e){this.contents.delete(e)}constructor(e,o){if(this.a=e.between[0],this.b=e.between[1],this.cardinality=e.cardinality,!o?.externalStore)this.relations=new Map(e.relations?.map(([t,n])=>[t,new Set(n)])),this.contents=new Map(e.contents);if(this.isAType=o?.isAType??null,this.isBType=o?.isBType??null,this.isContent=o?.isContent??null,o?.makeContentKey)this.makeContentKey=o.makeContentKey;if(o?.externalStore){let t=o.externalStore;if(this.has=(n,i)=>t.has(n,i),this.addRelation=(n,i)=>{t.addRelation(n,i)},this.deleteRelation=(n,i)=>{t.deleteRelation(n,i)},this.replaceRelationsSafely=(n,i)=>{t.replaceRelationsSafely(n,i)},this.replaceRelationsUnsafely=(n,i)=>{t.replaceRelationsUnsafely(n,i)},this.getRelatedKeys=(n)=>t.getRelatedKeys(n),t.getContent)this.getContentInternal=(n)=>{return t.getContent(n)},this.setContent=(n,i)=>{t.setContent(n,i)},this.deleteContent=(n)=>{t.deleteContent(n)};for(let[n,i]of e.relations??[]){let r=this.isAType?.(n)?n:void 0,a=r===void 0?n:void 0;for(let s of i)r??=s,a??=s,this.addRelation(r,a)}for(let[n,i]of e.contents??[])this.setContent(n,i)}if(o?.warn)this.warn=o.warn}toJSON(){return{between:[this.a,this.b],cardinality:this.cardinality,relations:[...this.relations.entries()].map(([e,o])=>[e,[...o]]),contents:[...this.contents.entries()]}}set(...e){let o,t,n;switch(e.length){case 1:{let i=e[0];o=i[this.a],t=i[this.b],n=void 0;break}case 2:{let i=e[0];if(typeof i==="string")[o,t]=e;else o=i[this.a],t=i[this.b],n=e[1];break}default:{o=e[0],t=e[1],n=e[2];break}}switch(this.cardinality){case"1:1":{let i=this.getRelatedKey(o);if(i&&i!==t)this.delete(o,i)}case"1:n":{let i=this.getRelatedKey(t);if(i&&i!==o)this.delete(i,t)}}if(n){let i=this.makeContentKey(o,t);this.setContent(i,n)}return this.addRelation(o,t),this}delete(e,o){o=typeof o==="string"?o:e[this.b];let t=typeof e==="string"?e:e[this.a];if(t===void 0&&typeof o==="string"){let n=this.getRelatedKeys(o);if(n)for(let i of n)this.delete(i,o)}if(typeof t==="string"&&o===void 0){let n=this.getRelatedKeys(t);if(n)for(let i of n)this.delete(t,i)}if(typeof t==="string"&&typeof o==="string"){this.deleteRelation(t,o);let n=this.makeContentKey(t,o);this.deleteContent(n)}return this}getRelatedKey(e){let o=this.getRelatedKeys(e);if(o){if(o.size>1)this.warn?.(`${o.size} related keys were found for key "${e}": (${[...o].map((n)=>`"${n}"`).join(", ")}). Only one related key was expected.`);let t;for(let n of o){t=n;break}return t}}replaceRelations(e,o,t){let n=!Array.isArray(o),i=n?Object.keys(o):o;if(t?.reckless)this.replaceRelationsUnsafely(e,i);else this.replaceRelationsSafely(e,i);if(n)for(let r of i){let a=this.makeContentKey(e,r),s=o[r];this.setContent(a,s)}return this}getContent(e,o){let t=this.makeContentKey(e,o);return this.getContentInternal(t)}getRelationEntries(e){let o=e[this.a],t=e[this.b];if(o!==void 0&&t===void 0){let n=this.getRelatedKeys(o);if(n)return[...n].map((i)=>{return[i,this.getContent(o,i)]})}if(o===void 0&&t!==void 0){let n=this.getRelatedKeys(t);if(n)return[...n].map((i)=>{return[i,this.getContent(i,t)]})}return[]}has(e,o){if(o)return this.getRelatedKeys(e)?.has(o)??!1;return this.relations.has(e)}}function I(e){return"epoch"in e.transactionMeta}function K(e){return"phase"in e.transactionMeta}var Co=(e)=>{let o=f(e);if(!K(o)){e.logger.warn("\uD83D\uDC1E","transaction","???","abortTransaction called outside of a transaction. This is probably a bug in AtomIO.");return}e.logger.info("\uD83E\uDE82","transaction",o.transactionMeta.update.key,"Aborting transaction"),o.parent.child=null};var xt=(e)=>e[0].toUpperCase()+e.slice(1);function q(e){return e.type.split("_").map(xt).join(" ")}class L extends Error{constructor(...e){let o=e[0],t=e.length===2?e[1]:e[2];if(e.length===2)super(`${q(o)} ${A(o.key)} not found in store "${t.config.name}".`);else{let n=e[1];super(`${q(o)} "${o.key}" member ${A(n)} not found in store "${t.config.name}".`)}}}function me(e,o,t){return(...n)=>{let i=F(e,t);if(i)return i.run(n,o);throw new L(e,t)}}var Be=(e)=>(o)=>e instanceof Function?e(o):e;var te=(e,o)=>{if(o.valueMap.has(e.key))return o.logger.info("\uD83D\uDCD6",e.type,e.key,"reading cached value"),Ko(e,o);if(e.type==="selector"||e.type==="readonly_selector")return o.logger.info("\uD83E\uDDEE",e.type,e.key,"computing value"),e.get();let t=e.default instanceof Function?e.default():e.default;return o.logger.info("\uD83D\uDC81","atom",e.key,"could not find cached value; using default",t),e.default instanceof Function?e.default():e.default};var Mo=(e,o)=>{if(e.operation.open){let t=performance.now();return e.logger.info("\u2757",o.type,o.key,`deferring setState at T-${t} until setState for "${e.operation.token.key}" is done`),t}e.operation={open:!0,done:new Set,prev:new Map,time:Date.now(),token:o},e.logger.info("\u2B55",o.type,o.key,`operation start in store "${e.config.name}"${!K(e)?"":` ${e.transactionMeta.phase} "${e.transactionMeta.update.key}"`}`)},Jo=(e)=>{if(e.operation.open)e.logger.info("\uD83D\uDD34",e.operation.token.type,e.operation.token.key,`operation done in store "${e.config.name}"`);e.operation={open:!1},e.on.operationClose.next(e.operation)},Oo=(e,o)=>{if(!e.operation.open)return e.logger.error("\uD83D\uDC1E","unknown",o,"isDone called outside of an operation. This is probably a bug in AtomIO."),!0;return e.operation.done.has(o)},ye=(e,o)=>{if(!e.operation.open){e.logger.error("\uD83D\uDC1E","unknown",o,"markDone called outside of an operation. This is probably a bug in AtomIO.");return}e.operation.done.add(o)};var $o=(e,o,t)=>{switch(e.type){case"mutable_atom":t.logger.info("\uD83D\uDCE2",e.type,e.key,"is now (",o.newValue,") subscribers:",e.subject.subscribers);break;default:t.logger.info("\uD83D\uDCE2",e.type,e.key,"went (",o.oldValue,"->",o.newValue,") subscribers:",e.subject.subscribers)}e.subject.next(o)};var Ge=(e,o)=>{let t=f(o),n=t.selectorAtoms.getRelatedKeys(e.key);if(t.logger.info("\uD83E\uDDF9",e.type,e.key,n?`evicting ${n.size} states downstream:`:"no downstream states",n??"to evict"),n){if(t.operation.open)t.logger.info("\uD83E\uDDF9",e.type,e.key,`[ ${[...t.operation.done].join(", ")} ] already done`);for(let i of n){if(Oo(t,i))continue;ho(i,t),ye(t,i)}}};function gt(e,o){if(wo(o.newValue))return!1;if(e.includes("\uD83D\uDD0D"))return!1;return!0}var Bo=(e,o,t)=>{let{key:n}=e,i=f(t);if(!K(i)||i.transactionMeta.phase!=="building"){t.logger.error("\uD83D\uDC1E","atom",n,"stowUpdate called outside of a transaction. This is probably a bug.");return}if(!gt(n,o))return;let a={type:"atom_update",key:n,...o};if(e.family)a.family=e.family;i.transactionMeta.update.updates.push(a),t.logger.info("\uD83D\uDCC1","atom",n,"stowed (",o.oldValue,"->",o.newValue,")")};var Wo=(e,o,t)=>{let n=te(e,t),i=n;if(e.type==="mutable_atom"&&K(t)){let{parent:a}=t;i=Fe(e,a,t)}if(i=Be(o)(i),t.logger.info("\uD83D\uDCDD","atom",e.key,"set to",i),i=D(e.key,i,e.subject,t),_o(e.key,t))Io(e.key,t);ye(t,e.key),Ge(e,t);let r={oldValue:n,newValue:i};if(I(t))$o(e,r,t);else if(t.parent){if(t.on.transactionApplying.state===null)Bo(e,r,t);else if(e.key.startsWith("*")){let a=e.key.slice(1),s=t.atoms.get(a),l=t.valueMap.get(a);if(s.type==="mutable_atom"&&K(t)){let{parent:y}=t;l=Fe(s,y,t)}if(l.do(r.newValue)===null)Ge(s,t)}}};var we=(e,o,t)=>{switch(e.type){case"atom":case"mutable_atom":Wo(e,o,t);break;case"selector":e.set(o);break}};function jo(e,o){if(o.family){let t=e.families.get(o.family.key);if(t)return t}}function w(e,...o){let t,n,i,r;if(o.length===2){if(t=o[0],r=o[1],n=jo(e,t)??null,n)i=t.family?B(t.family.subKey):null,t=u(e,n,i)}else n=o[0],i=o[1],r=o[2],t=u(e,n,i);if("counterfeit"in t&&"family"in t){let l=t.family.subKey,m=e.disposalTraces.buffer.find((y)=>y?.key===l);e.logger.error("\u274C",t.type,t.key,`could not be set because it was not found in the store "${e.config.name}".`,m?`This state was previously disposed:
|
|
12
|
-
${m.trace}`:"No previous disposal trace was found.");return}let a=Mo(e,t);if(a){let l=e.on.operationClose.subscribe(`waiting to set "${t.key}" at T-${a}`,()=>{l(),e.logger.info("\uD83D\uDFE2",t.type,t.key,`resuming deferred setState from T-${a}`),w(e,t,r)});return}let s=F(t,e);we(s,r,e),Jo(e)}function We(e,o,t){let{key:n,newValue:i,oldValue:r}=o,a=e==="newValue"?i:r,s={key:n,type:"atom"};if(o.family)Object.assign(s,{family:o.family});w(t,s,a)}function Le(e,o,t){switch(o){case"newValue":{Eo(e,t);break}case"oldValue":{ie(t,e.token);break}}}function Qe(e,o,t){switch(o){case"newValue":{ie(t,e.token);break}case"oldValue":{if(Eo(e,t),e.subType==="atom")t.valueMap.set(e.token.key,e.value);break}}}function Eo(e,o){let{family:t}=e.token;if(t){let n=o.families.get(t.key);if(n)u(o,n,B(t.subKey))}}function vo(e,o,t){switch(o){case"newValue":ae(t,e.provenance,e.key);break;case"oldValue":le(t,e.key);break}}function zo(e,o,t){switch(o){case"newValue":le(t,e.key);break;case"oldValue":{let n=e.provenance.map(B);ae(t,n,e.key);for(let[i,r]of e.values){let a=t.families.get(i);if(a){u(t,a,e.key);let s=`${i}(${A(e.key)})`;t.valueMap.set(s,r)}}}break}}function Po(e,o,t){switch(o){case"newValue":{let n=e.to.length===1?e.to[0]:e.to;ge(t,n,e.key,"exclusive")}break;case"oldValue":{let n=e.from.length===1?e.from[0]:e.from;ge(t,n,e.key,"exclusive")}break}}function _e(e,o,t){let n=e==="newValue"?o.updates:[...o.updates].reverse();for(let i of n)switch(i.type){case"atom_update":case"selector_update":We(e,i,t);break;case"state_creation":Le(i,e,t);break;case"state_disposal":Qe(i,e,t);break;case"molecule_creation":vo(i,e,t);break;case"molecule_disposal":zo(i,e,t);break;case"molecule_transfer":Po(i,e,t);break;case"transaction_update":_e(e,i,t);break}}function Xo(e,o,t){if(I(t)&&e)t.transactionMeta.epoch.set(e,o)}function Ho(e,o,t){if(!I(t))return;let i=t.transactionMeta.actionContinuities.getRelatedKey(e);if(i!==void 0)t.transactionMeta.epoch.set(i,o)}var Do=(e,o)=>{let t=f(o),{parent:n}=t;if(n===null||!K(t)||t.transactionMeta?.phase!=="building"){o.logger.warn("\uD83D\uDC1E","transaction","???","applyTransaction called outside of a transaction. This is probably a bug in AtomIO.");return}t.transactionMeta.phase="applying",t.transactionMeta.update.output=e,n.child=null,n.on.transactionApplying.next(t.transactionMeta);let{updates:i}=t.transactionMeta.update;if(o.logger.info("\uD83D\uDEC4","transaction",t.transactionMeta.update.key,`Applying transaction with ${i.length} updates:`,i),_e("newValue",t.transactionMeta.update,n),I(n))Ho(t.transactionMeta.update.key,t.transactionMeta.update.epoch,n),F({key:t.transactionMeta.update.key,type:"transaction"},o)?.subject.next(t.transactionMeta.update),o.logger.info("\uD83D\uDEEC","transaction",t.transactionMeta.update.key,"Finished applying transaction.");else if(K(n))n.transactionMeta.update.updates.push(t.transactionMeta.update);n.on.transactionApplying.next(null)};function No(e,o,t){if(!I(t))return;let{epoch:i,actionContinuities:r}=t.transactionMeta;if(r.set(e,o),!i.has(e))i.set(e,-1)}function Vo(e){return{store:e}}function O(e,...o){let t,n,i;if(o.length===1)t=o[0];else n=o[0],i=o[1],t=u(e,n,i);if("counterfeit"in t&&"family"in t){n=e.families.get(t.family.key);let r=t.family.subKey,a=e.disposalTraces.buffer.find((s)=>s?.key===r);switch(e.logger.error("\u274C",t.type,t.key,`could not be retrieved because it was not found in the store "${e.config.name}".`,a?`This state was previously disposed:
|
|
13
|
-
${a.trace}`:"No previous disposal trace was found."),n.type){case"atom_family":case"mutable_atom_family":return e.defaults.get(n.key);case"selector_family":case"readonly_selector_family":{if(e.defaults.has(n.key))return e.defaults.get(t.family.key);let s=F(n,e).default(r);return e.defaults.set(n.key,s),s}}}return te(F(t,e),e)}class N extends Map{source;deleted=new Set;constructor(e){super();this.source=e}get(e){if(super.has(e))return super.get(e);if(!this.deleted.has(e)&&this.source.has(e))return this.source.get(e);return}set(e,o){return this.deleted.delete(e),super.set(e,o)}hasOwn(e){return super.has(e)}has(e){return!this.deleted.has(e)&&(super.has(e)||this.source.has(e))}delete(e){return this.deleted.add(e),super.delete(e)}}var qo=(e,o,t,n)=>{let i=f(t),r={parent:i,child:null,on:i.on,loggers:i.loggers,logger:i.logger,config:i.config,atoms:new N(i.atoms),atomsThatAreDefault:new Set(i.atomsThatAreDefault),families:new N(i.families),joins:new N(i.joins),operation:{open:!1},readonlySelectors:new N(i.readonlySelectors),timelines:new N(i.timelines),timelineTopics:new _(i.timelineTopics.toJSON()),trackers:new Map,transactions:new N(i.transactions),selectorAtoms:new _(i.selectorAtoms.toJSON()),selectorGraph:new _(i.selectorGraph.toJSON(),{makeContentKey:(...m)=>m.sort().join(":")}),selectors:new N(i.selectors),valueMap:new N(i.valueMap),defaults:i.defaults,disposalTraces:t.disposalTraces.copy(),molecules:new N(i.molecules),moleculeGraph:new _(i.moleculeGraph.toJSON(),{makeContentKey:i.moleculeGraph.makeContentKey}),moleculeData:new _(i.moleculeData.toJSON(),{makeContentKey:i.moleculeData.makeContentKey}),moleculeJoins:new _(i.moleculeJoins.toJSON(),{makeContentKey:i.moleculeJoins.makeContentKey}),miscResources:new N(i.miscResources)},a=Uo(e,t),s={phase:"building",update:{type:"transaction_update",key:e,id:n,epoch:a===void 0?Number.NaN:a+1,updates:[],params:o,output:void 0},toolkit:{get:(...m)=>O(l,...m),set:(...m)=>{w(l,...m)},run:(m,y=Oe())=>me(m,y,l),find:(m,y)=>u(l,m,y),seek:(m,y)=>v(l,m,y),json:(m)=>W(l,m),dispose:(...m)=>{ie(l,...m)},env:()=>Vo(l)}},l=Object.assign(r,{transactionMeta:s});return i.child=l,t.logger.info("\uD83D\uDEEB","transaction",e,"Building transaction with params:",o),l};function Ye(e,o){let t={key:e.key,type:"transaction",run:(r,a)=>{let s=qo(e.key,r,o,a);try{let l=f(o),{toolkit:m}=s.transactionMeta,y=e.do(m,...r);return Do(y,l),y}catch(l){throw Co(n),o.logger.warn("\uD83D\uDCA5","transaction",e.key,"caught:",l),l}},install:(r)=>Ye(e,r),subject:new g},n=f(o);n.transactions.set(t.key,t);let i=Y(t);return o.on.transactionCreation.next(i),i}function Uo(e,o){let t=I(o),n=t?o.transactionMeta.actionContinuities.getRelatedKey(e):void 0;return t&&n!==void 0?o.transactionMeta.epoch.get(n):void 0}class Yo{parent=null;child=null;valueMap=new Map;defaults=new Map;atoms=new Map;selectors=new Map;readonlySelectors=new Map;atomsThatAreDefault=new Set;selectorAtoms=new _({between:["selectorKey","atomKey"],cardinality:"n:n"});selectorGraph=new _({between:["upstreamSelectorKey","downstreamSelectorKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});trackers=new Map;families=new Map;joins=new Map;transactions=new Map;transactionMeta={epoch:new Map,actionContinuities:new _({between:["continuity","action"],cardinality:"1:n"})};timelines=new Map;timelineTopics=new _({between:["timelineKey","topicKey"],cardinality:"1:n"});disposalTraces=new $e(100);molecules=new Map;moleculeJoins=new _({between:["moleculeKey","joinKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});moleculeGraph=new _({between:["upstreamMoleculeKey","downstreamMoleculeKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});moleculeData=new _({between:["moleculeKey","stateFamilyKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});miscResources=new Map;on={atomCreation:new g,atomDisposal:new g,selectorCreation:new g,selectorDisposal:new g,timelineCreation:new g,transactionCreation:new g,transactionApplying:new De(null),operationClose:new g,moleculeCreation:new g,moleculeDisposal:new g};operation={open:!1};config={name:"IMPLICIT_STORE",lifespan:"ephemeral"};loggers=[new Ue("warn",(e,o,t)=>!t.includes("\uD83D\uDD0D"))];logger={error:(...e)=>{for(let o of this.loggers)o.error(...e)},info:(...e)=>{for(let o of this.loggers)o.info(...e)},warn:(...e)=>{for(let o of this.loggers)o.warn(...e)}};constructor(e,o=null){if(this.config={...o?.config,...e},o!==null){if(this.valueMap=new Map(o?.valueMap),this.operation={...o?.operation},I(o))this.transactionMeta={epoch:new Map(o?.transactionMeta.epoch),actionContinuities:new _(o?.transactionMeta.actionContinuities.toJSON())};for(let[,n]of o.families){if(n.internalRoles?.includes("mutable")||n.internalRoles?.includes("join"))continue;n.install(this)}let t=new Set;for(let[,n]of o.atoms){if(t.has(n.key))continue;if(n.install(this),n.type==="mutable_atom"){let i=W(o,n),r=Q(n);t.add(i.key),t.add(r.key)}}for(let[,n]of o.readonlySelectors)n.install(this);for(let[,n]of o.selectors){if(t.has(n.key))continue;n.install(this)}for(let[,n]of o.transactions)n.install(this);for(let[,n]of o.timelines)n.install(this)}}}var R={get STORE(){if(!globalThis.ATOM_IO_IMPLICIT_STORE)globalThis.ATOM_IO_IMPLICIT_STORE=new Yo({name:"IMPLICIT_STORE",lifespan:"ephemeral"});return globalThis.ATOM_IO_IMPLICIT_STORE}};function F(e,o){let t,n=o;while(n!==null){switch(e.type){case"atom":case"mutable_atom":t=n.atoms.get(e.key);break;case"selector":t=n.selectors.get(e.key);break;case"readonly_selector":t=n.readonlySelectors.get(e.key);break;case"atom_family":case"mutable_atom_family":case"selector_family":case"readonly_selector_family":t=n.families.get(e.key);break;case"timeline":t=n.timelines.get(e.key);break;case"transaction":t=n.transactions.get(e.key);break}if(t)return t;n=n.child}throw new L(e,o)}function Go(e,o,t){let n=e.families.get(o.key);if(n===void 0)throw new L(o,e);let i=n(t),r=f(e);if(i.family){if(I(r))switch(i.type){case"atom":case"mutable_atom":e.on.atomCreation.next(i);break;case"selector":case"readonly_selector":e.on.selectorCreation.next(i);break}else if(K(r)&&r.on.transactionApplying.state===null)r.transactionMeta.update.updates.push({type:"state_creation",token:i})}return i}function v(e,o,t){let n=A(t),i=`${o.key}(${n})`,r=f(e),a;switch(o.type){case"atom_family":case"mutable_atom_family":a=r.atoms.get(i);break;case"selector_family":a=r.selectors.get(i);break;case"readonly_selector_family":a=r.readonlySelectors.get(i);break}if(a)return Y(a);return a}function u(e,o,t){let n=v(e,o,t);if(n)return n;let i=A(t),r=e.molecules.get(i);if(!r&&e.config.lifespan==="immortal"){let a=Ao(o,t);return e.logger.error("\u274C",a.type,a.key,`was not found in store "${e.config.name}"; returned a counterfeit token.`),a}if(n=Go(e,o,t),r)f(e).moleculeData.set(i,o.key);return n}function ie(e,...o){let t;if(o.length===1)t=o[0];else{let n=o[0],i=o[1];t=u(e,n,i)}try{F(t,e)}catch(n){e.logger.error("\u274C",t.type,t.key,`could not be disposed because it was not found in the store "${e.config.name}".`);return}switch(t.type){case"atom":case"mutable_atom":Ze(t,e);break;case"selector":case"readonly_selector":Lo(t,e);break}}var Ie=(e,o)=>f(o).atoms.has(e),Rt=(e,o)=>f(o).selectors.has(e),Ft=(e,o)=>f(o).readonlySelectors.has(e),Qo=(e,o)=>Ie(e,o)||Rt(e,o)||Ft(e,o);var je=(e,o)=>{return f(o).selectorGraph.getRelationEntries({downstreamSelectorKey:e}).filter(([n,{source:i}])=>i!==e).map(([n,{source:i}])=>i).filter((n)=>Qo(n,o))};var eo=(e,o,t)=>{let n=[],i=je(e,t);while(i.length>0){let r=i.shift();if(o.has(r))continue;if(o.add(r),!Ie(r,t))i.push(...je(r,t));else if(!n.includes(r))n.push(r)}return n},Zo=(e,o)=>{let t=e.key,n=je(t,o),i=new Set;return n.flatMap((r)=>Ie(r,o)?r:eo(r,i,o))};var et=(e,o,t,n)=>{let i=f(n);if(o.type==="atom"||o.type==="mutable_atom")i.selectorAtoms.set({selectorKey:e,atomKey:o.key}),n.logger.info("\uD83D\uDD0D","selector",e,`discovers root atom "${o.key}"`);else{let r=eo(o.key,t,n);n.logger.info("\uD83D\uDD0D","selector",e,`discovers root atoms: [ ${r.map((a)=>`"${a}"`).join(", ")} ]`);for(let a of r)i.selectorAtoms=i.selectorAtoms.set({selectorKey:e,atomKey:a})}t.add(o.key)};var Ee=(e,o,t)=>({get:(...n)=>{let i=f(t),r;if(n.length===2){let[l,m]=n;r=u(t,l,m)}else[r]=n;let a=F(r,t),s=te(a,t);return t.logger.info("\uD83D\uDD0C","selector",e,`registers dependency ( "${r.key}" =`,s,")"),i.selectorGraph.set({upstreamSelectorKey:r.key,downstreamSelectorKey:e},{source:r.key}),et(e,r,o,t),s},set:(...n)=>{let i,r;if(n.length===2)i=n[0],r=n[1];else{let l=n[0],m=n[1];r=n[2];let y=t.config.lifespan==="ephemeral"?u(t,l,m):v(t,l,m);if(!y)throw new L(l,m,t);i=y}let a=f(t),s=F(i,a);we(s,r,a)},find:(n,i)=>u(t,n,i),seek:(n,i)=>v(t,n,i),json:(n)=>W(t,n)});var Ae=(e,o,t)=>{let n=f(e),i=new g,r=new Set,{get:a,find:s,seek:l,json:m}=Ee(o.key,r,n),y=()=>{let k=o.get({get:a,find:s,seek:l,json:m});return D(o.key,k,i,f(e)),r.clear(),k},c={...o,subject:i,install:(k)=>Ae(k,o,t),get:y,type:"readonly_selector",...t&&{family:t}};n.readonlySelectors.set(o.key,c);let p=y();e.logger.info("\u2728",c.type,c.key,"=",p);let S={key:o.key,type:"readonly_selector"};if(t)S.family=t;return S};var Ce=(e,o,t)=>{let n=f(e),i=new g,r=new Set,a=Ee(o.key,r,n),{find:s,get:l,seek:m,json:y}=a,c={find:s,get:l,seek:m,json:y},p=(E=o.get,X=f(e))=>{let U=E(c);return D(o.key,U,i,X),r.clear(),U},k={...o,subject:i,install:(E)=>Ce(E,o,t),get:p,set:(E)=>{let X=f(e),U=p(o.get,X),T=Be(E)(U);if(e.logger.info("\uD83D\uDCDD","selector",o.key,"set (",U,"->",T,")"),D(o.key,T,i,X),ye(X,o.key),I(X))i.next({newValue:T,oldValue:U});o.set(a,T)},type:"selector",...t&&{family:t}};n.selectors.set(o.key,k);let M=p();e.logger.info("\u2728",k.type,k.key,"=",M);let $={key:o.key,type:"selector"};if(t)$.family=t;return $};function ke(e,o){if("set"in o){let i=Ce(e,o,void 0);return e.on.selectorCreation.next(i),i}let n=Ae(e,o,void 0);return e.on.selectorCreation.next(n),n}function Lo(e,o){let t=f(o),{key:n}=e,i=F(e,t);if(!i.family)o.logger.error("\u274C","selector",n,"Standalone selectors cannot be disposed.");else{if(t.molecules.get(i.family.subKey))t.moleculeData.delete(i.family.subKey,i.family.key);switch(e.type){case"selector":{t.selectors.delete(n);let a=F({key:i.family.key,type:"selector_family"},o)}break;case"readonly_selector":t.readonlySelectors.delete(n),F({key:i.family.key,type:"readonly_selector_family"},o).subject.next({type:"state_disposal",subType:"selector",token:e});break}if(t.valueMap.delete(n),t.selectorAtoms.delete(n),t.selectorGraph.delete(n),o.logger.info("\uD83D\uDD25",e.type,n,"deleted"),K(t)&&t.transactionMeta.phase==="building")t.transactionMeta.update.updates.push({type:"state_disposal",subType:"selector",token:e});else o.on.selectorDisposal.next(e)}}function xe(e,o,t){let n={key:o.key,type:"selector_family"},i=e.families.get(o.key);if(i)e.logger.error("\u2757","selector_family",o.key,`Overwriting an existing ${q(i)} "${i.key}" in store "${e.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);let r=new g,s=Object.assign((l)=>{let m=A(l),y={key:o.key,subKey:m},c=`${o.key}(${m})`,p=f(e),S=Ce(p,{key:c,get:o.get(l),set:o.set(l)},y);return r.next({type:"state_creation",token:S}),S},n,{internalRoles:t,subject:r,install:(l)=>xe(l,o),default:(l)=>{return o.get(l)({get:(...y)=>O(e,...y),find:(y,c)=>u(e,y,c),seek:(y,c)=>v(e,y,c),json:(y)=>W(e,y)})}});return e.families.set(o.key,s),n}function ot(e,o,t=R.STORE){let n=xe(t,{key:`${e.key}:JSON`,get:(r)=>({get:a})=>{let s=a(e,r);return o.toJson(s)},set:(r)=>({set:a},s)=>{a(e,r,o.fromJson(s))}},["mutable","json"]);return F(e,t).subject.subscribe(`store=${t.config.name}::json-selector-family`,(r)=>{if(r.token.family)v(t,n,B(r.token.family.subKey))}),n}var B=(e)=>JSON.parse(e),A=(e)=>JSON.stringify(e),Ml=[Array.prototype,Boolean.prototype,Number.prototype,Object.prototype,String.prototype];var tt=(e,o)=>{let t=f(o);if(t.operation.open)return t.operation.prev.get(e.key);return t.valueMap.get(e.key)};var no=(e,o)=>{let t=f(o);return Zo(e,o).map((i)=>{let r=t.atoms.get(i);if(r===void 0)throw new Error(`Atom "${i}", a dependency of selector "${e.key}", not found in store "${o.config.name}".`);return r.subject.subscribe(`${e.type}:${e.key}`,(a)=>{o.logger.info("\uD83D\uDCE2",e.type,e.key,"root",i,"went",a.oldValue,"->",a.newValue);let s=tt(e,t),l=te(e,t);o.logger.info("\u2728",e.type,e.key,"went",s,"->",l),e.subject.next({newValue:l,oldValue:s})})})};function P(e,o,t,n){function i(c){if(n.operation.open){let p=n.on.operationClose.subscribe(`state subscription ${t}`,()=>{p(),o(c)})}else o(c)}let r=F(e,n);n.logger.info("\uD83D\uDC40",r.type,r.key,`Adding subscription "${t}"`);let a=r.type==="selector"||r.type==="readonly_selector",s=null,l=i;if(a)s=no(r,n),l=(c)=>{if(s)s.length=0,s.push(...no(r,n));i(c)};let m=r.subject.subscribe(t,l);return()=>{if(n.logger.info("\uD83D\uDE48",r.type,r.key,`Removing subscription "${t}"`),m(),s)for(let c of s)c()}}var oo=(e,o,t,n)=>{let i=F(e,n);n.logger.info("\uD83D\uDC40","timeline",e.key,`Adding subscription "${t}"`);let r=i.subject.subscribe(t,o);return()=>{n.logger.info("\uD83D\uDE48","timeline",e.key,`Removing subscription "${t}" from timeline`),r()}};var to=(e,o,t,n)=>{let i=F(e,n);n.logger.info("\uD83D\uDC40","transaction",e.key,`Adding subscription "${t}"`);let r=i.subject.subscribe(t,o);return()=>{n.logger.info("\uD83D\uDE48","transaction",e.key,`Removing subscription "${t}"`),r()}};class ne{Update;initializeState(e,o){let t=`*${e.key}`;o.atoms.delete(t),o.valueMap.delete(t);let n=e.family?{key:`*${e.family.key}`,subKey:e.family.subKey}:void 0,i=ee(o,{key:t,default:null},n);if(o.parent?.valueMap.has(t)){let r=o.parent.valueMap.get(t);o.valueMap.set(t,r)}return i}unsubscribeFromInnerValue;unsubscribeFromState;observeCore(e,o,t){let n=`tracker:${t.config.name}:${K(t)?t.transactionMeta.update.key:"main"}:${e.key}`,i=O(t,e);this.unsubscribeFromInnerValue=i.subscribe(n,(r)=>{w(t,o,r)}),this.unsubscribeFromState=P(e,(r)=>{if(r.newValue!==r.oldValue)this.unsubscribeFromInnerValue(),this.unsubscribeFromInnerValue=r.newValue.subscribe(n,(a)=>{w(t,o,a)})},n,t)}updateCore(e,o,t){let n=`tracker:${t.config.name}:${K(t)?t.transactionMeta.update.key:"main"}:${e.key}`;P(o,({newValue:i,oldValue:r})=>{let a=t.timelineTopics.getRelatedKey(o.key);if(a){if(t.timelines.get(a)?.timeTraveling){let m=oo({key:a,type:"timeline"},(y)=>{m(),w(t,e,(c)=>{if(y==="redo"&&i)c.do(i);else if(y==="undo"&&r)c.undo(r);return c})},n,t);return}}let s=t.on.operationClose.subscribe(n,()=>{s();let l=O(t,e),m=i===null?-1:l.getUpdateNumber(i),y=m-l.cacheUpdateNumber;if(i&&y===1)w(t,e,(c)=>(c.do(i),c));else t.logger.info("\u274C","mutable_atom",e.key,`could not be updated. Expected update number ${l.cacheUpdateNumber+1}, but got ${m}`)})},n,t)}mutableState;latestUpdateState;dispose;constructor(e,o){this.mutableState=e;let t=f(o);this.latestUpdateState=this.initializeState(e,t),this.observeCore(e,this.latestUpdateState,t),this.updateCore(e,this.latestUpdateState,t),t.trackers.set(e.key,this),this.dispose=()=>{this.unsubscribeFromInnerValue(),this.unsubscribeFromState(),t.trackers.delete(e.key)}}}function Ke(e,o,t){e.logger.info("\uD83D\uDD28","atom",o.key,`creating in store "${e.config.name}"`);let n=f(e),i=n.atoms.get(o.key);if(i&&i.type==="mutable_atom")return e.logger.error("\u274C","atom",o.key,"Tried to create atom, but it already exists in the store."),Y(i);let r=new g,a={...o,type:"mutable_atom",install:(m)=>{return m.logger.info("\uD83D\uDEE0\uFE0F","atom",o.key,`installing in store "${m.config.name}"`),Ke(m,o,t)},subject:r};if(t)a.family=t;let s=o.default();n.atoms.set(a.key,a),ve(o.key,e),D(o.key,s,r,n);let l=Y(a);if(o.effects){let m=0,y=[];for(let c of o.effects){let p=c({setSelf:(S)=>{w(e,l,S)},onSet:(S)=>P(l,S,`effect[${m}]`,e)});if(p)y.push(p);++m}a.cleanup=()=>{for(let c of y)c()}}if(new ne(l,e),!t)ko(l,o,e);return l}class io{Update;latestUpdateAtoms;mutableAtoms;constructor(e,o){let t=Z(o,{key:`*${e.key}`,default:null},["mutable","updates"]);this.latestUpdateAtoms=F(t,o),this.mutableAtoms=e,this.mutableAtoms.subject.subscribe(`store=${o.config.name}::tracker-atom-family`,(n)=>{if(n.token.family){let i=B(n.token.family.subKey);v(o,this.latestUpdateAtoms,i),new ne(n.token,o)}}),this.latestUpdateAtoms.subject.subscribe(`store=${o.config.name}::tracker-atom-family`,(n)=>{if(n.token.family){let i=B(n.token.family.subKey),r=v(o,this.mutableAtoms,i);if(r)new ne(r,o)}})}}function be(e,o,t){let n={key:o.key,type:"mutable_atom_family"},i=e.families.get(o.key);if(i)e.logger.error("\u2757","mutable_atom_family",o.key,`Overwriting an existing ${q(i)} "${i.key}" in store "${e.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);let r=new g,s=Object.assign((l)=>{let m=A(l),y={key:o.key,subKey:m},c=`${o.key}(${m})`,p=f(e),S={key:c,default:()=>o.default(l),toJson:o.toJson,fromJson:o.fromJson,mutable:!0};if(o.effects)S.effects=o.effects(l);let k=Ke(p,S,y);return r.next({type:"state_creation",token:k}),k},n,{subject:r,install:(l)=>be(l,o),toJson:o.toJson,fromJson:o.fromJson,internalRoles:t});return e.families.set(o.key,s),ot(s,o,e),new io(s,e),n}var ro=(e,o)=>{let t=f(o),n=`${e.key}:JSON`;return t.families.get(n)};var W=(e,o)=>{if(o.family){let n=f(e),r={key:`${o.family.key}:JSON`,type:"selector_family"},a=F(r,n),s=JSON.parse(o.family.subKey);return u(e,a,s)}return{type:"selector",key:`${o.key}:JSON`}};var Q=(e)=>{let t={type:"atom",key:`*${e.key}`};if(e.family)t.family={key:`*${e.family.key}`,subKey:e.family.subKey};return t};function wo(e){return typeof e==="object"&&e!==null&&"do"in e&&"undo"in e&&"subscribe"in e}function Fe(e,o,t){let n=o.valueMap.get(e.key),i=t.valueMap.get(e.key);if(n===i){if(n===void 0)return typeof e.default==="function"?e.default():e.default;o.logger.info("\uD83D\uDCC3","atom",e.key,"copying");let r=e.toJson(n),a=e.fromJson(r);return t.valueMap.set(e.key,a),new ne(e,o),a}return i}function D(e,o,t,n){let i=n.valueMap.get(e);if(i instanceof ue)i.use(o);if(o instanceof Promise){let r=new ue(o);return n.valueMap.set(e,r),r.then((a)=>{D(e,a,t,n),t.next({newValue:a,oldValue:r})}).catch((a)=>{n.logger.error("\uD83D\uDCA5","state",e,"rejected:",a)}),r}return n.valueMap.set(e,o),o}var Ko=(e,o)=>{let t=o.valueMap.get(e.key);if(e.type==="mutable_atom"&&K(o)){let{parent:n}=o;t=Fe(e,n,o)}return t},ho=(e,o)=>{let t=o.valueMap.get(e);if(t instanceof ue){let n=t,i=o.selectors.get(e)??o.readonlySelectors.get(e);if(i)n.use(i.get());return}if(o.operation.open)o.operation.prev.set(e,t);o.valueMap.delete(e),o.logger.info("\uD83D\uDDD1","state",e,"evicted")};var _o=(e,o)=>{return f(o).atomsThatAreDefault.has(e)},ve=(e,o)=>{let t=f(o);t.atomsThatAreDefault=new Set(t.atomsThatAreDefault).add(e)},Io=(e,o)=>{let t=f(o);t.atomsThatAreDefault=new Set(f(o).atomsThatAreDefault),t.atomsThatAreDefault.delete(e)};function ee(e,o,t){e.logger.info("\uD83D\uDD28","atom",o.key,`creating in store "${e.config.name}"`);let n=f(e),i=n.atoms.get(o.key);if(i&&i.type==="atom")return e.logger.error("\u274C","atom",o.key,"Tried to create atom, but it already exists in the store."),Y(i);let r=new g,a={...o,type:"atom",install:(m)=>{return m.logger.info("\uD83D\uDEE0\uFE0F","atom",o.key,`installing in store "${m.config.name}"`),ee(m,o,t)},subject:r};if(t)a.family=t;let s=o.default;if(o.default instanceof Function)s=o.default();n.atoms.set(a.key,a),ve(o.key,e),D(o.key,s,r,n);let l=Y(a);if(o.effects){let m=0,y=[];for(let c of o.effects){let p=c({setSelf:(S)=>{w(e,l,S)},onSet:(S)=>P(l,S,`effect[${m}]`,e)});if(p)y.push(p);++m}a.cleanup=()=>{for(let c of y)c()}}return l}function Fo(e,o){if("mutable"in o){let i=Ke(e,o,void 0);return e.on.atomCreation.next(i),i}let n=ee(e,o,void 0);return e.on.atomCreation.next(n),n}function Ze(e,o){let t=f(o),{key:n,family:i}=e,r=F(e,t);if(!i)o.logger.error("\u274C","atom",n,"Standalone atoms cannot be disposed.");else{r.cleanup?.();let a=o.valueMap.get(r.key),s=F({key:i.key,type:"atom_family"},o),l={type:"state_disposal",subType:"atom",token:e,value:a};s.subject.next(l);let m=K(t);if(t.atoms.delete(n),t.valueMap.delete(n),t.selectorAtoms.delete(n),t.atomsThatAreDefault.delete(n),o.timelineTopics.delete(n),e.type==="mutable_atom"){let y=Q(e);Ze(y,o),o.trackers.delete(n)}if(o.logger.info("\uD83D\uDD25","atom",n,"deleted"),m&&t.transactionMeta.phase==="building"){let y=t.transactionMeta.update.updates.at(-1);if(!(y?.type==="molecule_disposal"&&y.values.some(([S])=>S===r.family?.key)))t.transactionMeta.update.updates.push(l)}else o.on.atomDisposal.next(e)}}function Ro(e){let{stack:o}=e;if(o)return`
|
|
14
|
-
`+o.split(`
|
|
15
|
-
`)?.slice(1)?.join(`
|
|
16
|
-
`);return""}class j extends Set{mode="record";subject=new g;cacheLimit=0;cache=[];cacheIdx=-1;cacheUpdateNumber=-1;constructor(e,o=0){super(e);if(e instanceof j)this.parent=e,this.cacheUpdateNumber=e.cacheUpdateNumber;if(o)this.cacheLimit=o,this.cache=new Array(o),this.subscribe("auto cache",(t)=>{this.cacheIdx++,this.cacheIdx%=this.cacheLimit,this.cache[this.cacheIdx]=t})}toJSON(){return{members:[...this],cache:this.cache,cacheLimit:this.cacheLimit,cacheIdx:this.cacheIdx,cacheUpdateNumber:this.cacheUpdateNumber}}static fromJSON(e){let o=new j(e.members,e.cacheLimit);return o.cache=e.cache,o.cacheIdx=e.cacheIdx,o.cacheUpdateNumber=e.cacheUpdateNumber,o}add(e){let o=super.add(e);if(this.mode==="record")this.cacheUpdateNumber++,this.emit(`add:${A(e)}`);return o}clear(){let e=this.mode==="record"?[...this]:null;if(super.clear(),e)this.cacheUpdateNumber++,this.emit(`clear:${JSON.stringify(e)}`)}delete(e){let o=super.delete(e);if(this.mode==="record")this.cacheUpdateNumber++,this.emit(`del:${A(e)}`);return o}parent;child=null;transactionUpdates=null;transaction(e){this.mode="transaction",this.transactionUpdates=[],this.child=new j(this);let o=this.child._subscribe("transaction",(t)=>{this.transactionUpdates?.push(t)});try{if(e(this.child)){for(let n of this.transactionUpdates)this.doStep(n);this.cacheUpdateNumber++,this.emit(`tx:${this.transactionUpdates.join(";")}`)}}catch(t){throw console.error("Failed to apply transaction to SetRTX:",t),t}finally{o(),this.child=null,this.transactionUpdates=null,this.mode="record"}}_subscribe(e,o){return this.subject.subscribe(e,o)}subscribe(e,o){return this.subject.subscribe(e,(t)=>{o(`${this.cacheUpdateNumber}=${t}`)})}emit(e){this.subject.next(e)}doStep(e){let o=e.indexOf(":"),t=e.substring(0,o),n=e.substring(o+1);switch(t){case"add":this.add(JSON.parse(n));break;case"clear":this.clear();break;case"del":this.delete(JSON.parse(n));break;case"tx":for(let i of n.split(";"))this.doStep(i)}}getUpdateNumber(e){let o=e.indexOf("=");return Number(e.substring(0,o))}do(e){let o=e.indexOf("="),t=Number(e.substring(0,o)),n=t-this.cacheUpdateNumber;if(n>0){if(n===1){this.mode="playback";let r=e.substring(o+1);return this.doStep(r),this.mode="record",this.cacheUpdateNumber=t,null}return this.cacheUpdateNumber+1}if(Math.abs(n)<this.cacheLimit){let r=this.cacheIdx+n;if(this.cache[r]===e)return null;this.mode="playback";let s=!1;while(!s){this.cacheIdx%=this.cacheLimit;let m=this.cache[this.cacheIdx];if(this.cacheIdx--,!m)return"OUT_OF_RANGE";this.undo(m),s=this.cacheIdx===r-1}let l=e.substring(o+1);return this.doStep(l),this.mode="record",this.cacheUpdateNumber=t,null}return"OUT_OF_RANGE"}undoStep(e){let o=e.indexOf(":"),t=e.substring(0,o),n=e.substring(o+1);switch(t){case"add":this.delete(JSON.parse(n));break;case"del":this.add(JSON.parse(n));break;case"clear":{let i=JSON.parse(n);for(let r of i)this.add(r);break}case"tx":{let i=n.split(";");for(let r=i.length-1;r>=0;r--)this.undoStep(i[r])}}}undo(e){let o=e.indexOf("=");if(Number(e.substring(0,o))===this.cacheUpdateNumber){this.mode="playback";let n=e.substring(o+1);return this.undoStep(n),this.mode="record",this.cacheUpdateNumber--,null}return this.cacheUpdateNumber}}function h(e){return e[0].toUpperCase()+e.slice(1)}class ao{toolkit;options;defaultContent;molecules=new Map;relations;states;core;transact(e,o){let t=this.toolkit;this.toolkit=e,o(this),this.toolkit=t}store;realm;[Symbol.dispose](){}constructor(e,o,t=R.STORE){this.store=t,this.realm=new Ve(t),this.options=e,this.defaultContent=o,this.store.miscResources.set(`join:${e.key}`,this),this.realm.allocate("root",e.key),this.toolkit={get:(...T)=>O(t,...T),set:(...T)=>{w(t,...T)},find:(...T)=>u(t,...T),seek:(...T)=>v(t,...T),json:(T)=>W(t,T)};let n=e.between[0],i=e.between[1],r=be(t,{key:`${e.key}/relatedKeys`,default:()=>new j,mutable:!0,fromJson:(T)=>j.fromJSON(T),toJson:(T)=>T.toJSON()},["join","relations"]);this.core={relatedKeysAtoms:r};let a=({get:T},d)=>T(r,d),s=({set:T},d,C)=>{if(!this.store.molecules.has(A(d)))this.realm.allocate(e.key,d);T(r,d,(b)=>b.add(C)),T(r,C,(b)=>b.add(d))},l=({set:T},d,C)=>{T(r,d,(b)=>{return b.delete(C),b}),T(r,C,(b)=>{return b.delete(d),b})},m=(T,d,C)=>{let{find:b,get:x,set:J}=T,z=b(r,d),V=x(z);for(let H of V){if(C.includes(H))continue;J(r,H,(G)=>{return G.delete(d),G})}J(z,(H)=>{return H.transaction((fe)=>{fe.clear();for(let G of C){let pe=a(T,G),So=pe.has(d);if(this.relations.cardinality==="1:n"){let uo=[];for(let Se of pe){if(Se===d)continue;let de=a(T,Se);if(de.delete(G),de.size===0)uo.push(Se)}if(!So&&pe.size>0)pe.clear();for(let Se of uo){let de=[G,Se].sort(),ft=`"${de[0]}:${de[1]}"`;this.molecules.delete(ft)}}if(!So)pe.add(d);fe.add(G)}return!0}),H})},y=(T,d,C)=>{let{set:b}=T;b(r,d,(x)=>{return x.transaction((J)=>{for(let z of C)J.add(z);return!0}),x});for(let x of C)b(r,x,(J)=>{return J.add(d),J});return!0},c=(T,d,C)=>{let b=a(T,d);return C?b.has(C):b.size>0},p={getRelatedKeys:(T)=>a(this.toolkit,T),addRelation:(T,d)=>{this.store.moleculeJoins.set(T,e.key),this.store.moleculeJoins.set(d,e.key),s(this.toolkit,T,d)},deleteRelation:(T,d)=>{l(this.toolkit,T,d)},replaceRelationsSafely:(T,d)=>{m(this.toolkit,T,d)},replaceRelationsUnsafely:(T,d)=>{y(this.toolkit,T,d)},has:(T,d)=>c(this.toolkit,T,d)},S,k;if(o){k=Z(t,{key:`${e.key}/content`,default:o},["join","content"]);let T=({get:b},x)=>b(k,x),d=({set:b},x,J)=>{b(k,x,J)};S=Object.assign(p,{getContent:(b)=>{return T(this.toolkit,b)},setContent:(b,x)=>{d(this.toolkit,b,x)},deleteContent:(b)=>{this.realm.deallocate(b)}})}else S=p;let M=new _(e,{externalStore:S,isAType:e.isAType,isBType:e.isBType,makeContentKey:(...T)=>{let[d,C]=T,b=T.sort(),x=`${b[0]}:${b[1]}`,J=t.molecules.get(A(d)),z=t.molecules.get(A(C));if(!J)this.realm.allocate(e.key,d);if(!z)this.realm.allocate(e.key,C);return this.realm.allocate(d,x,"all"),this.realm.claim(C,x),this.store.moleculeJoins.set(x,e.key),x}}),$=()=>oe(t,{key:`${e.key}/singleRelatedKey`,get:(T)=>({get:d})=>{let C=d(r,T);for(let b of C)return b;return null}},["join","keys"]),E=()=>{return oe(t,{key:`${e.key}/multipleRelatedKeys`,get:(T)=>({get:d})=>{let C=ro(r,t);return d(C,T).members}},["join","keys"])},X=()=>oe(t,{key:`${e.key}/singleRelatedEntry`,get:(T)=>({get:d})=>{let C=d(r,T);for(let b of C){let x=M.isAType?.(T)?T:void 0,J=x===void 0?T:void 0;x??=b,J??=b;let z=M.makeContentKey(x,J),V=d(k,z);return[b,V]}return null}},["join","entries"]),U=()=>oe(t,{key:`${e.key}/multipleRelatedEntries`,get:(T)=>({get:d})=>{let C=ro(r,t);return d(C,T).members.map((x)=>{let J=M.isAType?.(T)?T:void 0,z=J===void 0?T:void 0;J??=x,z??=x;let V=M.makeContentKey(J,z),H=d(k,V);return[x,H]})}},["join","entries"]);switch(e.cardinality){case"1:1":{let T=$(),d=`${n}KeyOf${h(i)}`,C=`${i}KeyOf${h(n)}`,b={[d]:T,[C]:T},x;if(o){let J=X(),z=`${n}EntryOf${h(i)}`,V=`${i}EntryOf${h(n)}`,H={[z]:J,[V]:J};x=Object.assign(b,H)}else x=b;this.relations=M,this.states=x;break}case"1:n":{let T=$(),d=E(),C=`${n}KeyOf${h(i)}`,b=`${i}KeysOf${h(n)}`,x={[C]:T,[b]:d},J;if(o){let z=X(),V=U(),H=`${n}EntryOf${h(i)}`,fe=`${i}EntriesOf${h(n)}`,G={[H]:z,[fe]:V};J=Object.assign(x,G)}else J=x;this.relations=M,this.states=J;break}default:{let T=E(),d=`${n}KeysOf${h(i)}`,C=`${i}KeysOf${h(n)}`,b={[d]:T,[C]:T},x;if(o){let J=U(),z=`${n}EntriesOf${h(i)}`,V=`${i}EntriesOf${h(n)}`,H={[z]:J,[V]:J};x=Object.assign(b,H)}else x=b;this.relations=M,this.states=x}}}}function ze(e,o,t=R.STORE){return t.joins.set(e.key,new ao(e,o,t)),{key:e.key,type:"join",a:e.between[0],b:e.between[1],cardinality:e.cardinality}}function lo(e,o){let t=o.joins.get(e.key);if(t===void 0){let i=R.STORE.joins.get(e.key);if(i===void 0)throw new Error(`Join "${e.key}" not found in store "${o.config.name}"`);t=new ao(i.options,i.defaultContent,o),o.joins.set(e.key,t)}return t}function so(e,o,t){let n=lo(e,t),i;switch(e.cardinality){case"1:1":{let r=`${e.a}KeyOf${h(e.b)}`,a=`${e.b}KeyOf${h(e.a)}`;i={get[r](){let l=n.states[r];return u(t,l,o)},get[a](){let l=n.states[a];return u(t,l,o)}};let s=`${e.a}EntryOf${h(e.b)}`;if(s in n.states){let l=`${e.b}EntryOf${h(e.a)}`;Object.assign(i,{get[s](){let m=n.states[s];return u(t,m,o)},get[l](){let m=n.states[l];return u(t,m,o)}})}break}case"1:n":{let r=`${e.a}KeyOf${h(e.b)}`,a=`${e.b}KeysOf${h(e.a)}`;i={get[r](){let l=n.states[r];return u(t,l,o)},get[a](){let l=n.states[a];return u(t,l,o)}};let s=`${e.a}EntryOf${h(e.b)}`;if(s in n.states){let l=`${e.b}EntriesOf${h(e.a)}`;Object.assign(i,{get[s](){let m=n.states[s];return u(t,m,o)},get[l](){let m=n.states[l];return u(t,m,o)}})}break}case"n:n":{let r=`${e.a}KeysOf${h(e.b)}`,a=`${e.b}KeysOf${h(e.a)}`;i={get[r](){let l=n.states[r];return u(t,l,o)},get[a](){let l=n.states[a];return u(t,l,o)}};let s=`${e.a}EntriesOf${h(e.b)}`;if(s in n.states){let l=`${e.b}EntriesOf${h(e.a)}`;Object.assign(i,{get[s](){let m=n.states[s];return u(t,m,o)},get[l](){let m=n.states[l];return u(t,m,o)}})}}}return i}function Pe(e,o,t){let n=lo(e,t),i=f(t);if(K(i)){let{toolkit:r}=i.transactionMeta;n.transact(r,({relations:a})=>{o(a)})}else o(n.relations)}function Ct(e,o){return lo(e,o).core.relatedKeysAtoms}function nt(e){return Ct(e,R.STORE)}class it extends Map{set(e,o){if(this.has(e))return console.warn("Tried to set a key that already exists in an InvariantMap",{key:e,value:o}),this;return super.set(e,o)}clear(){throw new Error("Cannot clear an InvariantMap")}}class Xe{key;type="continuity";globals=[];actions=[];perspectives=[];constructor(e){this.key=e}static existing=new it;static create(e,o){let t=new Xe(e),{type:n,globals:i,actions:r,perspectives:a}=o(t),s={type:n,key:e,globals:i,actions:r,perspectives:a};return Xe.existing.set(e,s),s}add(...e){switch(e[0].type){case"atom":case"mutable_atom":this.globals.push(...e);break;case"transaction":this.actions.push(...e);break;case"atom_family":{let[t,n]=e;this.perspectives.push({type:"realtime_perspective",resourceAtoms:t,viewAtoms:n})}break}return this}}function Oy(e){let{key:o,config:t}=e,n=Xe.create(o,t),{actions:i}=n;for(let r of i)No(o,r.key,R.STORE);return Xo(o,-1,R.STORE),n}var Wy=se({key:"usersInRoomIndex",mutable:!0,default:()=>new j,toJson:(e)=>e.toJSON(),fromJson:(e)=>j.fromJSON(e)}),mo=se({key:"roomIndex",default:()=>new j,mutable:!0,toJson:(e)=>e.toJSON(),fromJson:(e)=>j.fromJSON(e)}),Kt={enteredAtEpoch:0},Me=ze({key:"usersInRooms",between:["room","user"],cardinality:"1:n",isAType:(e)=>typeof e==="string",isBType:(e)=>typeof e==="string"},Kt),_y=he({key:"usersInMyRoomView",get:(e)=>({find:o})=>{let t=nt(Me);return[o(t,e)]}});import{spawn as Mt}from"child_process";class ce{emit;listeners;globalListeners;handleEvent(e,...o){for(let n of this.globalListeners)n(e,...o);let t=this.listeners.get(e);if(t)for(let n of t)n(...o)}id="no_id_retrieved";constructor(e){this.emit=e;this.listeners=new Map,this.globalListeners=new Set}on(e,o){let t=this.listeners.get(e);if(t)t.add(o);else this.listeners.set(e,new Set([o]));return this}onAny(e){return this.globalListeners.add(e),this}off(e,o){let t=this.listeners.get(e);if(t)if(o)t.delete(o);else this.listeners.delete(e);return this}offAny(e){return this.globalListeners.delete(e),this}}class yo extends ce{incompleteData="";unprocessedEvents=[];incompleteLog="";unprocessedLogs=[];id="#####";process;key;logger;handleLog(e){if(Array.isArray(e)){let[o,...t]=e;switch(o){case"i":this.logger.info(...t);break;case"w":this.logger.warn(...t);break;case"e":this.logger.error(...t);break}}}constructor(e,o,t){super((n,...i)=>{let r=JSON.stringify([n,...i])+"\x03",a=(s)=>{if(s.code==="EPIPE")console.error("EPIPE error during write",this.process.stdin);this.process.stdin.removeListener("error",a)};return this.process.stdin.once("error",a),this.process.stdin.write(r),this});if(this.process=e,this.key=o,this.logger=t??{info:(...n)=>{console.info(this.id,this.key,...n)},warn:(...n)=>{console.warn(this.id,this.key,...n)},error:(...n)=>{console.error(this.id,this.key,...n)}},this.process.stdout.on("data",(n)=>{let i=n.toString();if(i==="ALIVE")return;this.unprocessedEvents.push(...i.split("\x03"));let r=this.unprocessedEvents.shift();this.incompleteData+=r??"";try{if(this.incompleteData.startsWith("error"))console.log("\u2757",this.incompleteData);let a=B(this.incompleteData);this.handleEvent(...a);while(this.unprocessedEvents.length>0){let s=this.unprocessedEvents.shift();if(s){if(this.unprocessedEvents.length===0)this.incompleteData=s;a=B(s),this.handleEvent(...a)}}this.incompleteData=""}catch(a){console.warn("\u26A0\uFE0F----------------\u26A0\uFE0F"),console.warn(this.incompleteData),console.warn("\u26A0\uFE0F----------------\u26A0\uFE0F"),console.error(a)}}),this.process.stderr.on("data",(n)=>{let i=n.toString();this.unprocessedLogs.push(...i.split("\x03"));let r=this.unprocessedLogs.shift();this.incompleteLog+=r??"";try{let a=B(this.incompleteLog);this.handleLog(a);while(this.unprocessedLogs.length>0)if(this.incompleteLog=this.unprocessedLogs.shift()??"",this.incompleteLog)a=B(this.incompleteLog),this.handleLog(a)}catch(a){console.error("\u274C\u274C\u274C"),console.error(this.incompleteLog),console.error(a),console.error("\u274C\u274C\u274C\uFE0F")}}),e.pid)this.id=e.pid.toString()}}class rt extends ce{in;out;id="no_id_retrieved";disposalFunctions=[];constructor(e){super((...o)=>{return this.out.next(o),this});this.id=e,this.in=new g,this.out=new g,this.in.subscribe("socket",(o)=>{this.handleEvent(...o)})}dispose(){for(let e of this.disposalFunctions)e()}}class co extends ce{incompleteData="";unprocessedEvents=[];relays;relayServices;process;id="#####";log(...e){this.process.stderr.write(A(e.map((o)=>o instanceof j?`{ ${o.toJSON().members.join(" | ")} }`:o))+"\x03")}logger={info:(...e)=>{this.log("i",...e)},warn:(...e)=>{this.log("w",...e)},error:(...e)=>{this.log("e",...e)}};constructor(){super((e,...o)=>{let t=JSON.stringify([e,...o]);return this.process.stdout.write(t+"\x03"),this});if(this.process=process,this.process.stdin.resume(),this.relays=new Map,this.relayServices=[],this.process.stdin.on("data",(e)=>{let o=e.toString();this.unprocessedEvents.push(...o.split("\x03"));let t=this.unprocessedEvents.shift();this.incompleteData+=t??"";try{let n=B(this.incompleteData);this.logger.info("\uD83C\uDFB0","received",n),this.handleEvent(...n);while(this.unprocessedEvents.length>0){let i=this.unprocessedEvents.shift();if(i){if(this.unprocessedEvents.length===0)this.incompleteData=i;let r=B(i);this.handleEvent(...r)}}this.incompleteData=""}catch(n){if(n instanceof Error)this.logger.error("\u2757",n.message,n.cause,n.stack)}}),this.on("exit",()=>{this.logger.info("\uD83D\uDD25",this.id,'received "exit"'),process.exit(0)}),process.on("exit",(e)=>{this.logger.info("\uD83D\uDD25",this.id,`exited with code ${e}`)}),process.on("end",()=>{this.logger.info("\uD83D\uDD25",this.id,"ended"),process.exit(0)}),process.on("SIGTERM",()=>{this.logger.error("\uD83D\uDD25",this.id,"terminated"),process.exit(0)}),process.on("SIGINT",()=>{this.logger.error("\uD83D\uDD25",this.id,"interrupted"),process.exit(0)}),process.pid)this.id=process.pid?.toString();this.on("user-joins",(e)=>{this.logger.info("\uD83D\uDC64","user",e,"joined");let o=new rt(`user:${e}`);this.relays.set(e,o),this.logger.info("\uD83D\uDD17","attaching services:",`[${[...this.relayServices.keys()].join(", ")}]`);for(let t of this.relayServices){let n=t(o);if(n)o.disposalFunctions.push(n)}this.on(`user:${e}`,(...t)=>{o.in.next(t)}),o.out.subscribe("socket",(t)=>{this.emit(...t)})}),this.on("user-leaves",(e)=>{let o=this.relays.get(e);if(this.off(`relay:${e}`),o)o.dispose(),this.relays.delete(e)}),process.stdout.write("ALIVE")}relay(e){this.logger.info("\uD83D\uDD17","running relay method"),this.relayServices.push(e)}}var To=re({key:"roomArguments",default:["echo",["Hello World!"]]}),at=he({key:"room",get:(e)=>async({get:o,find:t})=>{let n=t(To,e),i=o(n),[r,a]=i,s=await new Promise((l)=>{let m=Mt(r,a,{env:process.env}),y=(c)=>{if(c.toString()==="ALIVE")m.stdout.off("data",y),l(m)};m.stdout.on("data",y)});return new yo(s,e)}});var mc=Re({key:"createRoom",do:({get:e,set:o,find:t},n,i,r)=>{let a=r?[i,r]:[i],s=t(To,n);o(s,a),o(mo,(y)=>y.add(n));let l=t(at,n);return e(l)}}),yc=Re({key:"joinRoom",do:(e,o,t,n)=>{let i={enteredAtEpoch:n};return Pe(Me,(r)=>{r.set({room:o,user:t},i)},e.env().store),i}}),cc=Re({key:"leaveRoom",do:(e,o,t)=>{Pe(Me,(n)=>{n.delete({room:o,user:t})},e.env().store)}}),Tc=Re({key:"destroyRoom",do:(e,o)=>{Pe(Me,(t)=>{t.delete({room:o})},e.env().store),e.set(mo,(t)=>(t.delete(o),t))}});function fo(e,o){return o.map((t)=>{switch(t.type){case"transaction_update":{let n=fo(e,t.updates);return{...t,updates:n}}default:return t}}).filter((t)=>{switch(t.type){case"atom_update":case"selector_update":return e.includes(t.key);case"state_creation":return e.includes(t.token.key);case"molecule_creation":return!0;case"transaction_update":return!0}})}var Sc=re({key:"redactor",default:{occlude:(e)=>e}}),Te=re({key:"unacknowledgedUpdates",default:()=>[]});var lt=re({key:"sockets",default:null}),Ac=se({key:"socketsIndex",mutable:!0,default:()=>new j,toJson:(e)=>e.toJSON(),fromJson:(e)=>j.fromJSON(e)}),xc=se({key:"usersIndex",mutable:!0,default:()=>new j,toJson:(e)=>e.toJSON(),fromJson:(e)=>j.fromJSON(e)}),po=ze({key:"usersOfSockets",between:["user","socket"],cardinality:"1:1",isAType:(e)=>e.startsWith("user::"),isBType:(e)=>e.startsWith("socket::")});function st(e,o,t,n){let i=o.key;return function r(){let a=[];for(let l of o.globals){let m=l.type==="mutable_atom"?W(e,l):l,y=O(e,m);a.push(m,y)}for(let l of o.perspectives){let{viewAtoms:m,resourceAtoms:y}=l,c=u(e,m,t),p=O(e,c);e.logger.info("\uD83D\uDC41","atom",y.key,`${t} can see`,{viewAtoms:m,resourceAtoms:y,userView:p});for(let S of p){let k=S.type==="mutable_atom"?W(e,S):S,M=O(e,k);a.push(k,M)}}let s=I(e)?e.transactionMeta.epoch.get(i)??null:null;n?.emit(`continuity-init:${i}`,s,a)}}function mt(e,o,t){let n=o.key;return function i(r){e.logger.info("\uD83D\uDECE\uFE0F","continuity",n,"received",r);let{key:a,id:s}=r,l=`tx-run:${a}:${s}`,m=`${l}:start`,y=`${l}:end`;performance.mark(m);try{me({type:"transaction",key:a},s,e)(...r.params)}catch(p){if(p instanceof Error)e.logger.error("\u274C","continuity",n,`failed to run transaction ${a} from ${t} with update ${s}`,p.message)}performance.mark(y);let c=performance.measure(l,m,y);e?.logger.info("\uD83D\uDE80","transaction",a,s,t,c.duration)}}function yt(e,o,t,n){let i=o.key;return function r(a){if(e.logger.info("\uD83D\uDC4D","continuity",i,`${t} acknowledged epoch ${a}`),n[0]?.epoch===a)w(e,Te,t,(l)=>{return l.shift(),e.logger.info("\uD83D\uDC4D","continuity",i,`${t} unacknowledged update queue now has`,l.length,"items"),l})}}function ct(e,o,t,n){let i=o.key,r=[];for(let a of o.actions){let s=to(a,(l)=>{try{let m=o.globals.map((p)=>{if(p.type==="atom")return p.key;return Q(p).key}).concat(o.perspectives.flatMap((p)=>{let{viewAtoms:S}=p,k=u(e,S,t);return O(e,k).map(($)=>{return $.type==="mutable_atom"?"*"+$.key:$.key})})),y=fo(m,l.updates),c={...l,updates:y};w(e,Te,t,(p)=>{if(c)p.push(c),p.sort((S,k)=>S.epoch-k.epoch),e.logger.info("\uD83D\uDC4D","continuity",i,`${t} unacknowledged update queue now has`,p.length,"items");return p}),n?.emit(`tx-new:${i}`,c)}catch(m){if(m instanceof Error)e.logger.error("\u274C","continuity",i,`${t} failed to send update from transaction ${a.key} to ${t}`,m.message)}},`sync-continuity:${i}:${t}`,e);r.push(s)}return r}function Tt(e,o,t,n){let i=o.key,r=[];for(let a of o.perspectives){let{viewAtoms:s}=a,l=u(e,s,t),m=P(l,({oldValue:y,newValue:c})=>{let p=y.map(($)=>$.key),S=c.map(($)=>$.key),k=y.filter(($)=>!S.includes($.key)),M=c.filter(($)=>!p.includes($.key)).flatMap(($)=>{let E=$.type==="mutable_atom"?W(e,$):$,X=O(e,E);return[E,X]});if(e.logger.info("\uD83D\uDC41","atom",a.resourceAtoms.key,`${t} has a new perspective`,{oldKeys:p,newKeys:S,revealed:M,concealed:k}),M.length>0)n?.emit(`reveal:${i}`,M);if(k.length>0)n?.emit(`conceal:${i}`,k)},`sync-continuity:${i}:${t}:perspective:${a.resourceAtoms.key}`,e);r.push(m)}return r}function Lc({socket:e,store:o=R.STORE}){return function t(n){let i=e,r=n.key,a=so(po,`socket::${i.id}`,o).userKeyOfSocket,s=O(o,a);if(!s)return o.logger.error("\u274C","continuity",r,`Tried to create a synchronizer for a socket (${i.id}) that is not connected to a user.`),()=>{};let l=so(po,s,o).socketKeyOfUser,m=P(l,({newValue:E})=>{if(o.logger.info("\uD83D\uDC4B","continuity",r,`seeing ${s} on new socket ${E}`),E===null){o.logger.warn("\u274C","continuity",r,`User (${s}) is not connected to a socket, waiting for them to reappear.`);return}let X=u(o,lt,E);i=O(o,X);for(let T of y)i?.emit(`tx-new:${r}`,T)},`sync-continuity:${r}:${s}`,o),y=O(o,Te,s),c=[],p=Tt(o,n,s,i),S=ct(o,n,s,i);c.push(...p,...S);let k=st(o,n,s,e);i.off(`get:${r}`,k),i.on(`get:${r}`,k);let M=mt(o,n,s);i.off(`tx-run:${r}`,M),i.on(`tx-run:${r}`,M);let $=yt(o,n,s,y);return i?.on(`ack:${r}`,$),()=>{for(let E of c)E();i?.off(`ack:${r}`,$),i?.off(`get:${r}`,k),i?.off(`tx-run:${r}`,M)}}}var Je=new co;Object.assign(console,Je.logger,{log:Je.logger.info});Je.on("timeToStop",function e(){Je.logger.info("\uD83D\uDEEC game worker exiting"),process.exit(0)});Je.logger.info("\uD83D\uDEEB game worker ready");
|
|
15
|
+
${T.trace}`:`No previous disposal trace for ${s} was found.`),t}let m=e.moleculeGraph.getRelationEntries({downstreamMoleculeKey:a.stringKey}).filter(([,{source:T}])=>T!==i).map(([T])=>w(T));if(n)r.moleculeGraph.delete(i);r.moleculeGraph.set({upstreamMoleculeKey:l.stringKey,downstreamMoleculeKey:a.stringKey},{source:l.stringKey});let y={type:"molecule_transfer",key:a.key,from:m,to:[l.key]};if(K(r)&&r.transactionMeta.phase==="building")r.transactionMeta.update.updates.push(y);return t}function Ge(e,o,t){switch(o){case"newValue":{jo(e,t);break}case"oldValue":{le(t,e.token);break}}}function Le(e,o,t){switch(o){case"newValue":{le(t,e.token);break}case"oldValue":{if(jo(e,t),e.subType==="atom")t.valueMap.set(e.token.key,e.value);break}}}function jo(e,o){let{family:t}=e.token;if(t){let n=o.families.get(t.key);if(n)u(o,n,w(t.subKey))}}function zo(e,o,t){switch(o){case"newValue":ie(t,e.provenance,e.key);break;case"oldValue":re(t,e.key);break}}function Ho(e,o,t){switch(o){case"newValue":re(t,e.key);break;case"oldValue":{let n=e.provenance.map(w);ie(t,n,e.key);for(let[i,r]of e.values){let a=t.families.get(i);if(a){u(t,a,e.key);let s=`${i}(${x(e.key)})`;t.valueMap.set(s,r)}}}break}}function Po(e,o,t){switch(o){case"newValue":{let n=e.to.length===1?e.to[0]:e.to;me(t,n,e.key,"exclusive")}break;case"oldValue":{let n=e.from.length===1?e.from[0]:e.from;me(t,n,e.key,"exclusive")}break}}function We(e,o,t){let n=e==="newValue"?o.updates:[...o.updates].reverse();for(let i of n)switch(i.type){case"atom_update":case"selector_update":Ie(e,i,t);break;case"state_creation":Ge(i,e,t);break;case"state_disposal":Le(i,e,t);break;case"molecule_creation":zo(i,e,t);break;case"molecule_disposal":Ho(i,e,t);break;case"molecule_transfer":Po(i,e,t);break;case"transaction_update":We(e,i,t);break}}function Vo(e,o,t){if(W(t)&&e)t.transactionMeta.epoch.set(e,o)}function Xo(e,o,t){if(!W(t))return;let i=t.transactionMeta.actionContinuities.getRelatedKey(e);if(i!==void 0)t.transactionMeta.epoch.set(i,o)}var Do=(e,o)=>{let t=f(o),{parent:n}=t;if(n===null||!K(t)||t.transactionMeta?.phase!=="building"){o.logger.warn("\uD83D\uDC1E","transaction","???","applyTransaction called outside of a transaction. This is probably a bug in AtomIO.");return}t.transactionMeta.phase="applying",t.transactionMeta.update.output=e,n.child=null,n.on.transactionApplying.next(t.transactionMeta);let{updates:i}=t.transactionMeta.update;if(o.logger.info("\uD83D\uDEC4","transaction",t.transactionMeta.update.key,`Applying transaction with ${i.length} updates:`,i),We("newValue",t.transactionMeta.update,n),W(n))Xo(t.transactionMeta.update.key,t.transactionMeta.update.epoch,n),F({key:t.transactionMeta.update.key,type:"transaction"},o)?.subject.next(t.transactionMeta.update),o.logger.info("\uD83D\uDEEC","transaction",t.transactionMeta.update.key,"Finished applying transaction.");else if(K(n))n.transactionMeta.update.updates.push(t.transactionMeta.update);n.on.transactionApplying.next(null)};function No(e,o,t){if(!W(t))return;let{epoch:i,actionContinuities:r}=t.transactionMeta;if(r.set(e,o),!i.has(e))i.set(e,-1)}function qo(e){return{store:e}}function J(e,...o){let t,n,i;if(o.length===1)t=o[0];else n=o[0],i=o[1],t=u(e,n,i);if("counterfeit"in t&&"family"in t){n=e.families.get(t.family.key);let r=t.family.subKey,a=e.disposalTraces.buffer.find((s)=>s?.key===r);switch(e.logger.error("\u274C",t.type,t.key,`could not be retrieved because it was not found in the store "${e.config.name}".`,a?`This state was previously disposed:
|
|
16
|
+
${a.trace}`:"No previous disposal trace was found."),n.type){case"atom_family":case"mutable_atom_family":return e.defaults.get(n.key);case"selector_family":case"readonly_selector_family":{if(e.defaults.has(n.key))return e.defaults.get(t.family.key);let s=F(n,e).default(r);return e.defaults.set(n.key,s),s}}}return oe(F(t,e),e)}class E{a;b;cardinality;relations=new Map;contents=new Map;isAType;isBType;isContent;makeContentKey=(e,o)=>`${e}:${o}`;warn;getRelatedKeys(e){return this.relations.get(e)}addRelation(e,o){let t=this.relations.get(e),n=this.relations.get(o);if(t)t.add(o);else t=new Set([o]),this.relations.set(e,t);if(n)n.add(e);else n=new Set([e]),this.relations.set(o,n)}deleteRelation(e,o){let t=this.relations.get(e);if(t){if(t.delete(o),t.size===0)this.relations.delete(e);let n=this.relations.get(o);if(n){if(n.delete(e),n.size===0)this.relations.delete(o)}}}replaceRelationsUnsafely(e,o){this.relations.set(e,new Set(o));for(let t of o){let n=new Set().add(e);this.relations.set(t,n)}}replaceRelationsSafely(e,o){let t=this.relations.get(e),n=this.isAType?.(e)?e:void 0,i=n===void 0?e:void 0;if(t)for(let r of t){n??=r,i??=r;let a=this.relations.get(r);if(a){if(a.size===1)this.relations.delete(r);else a.delete(e);this.contents.delete(this.makeContentKey(n,i))}}this.relations.set(e,new Set(o));for(let r of o){let a=this.relations.get(r);if(a)a.add(e);else a=new Set().add(e),this.relations.set(r,a)}}getContentInternal(e){return this.contents.get(e)}setContent(e,o){this.contents.set(e,o)}deleteContent(e){this.contents.delete(e)}constructor(e,o){if(this.a=e.between[0],this.b=e.between[1],this.cardinality=e.cardinality,!o?.externalStore)this.relations=new Map(e.relations?.map(([t,n])=>[t,new Set(n)])),this.contents=new Map(e.contents);if(this.isAType=o?.isAType??null,this.isBType=o?.isBType??null,this.isContent=o?.isContent??null,o?.makeContentKey)this.makeContentKey=o.makeContentKey;if(o?.externalStore){let t=o.externalStore;if(this.has=(n,i)=>t.has(n,i),this.addRelation=(n,i)=>{t.addRelation(n,i)},this.deleteRelation=(n,i)=>{t.deleteRelation(n,i)},this.replaceRelationsSafely=(n,i)=>{t.replaceRelationsSafely(n,i)},this.replaceRelationsUnsafely=(n,i)=>{t.replaceRelationsUnsafely(n,i)},this.getRelatedKeys=(n)=>t.getRelatedKeys(n),t.getContent)this.getContentInternal=(n)=>{return t.getContent(n)},this.setContent=(n,i)=>{t.setContent(n,i)},this.deleteContent=(n)=>{t.deleteContent(n)};for(let[n,i]of e.relations??[]){let r=this.isAType?.(n)?n:void 0,a=r===void 0?n:void 0;for(let s of i)r??=s,a??=s,this.addRelation(r,a)}for(let[n,i]of e.contents??[])this.setContent(n,i)}if(o?.warn)this.warn=o.warn}toJSON(){return{between:[this.a,this.b],cardinality:this.cardinality,relations:[...this.relations.entries()].map(([e,o])=>[e,[...o]]),contents:[...this.contents.entries()]}}set(...e){let o,t,n;switch(e.length){case 1:{let i=e[0];o=i[this.a],t=i[this.b],n=void 0;break}case 2:{let i=e[0];if(typeof i==="string")[o,t]=e;else o=i[this.a],t=i[this.b],n=e[1];break}default:{o=e[0],t=e[1],n=e[2];break}}switch(this.cardinality){case"1:1":{let i=this.getRelatedKey(o);if(i&&i!==t)this.delete(o,i)}case"1:n":{let i=this.getRelatedKey(t);if(i&&i!==o)this.delete(i,t)}}if(n){let i=this.makeContentKey(o,t);this.setContent(i,n)}return this.addRelation(o,t),this}delete(e,o){o=typeof o==="string"?o:e[this.b];let t=typeof e==="string"?e:e[this.a];if(t===void 0&&typeof o==="string"){let n=this.getRelatedKeys(o);if(n)for(let i of n)this.delete(i,o)}if(typeof t==="string"&&o===void 0){let n=this.getRelatedKeys(t);if(n)for(let i of n)this.delete(t,i)}if(typeof t==="string"&&typeof o==="string"){this.deleteRelation(t,o);let n=this.makeContentKey(t,o);this.deleteContent(n)}return this}getRelatedKey(e){let o=this.getRelatedKeys(e);if(o){if(o.size>1)this.warn?.(`${o.size} related keys were found for key "${e}": (${[...o].map((n)=>`"${n}"`).join(", ")}). Only one related key was expected.`);let t;for(let n of o){t=n;break}return t}}replaceRelations(e,o,t){let n=!Array.isArray(o),i=n?Object.keys(o):o;if(t?.reckless)this.replaceRelationsUnsafely(e,i);else this.replaceRelationsSafely(e,i);if(n)for(let r of i){let a=this.makeContentKey(e,r),s=o[r];this.setContent(a,s)}return this}getContent(e,o){let t=this.makeContentKey(e,o);return this.getContentInternal(t)}getRelationEntries(e){let o=e[this.a],t=e[this.b];if(o!==void 0&&t===void 0){let n=this.getRelatedKeys(o);if(n)return[...n].map((i)=>{return[i,this.getContent(o,i)]})}if(o===void 0&&t!==void 0){let n=this.getRelatedKeys(t);if(n)return[...n].map((i)=>{return[i,this.getContent(i,t)]})}return[]}has(e,o){if(o)return this.getRelatedKeys(e)?.has(o)??!1;return this.relations.has(e)}}class D extends Map{source;deleted=new Set;constructor(e){super();this.source=e}get(e){if(super.has(e))return super.get(e);if(!this.deleted.has(e)&&this.source.has(e))return this.source.get(e);return}set(e,o){return this.deleted.delete(e),super.set(e,o)}hasOwn(e){return super.has(e)}has(e){return!this.deleted.has(e)&&(super.has(e)||this.source.has(e))}delete(e){return this.deleted.add(e),super.delete(e)}}var Uo=(e,o,t,n)=>{let i=f(t),r={parent:i,child:null,on:i.on,loggers:i.loggers,logger:i.logger,config:i.config,atoms:new D(i.atoms),atomsThatAreDefault:new Set(i.atomsThatAreDefault),families:new D(i.families),joins:new D(i.joins),operation:{open:!1},readonlySelectors:new D(i.readonlySelectors),timelines:new D(i.timelines),timelineTopics:new E(i.timelineTopics.toJSON()),trackers:new Map,transactions:new D(i.transactions),selectorAtoms:new E(i.selectorAtoms.toJSON()),selectorGraph:new E(i.selectorGraph.toJSON(),{makeContentKey:(...m)=>m.sort().join(":")}),selectors:new D(i.selectors),valueMap:new D(i.valueMap),defaults:i.defaults,disposalTraces:t.disposalTraces.copy(),molecules:new D(i.molecules),moleculeGraph:new E(i.moleculeGraph.toJSON(),{makeContentKey:i.moleculeGraph.makeContentKey}),moleculeData:new E(i.moleculeData.toJSON(),{makeContentKey:i.moleculeData.makeContentKey}),moleculeJoins:new E(i.moleculeJoins.toJSON(),{makeContentKey:i.moleculeJoins.makeContentKey}),miscResources:new D(i.miscResources)},a=Yo(e,t),s={phase:"building",update:{type:"transaction_update",key:e,id:n,epoch:a===void 0?Number.NaN:a+1,updates:[],params:o,output:void 0},toolkit:{get:(...m)=>J(l,...m),set:(...m)=>{B(l,...m)},run:(m,y=Je())=>ye(m,y,l),find:(m,y)=>u(l,m,y),seek:(m,y)=>z(l,m,y),json:(m)=>I(l,m),dispose:(...m)=>{le(l,...m)},env:()=>qo(l)}},l=Object.assign(r,{transactionMeta:s});return i.child=l,t.logger.info("\uD83D\uDEEB","transaction",e,"Building transaction with params:",o),l};function Qe(e,o){let t={key:e.key,type:"transaction",run:(r,a)=>{let s=Uo(e.key,r,o,a);try{let l=f(o),{toolkit:m}=s.transactionMeta,y=e.do(m,...r);return Do(y,l),y}catch(l){throw Ro(n),o.logger.warn("\uD83D\uDCA5","transaction",e.key,"caught:",l),l}},install:(r)=>Qe(e,r),subject:new g},n=f(o);n.transactions.set(t.key,t);let i=Y(t);return o.on.transactionCreation.next(i),i}function Yo(e,o){let t=W(o),n=t?o.transactionMeta.actionContinuities.getRelatedKey(e):void 0;return t&&n!==void 0?o.transactionMeta.epoch.get(n):void 0}function Fe(e){return Qe(e,C.STORE)}class Go{parent=null;child=null;valueMap=new Map;defaults=new Map;atoms=new Map;selectors=new Map;readonlySelectors=new Map;atomsThatAreDefault=new Set;selectorAtoms=new E({between:["selectorKey","atomKey"],cardinality:"n:n"});selectorGraph=new E({between:["upstreamSelectorKey","downstreamSelectorKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});trackers=new Map;families=new Map;joins=new Map;transactions=new Map;transactionMeta={epoch:new Map,actionContinuities:new E({between:["continuity","action"],cardinality:"1:n"})};timelines=new Map;timelineTopics=new E({between:["timelineKey","topicKey"],cardinality:"1:n"});disposalTraces=new Oe(100);molecules=new Map;moleculeJoins=new E({between:["moleculeKey","joinKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});moleculeGraph=new E({between:["upstreamMoleculeKey","downstreamMoleculeKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});moleculeData=new E({between:["moleculeKey","stateFamilyKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});miscResources=new Map;on={atomCreation:new g,atomDisposal:new g,selectorCreation:new g,selectorDisposal:new g,timelineCreation:new g,transactionCreation:new g,transactionApplying:new Xe(null),operationClose:new g,moleculeCreation:new g,moleculeDisposal:new g};operation={open:!1};config={name:"IMPLICIT_STORE",lifespan:"ephemeral"};loggers=[new qe("warn",(e,o,t)=>!t.includes("\uD83D\uDD0D"))];logger={error:(...e)=>{for(let o of this.loggers)o.error(...e)},info:(...e)=>{for(let o of this.loggers)o.info(...e)},warn:(...e)=>{for(let o of this.loggers)o.warn(...e)}};constructor(e,o=null){if(this.config={...o?.config,...e},o!==null){if(this.valueMap=new Map(o?.valueMap),this.operation={...o?.operation},W(o))this.transactionMeta={epoch:new Map(o?.transactionMeta.epoch),actionContinuities:new E(o?.transactionMeta.actionContinuities.toJSON())};for(let[,n]of o.families){if(n.internalRoles?.includes("mutable")||n.internalRoles?.includes("join"))continue;n.install(this)}let t=new Set;for(let[,n]of o.atoms){if(t.has(n.key))continue;if(n.install(this),n.type==="mutable_atom"){let i=I(o,n),r=L(n);t.add(i.key),t.add(r.key)}}for(let[,n]of o.readonlySelectors)n.install(this);for(let[,n]of o.selectors){if(t.has(n.key))continue;n.install(this)}for(let[,n]of o.transactions)n.install(this);for(let[,n]of o.timelines)n.install(this)}}}var C={get STORE(){if(!globalThis.ATOM_IO_IMPLICIT_STORE)globalThis.ATOM_IO_IMPLICIT_STORE=new Go({name:"IMPLICIT_STORE",lifespan:"ephemeral"});return globalThis.ATOM_IO_IMPLICIT_STORE}};function F(e,o){let t,n=o;while(n!==null){switch(e.type){case"atom":case"mutable_atom":t=n.atoms.get(e.key);break;case"selector":t=n.selectors.get(e.key);break;case"readonly_selector":t=n.readonlySelectors.get(e.key);break;case"atom_family":case"mutable_atom_family":case"selector_family":case"readonly_selector_family":t=n.families.get(e.key);break;case"timeline":t=n.timelines.get(e.key);break;case"transaction":t=n.transactions.get(e.key);break}if(t)return t;n=n.child}throw new ae(e,o)}function Lo(e,o,t){let n=e.families.get(o.key);if(n===void 0)throw new ae(o,e);let i=n(t),r=f(e);if(i.family){if(W(r))switch(i.type){case"atom":case"mutable_atom":e.on.atomCreation.next(i);break;case"selector":case"readonly_selector":e.on.selectorCreation.next(i);break}else if(K(r)&&r.on.transactionApplying.state===null)r.transactionMeta.update.updates.push({type:"state_creation",token:i})}return i}function z(e,o,t){let n=x(t),i=`${o.key}(${n})`,r=f(e),a;switch(o.type){case"atom_family":case"mutable_atom_family":a=r.atoms.get(i);break;case"selector_family":a=r.selectors.get(i);break;case"readonly_selector_family":a=r.readonlySelectors.get(i);break}if(a)return Y(a);return a}function u(e,o,t){let n=z(e,o,t);if(n)return n;let i=x(t),r=e.molecules.get(i);if(!r&&e.config.lifespan==="immortal"){let a=xo(o,t);return e.logger.error("\u274C",a.type,a.key,`was not found in store "${e.config.name}"; returned a counterfeit token.`),a}if(n=Lo(e,o,t),r)f(e).moleculeData.set(i,o.key);return n}function le(e,...o){let t;if(o.length===1)t=o[0];else{let n=o[0],i=o[1];t=u(e,n,i)}try{F(t,e)}catch(n){e.logger.error("\u274C",t.type,t.key,`could not be disposed because it was not found in the store "${e.config.name}".`);return}switch(t.type){case"atom":case"mutable_atom":Ze(t,e);break;case"selector":case"readonly_selector":Qo(t,e);break}}var Ee=(e,o)=>f(o).atoms.has(e),Ct=(e,o)=>f(o).selectors.has(e),Ft=(e,o)=>f(o).readonlySelectors.has(e),Zo=(e,o)=>Ee(e,o)||Ct(e,o)||Ft(e,o);var _e=(e,o)=>{return f(o).selectorGraph.getRelationEntries({downstreamSelectorKey:e}).filter(([n,{source:i}])=>i!==e).map(([n,{source:i}])=>i).filter((n)=>Zo(n,o))};var eo=(e,o,t)=>{let n=[],i=_e(e,t);while(i.length>0){let r=i.shift();if(o.has(r))continue;if(o.add(r),!Ee(r,t))i.push(..._e(r,t));else if(!n.includes(r))n.push(r)}return n},et=(e,o)=>{let t=e.key,n=_e(t,o),i=new Set;return n.flatMap((r)=>Ee(r,o)?r:eo(r,i,o))};var ot=(e,o,t,n)=>{let i=f(n);if(o.type==="atom"||o.type==="mutable_atom")i.selectorAtoms.set({selectorKey:e,atomKey:o.key}),n.logger.info("\uD83D\uDD0D","selector",e,`discovers root atom "${o.key}"`);else{let r=eo(o.key,t,n);n.logger.info("\uD83D\uDD0D","selector",e,`discovers root atoms: [ ${r.map((a)=>`"${a}"`).join(", ")} ]`);for(let a of r)i.selectorAtoms=i.selectorAtoms.set({selectorKey:e,atomKey:a})}t.add(o.key)};var ve=(e,o,t)=>({get:(...n)=>{let i=f(t),r;if(n.length===2){let[l,m]=n;r=u(t,l,m)}else[r]=n;let a=F(r,t),s=oe(a,t);return t.logger.info("\uD83D\uDD0C","selector",e,`registers dependency ( "${r.key}" =`,s,")"),i.selectorGraph.set({upstreamSelectorKey:r.key,downstreamSelectorKey:e},{source:r.key}),ot(e,r,o,t),s},set:(...n)=>{let i,r;if(n.length===2)i=n[0],r=n[1];else{let l=n[0],m=n[1];r=n[2],i=u(t,l,m)}let a=f(t),s=F(i,a);we(s,r,a)},find:(n,i)=>u(t,n,i),seek:(n,i)=>z(t,n,i),json:(n)=>I(t,n)});var Ae=(e,o,t)=>{let n=f(e),i=new g,r=new Set,{get:a,find:s,seek:l,json:m}=ve(o.key,r,n),y=()=>{let k=o.get({get:a,find:s,seek:l,json:m});return X(o.key,k,i,f(e)),r.clear(),k},c={...o,subject:i,install:(k)=>Ae(k,o,t),get:y,type:"readonly_selector",...t&&{family:t}};n.readonlySelectors.set(o.key,c);let T=y();e.logger.info("\u2728",c.type,c.key,"=",T);let d={key:o.key,type:"readonly_selector"};if(t)d.family=t;return d};var Re=(e,o,t)=>{let n=f(e),i=new g,r=new Set,a=ve(o.key,r,n),{find:s,get:l,seek:m,json:y}=a,c={find:s,get:l,seek:m,json:y},T=(v=o.get,P=f(e))=>{let q=v(c);return X(o.key,q,i,P),r.clear(),q},k={...o,subject:i,install:(v)=>Re(v,o,t),get:T,set:(v)=>{let P=f(e),q=T(o.get,P),p=Be(v)(q);if(e.logger.info("\uD83D\uDCDD","selector",o.key,"set (",q,"->",p,")"),X(o.key,p,i,P),ce(P,o.key),W(P))i.next({newValue:p,oldValue:q});o.set(a,p)},type:"selector",...t&&{family:t}};n.selectors.set(o.key,k);let M=T();e.logger.info("\u2728",k.type,k.key,"=",M);let O={key:o.key,type:"selector"};if(t)O.family=t;return O};function be(e,o){if("set"in o){let i=Re(e,o,void 0);return e.on.selectorCreation.next(i),i}let n=Ae(e,o,void 0);return e.on.selectorCreation.next(n),n}function Qo(e,o){let t=f(o),{key:n}=e,i=F(e,t);if(!i.family)o.logger.error("\u274C","selector",n,"Standalone selectors cannot be disposed.");else{if(t.molecules.get(i.family.subKey))t.moleculeData.delete(i.family.subKey,i.family.key);switch(e.type){case"selector":{t.selectors.delete(n);let a=F({key:i.family.key,type:"selector_family"},o)}break;case"readonly_selector":t.readonlySelectors.delete(n),F({key:i.family.key,type:"readonly_selector_family"},o).subject.next({type:"state_disposal",subType:"selector",token:e});break}if(t.valueMap.delete(n),t.selectorAtoms.delete(n),t.selectorGraph.delete(n),o.logger.info("\uD83D\uDD25",e.type,n,"deleted"),K(t)&&t.transactionMeta.phase==="building")t.transactionMeta.update.updates.push({type:"state_disposal",subType:"selector",token:e});else o.on.selectorDisposal.next(e)}}function ge(e,o,t){let n={key:o.key,type:"selector_family"},i=e.families.get(o.key);if(i)e.logger.error("\u2757","selector_family",o.key,`Overwriting an existing ${U(i)} "${i.key}" in store "${e.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);let r=new g,s=Object.assign((l)=>{let m=x(l),y={key:o.key,subKey:m},c=`${o.key}(${m})`,T=f(e),d=Re(T,{key:c,get:o.get(l),set:o.set(l)},y);return r.next({type:"state_creation",token:d}),d},n,{internalRoles:t,subject:r,install:(l)=>ge(l,o),default:(l)=>{return o.get(l)({get:(...y)=>J(e,...y),find:(y,c)=>u(e,y,c),seek:(y,c)=>z(e,y,c),json:(y)=>I(e,y)})}});return e.families.set(o.key,s),n}function tt(e,o,t=C.STORE){let n=ge(t,{key:`${e.key}:JSON`,get:(r)=>({get:a})=>{let s=a(e,r);return o.toJson(s)},set:(r)=>({set:a},s)=>{a(e,r,o.fromJson(s))}},["mutable","json"]);return F(e,t).subject.subscribe(`store=${t.config.name}::json-selector-family`,(r)=>{if(r.token.family)z(t,n,w(r.token.family.subKey))}),n}var w=(e)=>JSON.parse(e),x=(e)=>JSON.stringify(e),$l=[Array.prototype,Boolean.prototype,Number.prototype,Object.prototype,String.prototype];var nt=(e,o)=>{let t=f(o);if(t.operation.open)return t.operation.prev.get(e.key);return t.valueMap.get(e.key)};var no=(e,o)=>{let t=f(o);return et(e,o).map((i)=>{let r=t.atoms.get(i);if(r===void 0)throw new Error(`Atom "${i}", a dependency of selector "${e.key}", not found in store "${o.config.name}".`);return r.subject.subscribe(`${e.type}:${e.key}`,(a)=>{o.logger.info("\uD83D\uDCE2",e.type,e.key,"root",i,"went",a.oldValue,"->",a.newValue);let s=nt(e,t),l=oe(e,t);o.logger.info("\u2728",e.type,e.key,"went",s,"->",l),e.subject.next({newValue:l,oldValue:s})})})};function H(e,o,t,n){function i(c){if(n.operation.open){let T=n.on.operationClose.subscribe(`state subscription ${t}`,()=>{T(),o(c)})}else o(c)}let r=F(e,n);n.logger.info("\uD83D\uDC40",r.type,r.key,`Adding subscription "${t}"`);let a=r.type==="selector"||r.type==="readonly_selector",s=null,l=i;if(a)s=no(r,n),l=(c)=>{if(s)s.length=0,s.push(...no(r,n));i(c)};let m=r.subject.subscribe(t,l);return()=>{if(n.logger.info("\uD83D\uDE48",r.type,r.key,`Removing subscription "${t}"`),m(),s)for(let c of s)c()}}var oo=(e,o,t,n)=>{let i=F(e,n);n.logger.info("\uD83D\uDC40","timeline",e.key,`Adding subscription "${t}"`);let r=i.subject.subscribe(t,o);return()=>{n.logger.info("\uD83D\uDE48","timeline",e.key,`Removing subscription "${t}" from timeline`),r()}};var to=(e,o,t,n)=>{let i=F(e,n);n.logger.info("\uD83D\uDC40","transaction",e.key,`Adding subscription "${t}"`);let r=i.subject.subscribe(t,o);return()=>{n.logger.info("\uD83D\uDE48","transaction",e.key,`Removing subscription "${t}"`),r()}};class te{Update;initializeState(e,o){let t=`*${e.key}`;o.atoms.delete(t),o.valueMap.delete(t);let n=e.family?{key:`*${e.family.key}`,subKey:e.family.subKey}:void 0,i=Z(o,{key:t,default:null},n);if(o.parent?.valueMap.has(t)){let r=o.parent.valueMap.get(t);o.valueMap.set(t,r)}return i}unsubscribeFromInnerValue;unsubscribeFromState;observeCore(e,o,t){let n=`tracker:${t.config.name}:${K(t)?t.transactionMeta.update.key:"main"}:${e.key}`,i=J(t,e);this.unsubscribeFromInnerValue=i.subscribe(n,(r)=>{B(t,o,r)}),this.unsubscribeFromState=H(e,(r)=>{if(r.newValue!==r.oldValue)this.unsubscribeFromInnerValue(),this.unsubscribeFromInnerValue=r.newValue.subscribe(n,(a)=>{B(t,o,a)})},n,t)}updateCore(e,o,t){let n=`tracker:${t.config.name}:${K(t)?t.transactionMeta.update.key:"main"}:${e.key}`;H(o,({newValue:i,oldValue:r})=>{let a=t.timelineTopics.getRelatedKey(o.key);if(a){if(t.timelines.get(a)?.timeTraveling){let m=oo({key:a,type:"timeline"},(y)=>{m(),B(t,e,(c)=>{if(y==="redo"&&i)c.do(i);else if(y==="undo"&&r)c.undo(r);return c})},n,t);return}}let s=t.on.operationClose.subscribe(n,()=>{s();let l=J(t,e),m=i===null?-1:l.getUpdateNumber(i),y=m-l.cacheUpdateNumber;if(i&&y===1)B(t,e,(c)=>(c.do(i),c));else t.logger.info("\u274C","mutable_atom",e.key,`could not be updated. Expected update number ${l.cacheUpdateNumber+1}, but got ${m}`)})},n,t)}mutableState;latestUpdateState;dispose;constructor(e,o){this.mutableState=e;let t=f(o);this.latestUpdateState=this.initializeState(e,t),this.observeCore(e,this.latestUpdateState,t),this.updateCore(e,this.latestUpdateState,t),t.trackers.set(e.key,this),this.dispose=()=>{this.unsubscribeFromInnerValue(),this.unsubscribeFromState(),t.trackers.delete(e.key)}}}function Ke(e,o,t){e.logger.info("\uD83D\uDD28","atom",o.key,`creating in store "${e.config.name}"`);let n=f(e),i=n.atoms.get(o.key);if(i&&i.type==="mutable_atom")return e.logger.error("\u274C","atom",o.key,"Tried to create atom, but it already exists in the store."),Y(i);let r=new g,a={...o,type:"mutable_atom",install:(m)=>{return m.logger.info("\uD83D\uDEE0\uFE0F","atom",o.key,`installing in store "${m.config.name}"`),Ke(m,o,t)},subject:r};if(t)a.family=t;let s=o.default();n.atoms.set(a.key,a),je(o.key,e),X(o.key,s,r,n);let l=Y(a);if(o.effects){let m=0,y=[];for(let c of o.effects){let T=c({setSelf:(d)=>{B(e,l,d)},onSet:(d)=>H(l,d,`effect[${m}]`,e)});if(T)y.push(T);++m}a.cleanup=()=>{for(let c of y)c()}}if(new te(l,e),!t)ko(l,o,e);return l}class io{Update;latestUpdateAtoms;mutableAtoms;constructor(e,o){let t=Q(o,{key:`*${e.key}`,default:null},["mutable","updates"]);this.latestUpdateAtoms=F(t,o),this.mutableAtoms=e,this.mutableAtoms.subject.subscribe(`store=${o.config.name}::tracker-atom-family`,(n)=>{if(n.token.family){let i=w(n.token.family.subKey);z(o,this.latestUpdateAtoms,i),new te(n.token,o)}}),this.latestUpdateAtoms.subject.subscribe(`store=${o.config.name}::tracker-atom-family`,(n)=>{if(n.token.family){let i=w(n.token.family.subKey),r=z(o,this.mutableAtoms,i);if(r)new te(r,o)}})}}function xe(e,o,t){let n={key:o.key,type:"mutable_atom_family"},i=e.families.get(o.key);if(i)e.logger.error("\u2757","mutable_atom_family",o.key,`Overwriting an existing ${U(i)} "${i.key}" in store "${e.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);let r=new g,s=Object.assign((l)=>{let m=x(l),y={key:o.key,subKey:m},c=`${o.key}(${m})`,T=f(e),d={key:c,default:()=>o.default(l),toJson:o.toJson,fromJson:o.fromJson,mutable:!0};if(o.effects)d.effects=o.effects(l);let k=Ke(T,d,y);return r.next({type:"state_creation",token:k}),k},n,{subject:r,install:(l)=>xe(l,o),toJson:o.toJson,fromJson:o.fromJson,internalRoles:t});return e.families.set(o.key,s),tt(s,o,e),new io(s,e),n}var ro=(e,o)=>{let t=f(o),n=`${e.key}:JSON`;return t.families.get(n)};var I=(e,o)=>{if(o.family){let n=f(e),r={key:`${o.family.key}:JSON`,type:"selector_family"},a=F(r,n),s=JSON.parse(o.family.subKey);return u(e,a,s)}return{type:"selector",key:`${o.key}:JSON`}};var L=(e)=>{let t={type:"atom",key:`*${e.key}`};if(e.family)t.family={key:`*${e.family.key}`,subKey:e.family.subKey};return t};function wo(e){return typeof e==="object"&&e!==null&&"do"in e&&"undo"in e&&"subscribe"in e}function Ce(e,o,t){let n=o.valueMap.get(e.key),i=t.valueMap.get(e.key);if(n===i){if(n===void 0)return typeof e.default==="function"?e.default():e.default;o.logger.info("\uD83D\uDCC3","atom",e.key,"copying");let r=e.toJson(n),a=e.fromJson(r);return t.valueMap.set(e.key,a),new te(e,o),a}return i}function X(e,o,t,n){let i=n.valueMap.get(e);if(i instanceof ke)i.use(o);if(o instanceof Promise){let r=new ke(o);return n.valueMap.set(e,r),r.then((a)=>{X(e,a,t,n),t.next({newValue:a,oldValue:r})}).catch((a)=>{n.logger.error("\uD83D\uDCA5","state",e,"rejected:",a)}),r}return n.valueMap.set(e,o),o}var Ko=(e,o)=>{let t=o.valueMap.get(e.key);if(e.type==="mutable_atom"&&K(o)){let{parent:n}=o;t=Ce(e,n,o)}return t},ho=(e,o)=>{let t=o.valueMap.get(e);if(t instanceof ke){let n=t,i=o.selectors.get(e)??o.readonlySelectors.get(e);if(i)n.use(i.get());return}if(o.operation.open)o.operation.prev.set(e,t);o.valueMap.delete(e),o.logger.info("\uD83D\uDDD1","state",e,"evicted")};var Wo=(e,o)=>{return f(o).atomsThatAreDefault.has(e)},je=(e,o)=>{let t=f(o);t.atomsThatAreDefault=new Set(t.atomsThatAreDefault).add(e)},Eo=(e,o)=>{let t=f(o);t.atomsThatAreDefault=new Set(f(o).atomsThatAreDefault),t.atomsThatAreDefault.delete(e)};function Z(e,o,t){e.logger.info("\uD83D\uDD28","atom",o.key,`creating in store "${e.config.name}"`);let n=f(e),i=n.atoms.get(o.key);if(i&&i.type==="atom")return e.logger.error("\u274C","atom",o.key,"Tried to create atom, but it already exists in the store."),Y(i);let r=new g,a={...o,type:"atom",install:(m)=>{return m.logger.info("\uD83D\uDEE0\uFE0F","atom",o.key,`installing in store "${m.config.name}"`),Z(m,o,t)},subject:r};if(t)a.family=t;let s=o.default;if(o.default instanceof Function)s=o.default();n.atoms.set(a.key,a),je(o.key,e),X(o.key,s,r,n);let l=Y(a);if(o.effects){let m=0,y=[];for(let c of o.effects){let T=c({setSelf:(d)=>{B(e,l,d)},onSet:(d)=>H(l,d,`effect[${m}]`,e)});if(T)y.push(T);++m}a.cleanup=()=>{for(let c of y)c()}}return l}function Ao(e,o){if("mutable"in o){let i=Ke(e,o,void 0);return e.on.atomCreation.next(i),i}let n=Z(e,o,void 0);return e.on.atomCreation.next(n),n}function Ze(e,o){let t=f(o),{key:n,family:i}=e,r=F(e,t);if(!i)o.logger.error("\u274C","atom",n,"Standalone atoms cannot be disposed.");else{r.cleanup?.();let a=o.valueMap.get(r.key),s=F({key:i.key,type:"atom_family"},o),l={type:"state_disposal",subType:"atom",token:e,value:a};s.subject.next(l);let m=K(t);if(t.atoms.delete(n),t.valueMap.delete(n),t.selectorAtoms.delete(n),t.atomsThatAreDefault.delete(n),o.timelineTopics.delete(n),e.type==="mutable_atom"){let y=L(e);Ze(y,o),o.trackers.delete(n)}if(o.logger.info("\uD83D\uDD25","atom",n,"deleted"),m&&t.transactionMeta.phase==="building"){let y=t.transactionMeta.update.updates.at(-1);if(!(y?.type==="molecule_disposal"&&y.values.some(([d])=>d===r.family?.key)))t.transactionMeta.update.updates.push(l)}else o.on.atomDisposal.next(e)}}class _ extends Set{mode="record";subject=new g;cacheLimit=0;cache=[];cacheIdx=-1;cacheUpdateNumber=-1;constructor(e,o=0){super(e);if(e instanceof _)this.parent=e,this.cacheUpdateNumber=e.cacheUpdateNumber;if(o)this.cacheLimit=o,this.cache=new Array(o),this.subscribe("auto cache",(t)=>{this.cacheIdx++,this.cacheIdx%=this.cacheLimit,this.cache[this.cacheIdx]=t})}toJSON(){return{members:[...this],cache:this.cache,cacheLimit:this.cacheLimit,cacheIdx:this.cacheIdx,cacheUpdateNumber:this.cacheUpdateNumber}}static fromJSON(e){let o=new _(e.members,e.cacheLimit);return o.cache=e.cache,o.cacheIdx=e.cacheIdx,o.cacheUpdateNumber=e.cacheUpdateNumber,o}add(e){let o=super.add(e);if(this.mode==="record")this.cacheUpdateNumber++,this.emit(`add:${x(e)}`);return o}clear(){let e=this.mode==="record"?[...this]:null;if(super.clear(),e)this.cacheUpdateNumber++,this.emit(`clear:${JSON.stringify(e)}`)}delete(e){let o=super.delete(e);if(this.mode==="record")this.cacheUpdateNumber++,this.emit(`del:${x(e)}`);return o}parent;child=null;transactionUpdates=null;transaction(e){this.mode="transaction",this.transactionUpdates=[],this.child=new _(this);let o=this.child._subscribe("transaction",(t)=>{this.transactionUpdates?.push(t)});try{if(e(this.child)){for(let n of this.transactionUpdates)this.doStep(n);this.cacheUpdateNumber++,this.emit(`tx:${this.transactionUpdates.join(";")}`)}}catch(t){throw console.warn("Did not apply transaction to SetRTX; this error was thrown:",t),t}finally{o(),this.child=null,this.transactionUpdates=null,this.mode="record"}}_subscribe(e,o){return this.subject.subscribe(e,o)}subscribe(e,o){return this.subject.subscribe(e,(t)=>{o(`${this.cacheUpdateNumber}=${t}`)})}emit(e){this.subject.next(e)}doStep(e){let o=e.indexOf(":"),t=e.substring(0,o),n=e.substring(o+1);switch(t){case"add":this.add(JSON.parse(n));break;case"clear":this.clear();break;case"del":this.delete(JSON.parse(n));break;case"tx":for(let i of n.split(";"))this.doStep(i)}}getUpdateNumber(e){let o=e.indexOf("=");return Number(e.substring(0,o))}do(e){let o=e.indexOf("="),t=Number(e.substring(0,o)),n=t-this.cacheUpdateNumber;if(n>0){if(n===1){this.mode="playback";let r=e.substring(o+1);return this.doStep(r),this.mode="record",this.cacheUpdateNumber=t,null}return this.cacheUpdateNumber+1}if(Math.abs(n)<this.cacheLimit){let r=this.cacheIdx+n;if(this.cache[r]===e)return null;this.mode="playback";let s=!1;while(!s){this.cacheIdx%=this.cacheLimit;let m=this.cache[this.cacheIdx];if(this.cacheIdx--,!m)return"OUT_OF_RANGE";this.undo(m),s=this.cacheIdx===r-1}let l=e.substring(o+1);return this.doStep(l),this.mode="record",this.cacheUpdateNumber=t,null}return"OUT_OF_RANGE"}undoStep(e){let o=e.indexOf(":"),t=e.substring(0,o),n=e.substring(o+1);switch(t){case"add":this.delete(JSON.parse(n));break;case"del":this.add(JSON.parse(n));break;case"clear":{let i=JSON.parse(n);for(let r of i)this.add(r);break}case"tx":{let i=n.split(";");for(let r=i.length-1;r>=0;r--)this.undoStep(i[r])}}}undo(e){let o=e.indexOf("=");if(Number(e.substring(0,o))===this.cacheUpdateNumber){this.mode="playback";let n=e.substring(o+1);return this.undoStep(n),this.mode="record",this.cacheUpdateNumber--,null}return this.cacheUpdateNumber}}function h(e){return e[0].toUpperCase()+e.slice(1)}class ao{toolkit;options;defaultContent;molecules=new Map;relations;states;core;transact(e,o){let t=this.toolkit;this.toolkit=e,o(this),this.toolkit=t}store;realm;[Symbol.dispose](){}constructor(e,o,t=C.STORE){this.store=t,this.realm=new Ue(t),this.options=e,this.defaultContent=o,this.store.miscResources.set(`join:${e.key}`,this),this.realm.allocate("root",e.key),this.toolkit={get:(...p)=>J(t,...p),set:(...p)=>{B(t,...p)},find:(...p)=>u(t,...p),seek:(...p)=>z(t,...p),json:(p)=>I(t,p)};let n=e.between[0],i=e.between[1],r=xe(t,{key:`${e.key}/relatedKeys`,default:()=>new _,mutable:!0,fromJson:(p)=>_.fromJSON(p),toJson:(p)=>p.toJSON()},["join","relations"]);this.core={relatedKeysAtoms:r};let a=({get:p},S)=>p(r,S),s=({set:p},S,R)=>{if(!this.store.molecules.has(x(S)))this.realm.allocate(e.key,S);p(r,S,(b)=>b.add(R)),p(r,R,(b)=>b.add(S))},l=({set:p},S,R)=>{p(r,S,(b)=>{return b.delete(R),b}),p(r,R,(b)=>{return b.delete(S),b})},m=(p,S,R)=>{let{find:b,get:A,set:$}=p,j=b(r,S),N=A(j);for(let V of N){if(R.includes(V))continue;$(r,V,(G)=>{return G.delete(S),G})}$(j,(V)=>{return V.transaction((Te)=>{Te.clear();for(let G of R){let de=a(p,G),So=de.has(S);if(this.relations.cardinality==="1:n"){let uo=[];for(let Se of de){if(Se===S)continue;let ue=a(p,Se);if(ue.delete(G),ue.size===0)uo.push(Se)}if(!So&&de.size>0)de.clear();for(let Se of uo){let ue=[G,Se].sort(),Tt=`"${ue[0]}:${ue[1]}"`;this.molecules.delete(Tt)}}if(!So)de.add(S);Te.add(G)}return!0}),V})},y=(p,S,R)=>{let{set:b}=p;b(r,S,(A)=>{return A.transaction(($)=>{for(let j of R)$.add(j);return!0}),A});for(let A of R)b(r,A,($)=>{return $.add(S),$});return!0},c=(p,S,R)=>{let b=a(p,S);return R?b.has(R):b.size>0},T={getRelatedKeys:(p)=>a(this.toolkit,p),addRelation:(p,S)=>{this.store.moleculeJoins.set(p,e.key),this.store.moleculeJoins.set(S,e.key),s(this.toolkit,p,S)},deleteRelation:(p,S)=>{l(this.toolkit,p,S)},replaceRelationsSafely:(p,S)=>{m(this.toolkit,p,S)},replaceRelationsUnsafely:(p,S)=>{y(this.toolkit,p,S)},has:(p,S)=>c(this.toolkit,p,S)},d,k;if(o){k=Q(t,{key:`${e.key}/content`,default:o},["join","content"]);let p=({get:b},A)=>b(k,A),S=({set:b},A,$)=>{b(k,A,$)};d=Object.assign(T,{getContent:(b)=>{return p(this.toolkit,b)},setContent:(b,A)=>{S(this.toolkit,b,A)},deleteContent:(b)=>{this.realm.deallocate(b)}})}else d=T;let M=new E(e,{externalStore:d,isAType:e.isAType,isBType:e.isBType,makeContentKey:(...p)=>{let[S,R]=p,b=p.sort(),A=`${b[0]}:${b[1]}`,$=t.molecules.get(x(S)),j=t.molecules.get(x(R));if(!$)this.realm.allocate(e.key,S);if(!j)this.realm.allocate(e.key,R);return this.realm.allocate(S,A,"all"),this.realm.claim(R,A),this.store.moleculeJoins.set(A,e.key),A}}),O=()=>ee(t,{key:`${e.key}/singleRelatedKey`,get:(p)=>({get:S})=>{let R=S(r,p);for(let b of R)return b;return null}},["join","keys"]),v=()=>{return ee(t,{key:`${e.key}/multipleRelatedKeys`,get:(p)=>({get:S})=>{let R=ro(r,t);return S(R,p).members}},["join","keys"])},P=()=>ee(t,{key:`${e.key}/singleRelatedEntry`,get:(p)=>({get:S})=>{let R=S(r,p);for(let b of R){let A=M.isAType?.(p)?p:void 0,$=A===void 0?p:void 0;A??=b,$??=b;let j=M.makeContentKey(A,$),N=S(k,j);return[b,N]}return null}},["join","entries"]),q=()=>ee(t,{key:`${e.key}/multipleRelatedEntries`,get:(p)=>({get:S})=>{let R=ro(r,t);return S(R,p).members.map((A)=>{let $=M.isAType?.(p)?p:void 0,j=$===void 0?p:void 0;$??=A,j??=A;let N=M.makeContentKey($,j),V=S(k,N);return[A,V]})}},["join","entries"]);switch(e.cardinality){case"1:1":{let p=O(),S=`${n}KeyOf${h(i)}`,R=`${i}KeyOf${h(n)}`,b={[S]:p,[R]:p},A;if(o){let $=P(),j=`${n}EntryOf${h(i)}`,N=`${i}EntryOf${h(n)}`,V={[j]:$,[N]:$};A=Object.assign(b,V)}else A=b;this.relations=M,this.states=A;break}case"1:n":{let p=O(),S=v(),R=`${n}KeyOf${h(i)}`,b=`${i}KeysOf${h(n)}`,A={[R]:p,[b]:S},$;if(o){let j=P(),N=q(),V=`${n}EntryOf${h(i)}`,Te=`${i}EntriesOf${h(n)}`,G={[V]:j,[Te]:N};$=Object.assign(A,G)}else $=A;this.relations=M,this.states=$;break}default:{let p=v(),S=`${n}KeysOf${h(i)}`,R=`${i}KeysOf${h(n)}`,b={[S]:p,[R]:p},A;if(o){let $=q(),j=`${n}EntriesOf${h(i)}`,N=`${i}EntriesOf${h(n)}`,V={[j]:$,[N]:$};A=Object.assign(b,V)}else A=b;this.relations=M,this.states=A}}}}function ze(e,o,t=C.STORE){return t.joins.set(e.key,new ao(e,o,t)),{key:e.key,type:"join",a:e.between[0],b:e.between[1],cardinality:e.cardinality}}function lo(e,o){let t=o.joins.get(e.key);if(t===void 0){let i=C.STORE.joins.get(e.key);if(i===void 0)throw new Error(`Join "${e.key}" not found in store "${o.config.name}"`);t=new ao(i.options,i.defaultContent,o),o.joins.set(e.key,t)}return t}function so(e,o,t){let n=lo(e,t),i;switch(e.cardinality){case"1:1":{let r=`${e.a}KeyOf${h(e.b)}`,a=`${e.b}KeyOf${h(e.a)}`;i={get[r](){let l=n.states[r];return u(t,l,o)},get[a](){let l=n.states[a];return u(t,l,o)}};let s=`${e.a}EntryOf${h(e.b)}`;if(s in n.states){let l=`${e.b}EntryOf${h(e.a)}`;Object.assign(i,{get[s](){let m=n.states[s];return u(t,m,o)},get[l](){let m=n.states[l];return u(t,m,o)}})}break}case"1:n":{let r=`${e.a}KeyOf${h(e.b)}`,a=`${e.b}KeysOf${h(e.a)}`;i={get[r](){let l=n.states[r];return u(t,l,o)},get[a](){let l=n.states[a];return u(t,l,o)}};let s=`${e.a}EntryOf${h(e.b)}`;if(s in n.states){let l=`${e.b}EntriesOf${h(e.a)}`;Object.assign(i,{get[s](){let m=n.states[s];return u(t,m,o)},get[l](){let m=n.states[l];return u(t,m,o)}})}break}case"n:n":{let r=`${e.a}KeysOf${h(e.b)}`,a=`${e.b}KeysOf${h(e.a)}`;i={get[r](){let l=n.states[r];return u(t,l,o)},get[a](){let l=n.states[a];return u(t,l,o)}};let s=`${e.a}EntriesOf${h(e.b)}`;if(s in n.states){let l=`${e.b}EntriesOf${h(e.a)}`;Object.assign(i,{get[s](){let m=n.states[s];return u(t,m,o)},get[l](){let m=n.states[l];return u(t,m,o)}})}}}return i}function He(e,o,t){let n=lo(e,t),i=f(t);if(K(i)){let{toolkit:r}=i.transactionMeta;n.transact(r,({relations:a})=>{o(a)})}else o(n.relations)}function Rt(e,o){return lo(e,o).core.relatedKeysAtoms}function it(e){return Rt(e,C.STORE)}class rt extends Map{set(e,o){if(this.has(e))return console.warn("Tried to set a key that already exists in an InvariantMap",{key:e,value:o}),this;return super.set(e,o)}clear(){throw new Error("Cannot clear an InvariantMap")}}class Pe{key;type="continuity";globals=[];actions=[];perspectives=[];constructor(e){this.key=e}static existing=new rt;static create(e,o){let t=new Pe(e),{type:n,globals:i,actions:r,perspectives:a}=o(t),s={type:n,key:e,globals:i,actions:r,perspectives:a};return Pe.existing.set(e,s),s}add(...e){switch(e[0].type){case"atom":case"mutable_atom":this.globals.push(...e);break;case"transaction":this.actions.push(...e);break;case"atom_family":{let[t,n]=e;this.perspectives.push({type:"realtime_perspective",resourceAtoms:t,viewAtoms:n})}break}return this}}function Oy(e){let{key:o,config:t}=e,n=Pe.create(o,t),{actions:i}=n;for(let r of i)No(o,r.key,C.STORE);return Vo(o,-1,C.STORE),n}var Wy=se({key:"usersInRoomIndex",mutable:!0,default:()=>new _,toJson:(e)=>e.toJSON(),fromJson:(e)=>_.fromJSON(e)}),mo=se({key:"roomIndex",default:()=>new _,mutable:!0,toJson:(e)=>e.toJSON(),fromJson:(e)=>_.fromJSON(e)}),Kt={enteredAtEpoch:0},Me=ze({key:"usersInRooms",between:["room","user"],cardinality:"1:n",isAType:(e)=>typeof e==="string",isBType:(e)=>typeof e==="string"},Kt),Ey=he({key:"usersInMyRoomView",get:(e)=>({find:o})=>{let t=it(Me);return[o(t,e)]}});import{spawn as Mt}from"child_process";class pe{emit;listeners;globalListeners;handleEvent(e,...o){for(let n of this.globalListeners)n(e,...o);let t=this.listeners.get(e);if(t)for(let n of t)n(...o)}id="no_id_retrieved";constructor(e){this.emit=e;this.listeners=new Map,this.globalListeners=new Set}on(e,o){let t=this.listeners.get(e);if(t)t.add(o);else this.listeners.set(e,new Set([o]));return this}onAny(e){return this.globalListeners.add(e),this}off(e,o){let t=this.listeners.get(e);if(t)if(o)t.delete(o);else this.listeners.delete(e);return this}offAny(e){return this.globalListeners.delete(e),this}}class yo extends pe{incompleteData="";unprocessedEvents=[];incompleteLog="";unprocessedLogs=[];id="#####";process;key;logger;handleLog(e){if(Array.isArray(e)){let[o,...t]=e;switch(o){case"i":this.logger.info(...t);break;case"w":this.logger.warn(...t);break;case"e":this.logger.error(...t);break}}}constructor(e,o,t){super((n,...i)=>{let r=JSON.stringify([n,...i])+"\x03",a=(s)=>{if(s.code==="EPIPE")console.error("EPIPE error during write",this.process.stdin);this.process.stdin.removeListener("error",a)};return this.process.stdin.once("error",a),this.process.stdin.write(r),this});if(this.process=e,this.key=o,this.logger=t??{info:(...n)=>{console.info(this.id,this.key,...n)},warn:(...n)=>{console.warn(this.id,this.key,...n)},error:(...n)=>{console.error(this.id,this.key,...n)}},this.process.stdout.on("data",(n)=>{let i=n.toString();if(i==="ALIVE")return;this.unprocessedEvents.push(...i.split("\x03"));let r=this.unprocessedEvents.shift();this.incompleteData+=r??"";try{if(this.incompleteData.startsWith("error"))console.log("\u2757",this.incompleteData);let a=w(this.incompleteData);this.handleEvent(...a);while(this.unprocessedEvents.length>0){let s=this.unprocessedEvents.shift();if(s){if(this.unprocessedEvents.length===0)this.incompleteData=s;a=w(s),this.handleEvent(...a)}}this.incompleteData=""}catch(a){console.warn("\u26A0\uFE0F----------------\u26A0\uFE0F"),console.warn(this.incompleteData),console.warn("\u26A0\uFE0F----------------\u26A0\uFE0F"),console.error(a)}}),this.process.stderr.on("data",(n)=>{let i=n.toString();this.unprocessedLogs.push(...i.split("\x03"));let r=this.unprocessedLogs.shift();this.incompleteLog+=r??"";try{let a=w(this.incompleteLog);this.handleLog(a);while(this.unprocessedLogs.length>0)if(this.incompleteLog=this.unprocessedLogs.shift()??"",this.incompleteLog)a=w(this.incompleteLog),this.handleLog(a)}catch(a){console.error("\u274C\u274C\u274C"),console.error(this.incompleteLog),console.error(a),console.error("\u274C\u274C\u274C\uFE0F")}}),e.pid)this.id=e.pid.toString()}}class at extends pe{in;out;id="no_id_retrieved";disposalFunctions=[];constructor(e){super((...o)=>{return this.out.next(o),this});this.id=e,this.in=new g,this.out=new g,this.in.subscribe("socket",(o)=>{this.handleEvent(...o)})}dispose(){for(let e of this.disposalFunctions)e()}}class co extends pe{incompleteData="";unprocessedEvents=[];relays;relayServices;process;id="#####";log(...e){this.process.stderr.write(x(e.map((o)=>o instanceof _?`{ ${o.toJSON().members.join(" | ")} }`:o))+"\x03")}logger={info:(...e)=>{this.log("i",...e)},warn:(...e)=>{this.log("w",...e)},error:(...e)=>{this.log("e",...e)}};constructor(){super((e,...o)=>{let t=JSON.stringify([e,...o]);return this.process.stdout.write(t+"\x03"),this});if(this.process=process,this.process.stdin.resume(),this.relays=new Map,this.relayServices=[],this.process.stdin.on("data",(e)=>{let o=e.toString();this.unprocessedEvents.push(...o.split("\x03"));let t=this.unprocessedEvents.shift();this.incompleteData+=t??"";try{let n=w(this.incompleteData);this.logger.info("\uD83C\uDFB0","received",n),this.handleEvent(...n);while(this.unprocessedEvents.length>0){let i=this.unprocessedEvents.shift();if(i){if(this.unprocessedEvents.length===0)this.incompleteData=i;let r=w(i);this.handleEvent(...r)}}this.incompleteData=""}catch(n){if(n instanceof Error)this.logger.error("\u2757",n.message,n.cause,n.stack)}}),this.on("exit",()=>{this.logger.info("\uD83D\uDD25",this.id,'received "exit"'),process.exit(0)}),process.on("exit",(e)=>{this.logger.info("\uD83D\uDD25",this.id,`exited with code ${e}`)}),process.on("end",()=>{this.logger.info("\uD83D\uDD25",this.id,"ended"),process.exit(0)}),process.on("SIGTERM",()=>{this.logger.error("\uD83D\uDD25",this.id,"terminated"),process.exit(0)}),process.on("SIGINT",()=>{this.logger.error("\uD83D\uDD25",this.id,"interrupted"),process.exit(0)}),process.pid)this.id=process.pid?.toString();this.on("user-joins",(e)=>{this.logger.info("\uD83D\uDC64","user",e,"joined");let o=new at(`user:${e}`);this.relays.set(e,o),this.logger.info("\uD83D\uDD17","attaching services:",`[${[...this.relayServices.keys()].join(", ")}]`);for(let t of this.relayServices){let n=t(o);if(n)o.disposalFunctions.push(n)}this.on(`user:${e}`,(...t)=>{o.in.next(t)}),o.out.subscribe("socket",(t)=>{this.emit(...t)})}),this.on("user-leaves",(e)=>{let o=this.relays.get(e);if(this.off(`relay:${e}`),o)o.dispose(),this.relays.delete(e)}),process.stdout.write("ALIVE")}relay(e){this.logger.info("\uD83D\uDD17","running relay method"),this.relayServices.push(e)}}var po=ne({key:"roomArguments",default:["echo",["Hello World!"]]}),lt=he({key:"room",get:(e)=>async({get:o,find:t})=>{let n=t(po,e),i=o(n),[r,a]=i,s=await new Promise((l)=>{let m=Mt(r,a,{env:process.env}),y=(c)=>{if(c.toString()==="ALIVE")m.stdout.off("data",y),l(m)};m.stdout.on("data",y)});return new yo(s,e)}});var mc=Fe({key:"createRoom",do:({get:e,set:o,find:t},n,i,r)=>{let a=r?[i,r]:[i],s=t(po,n);o(s,a),o(mo,(y)=>y.add(n));let l=t(lt,n);return e(l)}}),yc=Fe({key:"joinRoom",do:(e,o,t,n)=>{let i={enteredAtEpoch:n};return He(Me,(r)=>{r.set({room:o,user:t},i)},e.env().store),i}}),cc=Fe({key:"leaveRoom",do:(e,o,t)=>{He(Me,(n)=>{n.delete({room:o,user:t})},e.env().store)}}),pc=Fe({key:"destroyRoom",do:(e,o)=>{He(Me,(t)=>{t.delete({room:o})},e.env().store),e.set(mo,(t)=>(t.delete(o),t))}});function fo(e,o){return o.map((t)=>{switch(t.type){case"transaction_update":{let n=fo(e,t.updates);return{...t,updates:n}}default:return t}}).filter((t)=>{switch(t.type){case"atom_update":case"selector_update":return e.includes(t.key);case"state_creation":return e.includes(t.token.key);case"molecule_creation":return!0;case"transaction_update":return!0}})}var dc=ne({key:"redactor",default:{occlude:(e)=>e}}),fe=ne({key:"unacknowledgedUpdates",default:()=>[]});var st=ne({key:"sockets",default:null}),xc=se({key:"socketsIndex",mutable:!0,default:()=>new _,toJson:(e)=>e.toJSON(),fromJson:(e)=>_.fromJSON(e)}),Ac=se({key:"usersIndex",mutable:!0,default:()=>new _,toJson:(e)=>e.toJSON(),fromJson:(e)=>_.fromJSON(e)}),To=ze({key:"usersOfSockets",between:["user","socket"],cardinality:"1:1",isAType:(e)=>e.startsWith("user::"),isBType:(e)=>e.startsWith("socket::")});function mt(e,o,t,n){let i=o.key;return function r(){let a=[];for(let l of o.globals){let m=l.type==="mutable_atom"?I(e,l):l,y=J(e,m);a.push(m,y)}for(let l of o.perspectives){let{viewAtoms:m,resourceAtoms:y}=l,c=u(e,m,t),T=J(e,c);e.logger.info("\uD83D\uDC41","atom",y.key,`${t} can see`,{viewAtoms:m,resourceAtoms:y,userView:T});for(let d of T){let k=d.type==="mutable_atom"?I(e,d):d,M=J(e,k);a.push(k,M)}}let s=W(e)?e.transactionMeta.epoch.get(i)??null:null;n?.emit(`continuity-init:${i}`,s,a)}}function yt(e,o,t){let n=o.key;return function i(r){e.logger.info("\uD83D\uDECE\uFE0F","continuity",n,"received",r);let{key:a,id:s}=r,l=`tx-run:${a}:${s}`,m=`${l}:start`,y=`${l}:end`;performance.mark(m);try{ye({type:"transaction",key:a},s,e)(...r.params)}catch(T){if(T instanceof Error)e.logger.error("\u274C","continuity",n,`failed to run transaction ${a} from ${t} with update ${s}`,T.message)}performance.mark(y);let c=performance.measure(l,m,y);e?.logger.info("\uD83D\uDE80","transaction",a,s,t,c.duration)}}function ct(e,o,t,n){let i=o.key;return function r(a){if(e.logger.info("\uD83D\uDC4D","continuity",i,`${t} acknowledged epoch ${a}`),n[0]?.epoch===a)B(e,fe,t,(l)=>{return l.shift(),e.logger.info("\uD83D\uDC4D","continuity",i,`${t} unacknowledged update queue now has`,l.length,"items"),l})}}function pt(e,o,t,n){let i=o.key,r=[];for(let a of o.actions){let s=to(a,(l)=>{try{let m=o.globals.map((T)=>{if(T.type==="atom")return T.key;return L(T).key}).concat(o.perspectives.flatMap((T)=>{let{viewAtoms:d}=T,k=u(e,d,t);return J(e,k).map((O)=>{return O.type==="mutable_atom"?"*"+O.key:O.key})})),y=fo(m,l.updates),c={...l,updates:y};B(e,fe,t,(T)=>{if(c)T.push(c),T.sort((d,k)=>d.epoch-k.epoch),e.logger.info("\uD83D\uDC4D","continuity",i,`${t} unacknowledged update queue now has`,T.length,"items");return T}),n?.emit(`tx-new:${i}`,c)}catch(m){if(m instanceof Error)e.logger.error("\u274C","continuity",i,`${t} failed to send update from transaction ${a.key} to ${t}`,m.message)}},`sync-continuity:${i}:${t}`,e);r.push(s)}return r}function ft(e,o,t,n){let i=o.key,r=[];for(let a of o.perspectives){let{viewAtoms:s}=a,l=u(e,s,t),m=H(l,({oldValue:y,newValue:c})=>{let T=y.map((O)=>O.key),d=c.map((O)=>O.key),k=y.filter((O)=>!d.includes(O.key)),M=c.filter((O)=>!T.includes(O.key)).flatMap((O)=>{let v=O.type==="mutable_atom"?I(e,O):O,P=J(e,v);return[v,P]});if(e.logger.info("\uD83D\uDC41","atom",a.resourceAtoms.key,`${t} has a new perspective`,{oldKeys:T,newKeys:d,revealed:M,concealed:k}),M.length>0)n?.emit(`reveal:${i}`,M);if(k.length>0)n?.emit(`conceal:${i}`,k)},`sync-continuity:${i}:${t}:perspective:${a.resourceAtoms.key}`,e);r.push(m)}return r}function Lc({socket:e,store:o=C.STORE}){return function t(n){let i=e,r=n.key,a=so(To,`socket::${i.id}`,o).userKeyOfSocket,s=J(o,a);if(!s)return o.logger.error("\u274C","continuity",r,`Tried to create a synchronizer for a socket (${i.id}) that is not connected to a user.`),()=>{};let l=so(To,s,o).socketKeyOfUser,m=H(l,({newValue:v})=>{if(o.logger.info("\uD83D\uDC4B","continuity",r,`seeing ${s} on new socket ${v}`),v===null){o.logger.warn("\u274C","continuity",r,`User (${s}) is not connected to a socket, waiting for them to reappear.`);return}let P=u(o,st,v);i=J(o,P);for(let p of y)i?.emit(`tx-new:${r}`,p)},`sync-continuity:${r}:${s}`,o),y=J(o,fe,s),c=[],T=ft(o,n,s,i),d=pt(o,n,s,i);c.push(...T,...d);let k=mt(o,n,s,e);i.off(`get:${r}`,k),i.on(`get:${r}`,k);let M=yt(o,n,s);i.off(`tx-run:${r}`,M),i.on(`tx-run:${r}`,M);let O=ct(o,n,s,y);return i?.on(`ack:${r}`,O),()=>{for(let v of c)v();i?.off(`ack:${r}`,O),i?.off(`get:${r}`,k),i?.off(`tx-run:${r}`,M)}}}var $e=new co;Object.assign(console,$e.logger,{log:$e.logger.info});$e.on("timeToStop",function e(){$e.logger.info("\uD83D\uDEEC game worker exiting"),process.exit(0)});$e.logger.info("\uD83D\uDEEB game worker ready");
|