tempest.games 0.1.11 → 0.1.13
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/bin/backend.bun.js +10 -10
- package/bin/backend.worker.game.bun.js +1 -1
- package/bin/backend.worker.tribunal.bun.js +3 -3
- package/bin/frontend.bun.js +5 -5
- package/bin/setup-db.bun.js +50 -50
- package/package.json +5 -5
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
#!/usr/bin/env bun
|
|
2
2
|
// @bun
|
|
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");
|
|
3
|
+
var So=Object.create;var{getPrototypeOf:ko,defineProperty:Le,getOwnPropertyNames:bo}=Object;var go=Object.prototype.hasOwnProperty;var Oo=(e,t,o)=>{o=e!=null?So(ko(e)):{};let n=t||!e||!e.__esModule?Le(o,"default",{value:e,enumerable:!0}):o;for(let i of bo(e))if(!go.call(n,i))Le(n,i,{get:()=>e[i],enumerable:!0});return n};var wo=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Bo=(e,t)=>{for(var o in t)Le(e,o,{get:t[o],enumerable:!0,configurable:!0,set:(n)=>t[o]=()=>n})};function pe(e=Math.random){return e().toString(36).slice(2)}class xe 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 Io(e){return Object.entries(e)}var Ct=(e,t,o=$.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 y(e){while(e.child!==null)e=e.child;return e}function Kt(e){while(e.parent!==null)e=e.parent;return e}class A{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 Qe extends A{state;constructor(e){super();this.state=e}next(e){this.state=e,super.next(e)}}function re(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 A,c=Object.assign((l)=>{let s=S(l),m={key:t.key,subKey:s},p=`${t.key}(${s})`,u=y(e),x=t.default,R={key:p,default:x instanceof Function?x(l):x};if(t.effects)R.effects=t.effects(l);let v=ae(u,R,m);return r.next({type:"state_creation",token:v}),v},n,{subject:r,install:(l)=>re(l,t),internalRoles:o});return e.families.set(t.key,c),e.defaults.set(t.key,t.default),n}function Jt(e,t){if("mutable"in t)return Me(e,t);return re(e,t)}function le(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 A,c=Object.assign((l)=>{let s=S(l),m={key:t.key,subKey:s},p=`${t.key}(${s})`,u=y(e),x=Fe(u,{key:p,get:t.get(l)},m);return r.next({type:"state_creation",token:x}),x},n,{internalRoles:o,subject:r,install:(l)=>le(l,t),default:(l)=>{return t.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(t.key,c),n}function Ze(e,t){if("set"in t)return Re(e,t);return le(e,t)}var xo={atom_family:"atom",mutable_atom_family:"mutable_atom",selector_family:"selector",readonly_selector_family:"readonly_selector",molecule_family:"molecule"};function Te(e,t){let o=S(t),n=`${e.key}(${o})`,i=xo[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 Q(e){let t={key:e.key,type:e.type};if("family"in e)t.family=e.family;return t}var Tn=Symbol("provenance");function Ge(e,t,o){let n=S(o);try{let i=[],r;if(t==="root")i.push(e.molecules.get('"root"')),r="all";else if(typeof t==="string"&&t.startsWith(Ao)){r="any";let m=S(t),p=e.molecules.get(m);if(!p)throw new Error(`Molecule ${m} not found in store "${e.config.name}"`);i.push(p)}else if(o.startsWith("T$--")){r="all";for(let p of t){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(t),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,o);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:t},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 o}function Ce(e,t){let o=S(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 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 Ao="T$";function ue(e){return ht($.STORE,e)}function ye(e){return Jt($.STORE,e)}var et=(e)=>(t,o,n,i,...r)=>{console[e](`${t} ${o} "${n}" ${i}`,...r)},Mo={error:et("error"),info:et("info"),warn:et("warn")};class tt{e;t;o;constructor(e,t,o=Mo){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 Ze($.STORE,e)}function Ke(e){return ot(e,$.STORE)}class q{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 c of i)r??=c,a??=c,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),c=t[r];this.setContent(a,c)}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)}}function P(e){return"epoch"in e.transactionMeta}function C(e){return"phase"in e.transactionMeta}var $t=(e)=>{let t=y(e);if(!C(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 Fo=(e)=>e[0].toUpperCase()+e.slice(1);function ee(e){return e.type.split("_").map(Fo).join(" ")}class U extends Error{constructor(...e){let t=e[0],o=e.length===2?e[1]:e[2];if(e.length===2)super(`${ee(t)} ${S(t.key)} not found in store "${o.config.name}".`);else{let n=e[1];super(`${ee(t)} "${t.key}" member ${S(n)} not found in store "${o.config.name}".`)}}}function se(e,t,o){return(...n)=>{let i=g(e,o);if(i)return i.run(n,t);throw new U(e,o)}}var We=(e)=>(t)=>e instanceof Function?e(t):e;var ce=(e,t)=>{if(t.valueMap.has(e.key))return t.logger.info("\uD83D\uDCD6",e.type,e.key,"reading cached value"),Ot(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}"${!C(e)?"":` ${e.transactionMeta.phase} "${e.transactionMeta.update.key}"`}`)},Bt=(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)},Wt=(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 _t=(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=y(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(Wt(o,i))continue;jt(i,o),de(o,i)}}};function Ro(e,t){if(vt(t.newValue))return!1;if(e.includes("\uD83D\uDD0D"))return!1;return!0}var It=(e,t,o)=>{let{key:n}=e,i=y(o);if(!C(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(!Ro(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 Et=(e,t,o)=>{let n=ce(e,o),i=n;if(e.type==="mutable_atom"&&C(o)){let{parent:a}=o;i=Je(e,a,o)}if(i=We(t)(i),o.logger.info("\uD83D\uDCDD","atom",e.key,"set to",i),i=Z(e.key,i,e.subject,o),zt(e.key,o))Pt(e.key,o);de(o,e.key),nt(e,o);let r={oldValue:n,newValue:i};if(P(o))_t(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),c=o.atoms.get(a),l=o.valueMap.get(a);if(c.type==="mutable_atom"&&C(o)){let{parent:m}=o;l=Je(c,m,o)}if(l.do(r.newValue)===null)nt(c,o)}}};var _e=(e,t,o)=>{switch(e.type){case"atom":case"mutable_atom":Et(e,t,o);break;case"selector":e.set(t);break}};function je(e,t){if(t.family){let o=e.families.get(t.family.key);if(o)return o}}function I(e,...t){let o,n,i,r;if(t.length===2){if(o=t[0],r=t[1],n=je(e,o)??null,n)i=o.family?N(o.family.subKey):null,o=K(e,n,i)}else n=t[0],i=t[1],r=t[2],o=K(e,n,i);if("counterfeit"in o){let l=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}".`,l?`This state was previously disposed:\n${l.trace}`:"No previous disposal trace was found.");return}let a=wt(e,o);if(a){let l=e.on.operationClose.subscribe(`waiting to set "${o.key}" at T-${a}`,()=>{l(),e.logger.info("\uD83D\uDFE2",o.type,o.key,`resuming deferred setState from T-${a}`),I(e,o,r)});return}let c=g(o,e);_e(c,r,e),Bt(e)}function Ie(e,t,o){let{key:n,newValue:i,oldValue:r}=t,a=e==="newValue"?i:r,c={key:n,type:"atom"};if(t.family)Object.assign(c,{family:t.family});I(o,c,a)}function Nt(e,t){let o=new A,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=C(o)&&o.transactionMeta.phase==="building",r=o.moleculeInProgress===e.key;if(!i&&!r)e.subject.next({type:"state_creation",token:n});return n}function ve(e){return{store:e}}function O(e,...t){let o,n,i;if(t.length===1){if(o=t[0],o.type!=="molecule"){if(n=je(e,o)??null,n)i=o.family?N(o.family.subKey):null,o=K(e,n,i)}}else{n=t[0],i=t[1];let r;if(n.type==="molecule_family")r=W(e,n,i)??Te(n,i);else r=K(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((c)=>c?.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 c=g(n,e).default(r);return e.defaults.set(n.key,c),c}case"molecule_family":throw new U(n,r,e)}}switch(o.type){case"atom":case"mutable_atom":case"selector":case"readonly_selector":return ce(g(o,e),e);case"molecule":return g(o,e).instance}}class fe{t;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,t,o){this.key=t;if(this.stringKey=S(t),o)this.family=o,this._dependsOn=o.dependsOn;if(e)for(let n of e)this.above.set(n.stringKey,n)}}function Xt(e){return e[0].toUpperCase()+e.slice(1)}function ne(e,t,o,n,...i){let r=Kt(e),a=y(e),c=S(n);a.moleculeInProgress=c;let l=Array.isArray(t)?t:[t],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,o);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)=>{I(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:()=>ve(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=Ht(f,n),M=d[`${T}KeysOf${Xt(w)}`],F=d[`${T}EntriesOf${Xt(w)}`],k={relatedKeys:M};if(F)k=Object.assign(k,{relatedEntries:F});return k}return te(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(o,e),x=u.new;m.instance=new x(p,n,...i);let R={type:"molecule",key:n,family:o},v={type:"molecule_creation",subType:"classic",token:R,family:o,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 it(e,t,o){switch(t){case"newValue":{Dt(e,o);break}case"oldValue":{D(o,e.token);break}}}function rt(e,t,o){switch(t){case"newValue":{D(o,e.token);break}case"oldValue":{Dt(e,o),o.valueMap.set(e.token.key,e.value);break}}}function Dt(e,t){let{family:o}=e.token;if(o){let n=t.families.get(o.key);if(n)K(t,n,N(o.subKey))}}function at(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":D(o,e.token);break;case"modern":Ce(o,e.key);break}break}}function lt(e,t,o){switch(t){case"newValue":switch(e.subType){case"classic":D(o,e.token);break;case"modern":Ce(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}(${S(n.key)})`,c=g(n,o),l=c.tokens.has(a),s=o.families.get(i);if(s&&!l)te(c,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){K(o,r,e.key);let a=`${n}(${S(e.key)})`;o.valueMap.set(a,i)}}}}break}}function Ee(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":Ie(e,i,o);break;case"state_creation":it(i,e,o);break;case"state_disposal":rt(i,e,o);break;case"molecule_creation":at(i,e,o);break;case"molecule_disposal":lt(i,e,o);break;case"transaction_update":Ee(e,i,o);break}}function Ut(e,t,o){if(P(o)&&e)o.transactionMeta.epoch.set(e,t)}function Vt(e,t,o){if(!P(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=y(t),{parent:n}=o;if(n===null||!C(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),Ee("newValue",o.transactionMeta.update,n),P(n))Vt(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(C(n))n.transactionMeta.update.updates.push(o.transactionMeta.update);n.on.transactionApplying.next(null)};function Yt(e,t,o){if(!P(o))return;let{epoch:i,actionContinuities:r}=o.transactionMeta;if(r.set(e,t),!i.has(e))i.set(e,-1)}class G 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 Lt=(e,t,o,n)=>{let i=y(o),r={parent:i,child:null,on:i.on,loggers:i.loggers,logger:i.logger,config:i.config,atoms:new G(i.atoms),atomsThatAreDefault:new Set(i.atomsThatAreDefault),families:new G(i.families),operation:{open:!1},readonlySelectors:new G(i.readonlySelectors),timelines:new G(i.timelines),timelineTopics:new q(i.timelineTopics.toJSON()),trackers:new Map,transactions:new G(i.transactions),selectorAtoms:new q(i.selectorAtoms.toJSON()),selectorGraph:new q(i.selectorGraph.toJSON(),{makeContentKey:(...s)=>s.sort().join(":")}),selectors:new G(i.selectors),valueMap:new G(i.valueMap),defaults:i.defaults,disposalTraces:o.disposalTraces.copy(),molecules:new G(i.molecules),moleculeFamilies:new G(i.moleculeFamilies),moleculeInProgress:i.moleculeInProgress,miscResources:new G(i.miscResources)},a=Qt(e,o),c={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)=>O(l,...s),set:(...s)=>{I(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:()=>ve(l)}},l=Object.assign(r,{transactionMeta:c});return i.child=l,o.logger.info("\uD83D\uDEEB","transaction",e,"Building transaction with params:",t),l};function ot(e,t){let o={key:e.key,type:"transaction",run:(r,a)=>{let c=Lt(e.key,r,t,a);try{let l=y(t),{toolkit:s}=c.transactionMeta,m=e.do(s,...r);return qt(m,l),m}catch(l){throw $t(n),t.logger.warn("\uD83D\uDCA5","transaction",e.key,"caught:",l),l}},install:(r)=>ot(e,r),subject:new A},n=y(t);n.transactions.set(o.key,o);let i=Q(o);return t.on.transactionCreation.next(i),i}function Qt(e,t){let o=P(t),n=o?t.transactionMeta.actionContinuities.getRelatedKey(e):void 0;return o&&n!==void 0?t.transactionMeta.epoch.get(n):void 0}class ze{_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 ze([...this._buffer]);return e._index=this._index,e}}class Zt{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 ze(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 tt("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},P(t))this.transactionMeta={epoch:new Map(t?.transactionMeta.epoch),actionContinuities:new q(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=z(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 $={get STORE(){if(!globalThis.ATOM_IO_IMPLICIT_STORE)globalThis.ATOM_IO_IMPLICIT_STORE=new Zt({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(S(e.key));break;case"molecule_family":o=n.moleculeFamilies.get(e.key);break}if(o)return o;n=n.child}throw new U(e,t)}function Pe(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(Q(a));let r=[];for(let a of o.tokens.values()){let c=a.family;r.push([c.key,t.valueMap.get(a.key)])}if(n){let a=g(n,t),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 o.tokens.values())D(t,s);for(let s of o.below.values())if(s.dependsOn==="all")Pe(s,t);else if(s.above.delete(o.stringKey),s.above.size===0)Pe(s,t);if(o.below.clear(),C(t)&&t.transactionMeta.phase==="building")t.transactionMeta.update.updates.push(c);else a.subject.next(c);t.molecules.delete(o.stringKey)}for(let a of o.above.values())a.below.delete(o.stringKey)}function oe(e,t,o){let n=e.families.get(t.key);if(n===void 0)throw new U(t,e);let i=n(o),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,t,o){let n=S(o),i=`${t.key}(${n})`,r=y(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(S(o))}if(a)return Q(a);return a}function K(e,t,o){let n=W(e,t,o);if(n)return n;let i=e.molecules.get(S(o));if(i)return te(i,t,e);if(e.config.lifespan==="immortal"){let r=Te(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 D(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"?W(e,r,a)??Te(r,a):K(e,r,a)}try{g(o,e)}catch(r){let a=e.disposalTraces.buffer.find((c)=>c?.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":Gt(o,e);break;case"molecule":Pe(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})}}var Ne=(e,t)=>y(t).atoms.has(e),Co=(e,t)=>y(t).selectors.has(e),Ko=(e,t)=>y(t).readonlySelectors.has(e),eo=(e,t)=>Ne(e,t)||Co(e,t)||Ko(e,t);var Xe=(e,t)=>{return y(t).selectorGraph.getRelationEntries({downstreamSelectorKey:e}).filter(([n,{source:i}])=>i!==e).map(([n,{source:i}])=>i).filter((n)=>eo(n,t))};var ct=(e,t,o)=>{let n=[],i=Xe(e,o);while(i.length>0){let r=i.shift();if(t.has(r))continue;if(t.add(r),!Ne(r,o))i.push(...Xe(r,o));else if(!n.includes(r))n.push(r)}return n},to=(e,t)=>{let o=e.key,n=Xe(o,t),i=new Set;return n.flatMap((r)=>Ne(r,t)?r:ct(r,i,t))};var oo=(e,t,o,n)=>{let i=y(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=ct(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 He=(e,t,o)=>({get:(...n)=>{let i=y(o),r;if(n.length===2){let[l,s]=n;switch(l.type){case"molecule_family":return O(o,l,s);default:if(o.config.lifespan==="ephemeral")r=K(o,l,s);else{let m=W(o,l,s);if(m)r=m;else throw new U(l,s,o)}}}else[r]=n;if(r.type==="molecule")return O(o,r);let a=g(r,o),c=ce(a,o);return o.logger.info("\uD83D\uDD0C","selector",e,`registers dependency ( "${r.key}" =`,c,")"),i.selectorGraph.set({upstreamSelectorKey:r.key,downstreamSelectorKey:e},{source:r.key}),oo(e,r,t,o),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=o.config.lifespan==="ephemeral"?K(o,l,s):W(o,l,s);if(!m)throw new U(l,s,o);i=m}let a=y(o),c=g(i,a);_e(c,r,a)},find:(n,i)=>K(o,n,i),seek:(n,i)=>W(o,n,i),json:(n)=>z(o,n)});var Fe=(e,t,o)=>{let n=y(e),i=new A,r=new Set,{get:a,find:c,seek:l,json:s}=He(t.key,r,n),m=()=>{let R=t.get({get:a,find:c,seek:l,json:s});return Z(t.key,R,i,y(e)),r.clear(),R},p={...t,subject:i,install:(R)=>Fe(R,t,o),get:m,type:"readonly_selector",...o&&{family:o}};n.readonlySelectors.set(t.key,p);let u=m();e.logger.info("\u2728",p.type,p.key,"=",u);let x={key:t.key,type:"readonly_selector"};if(o)x.family=o;return x};var $e=(e,t,o)=>{let n=y(e),i=new A,r=new Set,a=He(t.key,r,n),{find:c,get:l,seek:s,json:m}=a,p={find:c,get:l,seek:s,json:m},u=(J=t.get,w=y(e))=>{let B=J(p);return Z(t.key,B,i,w),r.clear(),B},R={...t,subject:i,install:(J)=>$e(J,t,o),get:u,set:(J)=>{let w=y(e),B=u(t.get,w),V=We(J)(B);if(e.logger.info("\uD83D\uDCDD","selector",t.key,"set (",B,"->",V,")"),Z(t.key,V,i,w),de(w,t.key),P(w))i.next({newValue:V,oldValue:B});t.set(a,V)},type:"selector",...o&&{family:o}};n.selectors.set(t.key,R);let v=u();e.logger.info("\u2728",R.type,R.key,"=",v);let f={key:t.key,type:"selector"};if(o)f.family=o;return f};function Ae(e,t){if("set"in t){let i=$e(e,t,void 0);return e.on.selectorCreation.next(i),i}let n=Fe(e,t,void 0);return e.on.selectorCreation.next(n),n}function Gt(e,t){let o=y(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"),C(o)&&o.transactionMeta.phase==="building")o.transactionMeta.update.updates.push({type:"state_disposal",token:e});else t.on.selectorDisposal.next(e)}}function Re(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 A,c=Object.assign((l)=>{let s=S(l),m={key:t.key,subKey:s},p=`${t.key}(${s})`,u=y(e),x=$e(u,{key:p,get:t.get(l),set:t.set(l)},m);return r.next({type:"state_creation",token:x}),x},n,{internalRoles:o,subject:r,install:(l)=>Re(l,t),default:(l)=>{return t.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(t.key,c),n}function no(e,t,o=$.STORE){let n=Re(o,{key:`${e.key}:JSON`,get:(r)=>({seek:a,get:c})=>{let l=a(e,r);if(l)return t.toJson(c(l));let s=S(r),m=o.molecules.get(s);if(m){let u=te(m,e,o);return t.toJson(c(u))}if(o.config.lifespan==="immortal")throw new Error(`No molecule found for key "${s}"`);let p=oe(o,e,r);return t.toJson(c(p))},set:(r)=>({seek:a,set:c},l)=>{let s=a(e,r);if(s)c(s,t.fromJson(l));else{let m=S(r),p=o.molecules.get(m);if(p){let u=te(p,e,o);c(u,t.fromJson(l))}else{if(o.config.lifespan==="immortal")throw new Error(`No molecule found for key "${m}"`);c(oe(o,e,r),t.fromJson(l))}}}},["mutable","json"]);return g(e,o).subject.subscribe(`store=${o.config.name}::json-selector-family`,(r)=>{if(r.token.family)W(o,n,N(r.token.family.subKey))}),n}var N=(e)=>JSON.parse(e),S=(e)=>JSON.stringify(e),ys=[Array.prototype,Boolean.prototype,Number.prototype,Object.prototype,String.prototype];var io=(e,t)=>{let o=y(t);if(o.operation.open)return o.operation.prev.get(e.key);return o.valueMap.get(e.key)};var pt=(e,t)=>{let o=y(t);return to(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 c=io(e,o),l=ce(e,o);t.logger.info("\u2728",e.type,e.key,"went",c,"->",l),e.subject.next({newValue:l,oldValue:c})})})};function H(e,t,o,n){function i(p){if(n.operation.open){let u=n.on.operationClose.subscribe(`state subscription ${o}`,()=>{u(),t(p)})}else t(p)}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",c=null,l=i;if(a)c=pt(r,n),l=(p)=>{if(c)c.length=0,c.push(...pt(r,n));i(p)};let s=r.subject.subscribe(o,l);return()=>{if(n.logger.info("\uD83D\uDE48",r.type,r.key,`Removing subscription "${o}"`),s(),c)for(let p of c)p()}}var mt=(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 yt=(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 me{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=ae(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}:${C(o)?o.transactionMeta.update.key:"main"}:${e.key}`,i=O(o,e);this.unsubscribeFromInnerValue=i.subscribe(n,(r)=>{I(o,t,r)}),this.unsubscribeFromState=H(e,(r)=>{if(r.newValue!==r.oldValue)this.unsubscribeFromInnerValue(),this.unsubscribeFromInnerValue=r.newValue.subscribe(n,(a)=>{I(o,t,a)})},n,o)}updateCore(e,t,o){let n=`tracker:${o.config.name}:${C(o)?o.transactionMeta.update.key:"main"}:${e.key}`;H(t,({newValue:i,oldValue:r})=>{let a=o.timelineTopics.getRelatedKey(t.key);if(a){if(o.timelines.get(a)?.timeTraveling){let s=mt({key:a,type:"timeline"},(m)=>{s(),I(o,e,(p)=>{if(m==="redo"&&i)p.do(i);else if(m==="undo"&&r)p.undo(r);return p})},n,o);return}}let c=o.on.operationClose.subscribe(n,()=>{c();let l=O(o,e),s=i===null?-1:l.getUpdateNumber(i),m=s-l.cacheUpdateNumber;if(i&&m===1)I(o,e,(p)=>(p.do(i),p));else o.logger.info("\u274C","mutable_atom",e.key,`could not be updated. Expected update number ${l.cacheUpdateNumber+1}, but got ${s}`)})},n,o)}mutableState;latestUpdateState;dispose;constructor(e,t){this.mutableState=e;let o=y(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 Oe(e,t,o){e.logger.info("\uD83D\uDD28","atom",t.key,`creating in store "${e.config.name}"`);let n=y(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."),Q(i);let r=new A,a={...t,type:"mutable_atom",install:(s)=>{return s.logger.info("\uD83D\uDEE0\uFE0F","atom",t.key,`installing in store "${s.config.name}"`),Oe(s,t,o)},subject:r};if(o)a.family=o;let c=t.default();n.atoms.set(a.key,a),De(t.key,e),Z(t.key,c,r,n);let l=Q(a);if(t.effects){let s=0,m=[];for(let p of t.effects){let u=p({setSelf:(x)=>{I(e,l,x)},onSet:(x)=>H(l,x,`effect[${s}]`,e)});if(u)m.push(u);++s}a.cleanup=()=>{for(let p of m)p()}}if(new me(l,e),!o)Ct(l,t,e);return l}class Tt{Update;latestUpdateAtoms;mutableAtoms;constructor(e,t){let o=re(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);W(t,this.latestUpdateAtoms,i),new me(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=W(t,this.mutableAtoms,i);if(r)new me(r,t)}})}}function Me(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 A,c=Object.assign((l)=>{let s=S(l),m={key:t.key,subKey:s},p=`${t.key}(${s})`,u=y(e),x={key:p,default:()=>t.default(l),toJson:t.toJson,fromJson:t.fromJson,mutable:!0};if(t.effects)x.effects=t.effects(l);let R=Oe(u,x,m);return r.next({type:"state_creation",token:R}),R},n,{subject:r,install:(l)=>Me(l,t),toJson:t.toJson,fromJson:t.fromJson,internalRoles:o});return e.families.set(t.key,c),no(c,t,e),new Tt(c,e),n}var ft=(e,t)=>{let o=y(t),n=`${e.key}:JSON`;return o.families.get(n)};var z=(e,t)=>{if(t.family){let n=y(e),r={key:`${t.family.key}:JSON`,type:"selector_family"},a=g(r,n),c=JSON.parse(t.family.subKey);return K(e,a,c)}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 vt(e){return typeof e==="object"&&e!==null&&"do"in e&&"undo"in e&&"subscribe"in e}function Je(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 me(e,t),a}return i}function Z(e,t,o,n){let i=n.valueMap.get(e);if(i instanceof xe)i.use(t);if(t instanceof Promise){let r=new xe(t);return n.valueMap.set(e,r),r.then((a)=>{Z(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 Ot=(e,t)=>{let o=t.valueMap.get(e.key);if(e.type==="mutable_atom"&&C(t)){let{parent:n}=t;o=Je(e,n,t)}return o},jt=(e,t)=>{let o=t.valueMap.get(e);if(o instanceof xe){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 zt=(e,t)=>{return y(t).atomsThatAreDefault.has(e)},De=(e,t)=>{let o=y(t);o.atomsThatAreDefault=new Set(o.atomsThatAreDefault).add(e)},Pt=(e,t)=>{let o=y(t);o.atomsThatAreDefault=new Set(y(t).atomsThatAreDefault),o.atomsThatAreDefault.delete(e)};function ae(e,t,o){e.logger.info("\uD83D\uDD28","atom",t.key,`creating in store "${e.config.name}"`);let n=y(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."),Q(i);let r=new A,a={...t,type:"atom",install:(s)=>{return s.logger.info("\uD83D\uDEE0\uFE0F","atom",t.key,`installing in store "${s.config.name}"`),ae(s,t,o)},subject:r};if(o)a.family=o;let c=t.default;if(t.default instanceof Function)c=t.default();n.atoms.set(a.key,a),De(t.key,e),Z(t.key,c,r,n);let l=Q(a);if(t.effects){let s=0,m=[];for(let p of t.effects){let u=p({setSelf:(x)=>{I(e,l,x)},onSet:(x)=>H(l,x,`effect[${s}]`,e)});if(u)m.push(u);++s}a.cleanup=()=>{for(let p of m)p()}}return l}function ht(e,t){if("mutable"in t){let i=Oe(e,t,void 0);return e.on.atomCreation.next(i),i}let n=ae(e,t,void 0);return e.on.atomCreation.next(n),n}function st(e,t){let o=y(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 c=o.molecules.get(i.family.subKey);if(c)c.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 l=ie(e);st(l,t),t.trackers.delete(n)}if(t.logger.info("\uD83D\uDD25","atom",n,"deleted"),C(o)&&o.transactionMeta.phase==="building")o.transactionMeta.update.updates.push({type:"state_disposal",token:e});else t.on.atomDisposal.next(e)}}class X extends Set{mode="record";subject=new A;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:${S(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:${S(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 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(t+1);return this.doStep(l),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 _(e){return e[0].toUpperCase()+e.slice(1)}class dt{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 dt(this.options,this.defaultContent,e);return this.alternates.set(t,n),n.alternates=this.alternates,n}constructor(e,t,o=$.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=(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,o);return te(F,k,o)}if(o.config.lifespan==="immortal")throw new U(T,d,o);return oe(o,T,d)},this.toolkit={get:(...T)=>O(o,...T),set:(...T)=>{I(o,...T)},find:this.retrieve,seek:(...T)=>W(o,...T),json:(T)=>z(o,T),dispose:(...T)=>{D(o,...T)}};let n=e.between[0],i=e.between[1],r=Me(o,{key:`${e.key}/relatedKeys`,default:()=>new X,mutable:!0,fromJson:(T)=>X.fromJSON(T),toJson:(T)=>T.toJSON()},["join","relations"]);this.core={findRelatedKeysState:r};let a=({get:T},d)=>T(this.retrieve(r,d)),c=(T,d,M)=>{let{set:F}=T,k=this.retrieve(r,d),b=this.retrieve(r,M);F(k,(h)=>h.add(M)),F(b,(h)=>h.add(d))},l=(T,d,M)=>{let{set:F}=T,k=this.retrieve(r,d),b=this.retrieve(r,M),h,j;F(k,(E)=>{if(E.delete(M),E.size===0)h=`"${d}"`;return E}),F(b,(E)=>{if(E.delete(d),E.size===0)j=`"${M}"`;return E})},s=(T,d,M)=>{let{get:F,set:k}=T,b=this.retrieve(r,d),h=F(b);for(let j of h){if(M.includes(j))continue;let Y=this.retrieve(r,j);k(Y,(L)=>{return L.delete(d),L})}k(b,(j)=>{return j.transaction((E)=>{E.clear();for(let Y of M){let L=a(T,Y),Ft=L.has(d);if(this.relations.cardinality==="1:n"){let Rt=[];for(let be of L){if(be===d)continue;let ge=a(T,be);if(ge.delete(Y),ge.size===0)Rt.push(be)}if(!Ft&&L.size>0)L.clear();for(let be of Rt){let ge=[Y,be].sort(),uo=`"${ge[0]}:${ge[1]}"`;this.molecules.delete(uo)}}if(!Ft)L.add(d);E.add(Y)}return!0}),j})},m=(T,d,M)=>{let{set:F}=T,k=this.retrieve(r,d);F(k,(b)=>{return b.transaction((h)=>{for(let j of M)h.add(j);return!0}),b});for(let b of M){let h=this.retrieve(r,b);F(h,(j)=>{return j.add(d),j})}return!0},p=(T,d,M)=>{let F=a(T,d);return M?F.has(M):F.size>0},u={getRelatedKeys:(T)=>a(this.toolkit,T),addRelation:(T,d)=>{c(this.toolkit,T,d)},deleteRelation:(T,d)=>{l(this.toolkit,T,d)},replaceRelationsSafely:(T,d)=>{s(this.toolkit,T,d)},replaceRelationsUnsafely:(T,d)=>{m(this.toolkit,T,d)},has:(T,d)=>p(this.toolkit,T,d)},x,R,v;if(t){R=re(o,{key:`${e.key}/content`,default:t},["join","content"]),v=Nt(o,{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=o.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(o.config.lifespan==="immortal"&&F&&k){let b=y(o),h=ne(b,[F,k],v,M);this.molecules.set(`"${M}"`,g(h,b))}return M}}),J=()=>le(o,{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(o,{key:`${e.key}/multipleRelatedKeys`,get:(T)=>({get:d})=>{let M=ft(r,o),F=this.retrieve(M,T);return d(F).members}},["join","keys"])},B=()=>le(o,{key:`${e.key}/singleRelatedEntry`,get:(T)=>({get:d})=>{let M=this.retrieve(r,T),F=d(M);for(let k of F){let b=f.isAType?.(T)?T:void 0,h=b===void 0?T:void 0;b??=k,h??=k;let j=f.makeContentKey(b,h),E=this.retrieve(R,j),Y=d(E);return[k,Y]}return null}},["join","entries"]),V=()=>le(o,{key:`${e.key}/multipleRelatedEntries`,get:(T)=>({get:d})=>{let M=ft(r,o),F=this.retrieve(M,T);return d(F).members.map((b)=>{let h=f.isAType?.(T)?T:void 0,j=h===void 0?T:void 0;h??=b,j??=b;let E=f.makeContentKey(h,j),Y=this.retrieve(R,E),L=d(Y);return[b,L]})}},["join","entries"]);switch(e.cardinality){case"1:1":{let T=J(),d=`${n}KeyOf${_(i)}`,M=`${i}KeyOf${_(n)}`,F={[d]:T,[M]:T},k;if(t){let b=B(),h=`${n}EntryOf${_(i)}`,j=`${i}EntryOf${_(n)}`,E={[h]:b,[j]:b};k=Object.assign(F,E)}else k=F;this.relations=f,this.states=k;break}case"1:n":{let T=J(),d=w(),M=`${n}KeyOf${_(i)}`,F=`${i}KeysOf${_(n)}`,k={[M]:T,[F]:d},b;if(t){let h=B(),j=V(),E=`${n}EntryOf${_(i)}`,Y=`${i}EntriesOf${_(n)}`,L={[E]:h,[Y]:j};b=Object.assign(k,L)}else b=k;this.relations=f,this.states=b;break}default:{let T=w(),d=`${n}KeysOf${_(i)}`,M=`${i}KeysOf${_(n)}`,F={[d]:T,[M]:T},k;if(t){let b=V(),h=`${n}EntriesOf${_(i)}`,j=`${i}EntriesOf${_(n)}`,E={[h]:b,[j]:b};k=Object.assign(F,E)}else k=F;this.relations=f,this.states=k}}}}function Ue(e,t,o=$.STORE){return ut(o).set(e.key,new dt(e,t,o)),{key:e.key,type:"join",a:e.between[0],b:e.between[1],cardinality:e.cardinality}}function ut(e){if("joins"in e&&e.joins instanceof Map)return e.joins;let t=new Map;return e.joins=t,t}function he(e,t){let o=ut(t),n=o.get(e.key);if(n===void 0){if(n=ut($.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 Ve(e,t,o){let n=he(e,o),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,t)},get[a](){let l=n.states[a];return n.retrieve(l,t)}};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,t)},get[l](){let s=n.states[l];return n.retrieve(s,t)}})}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,t)},get[a](){let l=n.states[a];return n.retrieve(l,t)}};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,t)},get[l](){let s=n.states[l];return n.retrieve(s,t)}})}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,t)},get[a](){let l=n.states[a];return n.retrieve(l,t)}};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,t)},get[l](){let s=n.states[l];return n.retrieve(s,t)}})}}}return i}function Ht(e,t){return Ve(e,t,$.STORE)}function qe(e,t,o){let n=he(e,o),i=y(o);if(C(i)){let{toolkit:r}=i.transactionMeta;n.transact(r,({relations:a})=>{t(a)})}else t(n.relations)}function Jo(e,t){return he(e,t).core.findRelatedKeysState}function ro(e){return Jo(e,$.STORE)}class ao 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 ao;static create(e,t){let o=new Ye(e),{type:n,globals:i,actions:r,perspectives:a}=t(o),c={type:n,key:e,globals:i,actions:r,perspectives:a};return Ye.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[o,n]=e;this.perspectives.push({type:"realtime_perspective",resourceAtoms:o,viewAtoms:n})}break}return this}}function cy(e){let{key:t,config:o}=e,n=Ye.create(t,o),{actions:i}=n;for(let r of i)Yt(t,r.key,$.STORE);return Ut(t,-1,$.STORE),n}var fy=ue({key:"usersInRoomIndex",mutable:!0,default:()=>new X,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),St=ue({key:"roomIndex",default:()=>new X,mutable:!0,toJson:(e)=>e.toJSON(),fromJson:(e)=>X.fromJSON(e)}),ho={enteredAtEpoch:0},we=Ue({key:"usersInRooms",between:["room","user"],cardinality:"1:n",isAType:(e)=>typeof e==="string",isBType:(e)=>typeof e==="string"},ho),uy=Be({key:"usersInMyRoomView",get:(e)=>({find:t})=>{let o=ro(we);return[t(o,e)]}});import{spawn as $o}from"child_process";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 kt 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=(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=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 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 lo 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 A,this.out=new A,this.in.subscribe("socket",(t)=>{this.handleEvent(...t)})}dispose(){for(let e of this.disposalFunctions)e()}}class bt extends Se{incompleteData="";unprocessedEvents=[];relays;relayServices;process;id="#####";log(...e){this.process.stderr.write(S(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 lo(`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)}}var gt=ye({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,c=await new Promise((l)=>{let s=$o(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 kt(c,e)}});var Xy=Ke({key:"createRoom",do:({get:e,set:t,find:o},n,i,r)=>{let a=r?[i,r]:[i],c=o(gt,n);t(c,a),t(St,(m)=>m.add(n));let l=o(so,n);return e(l)}}),Hy=Ke({key:"joinRoom",do:(e,t,o,n)=>{let i={enteredAtEpoch:n};return qe(we,(r)=>{r.set({room:t,user:o},i)},e.env().store),i}}),Dy=Ke({key:"leaveRoom",do:(e,t,o)=>{qe(we,(n)=>{n.delete({room:t,user:o})},e.env().store)}}),Uy=Ke({key:"destroyRoom",do:(e,t)=>{qe(we,(o)=>{o.delete({room:t})},e.env().store),e.set(St,(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 Yy=ye({key:"redactor",default:{occlude:(e)=>e}}),ke=ye({key:"unacknowledgedUpdates",default:()=>[]});var co=ye({key:"sockets",default:null}),ep=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)}),At=Ue({key:"usersOfSockets",between:["user","socket"],cardinality:"1:1",isAType:(e)=>e.startsWith("user::"),isBType:(e)=>e.startsWith("socket::")});function mo(e,t,o,n){let i=t.key;return function r(){let a=[];for(let l of t.globals){let s=l.type==="mutable_atom"?z(e,l):l,m=O(e,s);a.push(s,m)}for(let l of t.perspectives){let{viewAtoms:s,resourceAtoms:m}=l,p=K(e,s,o),u=O(e,p);e.logger.info("\uD83D\uDC41","atom",m.key,`${o} 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 yo(e,t,o){let n=t.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 ${o} with update ${c}`,u.message)}performance.mark(m);let p=performance.measure(l,s,m);e?.logger.info("\uD83D\uDE80","transaction",a,c,o,p.duration)}}function po(e,t,o,n){let i=t.key;return function r(a){if(e.logger.info("\uD83D\uDC4D","continuity",i,`${o} acknowledged epoch ${a}`),n[0]?.epoch===a)I(e,ke,o,(l)=>{return l.shift(),e.logger.info("\uD83D\uDC4D","continuity",i,`${o} unacknowledged update queue now has`,l.length,"items"),l})}}function To(e,t,o,n){let i=t.key,r=[];for(let a of t.actions){let c=yt(a,(l)=>{try{let s=t.globals.map((u)=>{if(u.type==="atom")return u.key;return ie(u).key}).concat(t.perspectives.flatMap((u)=>{let{viewAtoms:x}=u,R=K(e,x,o);return O(e,R).map((f)=>{return f.type==="mutable_atom"?"*"+f.key:f.key})})),m=xt(s,l.updates),p={...l,updates:m};I(e,ke,o,(u)=>{if(p)u.push(p),u.sort((x,R)=>x.epoch-R.epoch),e.logger.info("\uD83D\uDC4D","continuity",i,`${o} 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,`${o} failed to send update from transaction ${a.key} to ${o}`,s.message)}},`sync-continuity:${i}:${o}`,e);r.push(c)}return r}function fo(e,t,o,n){let i=t.key,r=[];for(let a of t.perspectives){let{viewAtoms:c}=a,l=K(e,c,o),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,`${o} 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}:${o}:perspective:${a.resourceAtoms.key}`,e);r.push(s)}return r}function Op({socket:e,store:t=$.STORE}){return function o(n){let i=e,r=n.key,a=Ve(At,`socket::${i.id}`,t).userKeyOfSocket,c=O(t,a);if(!c)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 l=Ve(At,c,t).socketKeyOfUser,s=H(l,({newValue:J})=>{if(t.logger.info("\uD83D\uDC4B","continuity",r,`seeing ${c} on new socket ${J}`),J===null){t.logger.warn("\u274C","continuity",r,`User (${c}) is not connected to a socket, waiting for them to reappear.`);return}let w=K(t,co,J);i=O(t,w);for(let V of m)i?.emit(`tx-new:${r}`,V)},`sync-continuity:${r}:${c}`,t),m=O(t,ke,c),p=[],u=fo(t,n,c,i),x=To(t,n,c,i);p.push(...u,...x);let R=mo(t,n,c,e);i.off(`get:${r}`,R),i.on(`get:${r}`,R);let v=yo(t,n,c);i.off(`tx-run:${r}`,v),i.on(`tx-run:${r}`,v);let f=po(t,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 Mt=new bt;Mt.on("timeToStop",function e(){Mt.logger.info("\uD83D\uDEEC frontend server exiting"),process.exit(0)});Mt.logger.info("\uD83D\uDEEB game worker ready");
|