tempest.games 0.1.21 → 0.1.23

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.
@@ -6,4 +6,4 @@ ${a.trace}`:"No previous disposal trace was found."),n.type){case"atom_family":c
6
6
  This state was most recently disposed
7
7
  ${a.trace}`:"No previous disposal trace was found.");return}switch(t.type){case"atom":case"mutable_atom":co(t,e);break;case"selector":case"readonly_selector":et(t,e);break;case"molecule":Ne(t,e);break}let{stack:i}=new Error;if(i){let r=i?.split(`
8
8
  `)?.slice(3)?.join(`
9
- `);e.disposalTraces.add({key:t.key,trace:r})}}var Xe=(e,o)=>y(o).atoms.has(e),Ct=(e,o)=>y(o).selectors.has(e),Kt=(e,o)=>y(o).readonlySelectors.has(e),ot=(e,o)=>Xe(e,o)||Ct(e,o)||Kt(e,o);var He=(e,o)=>{return y(o).selectorGraph.getRelationEntries({downstreamSelectorKey:e}).filter(([n,{source:i}])=>i!==e).map(([n,{source:i}])=>i).filter((n)=>ot(n,o))};var mo=(e,o,t)=>{let n=[],i=He(e,t);while(i.length>0){let r=i.shift();if(o.has(r))continue;if(o.add(r),!Xe(r,t))i.push(...He(r,t));else if(!n.includes(r))n.push(r)}return n},tt=(e,o)=>{let t=e.key,n=He(t,o),i=new Set;return n.flatMap((r)=>Xe(r,o)?r:mo(r,i,o))};var nt=(e,o,t,n)=>{let i=y(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=mo(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=y(t),r;if(n.length===2){let[l,s]=n;switch(l.type){case"molecule_family":return O(t,l,s);default:if(t.config.lifespan==="ephemeral")r=K(t,l,s);else{let m=W(t,l,s);if(m)r=m;else throw new D(l,s,t)}}}else[r]=n;if(r.type==="molecule")return O(t,r);let a=g(r,t),c=ce(a,t);return t.logger.info("\uD83D\uDD0C","selector",e,`registers dependency ( "${r.key}" =`,c,")"),i.selectorGraph.set({upstreamSelectorKey:r.key,downstreamSelectorKey:e},{source:r.key}),nt(e,r,o,t),c},set:(...n)=>{let i,r;if(n.length===2)i=n[0],r=n[1];else{let l=n[0],s=n[1];r=n[2];let m=t.config.lifespan==="ephemeral"?K(t,l,s):W(t,l,s);if(!m)throw new D(l,s,t);i=m}let a=y(t),c=g(i,a);je(c,r,a)},find:(n,i)=>K(t,n,i),seek:(n,i)=>W(t,n,i),json:(n)=>z(t,n)});var Fe=(e,o,t)=>{let n=y(e),i=new A,r=new Set,{get:a,find:c,seek:l,json:s}=Ve(o.key,r,n),m=()=>{let R=o.get({get:a,find:c,seek:l,json:s});return Z(o.key,R,i,y(e)),r.clear(),R},p={...o,subject:i,install:(R)=>Fe(R,o,t),get:m,type:"readonly_selector",...t&&{family:t}};n.readonlySelectors.set(o.key,p);let u=m();e.logger.info("\u2728",p.type,p.key,"=",u);let x={key:o.key,type:"readonly_selector"};if(t)x.family=t;return x};var $e=(e,o,t)=>{let n=y(e),i=new A,r=new Set,a=Ve(o.key,r,n),{find:c,get:l,seek:s,json:m}=a,p={find:c,get:l,seek:s,json:m},u=(J=o.get,w=y(e))=>{let B=J(p);return Z(o.key,B,i,w),r.clear(),B},R={...o,subject:i,install:(J)=>$e(J,o,t),get:u,set:(J)=>{let w=y(e),B=u(o.get,w),U=_e(J)(B);if(e.logger.info("\uD83D\uDCDD","selector",o.key,"set (",B,"->",U,")"),Z(o.key,U,i,w),de(w,o.key),P(w))i.next({newValue:U,oldValue:B});o.set(a,U)},type:"selector",...t&&{family:t}};n.selectors.set(o.key,R);let v=u();e.logger.info("\u2728",R.type,R.key,"=",v);let f={key:o.key,type:"selector"};if(t)f.family=t;return f};function Ae(e,o){if("set"in o){let i=$e(e,o,void 0);return e.on.selectorCreation.next(i),i}let n=Fe(e,o,void 0);return e.on.selectorCreation.next(n),n}function et(e,o){let t=y(o),{key:n}=e,i=g(e,t);if(!i.family)o.logger.error("\u274C","selector",n,"Standalone selectors cannot be disposed.");else{let r=t.molecules.get(i.family.subKey);if(r)r.tokens.delete(n);switch(e.type){case"selector":t.selectors.delete(n),g({key:i.family.key,type:"selector_family"},o).subject.next({type:"state_disposal",token:e});break;case"readonly_selector":t.readonlySelectors.delete(n),g({key:i.family.key,type:"readonly_selector_family"},o).subject.next({type:"state_disposal",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"),C(t)&&t.transactionMeta.phase==="building")t.transactionMeta.update.updates.push({type:"state_disposal",token:e});else o.on.selectorDisposal.next(e)}}function Re(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 ${ee(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 A,c=Object.assign((l)=>{let s=S(l),m={key:o.key,subKey:s},p=`${o.key}(${s})`,u=y(e),x=$e(u,{key:p,get:o.get(l),set:o.set(l)},m);return r.next({type:"state_creation",token:x}),x},n,{internalRoles:t,subject:r,install:(l)=>Re(l,o),default:(l)=>{return o.get(l)({get:(...m)=>O(e,...m),find:(m,p)=>K(e,m,p),seek:(m,p)=>W(e,m,p),json:(m)=>z(e,m)})}});return e.families.set(o.key,c),n}function it(e,o,t=$.STORE){let n=Re(t,{key:`${e.key}:JSON`,get:(r)=>({seek:a,get:c})=>{let l=a(e,r);if(l)return o.toJson(c(l));let s=S(r),m=t.molecules.get(s);if(m){let u=oe(m,e,t);return o.toJson(c(u))}if(t.config.lifespan==="immortal")throw new Error(`No molecule found for key "${s}"`);let p=te(t,e,r);return o.toJson(c(p))},set:(r)=>({seek:a,set:c},l)=>{let s=a(e,r);if(s)c(s,o.fromJson(l));else{let m=S(r),p=t.molecules.get(m);if(p){let u=oe(p,e,t);c(u,o.fromJson(l))}else{if(t.config.lifespan==="immortal")throw new Error(`No molecule found for key "${m}"`);c(te(t,e,r),o.fromJson(l))}}}},["mutable","json"]);return g(e,t).subject.subscribe(`store=${t.config.name}::json-selector-family`,(r)=>{if(r.token.family)W(t,n,N(r.token.family.subKey))}),n}var N=(e)=>JSON.parse(e),S=(e)=>JSON.stringify(e),ys=[Array.prototype,Boolean.prototype,Number.prototype,Object.prototype,String.prototype];var rt=(e,o)=>{let t=y(o);if(t.operation.open)return t.operation.prev.get(e.key);return t.valueMap.get(e.key)};var To=(e,o)=>{let t=y(o);return tt(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 c=rt(e,t),l=ce(e,t);o.logger.info("\u2728",e.type,e.key,"went",c,"->",l),e.subject.next({newValue:l,oldValue:c})})})};function H(e,o,t,n){function i(p){if(n.operation.open){let u=n.on.operationClose.subscribe(`state subscription ${t}`,()=>{u(),o(p)})}else o(p)}let r=g(e,n);n.logger.info("\uD83D\uDC40",r.type,r.key,`Adding subscription "${t}"`);let a=r.type==="selector"||r.type==="readonly_selector",c=null,l=i;if(a)c=To(r,n),l=(p)=>{if(c)c.length=0,c.push(...To(r,n));i(p)};let s=r.subject.subscribe(t,l);return()=>{if(n.logger.info("\uD83D\uDE48",r.type,r.key,`Removing subscription "${t}"`),s(),c)for(let p of c)p()}}var yo=(e,o,t,n)=>{let i=g(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 po=(e,o,t,n)=>{let i=g(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 me{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=ae(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}:${C(t)?t.transactionMeta.update.key:"main"}:${e.key}`,i=O(t,e);this.unsubscribeFromInnerValue=i.subscribe(n,(r)=>{I(t,o,r)}),this.unsubscribeFromState=H(e,(r)=>{if(r.newValue!==r.oldValue)this.unsubscribeFromInnerValue(),this.unsubscribeFromInnerValue=r.newValue.subscribe(n,(a)=>{I(t,o,a)})},n,t)}updateCore(e,o,t){let n=`tracker:${t.config.name}:${C(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 s=yo({key:a,type:"timeline"},(m)=>{s(),I(t,e,(p)=>{if(m==="redo"&&i)p.do(i);else if(m==="undo"&&r)p.undo(r);return p})},n,t);return}}let c=t.on.operationClose.subscribe(n,()=>{c();let l=O(t,e),s=i===null?-1:l.getUpdateNumber(i),m=s-l.cacheUpdateNumber;if(i&&m===1)I(t,e,(p)=>(p.do(i),p));else t.logger.info("\u274C","mutable_atom",e.key,`could not be updated. Expected update number ${l.cacheUpdateNumber+1}, but got ${s}`)})},n,t)}mutableState;latestUpdateState;dispose;constructor(e,o){this.mutableState=e;let t=y(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 Oe(e,o,t){e.logger.info("\uD83D\uDD28","atom",o.key,`creating in store "${e.config.name}"`);let n=y(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."),Q(i);let r=new A,a={...o,type:"mutable_atom",install:(s)=>{return s.logger.info("\uD83D\uDEE0\uFE0F","atom",o.key,`installing in store "${s.config.name}"`),Oe(s,o,t)},subject:r};if(t)a.family=t;let c=o.default();n.atoms.set(a.key,a),De(o.key,e),Z(o.key,c,r,n);let l=Q(a);if(o.effects){let s=0,m=[];for(let p of o.effects){let u=p({setSelf:(x)=>{I(e,l,x)},onSet:(x)=>H(l,x,`effect[${s}]`,e)});if(u)m.push(u);++s}a.cleanup=()=>{for(let p of m)p()}}if(new me(l,e),!t)Ko(l,o,e);return l}class fo{Update;latestUpdateAtoms;mutableAtoms;constructor(e,o){let t=re(o,{key:`*${e.key}`,default:null},["mutable","updates"]);this.latestUpdateAtoms=g(t,o),this.mutableAtoms=e,this.mutableAtoms.subject.subscribe(`store=${o.config.name}::tracker-atom-family`,(n)=>{if(n.token.family){let i=N(n.token.family.subKey);W(o,this.latestUpdateAtoms,i),new me(n.token,o)}}),this.latestUpdateAtoms.subject.subscribe(`store=${o.config.name}::tracker-atom-family`,(n)=>{if(n.token.family){let i=N(n.token.family.subKey),r=W(o,this.mutableAtoms,i);if(r)new me(r,o)}})}}function Me(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 ${ee(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 A,c=Object.assign((l)=>{let s=S(l),m={key:o.key,subKey:s},p=`${o.key}(${s})`,u=y(e),x={key:p,default:()=>o.default(l),toJson:o.toJson,fromJson:o.fromJson,mutable:!0};if(o.effects)x.effects=o.effects(l);let R=Oe(u,x,m);return r.next({type:"state_creation",token:R}),R},n,{subject:r,install:(l)=>Me(l,o),toJson:o.toJson,fromJson:o.fromJson,internalRoles:t});return e.families.set(o.key,c),it(c,o,e),new fo(c,e),n}var uo=(e,o)=>{let t=y(o),n=`${e.key}:JSON`;return t.families.get(n)};var z=(e,o)=>{if(o.family){let n=y(e),r={key:`${o.family.key}:JSON`,type:"selector_family"},a=g(r,n),c=JSON.parse(o.family.subKey);return K(e,a,c)}return{type:"selector",key:`${o.key}:JSON`}};var ie=(e)=>{let t={type:"atom",key:`*${e.key}`};if(e.family)t.family={key:`*${e.family.key}`,subKey:e.family.subKey};return t};function Eo(e){return typeof e==="object"&&e!==null&&"do"in e&&"undo"in e&&"subscribe"in e}function Je(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 me(e,o),a}return i}function Z(e,o,t,n){let i=n.valueMap.get(e);if(i instanceof xe)i.use(o);if(o instanceof Promise){let r=new xe(o);return n.valueMap.set(e,r),r.then((a)=>{Z(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 wo=(e,o)=>{let t=o.valueMap.get(e.key);if(e.type==="mutable_atom"&&C(o)){let{parent:n}=o;t=Je(e,n,o)}return t},Io=(e,o)=>{let t=o.valueMap.get(e);if(t instanceof xe){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 Po=(e,o)=>{return y(o).atomsThatAreDefault.has(e)},De=(e,o)=>{let t=y(o);t.atomsThatAreDefault=new Set(t.atomsThatAreDefault).add(e)},No=(e,o)=>{let t=y(o);t.atomsThatAreDefault=new Set(y(o).atomsThatAreDefault),t.atomsThatAreDefault.delete(e)};function ae(e,o,t){e.logger.info("\uD83D\uDD28","atom",o.key,`creating in store "${e.config.name}"`);let n=y(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."),Q(i);let r=new A,a={...o,type:"atom",install:(s)=>{return s.logger.info("\uD83D\uDEE0\uFE0F","atom",o.key,`installing in store "${s.config.name}"`),ae(s,o,t)},subject:r};if(t)a.family=t;let c=o.default;if(o.default instanceof Function)c=o.default();n.atoms.set(a.key,a),De(o.key,e),Z(o.key,c,r,n);let l=Q(a);if(o.effects){let s=0,m=[];for(let p of o.effects){let u=p({setSelf:(x)=>{I(e,l,x)},onSet:(x)=>H(l,x,`effect[${s}]`,e)});if(u)m.push(u);++s}a.cleanup=()=>{for(let p of m)p()}}return l}function $o(e,o){if("mutable"in o){let i=Oe(e,o,void 0);return e.on.atomCreation.next(i),i}let n=ae(e,o,void 0);return e.on.atomCreation.next(n),n}function co(e,o){let t=y(o),{key:n}=e,i=g(e,t);if(!i.family)o.logger.error("\u274C","atom",n,"Standalone atoms cannot be disposed.");else{i.cleanup?.();let r=o.valueMap.get(i.key);g({key:i.family.key,type:"atom_family"},o).subject.next({type:"state_disposal",token:e,value:r});let c=t.molecules.get(i.family.subKey);if(c)c.tokens.delete(n);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 l=ie(e);co(l,o),o.trackers.delete(n)}if(o.logger.info("\uD83D\uDD25","atom",n,"deleted"),C(t)&&t.transactionMeta.phase==="building")t.transactionMeta.update.updates.push({type:"state_disposal",token:e});else o.on.atomDisposal.next(e)}}class X extends Set{mode="record";subject=new A;cacheLimit=0;cache=[];cacheIdx=-1;cacheUpdateNumber=-1;constructor(e,o=0){super(e);if(e instanceof X)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 X(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:${S(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:${S(e)}`);return o}parent;child=null;transactionUpdates=null;transaction(e){this.mode="transaction",this.transactionUpdates=[],this.child=new X(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 c=!1;while(!c){this.cacheIdx%=this.cacheLimit;let s=this.cache[this.cacheIdx];if(this.cacheIdx--,!s)return"OUT_OF_RANGE";this.undo(s),c=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 _(e){return e[0].toUpperCase()+e.slice(1)}class ko{options;defaultContent;toolkit;retrieve;molecules=new Map;relations;states;core;transact(e,o){let t=this.toolkit;this.toolkit=e,o(this),this.toolkit=t}store;alternates;[Symbol.dispose](){this.alternates.delete(this.store.config.name)}in(e){let o=e.config.name,t=this.alternates.get(o);if(t)return t;let n=new ko(this.options,this.defaultContent,e);return this.alternates.set(o,n),n.alternates=this.alternates,n}constructor(e,o,t=$.STORE){this.store=t,this.options=e,this.defaultContent=o,this.alternates=new Map,this.alternates.set(t.config.name,this),this.store.miscResources.set(`join:${e.key}`,this),this.retrieve=(T,d)=>{let M=this.toolkit.seek(T,d);if(M)return M;let F=this.store.molecules.get(S(d));if(F){let k=g(T,t);return oe(F,k,t)}if(t.config.lifespan==="immortal")throw new D(T,d,t);return te(t,T,d)},this.toolkit={get:(...T)=>O(t,...T),set:(...T)=>{I(t,...T)},find:this.retrieve,seek:(...T)=>W(t,...T),json:(T)=>z(t,T),dispose:(...T)=>{V(t,...T)}};let n=e.between[0],i=e.between[1],r=Me(t,{key:`${e.key}/relatedKeys`,default:()=>new X,mutable:!0,fromJson:(T)=>X.fromJSON(T),toJson:(T)=>T.toJSON()},["join","relations"]);this.core={findRelatedKeysState:r};let a=({get:T},d)=>T(this.retrieve(r,d)),c=(T,d,M)=>{let{set:F}=T,k=this.retrieve(r,d),b=this.retrieve(r,M);F(k,(h)=>h.add(M)),F(b,(h)=>h.add(d))},l=(T,d,M)=>{let{set:F}=T,k=this.retrieve(r,d),b=this.retrieve(r,M),h,j;F(k,(E)=>{if(E.delete(M),E.size===0)h=`"${d}"`;return E}),F(b,(E)=>{if(E.delete(d),E.size===0)j=`"${M}"`;return E})},s=(T,d,M)=>{let{get:F,set:k}=T,b=this.retrieve(r,d),h=F(b);for(let j of h){if(M.includes(j))continue;let Y=this.retrieve(r,j);k(Y,(L)=>{return L.delete(d),L})}k(b,(j)=>{return j.transaction((E)=>{E.clear();for(let Y of M){let L=a(T,Y),Ro=L.has(d);if(this.relations.cardinality==="1:n"){let Co=[];for(let be of L){if(be===d)continue;let ge=a(T,be);if(ge.delete(Y),ge.size===0)Co.push(be)}if(!Ro&&L.size>0)L.clear();for(let be of Co){let ge=[Y,be].sort(),dt=`"${ge[0]}:${ge[1]}"`;this.molecules.delete(dt)}}if(!Ro)L.add(d);E.add(Y)}return!0}),j})},m=(T,d,M)=>{let{set:F}=T,k=this.retrieve(r,d);F(k,(b)=>{return b.transaction((h)=>{for(let j of M)h.add(j);return!0}),b});for(let b of M){let h=this.retrieve(r,b);F(h,(j)=>{return j.add(d),j})}return!0},p=(T,d,M)=>{let F=a(T,d);return M?F.has(M):F.size>0},u={getRelatedKeys:(T)=>a(this.toolkit,T),addRelation:(T,d)=>{c(this.toolkit,T,d)},deleteRelation:(T,d)=>{l(this.toolkit,T,d)},replaceRelationsSafely:(T,d)=>{s(this.toolkit,T,d)},replaceRelationsUnsafely:(T,d)=>{m(this.toolkit,T,d)},has:(T,d)=>p(this.toolkit,T,d)},x,R,v;if(o){R=re(t,{key:`${e.key}/content`,default:o},["join","content"]),v=Xo(t,{key:`${e.key}/content-molecules`,new:class k{key;constructor(b,h){this.key=h}}});let T=({get:k},b)=>k(this.retrieve(R,b)),d=({set:k},b,h)=>{k(this.retrieve(R,b),h)},M=(k,b)=>{let h=t.molecules.get(`"${b}"`);if(h)this.toolkit.dispose(h),this.molecules.delete(`"${b}"`)};x=Object.assign(u,{getContent:(k)=>{return T(this.toolkit,k)},setContent:(k,b)=>{d(this.toolkit,k,b)},deleteContent:(k)=>{M(this.toolkit,k)}})}else x=u;let f=new q(e,{externalStore:x,isAType:e.isAType,isBType:e.isBType,makeContentKey:(...T)=>{let d=T.sort(),M=`${d[0]}:${d[1]}`,[F,k]=d.map((b)=>this.molecules.get(S(b)));if(t.config.lifespan==="immortal"&&F&&k){let b=y(t),h=ne(b,[F,k],v,M);this.molecules.set(`"${M}"`,g(h,b))}return M}}),J=()=>le(t,{key:`${e.key}/singleRelatedKey`,get:(T)=>({get:d})=>{let M=this.retrieve(r,T),F=d(M);for(let k of F)return k;return null}},["join","keys"]),w=()=>{return le(t,{key:`${e.key}/multipleRelatedKeys`,get:(T)=>({get:d})=>{let M=uo(r,t),F=this.retrieve(M,T);return d(F).members}},["join","keys"])},B=()=>le(t,{key:`${e.key}/singleRelatedEntry`,get:(T)=>({get:d})=>{let M=this.retrieve(r,T),F=d(M);for(let k of F){let b=f.isAType?.(T)?T:void 0,h=b===void 0?T:void 0;b??=k,h??=k;let j=f.makeContentKey(b,h),E=this.retrieve(R,j),Y=d(E);return[k,Y]}return null}},["join","entries"]),U=()=>le(t,{key:`${e.key}/multipleRelatedEntries`,get:(T)=>({get:d})=>{let M=uo(r,t),F=this.retrieve(M,T);return d(F).members.map((b)=>{let h=f.isAType?.(T)?T:void 0,j=h===void 0?T:void 0;h??=b,j??=b;let E=f.makeContentKey(h,j),Y=this.retrieve(R,E),L=d(Y);return[b,L]})}},["join","entries"]);switch(e.cardinality){case"1:1":{let T=J(),d=`${n}KeyOf${_(i)}`,M=`${i}KeyOf${_(n)}`,F={[d]:T,[M]:T},k;if(o){let b=B(),h=`${n}EntryOf${_(i)}`,j=`${i}EntryOf${_(n)}`,E={[h]:b,[j]:b};k=Object.assign(F,E)}else k=F;this.relations=f,this.states=k;break}case"1:n":{let T=J(),d=w(),M=`${n}KeyOf${_(i)}`,F=`${i}KeysOf${_(n)}`,k={[M]:T,[F]:d},b;if(o){let h=B(),j=U(),E=`${n}EntryOf${_(i)}`,Y=`${i}EntriesOf${_(n)}`,L={[E]:h,[Y]:j};b=Object.assign(k,L)}else b=k;this.relations=f,this.states=b;break}default:{let T=w(),d=`${n}KeysOf${_(i)}`,M=`${i}KeysOf${_(n)}`,F={[d]:T,[M]:T},k;if(o){let b=U(),h=`${n}EntriesOf${_(i)}`,j=`${i}EntriesOf${_(n)}`,E={[h]:b,[j]:b};k=Object.assign(F,E)}else k=F;this.relations=f,this.states=k}}}}function Ue(e,o,t=$.STORE){return So(t).set(e.key,new ko(e,o,t)),{key:e.key,type:"join",a:e.between[0],b:e.between[1],cardinality:e.cardinality}}function So(e){if("joins"in e&&e.joins instanceof Map)return e.joins;let o=new Map;return e.joins=o,o}function he(e,o){let t=So(o),n=t.get(e.key);if(n===void 0){if(n=So($.STORE).get(e.key)?.in(o),n===void 0)throw new Error(`Join "${e.key}" not found in store "${o.config.name}"`);t.set(e.key,n)}return n}function qe(e,o,t){let n=he(e,t),i;switch(e.cardinality){case"1:1":{let r=`${e.a}KeyOf${_(e.b)}`,a=`${e.b}KeyOf${_(e.a)}`;i={get[r](){let l=n.states[r];return n.retrieve(l,o)},get[a](){let l=n.states[a];return n.retrieve(l,o)}};let c=`${e.a}EntryOf${_(e.b)}`;if(c in n.states){let l=`${e.b}EntryOf${_(e.a)}`;Object.assign(i,{get[c](){let s=n.states[c];return n.retrieve(s,o)},get[l](){let s=n.states[l];return n.retrieve(s,o)}})}break}case"1:n":{let r=`${e.a}KeyOf${_(e.b)}`,a=`${e.b}KeysOf${_(e.a)}`;i={get[r](){let l=n.states[r];return n.retrieve(l,o)},get[a](){let l=n.states[a];return n.retrieve(l,o)}};let c=`${e.a}EntryOf${_(e.b)}`;if(c in n.states){let l=`${e.b}EntriesOf${_(e.a)}`;Object.assign(i,{get[c](){let s=n.states[c];return n.retrieve(s,o)},get[l](){let s=n.states[l];return n.retrieve(s,o)}})}break}case"n:n":{let r=`${e.a}KeysOf${_(e.b)}`,a=`${e.b}KeysOf${_(e.a)}`;i={get[r](){let l=n.states[r];return n.retrieve(l,o)},get[a](){let l=n.states[a];return n.retrieve(l,o)}};let c=`${e.a}EntriesOf${_(e.b)}`;if(c in n.states){let l=`${e.b}EntriesOf${_(e.a)}`;Object.assign(i,{get[c](){let s=n.states[c];return n.retrieve(s,o)},get[l](){let s=n.states[l];return n.retrieve(s,o)}})}}}return i}function Vo(e,o){return qe(e,o,$.STORE)}function Ye(e,o,t){let n=he(e,t),i=y(t);if(C(i)){let{toolkit:r}=i.transactionMeta;n.transact(r,({relations:a})=>{o(a)})}else o(n.relations)}function Jt(e,o){return he(e,o).core.findRelatedKeysState}function at(e){return Jt(e,$.STORE)}class lt 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 Le{key;type="continuity";globals=[];actions=[];perspectives=[];constructor(e){this.key=e}static existing=new lt;static create(e,o){let t=new Le(e),{type:n,globals:i,actions:r,perspectives:a}=o(t),c={type:n,key:e,globals:i,actions:r,perspectives:a};return Le.existing.set(e,c),c}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 cy(e){let{key:o,config:t}=e,n=Le.create(o,t),{actions:i}=n;for(let r of i)Lo(o,r.key,$.STORE);return Uo(o,-1,$.STORE),n}var fy=ue({key:"usersInRoomIndex",mutable:!0,default:()=>new X,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),bo=ue({key:"roomIndex",default:()=>new X,mutable:!0,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),ht={enteredAtEpoch:0},we=Ue({key:"usersInRooms",between:["room","user"],cardinality:"1:n",isAType:(e)=>typeof e==="string",isBType:(e)=>typeof e==="string"},ht),uy=We({key:"usersInMyRoomView",get:(e)=>({find:o})=>{let t=at(we);return[o(t,e)]}});import{spawn as $t}from"child_process";class Se{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 go extends Se{process;key;logger;incompleteData="";unprocessedEvents=[];incompleteLog="";unprocessedLogs=[];id="#####";handleLog(e){if(Array.isArray(e)){let[o,...t]=e;switch(o){case"i":this.logger.info(this.id,this.key,...t);break;case"w":this.logger.warn(this.id,this.key,...t);break;case"e":this.logger.error(this.id,this.key,...t);break}}}constructor(e,o,t=console){super((n,...i)=>{let r=JSON.stringify([n,...i])+"\x03",a=(c)=>{if(c.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});this.process=e;this.key=o;this.logger=t;if(this.process=e,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=N(this.incompleteData);this.handleEvent(...a);while(this.unprocessedEvents.length>0){let c=this.unprocessedEvents.shift();if(c){if(this.unprocessedEvents.length===0)this.incompleteData=c;a=N(c),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=N(this.incompleteLog);this.handleLog(a);while(this.unprocessedLogs.length>0)if(this.incompleteLog=this.unprocessedLogs.shift()??"",this.incompleteLog)a=N(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 st extends Se{in;out;id="no_id_retrieved";disposalFunctions=[];constructor(e){super((...o)=>{return this.out.next(o),this});this.id=e,this.in=new A,this.out=new A,this.in.subscribe("socket",(o)=>{this.handleEvent(...o)})}dispose(){for(let e of this.disposalFunctions)e()}}class xo extends Se{incompleteData="";unprocessedEvents=[];relays;relayServices;process;id="#####";log(...e){this.process.stderr.write(S(e.map((o)=>o instanceof X?`{ ${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=N(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=N(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 st(`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 Ao=ye({key:"roomArguments",default:["echo",["Hello World!"]]}),ct=We({key:"room",get:(e)=>async({get:o,find:t})=>{let n=t(Ao,e),i=o(n),[r,a]=i,c=await new Promise((l)=>{let s=$t(r,a,{env:process.env}),m=(p)=>{if(p.toString()==="ALIVE")s.stdout.off("data",m),l(s)};s.stdout.on("data",m)});return new go(c,e)}});var Xy=Ke({key:"createRoom",do:({get:e,set:o,find:t},n,i,r)=>{let a=r?[i,r]:[i],c=t(Ao,n);o(c,a),o(bo,(m)=>m.add(n));let l=t(ct,n);return e(l)}}),Hy=Ke({key:"joinRoom",do:(e,o,t,n)=>{let i={enteredAtEpoch:n};return Ye(we,(r)=>{r.set({room:o,user:t},i)},e.env().store),i}}),Vy=Ke({key:"leaveRoom",do:(e,o,t)=>{Ye(we,(n)=>{n.delete({room:o,user:t})},e.env().store)}}),Dy=Ke({key:"destroyRoom",do:(e,o)=>{Ye(we,(t)=>{t.delete({room:o})},e.env().store),e.set(bo,(t)=>(t.delete(o),t))}});function Mo(e,o){return o.map((t)=>{switch(t.type){case"transaction_update":{let n=Mo(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 Yy=ye({key:"redactor",default:{occlude:(e)=>e}}),ke=ye({key:"unacknowledgedUpdates",default:()=>[]});var mt=ye({key:"sockets",default:null}),ep=ue({key:"socketsIndex",mutable:!0,default:()=>new X,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),op=ue({key:"usersIndex",mutable:!0,default:()=>new X,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),Fo=Ue({key:"usersOfSockets",between:["user","socket"],cardinality:"1:1",isAType:(e)=>e.startsWith("user::"),isBType:(e)=>e.startsWith("socket::")});function yt(e,o,t,n){let i=o.key;return function r(){let a=[];for(let l of o.globals){let s=l.type==="mutable_atom"?z(e,l):l,m=O(e,s);a.push(s,m)}for(let l of o.perspectives){let{viewAtoms:s,resourceAtoms:m}=l,p=K(e,s,t),u=O(e,p);e.logger.info("\uD83D\uDC41","atom",m.key,`${t} can see`,{viewAtoms:s,resourceAtoms:m,userView:u});for(let x of u){let R=x.type==="mutable_atom"?z(e,x):x,v=O(e,R);a.push(R,v)}}let c=P(e)?e.transactionMeta.epoch.get(i)??null:null;n?.emit(`continuity-init:${i}`,c,a)}}function pt(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:c}=r,l=`tx-run:${a}:${c}`,s=`${l}:start`,m=`${l}:end`;performance.mark(s);try{se({type:"transaction",key:a},c,e)(...r.params)}catch(u){if(u instanceof Error)e.logger.error("\u274C","continuity",n,`failed to run transaction ${a} from ${t} with update ${c}`,u.message)}performance.mark(m);let p=performance.measure(l,s,m);e?.logger.info("\uD83D\uDE80","transaction",a,c,t,p.duration)}}function Tt(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)I(e,ke,t,(l)=>{return l.shift(),e.logger.info("\uD83D\uDC4D","continuity",i,`${t} unacknowledged update queue now has`,l.length,"items"),l})}}function ft(e,o,t,n){let i=o.key,r=[];for(let a of o.actions){let c=po(a,(l)=>{try{let s=o.globals.map((u)=>{if(u.type==="atom")return u.key;return ie(u).key}).concat(o.perspectives.flatMap((u)=>{let{viewAtoms:x}=u,R=K(e,x,t);return O(e,R).map((f)=>{return f.type==="mutable_atom"?"*"+f.key:f.key})})),m=Mo(s,l.updates),p={...l,updates:m};I(e,ke,t,(u)=>{if(p)u.push(p),u.sort((x,R)=>x.epoch-R.epoch),e.logger.info("\uD83D\uDC4D","continuity",i,`${t} unacknowledged update queue now has`,u.length,"items");return u}),n?.emit(`tx-new:${i}`,p)}catch(s){if(s instanceof Error)e.logger.error("\u274C","continuity",i,`${t} failed to send update from transaction ${a.key} to ${t}`,s.message)}},`sync-continuity:${i}:${t}`,e);r.push(c)}return r}function ut(e,o,t,n){let i=o.key,r=[];for(let a of o.perspectives){let{viewAtoms:c}=a,l=K(e,c,t),s=H(l,({oldValue:m,newValue:p})=>{let u=m.map((f)=>f.key),x=p.map((f)=>f.key),R=m.filter((f)=>!x.includes(f.key)),v=p.filter((f)=>!u.includes(f.key)).flatMap((f)=>{let J=f.type==="mutable_atom"?z(e,f):f,w=O(e,J);return[J,w]});if(e.logger.info("\uD83D\uDC41","atom",a.resourceAtoms.key,`${t} has a new perspective`,{oldKeys:u,newKeys:x,revealed:v,concealed:R}),v.length>0)n?.emit(`reveal:${i}`,v);if(R.length>0)n?.emit(`conceal:${i}`,R)},`sync-continuity:${i}:${t}:perspective:${a.resourceAtoms.key}`,e);r.push(s)}return r}function Op({socket:e,store:o=$.STORE}){return function t(n){let i=e,r=n.key,a=qe(Fo,`socket::${i.id}`,o).userKeyOfSocket,c=O(o,a);if(!c)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=qe(Fo,c,o).socketKeyOfUser,s=H(l,({newValue:J})=>{if(o.logger.info("\uD83D\uDC4B","continuity",r,`seeing ${c} on new socket ${J}`),J===null){o.logger.warn("\u274C","continuity",r,`User (${c}) is not connected to a socket, waiting for them to reappear.`);return}let w=K(o,mt,J);i=O(o,w);for(let U of m)i?.emit(`tx-new:${r}`,U)},`sync-continuity:${r}:${c}`,o),m=O(o,ke,c),p=[],u=ut(o,n,c,i),x=ft(o,n,c,i);p.push(...u,...x);let R=yt(o,n,c,e);i.off(`get:${r}`,R),i.on(`get:${r}`,R);let v=pt(o,n,c);i.off(`tx-run:${r}`,v),i.on(`tx-run:${r}`,v);let f=Tt(o,n,c,m);return i?.on(`ack:${r}`,f),()=>{for(let J of p)J();i?.off(`ack:${r}`,f),i?.off(`get:${r}`,R),i?.off(`tx-run:${r}`,v)}}}var Be=new xo;Object.assign(console,Be.logger,{log:Be.logger.info});Be.on("timeToStop",function e(){Be.logger.info("\uD83D\uDEEC frontend server exiting"),process.exit(0)});Be.logger.info("\uD83D\uDEEB game worker ready");
9
+ `);e.disposalTraces.add({key:t.key,trace:r})}}var Xe=(e,o)=>y(o).atoms.has(e),Ct=(e,o)=>y(o).selectors.has(e),Kt=(e,o)=>y(o).readonlySelectors.has(e),ot=(e,o)=>Xe(e,o)||Ct(e,o)||Kt(e,o);var He=(e,o)=>{return y(o).selectorGraph.getRelationEntries({downstreamSelectorKey:e}).filter(([n,{source:i}])=>i!==e).map(([n,{source:i}])=>i).filter((n)=>ot(n,o))};var mo=(e,o,t)=>{let n=[],i=He(e,t);while(i.length>0){let r=i.shift();if(o.has(r))continue;if(o.add(r),!Xe(r,t))i.push(...He(r,t));else if(!n.includes(r))n.push(r)}return n},tt=(e,o)=>{let t=e.key,n=He(t,o),i=new Set;return n.flatMap((r)=>Xe(r,o)?r:mo(r,i,o))};var nt=(e,o,t,n)=>{let i=y(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=mo(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=y(t),r;if(n.length===2){let[l,s]=n;switch(l.type){case"molecule_family":return O(t,l,s);default:if(t.config.lifespan==="ephemeral")r=K(t,l,s);else{let m=W(t,l,s);if(m)r=m;else throw new D(l,s,t)}}}else[r]=n;if(r.type==="molecule")return O(t,r);let a=g(r,t),c=ce(a,t);return t.logger.info("\uD83D\uDD0C","selector",e,`registers dependency ( "${r.key}" =`,c,")"),i.selectorGraph.set({upstreamSelectorKey:r.key,downstreamSelectorKey:e},{source:r.key}),nt(e,r,o,t),c},set:(...n)=>{let i,r;if(n.length===2)i=n[0],r=n[1];else{let l=n[0],s=n[1];r=n[2];let m=t.config.lifespan==="ephemeral"?K(t,l,s):W(t,l,s);if(!m)throw new D(l,s,t);i=m}let a=y(t),c=g(i,a);je(c,r,a)},find:(n,i)=>K(t,n,i),seek:(n,i)=>W(t,n,i),json:(n)=>z(t,n)});var Fe=(e,o,t)=>{let n=y(e),i=new A,r=new Set,{get:a,find:c,seek:l,json:s}=Ve(o.key,r,n),m=()=>{let R=o.get({get:a,find:c,seek:l,json:s});return Z(o.key,R,i,y(e)),r.clear(),R},p={...o,subject:i,install:(R)=>Fe(R,o,t),get:m,type:"readonly_selector",...t&&{family:t}};n.readonlySelectors.set(o.key,p);let u=m();e.logger.info("\u2728",p.type,p.key,"=",u);let x={key:o.key,type:"readonly_selector"};if(t)x.family=t;return x};var $e=(e,o,t)=>{let n=y(e),i=new A,r=new Set,a=Ve(o.key,r,n),{find:c,get:l,seek:s,json:m}=a,p={find:c,get:l,seek:s,json:m},u=(J=o.get,w=y(e))=>{let B=J(p);return Z(o.key,B,i,w),r.clear(),B},R={...o,subject:i,install:(J)=>$e(J,o,t),get:u,set:(J)=>{let w=y(e),B=u(o.get,w),U=_e(J)(B);if(e.logger.info("\uD83D\uDCDD","selector",o.key,"set (",B,"->",U,")"),Z(o.key,U,i,w),de(w,o.key),P(w))i.next({newValue:U,oldValue:B});o.set(a,U)},type:"selector",...t&&{family:t}};n.selectors.set(o.key,R);let v=u();e.logger.info("\u2728",R.type,R.key,"=",v);let f={key:o.key,type:"selector"};if(t)f.family=t;return f};function Ae(e,o){if("set"in o){let i=$e(e,o,void 0);return e.on.selectorCreation.next(i),i}let n=Fe(e,o,void 0);return e.on.selectorCreation.next(n),n}function et(e,o){let t=y(o),{key:n}=e,i=g(e,t);if(!i.family)o.logger.error("\u274C","selector",n,"Standalone selectors cannot be disposed.");else{let r=t.molecules.get(i.family.subKey);if(r)r.tokens.delete(n);switch(e.type){case"selector":t.selectors.delete(n),g({key:i.family.key,type:"selector_family"},o).subject.next({type:"state_disposal",token:e});break;case"readonly_selector":t.readonlySelectors.delete(n),g({key:i.family.key,type:"readonly_selector_family"},o).subject.next({type:"state_disposal",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"),C(t)&&t.transactionMeta.phase==="building")t.transactionMeta.update.updates.push({type:"state_disposal",token:e});else o.on.selectorDisposal.next(e)}}function Re(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 ${ee(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 A,c=Object.assign((l)=>{let s=S(l),m={key:o.key,subKey:s},p=`${o.key}(${s})`,u=y(e),x=$e(u,{key:p,get:o.get(l),set:o.set(l)},m);return r.next({type:"state_creation",token:x}),x},n,{internalRoles:t,subject:r,install:(l)=>Re(l,o),default:(l)=>{return o.get(l)({get:(...m)=>O(e,...m),find:(m,p)=>K(e,m,p),seek:(m,p)=>W(e,m,p),json:(m)=>z(e,m)})}});return e.families.set(o.key,c),n}function it(e,o,t=$.STORE){let n=Re(t,{key:`${e.key}:JSON`,get:(r)=>({seek:a,get:c})=>{let l=a(e,r);if(l)return o.toJson(c(l));let s=S(r),m=t.molecules.get(s);if(m){let u=oe(m,e,t);return o.toJson(c(u))}if(t.config.lifespan==="immortal")throw new Error(`No molecule found for key "${s}"`);let p=te(t,e,r);return o.toJson(c(p))},set:(r)=>({seek:a,set:c},l)=>{let s=a(e,r);if(s)c(s,o.fromJson(l));else{let m=S(r),p=t.molecules.get(m);if(p){let u=oe(p,e,t);c(u,o.fromJson(l))}else{if(t.config.lifespan==="immortal")throw new Error(`No molecule found for key "${m}"`);c(te(t,e,r),o.fromJson(l))}}}},["mutable","json"]);return g(e,t).subject.subscribe(`store=${t.config.name}::json-selector-family`,(r)=>{if(r.token.family)W(t,n,N(r.token.family.subKey))}),n}var N=(e)=>JSON.parse(e),S=(e)=>JSON.stringify(e),ys=[Array.prototype,Boolean.prototype,Number.prototype,Object.prototype,String.prototype];var rt=(e,o)=>{let t=y(o);if(t.operation.open)return t.operation.prev.get(e.key);return t.valueMap.get(e.key)};var To=(e,o)=>{let t=y(o);return tt(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 c=rt(e,t),l=ce(e,t);o.logger.info("\u2728",e.type,e.key,"went",c,"->",l),e.subject.next({newValue:l,oldValue:c})})})};function H(e,o,t,n){function i(p){if(n.operation.open){let u=n.on.operationClose.subscribe(`state subscription ${t}`,()=>{u(),o(p)})}else o(p)}let r=g(e,n);n.logger.info("\uD83D\uDC40",r.type,r.key,`Adding subscription "${t}"`);let a=r.type==="selector"||r.type==="readonly_selector",c=null,l=i;if(a)c=To(r,n),l=(p)=>{if(c)c.length=0,c.push(...To(r,n));i(p)};let s=r.subject.subscribe(t,l);return()=>{if(n.logger.info("\uD83D\uDE48",r.type,r.key,`Removing subscription "${t}"`),s(),c)for(let p of c)p()}}var yo=(e,o,t,n)=>{let i=g(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 po=(e,o,t,n)=>{let i=g(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 me{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=ae(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}:${C(t)?t.transactionMeta.update.key:"main"}:${e.key}`,i=O(t,e);this.unsubscribeFromInnerValue=i.subscribe(n,(r)=>{I(t,o,r)}),this.unsubscribeFromState=H(e,(r)=>{if(r.newValue!==r.oldValue)this.unsubscribeFromInnerValue(),this.unsubscribeFromInnerValue=r.newValue.subscribe(n,(a)=>{I(t,o,a)})},n,t)}updateCore(e,o,t){let n=`tracker:${t.config.name}:${C(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 s=yo({key:a,type:"timeline"},(m)=>{s(),I(t,e,(p)=>{if(m==="redo"&&i)p.do(i);else if(m==="undo"&&r)p.undo(r);return p})},n,t);return}}let c=t.on.operationClose.subscribe(n,()=>{c();let l=O(t,e),s=i===null?-1:l.getUpdateNumber(i),m=s-l.cacheUpdateNumber;if(i&&m===1)I(t,e,(p)=>(p.do(i),p));else t.logger.info("\u274C","mutable_atom",e.key,`could not be updated. Expected update number ${l.cacheUpdateNumber+1}, but got ${s}`)})},n,t)}mutableState;latestUpdateState;dispose;constructor(e,o){this.mutableState=e;let t=y(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 Oe(e,o,t){e.logger.info("\uD83D\uDD28","atom",o.key,`creating in store "${e.config.name}"`);let n=y(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."),Q(i);let r=new A,a={...o,type:"mutable_atom",install:(s)=>{return s.logger.info("\uD83D\uDEE0\uFE0F","atom",o.key,`installing in store "${s.config.name}"`),Oe(s,o,t)},subject:r};if(t)a.family=t;let c=o.default();n.atoms.set(a.key,a),De(o.key,e),Z(o.key,c,r,n);let l=Q(a);if(o.effects){let s=0,m=[];for(let p of o.effects){let u=p({setSelf:(x)=>{I(e,l,x)},onSet:(x)=>H(l,x,`effect[${s}]`,e)});if(u)m.push(u);++s}a.cleanup=()=>{for(let p of m)p()}}if(new me(l,e),!t)Ko(l,o,e);return l}class fo{Update;latestUpdateAtoms;mutableAtoms;constructor(e,o){let t=re(o,{key:`*${e.key}`,default:null},["mutable","updates"]);this.latestUpdateAtoms=g(t,o),this.mutableAtoms=e,this.mutableAtoms.subject.subscribe(`store=${o.config.name}::tracker-atom-family`,(n)=>{if(n.token.family){let i=N(n.token.family.subKey);W(o,this.latestUpdateAtoms,i),new me(n.token,o)}}),this.latestUpdateAtoms.subject.subscribe(`store=${o.config.name}::tracker-atom-family`,(n)=>{if(n.token.family){let i=N(n.token.family.subKey),r=W(o,this.mutableAtoms,i);if(r)new me(r,o)}})}}function Me(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 ${ee(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 A,c=Object.assign((l)=>{let s=S(l),m={key:o.key,subKey:s},p=`${o.key}(${s})`,u=y(e),x={key:p,default:()=>o.default(l),toJson:o.toJson,fromJson:o.fromJson,mutable:!0};if(o.effects)x.effects=o.effects(l);let R=Oe(u,x,m);return r.next({type:"state_creation",token:R}),R},n,{subject:r,install:(l)=>Me(l,o),toJson:o.toJson,fromJson:o.fromJson,internalRoles:t});return e.families.set(o.key,c),it(c,o,e),new fo(c,e),n}var uo=(e,o)=>{let t=y(o),n=`${e.key}:JSON`;return t.families.get(n)};var z=(e,o)=>{if(o.family){let n=y(e),r={key:`${o.family.key}:JSON`,type:"selector_family"},a=g(r,n),c=JSON.parse(o.family.subKey);return K(e,a,c)}return{type:"selector",key:`${o.key}:JSON`}};var ie=(e)=>{let t={type:"atom",key:`*${e.key}`};if(e.family)t.family={key:`*${e.family.key}`,subKey:e.family.subKey};return t};function Eo(e){return typeof e==="object"&&e!==null&&"do"in e&&"undo"in e&&"subscribe"in e}function Je(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 me(e,o),a}return i}function Z(e,o,t,n){let i=n.valueMap.get(e);if(i instanceof xe)i.use(o);if(o instanceof Promise){let r=new xe(o);return n.valueMap.set(e,r),r.then((a)=>{Z(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 wo=(e,o)=>{let t=o.valueMap.get(e.key);if(e.type==="mutable_atom"&&C(o)){let{parent:n}=o;t=Je(e,n,o)}return t},Io=(e,o)=>{let t=o.valueMap.get(e);if(t instanceof xe){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 Po=(e,o)=>{return y(o).atomsThatAreDefault.has(e)},De=(e,o)=>{let t=y(o);t.atomsThatAreDefault=new Set(t.atomsThatAreDefault).add(e)},No=(e,o)=>{let t=y(o);t.atomsThatAreDefault=new Set(y(o).atomsThatAreDefault),t.atomsThatAreDefault.delete(e)};function ae(e,o,t){e.logger.info("\uD83D\uDD28","atom",o.key,`creating in store "${e.config.name}"`);let n=y(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."),Q(i);let r=new A,a={...o,type:"atom",install:(s)=>{return s.logger.info("\uD83D\uDEE0\uFE0F","atom",o.key,`installing in store "${s.config.name}"`),ae(s,o,t)},subject:r};if(t)a.family=t;let c=o.default;if(o.default instanceof Function)c=o.default();n.atoms.set(a.key,a),De(o.key,e),Z(o.key,c,r,n);let l=Q(a);if(o.effects){let s=0,m=[];for(let p of o.effects){let u=p({setSelf:(x)=>{I(e,l,x)},onSet:(x)=>H(l,x,`effect[${s}]`,e)});if(u)m.push(u);++s}a.cleanup=()=>{for(let p of m)p()}}return l}function $o(e,o){if("mutable"in o){let i=Oe(e,o,void 0);return e.on.atomCreation.next(i),i}let n=ae(e,o,void 0);return e.on.atomCreation.next(n),n}function co(e,o){let t=y(o),{key:n}=e,i=g(e,t);if(!i.family)o.logger.error("\u274C","atom",n,"Standalone atoms cannot be disposed.");else{i.cleanup?.();let r=o.valueMap.get(i.key);g({key:i.family.key,type:"atom_family"},o).subject.next({type:"state_disposal",token:e,value:r});let c=t.molecules.get(i.family.subKey);if(c)c.tokens.delete(n);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 l=ie(e);co(l,o),o.trackers.delete(n)}if(o.logger.info("\uD83D\uDD25","atom",n,"deleted"),C(t)&&t.transactionMeta.phase==="building")t.transactionMeta.update.updates.push({type:"state_disposal",token:e});else o.on.atomDisposal.next(e)}}class X extends Set{mode="record";subject=new A;cacheLimit=0;cache=[];cacheIdx=-1;cacheUpdateNumber=-1;constructor(e,o=0){super(e);if(e instanceof X)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 X(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:${S(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:${S(e)}`);return o}parent;child=null;transactionUpdates=null;transaction(e){this.mode="transaction",this.transactionUpdates=[],this.child=new X(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 c=!1;while(!c){this.cacheIdx%=this.cacheLimit;let s=this.cache[this.cacheIdx];if(this.cacheIdx--,!s)return"OUT_OF_RANGE";this.undo(s),c=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 _(e){return e[0].toUpperCase()+e.slice(1)}class ko{options;defaultContent;toolkit;retrieve;molecules=new Map;relations;states;core;transact(e,o){let t=this.toolkit;this.toolkit=e,o(this),this.toolkit=t}store;alternates;[Symbol.dispose](){this.alternates.delete(this.store.config.name)}in(e){let o=e.config.name,t=this.alternates.get(o);if(t)return t;let n=new ko(this.options,this.defaultContent,e);return this.alternates.set(o,n),n.alternates=this.alternates,n}constructor(e,o,t=$.STORE){this.store=t,this.options=e,this.defaultContent=o,this.alternates=new Map,this.alternates.set(t.config.name,this),this.store.miscResources.set(`join:${e.key}`,this),this.retrieve=(T,d)=>{let M=this.toolkit.seek(T,d);if(M)return M;let F=this.store.molecules.get(S(d));if(F){let k=g(T,t);return oe(F,k,t)}if(t.config.lifespan==="immortal")throw new D(T,d,t);return te(t,T,d)},this.toolkit={get:(...T)=>O(t,...T),set:(...T)=>{I(t,...T)},find:this.retrieve,seek:(...T)=>W(t,...T),json:(T)=>z(t,T),dispose:(...T)=>{V(t,...T)}};let n=e.between[0],i=e.between[1],r=Me(t,{key:`${e.key}/relatedKeys`,default:()=>new X,mutable:!0,fromJson:(T)=>X.fromJSON(T),toJson:(T)=>T.toJSON()},["join","relations"]);this.core={findRelatedKeysState:r};let a=({get:T},d)=>T(this.retrieve(r,d)),c=(T,d,M)=>{let{set:F}=T,k=this.retrieve(r,d),b=this.retrieve(r,M);F(k,(h)=>h.add(M)),F(b,(h)=>h.add(d))},l=(T,d,M)=>{let{set:F}=T,k=this.retrieve(r,d),b=this.retrieve(r,M),h,j;F(k,(E)=>{if(E.delete(M),E.size===0)h=`"${d}"`;return E}),F(b,(E)=>{if(E.delete(d),E.size===0)j=`"${M}"`;return E})},s=(T,d,M)=>{let{get:F,set:k}=T,b=this.retrieve(r,d),h=F(b);for(let j of h){if(M.includes(j))continue;let Y=this.retrieve(r,j);k(Y,(L)=>{return L.delete(d),L})}k(b,(j)=>{return j.transaction((E)=>{E.clear();for(let Y of M){let L=a(T,Y),Ro=L.has(d);if(this.relations.cardinality==="1:n"){let Co=[];for(let be of L){if(be===d)continue;let ge=a(T,be);if(ge.delete(Y),ge.size===0)Co.push(be)}if(!Ro&&L.size>0)L.clear();for(let be of Co){let ge=[Y,be].sort(),dt=`"${ge[0]}:${ge[1]}"`;this.molecules.delete(dt)}}if(!Ro)L.add(d);E.add(Y)}return!0}),j})},m=(T,d,M)=>{let{set:F}=T,k=this.retrieve(r,d);F(k,(b)=>{return b.transaction((h)=>{for(let j of M)h.add(j);return!0}),b});for(let b of M){let h=this.retrieve(r,b);F(h,(j)=>{return j.add(d),j})}return!0},p=(T,d,M)=>{let F=a(T,d);return M?F.has(M):F.size>0},u={getRelatedKeys:(T)=>a(this.toolkit,T),addRelation:(T,d)=>{c(this.toolkit,T,d)},deleteRelation:(T,d)=>{l(this.toolkit,T,d)},replaceRelationsSafely:(T,d)=>{s(this.toolkit,T,d)},replaceRelationsUnsafely:(T,d)=>{m(this.toolkit,T,d)},has:(T,d)=>p(this.toolkit,T,d)},x,R,v;if(o){R=re(t,{key:`${e.key}/content`,default:o},["join","content"]),v=Xo(t,{key:`${e.key}/content-molecules`,new:class k{key;constructor(b,h){this.key=h}}});let T=({get:k},b)=>k(this.retrieve(R,b)),d=({set:k},b,h)=>{k(this.retrieve(R,b),h)},M=(k,b)=>{let h=t.molecules.get(`"${b}"`);if(h)this.toolkit.dispose(h),this.molecules.delete(`"${b}"`)};x=Object.assign(u,{getContent:(k)=>{return T(this.toolkit,k)},setContent:(k,b)=>{d(this.toolkit,k,b)},deleteContent:(k)=>{M(this.toolkit,k)}})}else x=u;let f=new q(e,{externalStore:x,isAType:e.isAType,isBType:e.isBType,makeContentKey:(...T)=>{let d=T.sort(),M=`${d[0]}:${d[1]}`,[F,k]=d.map((b)=>this.molecules.get(S(b)));if(t.config.lifespan==="immortal"&&F&&k){let b=y(t),h=ne(b,[F,k],v,M);this.molecules.set(`"${M}"`,g(h,b))}return M}}),J=()=>le(t,{key:`${e.key}/singleRelatedKey`,get:(T)=>({get:d})=>{let M=this.retrieve(r,T),F=d(M);for(let k of F)return k;return null}},["join","keys"]),w=()=>{return le(t,{key:`${e.key}/multipleRelatedKeys`,get:(T)=>({get:d})=>{let M=uo(r,t),F=this.retrieve(M,T);return d(F).members}},["join","keys"])},B=()=>le(t,{key:`${e.key}/singleRelatedEntry`,get:(T)=>({get:d})=>{let M=this.retrieve(r,T),F=d(M);for(let k of F){let b=f.isAType?.(T)?T:void 0,h=b===void 0?T:void 0;b??=k,h??=k;let j=f.makeContentKey(b,h),E=this.retrieve(R,j),Y=d(E);return[k,Y]}return null}},["join","entries"]),U=()=>le(t,{key:`${e.key}/multipleRelatedEntries`,get:(T)=>({get:d})=>{let M=uo(r,t),F=this.retrieve(M,T);return d(F).members.map((b)=>{let h=f.isAType?.(T)?T:void 0,j=h===void 0?T:void 0;h??=b,j??=b;let E=f.makeContentKey(h,j),Y=this.retrieve(R,E),L=d(Y);return[b,L]})}},["join","entries"]);switch(e.cardinality){case"1:1":{let T=J(),d=`${n}KeyOf${_(i)}`,M=`${i}KeyOf${_(n)}`,F={[d]:T,[M]:T},k;if(o){let b=B(),h=`${n}EntryOf${_(i)}`,j=`${i}EntryOf${_(n)}`,E={[h]:b,[j]:b};k=Object.assign(F,E)}else k=F;this.relations=f,this.states=k;break}case"1:n":{let T=J(),d=w(),M=`${n}KeyOf${_(i)}`,F=`${i}KeysOf${_(n)}`,k={[M]:T,[F]:d},b;if(o){let h=B(),j=U(),E=`${n}EntryOf${_(i)}`,Y=`${i}EntriesOf${_(n)}`,L={[E]:h,[Y]:j};b=Object.assign(k,L)}else b=k;this.relations=f,this.states=b;break}default:{let T=w(),d=`${n}KeysOf${_(i)}`,M=`${i}KeysOf${_(n)}`,F={[d]:T,[M]:T},k;if(o){let b=U(),h=`${n}EntriesOf${_(i)}`,j=`${i}EntriesOf${_(n)}`,E={[h]:b,[j]:b};k=Object.assign(F,E)}else k=F;this.relations=f,this.states=k}}}}function Ue(e,o,t=$.STORE){return So(t).set(e.key,new ko(e,o,t)),{key:e.key,type:"join",a:e.between[0],b:e.between[1],cardinality:e.cardinality}}function So(e){if("joins"in e&&e.joins instanceof Map)return e.joins;let o=new Map;return e.joins=o,o}function he(e,o){let t=So(o),n=t.get(e.key);if(n===void 0){if(n=So($.STORE).get(e.key)?.in(o),n===void 0)throw new Error(`Join "${e.key}" not found in store "${o.config.name}"`);t.set(e.key,n)}return n}function qe(e,o,t){let n=he(e,t),i;switch(e.cardinality){case"1:1":{let r=`${e.a}KeyOf${_(e.b)}`,a=`${e.b}KeyOf${_(e.a)}`;i={get[r](){let l=n.states[r];return n.retrieve(l,o)},get[a](){let l=n.states[a];return n.retrieve(l,o)}};let c=`${e.a}EntryOf${_(e.b)}`;if(c in n.states){let l=`${e.b}EntryOf${_(e.a)}`;Object.assign(i,{get[c](){let s=n.states[c];return n.retrieve(s,o)},get[l](){let s=n.states[l];return n.retrieve(s,o)}})}break}case"1:n":{let r=`${e.a}KeyOf${_(e.b)}`,a=`${e.b}KeysOf${_(e.a)}`;i={get[r](){let l=n.states[r];return n.retrieve(l,o)},get[a](){let l=n.states[a];return n.retrieve(l,o)}};let c=`${e.a}EntryOf${_(e.b)}`;if(c in n.states){let l=`${e.b}EntriesOf${_(e.a)}`;Object.assign(i,{get[c](){let s=n.states[c];return n.retrieve(s,o)},get[l](){let s=n.states[l];return n.retrieve(s,o)}})}break}case"n:n":{let r=`${e.a}KeysOf${_(e.b)}`,a=`${e.b}KeysOf${_(e.a)}`;i={get[r](){let l=n.states[r];return n.retrieve(l,o)},get[a](){let l=n.states[a];return n.retrieve(l,o)}};let c=`${e.a}EntriesOf${_(e.b)}`;if(c in n.states){let l=`${e.b}EntriesOf${_(e.a)}`;Object.assign(i,{get[c](){let s=n.states[c];return n.retrieve(s,o)},get[l](){let s=n.states[l];return n.retrieve(s,o)}})}}}return i}function Vo(e,o){return qe(e,o,$.STORE)}function Ye(e,o,t){let n=he(e,t),i=y(t);if(C(i)){let{toolkit:r}=i.transactionMeta;n.transact(r,({relations:a})=>{o(a)})}else o(n.relations)}function Jt(e,o){return he(e,o).core.findRelatedKeysState}function at(e){return Jt(e,$.STORE)}class lt 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 Le{key;type="continuity";globals=[];actions=[];perspectives=[];constructor(e){this.key=e}static existing=new lt;static create(e,o){let t=new Le(e),{type:n,globals:i,actions:r,perspectives:a}=o(t),c={type:n,key:e,globals:i,actions:r,perspectives:a};return Le.existing.set(e,c),c}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 cy(e){let{key:o,config:t}=e,n=Le.create(o,t),{actions:i}=n;for(let r of i)Lo(o,r.key,$.STORE);return Uo(o,-1,$.STORE),n}var fy=ue({key:"usersInRoomIndex",mutable:!0,default:()=>new X,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),bo=ue({key:"roomIndex",default:()=>new X,mutable:!0,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),ht={enteredAtEpoch:0},we=Ue({key:"usersInRooms",between:["room","user"],cardinality:"1:n",isAType:(e)=>typeof e==="string",isBType:(e)=>typeof e==="string"},ht),uy=We({key:"usersInMyRoomView",get:(e)=>({find:o})=>{let t=at(we);return[o(t,e)]}});import{spawn as $t}from"child_process";class Se{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 go extends Se{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=(c)=>{if(c.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=N(this.incompleteData);this.handleEvent(...a);while(this.unprocessedEvents.length>0){let c=this.unprocessedEvents.shift();if(c){if(this.unprocessedEvents.length===0)this.incompleteData=c;a=N(c),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=N(this.incompleteLog);this.handleLog(a);while(this.unprocessedLogs.length>0)if(this.incompleteLog=this.unprocessedLogs.shift()??"",this.incompleteLog)a=N(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 st extends Se{in;out;id="no_id_retrieved";disposalFunctions=[];constructor(e){super((...o)=>{return this.out.next(o),this});this.id=e,this.in=new A,this.out=new A,this.in.subscribe("socket",(o)=>{this.handleEvent(...o)})}dispose(){for(let e of this.disposalFunctions)e()}}class xo extends Se{incompleteData="";unprocessedEvents=[];relays;relayServices;process;id="#####";log(...e){this.process.stderr.write(S(e.map((o)=>o instanceof X?`{ ${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=N(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=N(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 st(`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 Ao=ye({key:"roomArguments",default:["echo",["Hello World!"]]}),ct=We({key:"room",get:(e)=>async({get:o,find:t})=>{let n=t(Ao,e),i=o(n),[r,a]=i,c=await new Promise((l)=>{let s=$t(r,a,{env:process.env}),m=(p)=>{if(p.toString()==="ALIVE")s.stdout.off("data",m),l(s)};s.stdout.on("data",m)});return new go(c,e)}});var Xy=Ke({key:"createRoom",do:({get:e,set:o,find:t},n,i,r)=>{let a=r?[i,r]:[i],c=t(Ao,n);o(c,a),o(bo,(m)=>m.add(n));let l=t(ct,n);return e(l)}}),Hy=Ke({key:"joinRoom",do:(e,o,t,n)=>{let i={enteredAtEpoch:n};return Ye(we,(r)=>{r.set({room:o,user:t},i)},e.env().store),i}}),Vy=Ke({key:"leaveRoom",do:(e,o,t)=>{Ye(we,(n)=>{n.delete({room:o,user:t})},e.env().store)}}),Dy=Ke({key:"destroyRoom",do:(e,o)=>{Ye(we,(t)=>{t.delete({room:o})},e.env().store),e.set(bo,(t)=>(t.delete(o),t))}});function Mo(e,o){return o.map((t)=>{switch(t.type){case"transaction_update":{let n=Mo(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 Yy=ye({key:"redactor",default:{occlude:(e)=>e}}),ke=ye({key:"unacknowledgedUpdates",default:()=>[]});var mt=ye({key:"sockets",default:null}),ep=ue({key:"socketsIndex",mutable:!0,default:()=>new X,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),op=ue({key:"usersIndex",mutable:!0,default:()=>new X,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),Fo=Ue({key:"usersOfSockets",between:["user","socket"],cardinality:"1:1",isAType:(e)=>e.startsWith("user::"),isBType:(e)=>e.startsWith("socket::")});function yt(e,o,t,n){let i=o.key;return function r(){let a=[];for(let l of o.globals){let s=l.type==="mutable_atom"?z(e,l):l,m=O(e,s);a.push(s,m)}for(let l of o.perspectives){let{viewAtoms:s,resourceAtoms:m}=l,p=K(e,s,t),u=O(e,p);e.logger.info("\uD83D\uDC41","atom",m.key,`${t} can see`,{viewAtoms:s,resourceAtoms:m,userView:u});for(let x of u){let R=x.type==="mutable_atom"?z(e,x):x,v=O(e,R);a.push(R,v)}}let c=P(e)?e.transactionMeta.epoch.get(i)??null:null;n?.emit(`continuity-init:${i}`,c,a)}}function pt(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:c}=r,l=`tx-run:${a}:${c}`,s=`${l}:start`,m=`${l}:end`;performance.mark(s);try{se({type:"transaction",key:a},c,e)(...r.params)}catch(u){if(u instanceof Error)e.logger.error("\u274C","continuity",n,`failed to run transaction ${a} from ${t} with update ${c}`,u.message)}performance.mark(m);let p=performance.measure(l,s,m);e?.logger.info("\uD83D\uDE80","transaction",a,c,t,p.duration)}}function Tt(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)I(e,ke,t,(l)=>{return l.shift(),e.logger.info("\uD83D\uDC4D","continuity",i,`${t} unacknowledged update queue now has`,l.length,"items"),l})}}function ft(e,o,t,n){let i=o.key,r=[];for(let a of o.actions){let c=po(a,(l)=>{try{let s=o.globals.map((u)=>{if(u.type==="atom")return u.key;return ie(u).key}).concat(o.perspectives.flatMap((u)=>{let{viewAtoms:x}=u,R=K(e,x,t);return O(e,R).map((f)=>{return f.type==="mutable_atom"?"*"+f.key:f.key})})),m=Mo(s,l.updates),p={...l,updates:m};I(e,ke,t,(u)=>{if(p)u.push(p),u.sort((x,R)=>x.epoch-R.epoch),e.logger.info("\uD83D\uDC4D","continuity",i,`${t} unacknowledged update queue now has`,u.length,"items");return u}),n?.emit(`tx-new:${i}`,p)}catch(s){if(s instanceof Error)e.logger.error("\u274C","continuity",i,`${t} failed to send update from transaction ${a.key} to ${t}`,s.message)}},`sync-continuity:${i}:${t}`,e);r.push(c)}return r}function ut(e,o,t,n){let i=o.key,r=[];for(let a of o.perspectives){let{viewAtoms:c}=a,l=K(e,c,t),s=H(l,({oldValue:m,newValue:p})=>{let u=m.map((f)=>f.key),x=p.map((f)=>f.key),R=m.filter((f)=>!x.includes(f.key)),v=p.filter((f)=>!u.includes(f.key)).flatMap((f)=>{let J=f.type==="mutable_atom"?z(e,f):f,w=O(e,J);return[J,w]});if(e.logger.info("\uD83D\uDC41","atom",a.resourceAtoms.key,`${t} has a new perspective`,{oldKeys:u,newKeys:x,revealed:v,concealed:R}),v.length>0)n?.emit(`reveal:${i}`,v);if(R.length>0)n?.emit(`conceal:${i}`,R)},`sync-continuity:${i}:${t}:perspective:${a.resourceAtoms.key}`,e);r.push(s)}return r}function Op({socket:e,store:o=$.STORE}){return function t(n){let i=e,r=n.key,a=qe(Fo,`socket::${i.id}`,o).userKeyOfSocket,c=O(o,a);if(!c)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=qe(Fo,c,o).socketKeyOfUser,s=H(l,({newValue:J})=>{if(o.logger.info("\uD83D\uDC4B","continuity",r,`seeing ${c} on new socket ${J}`),J===null){o.logger.warn("\u274C","continuity",r,`User (${c}) is not connected to a socket, waiting for them to reappear.`);return}let w=K(o,mt,J);i=O(o,w);for(let U of m)i?.emit(`tx-new:${r}`,U)},`sync-continuity:${r}:${c}`,o),m=O(o,ke,c),p=[],u=ut(o,n,c,i),x=ft(o,n,c,i);p.push(...u,...x);let R=yt(o,n,c,e);i.off(`get:${r}`,R),i.on(`get:${r}`,R);let v=pt(o,n,c);i.off(`tx-run:${r}`,v),i.on(`tx-run:${r}`,v);let f=Tt(o,n,c,m);return i?.on(`ack:${r}`,f),()=>{for(let J of p)J();i?.off(`ack:${r}`,f),i?.off(`get:${r}`,R),i?.off(`tx-run:${r}`,v)}}}var Be=new xo;Object.assign(console,Be.logger,{log:Be.logger.info});Be.on("timeToStop",function e(){Be.logger.info("\uD83D\uDEEC frontend server exiting"),process.exit(0)});Be.logger.info("\uD83D\uDEEB game worker ready");