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