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