tempest.games 0.2.5 → 0.2.7

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.
@@ -1,5 +1,5 @@
1
1
  #!/usr/bin/env bun
2
2
  // @bun
3
- var $e=Object.create;var{getPrototypeOf:Ee,defineProperty:L,getOwnPropertyNames:Pe}=Object;var ze=Object.prototype.hasOwnProperty;var Ge=(e,o,n)=>{n=e!=null?$e(Ee(e)):{};let t=o||!e||!e.__esModule?L(n,"default",{value:e,enumerable:!0}):n;for(let i of Pe(e))if(!ze.call(t,i))L(t,i,{get:()=>e[i],enumerable:!0});return t};var Ye=(e,o)=>()=>(o||e((o={exports:{}}).exports,o),o.exports);var qe=(e,o)=>{for(var n in o)L(e,n,{get:o[n],enumerable:!0,configurable:!0,set:(t)=>o[n]=()=>t})};var Qe=(e,o)=>()=>(e&&(o=e(e=0)),o);var Ze=import.meta.require;class _ extends Promise{fate;resolve;reject;done=!1;constructor(e){let o,n;super((t,i)=>{o=t,n=i});this.resolve=o,this.reject=n,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((n)=>{this.pass(o,n)},(n)=>{this.fail(o,n)})}else this.resolve(e),this.fate=void 0}}var Ve=(e,o,n=me.STORE)=>{return Te(n,{key:`${e.key}:JSON`,get:({get:t})=>o.toJson(t(e)),set:({set:t},i)=>{t(e,o.fromJson(i))}})};function oo(e,o,n){return X(e,{key:`${o.key}:JSON`,get:(i)=>({get:r})=>{let l=r(o,i);return n.toJson(l)},set:(i)=>({set:r},l)=>{r(o,i,n.fromJson(l))}},["mutable","json"])}var I=(e)=>JSON.parse(e),p=(e)=>JSON.stringify(e),to=[Array.prototype,Boolean.prototype,Number.prototype,Object.prototype,String.prototype];function T(e){while(e.child!==null)e=e.child;return e}class v{_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 v([...this._buffer]);return e._index=this._index,e}}var He={atom_family:"atom",mutable_atom_family:"mutable_atom",selector_family:"selector",readonly_selector_family:"readonly_selector",molecule_family:"molecule"};function ce(e,o){let n=p(o),t=`${e.key}(${n})`,i=He[e.type],r={key:t,type:i};return Object.assign(r,{family:{key:e.key,subKey:n}}),Object.assign(r,{counterfeit:!0}),r}function h(e){let o={key:e.key,type:e.type};if("family"in e)o.family=e.family;return o}var N=(e)=>(o,n,t,i,...r)=>{console[e](`${o} ${n} "${t}" ${i}`,...r)},ve={error:N("error"),info:N("info"),warn:N("warn")};class V{logLevel;filter;logger;constructor(e,o,n=ve){this.logLevel=e,this.filter=o,this.logger=n}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)}}class K{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 n=this.relations.get(e),t=this.relations.get(o);if(n)n.add(o);else n=new Set([o]),this.relations.set(e,n);if(t)t.add(e);else t=new Set([e]),this.relations.set(o,t)}deleteRelation(e,o){let n=this.relations.get(e);if(n){if(n.delete(o),n.size===0)this.relations.delete(e);let t=this.relations.get(o);if(t){if(t.delete(e),t.size===0)this.relations.delete(o)}}}replaceRelationsUnsafely(e,o){this.relations.set(e,new Set(o));for(let n of o){let t=new Set().add(e);this.relations.set(n,t)}}replaceRelationsSafely(e,o){let n=this.relations.get(e),t=this.isAType?.(e)?e:void 0,i=t===void 0?e:void 0;if(n)for(let r of n){t??=r,i??=r;let l=this.relations.get(r);if(l){if(l.size===1)this.relations.delete(r);else l.delete(e);this.contents.delete(this.makeContentKey(t,i))}}this.relations.set(e,new Set(o));for(let r of o){let l=this.relations.get(r);if(l)l.add(e);else l=new Set().add(e),this.relations.set(r,l)}}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(([n,t])=>[n,new Set(t)])),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 n=o.externalStore;if(this.has=(t,i)=>n.has(t,i),this.addRelation=(t,i)=>{n.addRelation(t,i)},this.deleteRelation=(t,i)=>{n.deleteRelation(t,i)},this.replaceRelationsSafely=(t,i)=>{n.replaceRelationsSafely(t,i)},this.replaceRelationsUnsafely=(t,i)=>{n.replaceRelationsUnsafely(t,i)},this.getRelatedKeys=(t)=>n.getRelatedKeys(t),n.getContent)this.getContentInternal=(t)=>{return n.getContent(t)},this.setContent=(t,i)=>{n.setContent(t,i)},this.deleteContent=(t)=>{n.deleteContent(t)};for(let[t,i]of e.relations??[]){let r=this.isAType?.(t)?t:void 0,l=r===void 0?t:void 0;for(let a of i)r??=a,l??=a,this.addRelation(r,l)}for(let[t,i]of e.contents??[])this.setContent(t,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,n,t;switch(e.length){case 1:{let i=e[0];o=i[this.a],n=i[this.b],t=void 0;break}case 2:{let i=e[0];if(typeof i==="string")[o,n]=e;else o=i[this.a],n=i[this.b],t=e[1];break}default:{o=e[0],n=e[1],t=e[2];break}}switch(this.cardinality){case"1:1":{let i=this.getRelatedKey(o);if(i&&i!==n)this.delete(o,i)}case"1:n":{let i=this.getRelatedKey(n);if(i&&i!==o)this.delete(i,n)}break;case"n:n":}if(t){let i=this.makeContentKey(o,n);this.setContent(i,t)}return this.addRelation(o,n),this}delete(e,o){o=typeof o==="string"?o:e[this.b];let n=typeof e==="string"?e:e[this.a];if(n===void 0&&typeof o==="string"){let t=this.getRelatedKeys(o);if(t)for(let i of t)this.delete(i,o)}if(typeof n==="string"&&o===void 0){let t=this.getRelatedKeys(n);if(t)for(let i of t)this.delete(n,i)}if(typeof n==="string"&&typeof o==="string"){this.deleteRelation(n,o);let t=this.makeContentKey(n,o);this.deleteContent(t)}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((t)=>`"${t}"`).join(", ")}). Only one related key was expected.`);let n;for(let t of o){n=t;break}return n}}replaceRelations(e,o,n){let t=!Array.isArray(o),i=t?Object.keys(o):o;if(n?.reckless)this.replaceRelationsUnsafely(e,i);else this.replaceRelationsSafely(e,i);if(t)for(let r of i){let l=this.makeContentKey(e,r),a=o[r];this.setContent(l,a)}return this}getContent(e,o){let n=this.makeContentKey(e,o);return this.getContentInternal(n)}getRelationEntries(e){let o=e[this.a],n=e[this.b];if(o!==void 0&&n===void 0){let t=this.getRelatedKeys(o);if(t)return[...t].map((i)=>{return[i,this.getContent(o,i)]})}if(o===void 0&&n!==void 0){let t=this.getRelatedKeys(n);if(t)return[...t].map((i)=>{return[i,this.getContent(i,n)]})}return[]}has(e,o){if(o)return this.getRelatedKeys(e)?.has(o)??!1;return this.relations.has(e)}}class f{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 n of o)n(e)}}class U extends f{state;constructor(e){super();this.state=e}next(e){this.state=e,super.next(e)}}function M(e){return"epoch"in e.transactionMeta}function u(e){return"phase"in e.transactionMeta}function se(e){return e[0].toUpperCase()+e.slice(1)}function D(e){return e.type.split("_").map(se).join(" ")}class O extends Error{constructor(e,o){super(`${D(e)} ${p(e.key)} not found in store "${o.config.name}".`)}}var B=(e)=>(o)=>e instanceof Function?e(o):e;var x=(e,o)=>{if(e.valueMap.has(o.key))return e.logger.info("\uD83D\uDCD6",o.type,o.key,"reading cached value"),ye(o,e);switch(o.type){case"selector":case"readonly_selector":return e.logger.info("\uD83E\uDDEE",o.type,o.key,"computing value"),o.get();case"atom":case"mutable_atom":{let n=o.default,t;if(n instanceof Function)t=n();else t=n;return e.logger.info("\uD83D\uDC81","atom",o.key,"could not find cached value; using default",t),t}}};var fe=(e,o)=>{if(e.operation.open){let n=performance.now();return e.logger.info("\u2757",o.type,o.key,`deferring setState at T-${n} until setState for "${e.operation.token.key}" is done`),n}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}"${!u(e)?"":` ${e.transactionMeta.phase} "${e.transactionMeta.update.key}"`}`)},ke=(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)},pe=(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)},w=(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 Se=(e,o,n)=>{switch(o.type){case"mutable_atom":e.logger.info("\uD83D\uDCE2",o.type,o.key,"is now (",n.newValue,") subscribers:",o.subject.subscribers);break;case"atom":case"selector":case"readonly_selector":e.logger.info("\uD83D\uDCE2",o.type,o.key,"went (",n.oldValue,"->",n.newValue,") subscribers:",o.subject.subscribers)}o.subject.next(n)};var ee=(e,o)=>{let n=T(e),t=n.selectorAtoms.getRelatedKeys(o.key);if(n.logger.info("\uD83E\uDDF9",o.type,o.key,t?`evicting ${t.size} states downstream:`:"no downstream states",t??"to evict"),t){if(n.operation.open)n.logger.info("\uD83E\uDDF9",o.type,o.key,`[ ${[...n.operation.done].join(", ")} ] already done`);for(let i of t){if(pe(n,i))continue;ue(i,n),w(n,i)}}};var be=(e,o,n)=>{let t=x(e,o),i=t;if(o.type==="mutable_atom"&&u(e)){let{parent:l}=e;i=j(e,o,l)}if(i=B(n)(i),e.logger.info("\uD83D\uDCDD","atom",o.key,"set to",i),i=F(e,o.key,i,o.subject),Ke(e,o.key))Fe(e,o.key);w(e,o.key),ee(e,o);let r={oldValue:t,newValue:i};if(!u(e)){Se(e,o,r);return}if(e.on.transactionApplying.state===null){let{key:l}=o;if(de(r.newValue))return;let a={type:"atom_update",key:l,...r};if(o.family)a.family=o.family;e.transactionMeta.update.updates.push(a),e.logger.info("\uD83D\uDCC1","atom",l,"stowed (",r.oldValue,"->",r.newValue,")")}else if(o.key.startsWith("*")){let l=o.key.slice(1),a=e.atoms.get(l),m=e.valueMap.get(l);if(a.type==="mutable_atom"&&u(e)){let{parent:s}=e;m=j(e,a,s)}if(m.do(r.newValue)===null)ee(e,a)}};var G=(e,o,n)=>{switch(o.type){case"atom":case"mutable_atom":be(e,o,n);break;case"selector":o.set(n);break}};var Y=(e,o)=>T(e).atoms.has(o),De=(e,o)=>T(e).selectors.has(o),Be=(e,o)=>T(e).readonlySelectors.has(o),xe=(e,o)=>Y(e,o)||De(e,o)||Be(e,o);var q=(e,o)=>{return T(o).selectorGraph.getRelationEntries({downstreamSelectorKey:e}).filter(([t,{source:i}])=>i!==e).map(([t,{source:i}])=>i).filter((t)=>xe(o,t))};var oe=(e,o,n)=>{let t=[],i=q(e,n);while(i.length>0){let r=i.shift();if(o.has(r))continue;if(o.add(r),!Y(n,r))i.push(...q(r,n));else if(!t.includes(r))t.push(r)}return t},Ae=(e,o)=>{let n=e.key,t=q(n,o),i=new Set;return t.flatMap((r)=>Y(o,r)?r:oe(r,i,o))};var ge=(e,o,n,t)=>{let i=T(t);if(o.type==="atom"||o.type==="mutable_atom")i.selectorAtoms.set({selectorKey:e,atomKey:o.key}),t.logger.info("\uD83D\uDD0D","selector",e,`discovers root atom "${o.key}"`);else{let r=oe(o.key,n,t);t.logger.info("\uD83D\uDD0D","selector",e,`discovers root atoms: [ ${r.map((l)=>`"${l}"`).join(", ")} ]`);for(let l of r)i.selectorAtoms=i.selectorAtoms.set({selectorKey:e,atomKey:l})}n.add(o.key)};var Q=(e,o,n)=>({get:(...t)=>{let i=T(n),r;if(t.length===2){let[m,c]=t;r=b(n,m,c)}else[r]=t;let l=S(n,r),a=x(n,l);return n.logger.info("\uD83D\uDD0C","selector",e,`registers dependency ( "${r.key}" =`,a,")"),i.selectorGraph.set({upstreamSelectorKey:r.key,downstreamSelectorKey:e},{source:r.key}),ge(e,r,o,n),a},set:(...t)=>{let i,r;if(t.length===2)i=t[0],r=t[1];else{let m=t[0],c=t[1];r=t[2],i=b(n,m,c)}let l=T(n),a=S(l,i);G(l,a,r)},find:(...t)=>b(n,...t),json:(t)=>W(n,t)});var ne=(e,o,n)=>{let t=T(e),i=new f,r=new Set,{get:l,find:a,json:m}=Q(o.key,r,t),c=()=>{let k=o.get({get:l,find:a,json:m});return F(T(e),o.key,k,i),r.clear(),k},s={...o,subject:i,install:(k)=>ne(k,o,n),get:c,type:"readonly_selector",...n&&{family:n}};t.readonlySelectors.set(o.key,s);let y=c();e.logger.info("\u2728",s.type,s.key,"=",y);let d={key:o.key,type:"readonly_selector"};if(n)d.family=n;return d};var $=(e,o,n)=>{let t=T(e),i=new f,r=new Set,l=Q(o.key,r,t),{find:a,get:m,json:c}=l,s={find:a,get:m,json:c},y=(J=o.get,g=T(e))=>{let R=J(s);return F(g,o.key,R,i),r.clear(),R},k={...o,subject:i,install:(J)=>$(J,o,n),get:y,set:(J)=>{let g=T(e),R=y(o.get,g),H=B(J)(R);if(e.logger.info("\uD83D\uDCDD","selector",o.key,"set (",R,"->",H,")"),F(g,o.key,H,i),w(g,o.key),M(g))i.next({newValue:H,oldValue:R});o.set(l,H)},type:"selector",...n&&{family:n}};t.selectors.set(o.key,k);let je=y();e.logger.info("\u2728",k.type,k.key,"=",je);let ae={key:o.key,type:"selector"};if(n)ae.family=n;return ae};function Te(e,o){if("set"in o){let i=$(e,o,void 0);return e.on.selectorCreation.next(i),i}let t=ne(e,o,void 0);return e.on.selectorCreation.next(t),t}function X(e,o,n){let t={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 ${D(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 f,a=Object.assign((m)=>{let c=p(m),s={key:o.key,subKey:c},y=`${o.key}(${c})`,d=T(e),k=$(d,{key:y,get:o.get(m),set:o.set(m)},s);return r.next({type:"state_creation",token:k}),k},t,{internalRoles:n,subject:r,install:(m)=>X(m,o),default:(m)=>{return o.get(m)({get:(...s)=>E(e,...s),find:(...s)=>b(e,...s),json:(s)=>W(e,s)})}});return e.families.set(o.key,a),t}function Re(e,o,n){let t=e.families.get(o.key);if(t===void 0)throw new O(o,e);let i=t(n),r=T(e);if(i.family){if(M(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(u(r)&&r.on.transactionApplying.state===null)r.transactionMeta.update.updates.push({type:"state_creation",token:i})}return i}function Me(e,o,n){let t=p(n),i=`${o.key}(${t})`,r=T(e),l;switch(o.type){case"atom_family":case"mutable_atom_family":l=r.atoms.get(i);break;case"selector_family":l=r.selectors.get(i);break;case"readonly_selector_family":l=r.readonlySelectors.get(i);break}if(l)return h(l);return l}function b(e,o,n){let t=Me(e,o,n);if(t)return t;let i=p(n),r=e.molecules.get(i);if(!r&&e.config.lifespan==="immortal"){let l=ce(o,n);return e.logger.error("\u274C",l.type,l.key,`was not found in store "${e.config.name}"; returned a counterfeit token.`),l}if(t=Re(e,o,n),r)T(e).moleculeData.set(i,o.key);return t}function we(e,o){if(o.family){let n=e.families.get(o.family.key);if(n)return n}}function A(e,...o){let n,t,i,r;if(o.length===2){if(n=o[0],r=o[1],t=we(e,n)??null,t)i=n.family?I(n.family.subKey):null,n=b(e,t,i)}else t=o[0],i=o[1],r=o[2],n=b(e,t,i);if("counterfeit"in n&&"family"in n){let m=n.family.subKey,c=e.disposalTraces.buffer.find((s)=>s?.key===m);e.logger.error("\u274C",n.type,n.key,`could not be set because it was not found in the store "${e.config.name}".`,c?`This state was previously disposed:
4
- ${c.trace}`:"No previous disposal trace was found.");return}let l=fe(e,n);if(l){let m=e.on.operationClose.subscribe(`waiting to set "${n.key}" at T-${l}`,()=>{m(),e.logger.info("\uD83D\uDFE2",n.type,n.key,`resuming deferred setState from T-${l}`),A(e,n,r)});return}let a=S(e,n);G(e,a,r),ke(e)}function E(e,...o){let n,t,i;if(o.length===1)n=o[0];else t=o[0],i=o[1],n=b(e,t,i);if("counterfeit"in n&&"family"in n){t=e.families.get(n.family.key);let r=n.family.subKey,l=e.disposalTraces.buffer.find((a)=>a?.key===r);switch(e.logger.error("\u274C",n.type,n.key,`could not be retrieved because it was not found in the store "${e.config.name}".`,l?`This state was previously disposed:
5
- ${l.trace}`:"No previous disposal trace was found."),t.type){case"atom_family":case"mutable_atom_family":return e.defaults.get(t.key);case"selector_family":case"readonly_selector_family":{if(e.defaults.has(t.key))return e.defaults.get(n.family.key);let a=S(e,t).default(r);return e.defaults.set(t.key,a),a}}}return x(e,S(e,n))}class We{parent=null;child=null;valueMap=new Map;defaults=new Map;atoms=new Map;selectors=new Map;readonlySelectors=new Map;atomsThatAreDefault=new Set;selectorAtoms=new K({between:["selectorKey","atomKey"],cardinality:"n:n"});selectorGraph=new K({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 K({between:["continuity","action"],cardinality:"1:n"})};timelines=new Map;timelineTopics=new K({between:["timelineKey","topicKey"],cardinality:"1:n"});disposalTraces=new v(100);molecules=new Map;moleculeJoins=new K({between:["moleculeKey","joinKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});moleculeGraph=new K({between:["upstreamMoleculeKey","downstreamMoleculeKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});moleculeData=new K({between:["moleculeKey","stateFamilyKey"],cardinality:"n:n"},{makeContentKey:(...e)=>e.sort().join(":")});miscResources=new Map;on={atomCreation:new f,atomDisposal:new f,selectorCreation:new f,selectorDisposal:new f,timelineCreation:new f,transactionCreation:new f,transactionApplying:new U(null),operationClose:new f,moleculeCreation:new f,moleculeDisposal:new f};operation={open:!1};config={name:"IMPLICIT_STORE",lifespan:"ephemeral"};loggers=[new V("warn",(e,o,n)=>!Je(n))];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},M(o))this.transactionMeta={epoch:new Map(o?.transactionMeta.epoch),actionContinuities:new K(o?.transactionMeta.actionContinuities.toJSON())};for(let[,t]of o.families){if(t.internalRoles?.includes("mutable")||t.internalRoles?.includes("join"))continue;t.install(this)}let n=new Set;for(let[,t]of o.atoms){if(n.has(t.key))continue;if(t.install(this),t.type==="mutable_atom"){let i=W(o,t),r=Ce(t);n.add(i.key),n.add(r.key)}}for(let[,t]of o.readonlySelectors)t.install(this);for(let[,t]of o.selectors){if(n.has(t.key))continue;t.install(this)}for(let[,t]of o.transactions)t.install(this);for(let[,t]of o.timelines)t.install(this)}}}var me={get STORE(){return globalThis.ATOM_IO_IMPLICIT_STORE??=new We({name:"IMPLICIT_STORE",lifespan:"ephemeral"}),globalThis.ATOM_IO_IMPLICIT_STORE}};function S(e,o){let n,t=e;while(t!==null){switch(o.type){case"atom":case"mutable_atom":n=t.atoms.get(o.key);break;case"selector":n=t.selectors.get(o.key);break;case"readonly_selector":n=t.readonlySelectors.get(o.key);break;case"atom_family":case"mutable_atom_family":case"selector_family":case"readonly_selector_family":n=t.families.get(o.key);break;case"timeline":n=t.timelines.get(o.key);break;case"transaction":n=t.transactions.get(o.key);break}if(n)return n;t=t.child}throw new O(o,e)}var _e=(e,o)=>{let n=T(e);if(n.operation.open)return n.operation.prev.get(o.key);return n.valueMap.get(o.key)};var te=(e,o)=>{let n=T(e);return Ae(o,e).map((i)=>{let r=n.atoms.get(i);if(r===void 0)throw new Error(`Atom "${i}", a dependency of selector "${o.key}", not found in store "${e.config.name}".`);return r.subject.subscribe(`${o.type}:${o.key}`,(l)=>{e.logger.info("\uD83D\uDCE2",o.type,o.key,"root",i,"went",l.oldValue,"->",l.newValue);let a=_e(n,o),m=x(n,o);e.logger.info("\u2728",o.type,o.key,"went",a,"->",m),o.subject.next({newValue:m,oldValue:a})})})};function P(e,o,n,t){function i(y){if(e.operation.open){let d=e.on.operationClose.subscribe(`state subscription ${n}`,()=>{d(),t(y)})}else t(y)}let r=S(e,o);e.logger.info("\uD83D\uDC40",r.type,r.key,`Adding subscription "${n}"`);let l=r.type==="selector"||r.type==="readonly_selector",a=null,m=i;if(l)a=te(e,r),m=(y)=>{if(a)a.length=0,a.push(...te(e,r));i(y)};let c=r.subject.subscribe(n,m);return()=>{if(e.logger.info("\uD83D\uDE48",r.type,r.key,`Removing subscription "${n}"`),c(),a)for(let y of a)y()}}var Ie=(e,o,n,t)=>{let i=S(e,o);e.logger.info("\uD83D\uDC40","timeline",o.key,`Adding subscription "${n}"`);let r=i.subject.subscribe(n,t);return()=>{e.logger.info("\uD83D\uDE48","timeline",o.key,`Removing subscription "${n}" from timeline`),r()}};class ie{initializeState(e,o){let n=`*${e.key}`;o.atoms.delete(n),o.valueMap.delete(n);let t=e.family?{key:`*${e.family.key}`,subKey:e.family.subKey}:void 0,i=re(o,{key:n,default:null},t);if(o.parent?.valueMap.has(n)){let r=o.parent.valueMap.get(n);o.valueMap.set(n,r)}return i}unsubscribeFromInnerValue;unsubscribeFromState;observeCore(e,o,n){let t=`tracker:${n.config.name}:${u(n)?n.transactionMeta.update.key:"main"}:${e.key}`,i=E(n,e);this.unsubscribeFromInnerValue=i.subscribe(t,(r)=>{A(n,o,r)}),this.unsubscribeFromState=P(n,e,t,(r)=>{if(r.newValue!==r.oldValue)this.unsubscribeFromInnerValue(),this.unsubscribeFromInnerValue=r.newValue.subscribe(t,(l)=>{A(n,o,l)})})}updateCore(e,o,n){let t=`tracker:${n.config.name}:${u(n)?n.transactionMeta.update.key:"main"}:${e.key}`;P(n,o,t,({newValue:i,oldValue:r})=>{let l=n.timelineTopics.getRelatedKey(o.key);if(l){if(n.timelines.get(l)?.timeTraveling){let c=Ie(n,{key:l,type:"timeline"},t,(s)=>{c(),A(n,e,(y)=>{if(s==="redo"&&i)y.do(i);else if(s==="undo"&&r)y.undo(r);return y})});return}}let a=n.on.operationClose.subscribe(t,()=>{a();let m=E(n,e),c=i===null?-1:m.getUpdateNumber(i),s=c-m.cacheUpdateNumber;if(i&&s===1)A(n,e,(y)=>(y.do(i),y));else n.logger.info("\u274C","mutable_atom",e.key,`could not be updated. Expected update number ${m.cacheUpdateNumber+1}, but got ${c}`)})})}mutableState;latestUpdateState;[Symbol.dispose];constructor(e,o){this.mutableState=e;let n=T(o);this.latestUpdateState=this.initializeState(e,n),this.observeCore(e,this.latestUpdateState,n),this.updateCore(e,this.latestUpdateState,n),n.trackers.set(e.key,this),this[Symbol.dispose]=()=>{this.unsubscribeFromInnerValue(),this.unsubscribeFromState(),n.trackers.delete(e.key)}}}var W=(e,o)=>{if(o.family){let t=T(e),r={key:`${o.family.key}:JSON`,type:"selector_family"},l=S(t,r),a=JSON.parse(o.family.subKey);return b(e,l,a)}return{type:"selector",key:`${o.key}:JSON`}};var Ce=(e)=>{let n={type:"atom",key:`*${e.key}`};if(e.family)n.family={key:`*${e.family.key}`,subKey:e.family.subKey};return n};function de(e){return typeof e==="object"&&e!==null&&"do"in e&&"undo"in e&&"subscribe"in e}function j(e,o,n){let t=n.valueMap.get(o.key),i=e.valueMap.get(o.key);if(t!==i)return i;if(t===void 0)return o.default();n.logger.info("\uD83D\uDCC3","atom",o.key,"copying");let r=o.toJson(t),l=o.fromJson(r);return e.valueMap.set(o.key,l),new ie(o,n),l}function F(e,o,n,t){let i=e.valueMap.get(o);if(i instanceof _)i.use(n);if(n instanceof Promise){let r=new _(n);return e.valueMap.set(o,r),r.then((l)=>{F(e,o,l,t),t.next({newValue:l,oldValue:r})}).catch((l)=>{e.logger.error("\uD83D\uDCA5","state",o,"rejected:",l)}),r}return e.valueMap.set(o,n),n}var ye=(e,o)=>{let n=o.valueMap.get(e.key);if(e.type==="mutable_atom"&&u(o)){let{parent:t}=o;n=j(o,e,t)}return n},ue=(e,o)=>{let n=o.valueMap.get(e);if(n instanceof _){let t=n,i=o.selectors.get(e)??o.readonlySelectors.get(e);if(i)t.use(i.get());return}if(o.operation.open)o.operation.prev.set(e,n);o.valueMap.delete(e),o.logger.info("\uD83D\uDDD1","state",e,"evicted")};var Ke=(e,o)=>{return T(e).atomsThatAreDefault.has(o)},he=(e,o)=>{let n=T(e);n.atomsThatAreDefault=new Set(n.atomsThatAreDefault).add(o)},Fe=(e,o)=>{let n=T(e);n.atomsThatAreDefault=new Set(T(e).atomsThatAreDefault),n.atomsThatAreDefault.delete(o)};function re(e,o,n){e.logger.info("\uD83D\uDD28","atom",o.key,`creating in store "${e.config.name}"`);let t=T(e),i=t.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."),h(i);let r=new f,l={...o,type:"atom",install:(c)=>{return c.logger.info("\uD83D\uDEE0\uFE0F","atom",o.key,`installing in store "${c.config.name}"`),re(c,o,n)},subject:r};if(n)l.family=n;let a=o.default;if(o.default instanceof Function)a=o.default();t.atoms.set(l.key,l),he(e,o.key),F(t,o.key,a,r);let m=h(l);if(o.effects){let c=0,s=[];for(let y of o.effects){let d=y({setSelf:(k)=>{A(e,m,k)},onSet:(k)=>P(e,m,`effect[${c}]`,k)});if(d)s.push(d);++c}l.cleanup=()=>{for(let y of s)y()}}return m}class C extends Set{mode="record";subject=new f;cacheLimit=0;cache=[];cacheIdx=-1;cacheUpdateNumber=-1;constructor(e,o=0){super(e);if(e instanceof C)this.parent=e,this.cacheUpdateNumber=e.cacheUpdateNumber;if(o)this.cacheLimit=o,this.cache=new Array(o),this.subscribe("auto cache",(n)=>{this.cacheIdx++,this.cacheIdx%=this.cacheLimit,this.cache[this.cacheIdx]=n})}toJSON(){return{members:[...this],cache:this.cache,cacheLimit:this.cacheLimit,cacheIdx:this.cacheIdx,cacheUpdateNumber:this.cacheUpdateNumber}}static fromJSON(e){let o=new C(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:${p(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:${p(e)}`);return o}parent=null;child=null;transactionUpdates=null;transaction(e){this.mode="transaction",this.transactionUpdates=[],this.child=new C(this);let o=this.child._subscribe("transaction",(n)=>{this.transactionUpdates?.push(n)});try{if(e(this.child)){for(let t of this.transactionUpdates)this.doStep(t);this.cacheUpdateNumber++,this.emit(`tx:${this.transactionUpdates.join(";")}`)}}catch(n){throw console.warn("Did not apply transaction to SetRTX; this error was thrown:",n),n}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,(n)=>{o(`${this.cacheUpdateNumber}=${n}`)})}emit(e){this.subject.next(e)}doStep(e){let o=e.indexOf(":"),n=e.substring(0,o),t=e.substring(o+1);switch(n){case"add":this.add(JSON.parse(t));break;case"clear":this.clear();break;case"del":this.delete(JSON.parse(t));break;case"tx":for(let i of t.split(";"))this.doStep(i)}}getUpdateNumber(e){let o=e.indexOf("=");return Number(e.substring(0,o))}do(e){let o=e.indexOf("="),n=Number(e.substring(0,o)),t=n-this.cacheUpdateNumber;if(t>0){if(t===1){this.mode="playback";let r=e.substring(o+1);return this.doStep(r),this.mode="record",this.cacheUpdateNumber=n,null}return this.cacheUpdateNumber+1}if(Math.abs(t)<this.cacheLimit){let r=this.cacheIdx+t;if(this.cache[r]===e)return null;this.mode="playback";let a=!1;while(!a){this.cacheIdx%=this.cacheLimit;let c=this.cache[this.cacheIdx];if(this.cacheIdx--,!c)return"OUT_OF_RANGE";this.undo(c),a=this.cacheIdx===r-1}let m=e.substring(o+1);return this.doStep(m),this.mode="record",this.cacheUpdateNumber=n,null}return"OUT_OF_RANGE"}undoStep(e){let o=e.indexOf(":"),n=e.substring(0,o),t=e.substring(o+1);switch(n){case"add":this.delete(JSON.parse(t));break;case"del":this.add(JSON.parse(t));break;case"clear":{let i=JSON.parse(t);for(let r of i)this.add(r);break}case"tx":{let i=t.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 t=e.substring(o+1);return this.undoStep(t),this.mode="record",this.cacheUpdateNumber--,null}return this.cacheUpdateNumber}}function Je(e){return e.startsWith("\uD83D\uDD0D ")}class Z{listeners;globalListeners;handleEvent(e,...o){for(let t of this.globalListeners)t(e,...o);let n=this.listeners.get(e);if(n)for(let t of n)t(...o)}id="no_id_retrieved";emit;constructor(e){this.emit=e,this.listeners=new Map,this.globalListeners=new Set}on(e,o){let n=this.listeners.get(e);if(n)n.add(o);else this.listeners.set(e,new Set([o]));return this}onAny(e){return this.globalListeners.add(e),this}off(e,o){let n=this.listeners.get(e);if(n)if(o)n.delete(o);else this.listeners.delete(e);return this}offAny(e){return this.globalListeners.delete(e),this}}class Oe extends Z{in;out;id="no_id_retrieved";disposalFunctions=[];constructor(e){super((...o)=>{return this.out.next(o),this});this.id=e,this.in=new f,this.out=new f,this.in.subscribe("socket",(o)=>{this.handleEvent(...o)})}dispose(){for(let e of this.disposalFunctions)e()}}class le extends Z{incompleteData="";unprocessedEvents=[];relays;relayServices;process;id="#####";log(...e){this.process.stderr.write(p(e.map((o)=>o instanceof C?`{ ${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 n=JSON.stringify([e,...o]);return this.process.stdout.write(n+"\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 n=this.unprocessedEvents.shift();this.incompleteData+=n??"";try{let t=I(this.incompleteData);this.logger.info("\uD83C\uDFB0","received",t),this.handleEvent(...t);while(this.unprocessedEvents.length>0){let i=this.unprocessedEvents.shift();if(i){if(this.unprocessedEvents.length===0)this.incompleteData=i;let r=I(i);this.handleEvent(...r)}}this.incompleteData=""}catch(t){if(t instanceof Error)this.logger.error("\u2757",t.message,t.cause,t.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 Oe(`user:${e}`);this.relays.set(e,o),this.logger.info("\uD83D\uDD17","attaching services:",`[${[...this.relayServices.keys()].join(", ")}]`);for(let n of this.relayServices){let t=n(o);if(t)o.disposalFunctions.push(t)}this.on(`user:${e}`,(...n)=>{o.in.next(n)}),o.out.subscribe("socket",(n)=>{this.emit(...n)})}),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 z=new le;Object.assign(console,z.logger,{log:z.logger.info});z.on("timeToStop",function e(){z.logger.info("\uD83D\uDEEC game worker exiting"),process.exit(0)});z.logger.info("\uD83D\uDEEB game worker ready");
3
+ var De=Object.create;var{getPrototypeOf:ve,defineProperty:ee,getOwnPropertyNames:Be}=Object;var Ge=Object.prototype.hasOwnProperty;var Le=(e,o,n)=>{n=e!=null?De(ve(e)):{};let t=o||!e||!e.__esModule?ee(n,"default",{value:e,enumerable:!0}):n;for(let r of Be(e))if(!Ge.call(t,r))ee(t,r,{get:()=>e[r],enumerable:!0});return t};var Xe=(e,o)=>()=>(o||e((o={exports:{}}).exports,o),o.exports);var Ve=(e,o)=>{for(var n in o)ee(e,n,{get:o[n],enumerable:!0,configurable:!0,set:(t)=>o[n]=()=>t})};var Ne=(e,o)=>()=>(e&&(o=e(e=0)),o);var Ue=import.meta.require;class j extends Promise{fate;resolve;reject;done=!1;constructor(e){let o,n;super((t,r)=>{o=t,n=r});this.resolve=o,this.reject=n,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((n)=>{this.pass(o,n)},(n)=>{this.fail(o,n)})}else this.resolve(e),this.fate=void 0}}var to=(e,o,n=Se.STORE)=>{return pe(n,{key:`${e.key}:JSON`,get:({get:t})=>o.toJson(t(e)),set:({set:t},r)=>{t(e,o.fromJson(r))}})};function lo(e,o,n){return oe(e,{key:`${o.key}:JSON`,get:(r)=>({get:i})=>{let l=i(o,r);return n.toJson(l)},set:(r)=>({set:i},l)=>{i(o,r,n.fromJson(l))}},["mutable","json"])}var $=(e)=>JSON.parse(e),u=(e)=>JSON.stringify(e),ao=[Array.prototype,Boolean.prototype,Number.prototype,Object.prototype,String.prototype];function a(e){while(e.child!==null)e=e.child;return e}class Z{_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 Z([...this._buffer]);return e._index=this._index,e}}var qe={atom_family:"atom",molecule_family:"molecule",mutable_atom_family:"mutable_atom",readonly_held_selector_family:"readonly_held_selector",readonly_pure_selector_family:"readonly_pure_selector",writable_held_selector_family:"writable_held_selector",writable_pure_selector_family:"writable_pure_selector"};function ke(e,o){let n=u(o),t=`${e.key}(${n})`,r=qe[e.type],i={key:t,type:r};return Object.assign(i,{family:{key:e.key,subKey:n}}),Object.assign(i,{counterfeit:!0}),i}function E(e){let o={key:e.key,type:e.type};if("family"in e)o.family=e.family;return o}var ne=(e)=>(o,n,t,r,...i)=>{console[e](`${o} ${n} "${t}" ${r}`,...i)},Qe={error:ne("error"),info:ne("info"),warn:ne("warn")};class te{logLevel;filter;logger;constructor(e,o,n=Qe){this.logLevel=e,this.filter=o,this.logger=n}error=(...e)=>{let o=this.filter?.(...e)??!0;if(this.logLevel!==null){if(o===!0)this.logger.error(...e);else if(o!==!1)this.logger.error(...o)}};info=(...e)=>{let o=this.filter?.(...e)??!0;if(this.logLevel==="info"){if(o===!0)this.logger.info(...e);else if(o!==!1)this.logger.info(...o)}};warn=(...e)=>{let o=this.filter?.(...e)??!0;if(this.logLevel!=="error"&&this.logLevel!==null){if(o===!0)this.logger.warn(...e);else if(o!==!1)this.logger.warn(...o)}}}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 n=this.relations.get(e),t=this.relations.get(o);if(n)n.add(o);else n=new Set([o]),this.relations.set(e,n);if(t)t.add(e);else t=new Set([e]),this.relations.set(o,t)}deleteRelation(e,o){let n=this.relations.get(e);if(n){if(n.delete(o),n.size===0)this.relations.delete(e);let t=this.relations.get(o);if(t){if(t.delete(e),t.size===0)this.relations.delete(o)}}}replaceRelationsUnsafely(e,o){this.relations.set(e,new Set(o));for(let n of o){let t=new Set().add(e);this.relations.set(n,t)}}replaceRelationsSafely(e,o){let n=this.relations.get(e),t=this.isAType?.(e)?e:void 0,r=t===void 0?e:void 0;if(n)for(let i of n){t??=i,r??=i;let l=this.relations.get(i);if(l){if(l.size===1)this.relations.delete(i);else l.delete(e);this.contents.delete(this.makeContentKey(t,r))}}this.relations.set(e,new Set(o));for(let i of o){let l=this.relations.get(i);if(l)l.add(e);else l=new Set().add(e),this.relations.set(i,l)}}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(([n,t])=>[n,new Set(t)])),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 n=o.externalStore;if(this.has=(t,r)=>n.has(t,r),this.addRelation=(t,r)=>{n.addRelation(t,r)},this.deleteRelation=(t,r)=>{n.deleteRelation(t,r)},this.replaceRelationsSafely=(t,r)=>{n.replaceRelationsSafely(t,r)},this.replaceRelationsUnsafely=(t,r)=>{n.replaceRelationsUnsafely(t,r)},this.getRelatedKeys=(t)=>n.getRelatedKeys(t),n.getContent)this.getContentInternal=(t)=>{return n.getContent(t)},this.setContent=(t,r)=>{n.setContent(t,r)},this.deleteContent=(t)=>{n.deleteContent(t)};for(let[t,r]of e.relations??[]){let i=this.isAType?.(t)?t:void 0,l=i===void 0?t:void 0;for(let c of r)i??=c,l??=c,this.addRelation(i,l)}for(let[t,r]of e.contents??[])this.setContent(t,r)}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,n,t;switch(e.length){case 1:{let r=e[0];o=r[this.a],n=r[this.b],t=void 0;break}case 2:{let r=e[0];if(typeof r==="string")[o,n]=e;else o=r[this.a],n=r[this.b],t=e[1];break}default:{o=e[0],n=e[1],t=e[2];break}}switch(this.cardinality){case"1:1":{let r=this.getRelatedKey(o);if(r&&r!==n)this.delete(o,r)}case"1:n":{let r=this.getRelatedKey(n);if(r&&r!==o)this.delete(r,n)}break;case"n:n":}if(t){let r=this.makeContentKey(o,n);this.setContent(r,t)}return this.addRelation(o,n),this}delete(e,o){o=typeof o==="string"?o:e[this.b];let n=typeof e==="string"?e:e[this.a];if(n===void 0&&typeof o==="string"){let t=this.getRelatedKeys(o);if(t)for(let r of t)this.delete(r,o)}if(typeof n==="string"&&o===void 0){let t=this.getRelatedKeys(n);if(t)for(let r of t)this.delete(n,r)}if(typeof n==="string"&&typeof o==="string"){this.deleteRelation(n,o);let t=this.makeContentKey(n,o);this.deleteContent(t)}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((t)=>`"${t}"`).join(", ")}). Only one related key was expected.`);let n;for(let t of o){n=t;break}return n}}replaceRelations(e,o,n){let t=!Array.isArray(o),r=t?Object.keys(o):o;if(n?.reckless)this.replaceRelationsUnsafely(e,r);else this.replaceRelationsSafely(e,r);if(t)for(let i of r){let l=this.makeContentKey(e,i),c=o[i];this.setContent(l,c)}return this}getContent(e,o){let n=this.makeContentKey(e,o);return this.getContentInternal(n)}getRelationEntries(e){let o=e[this.a],n=e[this.b];if(o!==void 0&&n===void 0){let t=this.getRelatedKeys(o);if(t)return[...t].map((r)=>{return[r,this.getContent(o,r)]})}if(o===void 0&&n!==void 0){let t=this.getRelatedKeys(n);if(t)return[...t].map((r)=>{return[r,this.getContent(r,n)]})}return[]}has(e,o){if(o)return this.getRelatedKeys(e)?.has(o)??!1;return this.relations.has(e)}}class f{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 n of o)n(e)}}class re extends f{state;constructor(e){super();this.state=e}next(e){this.state=e,super.next(e)}}function g(e){return"epoch"in e.transactionMeta}function F(e){return"phase"in e.transactionMeta}function ue(e){return e[0].toUpperCase()+e.slice(1)}function L(e){return e.type.split("_").map(ue).join(" ")}class z extends Error{constructor(e,o){super(`${L(e)} ${u(e.key)} not found in store "${o.config.name}".`)}}var I=(e)=>(o)=>e instanceof Function?e(o):e;var W=(e,o)=>{if(e.valueMap.has(o.key))return e.logger.info("\uD83D\uDCD6",o.type,o.key,"reading cached value"),de(o,e);switch(o.type){case"readonly_held_selector":case"readonly_pure_selector":case"writable_held_selector":case"writable_pure_selector":return e.logger.info("\uD83E\uDDEE",o.type,o.key,"computing value"),o.get();case"atom":case"mutable_atom":{let n=o.default,t;if(n instanceof Function)t=n();else t=n;return e.logger.info("\uD83D\uDC81","atom",o.key,"could not find cached value; using default",t),t}}};var be=(e,o)=>{if(e.operation.open){let n=performance.now();return e.logger.info("\u2757",o.type,o.key,`deferring setState at T-${n} until setState for "${e.operation.token.key}" is done`),n}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}"${!F(e)?"":` ${e.transactionMeta.phase} "${e.transactionMeta.update.key}"`}`)},Ke=(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)},xe=(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)},P=(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 Fe=(e,o,n)=>{switch(o.type){case"mutable_atom":e.logger.info("\uD83D\uDCE2",o.type,o.key,"is now (",n.newValue,") subscribers:",o.subject.subscribers);break;case"atom":case"writable_pure_selector":case"readonly_pure_selector":case"writable_held_selector":case"readonly_held_selector":e.logger.info("\uD83D\uDCE2",o.type,o.key,"went (",n.oldValue,"->",n.newValue,") subscribers:",o.subject.subscribers)}o.subject.next(n)};var ie=(e,o)=>{let n=a(e),t=n.selectorAtoms.getRelatedKeys(o.key);if(n.logger.info("\uD83E\uDDF9",o.type,o.key,t?`evicting ${t.size} states downstream:`:"no downstream states",t??"to evict"),t){if(n.operation.open)n.logger.info("\uD83E\uDDF9",o.type,o.key,`[ ${[...n.operation.done].join(", ")} ] already done`);for(let r of t){if(xe(n,r))continue;we(r,n),P(n,r)}}};var Ae=(e,o,n)=>{let t=W(e,o),r=t;if(o.type==="mutable_atom"&&F(e)){let{parent:l}=e;r=D(e,o,l)}if(r=I(n)(r),e.logger.info("\uD83D\uDCDD","atom",o.key,"set to",r),r=d(e,o.key,r,o.subject),Re(e,o.key))Me(e,o.key);P(e,o.key),ie(e,o);let i={oldValue:t,newValue:r};if(!F(e)){Fe(e,o,i);return}if(e.on.transactionApplying.state===null){let{key:l}=o;if(_e(i.newValue))return;let c={type:"atom_update",key:l,...i};if(o.family)c.family=o.family;e.transactionMeta.update.updates.push(c),e.logger.info("\uD83D\uDCC1","atom",l,"stowed (",i.oldValue,"->",i.newValue,")")}else if(o.key.startsWith("*")){let l=o.key.slice(1),c=e.atoms.get(l),T=e.valueMap.get(l);if(c.type==="mutable_atom"&&F(e)){let{parent:y}=e;T=D(e,c,y)}if(T.do(i.newValue)===null)ie(e,c)}};var X=(e,o,n)=>{switch(o.type){case"atom":case"mutable_atom":Ae(e,o,n);break;case"writable_pure_selector":case"writable_held_selector":o.set(n);break}};var V=(e,o)=>a(e).atoms.has(o),Ye=(e,o)=>a(e).writableSelectors.has(o),Ze=(e,o)=>a(e).readonlySelectors.has(o),ge=(e,o)=>V(e,o)||Ye(e,o)||Ze(e,o);var N=(e,o)=>{return a(e).selectorGraph.getRelationEntries({downstreamSelectorKey:o}).filter(([t,{source:r}])=>r!==o).map(([t,{source:r}])=>r).filter((t)=>ge(e,t))};var le=(e,o,n)=>{let t=[],r=N(e,o);while(r.length>0){let i=r.shift();if(n.has(i))continue;if(n.add(i),!V(e,i))r.push(...N(e,i));else if(!t.includes(i))t.push(i)}return t},We=(e,o)=>{let n=e.key,t=N(o,n),r=new Set;return t.flatMap((i)=>V(o,i)?i:le(o,i,r))};var Pe=(e,o,n,t,r)=>{let i=a(e),{type:l,key:c}=t;if(l==="atom"||l==="mutable_atom")i.selectorAtoms.set({selectorKey:n,atomKey:c}),e.logger.info("\uD83D\uDD0D",o,n,`discovers root atom "${c}"`);else{let T=le(e,c,r);e.logger.info("\uD83D\uDD0D",o,n,`discovers root atoms: [ ${T.map((m)=>`"${m}"`).join(", ")} ]`);for(let m of T)i.selectorAtoms=i.selectorAtoms.set({selectorKey:n,atomKey:m})}r.add(c)};var C=(e,o,n,t)=>({get:(...r)=>{let i=a(e),l;if(r.length===2){let[y,s]=r;l=w(e,y,s)}else[l]=r;let c=K(e,l),T=W(e,c),m=l.key;return e.logger.info("\uD83D\uDD0C",o,n,`registers dependency ( "${m}" =`,T,")"),i.selectorGraph.set({upstreamSelectorKey:m,downstreamSelectorKey:n},{source:l.key}),Pe(e,o,n,l,t),T},set:(...r)=>{let i,l;if(r.length===2)i=r[0],l=r[1];else{let m=r[0],y=r[1];l=r[2],i=w(e,m,y)}let c=a(e),T=K(c,i);X(c,T,l)},find:(...r)=>w(e,...r),json:(r)=>H(e,r)});var ce=(e,o,n)=>{let t=a(e),r=new f,i=new Set,{key:l,const:c}=o,T="readonly_held_selector",{get:m,find:y,json:s}=C(t,"readonly_held_selector",l,i),b={...o,type:"readonly_held_selector",subject:r,install:(S)=>ce(S,o,n),get:()=>{return o.get({get:m,find:y,json:s},c),d(a(e),l,c,r),i.clear(),c},...n&&{family:n}};t.readonlySelectors.set(l,b),e.logger.info("\u2728","readonly_held_selector",l,"=",c);let k={key:l,type:"readonly_held_selector"};if(n)k.family=n;return k};var ae=(e,o,n)=>{let t=a(e),r=new f,i=new Set,l=o.key,c="readonly_pure_selector",{get:T,find:m,json:y}=C(t,"readonly_pure_selector",l,i),s=()=>{let S=o.get({get:T,find:m,json:y});return d(a(e),l,S,r),i.clear(),S},p={...o,type:"readonly_pure_selector",subject:r,install:(S)=>ae(S,o,n),get:s,...n&&{family:n}};t.readonlySelectors.set(l,p);let b=s();e.logger.info("\u2728","readonly_pure_selector",l,"=",b);let k={key:l,type:"readonly_pure_selector"};if(n)k.family=n;return k};var Te=(e,o,n)=>{let t=a(e),r=new f,i=new Set,{key:l,const:c}=o,T="writable_held_selector",m=C(t,"writable_held_selector",l,i),{find:y,get:s,json:p}=m,b={find:y,get:s,json:p},k=(A=o.get,x=a(e))=>{return A(b,c),d(x,l,c,r),i.clear(),c},J={...o,type:"writable_held_selector",subject:r,install:(A)=>Te(A,o,n),get:k,set:(A)=>{let x=a(e),M=k(o.get,x),Y=I(A)(M);if(e.logger.info("\uD83D\uDCDD","writable_held_selector",l,"set (",M,"->",Y,")"),d(x,l,Y,r),P(x,l),g(x))r.next({newValue:Y,oldValue:M});o.set(m,Y)},...n&&{family:n}};t.writableSelectors.set(l,J);let Q=k();e.logger.info("\u2728","writable_held_selector",l,"=",Q);let R={key:l,type:"writable_held_selector"};if(n)R.family=n;return R};var v=(e,o,n)=>{let t=a(e),r=new f,i=new Set,l=o.key,c="writable_pure_selector",T=C(t,"writable_pure_selector",l,i),{find:m,get:y,json:s}=T,p={find:m,get:y,json:s},b=(R=o.get,A=a(e))=>{let x=R(p);return d(A,l,x,r),i.clear(),x},S={...o,type:"writable_pure_selector",subject:r,install:(R)=>v(R,o,n),get:b,set:(R)=>{let A=a(e),x=b(o.get,A),M=I(R)(x);if(e.logger.info("\uD83D\uDCDD","writable_pure_selector",l,"set (",x,"->",M,")"),d(A,o.key,M,r),P(A,o.key),g(A))r.next({newValue:M,oldValue:x});o.set(T,M)},...n&&{family:n}};t.writableSelectors.set(l,S);let J=b();e.logger.info("\u2728",S.type,S.key,"=",J);let Q={key:l,type:"writable_pure_selector"};if(n)Q.family=n;return Q};function pe(e,o){let n="set"in o,t="const"in o;if(t&&n){let i=Te(e,o,void 0);return e.on.selectorCreation.next(i),i}if(t){let i=ce(e,o,void 0);return e.on.selectorCreation.next(i),i}if(n){let i=v(e,o,void 0);return e.on.selectorCreation.next(i),i}let r=ae(e,o,void 0);return e.on.selectorCreation.next(r),r}function oe(e,o,n){let t=o.key,r="writable_pure_selector_family",i={key:t,type:"writable_pure_selector_family"},l=e.families.get(t);if(l)e.logger.error("\u2757","writable_pure_selector_family",t,`Overwriting an existing ${L(l)} "${l.key}" in store "${e.config.name}". You can safely ignore this warning if it is due to hot module replacement.`);let c=new f,m=Object.assign((y)=>{let s=u(y),p={key:t,subKey:s},b=`${t}(${s})`,k=a(e),S=v(k,{key:b,get:o.get(y),set:o.set(y)},p);return c.next({type:"state_creation",token:S}),S},i,{internalRoles:n,subject:c,install:(y)=>oe(y,o),default:(y)=>{return o.get(y)({get:(...p)=>B(e,...p),find:(...p)=>w(e,...p),json:(p)=>H(e,p)})}});return e.families.set(t,m),i}function Ce(e,o,n){let t=e.families.get(o.key);if(t===void 0)throw new z(o,e);let r=t(n),i=a(e);if(r.family){if(g(i))switch(r.type){case"atom":case"mutable_atom":e.on.atomCreation.next(r);break;case"writable_pure_selector":case"readonly_pure_selector":case"writable_held_selector":case"readonly_held_selector":e.on.selectorCreation.next(r);break}else if(F(i)&&i.on.transactionApplying.state===null)i.transactionMeta.update.updates.push({type:"state_creation",token:r})}return r}function he(e,o,n){let t=u(n),r=`${o.key}(${t})`,i=a(e),l;switch(o.type){case"atom_family":case"mutable_atom_family":l=i.atoms.get(r);break;case"writable_held_selector_family":case"writable_pure_selector_family":l=i.writableSelectors.get(r);break;case"readonly_held_selector_family":case"readonly_pure_selector_family":l=i.readonlySelectors.get(r);break}if(l)return E(l);return l}function w(e,o,n){let t=he(e,o,n);if(t)return t;let r=u(n),i=e.molecules.get(r);if(!i&&e.config.lifespan==="immortal"){let l=ke(o,n);return e.logger.error("\u274C",l.type,l.key,`was not found in store "${e.config.name}"; returned a counterfeit token.`),l}if(t=Ce(e,o,n),i)a(e).moleculeData.set(r,o.key);return t}function Je(e,o){if(o.family){let n=e.families.get(o.family.key);if(n)return n}}function h(e,...o){let n,t,r,i;if(o.length===2){if(n=o[0],i=o[1],t=Je(e,n)??null,t)r=n.family?$(n.family.subKey):null,n=w(e,t,r)}else t=o[0],r=o[1],i=o[2],n=w(e,t,r);if("counterfeit"in n&&"family"in n){let T=n.family.subKey,m=e.disposalTraces.buffer.find((y)=>y?.key===T);e.logger.error("\u274C",n.type,n.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 l=be(e,n);if(l){let T=e.on.operationClose.subscribe(`waiting to set "${n.key}" at T-${l}`,()=>{T(),e.logger.info("\uD83D\uDFE2",n.type,n.key,`resuming deferred setState from T-${l}`),h(e,n,i)});return}let c=K(e,n);X(e,c,i),Ke(e)}function B(e,...o){let n,t,r;if(o.length===1)n=o[0];else t=o[0],r=o[1],n=w(e,t,r);if("counterfeit"in n&&"family"in n){t=e.families.get(n.family.key);let i=n.family.subKey,l=e.disposalTraces.buffer.find((c)=>c?.key===i);switch(e.logger.error("\u274C",n.type,n.key,`could not be retrieved because it was not found in the store "${e.config.name}".`,l?`This state was previously disposed:
5
+ ${l.trace}`:"No previous disposal trace was found."),t.type){case"atom_family":case"mutable_atom_family":return e.defaults.get(t.key);case"readonly_pure_selector_family":case"writable_pure_selector_family":case"readonly_held_selector_family":case"writable_held_selector_family":{if(e.defaults.has(t.key))return e.defaults.get(n.family.key);let c=K(e,t).default(i);return e.defaults.set(t.key,c),c}}}return W(e,K(e,n))}class Ie{parent=null;child=null;valueMap=new Map;defaults=new Map;atoms=new Map;writableSelectors=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 Z(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 f,atomDisposal:new f,selectorCreation:new f,selectorDisposal:new f,timelineCreation:new f,transactionCreation:new f,transactionApplying:new re(null),operationClose:new f,moleculeCreation:new f,moleculeDisposal:new f};operation={open:!1};config={name:"IMPLICIT_STORE",lifespan:"ephemeral"};loggers=[new te("warn",(e,o,n)=>!Oe(n))];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},g(o))this.transactionMeta={epoch:new Map(o?.transactionMeta.epoch),actionContinuities:new _(o?.transactionMeta.actionContinuities.toJSON())};for(let[,t]of o.families){if(t.internalRoles?.includes("mutable")||t.internalRoles?.includes("join"))continue;t.install(this)}let n=new Set;for(let[,t]of o.atoms){if(n.has(t.key))continue;if(t.install(this),t.type==="mutable_atom"){let r=H(o,t),i=He(t);n.add(r.key),n.add(i.key)}}for(let[,t]of o.readonlySelectors)t.install(this);for(let[,t]of o.writableSelectors){if(n.has(t.key))continue;t.install(this)}for(let[,t]of o.transactions)t.install(this);for(let[,t]of o.timelines)t.install(this)}}}var Se={get STORE(){return globalThis.ATOM_IO_IMPLICIT_STORE??=new Ie({name:"IMPLICIT_STORE",lifespan:"ephemeral"}),globalThis.ATOM_IO_IMPLICIT_STORE}};function K(e,o){let n,t=e;while(t!==null){switch(o.type){case"atom":case"mutable_atom":n=t.atoms.get(o.key);break;case"writable_pure_selector":case"writable_held_selector":n=t.writableSelectors.get(o.key);break;case"readonly_pure_selector":case"readonly_held_selector":n=t.readonlySelectors.get(o.key);break;case"atom_family":case"mutable_atom_family":case"writable_pure_selector_family":case"readonly_pure_selector_family":case"writable_held_selector_family":case"readonly_held_selector_family":n=t.families.get(o.key);break;case"timeline":n=t.timelines.get(o.key);break;case"transaction":n=t.transactions.get(o.key);break}if(n)return n;t=t.child}throw new z(o,e)}var je=(e,o)=>{let n=a(e);if(n.operation.open)return n.operation.prev.get(o.key);return n.valueMap.get(o.key)};var me=(e,o)=>{let n=a(e);return We(o,e).map((r)=>{let i=n.atoms.get(r);if(i===void 0)throw new Error(`Atom "${r}", a dependency of selector "${o.key}", not found in store "${e.config.name}".`);return i.subject.subscribe(`${o.type}:${o.key}`,(l)=>{e.logger.info("\uD83D\uDCE2",o.type,o.key,"root",r,"went",l.oldValue,"->",l.newValue);let c=je(n,o),T=W(n,o);e.logger.info("\u2728",o.type,o.key,"went",c,"->",T),o.subject.next({newValue:T,oldValue:c})})})};function G(e,o,n,t){function r(s){if(e.operation.open){let p=e.on.operationClose.subscribe(`state subscription ${n}`,()=>{p(),t(s)})}else t(s)}let i=K(e,o);e.logger.info("\uD83D\uDC40",i.type,i.key,`Adding subscription "${n}"`);let l=i.type==="writable_pure_selector"||i.type==="readonly_pure_selector",c=null,T=r;if(l)c=me(e,i),T=(s)=>{if(c)c.length=0,c.push(...me(e,i));r(s)};let m=i.subject.subscribe(n,T);return()=>{if(e.logger.info("\uD83D\uDE48",i.type,i.key,`Removing subscription "${n}"`),m(),c)for(let s of c)s()}}var $e=(e,o,n,t)=>{let r=K(e,o);e.logger.info("\uD83D\uDC40","timeline",o.key,`Adding subscription "${n}"`);let i=r.subject.subscribe(n,t);return()=>{e.logger.info("\uD83D\uDE48","timeline",o.key,`Removing subscription "${n}" from timeline`),i()}};class se{initializeState(e,o){let n=`*${e.key}`;o.atoms.delete(n),o.valueMap.delete(n);let t=e.family?{key:`*${e.family.key}`,subKey:e.family.subKey}:void 0,r=ye(o,{key:n,default:null},t);if(o.parent?.valueMap.has(n)){let i=o.parent.valueMap.get(n);o.valueMap.set(n,i)}return r}unsubscribeFromInnerValue;unsubscribeFromState;observeCore(e,o,n){let t=`tracker:${n.config.name}:${F(n)?n.transactionMeta.update.key:"main"}:${e.key}`,r=B(n,e);this.unsubscribeFromInnerValue=r.subscribe(t,(i)=>{h(n,o,i)}),this.unsubscribeFromState=G(n,e,t,(i)=>{if(i.newValue!==i.oldValue)this.unsubscribeFromInnerValue(),this.unsubscribeFromInnerValue=i.newValue.subscribe(t,(l)=>{h(n,o,l)})})}updateCore(e,o,n){let t=`tracker:${n.config.name}:${F(n)?n.transactionMeta.update.key:"main"}:${e.key}`;G(n,o,t,({newValue:r,oldValue:i})=>{let l=n.timelineTopics.getRelatedKey(o.key);if(l){if(n.timelines.get(l)?.timeTraveling){let m=$e(n,{key:l,type:"timeline"},t,(y)=>{m(),h(n,e,(s)=>{if(y==="redo"&&r)s.do(r);else if(y==="undo"&&i)s.undo(i);return s})});return}}let c=n.on.operationClose.subscribe(t,()=>{c();let T=B(n,e),m=r===null?-1:T.getUpdateNumber(r),y=m-T.cacheUpdateNumber;if(r&&y===1)h(n,e,(s)=>(s.do(r),s));else n.logger.info("\u274C","mutable_atom",e.key,`could not be updated. Expected update number ${T.cacheUpdateNumber+1}, but got ${m}`)})})}mutableState;latestUpdateState;[Symbol.dispose];constructor(e,o){this.mutableState=e;let n=a(o);this.latestUpdateState=this.initializeState(e,n),this.observeCore(e,this.latestUpdateState,n),this.updateCore(e,this.latestUpdateState,n),n.trackers.set(e.key,this),this[Symbol.dispose]=()=>{this.unsubscribeFromInnerValue(),this.unsubscribeFromState(),n.trackers.delete(e.key)}}}var H=(e,o)=>{if(o.family){let t=a(e),i={key:`${o.family.key}:JSON`,type:"writable_pure_selector_family"},l=K(t,i),c=JSON.parse(o.family.subKey);return w(e,l,c)}return{type:"writable_pure_selector",key:`${o.key}:JSON`}};var He=(e)=>{let n={type:"atom",key:`*${e.key}`};if(e.family)n.family={key:`*${e.family.key}`,subKey:e.family.subKey};return n};function _e(e){return typeof e==="object"&&e!==null&&"do"in e&&"undo"in e&&"subscribe"in e}function D(e,o,n){let t=n.valueMap.get(o.key),r=e.valueMap.get(o.key);if(t!==r)return r;if(t===void 0)return o.default();n.logger.info("\uD83D\uDCC3","atom",o.key,"copying");let i=o.toJson(t),l=o.fromJson(i);return e.valueMap.set(o.key,l),new se(o,n),l}function d(e,o,n,t){let r=e.valueMap.get(o);if(r instanceof j)r.use(n);if(n instanceof Promise){let i=new j(n);return e.valueMap.set(o,i),i.then((l)=>{d(e,o,l,t),t.next({newValue:l,oldValue:i})}).catch((l)=>{e.logger.error("\uD83D\uDCA5","state",o,"rejected:",l)}),i}return e.valueMap.set(o,n),n}var de=(e,o)=>{let n=o.valueMap.get(e.key);if(e.type==="mutable_atom"&&F(o)){let{parent:t}=o;n=D(o,e,t)}return n},we=(e,o)=>{let n=o.valueMap.get(e);if(n instanceof j){let t=n,r=o.writableSelectors.get(e)??o.readonlySelectors.get(e);if(r)t.use(r.get());return}if(o.operation.open)o.operation.prev.set(e,n);o.valueMap.delete(e),o.logger.info("\uD83D\uDDD1","state",e,"evicted")};var Re=(e,o)=>{return a(e).atomsThatAreDefault.has(o)},Ee=(e,o)=>{let n=a(e);n.atomsThatAreDefault=new Set(n.atomsThatAreDefault).add(o)},Me=(e,o)=>{let n=a(e);n.atomsThatAreDefault=new Set(a(e).atomsThatAreDefault),n.atomsThatAreDefault.delete(o)};function ye(e,o,n){let{key:r,default:i}=o;e.logger.info("\uD83D\uDD28","atom",r,`creating in store "${e.config.name}"`);let l=a(e),c=l.atoms.get(r);if(c&&c.type==="atom")return e.logger.error("\u274C","atom",r,"Tried to create atom, but it already exists in the store."),E(c);let T=new f,m={...o,type:"atom",install:(p)=>{return p.logger.info("\uD83D\uDEE0\uFE0F","atom",r,`installing in store "${p.config.name}"`),ye(p,o,n)},subject:T};if(n)m.family=n;let y=i;if(i instanceof Function)y=i();l.atoms.set(r,m),Ee(e,r),d(l,r,y,T);let s=E(m);if(o.effects){let p=0,b=[];for(let k of o.effects){let S=k({setSelf:(J)=>{h(e,s,J)},onSet:(J)=>G(e,s,`effect[${p}]`,J)});if(S)b.push(S);++p}m.cleanup=()=>{for(let k of b)k()}}return s}class O extends Set{mode="record";subject=new f;cacheLimit=0;cache=[];cacheIdx=-1;cacheUpdateNumber=-1;constructor(e,o=0){super(e);if(e instanceof O)this.parent=e,this.cacheUpdateNumber=e.cacheUpdateNumber;if(o)this.cacheLimit=o,this.cache=new Array(o),this.subscribe("auto cache",(n)=>{this.cacheIdx++,this.cacheIdx%=this.cacheLimit,this.cache[this.cacheIdx]=n})}toJSON(){return{members:[...this],cache:this.cache,cacheLimit:this.cacheLimit,cacheIdx:this.cacheIdx,cacheUpdateNumber:this.cacheUpdateNumber}}static fromJSON(e){let o=new O(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:${u(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:${u(e)}`);return o}parent=null;child=null;transactionUpdates=null;transaction(e){this.mode="transaction",this.transactionUpdates=[],this.child=new O(this);let o=this.child._subscribe("transaction",(n)=>{this.transactionUpdates?.push(n)});try{if(e(this.child)){for(let t of this.transactionUpdates)this.doStep(t);this.cacheUpdateNumber++,this.emit(`tx:${this.transactionUpdates.join(";")}`)}}catch(n){throw console.warn("Did not apply transaction to SetRTX; this error was thrown:",n),n}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,(n)=>{o(`${this.cacheUpdateNumber}=${n}`)})}emit(e){this.subject.next(e)}doStep(e){let o=e.indexOf(":"),n=e.substring(0,o),t=e.substring(o+1);switch(n){case"add":this.add(JSON.parse(t));break;case"clear":this.clear();break;case"del":this.delete(JSON.parse(t));break;case"tx":for(let r of t.split(";"))this.doStep(r)}}getUpdateNumber(e){let o=e.indexOf("=");return Number(e.substring(0,o))}do(e){let o=e.indexOf("="),n=Number(e.substring(0,o)),t=n-this.cacheUpdateNumber;if(t>0){if(t===1){this.mode="playback";let i=e.substring(o+1);return this.doStep(i),this.mode="record",this.cacheUpdateNumber=n,null}return this.cacheUpdateNumber+1}if(Math.abs(t)<this.cacheLimit){let i=this.cacheIdx+t;if(this.cache[i]===e)return null;this.mode="playback";let c=!1;while(!c){this.cacheIdx%=this.cacheLimit;let m=this.cache[this.cacheIdx];if(this.cacheIdx--,!m)return"OUT_OF_RANGE";this.undo(m),c=this.cacheIdx===i-1}let T=e.substring(o+1);return this.doStep(T),this.mode="record",this.cacheUpdateNumber=n,null}return"OUT_OF_RANGE"}undoStep(e){let o=e.indexOf(":"),n=e.substring(0,o),t=e.substring(o+1);switch(n){case"add":this.delete(JSON.parse(t));break;case"del":this.add(JSON.parse(t));break;case"clear":{let r=JSON.parse(t);for(let i of r)this.add(i);break}case"tx":{let r=t.split(";");for(let i=r.length-1;i>=0;i--)this.undoStep(r[i])}}}undo(e){let o=e.indexOf("=");if(Number(e.substring(0,o))===this.cacheUpdateNumber){this.mode="playback";let t=e.substring(o+1);return this.undoStep(t),this.mode="record",this.cacheUpdateNumber--,null}return this.cacheUpdateNumber}}function Oe(e){return e.startsWith("\uD83D\uDD0D ")}class U{listeners;globalListeners;handleEvent(e,...o){for(let t of this.globalListeners)t(e,...o);let n=this.listeners.get(e);if(n)for(let t of n)t(...o)}id="no_id_retrieved";emit;constructor(e){this.emit=e,this.listeners=new Map,this.globalListeners=new Set}on(e,o){let n=this.listeners.get(e);if(n)n.add(o);else this.listeners.set(e,new Set([o]));return this}onAny(e){return this.globalListeners.add(e),this}off(e,o){let n=this.listeners.get(e);if(n)if(o)n.delete(o);else this.listeners.delete(e);return this}offAny(e){return this.globalListeners.delete(e),this}}class ze extends U{in;out;id="no_id_retrieved";disposalFunctions=[];constructor(e){super((...o)=>{return this.out.next(o),this});this.id=e,this.in=new f,this.out=new f,this.in.subscribe("socket",(o)=>{this.handleEvent(...o)})}dispose(){for(let e of this.disposalFunctions)e()}}class fe extends U{incompleteData="";unprocessedEvents=[];relays;relayServices;process;id="#####";log(...e){this.process.stderr.write(u(e.map((o)=>o instanceof O?`{ ${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 n=JSON.stringify([e,...o]);return this.process.stdout.write(n+"\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 n=this.unprocessedEvents.shift();this.incompleteData+=n??"";try{let t=$(this.incompleteData);this.logger.info("\uD83C\uDFB0","received",t),this.handleEvent(...t);while(this.unprocessedEvents.length>0){let r=this.unprocessedEvents.shift();if(r){if(this.unprocessedEvents.length===0)this.incompleteData=r;let i=$(r);this.handleEvent(...i)}}this.incompleteData=""}catch(t){if(t instanceof Error)this.logger.error("\u2757",t.message,t.cause,t.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 ze(`user:${e}`);this.relays.set(e,o),this.logger.info("\uD83D\uDD17","attaching services:",`[${[...this.relayServices.keys()].join(", ")}]`);for(let n of this.relayServices){let t=n(o);if(t)o.disposalFunctions.push(t)}this.on(`user:${e}`,(...n)=>{o.in.next(n)}),o.out.subscribe("socket",(n)=>{this.emit(...n)})}),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 q=new fe;Object.assign(console,q.logger,{log:q.logger.info});q.on("timeToStop",function e(){q.logger.info("\uD83D\uDEEC game worker exiting"),process.exit(0)});q.logger.info("\uD83D\uDEEB game worker ready");