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