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