@virid/core 0.2.3 → 0.3.0
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/dist/index.cjs +11 -23
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +122 -128
- package/dist/index.d.ts +122 -128
- package/dist/index.js +11 -23
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -1,29 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @virid/core v0.
|
|
2
|
+
* @virid/core v0.3.0
|
|
3
3
|
* A lightweight and powerful message core built using dependency injection and CCS concepts
|
|
4
4
|
*/
|
|
5
|
-
var
|
|
5
|
+
var N=Object.defineProperty;var ge=Object.getOwnPropertyDescriptor;var me=Object.getOwnPropertyNames;var ue=Object.prototype.hasOwnProperty;var ye=(r,e,t)=>e in r?N(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t;var i=(r,e)=>N(r,"name",{value:e,configurable:!0});var xe=(r,e)=>{for(var t in e)N(r,t,{get:e[t],enumerable:!0})},we=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of me(e))!ue.call(r,o)&&o!==t&&N(r,o,{get:()=>e[o],enumerable:!(s=ge(e,o))||s.enumerable});return r};var be=r=>we(N({},"__esModule",{value:!0}),r);var a=(r,e,t)=>ye(r,typeof e!="symbol"?e+"":e,t);var Se={};xe(Se,{BaseMessage:()=>x,Component:()=>ae,Controller:()=>$e,ErrorMessage:()=>M,EventMessage:()=>C,InfoMessage:()=>$,MessageEngine:()=>V,MessageRegistry:()=>D,MessageWriter:()=>d,Observer:()=>ve,Safe:()=>Me,SingleMessage:()=>A,System:()=>_,VIRID_METADATA:()=>y,ViridApp:()=>R,WarnMessage:()=>v,activateInstance:()=>Y,bindObservers:()=>B,createVirid:()=>Ae,defaultConfig:()=>j,handleResult:()=>S});module.exports=be(Se);var j={maxDepth:100,enableLog:!0,manual:!1};var J=null;function Y(r){J=r}i(Y,"activateInstance");function ke(r){J?J.dispatch(r):console.error("[Virid MessageWriter] No active instance found.")}i(ke,"dispatch");var q=class q{static write(e,...t){let s=typeof e=="function"?new e(...t):e;ke(s)}static error(e,t=""){this.write(new M(e,t))}static warn(e){this.write(new v(e))}static info(e){this.write(new $(e))}};i(q,"MessageWriter");var d=q;var K=class K{static send(...e){d.write(this,...e)}};i(K,"BaseMessage");var x=K,Q=class Q extends x{constructor(){super()}};i(Q,"SingleMessage");var A=Q,X=class X extends x{constructor(){super()}};i(X,"EventMessage");var C=X,Z=class Z extends C{constructor(t,s){super();a(this,"error");a(this,"context");this.error=t,this.context=s}};i(Z,"ErrorMessage");var M=Z,ee=class ee extends C{constructor(t){super();a(this,"context");this.context=t}};i(ee,"WarnMessage");var v=ee,te=class te extends C{constructor(t){super();a(this,"context");this.context=t}};i(te,"InfoMessage");var $=te;var se=class se{constructor(){a(this,"systemTaskMap",new Map)}register(e,t,s=0){let o=this.systemTaskMap.get(e)||[];if(o.findIndex(c=>c.fn.systemContext.originalMethod===t.systemContext.originalMethod)===-1)o.push({fn:t,priority:s}),o.sort((c,l)=>l.priority-c.priority),this.systemTaskMap.set(e,o);else{let c=t.methodName,l=t.targetClass;return d.error(new Error(`[Virid Error] System Already Registered: Message Class ${e.name}, Location ${l.name}.${c}`)),()=>{}}return()=>{let c=this.systemTaskMap.get(e);if(c){let l=c.findIndex(m=>m.fn===t);l!==-1&&(c.splice(l,1),c.length===0&&this.systemTaskMap.delete(e))}}}};i(se,"MessageRegistry");var D=se;var re=class re{constructor(){a(this,"signalActive",new Map);a(this,"eventActive",[]);a(this,"signalStaging",new Map);a(this,"eventStaging",[])}stage(e){if(e instanceof A){let t=e.constructor;this.signalStaging.has(t)||this.signalStaging.set(t,[]),this.signalStaging.get(t).push(e)}else e instanceof C?this.eventStaging.push(e):d.error(new Error(`[Virid Message] Invalid Message:
|
|
6
|
+
${e.constructor.name} must extend SingleMessage or EventMessage`))}flip(){this.signalActive=this.signalStaging,this.eventActive=this.eventStaging,this.signalStaging=new Map,this.eventStaging=[]}clearSignals(){this.signalActive=new Map}clearEvents(){this.eventActive=[]}isEmpty(){return this.signalStaging.size===0&&this.eventStaging.length===0}reset(){this.signalActive=new Map,this.signalStaging=new Map,this.eventStaging=[],this.eventActive=[]}};i(re,"Staging");var L=re;var oe=class oe{constructor(e){a(this,"maxDepth");a(this,"isRunning",!1);a(this,"globalTick",0);a(this,"internalDepth",0);a(this,"staging",new L);a(this,"tickPayload",{});a(this,"beforeExecuteHooks",[]);a(this,"afterExecuteHooks",[]);a(this,"beforeTickHooks",[]);a(this,"afterTickHooks",[]);this.maxDepth=e}addBeforeExecute(e,t,s){s?this.beforeExecuteHooks.unshift({type:e,handler:t}):this.beforeExecuteHooks.push({type:e,handler:t})}addAfterExecute(e,t,s){s?this.afterExecuteHooks.unshift({type:e,handler:t}):this.afterExecuteHooks.push({type:e,handler:t})}addBeforeTick(e,t){t?this.beforeTickHooks.unshift(e):this.beforeTickHooks.push(e)}addAfterTick(e,t){t?this.afterTickHooks.unshift(e):this.afterTickHooks.push(e)}stage(e){this.staging.stage(e)}tick(e){if(!(this.isRunning||this.staging.isEmpty())){if(this.internalDepth>this.maxDepth){this.internalDepth=0,this.staging.reset(),console.error(new Error(`[Virid Dispatcher] Deadlock: Max depth reached ${this.maxDepth}, Possible infinite loop detected. The dispatcher will stop processing this tick.`));return}this.isRunning=!0,this.internalDepth++,queueMicrotask(()=>{try{this.internalDepth==1&&(this.tickPayload={},this.executeTickHooks(this.beforeTickHooks)),this.staging.flip();let t=this.collectTasks(e);this.executeTasks(t)}catch(t){d.error(t,"[Virid Dispatcher] Unhandled Error")}finally{this.isRunning=!1,this.staging.isEmpty()?(this.staging.reset(),this.internalDepth=0,this.executeTickHooks(this.afterTickHooks),this.globalTick++):this.tick(e)}})}}tickSync(e){if(!this.staging.isEmpty()){for(this.internalDepth=0,this.tickPayload={},this.executeTickHooks(this.beforeTickHooks);!this.staging.isEmpty();){if(this.internalDepth>this.maxDepth){this.staging.reset(),this.internalDepth=0,console.error(new Error(`[Virid Dispatcher] Deadlock: Max depth reached ${this.maxDepth}, Possible infinite loop detected. Ticking aborted.`));return}this.internalDepth++;try{this.staging.flip();let t=this.collectTasks(e);this.executeTasks(t)}catch(t){d.error(t,"[Virid Dispatcher] Sub-Tick Unhandled Error");break}}this.staging.reset(),this.internalDepth=0,this.executeTickHooks(this.afterTickHooks),this.globalTick++}}collectTasks(e){let t=[];for(let s of this.staging.eventActive)(e.get(s.constructor)||[]).forEach(n=>{t.push(new G(n.fn,n.priority,s,{context:n.fn.systemContext,tick:this.globalTick,payload:{}},this.beforeExecuteHooks,this.afterExecuteHooks))});for(let[s,o]of this.staging.signalActive.entries())(e.get(s)||[]).forEach(c=>{t.push(new G(c.fn,c.priority,o,{context:c.fn.systemContext,tick:this.globalTick,payload:{}},this.beforeExecuteHooks,this.afterExecuteHooks))});return t}executeTasks(e){e.sort((t,s)=>s.priority-t.priority);for(let t of e){let s=Array.isArray(t.message)?t.message[0]:t.message;try{let o=t.execute();o instanceof Promise&&o.catch(n=>d.error(n,`[Virid Dispatcher]: Async System Error.
|
|
6
7
|
SystemLocation: ${t.hookContext.context.targetClass.name}.${t.hookContext.context.methodName}
|
|
7
|
-
MessageName: ${
|
|
8
|
-
MessageData: ${JSON.stringify(t.message)}`))}catch(
|
|
8
|
+
MessageName: ${s.constructor.name}
|
|
9
|
+
MessageData: ${JSON.stringify(t.message)}`))}catch(o){d.error(o,`[Virid Dispatcher]: Sync System Error.
|
|
9
10
|
SystemLocation: ${t.hookContext.context.targetClass.name}.${t.hookContext.context.methodName}
|
|
10
|
-
MessageName: ${
|
|
11
|
-
MessageData: ${JSON.stringify(t.message)}`)}}prepareSnapshot(){this.eventHub.flip();let e=new Set(this.dirtySignalTypes),t=[...this.eventQueue];return this.dirtySignalTypes.clear(),this.eventQueue=[],{signalSnapshot:e,eventSnapshot:t}}clear(e,t){let r=new Set(t);e.forEach(n=>r.add(n.constructor)),this.eventHub.clearSignals(r),this.eventHub.clearEvents()}executeTickHooks(e){let t={tick:this.globalTick,timestamp:Date.now(),payload:this.tickPayload};e.forEach(r=>r(t))}};o(J,"Dispatcher");var I=J,Y=class Y{constructor(e,t,r,n){i(this,"fn");i(this,"priority");i(this,"message");i(this,"hookContext");this.fn=e,this.priority=t,this.message=r,this.hookContext=n}triggerHooks(e){let t=Array.isArray(this.message)?this.message[0]:this.message;if(t){for(let r of e)if(t instanceof r.type)try{let n=r.handler(this.message,this.hookContext);n instanceof Promise&&n.catch(f=>{a.error(f,`[Virid Hook] Async Hook Error:
|
|
12
|
-
|
|
13
|
-
${
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
${e.constructor.name} must extend SingleMessage or EventMessage`))}flip(){this.signalActive=this.signalStaging,this.signalStaging=new Map,this.eventActive=this.eventStaging,this.eventStaging=[]}peekSignal(e){return this.signalActive.get(e)||[]}getEventStream(){return this.eventActive}peekEventAt(e){return this.eventActive[e]}clearSignals(e){e.forEach(t=>this.signalActive.delete(t))}clearEvents(){this.eventActive=[]}reset(){this.signalActive.clear(),this.signalStaging.clear(),this.eventActive=[],this.eventStaging=[]}};o(q,"EventHub");var O=q;var K=class K{constructor(){i(this,"systemTaskMap",new Map)}register(e,t,r=0){let n=this.systemTaskMap.get(e)||[];if(n.findIndex(l=>l.fn===t)===-1)n.push({fn:t,priority:r}),n.sort((l,u)=>u.priority-l.priority),this.systemTaskMap.set(e,n);else{let l=t.name||"Anonymous";return a.error(new Error(`[Virid Error] System Already Registered:
|
|
17
|
-
Class ${e.name}
|
|
18
|
-
Function ${l}`)),()=>{}}return()=>{let l=this.systemTaskMap.get(e);if(l){let u=l.findIndex(d=>d.fn===t);u!==-1&&(l.splice(u,1),l.length===0&&this.systemTaskMap.delete(e))}}}};o(K,"MessageRegistry");var E=K;var X=class X{constructor(){i(this,"eventHub",new O);i(this,"dispatcher",new I(this.eventHub));i(this,"registry",new E);i(this,"middlewares",[]);F(this)}useMiddleware(e,t){this.middlewares.push(e)}onBeforeExecute(e,t,r){this.dispatcher.addBeforeExecute(e,t,r)}onAfterExecute(e,t,r){this.dispatcher.addAfterExecute(e,t,r)}onBeforeTick(e,t){this.dispatcher.addBeforeTick(e,t)}onAfterTick(e,t){this.dispatcher.addAfterTick(e,t)}dispatch(e){if(!(e instanceof y)){a.error(new Error(`[Virid Dispatch] Type Error: Message must be an instance of BaseMessage,message:${e}`));return}this.pipeline(e,()=>{if(!this.registry.systemTaskMap.has(e.constructor)){a.error(new Error(`[Virid Dispatch] No handler for message: ${e.constructor.name}`));return}this.eventHub.push(e),this.dispatcher.markDirty(e),this.dispatcher.tick(this.registry.systemTaskMap)})}pipeline(e,t){let r=0,n=o(()=>{r<this.middlewares.length?this.middlewares[r++](e,n):t()},"next");n()}register(e,t,r=0){return this.registry.register(e,t,r)}};o(X,"MessageInternal");var k=X;var Z=class Z{constructor(){i(this,"bindings",new Map);i(this,"singletonInstances",new Map)}bind(e){let t={type:"transient",ctor:e};return this.bindings.set(e,t),{toSelf:o(()=>({inSingletonScope:o(()=>(t.type="singleton",{onActivation:o(r=>{},"onActivation")}),"inSingletonScope")}),"toSelf")}}get(e,t){let r=this.bindings.get(e);if(!r)throw new Error(`[Virid Container] Unbound Constructor: No binding found for ${e.name}`);let n=r.ctor;if(r.type==="singleton"){if(!this.singletonInstances.has(e)){let l=new n,u=t(l);this.singletonInstances.set(e,u)}return this.singletonInstances.get(e)}let f=new n;return t(f)}};o(Z,"ViridContainer");var P=Z;var N=!0;function ie(s){N=s}o(ie,"toggleSwitch");var c={reset:"\x1B[0m",red:"\x1B[31m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m",bold:"\x1B[1m",green:"\x1B[32m"};function ee(s,e,t){let r={params:s,targetClass:Object,methodName:t,originalMethod:e};return e.ccsContext=r,e}o(ee,"withContext");var ve=o(s=>{if(!N)return;let e=`${c.green}${c.bold} \u2714 [Virid Info] ${c.reset}`,t=`${c.magenta}${s.context}${c.reset}`;console.log(`${e}${c.gray}Global Info Caught:${c.reset}
|
|
19
|
-
${c.green}Details:${c.reset}`,s.context||"unknown Info")},"globalInfoHandler"),Se=o(s=>{if(!N)return;let e=`${c.red}${c.bold} \u2716 [Virid Error] ${c.reset}`,t=`${c.magenta}${s.context}${c.reset}`;console.error(`${e}${c.gray}Global Error Caught:${c.reset}
|
|
20
|
-
${c.red}Context:${c.reset} ${t}
|
|
21
|
-
${c.red}Details:${c.reset}`,s.error||s||"unknown Error")},"globalErrorHandler"),be=o(s=>{if(!N)return;let e=`${c.yellow}${c.bold} \u26A0 [Virid Warn] ${c.reset}`,t=`${c.cyan}${s.context}${c.reset}`;console.warn(`${e}${c.gray}Global Warn Caught:${c.reset}
|
|
22
|
-
${c.yellow}Context:${c.reset} ${t}`)},"globalWarnHandler");function ae(s){s.register(S,ee(S,be,"GlobalWarnHandler"),-999),s.register(v,ee(v,Se,"GlobalErrorHandler"),-999),s.register(b,ee(b,ve,"GlobalInfoHandler"),-999),_=s}o(ae,"initializeGlobalSystems");var _=null,ht=new Proxy({},{get(s,e){return(...t)=>{if(!_){console.warn(`[Virid Vue] App method "${String(e)}" called before initialization.`);return}let r=_[e];if(typeof r=="function")return Reflect.apply(r,_,t)}}});var ce=new Set,re=class re{constructor(){i(this,"container",new P);i(this,"messageInternal",new k);i(this,"activationHooks",[])}addActivationHook(e){this.activationHooks.push(e)}get(e){return e.length>0&&a.error(new Error(`[Virid Container] Violation: Component "${e.name}" should not have constructor arguments. Dependency Injection is only allowed in Systems.`)),this.container.get(e,t=>this.handleActivation(t))}handleActivation(e){return e&&this.activationHooks.reduce((t,r)=>{try{let n=r(t);return n===void 0&&a.warn(`[Virid Container] Hook Does Bot Return A Value: Hook "${r.name}" should return a instance to continue.`),n!==void 0?n:t}catch(n){return a.error(n,"[Virid Container] Activation Hook Failed"),t}},e)}bindController(e){return this.container.bind(e).toSelf(),{inSingletonScope:o(()=>({onActivation:o(()=>{},"onActivation")}),"inSingletonScope")}}bindComponent(e){return this.container.bind(e).toSelf().inSingletonScope(),{onActivation:o(()=>{},"onActivation")}}useMiddleware(e,t=!1){this.messageInternal.useMiddleware(e,t)}onBeforeExecute(e,t,r=!1){this.messageInternal.onBeforeExecute(e,t,r)}onAfterExecute(e,t,r=!1){this.messageInternal.onAfterExecute(e,t,r)}onBeforeTick(e,t=!1){this.messageInternal.onBeforeTick(e,t)}onAfterTick(e,t=!1){this.messageInternal.onAfterTick(e,t)}register(e,t,r=0){return this.messageInternal.register(e,t,r)}use(e,t){if(ce.has(e.name))return a.warn(`[Virid Plugin] Duplicate Installation: Plugin ${e.name} has already been installed.`),this;try{e.install(this,t),ce.add(e.name)}catch(r){a.error(r,`[Virid Plugin]: Install Failed: ${e.name}`)}return this}};o(re,"ViridApp");var te=re,w=new te;w.addActivationHook(H);ae(w);var p={SYSTEM:"virid:core:system",MESSAGE:"virid:core:message",CONTROLLER:"virid:core:controller",COMPONENT:"virid:core:component",SAFE:"virid:core:safe",OBSERVER:"virid:core:observer"};var M=o(s=>{if(!s)return;(Array.isArray(s)?s:[s]).forEach(t=>{t instanceof y?a.write(t):a.warn("[Virid HandleResult] Invalid Return Type: Must return Message or Message[].")})},"handleResult");function we(s={priority:0,messageClass:null}){return(e,t,r)=>{if(typeof e!="function"){let h=new Error(`[Virid System] Method Type Error:
|
|
23
|
-
The Method ${t} is not a static method, please check if there is a static keyword tag`);a.error(h);return}let n=r.value,f=Reflect.getMetadata("design:paramtypes",e,t),l=Reflect.getMetadata(p.MESSAGE,e,t)||null;if(!f){let h=new Error(`[Virid System] System Parameter Loss:
|
|
24
|
-
Unable to recognize system parameters, please confirm if import "reflection-metadata" was introduced at the beginning!`);a.error(h);return}if(f.some(h=>h===void 0)){let h=new Error(`[Virid System] Parameter Metadata Loss in "${t}":
|
|
25
|
-
One or more parameters have 'undefined' types.
|
|
26
|
-
This usually happens when you forget to add a type annotation to a decorated parameter.
|
|
27
|
-
Check parameter at index: ${f.indexOf(void 0)}`);a.error(h);return}if(s.messageClass&&l){a.error(new Error(`[Virid System] Multiple Messages Are Not Allowed: Cannot use @ message() and SystemParams simultaneously in ${t}`));return}if(!s.messageClass&&!l){a.error(new Error(`[Virid System] System Parameter Loss:
|
|
28
|
-
Please declare the message type using the Message decorator`));return}let u=o(h=>{let A=f.map((C,le)=>{if(l&&l.index==le){let{messageClass:B,single:he}=l,R=Array.isArray(h)?h[0]:h;if(!(R instanceof B)){let fe=R.constructor.name;throw new Error(`[Virid System] Type Mismatch: Expected ${B.name}, but received ${fe}`)}if(R instanceof x)return he?Array.isArray(h)?h[h.length-1]:h:Array.isArray(h)?h:[h];if(R instanceof m)return h;throw new Error(`[Virid System] unknown Message Types: Message ${B.name} is not a subclass of SingleMessage or EventMessage!`)}let ne=w.get(C);if(!ne)throw new Error(`[Virid System] unknown Inject Data Types: ${C.name} is not registered in the container!`);return ne}),$=n.apply(e,A);return $ instanceof Promise?$.then(M):M($)},"wrappedSystem"),d={params:f,targetClass:e,methodName:t,originalMethod:n};u.systemContext=d,r.value=u;let g=s.messageClass||l.messageClass;w.register(g,u,s.priority)}}o(we,"System");function Ee(s,e=!0){return(t,r,n)=>{if(Reflect.hasOwnMetadata(p.MESSAGE,t,r)){a.error(new Error(`[Virid Message] Multiple Messages Are Not Allowed: ${r} has multiple @Message() decorators!`));return}let f={index:n,messageClass:s,single:e};Reflect.defineMetadata(p.MESSAGE,f,t,r)}}o(Ee,"Message");function ke(){return(s,e,t)=>{let r=Reflect.getMetadata(p.SAFE,s)||new Set;r.add(e),Reflect.defineMetadata(p.SAFE,r,s)}}o(ke,"Safe");function Me(s){return(e,t)=>{let r=Reflect.getMetadata(p.OBSERVER,e)||[];r.push({propertyKey:t,callback:s}),Reflect.defineMetadata(p.OBSERVER,r,e)}}o(Me,"Observer");function Ae(){return s=>{Reflect.defineMetadata(p.CONTROLLER,!0,s)}}o(Ae,"Controller");function $e(){return s=>{Reflect.defineMetadata(p.COMPONENT,!0,s)}}o($e,"Component");var Te=["push","pop","shift","unshift","splice","sort","reverse"];function H(s){return!s||typeof s!="object"||Object.prototype.hasOwnProperty.call(s,"__virid_observer_processed__")||(Object.defineProperty(s,"__virid_observer_processed__",{value:!0,enumerable:!1,configurable:!0}),(Reflect.getMetadata(p.OBSERVER,s)||[]).forEach(({propertyKey:t,callback:r})=>{let n={value:s[t]},f=new Proxy(n,{get(u,d){let g=u.value;return Array.isArray(g)&&Te.includes(d)?(...h)=>{let A=[...g],$=g[d].apply(g,h),C=r.call(s,A,g);return M(C),$}:g},set(u,d,g){let h=u.value;if(g===h)return!0;u.value=g;let A=r.call(s,h,g);return M(A),!0}}),l=o(()=>f.value,"getter");l.__virid_box__=n,Object.defineProperty(s,t,{get:l,set:o(u=>{f.value=u},"set"),enumerable:!0,configurable:!0}),n.value&&typeof n.value=="object"&&H(n.value)}),Reflect.ownKeys(s).forEach(t=>{if(t==="__virid_observer_processed__")return;let r=Object.getOwnPropertyDescriptor(s,t);if(r&&r.get)return;let n=s[t];n&&typeof n=="object"&&H(n)})),s}o(H,"bindObservers");var se={enableLog:!0};function He(s=se){return ie(s.enableLog),w}o(He,"createVirid");0&&(module.exports={BaseMessage,Component,Controller,ErrorMessage,EventMessage,InfoMessage,Message,MessageInternal,MessageRegistry,MessageWriter,Observer,Safe,SingleMessage,System,VIRID_METADATA,WarnMessage,activateInstance,bindObservers,createVirid,defaultConfig,handleResult,publisher});
|
|
11
|
+
MessageName: ${s.constructor.name}
|
|
12
|
+
MessageData: ${JSON.stringify(t.message)}`)}}}executeTickHooks(e){let t={tick:this.globalTick,timestamp:Date.now(),payload:this.tickPayload};e.forEach(s=>s(t))}};i(oe,"Dispatcher");var W=oe,ie=class ie{constructor(e,t,s,o,n,c){a(this,"fn");a(this,"priority");a(this,"message");a(this,"hookContext");a(this,"beforeExecuteHooks");a(this,"afterExecuteHooks");a(this,"success",!0);this.fn=e,this.priority=t,this.message=s,this.hookContext=o,this.beforeExecuteHooks=n,this.afterExecuteHooks=c}triggerHooks(e){let t=Array.isArray(this.message)?this.message[0]:this.message;if(t){for(let s of e)if(t instanceof s.type)try{let o=s.handler(this.message,this.hookContext,this.success);o instanceof Promise&&o.catch(n=>{d.error(n,`[Virid Hook] Async Hook Error: It is prohibited to use asynchronous hooks within Hook: ${s.type.name}`)})}catch(o){d.error(o,`[Virid Hook] Hook Execute Failed: Triggered by: ${t.constructor.name}, Registered type: ${s.type.name}`)}}}execute(){this.triggerHooks(this.beforeExecuteHooks);let e=i(()=>this.triggerHooks(this.afterExecuteHooks),"runAfter");try{let t=this.fn(this.message);return t instanceof Promise?t.catch(()=>this.success=!1).finally(e):(e(),t)}catch(t){throw this.success=!1,e(),t}}};i(ie,"ExecutionTask");var G=ie;var ne=class ne{constructor(e,t){a(this,"dispatcher");a(this,"registry",new D);a(this,"middlewares",[]);a(this,"manual");this.dispatcher=new W(e),this.manual=t,Y(this)}useMiddleware(e,t){this.middlewares.push(e)}onBeforeExecute(e,t,s){this.dispatcher.addBeforeExecute(e,t,s)}onAfterExecute(e,t,s){this.dispatcher.addAfterExecute(e,t,s)}onBeforeTick(e,t){this.dispatcher.addBeforeTick(e,t)}onAfterTick(e,t){this.dispatcher.addAfterTick(e,t)}tick(){this.dispatcher.tickSync(this.registry.systemTaskMap)}dispatch(e){if(!(e instanceof x)){d.error(new Error(`[Virid Dispatch] Type Error: Message must be an instance of BaseMessage,message:${e}`));return}this.pipeline(e,()=>{if(!this.registry.systemTaskMap.has(e.constructor)){d.error(new Error(`[Virid Dispatch] No handler for message: ${e.constructor.name}`));return}this.dispatcher.stage(e),this.manual||this.dispatcher.tick(this.registry.systemTaskMap)})}pipeline(e,t){let s=0,o=i(()=>{s<this.middlewares.length?this.middlewares[s++](e,o):t()},"next");o()}register(e,t,s=0){return this.registry.register(e,t,s)}};i(ne,"MessageEngine");var V=ne;var y={SYSTEM:"virid:core:system",MESSAGE:"virid:core:message",CONTROLLER:"virid:core:controller",COMPONENT:"virid:core:component",SAFE:"virid:core:safe",OBSERVER:"virid:core:observer"};function S(r){if(!r)return;(Array.isArray(r)?r:[r]).forEach(t=>{t instanceof x?d.write(t):d.warn("[Virid HandleResult] Invalid Return Type: Must return Message or Message[].")})}i(S,"handleResult");function Ee(r){let e=[];if(r.forEach((t,s)=>{(t===x||t&&t.prototype instanceof x)&&e.push({type:t,idx:s})}),e.length===0)return null;if(e.length>1){let t=e.map(s=>`[Index: ${s.idx}, Name: ${s.type.name}]`).join(", ");throw new Error(`[Virid System] Multiple Messages: Multiple Message type parameters detected, this is not allowed! specific location: ${t}`)}return e[0]}i(Ee,"checkMessageParam");function _(r={messageClass:null,priority:0}){return(e,t,s)=>{if(typeof e!="function")throw new Error(`[Virid System] Method Type Error: The Method ${t} is not a static method, please check if there is a static keyword tag.`);let o=s.value,n=Reflect.getMetadata("design:paramtypes",e,t);if(!n)throw new Error('[Virid System] System Parameter Loss: Unable to recognize system parameters, please confirm if import "reflect-metadata" was introduced at the beginning.');let c=n.map((g,H)=>g===void 0?H:-1).filter(g=>g!==-1);if(c.length>0)throw new Error(`[Virid System] Parameter Metadata Loss in "${t}": One or more parameters have 'undefined' types. This usually happens when you forget to add a type annotation or due to circular dependencies. Check parameter at indices: [${c.join(", ")}]`);let l,m=-1,u=!1,w=n.indexOf(Array);if(w!==-1){if(!r.messageClass)throw new Error("[Virid System] System Parameter Loss: When using batch processing mode with Array, the messageClass parameter must be specified in decorator options.");if(!(r.messageClass.prototype instanceof A))throw new Error("[Virid System] System Parameter Loss: When using the batch processing mode, the messageClass parameter must inherit from SingleMessage.");l=r.messageClass,m=w,u=!0}else{let g=Ee(n);if(g&&r.messageClass)throw new Error(`[Virid System] Multiple Messages Are Not Allowed: Cannot specify messageClass in decorator options while already declaring it in method parameters at index ${g.idx} in ${t}.`);if(g)l=g.type,m=g.idx;else if(r.messageClass)l=r.messageClass,m=-1;else throw new Error("[Virid System] System Parameter Loss: Please declare the message type either in method parameters or via the Message decorator options.")}let E={params:n,targetClass:e,methodName:t,originalMethod:o},b={messageClass:l,messageIdx:m,priority:r.priority||0,batchMode:u};s.value.systemContext=E,s.value.systemConfig=b}}i(_,"System");function Me(){return(r,e,t)=>{let s=Reflect.getMetadata(y.SAFE,r)||new Set;s.add(e),Reflect.defineMetadata(y.SAFE,s,r)}}i(Me,"Safe");function ve(r){return(e,t)=>{let s=Reflect.getMetadata(y.OBSERVER,e)||[];s.push({propertyKey:t,callback:r}),Reflect.defineMetadata(y.OBSERVER,s,e)}}i(ve,"Observer");function $e(){return r=>{Reflect.defineMetadata(y.CONTROLLER,!0,r)}}i($e,"Controller");function ae(){return r=>{Reflect.defineMetadata(y.COMPONENT,!0,r)}}i(ae,"Component");var Ce=["push","pop","shift","unshift","splice","sort","reverse"];function B(r){return!r||typeof r!="object"||Object.prototype.hasOwnProperty.call(r,"__virid_observer_processed__")||(Object.defineProperty(r,"__virid_observer_processed__",{value:!0,enumerable:!1,configurable:!0}),(Reflect.getMetadata(y.OBSERVER,r)||[]).forEach(({propertyKey:t,callback:s})=>{let o={value:r[t]},n=new Proxy(o,{get(l,m){let u=l.value;return Array.isArray(u)&&Ce.includes(m)?(...w)=>{let E=[...u],b=u[m].apply(u,w),g=s.call(r,E,u);return S(g),b}:u},set(l,m,u){let w=l.value;if(u===w)return!0;l.value=u;let E=s.call(r,w,u);return S(E),!0}}),c=i(()=>n.value,"getter");c.__virid_box__=o,Object.defineProperty(r,t,{get:c,set:i(l=>{n.value=l},"set"),enumerable:!0,configurable:!0}),o.value&&typeof o.value=="object"&&B(o.value)}),Reflect.ownKeys(r).forEach(t=>{if(t==="__virid_observer_processed__")return;let s=Object.getOwnPropertyDescriptor(r,t);if(s&&s.get)return;let o=r[t];o&&typeof o=="object"&&B(o)})),r}i(B,"bindObservers");var ce=class ce{constructor(){a(this,"bindings",new Map);a(this,"singletonInstances",new Map);a(this,"activationHooks",[])}addActivationHook(e,t){t?this.activationHooks.unshift(e):this.activationHooks.push(e)}bind(e){if(e.length>0)throw new Error(`[Virid Container] Cannot Bind Component Or Controller: The Class ${e.name} should not have mandatory parameters.`);if(Reflect.getMetadata(y.COMPONENT,e)){let t={type:"singleton",ctor:e};this.bindings.set(e,t)}else if(Reflect.getMetadata(y.CONTROLLER,e)){let t={type:"transient",ctor:e};this.bindings.set(e,t)}else throw new Error(`[Virid Container] Cannot Bind Component Or Controller: The Class ${e.name} is not decorated with @Component or @Controller`)}spawn(e){let t=e.constructor;if(Reflect.hasMetadata(y.COMPONENT,t)){let s={type:"singleton",ctor:t};this.bindings.set(t,s),this.singletonInstances.set(t,e)}else throw new Error(`[Virid Container] Cannot spawn Component: The Class ${t.name} is not decorated with @Component`)}get(e){let t=this.bindings.get(e);if(!t)throw new Error(`[Virid Container] Cannot Get Component Or Controller: No binding found for ${e}`);let s=t.ctor;if(t.type==="singleton"){if(!this.singletonInstances.has(e)){let n=new s,c=this.handleActivation(n);this.singletonInstances.set(e,c)}return this.singletonInstances.get(e)}let o=new s;return this.handleActivation(o)}handleActivation(e){for(let t of this.activationHooks)e=t(e);return e}};i(ce,"ViridContainer");var U=ce;function Te(r,e,t,s){var o=arguments.length,n=o<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(r,e,t,s);else for(var l=r.length-1;l>=0;l--)(c=r[l])&&(n=(o<3?c(n):o>3?c(e,t,n):c(e,t))||n);return o>3&&n&&Object.defineProperty(e,t,n),n}i(Te,"_ts_decorate");function fe(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)}i(fe,"_ts_metadata");var le=class le{constructor(e,t){a(this,"container",new U);a(this,"engine");a(this,"installedPlugins",new Set);this.engine=new V(e,t),this.container.spawn(this)}onActivate(e,t=!1){this.container.addActivationHook(e,t)}tick(){this.engine.tick()}get(e){return this.container.get(e)}bind(e){this.container.bind(e)}spawn(e){this.container.spawn(e)}useMiddleware(e,t=!1){this.engine.useMiddleware(e,t)}onBeforeExecute(e,t,s=!1){this.engine.onBeforeExecute(e,t,s)}onAfterExecute(e,t,s=!1){this.engine.onAfterExecute(e,t,s)}onBeforeTick(e,t=!1){this.engine.onBeforeTick(e,t)}onAfterTick(e,t=!1){this.engine.onAfterTick(e,t)}use(e,t){if(this.installedPlugins.has(e.name))return d.warn(`[Virid Plugin] Duplicate Installation: Plugin ${e.name} has already been installed.`),this;try{e.install(this,t),this.installedPlugins.add(e.name)}catch(s){d.error(s,`[Virid Plugin]: Install Failed: ${e.name}`)}return this}register(e){let t=e.systemContext,s=e.systemConfig;if(!t||!s)throw new Error(`[Virid System] System Parameter Loss: Please declare ${e.name} using the @System decorator first.`);let{params:o,targetClass:n,originalMethod:c}=t,{messageClass:l,messageIdx:m,priority:u,batchMode:w}=s,E=typeof S=="function"?S:h=>h,b=i(h=>h instanceof Promise?h.then(E):E(h),"processResult"),g=new Array(o.length),H=!1,F=i(()=>{for(let h=0;h<o.length;h++)if(h!==m){let p=this.get(o[h]);if(!p)throw new Error(`[Virid System] Unknown Inject Data Types: ${o[h].name||o[h]} is not registered in the container for system '${e.name}'!`);g[h]=p}H=!0},"initDeps"),T;return m===-1?T=i(()=>(H||F(),b(c.apply(n,g))),"wrappedSystem"):o.length===1?w?T=i(h=>{let p=Array.isArray(h)?h:[h];if(p.length>0&&!(p[0]instanceof l))throw new Error(`[Virid System] Type Mismatch: Expected list of ${l.name}, but got ${p[0]?.constructor?.name}`);return b(c.call(n,p))},"wrappedSystem"):T=i(h=>{let p=Array.isArray(h)?h[h.length-1]:h;if(!(p instanceof l))throw new Error(`[Virid System] Type Mismatch: Expected ${l.name}, but got ${p?.constructor?.name}`);return b(c.call(n,p))},"wrappedSystem"):w?T=i(h=>{H||F();let p=Array.isArray(h)?h:[h];if(p.length>0&&!(p[0]instanceof l))throw new Error(`[Virid System] Type Mismatch: Expected list of ${l.name}, but got ${p[0]?.constructor?.name}`);let P=[...g];return P[m]=p,b(c.apply(n,P))},"wrappedSystem"):T=i(h=>{H||F();let p=Array.isArray(h)?h[h.length-1]:h;if(!(p instanceof l))throw new Error(`[Virid System] Type Mismatch: Expected ${l.name}, but got ${p?.constructor?.name}`);let P=[...g];return P[m]=p,b(c.apply(n,P))},"wrappedSystem"),T.systemContext=t,this.engine.register(l,T,u)}};i(le,"ViridApp");var R=le;R=Te([ae(),fe("design:type",Function),fe("design:paramtypes",[Number,Boolean])],R);function he(r,e,t,s){var o=arguments.length,n=o<3?e:s===null?s=Object.getOwnPropertyDescriptor(e,t):s,c;if(typeof Reflect=="object"&&typeof Reflect.decorate=="function")n=Reflect.decorate(r,e,t,s);else for(var l=r.length-1;l>=0;l--)(c=r[l])&&(n=(o<3?c(n):o>3?c(e,t,n):c(e,t))||n);return o>3&&n&&Object.defineProperty(e,t,n),n}i(he,"_ts_decorate");function k(r,e){if(typeof Reflect=="object"&&typeof Reflect.metadata=="function")return Reflect.metadata(r,e)}i(k,"_ts_metadata");var z=!0;function de(r){z=r}i(de,"toggleSwitch");var f={reset:"\x1B[0m",red:"\x1B[31m",yellow:"\x1B[33m",blue:"\x1B[34m",magenta:"\x1B[35m",cyan:"\x1B[36m",gray:"\x1B[90m",bold:"\x1B[1m",green:"\x1B[32m"},I,O=(I=class{static globalInfoHandler(e){if(!z)return;let t=`${f.green}${f.bold} \u2714 [Virid Info] ${f.reset}`,s=`${f.magenta}${e.context}${f.reset}`;console.log(`${t}${f.gray}Global Info Caught:${f.reset}
|
|
13
|
+
${f.green}Details:${f.reset}`,s||"unknown Info")}static globalErrorHandler(e){if(!z)return;let t=`${f.red}${f.bold} \u2716 [Virid Error] ${f.reset}`,s=`${f.magenta}${e.context}${f.reset}`;console.error(`${t}${f.gray}Global Error Caught:${f.reset}
|
|
14
|
+
${f.red}Context:${f.reset} ${s}
|
|
15
|
+
${f.red}Details:${f.reset}`,e.error||e||"unknown Error")}static globalWarnHandler(e){if(!z)return;let t=`${f.yellow}${f.bold} \u26A0 [Virid Warn] ${f.reset}`,s=`${f.cyan}${e.context}${f.reset}`;console.warn(`${t}${f.gray}Global Warn Caught:${f.reset}
|
|
16
|
+
${f.yellow}Context:${f.reset} ${s}`)}},i(I,"ViridLogHandler"),I);he([_(),k("design:type",Function),k("design:paramtypes",[typeof $>"u"?Object:$]),k("design:returntype",void 0)],O,"globalInfoHandler",null);he([_(),k("design:type",Function),k("design:paramtypes",[typeof M>"u"?Object:M]),k("design:returntype",void 0)],O,"globalErrorHandler",null);he([_(),k("design:type",Function),k("design:paramtypes",[typeof v>"u"?Object:v]),k("design:returntype",void 0)],O,"globalWarnHandler",null);function pe(r){r.register(O.globalInfoHandler),r.register(O.globalErrorHandler),r.register(O.globalWarnHandler)}i(pe,"registerBasicSystems");function Ae(r=j){r={...j,...r};let e=new R(r.maxDepth,r.manual);pe(e),de(r.enableLog),e.onActivate(B);let t=e;return e.spawn(t),e}i(Ae,"createVirid");0&&(module.exports={BaseMessage,Component,Controller,ErrorMessage,EventMessage,InfoMessage,MessageEngine,MessageRegistry,MessageWriter,Observer,Safe,SingleMessage,System,VIRID_METADATA,ViridApp,WarnMessage,activateInstance,bindObservers,createVirid,defaultConfig,handleResult});
|
|
29
17
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/core/message.ts","../src/core/io.ts","../src/core/dispatcher.ts","../src/core/event-hub.ts","../src/core/registry.ts","../src/core/internal.ts","../src/container.ts","../src/utils.ts","../src/app.ts","../src/decorators/constant.ts","../src/decorators/ccs.ts","../src/decorators/bind.ts","../src/interfaces/common.ts"],"sourcesContent":["/*\n * Copyright (c) 2026-present Ailrid\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Description: Virid Core Dispatcher - The heart of CCS Architecture.\n */\nexport * from \"./core\";\nexport * from \"./decorators\";\nexport * from \"./interfaces\";\nimport { viridApp, type ViridApp } from \"./app\";\nimport { AppConfig, defaultConfig } from \"./interfaces\";\nimport { toggleSwitch } from \"./utils\";\nexport { type ViridApp, type ViridPlugin } from \"./app\";\n\nexport function createVirid(config: AppConfig = defaultConfig): ViridApp {\n toggleSwitch(config.enableLog);\n return viridApp;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { Newable } from \"../interfaces\";\nimport { MessageWriter } from \"./io\";\n\nexport abstract class BaseMessage {\n static send<T extends Newable<any>>(\n this: T,\n ...args: ConstructorParameters<T>\n ) {\n // 实例化并传递给 Writer\n MessageWriter.write(this as any, ...args);\n }\n}\n/**\n * 可合并的信号基类\n */\nexport abstract class SingleMessage extends BaseMessage {\n private readonly __kind = \"SingleMessage\" as const;\n constructor() {\n super();\n }\n}\n\n/**\n * 不可合并的消息基类\n */\nexport abstract class EventMessage extends BaseMessage {\n private readonly __kind = \"EventMessage\" as const;\n constructor() {\n super();\n }\n}\n\n/**\n * 基础错误消息:不可合并,必须被精准捕获\n */\nexport class ErrorMessage extends EventMessage {\n constructor(\n public readonly error: Error,\n public readonly context?: string,\n ) {\n super();\n }\n}\n/**\n * 基础警告消息:不可合并,必须被精准捕获\n */\nexport class WarnMessage extends EventMessage {\n constructor(public readonly context: string) {\n super();\n }\n}\n/**\n * 基础信息消息:不可合并,必须被精准捕获\n */\nexport class InfoMessage extends EventMessage {\n constructor(public readonly context: string) {\n super();\n }\n}\n\n\n\n// // 存储 { 类名: 当前活跃的消息实例 }\n// const debounceMap = new Map<any, any>();\n// // 存储 { 类名: 用于清理的 Timer }\n// const timerMap = new Map<any, any>();\n\n// export abstract class DebounceMessage extends SingleMessage {\n// /**\n// * 子类必须定义防抖时间(毫秒)\n// */\n// abstract readonly debounceTime: number;\n\n// constructor() {\n// super();\n// }\n\n// static send<T extends Newable<DebounceMessage>>(\n// this: T,\n// ...args: ConstructorParameters<T>\n// ) {\n// // 提前实例化\n// const instance = new this(...args) as InstanceType<T>;\n// const debounceTime = instance.debounceTime;\n\n// const previousMessage = debounceMap.get(this);\n// if (previousMessage) {\n// instance.debounceCallback(previousMessage);\n\n// // 有了新消息,就取消掉之前的清理定时器\n// const oldTimer = timerMap.get(this);\n// if (oldTimer) clearTimeout(oldTimer);\n// }\n\n// // 更新 Map 记录当前最新的消息\n// debounceMap.set(this, instance);\n\n// // 只有在 debounceTime 毫秒内没有新消息进来,才会彻底从 Map 中移除\n// const timer = setTimeout(() => {\n// debounceMap.delete(this);\n// timerMap.delete(this);\n// }, debounceTime);\n\n// timerMap.set(this, timer);\n\n// MessageWriter.write(instance as any);\n// }\n\n// /**\n// * 子类实现:决定如何处理前一个还在“窗口期”内的消息\n// */\n// debounceCallback(previousMessage: this): void {\n// return;\n// }\n// }\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { type MessageInternal } from \"./internal\";\nimport {\n type BaseMessage,\n ErrorMessage,\n InfoMessage,\n WarnMessage,\n} from \"./message\";\nimport { type Newable } from \"../interfaces\";\n// 描述 dispatch 的结构\nexport interface IMessagePublisher {\n dispatch(message: BaseMessage): void;\n}\n// 导出这个“壳子”\nlet activeInstance: MessageInternal | null = null;\nexport function activateInstance(instance: MessageInternal) {\n activeInstance = instance;\n}\nexport const publisher: IMessagePublisher = new Proxy({} as IMessagePublisher, {\n get(_, prop) {\n if (prop === \"dispatch\") {\n return (message: BaseMessage) => {\n if (!activeInstance) {\n console.error(\n `[Virid] Message dispatched before system init: ${message.constructor.name}`,\n );\n return;\n }\n // 确保调用时 this 永远指向 activeInstance\n return activeInstance.dispatch(message);\n };\n }\n // 如果以后 publisher 增加了别的方法,这里也可以照常处理\n return Reflect.get(activeInstance || {}, prop);\n },\n});\n\nexport class MessageWriter {\n /**\n * 核心入口:无论是类还是实例,统一交给 Internal 处理\n */\n public static write<T extends BaseMessage, K extends Newable<T>>(\n target: K | T,\n ...args: ConstructorParameters<K>\n ): void {\n const instance =\n typeof target === \"function\"\n ? new (target as any)(...args)\n : (target as T);\n\n // 所有的存储、标记脏数据、触发 Tick,全部收拢到 dispatch 一个方法里\n publisher.dispatch(instance);\n }\n\n /**\n * 快捷方式:系统内部常用\n */\n public static error(e: Error, context: string = \"\"): void {\n const error = e instanceof Error ? e : new Error(String(e));\n this.write(new ErrorMessage(error, context));\n }\n\n public static warn(context: string): void {\n this.write(new WarnMessage(context));\n }\n public static info(context: string): void {\n this.write(new InfoMessage(context));\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\n/**\n * @description: 事件调度器\n */\nimport { MessageWriter } from \"./io\";\nimport {\n type ExecuteHook,\n type ExecuteHookContext,\n type SystemTask,\n type MessageIdentifier,\n type SystemContext,\n type TickHook,\n type TickHookContext,\n} from \"../interfaces\";\nimport { SingleMessage, EventMessage, type BaseMessage } from \"./message\";\nimport { type EventHub } from \"./event-hub\";\n\nexport class Dispatcher {\n private dirtySignalTypes = new Set<any>();\n private eventQueue: EventMessage[] = [];\n private isRunning = false;\n private globalTick = 0; // 整个 App 生命周期内唯一、单调递增\n private internalDepth = 0; // 用于死循环防御,单次任务链执行完归零\n private eventHub: EventHub;\n private tickPayload: { [key: string]: any } = {};\n // 两个execute钩子\n private beforeExecuteHooks: Array<{\n type: MessageIdentifier<any>;\n handler: ExecuteHook<any>;\n }> = [];\n private afterExecuteHooks: Array<{\n type: MessageIdentifier<any>;\n handler: ExecuteHook<any>;\n }> = [];\n // 两个tick钩子\n private beforeTickHooks: Array<TickHook> = [];\n private afterTickHooks: Array<TickHook> = [];\n // 两个tick钩子\n constructor(eventHub: EventHub) {\n this.eventHub = eventHub;\n }\n // 添加执行钩子\n public addBeforeExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front: boolean,\n ) {\n //从前面插入\n if (front)\n this.beforeExecuteHooks.unshift({\n type,\n handler: hook as ExecuteHook<any>,\n });\n else\n this.beforeExecuteHooks.push({ type, handler: hook as ExecuteHook<any> });\n }\n public addAfterExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front: boolean,\n ) {\n //从前面插入\n if (front)\n this.afterExecuteHooks.unshift({\n type,\n handler: hook as ExecuteHook<any>,\n });\n else\n this.afterExecuteHooks.push({ type, handler: hook as ExecuteHook<any> });\n }\n // 添加执行钩子\n public addBeforeTick(hook: TickHook, front: boolean) {\n if (front) this.beforeTickHooks.unshift(hook);\n else this.beforeTickHooks.push(hook);\n }\n public addAfterTick(hook: TickHook, front: boolean) {\n if (front) this.afterTickHooks.unshift(hook);\n else this.afterTickHooks.push(hook);\n }\n\n /**\n * 标记脏数据:根据基类判断进入哪个池子\n */\n public markDirty(message: any) {\n if (message instanceof EventMessage) {\n // EventMessage:顺序追加,不合并\n this.eventQueue.push(message);\n } else if (message instanceof SingleMessage) {\n // SingleMessage:按类型合并\n this.dirtySignalTypes.add(message.constructor);\n }\n }\n\n public tick(systemTaskMap: Map<any, SystemTask[]>) {\n if (\n this.isRunning ||\n (this.dirtySignalTypes.size === 0 && this.eventQueue.length === 0)\n )\n return;\n\n // 死循环防御\n if (this.internalDepth > 100) {\n this.internalDepth = 0;\n // 立即清空队列\n this.dirtySignalTypes.clear();\n this.eventQueue = [];\n // 立即清空hub\n this.eventHub.reset();\n // 递归爆炸💥\n MessageWriter.error(\n new Error(\"[Virid Dispatcher] Deadlock: Recursive loop detected 💥.\"),\n );\n return;\n }\n\n this.isRunning = true;\n this.internalDepth++;\n\n queueMicrotask(() => {\n let signalSnapshot: Set<any> | undefined;\n let eventSnapshot: EventMessage[] | undefined;\n try {\n //执行tick钩子,只在第一次才触发\n if (this.internalDepth == 1) {\n this.tickPayload = {};\n this.executeTickHooks(this.beforeTickHooks);\n }\n\n //准备开始执行\n const snapshot = this.prepareSnapshot();\n signalSnapshot = snapshot.signalSnapshot;\n eventSnapshot = snapshot.eventSnapshot;\n //收集这一tick应该执行的任务\n const tasks = this.collectTasks(\n eventSnapshot,\n signalSnapshot,\n systemTaskMap,\n );\n //执行这一帧的任务\n this.executeTasks(tasks);\n } catch (e) {\n MessageWriter.error(e as Error, \"[Virid Dispatcher] Unhandled Error\");\n } finally {\n // 清理\n if (signalSnapshot && eventSnapshot) {\n this.clear(eventSnapshot, signalSnapshot);\n }\n // 释放锁并尝试下一轮执行\n this.isRunning = false;\n if (this.dirtySignalTypes.size > 0 || this.eventQueue.length > 0) {\n // 此时 tick 立即进入下一轮\n this.tick(systemTaskMap);\n } else {\n this.executeTickHooks(this.afterTickHooks);\n //标记当前tick\n this.globalTick++;\n // 重置内部状态\n this.internalDepth = 0;\n }\n }\n });\n }\n private collectTasks(\n eventSnapshot: EventMessage[],\n signalSnapshot: Set<any>,\n systemTaskMap: Map<any, SystemTask[]>,\n ): ExecutionTask[] {\n const tasks: ExecutionTask[] = [];\n // 收集 EVENT 任务 ,从前往后每一条消息执行所有关联 System\n for (const msg of eventSnapshot) {\n const systems = systemTaskMap.get(msg.constructor) || [];\n systems.forEach((s) => {\n //拿到Context\n tasks.push(\n new ExecutionTask(s.fn, s.priority, msg, {\n context: (s.fn as any).systemContext as SystemContext,\n tick: this.globalTick,\n payload: {},\n }),\n );\n });\n }\n // 收集 SIGNAL 任务 (每个 System 针对该类型只跑一次)\n // 对 System 函数引用进行去重,防止同一个类型触发多次重复的 SIGNAL 处理\n const signalFnSet = new Set<any>();\n for (const type of signalSnapshot) {\n const systems = systemTaskMap.get(type) || [];\n systems.forEach((s) => {\n if (!signalFnSet.has(s.fn)) {\n tasks.push(\n new ExecutionTask(\n s.fn,\n s.priority,\n this.eventHub.peekSignal(type),\n {\n context: (s.fn as any).systemContext as SystemContext,\n tick: this.globalTick,\n payload: {},\n },\n ),\n );\n signalFnSet.add(s.fn);\n }\n });\n }\n return tasks;\n }\n private executeTasks(tasks: ExecutionTask[]) {\n // 无论消息类型,按照 System 定义的优先级排序\n tasks.sort((a, b) => b.priority - a.priority);\n // 执行任务流\n for (const task of tasks) {\n try {\n const result = task.execute(\n this.beforeExecuteHooks,\n this.afterExecuteHooks,\n );\n // 如果是 Promise,只管注册一个 catch 防止崩溃,不 await 它\n if (result instanceof Promise) {\n result.catch((e) =>\n MessageWriter.error(\n e,\n `[Virid Dispatcher]: Async System Error.\\n` +\n `SystemLocation: ${task.hookContext.context.targetClass.name}.${task.hookContext.context.methodName}\\n` +\n `MessageName: ${task.message.constructor.name}\\n` +\n `MessageData: ${JSON.stringify(task.message)}`,\n ),\n );\n }\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Dispatcher]: Sync System Error.\\n` +\n `SystemLocation: ${task.hookContext.context.targetClass.name}.${task.hookContext.context.methodName}\\n` +\n `MessageName: ${task.message.constructor.name}\\n` +\n `MessageData: ${JSON.stringify(task.message)}`,\n );\n }\n }\n }\n private prepareSnapshot() {\n // 交换双缓冲区,锁定当前 Tick 数据\n this.eventHub.flip();\n // 拍下当前待处理任务的快照\n const signalSnapshot = new Set(this.dirtySignalTypes);\n const eventSnapshot = [...this.eventQueue];\n // 立即清空队列,允许 System 在执行时产生新消息进入 staging\n this.dirtySignalTypes.clear();\n this.eventQueue = [];\n return { signalSnapshot, eventSnapshot };\n }\n private clear(eventSnapshot: EventMessage[], signalSnapshot: Set<any>) {\n // 进行清理\n const processedTypes = new Set(signalSnapshot);\n eventSnapshot.forEach((m) => processedTypes.add(m.constructor));\n // 清理 SIGNAL\n this.eventHub.clearSignals(processedTypes);\n // 清理已执行完的 EVENT 队列\n this.eventHub.clearEvents();\n }\n private executeTickHooks(hooks: TickHook[]) {\n const hooksContext: TickHookContext = {\n tick: this.globalTick,\n timestamp: Date.now(),\n payload: this.tickPayload,\n };\n hooks.forEach((h) => h(hooksContext));\n }\n}\n\nexport class ExecutionTask {\n constructor(\n public fn: (...args: any[]) => any,\n public priority: number,\n public message: any, // 运行时可能是 T 或 T[]\n public hookContext: ExecuteHookContext,\n ) {}\n\n private triggerHooks(\n hooks: Array<{ type: MessageIdentifier<any>; handler: ExecuteHook<any> }>,\n ) {\n const sample = Array.isArray(this.message) ? this.message[0] : this.message;\n if (!sample) return;\n\n for (const hook of hooks) {\n if (sample instanceof hook.type) {\n try {\n const result = hook.handler(this.message, this.hookContext);\n if (result instanceof Promise) {\n result.catch((e) => {\n MessageWriter.error(\n e,\n `[Virid Hook] Async Hook Error:\\nIt is prohibited to use asynchronous hooks within Hook:\\n${hook.type.name}`,\n );\n });\n }\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Hook] Hook Execute Failed:\\nTriggered by: ${sample.constructor.name}\\n Registered type: ${hook.type.name}`,\n );\n }\n }\n }\n }\n\n public execute(\n beforeExecuteHooks: Array<{\n type: MessageIdentifier<any>;\n handler: ExecuteHook<any>;\n }>,\n afterExecuteHooks: Array<{\n type: MessageIdentifier<any>;\n handler: ExecuteHook<any>;\n }>,\n ): any {\n //执行前置钩子\n this.triggerHooks(beforeExecuteHooks);\n const runAfter = () => this.triggerHooks(afterExecuteHooks);\n\n try {\n const result = this.fn(this.message);\n\n if (result instanceof Promise) {\n // 异步模式利用 .finally 确保钩子执行\n return result.finally(() => runAfter());\n }\n // 如果是同步,直接后置钩子执行并返回\n runAfter();\n return result;\n } catch (e) {\n // 如果报错了,也执行后置钩子\n runAfter();\n throw e; // 抛给 Dispatcher 的 try-catch 处理\n }\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { MessageWriter } from \"./io\";\nimport { EventMessage, SingleMessage } from \"./message\";\n\n/**\n * @description: 事件中心,存储和分发消息 - 物理隔离 SIGNAL 与 EVENT\n */\nexport class EventHub {\n // --- SIGNAL 存储 (分类池) ---\n private signalActive = new Map<any, any[]>();\n private signalStaging = new Map<any, any[]>();\n // --- EVENT 存储 (顺序流) ---\n private eventActive: any[] = [];\n private eventStaging: any[] = [];\n\n /**\n * 写入逻辑:根据消息策略分流\n */\n push(event: any) {\n // 改用 instanceof 判断,与 Dispatcher 保持一致\n if (event instanceof SingleMessage) {\n const type = event.constructor;\n if (!this.signalStaging.has(type)) this.signalStaging.set(type, []);\n this.signalStaging.get(type)!.push(event);\n } else if (event instanceof EventMessage) {\n // EVENT 按顺序推入队列\n this.eventStaging.push(event);\n } else {\n // 如果既不是信号也不是事件,说明该消息没有继承正确的基类\n MessageWriter.error(\n new Error(\n `[Virid Message] Invalid Message:\\n${event.constructor.name} must extend SingleMessage or EventMessage`,\n ),\n );\n }\n }\n\n /**\n * 翻转缓冲区:在 Dispatcher 的 Tick 开始时调用\n */\n flip() {\n // 物理隔离:让 active 永远指向那一帧的快照,Staging 指向全新的容器\n this.signalActive = this.signalStaging;\n this.signalStaging = new Map(); // 不要用 .clear()\n\n this.eventActive = this.eventStaging;\n this.eventStaging = []; // 不要用 .length = 0\n }\n /**\n * [SIGNAL专用] 批量读取某种类型的信号\n */\n peekSignal<T>(type: new (...args: any[]) => T): T[] {\n return this.signalActive.get(type) || [];\n }\n\n /**\n * [EVENT专用] 获取当前所有待处理的事件流\n */\n getEventStream(): any[] {\n return this.eventActive;\n }\n\n /**\n * [新增] 根据索引精准读取 EVENT 里的某个数据\n * 配合 Dispatcher 逐条分发时使用\n */\n peekEventAt(index: number): any {\n return this.eventActive[index];\n }\n\n /**\n * 清理已处理的内容\n */\n clearSignals(types: Set<any>) {\n types.forEach((type) => this.signalActive.delete(type));\n }\n\n clearEvents() {\n this.eventActive = [];\n }\n\n /**\n * 重置所有池子\n */\n reset() {\n this.signalActive.clear();\n this.signalStaging.clear();\n this.eventActive = [];\n this.eventStaging = [];\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { type SystemTask } from \"../interfaces\";\nimport { MessageWriter } from \"./io\";\n\n/**\n * @description: 消息注册器 - 负责将系统函数或监听器与消息类型关联\n */\nexport class MessageRegistry {\n systemTaskMap = new Map<any, SystemTask[]>();\n\n /**\n * 注册消息并返回一个卸载函数\n * 这种模式能完美适配 Controller 的生命周期销毁\n */\n register(\n messageClass: any,\n systemFn: (...args: any[]) => any,\n priority: number = 0,\n ): () => void {\n const systems = this.systemTaskMap.get(messageClass) || [];\n const existingIndex = systems.findIndex((s) => s.fn === systemFn);\n if (existingIndex === -1) {\n systems.push({ fn: systemFn, priority });\n systems.sort((a, b) => b.priority - a.priority);\n this.systemTaskMap.set(messageClass, systems);\n } else {\n // 检查重复注册\n const funcName = systemFn.name || \"Anonymous\";\n MessageWriter.error(\n new Error(\n `[Virid Error] System Already Registered:\\nClass ${messageClass.name}\\nFunction ${funcName}`,\n ),\n );\n return () => {};\n }\n\n /**\n * 返回卸载函数\n */\n return () => {\n const currentSystems = this.systemTaskMap.get(messageClass);\n if (currentSystems) {\n const index = currentSystems.findIndex((s) => s.fn === systemFn);\n if (index !== -1) {\n currentSystems.splice(index, 1);\n // 如果该消息类型没有任何监听者了,清理掉 Key,保持内存干净\n if (currentSystems.length === 0) {\n this.systemTaskMap.delete(messageClass);\n }\n }\n }\n };\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { Dispatcher } from \"./dispatcher\";\nimport { EventHub } from \"./event-hub\";\nimport {\n type ExecuteHook,\n type TickHook,\n type MessageIdentifier,\n type Middleware,\n} from \"../interfaces\";\nimport { BaseMessage } from \"./message\";\nimport { MessageRegistry } from \"./registry\";\nimport { MessageWriter, activateInstance } from \"./io\";\n\nexport class MessageInternal {\n private eventHub = new EventHub();\n private dispatcher = new Dispatcher(this.eventHub);\n private registry = new MessageRegistry();\n private middlewares: Middleware[] = [];\n\n constructor() {\n // 修改\n activateInstance(this);\n }\n\n useMiddleware(mw: Middleware, front: boolean) {\n this.middlewares.push(mw);\n }\n onBeforeExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front: boolean,\n ) {\n this.dispatcher.addBeforeExecute(type, hook, front);\n }\n onAfterExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front: boolean,\n ) {\n this.dispatcher.addAfterExecute(type, hook, front);\n }\n onBeforeTick(hook: TickHook, front: boolean) {\n this.dispatcher.addBeforeTick(hook, front);\n }\n onAfterTick(hook: TickHook, front: boolean) {\n this.dispatcher.addAfterTick(hook, front);\n }\n\n /**\n * 消息进入系统的唯一入口\n */\n dispatch(message: BaseMessage) {\n // 不是继承自BaseMessage就报错\n if (!(message instanceof BaseMessage)) {\n MessageWriter.error(\n new Error(\n `[Virid Dispatch] Type Error: Message must be an instance of BaseMessage,message:${message}`,\n ),\n );\n return;\n }\n // 运行中间件管道\n this.pipeline(message, () => {\n //看看这个消息的处理函数在this.systemTaskMap里有吗?没有就报错\n if (!this.registry.systemTaskMap.has(message.constructor)) {\n MessageWriter.error(\n new Error(\n `[Virid Dispatch] No handler for message: ${message.constructor.name}`,\n ),\n );\n return;\n }\n // 存入 Hub (根据 Single/Event 策略存入不同池子)\n this.eventHub.push(message);\n\n // 标记 Dispatcher 为脏,并尝试触发 Tick\n this.dispatcher.markDirty(message);\n // 启动调度循环\n this.dispatcher.tick(this.registry.systemTaskMap);\n });\n }\n\n private pipeline(message: BaseMessage, finalAction: () => void) {\n let index = 0;\n const next = () => {\n if (index < this.middlewares.length) {\n this.middlewares[index++](message, next);\n } else {\n finalAction();\n }\n };\n next();\n }\n\n register(\n messageClass: any,\n systemFn: (...args: any[]) => any,\n priority: number = 0,\n ): () => void {\n return this.registry.register(messageClass, systemFn, priority);\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\n\nimport { Newable } from \"./interfaces\";\n\ninterface Binding {\n type: \"singleton\" | \"transient\";\n ctor: Newable<any>;\n}\n\nexport class ViridContainer {\n private bindings = new Map<any, Binding>();\n private singletonInstances = new Map<any, any>();\n\n public bind<T>(identifier: Newable<T>) {\n const binding: Binding = { type: \"transient\", ctor: identifier };\n this.bindings.set(identifier, binding);\n\n return {\n toSelf: () => ({\n inSingletonScope: () => {\n binding.type = \"singleton\";\n return {\n onActivation: (fn: any) => {},\n };\n },\n }),\n };\n }\n\n public get<T>(identifier: Newable<T>, onActivate: (instance: T) => T): T {\n const binding = this.bindings.get(identifier);\n if (!binding) {\n throw new Error(\n `[Virid Container] Unbound Constructor: No binding found for ${identifier.name}`,\n );\n }\n const TargetCtor = binding.ctor;\n\n // 处理单例逻辑\n if (binding.type === \"singleton\") {\n if (!this.singletonInstances.has(identifier)) {\n // 第一次创建:实例化 -> 走流水线加工 -> 存入成品\n const rawInstance = new TargetCtor();\n const processedInstance = onActivate(rawInstance);\n this.singletonInstances.set(identifier, processedInstance);\n }\n // 后续直接返回加工后的成品\n return this.singletonInstances.get(identifier);\n }\n\n // 处理多例(Transient)逻辑\n // 每次都创建新实例并走一遍流水线加工\n const instance = new TargetCtor();\n return onActivate(instance);\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { type ViridApp } from \"./app\";\nimport { ErrorMessage, InfoMessage, WarnMessage } from \"./core\";\nimport { type SystemContext } from \"./interfaces\";\nlet globalSwitch = true;\n\nexport function toggleSwitch(enable: boolean) {\n globalSwitch = enable;\n}\n\n/**\n * 简单的色彩辅助函数\n */\nconst clr = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n gray: \"\\x1b[90m\",\n bold: \"\\x1b[1m\",\n green: \"\\x1b[32m\",\n};\n\n/**\n * 为全局处理器包装上下文\n */\nfunction withContext(\n params: any,\n fn: (...args: any[]) => any,\n methodName: string,\n) {\n const context: SystemContext = {\n params: params, // 参数类型\n targetClass: Object, // 指向全局 Object 或特定标记类\n methodName: methodName,\n originalMethod: fn,\n };\n (fn as any).ccsContext = context;\n return fn;\n}\n/**\n * 注册全局默认信息处理系统\n */\nconst globalInfoHandler = (err: InfoMessage) => {\n if (!globalSwitch) return;\n const header = `${clr.green}${clr.bold} ✔ [Virid Info] ${clr.reset}`;\n const context = `${clr.magenta}${err.context}${clr.reset}`;\n\n console.log(\n `${header}${clr.gray}Global Info Caught:${clr.reset}\\n` +\n ` ${clr.green}Details:${clr.reset}`,\n err.context || \"unknown Info\",\n );\n};\n\n/**\n * 注册全局默认错误处理系统\n */\nconst globalErrorHandler = (err: ErrorMessage) => {\n if (!globalSwitch) return;\n const header = `${clr.red}${clr.bold} ✖ [Virid Error] ${clr.reset}`;\n const context = `${clr.magenta}${err.context}${clr.reset}`;\n\n console.error(\n `${header}${clr.gray}Global Error Caught:${clr.reset}\\n` +\n ` ${clr.red}Context:${clr.reset} ${context}\\n` +\n ` ${clr.red}Details:${clr.reset}`,\n err.error || err || \"unknown Error\",\n );\n};\n\n/**\n * 注册全局默认警告处理系统\n */\nconst globalWarnHandler = (warn: WarnMessage) => {\n if (!globalSwitch) return;\n const header = `${clr.yellow}${clr.bold} ⚠ [Virid Warn] ${clr.reset}`;\n const context = `${clr.cyan}${warn.context}${clr.reset}`;\n\n console.warn(\n `${header}${clr.gray}Global Warn Caught:${clr.reset}\\n` +\n ` ${clr.yellow}Context:${clr.reset} ${context}`,\n );\n};\n\n/**\n * 激活真正的 App 实例\n */\nexport function initializeGlobalSystems(app: ViridApp) {\n app.register(\n WarnMessage,\n withContext(WarnMessage, globalWarnHandler, \"GlobalWarnHandler\"),\n -999,\n );\n app.register(\n ErrorMessage,\n withContext(ErrorMessage, globalErrorHandler, \"GlobalErrorHandler\"),\n -999,\n );\n app.register(\n InfoMessage,\n withContext(InfoMessage, globalInfoHandler, \"GlobalInfoHandler\"),\n -999,\n );\n activeApp = app;\n}\nexport interface IViridApp {\n get(identifier: any): any;\n}\n\nlet activeApp: IViridApp | null = null;\n\n/**\n * viridApp 代理\n */\nexport const viridApp: IViridApp = new Proxy({} as IViridApp, {\n get(_, prop: keyof IViridApp) {\n return (...args: any[]) => {\n // 检查实例是否存在\n if (!activeApp) {\n console.warn(\n `[Virid Vue] App method \"${String(prop)}\" called before initialization.`,\n );\n\n return;\n }\n\n // 正常转发调用\n // 使用 Reflect 确保 this 指向正确,或者直接从 activeApp 调用\n const targetMethod = activeApp[prop];\n if (typeof targetMethod === \"function\") {\n return Reflect.apply(targetMethod, activeApp, args);\n }\n };\n },\n});\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { ViridContainer } from \"./container\";\nimport {\n type ExecuteHook,\n type MessageIdentifier,\n type Middleware,\n type TickHook,\n type Newable,\n} from \"./interfaces\";\nimport { type BaseMessage, MessageWriter, MessageInternal } from \"./core\";\nimport { bindObservers } from \"./decorators\";\nimport { initializeGlobalSystems } from \"./utils\";\n\nexport interface ViridPlugin<T = void> {\n name: string;\n install: (app: ViridApp, options: T) => void;\n}\n\n// 维护一个已安装插件的列表,防止重复安装\nconst installedPlugins = new Set<string>();\n/**\n * 创建 virid 核心实例\n */\nexport class ViridApp {\n public container: ViridContainer = new ViridContainer();\n private messageInternal: MessageInternal = new MessageInternal();\n // Core 内部提供一个中间件数组\n private activationHooks: Array<(instance: any) => any> = [];\n public addActivationHook(hook: (instance: any) => any) {\n this.activationHooks.push(hook);\n }\n\n public get<T>(identifier: Newable<T>): T {\n if (identifier.length > 0) {\n MessageWriter.error(\n new Error(\n `[Virid Container] Violation: Component \"${identifier.name}\" should not have constructor arguments. Dependency Injection is only allowed in Systems.`,\n ),\n );\n }\n return this.container.get(identifier, (ins) => this.handleActivation(ins));\n }\n\n private handleActivation<T>(instance: T): T {\n if (!instance) return instance;\n\n // 前一个 Hook 的输出是后一个 Hook 的输入\n return this.activationHooks.reduce((currentInstance, hook) => {\n try {\n const nextInstance = hook(currentInstance);\n // 如果 Hook 忘记写 return,则保留上一步的结果\n // 同时,弹一个警告\n if (nextInstance === undefined) {\n MessageWriter.warn(\n `[Virid Container] Hook Does Bot Return A Value: Hook \"${hook.name}\" should return a instance to continue.`,\n );\n }\n return nextInstance !== undefined ? nextInstance : currentInstance;\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Container] Activation Hook Failed`,\n );\n return currentInstance;\n }\n }, instance);\n }\n /**\n * 绑定多例 (Controller 通常是多例)\n */\n bindController<T>(identifier: Newable<T>) {\n this.container.bind(identifier).toSelf();\n // 保持链式调用风格,即便现在后面没接东西\n return { inSingletonScope: () => ({ onActivation: () => {} }) };\n }\n\n /**\n * 绑定单例 (Component 是单例)\n */\n bindComponent<T>(identifier: Newable<T>) {\n this.container.bind(identifier).toSelf().inSingletonScope();\n return { onActivation: () => {} };\n }\n useMiddleware(mw: Middleware, front = false) {\n this.messageInternal.useMiddleware(mw, front);\n }\n onBeforeExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front = false,\n ) {\n this.messageInternal.onBeforeExecute(type, hook, front);\n }\n onAfterExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front = false,\n ) {\n this.messageInternal.onAfterExecute(type, hook, front);\n }\n onBeforeTick(hook: TickHook, front = false) {\n this.messageInternal.onBeforeTick(hook, front);\n }\n onAfterTick(hook: TickHook, front = false) {\n this.messageInternal.onAfterTick(hook, front);\n }\n register(\n messageClass: any,\n systemFn: (...args: any[]) => any,\n priority: number = 0,\n ): () => void {\n return this.messageInternal.register(messageClass, systemFn, priority);\n }\n use<T>(plugin: ViridPlugin<T>, options: T): this {\n if (installedPlugins.has(plugin.name)) {\n MessageWriter.warn(\n `[Virid Plugin] Duplicate Installation: Plugin ${plugin.name} has already been installed.`,\n );\n return this;\n }\n try {\n plugin.install(this, options);\n installedPlugins.add(plugin.name);\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Plugin]: Install Failed: ${plugin.name}`,\n );\n }\n return this;\n }\n}\n\nexport const viridApp = new ViridApp();\nviridApp.addActivationHook(bindObservers);\ninitializeGlobalSystems(viridApp);\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\n\nexport const VIRID_METADATA = {\n SYSTEM: \"virid:core:system\",\n MESSAGE: \"virid:core:message\",\n CONTROLLER: \"virid:core:controller\",\n COMPONENT: \"virid:core:component\",\n SAFE: \"virid:core:safe\",\n OBSERVER: \"virid:core:observer\",\n} as const;\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { viridApp } from \"../app\";\nimport {\n BaseMessage,\n MessageWriter,\n EventMessage,\n SingleMessage,\n} from \"../core\";\nimport { VIRID_METADATA } from \"./constant\";\nimport {\n type SystemContext,\n type Newable,\n type SystemParams,\n type MessageMetadata,\n type ObserverMetadata,\n type SafeMetadata,\n} from \"../interfaces\";\n// 统一处理返回值:System 可以直接 return 一个消息来实现“链式反应”\nexport const handleResult = (res: any) => {\n if (!res) return;\n const messages = Array.isArray(res) ? res : [res];\n messages.forEach((m) => {\n if (m instanceof BaseMessage) {\n MessageWriter.write(m);\n } else {\n MessageWriter.warn(\n `[Virid HandleResult] Invalid Return Type: Must return Message or Message[].`,\n );\n }\n });\n};\n\n/**\n * @description: 系统装饰器\n * @param priority 优先级,数值越大越早执行\n */\nexport function System(\n params: SystemParams = {\n priority: 0,\n messageClass: null,\n },\n) {\n return (target: any, key: string, descriptor: PropertyDescriptor) => {\n if (!(typeof target === \"function\")) {\n const error = new Error(\n `[Virid System] Method Type Error:\\nThe Method ${key} is not a static method, please check if there is a static keyword tag`,\n );\n MessageWriter.error(error);\n return;\n }\n const originalMethod = descriptor.value;\n const types = Reflect.getMetadata(\"design:paramtypes\", target, key);\n const messageMetadata: MessageMetadata =\n Reflect.getMetadata(VIRID_METADATA.MESSAGE, target, key) || null;\n\n if (!types) {\n const error = new Error(\n `[Virid System] System Parameter Loss:\\nUnable to recognize system parameters, please confirm if import \"reflection-metadata\" was introduced at the beginning!`,\n );\n MessageWriter.error(error);\n return;\n }\n // 检查是否有参数类型丢失\n if (types.some((t: any) => t === undefined)) {\n const error =\n new Error(`[Virid System] Parameter Metadata Loss in \"${key}\": \n One or more parameters have 'undefined' types. \n This usually happens when you forget to add a type annotation to a decorated parameter.\n Check parameter at index: ${types.indexOf(undefined)}`);\n\n MessageWriter.error(error);\n return;\n }\n // 不能同时使用@message() 和 SystemParams\n if (params.messageClass && messageMetadata) {\n MessageWriter.error(\n new Error(\n `[Virid System] Multiple Messages Are Not Allowed: Cannot use @ message() and SystemParams simultaneously in ${key}`,\n ),\n );\n return;\n }\n // @message() 和 SystemParams至少得有一个\n if (!params.messageClass && !messageMetadata) {\n MessageWriter.error(\n new Error(\n `[Virid System] System Parameter Loss:\\nPlease declare the message type using the Message decorator`,\n ),\n );\n return;\n }\n\n const wrappedSystem = (currentMessage: EventMessage | SingleMessage[]) => {\n const args = types.map((type: any, index: number) => {\n // 先看看这个参数是不是标记过的Event\n if (messageMetadata && messageMetadata.index == index) {\n const { messageClass, single } = messageMetadata;\n // 基础校验:判断当前投递的消息实例是否属于装饰器声明的类或其子类\n const sample = Array.isArray(currentMessage)\n ? currentMessage[0]\n : currentMessage;\n if (!(sample instanceof messageClass)) {\n const receivedName = (sample as object).constructor.name;\n // 如果类型不匹配,说明 Dispatcher 路由逻辑或元数据配置有问题\n throw new Error(\n `[Virid System] Type Mismatch: Expected ${messageClass.name}, but received ${receivedName}`,\n );\n }\n // 处理 SingleMessage (合并且批处理类型)\n if (sample instanceof SingleMessage) {\n // 如果用户标记了 single: true,则只取最后一条(最新的一条)\n if (single) {\n return Array.isArray(currentMessage)\n ? currentMessage[currentMessage.length - 1]\n : currentMessage;\n }\n // 否则默认返回整个数组(批处理模式)\n return Array.isArray(currentMessage)\n ? currentMessage\n : [currentMessage];\n }\n // 处理 EventMessage (顺序单发类型)\n if (sample instanceof EventMessage) {\n return currentMessage;\n }\n throw new Error(\n `[Virid System] unknown Message Types: Message ${messageClass.name} is not a subclass of SingleMessage or EventMessage!`,\n );\n }\n // 处理普通的依赖注入\n const param = viridApp.get(type);\n if (!param) {\n throw new Error(\n `[Virid System] unknown Inject Data Types: ${type.name} is not registered in the container!`,\n );\n }\n return param;\n });\n\n // 执行业务逻辑\n const result = originalMethod.apply(target, args);\n\n return result instanceof Promise\n ? result.then(handleResult)\n : handleResult(result);\n };\n // 给包装后的函数挂载上下文信息(供 Dispatcher 读取)\n const systemContext: SystemContext = {\n params: types,\n targetClass: target,\n methodName: key,\n originalMethod: originalMethod,\n };\n (wrappedSystem as any).systemContext = systemContext;\n // 修改方法定义\n descriptor.value = wrappedSystem;\n // 注册到调度中心\n const messageClass = params.messageClass || messageMetadata.messageClass;\n viridApp.register(messageClass, wrappedSystem, params.priority);\n };\n}\n\n/**\n * @description: 标记参数为 MessageReader 并锁定其消息类型\n */\nexport function Message<T extends BaseMessage>(\n messageClass: Newable<T>,\n single = true,\n) {\n return (target: any, key: string, index: number) => {\n if (Reflect.hasOwnMetadata(VIRID_METADATA.MESSAGE, target, key)) {\n MessageWriter.error(\n new Error(\n `[Virid Message] Multiple Messages Are Not Allowed: ${key} has multiple @Message() decorators!`,\n ),\n );\n return;\n }\n const messageMetadata: MessageMetadata = {\n index,\n messageClass,\n single,\n };\n Reflect.defineMetadata(\n VIRID_METADATA.MESSAGE,\n messageMetadata,\n target,\n key,\n );\n };\n}\n\n/**\n * @description: 标识controller或者组件的方法是否是安全的,可被其他controller直接调用\n */\nexport function Safe() {\n return (target: any, key: string, _descriptor: PropertyDescriptor) => {\n // 标识这个方法是“只读安全”的\n // 只需要标记这个 key\n const safeMethods: SafeMetadata =\n Reflect.getMetadata(VIRID_METADATA.SAFE, target) || new Set<string>();\n safeMethods.add(key);\n // 存回到 prototype\n Reflect.defineMetadata(VIRID_METADATA.SAFE, safeMethods, target);\n };\n}\n\n/**\n * @description: 标识Component里的这个属性被改了之后需要调用一个回调\n */\nexport function Observer(\n callback: (oldVal: any, newVale: any) => void | BaseMessage | BaseMessage[],\n) {\n return (target: any, propertyKey: string) => {\n // 记录哪些属性需要变成响应式\n const observerMetadata: ObserverMetadata =\n Reflect.getMetadata(VIRID_METADATA.OBSERVER, target) || [];\n observerMetadata.push({ propertyKey, callback });\n Reflect.defineMetadata(VIRID_METADATA.OBSERVER, observerMetadata, target);\n };\n}\n\n/**\n * @description: 标记Controller身份\n */\nexport function Controller() {\n return (target: any) => {\n // 打上身份标签\n Reflect.defineMetadata(VIRID_METADATA.CONTROLLER, true, target);\n };\n}\n/**\n * @description: 标记Component身份\n */\nexport function Component() {\n return (target: any) => {\n // 打上组件标签\n Reflect.defineMetadata(VIRID_METADATA.COMPONENT, true, target);\n };\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { type ObserverItem } from \"../interfaces\";\nimport { handleResult } from \"./ccs\";\nimport { VIRID_METADATA } from \"./constant\";\nconst ARRAY_MUTABLE_METHODS = [\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n \"sort\",\n \"reverse\",\n];\nexport function bindObservers(instance: any) {\n if (!instance || typeof instance !== \"object\") return instance;\n if (\n Object.prototype.hasOwnProperty.call(\n instance,\n \"__virid_observer_processed__\",\n )\n )\n return instance;\n\n Object.defineProperty(instance, \"__virid_observer_processed__\", {\n value: true,\n enumerable: false,\n configurable: true,\n });\n\n const observerConfigs: ObserverItem[] =\n Reflect.getMetadata(VIRID_METADATA.OBSERVER, instance) || [];\n\n observerConfigs.forEach(({ propertyKey, callback }) => {\n // 创建逻辑单元:一个闭包 Box\n const box = { value: instance[propertyKey] };\n const logicProxy = new Proxy(box, {\n get(target, prop) {\n const value = target.value;\n\n // 数组变动拦截\n if (\n Array.isArray(value) &&\n ARRAY_MUTABLE_METHODS.includes(prop as string)\n ) {\n return (...args: any[]) => {\n const oldVal = [...value];\n const result = (value as any)[prop].apply(value, args);\n const observerResult = callback.call(instance, oldVal, value);\n handleResult(observerResult);\n\n return result;\n };\n }\n return value;\n },\n set(target, _prop, newVal) {\n const oldVal = target.value;\n if (newVal === oldVal) return true;\n\n target.value = newVal;\n const result = callback.call(instance, oldVal, newVal);\n handleResult(result);\n return true;\n },\n });\n // 在 bindObservers 的 forEach 内部\n const getter = () => logicProxy.value;\n (getter as any).__virid_box__ = box; // 重点:把闭包里的 box 暴露给后续插件\n\n Object.defineProperty(instance, propertyKey, {\n get: getter, // 纯转发\n set: (v) => {\n logicProxy.value = v;\n }, // 纯转发\n enumerable: true,\n configurable: true,\n });\n\n // 初次递归扫描\n if (box.value && typeof box.value === \"object\") {\n bindObservers(box.value);\n }\n });\n\n // 处理未标记但属于子组件的对象\n Reflect.ownKeys(instance).forEach((key) => {\n if (key === \"__virid_observer_processed__\") return;\n const desc = Object.getOwnPropertyDescriptor(instance, key);\n if (desc && desc.get) return;\n const val = instance[key];\n if (val && typeof val === \"object\") {\n bindObservers(val);\n }\n });\n return instance;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nexport type Newable<\n TInstance = unknown,\n TArgs extends unknown[] = any[],\n> = new (...args: TArgs) => TInstance;\n\nexport interface AppConfig {\n enableLog: boolean;\n}\n\nconst defaultConfig = {\n enableLog: true,\n};\nexport { defaultConfig };\n"],"mappings":"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","names":["index_exports","__export","BaseMessage","Component","Controller","ErrorMessage","EventMessage","InfoMessage","Message","MessageInternal","MessageRegistry","MessageWriter","Observer","Safe","SingleMessage","System","VIRID_METADATA","WarnMessage","activateInstance","bindObservers","createVirid","defaultConfig","handleResult","publisher","__toCommonJS","BaseMessage","send","args","MessageWriter","write","_BaseMessage","SingleMessage","__kind","_SingleMessage","EventMessage","_EventMessage","ErrorMessage","error","context","_ErrorMessage","WarnMessage","_WarnMessage","InfoMessage","_InfoMessage","activeInstance","activateInstance","instance","publisher","Proxy","get","_","prop","message","console","error","name","dispatch","Reflect","MessageWriter","write","target","args","e","context","Error","String","ErrorMessage","warn","WarnMessage","info","InfoMessage","_MessageWriter","Dispatcher","eventHub","dirtySignalTypes","Set","eventQueue","isRunning","globalTick","internalDepth","tickPayload","beforeExecuteHooks","afterExecuteHooks","beforeTickHooks","afterTickHooks","addBeforeExecute","type","hook","front","unshift","handler","push","addAfterExecute","addBeforeTick","addAfterTick","markDirty","message","EventMessage","SingleMessage","add","tick","systemTaskMap","size","length","clear","reset","MessageWriter","error","Error","queueMicrotask","signalSnapshot","eventSnapshot","executeTickHooks","snapshot","prepareSnapshot","tasks","collectTasks","executeTasks","e","msg","get","forEach","s","ExecutionTask","fn","priority","context","systemContext","payload","signalFnSet","has","peekSignal","sort","a","b","task","result","execute","Promise","catch","hookContext","targetClass","name","methodName","JSON","stringify","flip","processedTypes","m","clearSignals","clearEvents","hooks","hooksContext","timestamp","Date","now","h","_Dispatcher","triggerHooks","sample","Array","isArray","runAfter","__name","finally","_ExecutionTask","EventHub","signalActive","Map","signalStaging","eventActive","eventStaging","push","event","SingleMessage","type","has","set","get","EventMessage","MessageWriter","error","Error","name","flip","peekSignal","getEventStream","peekEventAt","index","clearSignals","types","forEach","delete","clearEvents","reset","clear","_EventHub","MessageRegistry","systemTaskMap","Map","register","messageClass","systemFn","priority","systems","get","findIndex","s","fn","push","sort","a","b","set","funcName","name","MessageWriter","error","Error","currentSystems","index","splice","length","delete","_MessageRegistry","MessageInternal","eventHub","EventHub","dispatcher","Dispatcher","registry","MessageRegistry","middlewares","activateInstance","useMiddleware","mw","front","push","onBeforeExecute","type","hook","addBeforeExecute","onAfterExecute","addAfterExecute","onBeforeTick","addBeforeTick","onAfterTick","addAfterTick","dispatch","message","BaseMessage","MessageWriter","error","Error","pipeline","systemTaskMap","has","name","markDirty","tick","finalAction","index","next","__name","length","register","messageClass","systemFn","priority","_MessageInternal","ViridContainer","bindings","Map","singletonInstances","bind","identifier","binding","type","ctor","set","toSelf","__name","inSingletonScope","onActivation","fn","get","onActivate","Error","name","TargetCtor","has","rawInstance","processedInstance","instance","_ViridContainer","globalSwitch","toggleSwitch","enable","clr","reset","red","yellow","blue","magenta","cyan","gray","bold","green","withContext","params","fn","methodName","context","targetClass","Object","originalMethod","ccsContext","globalInfoHandler","__name","err","header","console","log","globalErrorHandler","error","globalWarnHandler","warn","initializeGlobalSystems","app","register","WarnMessage","ErrorMessage","InfoMessage","activeApp","viridApp","Proxy","get","_","prop","args","String","targetMethod","Reflect","apply","installedPlugins","Set","ViridApp","container","ViridContainer","messageInternal","MessageInternal","activationHooks","addActivationHook","hook","push","get","identifier","length","MessageWriter","error","Error","name","ins","handleActivation","instance","reduce","currentInstance","nextInstance","undefined","warn","e","bindController","bind","toSelf","inSingletonScope","__name","onActivation","bindComponent","useMiddleware","mw","front","onBeforeExecute","type","onAfterExecute","onBeforeTick","onAfterTick","register","messageClass","systemFn","priority","use","plugin","options","has","install","add","_ViridApp","viridApp","bindObservers","initializeGlobalSystems","VIRID_METADATA","SYSTEM","MESSAGE","CONTROLLER","COMPONENT","SAFE","OBSERVER","handleResult","__name","res","Array","isArray","forEach","m","BaseMessage","MessageWriter","write","warn","System","params","priority","messageClass","target","key","descriptor","error","Error","originalMethod","value","types","Reflect","getMetadata","messageMetadata","VIRID_METADATA","MESSAGE","some","t","undefined","indexOf","wrappedSystem","currentMessage","args","map","type","index","single","sample","receivedName","name","SingleMessage","length","EventMessage","param","viridApp","get","result","apply","Promise","then","systemContext","targetClass","methodName","register","Message","hasOwnMetadata","defineMetadata","Safe","_descriptor","safeMethods","SAFE","Set","add","Observer","callback","propertyKey","observerMetadata","OBSERVER","push","Controller","CONTROLLER","Component","COMPONENT","ARRAY_MUTABLE_METHODS","bindObservers","instance","Object","prototype","hasOwnProperty","call","defineProperty","value","enumerable","configurable","Reflect","getMetadata","VIRID_METADATA","OBSERVER","forEach","propertyKey","callback","box","logicProxy","Proxy","get","target","prop","Array","isArray","includes","args","oldVal","result","apply","observerResult","handleResult","set","_prop","newVal","getter","__name","__virid_box__","v","ownKeys","key","desc","getOwnPropertyDescriptor","val","defaultConfig","enableLog","createVirid","config","defaultConfig","toggleSwitch","enableLog","viridApp"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/interfaces/common.ts","../src/core/io.ts","../src/core/message.ts","../src/core/registry.ts","../src/core/staging.ts","../src/core/dispatcher.ts","../src/core/engine.ts","../src/decorators/constant.ts","../src/decorators/decorator.ts","../src/decorators/bind.ts","../src/container.ts","../src/app.ts","../src/utils.ts"],"sourcesContent":["/*\n * Copyright (c) 2026-present Ailrid\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n *\n * Description: Virid Core Dispatcher - The heart of CCS Architecture.\n */\nexport * from \"./interfaces\";\nexport * from \"./core\";\nexport * from \"./decorators\";\nexport * from \"./app\";\n\nimport { ViridApp } from \"./app\";\nimport { AppConfig, defaultConfig } from \"./interfaces\";\nimport { toggleSwitch, registerBasicSystems } from \"./utils\";\nimport { bindObservers } from \"./decorators/bind\";\n\nexport function createVirid(config: AppConfig = defaultConfig): ViridApp {\n config = { ...defaultConfig, ...config };\n const app = new ViridApp(config.maxDepth!, config.manual!);\n\n registerBasicSystems(app);\n toggleSwitch(config.enableLog!);\n app.onActivate(bindObservers);\n const self = app;\n app.spawn(self);\n return app;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nexport type Newable<\n TInstance = unknown,\n TArgs extends unknown[] = any[],\n> = new (...args: TArgs) => TInstance;\n\nexport interface AppConfig {\n maxDepth?: number;\n enableLog?: boolean;\n manual?: boolean;\n}\n\nconst defaultConfig: AppConfig = {\n maxDepth: 100,\n enableLog: true,\n manual: false,\n};\nexport { defaultConfig };\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { type MessageEngine } from \"./engine\";\nimport {\n type BaseMessage,\n ErrorMessage,\n InfoMessage,\n WarnMessage,\n} from \"./message\";\nimport { type Newable } from \"../interfaces\";\n\nlet activeInstance: MessageEngine | null = null;\nexport function activateInstance(instance: MessageEngine) {\n activeInstance = instance;\n}\n\nfunction dispatch(message: BaseMessage): void {\n if (activeInstance) {\n activeInstance.dispatch(message);\n } else {\n console.error(\"[Virid MessageWriter] No active instance found.\");\n }\n}\n\nexport class MessageWriter {\n public static write<T extends BaseMessage, K extends Newable<T>>(\n target: K | T,\n ...args: ConstructorParameters<K>\n ): void {\n const instance =\n typeof target === \"function\"\n ? new (target as any)(...args)\n : (target as T);\n\n dispatch(instance);\n }\n\n public static error(e: Error, context: string = \"\"): void {\n this.write(new ErrorMessage(e, context));\n }\n\n public static warn(context: string): void {\n this.write(new WarnMessage(context));\n }\n public static info(context: string): void {\n this.write(new InfoMessage(context));\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { Newable } from \"../interfaces\";\nimport { MessageWriter } from \"./io\";\n\nexport abstract class BaseMessage {\n static send<T extends Newable<any>>(\n this: T,\n ...args: ConstructorParameters<T>\n ) {\n MessageWriter.write(this as any, ...args);\n }\n}\n\nexport abstract class SingleMessage extends BaseMessage {\n constructor() {\n super();\n }\n}\n\nexport abstract class EventMessage extends BaseMessage {\n constructor() {\n super();\n }\n}\n\nexport class ErrorMessage extends EventMessage {\n constructor(\n public readonly error: Error,\n public readonly context?: string,\n ) {\n super();\n }\n}\n\nexport class WarnMessage extends EventMessage {\n constructor(public readonly context: string) {\n super();\n }\n}\n\nexport class InfoMessage extends EventMessage {\n constructor(public readonly context: string) {\n super();\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { type SystemTask } from \"../interfaces\";\nimport { MessageWriter } from \"./io\";\n\nexport class MessageRegistry {\n systemTaskMap = new Map<any, SystemTask[]>();\n\n /**\n * Register the message and corresponding system and return an uninstallation function\n */\n register(\n messageClass: any,\n systemFn: (...args: any[]) => any,\n priority: number = 0,\n ): () => void {\n const systems = this.systemTaskMap.get(messageClass) || [];\n const existingIndex = systems.findIndex(\n (s) =>\n (s.fn as any).systemContext.originalMethod ===\n (systemFn as any).systemContext.originalMethod,\n );\n if (existingIndex === -1) {\n systems.push({ fn: systemFn, priority });\n systems.sort((a, b) => b.priority - a.priority);\n this.systemTaskMap.set(messageClass, systems);\n } else {\n // Check for duplicate registrations\n const funcName = (systemFn as any).methodName;\n const targetClass = (systemFn as any).targetClass;\n MessageWriter.error(\n new Error(\n `[Virid Error] System Already Registered: Message Class ${messageClass.name}, Location ${targetClass.name}.${funcName}`,\n ),\n );\n return () => {};\n }\n\n return () => {\n const currentSystems = this.systemTaskMap.get(messageClass);\n if (currentSystems) {\n const index = currentSystems.findIndex((s) => s.fn === systemFn);\n if (index !== -1) {\n currentSystems.splice(index, 1);\n // 如果该消息类型没有任何监听者了,清理掉 Key,保持内存干净\n if (currentSystems.length === 0) {\n this.systemTaskMap.delete(messageClass);\n }\n }\n }\n };\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { MessageWriter } from \"./io\";\nimport { type BaseMessage, EventMessage, SingleMessage } from \"./message\";\n\nexport class Staging {\n public signalActive = new Map<any, any[]>();\n public eventActive: any[] = [];\n private signalStaging = new Map<any, any[]>();\n private eventStaging: any[] = [];\n\n stage(event: BaseMessage) {\n if (event instanceof SingleMessage) {\n const type = event.constructor;\n if (!this.signalStaging.has(type)) this.signalStaging.set(type, []);\n this.signalStaging.get(type)!.push(event);\n } else if (event instanceof EventMessage) {\n this.eventStaging.push(event);\n } else {\n MessageWriter.error(\n new Error(\n `[Virid Message] Invalid Message:\\n${event.constructor.name} must extend SingleMessage or EventMessage`,\n ),\n );\n }\n }\n\n flip() {\n this.signalActive = this.signalStaging;\n this.eventActive = this.eventStaging;\n this.signalStaging = new Map();\n this.eventStaging = [];\n }\n\n clearSignals() {\n // types.forEach((type) => this.signalActive.delete(type));\n this.signalActive = new Map();\n }\n\n clearEvents() {\n this.eventActive = [];\n }\n \n isEmpty() {\n return this.signalStaging.size === 0 && this.eventStaging.length === 0;\n }\n\n /**\n * 重置所有池子\n */\n reset() {\n this.signalActive = new Map();\n this.signalStaging = new Map();\n this.eventStaging = [];\n this.eventActive = [];\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\n\nimport { MessageWriter } from \"./io\";\nimport {\n type ExecuteHook,\n type ExecuteHookContext,\n type SystemTask,\n type MessageIdentifier,\n type SystemContext,\n type TickHook,\n type TickHookContext,\n} from \"../interfaces\";\nimport { type BaseMessage } from \"./message\";\nimport { Staging } from \"./staging\";\n\nexport class Dispatcher {\n constructor(private maxDepth: number) {}\n private isRunning = false;\n private globalTick = 0;\n private internalDepth = 0;\n private staging = new Staging();\n\n private tickPayload: { [key: string]: any } = {};\n\n private beforeExecuteHooks: Array<{\n type: MessageIdentifier<any>;\n handler: ExecuteHook<any>;\n }> = [];\n private afterExecuteHooks: Array<{\n type: MessageIdentifier<any>;\n handler: ExecuteHook<any>;\n }> = [];\n\n private beforeTickHooks: Array<TickHook> = [];\n private afterTickHooks: Array<TickHook> = [];\n\n public addBeforeExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front: boolean,\n ) {\n if (front)\n this.beforeExecuteHooks.unshift({\n type,\n handler: hook as ExecuteHook<any>,\n });\n else\n this.beforeExecuteHooks.push({ type, handler: hook as ExecuteHook<any> });\n }\n public addAfterExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front: boolean,\n ) {\n if (front)\n this.afterExecuteHooks.unshift({\n type,\n handler: hook as ExecuteHook<any>,\n });\n else\n this.afterExecuteHooks.push({ type, handler: hook as ExecuteHook<any> });\n }\n public addBeforeTick(hook: TickHook, front: boolean) {\n if (front) this.beforeTickHooks.unshift(hook);\n else this.beforeTickHooks.push(hook);\n }\n public addAfterTick(hook: TickHook, front: boolean) {\n if (front) this.afterTickHooks.unshift(hook);\n else this.afterTickHooks.push(hook);\n }\n\n /**\n * Marking dirty data, Determine which pool to enter based on the base class\n */\n public stage(message: BaseMessage) {\n this.staging.stage(message);\n }\n\n public tick(systemTaskMap: Map<any, SystemTask[]>) {\n if (this.isRunning || this.staging.isEmpty()) return;\n\n if (this.internalDepth > this.maxDepth) {\n this.internalDepth = 0;\n this.staging.reset();\n console.error(\n new Error(\n `[Virid Dispatcher] Deadlock: Max depth reached ${this.maxDepth}, Possible infinite loop detected. The dispatcher will stop processing this tick.`,\n ),\n );\n return;\n }\n\n this.isRunning = true;\n this.internalDepth++;\n\n queueMicrotask(() => {\n try {\n // Execute tick hook, only triggered on the first time\n if (this.internalDepth == 1) {\n this.tickPayload = {};\n this.executeTickHooks(this.beforeTickHooks);\n }\n // Preparing to start execution\n this.staging.flip();\n // The tasks that should be performed to collect this tick\n const tasks = this.collectTasks(systemTaskMap);\n // Execute the task for this frame\n this.executeTasks(tasks);\n } catch (e) {\n MessageWriter.error(e as Error, \"[Virid Dispatcher] Unhandled Error\");\n } finally {\n // Release the lock and attempt the next round of execution\n this.isRunning = false;\n // Enter the next round of micro tick\n if (!this.staging.isEmpty()) {\n this.tick(systemTaskMap);\n } else {\n // Reset internal status\n this.staging.reset();\n this.internalDepth = 0;\n this.executeTickHooks(this.afterTickHooks);\n this.globalTick++;\n }\n }\n });\n }\n public tickSync(systemTaskMap: Map<any, SystemTask[]>) {\n if (this.staging.isEmpty()) return;\n\n this.internalDepth = 0;\n this.tickPayload = {};\n\n this.executeTickHooks(this.beforeTickHooks);\n\n while (!this.staging.isEmpty()) {\n if (this.internalDepth > this.maxDepth) {\n this.staging.reset();\n this.internalDepth = 0;\n console.error(\n new Error(\n `[Virid Dispatcher] Deadlock: Max depth reached ${this.maxDepth}, Possible infinite loop detected. Ticking aborted.`,\n ),\n );\n return;\n }\n this.internalDepth++;\n try {\n this.staging.flip();\n const tasks = this.collectTasks(systemTaskMap);\n this.executeTasks(tasks);\n } catch (e) {\n MessageWriter.error(\n e as Error,\n \"[Virid Dispatcher] Sub-Tick Unhandled Error\",\n );\n break;\n }\n }\n\n this.staging.reset();\n this.internalDepth = 0;\n this.executeTickHooks(this.afterTickHooks);\n this.globalTick++;\n }\n\n private collectTasks(systemTaskMap: Map<any, SystemTask[]>): ExecutionTask[] {\n const tasks: ExecutionTask[] = [];\n // Collect EVENT tasks and execute all associated systems for each message from front to back\n for (const msg of this.staging.eventActive) {\n const systems = systemTaskMap.get(msg.constructor) || [];\n systems.forEach((s) => {\n tasks.push(\n new ExecutionTask(\n s.fn,\n s.priority,\n msg,\n {\n context: (s.fn as any).systemContext as SystemContext,\n tick: this.globalTick,\n payload: {},\n },\n this.beforeExecuteHooks,\n this.afterExecuteHooks,\n ),\n );\n });\n }\n // Collect SIGNAL tasks (each system only runs once for that type)\n for (const [msg, msg_list] of this.staging.signalActive.entries()) {\n const systems = systemTaskMap.get(msg) || [];\n systems.forEach((s) => {\n tasks.push(\n new ExecutionTask(\n s.fn,\n s.priority,\n msg_list,\n {\n context: (s.fn as any).systemContext as SystemContext,\n tick: this.globalTick,\n payload: {},\n },\n this.beforeExecuteHooks,\n this.afterExecuteHooks,\n ),\n );\n });\n }\n return tasks;\n }\n private executeTasks(tasks: ExecutionTask[]) {\n // Regardless of the message type, sort according to the priority defined by the System\n tasks.sort((a, b) => b.priority - a.priority);\n for (const task of tasks) {\n const msg = Array.isArray(task.message) ? task.message[0] : task.message;\n try {\n const result = task.execute();\n // If it's a Promise, just register a catch to prevent crashes, don't await it\n if (result instanceof Promise) {\n result.catch((e) =>\n MessageWriter.error(\n e,\n `[Virid Dispatcher]: Async System Error.\\n` +\n `SystemLocation: ${task.hookContext.context.targetClass.name}.${task.hookContext.context.methodName}\\n` +\n `MessageName: ${msg.constructor.name}\\n` +\n `MessageData: ${JSON.stringify(task.message)}`,\n ),\n );\n }\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Dispatcher]: Sync System Error.\\n` +\n `SystemLocation: ${task.hookContext.context.targetClass.name}.${task.hookContext.context.methodName}\\n` +\n `MessageName: ${msg.constructor.name}\\n` +\n `MessageData: ${JSON.stringify(task.message)}`,\n );\n }\n }\n }\n\n private executeTickHooks(hooks: TickHook[]) {\n const hooksContext: TickHookContext = {\n tick: this.globalTick,\n timestamp: Date.now(),\n payload: this.tickPayload,\n };\n hooks.forEach((h) => h(hooksContext));\n }\n}\n\nexport class ExecutionTask {\n public success = true;\n constructor(\n public fn: (...args: any[]) => any,\n public priority: number,\n public message: any, // T or T[]\n public hookContext: ExecuteHookContext,\n public beforeExecuteHooks: Array<{\n type: MessageIdentifier<any>;\n handler: ExecuteHook<any>;\n }>,\n public afterExecuteHooks: Array<{\n type: MessageIdentifier<any>;\n handler: ExecuteHook<any>;\n }>,\n ) {}\n\n private triggerHooks(\n hooks: Array<{\n type: MessageIdentifier<any>;\n handler: ExecuteHook<any>;\n }>,\n ) {\n const sample = Array.isArray(this.message) ? this.message[0] : this.message;\n if (!sample) return;\n\n for (const hook of hooks) {\n if (sample instanceof hook.type) {\n try {\n const result = hook.handler(\n this.message,\n this.hookContext,\n this.success,\n );\n if (result instanceof Promise) {\n result.catch((e) => {\n MessageWriter.error(\n e,\n `[Virid Hook] Async Hook Error: It is prohibited to use asynchronous hooks within Hook: ${hook.type.name}`,\n );\n });\n }\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Hook] Hook Execute Failed: Triggered by: ${sample.constructor.name}, Registered type: ${hook.type.name}`,\n );\n }\n }\n }\n }\n\n public execute(): any {\n this.triggerHooks(this.beforeExecuteHooks);\n const runAfter = () => this.triggerHooks(this.afterExecuteHooks);\n\n try {\n const result = this.fn(this.message);\n\n if (result instanceof Promise) {\n // Asynchronous mode utilizes. finally to ensure hook execution\n return result.catch(() => (this.success = false)).finally(runAfter);\n }\n // If it is synchronization, execute it directly with a post hook and return it\n runAfter();\n return result;\n } catch (e) {\n // If an error occurs, execute the post hook as well\n this.success = false;\n runAfter();\n throw e; // Try catch processing thrown to Dispatcher\n }\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\n\nimport {\n type ExecuteHook,\n type TickHook,\n type MessageIdentifier,\n type Middleware,\n} from \"../interfaces\";\nimport { BaseMessage } from \"./message\";\nimport { MessageRegistry } from \"./registry\";\nimport { MessageWriter, activateInstance } from \"./io\";\nimport { Dispatcher } from \"./dispatcher\";\n\nexport class MessageEngine {\n private dispatcher: Dispatcher;\n private registry = new MessageRegistry();\n private middlewares: Middleware[] = [];\n private manual: boolean;\n\n constructor(maxDepth: number, manual: boolean) {\n this.dispatcher = new Dispatcher(maxDepth);\n this.manual = manual;\n // 修改\n activateInstance(this);\n }\n\n useMiddleware(mw: Middleware, front: boolean) {\n this.middlewares.push(mw);\n }\n onBeforeExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front: boolean,\n ) {\n this.dispatcher.addBeforeExecute(type, hook, front);\n }\n onAfterExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front: boolean,\n ) {\n this.dispatcher.addAfterExecute(type, hook, front);\n }\n onBeforeTick(hook: TickHook, front: boolean) {\n this.dispatcher.addBeforeTick(hook, front);\n }\n onAfterTick(hook: TickHook, front: boolean) {\n this.dispatcher.addAfterTick(hook, front);\n }\n\n tick() {\n this.dispatcher.tickSync(this.registry.systemTaskMap);\n }\n\n dispatch(message: BaseMessage) {\n if (!(message instanceof BaseMessage)) {\n MessageWriter.error(\n new Error(\n `[Virid Dispatch] Type Error: Message must be an instance of BaseMessage,message:${message}`,\n ),\n );\n return;\n }\n // 运行中间件管道\n this.pipeline(message, () => {\n //看看这个消息的处理函数在this.systemTaskMap里有吗?没有就报错\n if (!this.registry.systemTaskMap.has(message.constructor)) {\n MessageWriter.error(\n new Error(\n `[Virid Dispatch] No handler for message: ${message.constructor.name}`,\n ),\n );\n return;\n }\n this.dispatcher.stage(message);\n if (!this.manual) {\n this.dispatcher.tick(this.registry.systemTaskMap);\n }\n });\n }\n\n private pipeline(message: BaseMessage, finalAction: () => void) {\n let index = 0;\n const next = () => {\n if (index < this.middlewares.length) {\n this.middlewares[index++](message, next);\n } else {\n finalAction();\n }\n };\n next();\n }\n\n register(\n messageClass: any,\n systemFn: (...args: any[]) => any,\n priority: number = 0,\n ): () => void {\n return this.registry.register(messageClass, systemFn, priority);\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\n\nexport const VIRID_METADATA = {\n SYSTEM: \"virid:core:system\",\n MESSAGE: \"virid:core:message\",\n CONTROLLER: \"virid:core:controller\",\n COMPONENT: \"virid:core:component\",\n SAFE: \"virid:core:safe\",\n OBSERVER: \"virid:core:observer\",\n} as const;\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { BaseMessage, MessageWriter, SingleMessage } from \"../core\";\nimport { VIRID_METADATA } from \"./constant\";\nimport {\n type SystemContext,\n type Newable,\n type SystemParams,\n type ObserverMetadata,\n type SafeMetadata,\n SystemConfig,\n} from \"../interfaces\";\n\n// Unified processing of return values: System can directly return a message to achieve a chain reaction\nexport function handleResult(res: any) {\n if (!res) return;\n const messages = Array.isArray(res) ? res : [res];\n messages.forEach((m) => {\n if (m instanceof BaseMessage) {\n MessageWriter.write(m);\n } else {\n MessageWriter.warn(\n `[Virid HandleResult] Invalid Return Type: Must return Message or Message[].`,\n );\n }\n });\n}\n\n/**\n * Check if there are multiple message type parameters in the parameters\n * @param types Parameter list\n */\nfunction checkMessageParam(types: Array<any>) {\n const foundMatches: { type: any; idx: number }[] = [];\n\n types.forEach((type, idx) => {\n const isBaseMessage =\n type === BaseMessage || (type && type.prototype instanceof BaseMessage);\n\n if (isBaseMessage) {\n foundMatches.push({ type, idx });\n }\n });\n\n if (foundMatches.length === 0) {\n return null;\n }\n\n if (foundMatches.length > 1) {\n // 发现多个,把所有的错误信息组合起来抛出\n const errorDetails = foundMatches\n .map((item) => `[Index: ${item.idx}, Name: ${item.type.name}]`)\n .join(\", \");\n\n throw new Error(\n `[Virid System] Multiple Messages: Multiple Message type parameters detected, this is not allowed! specific location: ${errorDetails}`,\n );\n }\n\n return foundMatches[0];\n}\n\n/**\n * System Decorator\n * @param params Priority and MessageClass config\n */\nexport function System(\n params: SystemParams = {\n messageClass: null,\n priority: 0,\n },\n) {\n return (target: any, key: string, descriptor: PropertyDescriptor) => {\n if (typeof target !== \"function\") {\n throw new Error(\n `[Virid System] Method Type Error: The Method ${key} is not a static method, please check if there is a static keyword tag.`,\n );\n }\n\n const originalMethod = descriptor.value;\n const types: Array<any> = Reflect.getMetadata(\n \"design:paramtypes\",\n target,\n key,\n );\n\n // Verify if metadata exists\n if (!types) {\n throw new Error(\n `[Virid System] System Parameter Loss: Unable to recognize system parameters, please confirm if import \"reflect-metadata\" was introduced at the beginning.`,\n );\n }\n\n // Verify if there are undefined parameters\n const undefinedIndices = types\n .map((t, i) => (t === undefined ? i : -1))\n .filter((i) => i !== -1);\n if (undefinedIndices.length > 0) {\n throw new Error(\n `[Virid System] Parameter Metadata Loss in \"${key}\": One or more parameters have 'undefined' types. This usually happens when you forget to add a type annotation or due to circular dependencies. Check parameter at indices: [${undefinedIndices.join(\", \")}]`,\n );\n }\n\n let messageClass: Newable<BaseMessage>;\n // eslint-disable-next-line no-useless-assignment\n let messageIdx: number = -1;\n let batchMode = false;\n const listIdx = types.indexOf(Array);\n\n if (listIdx !== -1) {\n // Batch processing mode (with Array parameters)\n if (!params.messageClass) {\n throw new Error(\n `[Virid System] System Parameter Loss: When using batch processing mode with Array, the messageClass parameter must be specified in decorator options.`,\n );\n }\n if (!(params.messageClass.prototype instanceof SingleMessage)) {\n throw new Error(\n `[Virid System] System Parameter Loss: When using the batch processing mode, the messageClass parameter must inherit from SingleMessage.`,\n );\n }\n messageClass = params.messageClass;\n messageIdx = listIdx; // In batch processing mode, idx points to the position of Array\n batchMode = true;\n } else {\n // Non batch processing mode\n const matchedMessage = checkMessageParam(types); // { type: any, idx: number } | null\n\n if (matchedMessage && params.messageClass) {\n throw new Error(\n `[Virid System] Multiple Messages Are Not Allowed: Cannot specify messageClass in decorator options while already declaring it in method parameters at index ${matchedMessage.idx} in ${key}.`,\n );\n }\n\n if (matchedMessage) {\n messageClass = matchedMessage.type;\n messageIdx = matchedMessage.idx; // In single mode, idx points to the location of a specific BaseMessage subclass\n } else if (params.messageClass) {\n messageClass = params.messageClass;\n messageIdx = -1; // Only provided in the configuration, cannot be found in the parameters, set to -1\n } else {\n throw new Error(\n `[Virid System] System Parameter Loss: Please declare the message type either in method parameters or via the Message decorator options.`,\n );\n }\n }\n\n // Attach contextual information to the packaged function\n const systemContext: SystemContext = {\n params: types,\n targetClass: target,\n methodName: key,\n originalMethod: originalMethod,\n };\n const systemConfig: SystemConfig = {\n messageClass: messageClass,\n messageIdx: messageIdx,\n priority: params.priority || 0,\n batchMode: batchMode,\n };\n\n // Purely mounting data without changing the execution logic of the original method\n (descriptor.value as any).systemContext = systemContext;\n (descriptor.value as any).systemConfig = systemConfig;\n };\n}\n\n/**\n * Is the method used to identify the controller or component safe and can be directly called by other controllers\n */\nexport function Safe() {\n return (target: any, key: string, _descriptor: PropertyDescriptor) => {\n const safeMethods: SafeMetadata =\n Reflect.getMetadata(VIRID_METADATA.SAFE, target) || new Set<string>();\n safeMethods.add(key);\n Reflect.defineMetadata(VIRID_METADATA.SAFE, safeMethods, target);\n };\n}\n\n/**\n * Observer Decorator\n */\nexport function Observer(\n callback: (oldVal: any, newVale: any) => void | BaseMessage | BaseMessage[],\n) {\n return (target: any, propertyKey: string) => {\n const observerMetadata: ObserverMetadata =\n Reflect.getMetadata(VIRID_METADATA.OBSERVER, target) || [];\n observerMetadata.push({ propertyKey, callback });\n Reflect.defineMetadata(VIRID_METADATA.OBSERVER, observerMetadata, target);\n };\n}\n\n/**\n * Controller Decorator\n */\nexport function Controller() {\n return (target: any) => {\n Reflect.defineMetadata(VIRID_METADATA.CONTROLLER, true, target);\n };\n}\n/**\n * Component Decorator\n */\nexport function Component() {\n return (target: any) => {\n // 打上组件标签\n Reflect.defineMetadata(VIRID_METADATA.COMPONENT, true, target);\n };\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { type ObserverItem } from \"../interfaces\";\nimport { handleResult } from \"./decorator\";\nimport { VIRID_METADATA } from \"./constant\";\nconst ARRAY_MUTABLE_METHODS = [\n \"push\",\n \"pop\",\n \"shift\",\n \"unshift\",\n \"splice\",\n \"sort\",\n \"reverse\",\n];\nexport function bindObservers(instance: any) {\n if (!instance || typeof instance !== \"object\") return instance;\n if (\n Object.prototype.hasOwnProperty.call(\n instance,\n \"__virid_observer_processed__\",\n )\n )\n return instance;\n\n Object.defineProperty(instance, \"__virid_observer_processed__\", {\n value: true,\n enumerable: false,\n configurable: true,\n });\n\n const observerConfigs: ObserverItem[] =\n Reflect.getMetadata(VIRID_METADATA.OBSERVER, instance) || [];\n\n observerConfigs.forEach(({ propertyKey, callback }) => {\n // 创建逻辑单元:一个闭包 Box\n const box = { value: instance[propertyKey] };\n const logicProxy = new Proxy(box, {\n get(target, prop) {\n const value = target.value;\n\n // 数组变动拦截\n if (\n Array.isArray(value) &&\n ARRAY_MUTABLE_METHODS.includes(prop as string)\n ) {\n return (...args: any[]) => {\n const oldVal = [...value];\n const result = (value as any)[prop].apply(value, args);\n const observerResult = callback.call(instance, oldVal, value);\n handleResult(observerResult);\n\n return result;\n };\n }\n return value;\n },\n set(target, _prop, newVal) {\n const oldVal = target.value;\n if (newVal === oldVal) return true;\n\n target.value = newVal;\n const result = callback.call(instance, oldVal, newVal);\n handleResult(result);\n return true;\n },\n });\n // 在 bindObservers 的 forEach 内部\n const getter = () => logicProxy.value;\n (getter as any).__virid_box__ = box; // 重点:把闭包里的 box 暴露给后续插件\n\n Object.defineProperty(instance, propertyKey, {\n get: getter, // 纯转发\n set: (v) => {\n logicProxy.value = v;\n }, // 纯转发\n enumerable: true,\n configurable: true,\n });\n\n // 初次递归扫描\n if (box.value && typeof box.value === \"object\") {\n bindObservers(box.value);\n }\n });\n\n // 处理未标记但属于子组件的对象\n Reflect.ownKeys(instance).forEach((key) => {\n if (key === \"__virid_observer_processed__\") return;\n const desc = Object.getOwnPropertyDescriptor(instance, key);\n if (desc && desc.get) return;\n const val = instance[key];\n if (val && typeof val === \"object\") {\n bindObservers(val);\n }\n });\n return instance;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\n\nimport { Newable } from \"./interfaces\";\nimport { VIRID_METADATA } from \"./decorators/constant\";\n\ninterface Binding {\n type: \"singleton\" | \"transient\";\n ctor: Newable<any>;\n}\n\nexport class ViridContainer {\n private bindings = new Map<any, Binding>();\n private singletonInstances = new Map<any, any>();\n private activationHooks: Array<(instance: any) => any> = [];\n /**\n * Register an activation hook\n * @param hook An activation hook\n * @param front Is the hook order inserted from the front or added\n */\n public addActivationHook(hook: (instance: any) => any, front: boolean) {\n if (front) this.activationHooks.unshift(hook);\n else this.activationHooks.push(hook);\n }\n /**\n * Static binding component or controller\n * @param identifier Constructor of components or controllers\n */\n public bind<T>(identifier: Newable<T>) {\n //Check if the constructor has mandatory parameters\n if (identifier.length > 0) {\n throw new Error(\n `[Virid Container] Cannot Bind Component Or Controller: The Class ${identifier.name} should not have mandatory parameters.`,\n );\n }\n if (Reflect.getMetadata(VIRID_METADATA.COMPONENT, identifier)) {\n const binding: Binding = {\n type: \"singleton\",\n ctor: identifier,\n };\n this.bindings.set(identifier, binding);\n } else if (Reflect.getMetadata(VIRID_METADATA.CONTROLLER, identifier)) {\n const binding: Binding = { type: \"transient\", ctor: identifier };\n this.bindings.set(identifier, binding);\n } else {\n throw new Error(\n `[Virid Container] Cannot Bind Component Or Controller: The Class ${identifier.name} is not decorated with @Component or @Controller`,\n );\n }\n }\n /**\n * Dynamically register a component\n * @param instance Component instance\n */\n public spawn(instance: object) {\n const identifier = instance.constructor as Newable<any>;\n if (Reflect.hasMetadata(VIRID_METADATA.COMPONENT, identifier)) {\n const binding: Binding = { type: \"singleton\", ctor: identifier };\n this.bindings.set(identifier, binding);\n this.singletonInstances.set(identifier, instance);\n } else {\n throw new Error(\n `[Virid Container] Cannot spawn Component: The Class ${identifier.name} is not decorated with @Component`,\n );\n }\n }\n /**\n * Obtain a Component or Controller instance\n * @param identifier Constructor of components or controllers\n */\n public get<T>(identifier: Newable<T>): T {\n const binding = this.bindings.get(identifier);\n if (!binding) {\n throw new Error(\n `[Virid Container] Cannot Get Component Or Controller: No binding found for ${identifier}`,\n );\n }\n const TargetCtor = binding.ctor;\n\n if (binding.type === \"singleton\") {\n if (!this.singletonInstances.has(identifier)) {\n // first creation\n const rawInstance = new TargetCtor();\n const processedInstance = this.handleActivation(rawInstance);\n this.singletonInstances.set(identifier, processedInstance);\n }\n return this.singletonInstances.get(identifier);\n }\n\n // Transient\n const instance = new TargetCtor();\n return this.handleActivation(instance);\n }\n private handleActivation<T>(instance: T): T {\n for (const hook of this.activationHooks) {\n instance = hook(instance);\n }\n return instance;\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { ViridContainer } from \"./container\";\nimport {\n type ExecuteHook,\n type MessageIdentifier,\n type Middleware,\n type TickHook,\n type Newable,\n type SystemContext,\n type SystemConfig,\n} from \"./interfaces\";\nimport {\n BaseMessage,\n MessageWriter,\n MessageEngine,\n EventMessage,\n SingleMessage,\n} from \"./core\";\nimport { handleResult, Component } from \"./decorators\";\n\nexport interface ViridPlugin<T = any> {\n name: string;\n install: (app: ViridApp, options: T) => void;\n}\n\n@Component()\nexport class ViridApp {\n public container: ViridContainer = new ViridContainer();\n public engine: MessageEngine;\n private installedPlugins = new Set<string>();\n\n constructor(maxDepth: number, manual: boolean) {\n this.engine = new MessageEngine(maxDepth, manual);\n this.container.spawn(this);\n }\n\n /**\n * Register an activation hook\n * @param hook An activation hook\n * @param front Is the hook order inserted from the front or added\n */\n onActivate(hook: (instance: any) => any, front: boolean = false) {\n this.container.addActivationHook(hook, front);\n }\n\n /**\n * Opening a new tick\n */\n tick() {\n this.engine.tick();\n }\n\n /**\n * Obtain a Component or Controller instance\n * @param identifier Constructor of components or controllers\n */\n get<T>(identifier: Newable<T>): T {\n return this.container.get(identifier);\n }\n\n /**\n * Static binding component or controller\n * @param identifier Constructor of components or controllers\n */\n bind<T>(identifier: Newable<T>) {\n this.container.bind(identifier);\n }\n /**\n * Dynamically register a component\n * @param instance Component instance\n */\n spawn(instance: object) {\n this.container.spawn(instance);\n }\n useMiddleware(mw: Middleware, front = false) {\n this.engine.useMiddleware(mw, front);\n }\n onBeforeExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front = false,\n ) {\n this.engine.onBeforeExecute(type, hook, front);\n }\n onAfterExecute<T extends BaseMessage>(\n type: MessageIdentifier<T>,\n hook: ExecuteHook<T>,\n front = false,\n ) {\n this.engine.onAfterExecute(type, hook, front);\n }\n onBeforeTick(hook: TickHook, front = false) {\n this.engine.onBeforeTick(hook, front);\n }\n onAfterTick(hook: TickHook, front = false) {\n this.engine.onAfterTick(hook, front);\n }\n\n use<T>(plugin: ViridPlugin<T>, options: T): this {\n if (this.installedPlugins.has(plugin.name)) {\n MessageWriter.warn(\n `[Virid Plugin] Duplicate Installation: Plugin ${plugin.name} has already been installed.`,\n );\n return this;\n }\n try {\n plugin.install(this, options);\n this.installedPlugins.add(plugin.name);\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Plugin]: Install Failed: ${plugin.name}`,\n );\n }\n return this;\n }\n /**\n * Register message to registrar\n * @param systemFn System functions\n */\n register(systemFn: (...args: any[]) => any): () => void {\n const systemContext: SystemContext = (systemFn as any).systemContext;\n const systemConfig: SystemConfig = (systemFn as any).systemConfig;\n\n if (!systemContext || !systemConfig) {\n throw new Error(\n `[Virid System] System Parameter Loss: Please declare ${systemFn.name} using the @System decorator first.`,\n );\n }\n\n const { params: types, targetClass, originalMethod } = systemContext;\n const { messageClass, messageIdx, priority, batchMode } = systemConfig;\n\n const handleResultFn =\n typeof handleResult === \"function\" ? handleResult : (res: any) => res;\n const processResult = (result: any) => {\n return result instanceof Promise\n ? result.then(handleResultFn)\n : handleResultFn(result);\n };\n\n const cachedComponents = new Array(types.length);\n let isInitialized = false;\n\n const initDeps = () => {\n for (let i = 0; i < types.length; i++) {\n if (i !== messageIdx) {\n const dep = this.get(types[i]);\n if (!dep) {\n throw new Error(\n `[Virid System] Unknown Inject Data Types: ${types[i].name || types[i]} is not registered in the container for system '${systemFn.name}'!`,\n );\n }\n cachedComponents[i] = dep;\n }\n }\n isInitialized = true;\n };\n\n let wrappedSystem: (currentMessage: EventMessage | SingleMessage[]) => any;\n\n if (messageIdx === -1) {\n wrappedSystem = () => {\n if (!isInitialized) initDeps();\n return processResult(\n originalMethod.apply(targetClass, cachedComponents),\n );\n };\n } else if (types.length === 1) {\n if (batchMode) {\n wrappedSystem = (currentMessage: EventMessage | SingleMessage[]) => {\n const payload = Array.isArray(currentMessage)\n ? currentMessage\n : [currentMessage];\n\n if (payload.length > 0 && !(payload[0] instanceof messageClass)) {\n throw new Error(\n `[Virid System] Type Mismatch: Expected list of ${messageClass.name}, but got ${payload[0]?.constructor?.name}`,\n );\n }\n\n return processResult(originalMethod.call(targetClass, payload));\n };\n } else {\n wrappedSystem = (currentMessage: EventMessage | SingleMessage[]) => {\n const payload = Array.isArray(currentMessage)\n ? currentMessage[currentMessage.length - 1]\n : currentMessage;\n\n if (!(payload instanceof messageClass)) {\n throw new Error(\n `[Virid System] Type Mismatch: Expected ${messageClass.name}, but got ${(payload as any)?.constructor?.name}`,\n );\n }\n\n return processResult(originalMethod.call(targetClass, payload));\n };\n }\n } else {\n if (batchMode) {\n wrappedSystem = (currentMessage: EventMessage | SingleMessage[]) => {\n if (!isInitialized) initDeps();\n const payload = Array.isArray(currentMessage)\n ? currentMessage\n : [currentMessage];\n\n if (payload.length > 0 && !(payload[0] instanceof messageClass)) {\n throw new Error(\n `[Virid System] Type Mismatch: Expected list of ${messageClass.name}, but got ${payload[0]?.constructor?.name}`,\n );\n }\n\n const callArgs = [...cachedComponents];\n callArgs[messageIdx] = payload;\n return processResult(originalMethod.apply(targetClass, callArgs));\n };\n } else {\n wrappedSystem = (currentMessage: EventMessage | SingleMessage[]) => {\n if (!isInitialized) initDeps();\n const payload = Array.isArray(currentMessage)\n ? currentMessage[currentMessage.length - 1]\n : currentMessage;\n\n if (!(payload instanceof messageClass)) {\n throw new Error(\n `[Virid System] Type Mismatch: Expected ${messageClass.name}, but got ${(payload as any)?.constructor?.name}`,\n );\n }\n\n const callArgs = [...cachedComponents];\n callArgs[messageIdx] = payload;\n return processResult(originalMethod.apply(targetClass, callArgs));\n };\n }\n }\n\n (wrappedSystem as any).systemContext = systemContext;\n\n return this.engine.register(messageClass, wrappedSystem, priority);\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Core\n */\nimport { type ViridApp } from \"./app\";\nimport { ErrorMessage, InfoMessage, WarnMessage } from \"./core\";\nimport { System } from \"./decorators\";\n\nlet globalSwitch = true;\n\nexport function toggleSwitch(enable: boolean) {\n globalSwitch = enable;\n}\n\nconst clr = {\n reset: \"\\x1b[0m\",\n red: \"\\x1b[31m\",\n yellow: \"\\x1b[33m\",\n blue: \"\\x1b[34m\",\n magenta: \"\\x1b[35m\",\n cyan: \"\\x1b[36m\",\n gray: \"\\x1b[90m\",\n bold: \"\\x1b[1m\",\n green: \"\\x1b[32m\",\n};\n\nclass ViridLogHandler {\n /**\n * Register the global default information processing system\n */\n @System()\n static globalInfoHandler(info: InfoMessage) {\n if (!globalSwitch) return;\n const header = `${clr.green}${clr.bold} ✔ [Virid Info] ${clr.reset}`;\n const context = `${clr.magenta}${info.context}${clr.reset}`;\n\n console.log(\n `${header}${clr.gray}Global Info Caught:${clr.reset}\\n` +\n `${clr.green}Details:${clr.reset}`,\n context || \"unknown Info\",\n );\n }\n\n /**\n * Register the global default error handling system\n */\n @System()\n static globalErrorHandler(err: ErrorMessage) {\n if (!globalSwitch) return;\n const header = `${clr.red}${clr.bold} ✖ [Virid Error] ${clr.reset}`;\n const context = `${clr.magenta}${err.context}${clr.reset}`;\n\n console.error(\n `${header}${clr.gray}Global Error Caught:${clr.reset}\\n` +\n `${clr.red}Context:${clr.reset} ${context}\\n` +\n `${clr.red}Details:${clr.reset}`,\n err.error || err || \"unknown Error\",\n );\n }\n\n /**\n * Register the global default warning handling system\n */\n @System()\n static globalWarnHandler(warn: WarnMessage) {\n if (!globalSwitch) return;\n const header = `${clr.yellow}${clr.bold} ⚠ [Virid Warn] ${clr.reset}`;\n const context = `${clr.cyan}${warn.context}${clr.reset}`;\n\n console.warn(\n `${header}${clr.gray}Global Warn Caught:${clr.reset}\\n` +\n `${clr.yellow}Context:${clr.reset} ${context}`,\n );\n }\n}\n\nexport function registerBasicSystems(app: ViridApp) {\n app.register(ViridLogHandler.globalInfoHandler);\n app.register(ViridLogHandler.globalErrorHandler);\n app.register(ViridLogHandler.globalWarnHandler);\n}\n"],"mappings":";;;;mmBAAA,IAAAA,GAAA,GAAAC,GAAAD,GAAA,iBAAAE,EAAA,cAAAC,GAAA,eAAAC,GAAA,iBAAAC,EAAA,iBAAAC,EAAA,gBAAAC,EAAA,kBAAAC,EAAA,oBAAAC,EAAA,kBAAAC,EAAA,aAAAC,GAAA,SAAAC,GAAA,kBAAAC,EAAA,WAAAC,EAAA,mBAAAC,EAAA,aAAAC,EAAA,gBAAAC,EAAA,qBAAAC,EAAA,kBAAAC,EAAA,gBAAAC,GAAA,kBAAAC,EAAA,iBAAAC,IAAA,eAAAC,GAAAvB,ICgBA,IAAMwB,EAA2B,CAC/BC,SAAU,IACVC,UAAW,GACXC,OAAQ,EACV,ECNA,IAAIC,EAAuC,KACpC,SAASC,EAAiBC,EAAuB,CACtDF,EAAiBE,CACnB,CAFgBD,EAAAA,EAAAA,oBAIhB,SAASE,GAASC,EAAoB,CAChCJ,EACFA,EAAeG,SAASC,CAAAA,EAExBC,QAAQC,MAAM,iDAAA,CAElB,CANSH,EAAAA,GAAAA,YAQF,IAAMI,EAAN,MAAMA,CAAAA,CACX,OAAcC,MACZC,KACGC,EACG,CACN,IAAMR,EACJ,OAAOO,GAAW,WACd,IAAKA,EAAAA,GAAkBC,CAAAA,EACtBD,EAEPN,GAASD,CAAAA,CACX,CAEA,OAAcI,MAAMK,EAAUC,EAAkB,GAAU,CACxD,KAAKJ,MAAM,IAAIK,EAAaF,EAAGC,CAAAA,CAAAA,CACjC,CAEA,OAAcE,KAAKF,EAAuB,CACxC,KAAKJ,MAAM,IAAIO,EAAYH,CAAAA,CAAAA,CAC7B,CACA,OAAcI,KAAKJ,EAAuB,CACxC,KAAKJ,MAAM,IAAIS,EAAYL,CAAAA,CAAAA,CAC7B,CACF,EAvBaL,EAAAA,EAAAA,iBAAN,IAAMA,EAANW,ECnBA,IAAeC,EAAf,MAAeA,CAAAA,CACpB,OAAOC,QAEFC,EACH,CACAC,EAAcC,MAAM,KAAI,GAAYF,CAAAA,CACtC,CACF,EAPsBF,EAAAA,EAAAA,eAAf,IAAeA,EAAfK,EASeC,EAAf,MAAeA,UAAsBN,CAAAA,CAC1C,aAAc,CACZ,MAAK,CACP,CACF,EAJ4CA,EAAAA,EAAAA,iBAArC,IAAeM,EAAfC,EAMeC,EAAf,MAAeA,UAAqBR,CAAAA,CACzC,aAAc,CACZ,MAAK,CACP,CACF,EAJ2CA,EAAAA,EAAAA,gBAApC,IAAeQ,EAAfC,EAMMC,EAAN,MAAMA,UAAqBF,CAAAA,CAChC,YACkBG,EACAC,EAChB,CACA,MAAK,oCAAA,KAHWD,MAAAA,EAAAA,KACAC,QAAAA,CAGlB,CACF,EAPkCJ,EAAAA,EAAAA,gBAA3B,IAAME,EAANG,EASMC,GAAN,MAAMA,WAAoBN,CAAAA,CAC/B,YAA4BI,EAAiB,CAC3C,MAAK,oBAAA,KADqBA,QAAAA,CAE5B,CACF,EAJiCJ,EAAAA,GAAAA,eAA1B,IAAMM,EAANC,GAMMC,GAAN,MAAMA,WAAoBR,CAAAA,CAC/B,YAA4BI,EAAiB,CAC3C,MAAK,oBAAA,KADqBA,QAAAA,CAE5B,CACF,EAJiCJ,EAAAA,GAAAA,eAA1B,IAAMQ,EAANC,GCpCA,IAAMC,GAAN,MAAMA,EAAAA,CAAN,cACLC,EAAAA,qBAAgB,IAAIC,KAKpBC,SACEC,EACAC,EACAC,EAAmB,EACP,CACZ,IAAMC,EAAU,KAAKN,cAAcO,IAAIJ,CAAAA,GAAiB,CAAA,EAMxD,GALsBG,EAAQE,UAC3BC,GACEA,EAAEC,GAAWC,cAAcC,iBAC3BR,EAAiBO,cAAcC,cAAc,IAE5B,GACpBN,EAAQO,KAAK,CAAEH,GAAIN,EAAUC,SAAAA,CAAS,CAAA,EACtCC,EAAQQ,KAAK,CAACC,EAAGC,IAAMA,EAAEX,SAAWU,EAAEV,QAAQ,EAC9C,KAAKL,cAAciB,IAAId,EAAcG,CAAAA,MAChC,CAEL,IAAMY,EAAYd,EAAiBe,WAC7BC,EAAehB,EAAiBgB,YACtCC,OAAAA,EAAcC,MACZ,IAAIC,MACF,0DAA0DpB,EAAaqB,IAAI,cAAcJ,EAAYI,IAAI,IAAIN,CAAAA,EAAU,CAAA,EAGpH,IAAA,CAAO,CAChB,CAEA,MAAO,IAAA,CACL,IAAMO,EAAiB,KAAKzB,cAAcO,IAAIJ,CAAAA,EAC9C,GAAIsB,EAAgB,CAClB,IAAMC,EAAQD,EAAejB,UAAWC,GAAMA,EAAEC,KAAON,CAAAA,EACnDsB,IAAU,KACZD,EAAeE,OAAOD,EAAO,CAAA,EAEzBD,EAAeG,SAAW,GAC5B,KAAK5B,cAAc6B,OAAO1B,CAAAA,EAGhC,CACF,CACF,CACF,EA/CaJ,EAAAA,GAAAA,mBAAN,IAAMA,EAAN+B,GCAA,IAAMC,GAAN,MAAMA,EAAAA,CAAN,cACEC,EAAAA,oBAAe,IAAIC,KACnBC,EAAAA,mBAAqB,CAAA,GACpBC,EAAAA,qBAAgB,IAAIF,KACpBG,EAAAA,oBAAsB,CAAA,GAE9BC,MAAMC,EAAoB,CACxB,GAAIA,aAAiBC,EAAe,CAClC,IAAMC,EAAOF,EAAM,YACd,KAAKH,cAAcM,IAAID,CAAAA,GAAO,KAAKL,cAAcO,IAAIF,EAAM,CAAA,CAAE,EAClE,KAAKL,cAAcQ,IAAIH,CAAAA,EAAOI,KAAKN,CAAAA,CACrC,MAAWA,aAAiBO,EAC1B,KAAKT,aAAaQ,KAAKN,CAAAA,EAEvBQ,EAAcC,MACZ,IAAIC,MACF;EAAqCV,EAAM,YAAYW,IAAI,4CAA4C,CAAA,CAI/G,CAEAC,MAAO,CACL,KAAKlB,aAAe,KAAKG,cACzB,KAAKD,YAAc,KAAKE,aACxB,KAAKD,cAAgB,IAAIF,IACzB,KAAKG,aAAe,CAAA,CACtB,CAEAe,cAAe,CAEb,KAAKnB,aAAe,IAAIC,GAC1B,CAEAmB,aAAc,CACZ,KAAKlB,YAAc,CAAA,CACrB,CAEAmB,SAAU,CACR,OAAO,KAAKlB,cAAcmB,OAAS,GAAK,KAAKlB,aAAamB,SAAW,CACvE,CAKAC,OAAQ,CACN,KAAKxB,aAAe,IAAIC,IACxB,KAAKE,cAAgB,IAAIF,IACzB,KAAKG,aAAe,CAAA,EACpB,KAAKF,YAAc,CAAA,CACrB,CACF,EAnDaH,EAAAA,GAAAA,WAAN,IAAMA,EAAN0B,GCWA,IAAMC,GAAN,MAAMA,EAAAA,CACX,YAAoBC,EAAkB,oBAC9BC,EAAAA,iBAAY,IACZC,EAAAA,kBAAa,GACbC,EAAAA,qBAAgB,GAChBC,EAAAA,eAAU,IAAIC,GAEdC,EAAAA,mBAAsC,CAAC,GAEvCC,EAAAA,0BAGH,CAAA,GACGC,EAAAA,yBAGH,CAAA,GAEGC,EAAAA,uBAAmC,CAAA,GACnCC,EAAAA,sBAAkC,CAAA,QAlBtBV,SAAAA,CAAmB,CAoBhCW,iBACLC,EACAC,EACAC,EACA,CACIA,EACF,KAAKP,mBAAmBQ,QAAQ,CAC9BH,KAAAA,EACAI,QAASH,CACX,CAAA,EAEA,KAAKN,mBAAmBU,KAAK,CAAEL,KAAAA,EAAMI,QAASH,CAAyB,CAAA,CAC3E,CACOK,gBACLN,EACAC,EACAC,EACA,CACIA,EACF,KAAKN,kBAAkBO,QAAQ,CAC7BH,KAAAA,EACAI,QAASH,CACX,CAAA,EAEA,KAAKL,kBAAkBS,KAAK,CAAEL,KAAAA,EAAMI,QAASH,CAAyB,CAAA,CAC1E,CACOM,cAAcN,EAAgBC,EAAgB,CAC/CA,EAAO,KAAKL,gBAAgBM,QAAQF,CAAAA,EACnC,KAAKJ,gBAAgBQ,KAAKJ,CAAAA,CACjC,CACOO,aAAaP,EAAgBC,EAAgB,CAC9CA,EAAO,KAAKJ,eAAeK,QAAQF,CAAAA,EAClC,KAAKH,eAAeO,KAAKJ,CAAAA,CAChC,CAKOQ,MAAMC,EAAsB,CACjC,KAAKlB,QAAQiB,MAAMC,CAAAA,CACrB,CAEOC,KAAKC,EAAuC,CACjD,GAAI,OAAKvB,WAAa,KAAKG,QAAQqB,QAAO,GAE1C,IAAI,KAAKtB,cAAgB,KAAKH,SAAU,CACtC,KAAKG,cAAgB,EACrB,KAAKC,QAAQsB,MAAK,EAClBC,QAAQC,MACN,IAAIC,MACF,kDAAkD,KAAK7B,QAAQ,mFAAmF,CAAA,EAGtJ,MACF,CAEA,KAAKC,UAAY,GACjB,KAAKE,gBAEL2B,eAAe,IAAA,CACb,GAAI,CAEE,KAAK3B,eAAiB,IACxB,KAAKG,YAAc,CAAC,EACpB,KAAKyB,iBAAiB,KAAKtB,eAAe,GAG5C,KAAKL,QAAQ4B,KAAI,EAEjB,IAAMC,EAAQ,KAAKC,aAAaV,CAAAA,EAEhC,KAAKW,aAAaF,CAAAA,CACpB,OAASG,EAAG,CACVC,EAAcT,MAAMQ,EAAY,oCAAA,CAClC,QAAA,CAEE,KAAKnC,UAAY,GAEZ,KAAKG,QAAQqB,QAAO,GAIvB,KAAKrB,QAAQsB,MAAK,EAClB,KAAKvB,cAAgB,EACrB,KAAK4B,iBAAiB,KAAKrB,cAAc,EACzC,KAAKR,cANL,KAAKqB,KAAKC,CAAAA,CAQd,CACF,CAAA,EACF,CACOc,SAASd,EAAuC,CACrD,GAAI,MAAKpB,QAAQqB,QAAO,EAOxB,KALA,KAAKtB,cAAgB,EACrB,KAAKG,YAAc,CAAC,EAEpB,KAAKyB,iBAAiB,KAAKtB,eAAe,EAEnC,CAAC,KAAKL,QAAQqB,QAAO,GAAI,CAC9B,GAAI,KAAKtB,cAAgB,KAAKH,SAAU,CACtC,KAAKI,QAAQsB,MAAK,EAClB,KAAKvB,cAAgB,EACrBwB,QAAQC,MACN,IAAIC,MACF,kDAAkD,KAAK7B,QAAQ,qDAAqD,CAAA,EAGxH,MACF,CACA,KAAKG,gBACL,GAAI,CACF,KAAKC,QAAQ4B,KAAI,EACjB,IAAMC,EAAQ,KAAKC,aAAaV,CAAAA,EAChC,KAAKW,aAAaF,CAAAA,CACpB,OAASG,EAAG,CACVC,EAAcT,MACZQ,EACA,6CAAA,EAEF,KACF,CACF,CAEA,KAAKhC,QAAQsB,MAAK,EAClB,KAAKvB,cAAgB,EACrB,KAAK4B,iBAAiB,KAAKrB,cAAc,EACzC,KAAKR,aACP,CAEQgC,aAAaV,EAAwD,CAC3E,IAAMS,EAAyB,CAAA,EAE/B,QAAWM,KAAO,KAAKnC,QAAQoC,aACbhB,EAAciB,IAAIF,EAAI,WAAW,GAAK,CAAA,GAC9CG,QAASC,GAAAA,CACfV,EAAMhB,KACJ,IAAI2B,EACFD,EAAEE,GACFF,EAAEG,SACFP,EACA,CACEQ,QAAUJ,EAAEE,GAAWG,cACvBzB,KAAM,KAAKrB,WACX+C,QAAS,CAAC,CACZ,EACA,KAAK1C,mBACL,KAAKC,iBAAiB,CAAA,CAG5B,CAAA,EAGF,OAAW,CAAC+B,EAAKW,CAAAA,IAAa,KAAK9C,QAAQ+C,aAAaC,QAAO,GAC7C5B,EAAciB,IAAIF,CAAAA,GAAQ,CAAA,GAClCG,QAASC,GAAAA,CACfV,EAAMhB,KACJ,IAAI2B,EACFD,EAAEE,GACFF,EAAEG,SACFI,EACA,CACEH,QAAUJ,EAAEE,GAAWG,cACvBzB,KAAM,KAAKrB,WACX+C,QAAS,CAAC,CACZ,EACA,KAAK1C,mBACL,KAAKC,iBAAiB,CAAA,CAG5B,CAAA,EAEF,OAAOyB,CACT,CACQE,aAAaF,EAAwB,CAE3CA,EAAMoB,KAAK,CAACC,EAAGC,IAAMA,EAAET,SAAWQ,EAAER,QAAQ,EAC5C,QAAWU,KAAQvB,EAAO,CACxB,IAAMM,EAAMkB,MAAMC,QAAQF,EAAKlC,OAAO,EAAIkC,EAAKlC,QAAQ,CAAA,EAAKkC,EAAKlC,QACjE,GAAI,CACF,IAAMqC,EAASH,EAAKI,QAAO,EAEvBD,aAAkBE,SACpBF,EAAOG,MAAO1B,GACZC,EAAcT,MACZQ,EACA;kBACqBoB,EAAKO,YAAYhB,QAAQiB,YAAYC,IAAI,IAAIT,EAAKO,YAAYhB,QAAQmB,UAAU;kBAChF3B,EAAI,YAAY0B,IAAI;kBACpBE,KAAKC,UAAUZ,EAAKlC,OAAO,CAAA,EAAG,CAAA,CAI3D,OAASc,EAAG,CACVC,EAAcT,MACZQ,EACA;kBACqBoB,EAAKO,YAAYhB,QAAQiB,YAAYC,IAAI,IAAIT,EAAKO,YAAYhB,QAAQmB,UAAU;kBAChF3B,EAAI,YAAY0B,IAAI;kBACpBE,KAAKC,UAAUZ,EAAKlC,OAAO,CAAA,EAAG,CAEvD,CACF,CACF,CAEQS,iBAAiBsC,EAAmB,CAC1C,IAAMC,EAAgC,CACpC/C,KAAM,KAAKrB,WACXqE,UAAWC,KAAKC,IAAG,EACnBxB,QAAS,KAAK3C,WAChB,EACA+D,EAAM3B,QAASgC,GAAMA,EAAEJ,CAAAA,CAAAA,CACzB,CACF,EAzOavE,EAAAA,GAAAA,cAAN,IAAMA,EAAN4E,GA2OM/B,GAAN,MAAMA,EAAAA,CAEX,YACSC,EACAC,EACAxB,EACAyC,EACAxD,EAIAC,EAIP,kIAdKoE,EAAAA,eAAU,SAER/B,GAAAA,OACAC,SAAAA,OACAxB,QAAAA,OACAyC,YAAAA,OACAxD,mBAAAA,OAIAC,kBAAAA,CAIN,CAEKqE,aACNR,EAIA,CACA,IAAMS,EAASrB,MAAMC,QAAQ,KAAKpC,OAAO,EAAI,KAAKA,QAAQ,CAAA,EAAK,KAAKA,QACpE,GAAKwD,GAEL,QAAWjE,KAAQwD,EACjB,GAAIS,aAAkBjE,EAAKD,KACzB,GAAI,CACF,IAAM+C,EAAS9C,EAAKG,QAClB,KAAKM,QACL,KAAKyC,YACL,KAAKa,OAAO,EAEVjB,aAAkBE,SACpBF,EAAOG,MAAO1B,GAAAA,CACZC,EAAcT,MACZQ,EACA,0FAA0FvB,EAAKD,KAAKqD,IAAI,EAAE,CAE9G,CAAA,CAEJ,OAAS7B,EAAG,CACVC,EAAcT,MACZQ,EACA,mDAAmD0C,EAAO,YAAYb,IAAI,sBAAsBpD,EAAKD,KAAKqD,IAAI,EAAE,CAEpH,EAGN,CAEOL,SAAe,CACpB,KAAKiB,aAAa,KAAKtE,kBAAkB,EACzC,IAAMwE,EAAWC,EAAA,IAAM,KAAKH,aAAa,KAAKrE,iBAAiB,EAA9C,YAEjB,GAAI,CACF,IAAMmD,EAAS,KAAKd,GAAG,KAAKvB,OAAO,EAEnC,OAAIqC,aAAkBE,QAEbF,EAAOG,MAAM,IAAO,KAAKc,QAAU,EAAA,EAAQK,QAAQF,CAAAA,GAG5DA,EAAAA,EACOpB,EACT,OAASvB,EAAG,CAEV,WAAKwC,QAAU,GACfG,EAAAA,EACM3C,CACR,CACF,CACF,EAzEaQ,EAAAA,GAAAA,iBAAN,IAAMA,EAANsC,GC7OA,IAAMC,GAAN,MAAMA,EAAAA,CAMX,YAAYC,EAAkBC,EAAiB,CALvCC,EAAAA,mBACAC,EAAAA,gBAAW,IAAIC,GACfC,EAAAA,mBAA4B,CAAA,GAC5BJ,EAAAA,eAGN,KAAKC,WAAa,IAAII,EAAWN,CAAAA,EACjC,KAAKC,OAASA,EAEdM,EAAiB,IAAI,CACvB,CAEAC,cAAcC,EAAgBC,EAAgB,CAC5C,KAAKL,YAAYM,KAAKF,CAAAA,CACxB,CACAG,gBACEC,EACAC,EACAJ,EACA,CACA,KAAKR,WAAWa,iBAAiBF,EAAMC,EAAMJ,CAAAA,CAC/C,CACAM,eACEH,EACAC,EACAJ,EACA,CACA,KAAKR,WAAWe,gBAAgBJ,EAAMC,EAAMJ,CAAAA,CAC9C,CACAQ,aAAaJ,EAAgBJ,EAAgB,CAC3C,KAAKR,WAAWiB,cAAcL,EAAMJ,CAAAA,CACtC,CACAU,YAAYN,EAAgBJ,EAAgB,CAC1C,KAAKR,WAAWmB,aAAaP,EAAMJ,CAAAA,CACrC,CAEAY,MAAO,CACL,KAAKpB,WAAWqB,SAAS,KAAKpB,SAASqB,aAAa,CACtD,CAEAC,SAASC,EAAsB,CAC7B,GAAI,EAAEA,aAAmBC,GAAc,CACrCC,EAAcC,MACZ,IAAIC,MACF,mFAAmFJ,CAAAA,EAAS,CAAA,EAGhG,MACF,CAEA,KAAKK,SAASL,EAAS,IAAA,CAErB,GAAI,CAAC,KAAKvB,SAASqB,cAAcQ,IAAIN,EAAQ,WAAW,EAAG,CACzDE,EAAcC,MACZ,IAAIC,MACF,4CAA4CJ,EAAQ,YAAYO,IAAI,EAAE,CAAA,EAG1E,MACF,CACA,KAAK/B,WAAWgC,MAAMR,CAAAA,EACjB,KAAKzB,QACR,KAAKC,WAAWoB,KAAK,KAAKnB,SAASqB,aAAa,CAEpD,CAAA,CACF,CAEQO,SAASL,EAAsBS,EAAyB,CAC9D,IAAIC,EAAQ,EACNC,EAAOC,EAAA,IAAA,CACPF,EAAQ,KAAK/B,YAAYkC,OAC3B,KAAKlC,YAAY+B,GAAAA,EAASV,EAASW,CAAAA,EAEnCF,EAAAA,CAEJ,EANa,QAObE,EAAAA,CACF,CAEAG,SACEC,EACAC,EACAC,EAAmB,EACP,CACZ,OAAO,KAAKxC,SAASqC,SAASC,EAAcC,EAAUC,CAAAA,CACxD,CACF,EAvFa5C,EAAAA,GAAAA,iBAAN,IAAMA,EAAN6C,GCXA,IAAMC,EAAiB,CAC5BC,OAAQ,oBACRC,QAAS,qBACTC,WAAY,wBACZC,UAAW,uBACXC,KAAM,kBACNC,SAAU,qBACZ,ECIO,SAASC,EAAaC,EAAQ,CACnC,GAAI,CAACA,EAAK,QACOC,MAAMC,QAAQF,CAAAA,EAAOA,EAAM,CAACA,IACpCG,QAASC,GAAAA,CACZA,aAAaC,EACfC,EAAcC,MAAMH,CAAAA,EAEpBE,EAAcE,KACZ,8EAA8E,CAGpF,CAAA,CACF,CAZgBT,EAAAA,EAAAA,gBAkBhB,SAASU,GAAkBC,EAAiB,CAC1C,IAAMC,EAA6C,CAAA,EAWnD,GATAD,EAAMP,QAAQ,CAACS,EAAMC,IAAAA,EAEjBD,IAASP,GAAgBO,GAAQA,EAAKE,qBAAqBT,IAG3DM,EAAaI,KAAK,CAAEH,KAAAA,EAAMC,IAAAA,CAAI,CAAA,CAElC,CAAA,EAEIF,EAAaK,SAAW,EAC1B,OAAO,KAGT,GAAIL,EAAaK,OAAS,EAAG,CAE3B,IAAMC,EAAeN,EAClBO,IAAKC,GAAS,WAAWA,EAAKN,GAAG,WAAWM,EAAKP,KAAKQ,IAAI,GAAG,EAC7DC,KAAK,IAAA,EAER,MAAM,IAAIC,MACR,wHAAwHL,CAAAA,EAAc,CAE1I,CAEA,OAAON,EAAa,CAAA,CACtB,CA5BSF,EAAAA,GAAAA,qBAkCF,SAASc,EACdC,EAAuB,CACrBC,aAAc,KACdC,SAAU,CACZ,EAAC,CAED,MAAO,CAACC,EAAaC,EAAaC,IAAAA,CAChC,GAAI,OAAOF,GAAW,WACpB,MAAM,IAAIL,MACR,gDAAgDM,CAAAA,yEAA4E,EAIhI,IAAME,EAAiBD,EAAWE,MAC5BrB,EAAoBsB,QAAQC,YAChC,oBACAN,EACAC,CAAAA,EAIF,GAAI,CAAClB,EACH,MAAM,IAAIY,MACR,2JAA2J,EAK/J,IAAMY,EAAmBxB,EACtBQ,IAAI,CAACiB,EAAGC,IAAOD,IAAME,OAAYD,EAAI,EAAC,EACtCE,OAAQF,GAAMA,IAAM,EAAC,EACxB,GAAIF,EAAiBlB,OAAS,EAC5B,MAAM,IAAIM,MACR,8CAA8CM,CAAAA,iLAAoLM,EAAiBb,KAAK,IAAA,CAAA,GAAQ,EAIpQ,IAAII,EAEAc,EAAqB,GACrBC,EAAY,GACVC,EAAU/B,EAAMgC,QAAQzC,KAAAA,EAE9B,GAAIwC,IAAY,GAAI,CAElB,GAAI,CAACjB,EAAOC,aACV,MAAM,IAAIH,MACR,uJAAuJ,EAG3J,GAAI,EAAEE,EAAOC,aAAaX,qBAAqB6B,GAC7C,MAAM,IAAIrB,MACR,yIAAyI,EAG7IG,EAAeD,EAAOC,aACtBc,EAAaE,EACbD,EAAY,EACd,KAAO,CAEL,IAAMI,EAAiBnC,GAAkBC,CAAAA,EAEzC,GAAIkC,GAAkBpB,EAAOC,aAC3B,MAAM,IAAIH,MACR,+JAA+JsB,EAAe/B,GAAG,OAAOe,CAAAA,GAAM,EAIlM,GAAIgB,EACFnB,EAAemB,EAAehC,KAC9B2B,EAAaK,EAAe/B,YACnBW,EAAOC,aAChBA,EAAeD,EAAOC,aACtBc,EAAa,OAEb,OAAM,IAAIjB,MACR,yIAAyI,CAG/I,CAGA,IAAMuB,EAA+B,CACnCrB,OAAQd,EACRoC,YAAanB,EACboB,WAAYnB,EACZE,eAAgBA,CAClB,EACMkB,EAA6B,CACjCvB,aAAcA,EACdc,WAAYA,EACZb,SAAUF,EAAOE,UAAY,EAC7Bc,UAAWA,CACb,EAGCX,EAAWE,MAAcc,cAAgBA,EACzChB,EAAWE,MAAciB,aAAeA,CAC3C,CACF,CAnGgBzB,EAAAA,EAAAA,UAwGT,SAAS0B,IAAAA,CACd,MAAO,CAACtB,EAAaC,EAAasB,IAAAA,CAChC,IAAMC,EACJnB,QAAQC,YAAYmB,EAAeC,KAAM1B,CAAAA,GAAW,IAAI2B,IAC1DH,EAAYI,IAAI3B,CAAAA,EAChBI,QAAQwB,eAAeJ,EAAeC,KAAMF,EAAaxB,CAAAA,CAC3D,CACF,CAPgBsB,EAAAA,GAAAA,QAYT,SAASQ,GACdC,EAA2E,CAE3E,MAAO,CAAC/B,EAAagC,IAAAA,CACnB,IAAMC,EACJ5B,QAAQC,YAAYmB,EAAeS,SAAUlC,CAAAA,GAAW,CAAA,EAC1DiC,EAAiB7C,KAAK,CAAE4C,YAAAA,EAAaD,SAAAA,CAAS,CAAA,EAC9C1B,QAAQwB,eAAeJ,EAAeS,SAAUD,EAAkBjC,CAAAA,CACpE,CACF,CATgB8B,EAAAA,GAAAA,YAcT,SAASK,IAAAA,CACd,OAAQnC,GAAAA,CACNK,QAAQwB,eAAeJ,EAAeW,WAAY,GAAMpC,CAAAA,CAC1D,CACF,CAJgBmC,EAAAA,GAAAA,cAQT,SAASE,IAAAA,CACd,OAAQrC,GAAAA,CAENK,QAAQwB,eAAeJ,EAAea,UAAW,GAAMtC,CAAAA,CACzD,CACF,CALgBqC,EAAAA,GAAAA,aCvMhB,IAAME,GAAwB,CAC5B,OACA,MACA,QACA,UACA,SACA,OACA,WAEK,SAASC,EAAcC,EAAa,CAEzC,MADI,CAACA,GAAY,OAAOA,GAAa,UAEnCC,OAAOC,UAAUC,eAAeC,KAC9BJ,EACA,8BAAA,IAKJC,OAAOI,eAAeL,EAAU,+BAAgC,CAC9DM,MAAO,GACPC,WAAY,GACZC,aAAc,EAChB,CAAA,GAGEC,QAAQC,YAAYC,EAAeC,SAAUZ,CAAAA,GAAa,CAAA,GAE5Ca,QAAQ,CAAC,CAAEC,YAAAA,EAAaC,SAAAA,CAAQ,IAAE,CAEhD,IAAMC,EAAM,CAAEV,MAAON,EAASc,CAAAA,CAAa,EACrCG,EAAa,IAAIC,MAAMF,EAAK,CAChCG,IAAIC,EAAQC,EAAI,CACd,IAAMf,EAAQc,EAAOd,MAGrB,OACEgB,MAAMC,QAAQjB,CAAAA,GACdR,GAAsB0B,SAASH,CAAAA,EAExB,IAAII,IAAAA,CACT,IAAMC,EAAS,IAAIpB,GACbqB,EAAUrB,EAAce,CAAAA,EAAMO,MAAMtB,EAAOmB,CAAAA,EAC3CI,EAAiBd,EAASX,KAAKJ,EAAU0B,EAAQpB,CAAAA,EACvDwB,OAAAA,EAAaD,CAAAA,EAENF,CACT,EAEKrB,CACT,EACAyB,IAAIX,EAAQY,EAAOC,EAAM,CACvB,IAAMP,EAASN,EAAOd,MACtB,GAAI2B,IAAWP,EAAQ,MAAO,GAE9BN,EAAOd,MAAQ2B,EACf,IAAMN,EAASZ,EAASX,KAAKJ,EAAU0B,EAAQO,CAAAA,EAC/CH,OAAAA,EAAaH,CAAAA,EACN,EACT,CACF,CAAA,EAEMO,EAASC,EAAA,IAAMlB,EAAWX,MAAjB,UACd4B,EAAeE,cAAgBpB,EAEhCf,OAAOI,eAAeL,EAAUc,EAAa,CAC3CK,IAAKe,EACLH,IAAKI,EAACE,GAAAA,CACJpB,EAAWX,MAAQ+B,CACrB,EAFK,OAGL9B,WAAY,GACZC,aAAc,EAChB,CAAA,EAGIQ,EAAIV,OAAS,OAAOU,EAAIV,OAAU,UACpCP,EAAciB,EAAIV,KAAK,CAE3B,CAAA,EAGAG,QAAQ6B,QAAQtC,CAAAA,EAAUa,QAAS0B,GAAAA,CACjC,GAAIA,IAAQ,+BAAgC,OAC5C,IAAMC,EAAOvC,OAAOwC,yBAAyBzC,EAAUuC,CAAAA,EACvD,GAAIC,GAAQA,EAAKrB,IAAK,OACtB,IAAMuB,EAAM1C,EAASuC,CAAAA,EACjBG,GAAO,OAAOA,GAAQ,UACxB3C,EAAc2C,CAAAA,CAElB,CAAA,GACO1C,CACT,CAlFgBD,EAAAA,EAAAA,iBCHT,IAAM4C,GAAN,MAAMA,EAAAA,CAAN,cACGC,EAAAA,gBAAW,IAAIC,KACfC,EAAAA,0BAAqB,IAAID,KACzBE,EAAAA,uBAAiD,CAAA,GAMlDC,kBAAkBC,EAA8BC,EAAgB,CACjEA,EAAO,KAAKH,gBAAgBI,QAAQF,CAAAA,EACnC,KAAKF,gBAAgBK,KAAKH,CAAAA,CACjC,CAKOI,KAAQC,EAAwB,CAErC,GAAIA,EAAWC,OAAS,EACtB,MAAM,IAAIC,MACR,oEAAoEF,EAAWG,IAAI,wCAAwC,EAG/H,GAAIC,QAAQC,YAAYC,EAAeC,UAAWP,CAAAA,EAAa,CAC7D,IAAMQ,EAAmB,CACvBC,KAAM,YACNC,KAAMV,CACR,EACA,KAAKV,SAASqB,IAAIX,EAAYQ,CAAAA,CAChC,SAAWJ,QAAQC,YAAYC,EAAeM,WAAYZ,CAAAA,EAAa,CACrE,IAAMQ,EAAmB,CAAEC,KAAM,YAAaC,KAAMV,CAAW,EAC/D,KAAKV,SAASqB,IAAIX,EAAYQ,CAAAA,CAChC,KACE,OAAM,IAAIN,MACR,oEAAoEF,EAAWG,IAAI,kDAAkD,CAG3I,CAKOU,MAAMC,EAAkB,CAC7B,IAAMd,EAAac,EAAS,YAC5B,GAAIV,QAAQW,YAAYT,EAAeC,UAAWP,CAAAA,EAAa,CAC7D,IAAMQ,EAAmB,CAAEC,KAAM,YAAaC,KAAMV,CAAW,EAC/D,KAAKV,SAASqB,IAAIX,EAAYQ,CAAAA,EAC9B,KAAKhB,mBAAmBmB,IAAIX,EAAYc,CAAAA,CAC1C,KACE,OAAM,IAAIZ,MACR,uDAAuDF,EAAWG,IAAI,mCAAmC,CAG/G,CAKOa,IAAOhB,EAA2B,CACvC,IAAMQ,EAAU,KAAKlB,SAAS0B,IAAIhB,CAAAA,EAClC,GAAI,CAACQ,EACH,MAAM,IAAIN,MACR,8EAA8EF,CAAAA,EAAY,EAG9F,IAAMiB,EAAaT,EAAQE,KAE3B,GAAIF,EAAQC,OAAS,YAAa,CAChC,GAAI,CAAC,KAAKjB,mBAAmB0B,IAAIlB,CAAAA,EAAa,CAE5C,IAAMmB,EAAc,IAAIF,EAClBG,EAAoB,KAAKC,iBAAiBF,CAAAA,EAChD,KAAK3B,mBAAmBmB,IAAIX,EAAYoB,CAAAA,CAC1C,CACA,OAAO,KAAK5B,mBAAmBwB,IAAIhB,CAAAA,CACrC,CAGA,IAAMc,EAAW,IAAIG,EACrB,OAAO,KAAKI,iBAAiBP,CAAAA,CAC/B,CACQO,iBAAoBP,EAAgB,CAC1C,QAAWnB,KAAQ,KAAKF,gBACtBqB,EAAWnB,EAAKmB,CAAAA,EAElB,OAAOA,CACT,CACF,EAxFazB,EAAAA,GAAAA,kBAAN,IAAMA,EAANiC,keCgBA,IAAMC,GAAN,MAAMA,EAAAA,CAKX,YAAYC,EAAkBC,EAAiB,CAJxCC,EAAAA,iBAA4B,IAAIC,GAChCC,EAAAA,eACCC,EAAAA,wBAAmB,IAAIC,KAG7B,KAAKF,OAAS,IAAIG,EAAcP,EAAUC,CAAAA,EAC1C,KAAKC,UAAUM,MAAM,IAAI,CAC3B,CAOAC,WAAWC,EAA8BC,EAAiB,GAAO,CAC/D,KAAKT,UAAUU,kBAAkBF,EAAMC,CAAAA,CACzC,CAKAE,MAAO,CACL,KAAKT,OAAOS,KAAI,CAClB,CAMAC,IAAOC,EAA2B,CAChC,OAAO,KAAKb,UAAUY,IAAIC,CAAAA,CAC5B,CAMAC,KAAQD,EAAwB,CAC9B,KAAKb,UAAUc,KAAKD,CAAAA,CACtB,CAKAP,MAAMS,EAAkB,CACtB,KAAKf,UAAUM,MAAMS,CAAAA,CACvB,CACAC,cAAcC,EAAgBR,EAAQ,GAAO,CAC3C,KAAKP,OAAOc,cAAcC,EAAIR,CAAAA,CAChC,CACAS,gBACEC,EACAX,EACAC,EAAQ,GACR,CACA,KAAKP,OAAOgB,gBAAgBC,EAAMX,EAAMC,CAAAA,CAC1C,CACAW,eACED,EACAX,EACAC,EAAQ,GACR,CACA,KAAKP,OAAOkB,eAAeD,EAAMX,EAAMC,CAAAA,CACzC,CACAY,aAAab,EAAgBC,EAAQ,GAAO,CAC1C,KAAKP,OAAOmB,aAAab,EAAMC,CAAAA,CACjC,CACAa,YAAYd,EAAgBC,EAAQ,GAAO,CACzC,KAAKP,OAAOoB,YAAYd,EAAMC,CAAAA,CAChC,CAEAc,IAAOC,EAAwBC,EAAkB,CAC/C,GAAI,KAAKtB,iBAAiBuB,IAAIF,EAAOG,IAAI,EACvCC,OAAAA,EAAcC,KACZ,iDAAiDL,EAAOG,IAAI,8BAA8B,EAErF,KAET,GAAI,CACFH,EAAOM,QAAQ,KAAML,CAAAA,EACrB,KAAKtB,iBAAiB4B,IAAIP,EAAOG,IAAI,CACvC,OAASK,EAAG,CACVJ,EAAcK,MACZD,EACA,mCAAmCR,EAAOG,IAAI,EAAE,CAEpD,CACA,OAAO,IACT,CAKAO,SAASC,EAA+C,CACtD,IAAMC,EAAgCD,EAAiBC,cACjDC,EAA8BF,EAAiBE,aAErD,GAAI,CAACD,GAAiB,CAACC,EACrB,MAAM,IAAIC,MACR,wDAAwDH,EAASR,IAAI,qCAAqC,EAI9G,GAAM,CAAEY,OAAQC,EAAOC,YAAAA,EAAaC,eAAAA,CAAc,EAAKN,EACjD,CAAEO,aAAAA,EAAcC,WAAAA,EAAYC,SAAAA,EAAUC,UAAAA,CAAS,EAAKT,EAEpDU,EACJ,OAAOC,GAAiB,WAAaA,EAAgBC,GAAaA,EAC9DC,EAAgBC,EAACC,GACdA,aAAkBC,QACrBD,EAAOE,KAAKP,CAAAA,EACZA,EAAeK,CAAAA,EAHC,iBAMhBG,EAAmB,IAAIC,MAAMhB,EAAMiB,MAAM,EAC3CC,EAAgB,GAEdC,EAAWR,EAAA,IAAA,CACf,QAASS,EAAI,EAAGA,EAAIpB,EAAMiB,OAAQG,IAChC,GAAIA,IAAMhB,EAAY,CACpB,IAAMiB,EAAM,KAAKjD,IAAI4B,EAAMoB,CAAAA,CAAE,EAC7B,GAAI,CAACC,EACH,MAAM,IAAIvB,MACR,6CAA6CE,EAAMoB,CAAAA,EAAGjC,MAAQa,EAAMoB,CAAAA,CAAE,mDAAmDzB,EAASR,IAAI,IAAI,EAG9I4B,EAAiBK,CAAAA,EAAKC,CACxB,CAEFH,EAAgB,EAClB,EAbiB,YAebI,EAEJ,OAAIlB,IAAe,GACjBkB,EAAgBX,EAAA,KACTO,GAAeC,EAAAA,EACbT,EACLR,EAAeqB,MAAMtB,EAAac,CAAAA,CAAAA,GAHtB,iBAMPf,EAAMiB,SAAW,EACtBX,EACFgB,EAAgBX,EAACa,GAAAA,CACf,IAAMC,EAAUT,MAAMU,QAAQF,CAAAA,EAC1BA,EACA,CAACA,GAEL,GAAIC,EAAQR,OAAS,GAAK,EAAEQ,EAAQ,CAAA,YAActB,GAChD,MAAM,IAAIL,MACR,kDAAkDK,EAAahB,IAAI,aAAasC,EAAQ,CAAA,GAAI,aAAatC,IAAAA,EAAM,EAInH,OAAOuB,EAAcR,EAAeyB,KAAK1B,EAAawB,CAAAA,CAAAA,CACxD,EAZgB,iBAchBH,EAAgBX,EAACa,GAAAA,CACf,IAAMC,EAAUT,MAAMU,QAAQF,CAAAA,EAC1BA,EAAeA,EAAeP,OAAS,CAAA,EACvCO,EAEJ,GAAI,EAAEC,aAAmBtB,GACvB,MAAM,IAAIL,MACR,0CAA0CK,EAAahB,IAAI,aAAcsC,GAAiB,aAAatC,IAAAA,EAAM,EAIjH,OAAOuB,EAAcR,EAAeyB,KAAK1B,EAAawB,CAAAA,CAAAA,CACxD,EAZgB,iBAednB,EACFgB,EAAgBX,EAACa,GAAAA,CACVN,GAAeC,EAAAA,EACpB,IAAMM,EAAUT,MAAMU,QAAQF,CAAAA,EAC1BA,EACA,CAACA,GAEL,GAAIC,EAAQR,OAAS,GAAK,EAAEQ,EAAQ,CAAA,YAActB,GAChD,MAAM,IAAIL,MACR,kDAAkDK,EAAahB,IAAI,aAAasC,EAAQ,CAAA,GAAI,aAAatC,IAAAA,EAAM,EAInH,IAAMyC,EAAW,IAAIb,GACrBa,OAAAA,EAASxB,CAAAA,EAAcqB,EAChBf,EAAcR,EAAeqB,MAAMtB,EAAa2B,CAAAA,CAAAA,CACzD,EAfgB,iBAiBhBN,EAAgBX,EAACa,GAAAA,CACVN,GAAeC,EAAAA,EACpB,IAAMM,EAAUT,MAAMU,QAAQF,CAAAA,EAC1BA,EAAeA,EAAeP,OAAS,CAAA,EACvCO,EAEJ,GAAI,EAAEC,aAAmBtB,GACvB,MAAM,IAAIL,MACR,0CAA0CK,EAAahB,IAAI,aAAcsC,GAAiB,aAAatC,IAAAA,EAAM,EAIjH,IAAMyC,EAAW,IAAIb,GACrBa,OAAAA,EAASxB,CAAAA,EAAcqB,EAChBf,EAAcR,EAAeqB,MAAMtB,EAAa2B,CAAAA,CAAAA,CACzD,EAfgB,iBAmBnBN,EAAsB1B,cAAgBA,EAEhC,KAAKlC,OAAOgC,SAASS,EAAcmB,EAAejB,CAAAA,CAC3D,CACF,EAtNahD,EAAAA,GAAAA,YAAN,IAAMA,EAANwE,sFC1BN,SAAAC,GAAAC,EAAAC,EAAAC,EAAAC,EAAA,kTAAAC,EAAAL,GAAA,kJAKD,IAAIM,EAAe,GAEZ,SAASC,GAAaC,EAAe,CAC1CF,EAAeE,CACjB,CAFgBD,EAAAA,GAAAA,gBAIhB,IAAME,EAAM,CACVC,MAAO,UACPC,IAAK,WACLC,OAAQ,WACRC,KAAM,WACNC,QAAS,WACTC,KAAM,WACNC,KAAM,WACNC,KAAM,UACNC,MAAO,UACT,EAzBAC,EA2BMC,GAAND,EAAA,KAAMC,CAIJ,OACOC,kBAAkBC,EAAmB,CAC1C,GAAI,CAAChB,EAAc,OACnB,IAAMiB,EAAS,GAAGd,EAAIS,KAAK,GAAGT,EAAIQ,IAAI,wBAAmBR,EAAIC,KAAK,GAC5Dc,EAAU,GAAGf,EAAIK,OAAO,GAAGQ,EAAKE,OAAO,GAAGf,EAAIC,KAAK,GAEzDe,QAAQC,IACN,GAAGH,CAAAA,GAASd,EAAIO,IAAI,sBAAsBP,EAAIC,KAAK;EAChDD,EAAIS,KAAK,WAAWT,EAAIC,KAAK,GAChCc,GAAW,cAAA,CAEf,CAKA,OACOG,mBAAmBC,EAAmB,CAC3C,GAAI,CAACtB,EAAc,OACnB,IAAMiB,EAAS,GAAGd,EAAIE,GAAG,GAAGF,EAAIQ,IAAI,yBAAoBR,EAAIC,KAAK,GAC3Dc,EAAU,GAAGf,EAAIK,OAAO,GAAGc,EAAIJ,OAAO,GAAGf,EAAIC,KAAK,GAExDe,QAAQI,MACN,GAAGN,CAAAA,GAASd,EAAIO,IAAI,uBAAuBP,EAAIC,KAAK;EACjDD,EAAIE,GAAG,WAAWF,EAAIC,KAAK,IAAIc,CAAAA;EAC/Bf,EAAIE,GAAG,WAAWF,EAAIC,KAAK,GAC9BkB,EAAIC,OAASD,GAAO,eAAA,CAExB,CAKA,OACOE,kBAAkBC,EAAmB,CAC1C,GAAI,CAACzB,EAAc,OACnB,IAAMiB,EAAS,GAAGd,EAAIG,MAAM,GAAGH,EAAIQ,IAAI,wBAAmBR,EAAIC,KAAK,GAC7Dc,EAAU,GAAGf,EAAIM,IAAI,GAAGgB,EAAKP,OAAO,GAAGf,EAAIC,KAAK,GAEtDe,QAAQM,KACN,GAAGR,CAAAA,GAASd,EAAIO,IAAI,sBAAsBP,EAAIC,KAAK;EAChDD,EAAIG,MAAM,WAAWH,EAAIC,KAAK,IAAIc,CAAAA,EAAS,CAElD,CACF,EAhDMJ,EAAAA,EAAAA,mBAAND,waAkDO,SAASa,GAAqBC,EAAa,CAChDA,EAAIC,SAASd,EAAgBC,iBAAiB,EAC9CY,EAAIC,SAASd,EAAgBO,kBAAkB,EAC/CM,EAAIC,SAASd,EAAgBU,iBAAiB,CAChD,CAJgBE,EAAAA,GAAAA,wBblDT,SAASG,GAAYC,EAAoBC,EAAa,CAC3DD,EAAS,CAAE,GAAGC,EAAe,GAAGD,CAAO,EACvC,IAAME,EAAM,IAAIC,EAASH,EAAOI,SAAWJ,EAAOK,MAAM,EAExDC,GAAqBJ,CAAAA,EACrBK,GAAaP,EAAOQ,SAAS,EAC7BN,EAAIO,WAAWC,CAAAA,EACf,IAAMC,EAAOT,EACbA,OAAAA,EAAIU,MAAMD,CAAAA,EACHT,CACT,CAVgBH,EAAAA,GAAAA","names":["index_exports","__export","BaseMessage","Component","Controller","ErrorMessage","EventMessage","InfoMessage","MessageEngine","MessageRegistry","MessageWriter","Observer","Safe","SingleMessage","System","VIRID_METADATA","ViridApp","WarnMessage","activateInstance","bindObservers","createVirid","defaultConfig","handleResult","__toCommonJS","defaultConfig","maxDepth","enableLog","manual","activeInstance","activateInstance","instance","dispatch","message","console","error","MessageWriter","write","target","args","e","context","ErrorMessage","warn","WarnMessage","info","InfoMessage","_MessageWriter","BaseMessage","send","args","MessageWriter","write","_BaseMessage","SingleMessage","_SingleMessage","EventMessage","_EventMessage","ErrorMessage","error","context","_ErrorMessage","WarnMessage","_WarnMessage","InfoMessage","_InfoMessage","MessageRegistry","systemTaskMap","Map","register","messageClass","systemFn","priority","systems","get","findIndex","s","fn","systemContext","originalMethod","push","sort","a","b","set","funcName","methodName","targetClass","MessageWriter","error","Error","name","currentSystems","index","splice","length","delete","_MessageRegistry","Staging","signalActive","Map","eventActive","signalStaging","eventStaging","stage","event","SingleMessage","type","has","set","get","push","EventMessage","MessageWriter","error","Error","name","flip","clearSignals","clearEvents","isEmpty","size","length","reset","_Staging","Dispatcher","maxDepth","isRunning","globalTick","internalDepth","staging","Staging","tickPayload","beforeExecuteHooks","afterExecuteHooks","beforeTickHooks","afterTickHooks","addBeforeExecute","type","hook","front","unshift","handler","push","addAfterExecute","addBeforeTick","addAfterTick","stage","message","tick","systemTaskMap","isEmpty","reset","console","error","Error","queueMicrotask","executeTickHooks","flip","tasks","collectTasks","executeTasks","e","MessageWriter","tickSync","msg","eventActive","get","forEach","s","ExecutionTask","fn","priority","context","systemContext","payload","msg_list","signalActive","entries","sort","a","b","task","Array","isArray","result","execute","Promise","catch","hookContext","targetClass","name","methodName","JSON","stringify","hooks","hooksContext","timestamp","Date","now","h","_Dispatcher","success","triggerHooks","sample","runAfter","__name","finally","_ExecutionTask","MessageEngine","maxDepth","manual","dispatcher","registry","MessageRegistry","middlewares","Dispatcher","activateInstance","useMiddleware","mw","front","push","onBeforeExecute","type","hook","addBeforeExecute","onAfterExecute","addAfterExecute","onBeforeTick","addBeforeTick","onAfterTick","addAfterTick","tick","tickSync","systemTaskMap","dispatch","message","BaseMessage","MessageWriter","error","Error","pipeline","has","name","stage","finalAction","index","next","__name","length","register","messageClass","systemFn","priority","_MessageEngine","VIRID_METADATA","SYSTEM","MESSAGE","CONTROLLER","COMPONENT","SAFE","OBSERVER","handleResult","res","Array","isArray","forEach","m","BaseMessage","MessageWriter","write","warn","checkMessageParam","types","foundMatches","type","idx","prototype","push","length","errorDetails","map","item","name","join","Error","System","params","messageClass","priority","target","key","descriptor","originalMethod","value","Reflect","getMetadata","undefinedIndices","t","i","undefined","filter","messageIdx","batchMode","listIdx","indexOf","SingleMessage","matchedMessage","systemContext","targetClass","methodName","systemConfig","Safe","_descriptor","safeMethods","VIRID_METADATA","SAFE","Set","add","defineMetadata","Observer","callback","propertyKey","observerMetadata","OBSERVER","Controller","CONTROLLER","Component","COMPONENT","ARRAY_MUTABLE_METHODS","bindObservers","instance","Object","prototype","hasOwnProperty","call","defineProperty","value","enumerable","configurable","Reflect","getMetadata","VIRID_METADATA","OBSERVER","forEach","propertyKey","callback","box","logicProxy","Proxy","get","target","prop","Array","isArray","includes","args","oldVal","result","apply","observerResult","handleResult","set","_prop","newVal","getter","__name","__virid_box__","v","ownKeys","key","desc","getOwnPropertyDescriptor","val","ViridContainer","bindings","Map","singletonInstances","activationHooks","addActivationHook","hook","front","unshift","push","bind","identifier","length","Error","name","Reflect","getMetadata","VIRID_METADATA","COMPONENT","binding","type","ctor","set","CONTROLLER","spawn","instance","hasMetadata","get","TargetCtor","has","rawInstance","processedInstance","handleActivation","_ViridContainer","ViridApp","maxDepth","manual","container","ViridContainer","engine","installedPlugins","Set","MessageEngine","spawn","onActivate","hook","front","addActivationHook","tick","get","identifier","bind","instance","useMiddleware","mw","onBeforeExecute","type","onAfterExecute","onBeforeTick","onAfterTick","use","plugin","options","has","name","MessageWriter","warn","install","add","e","error","register","systemFn","systemContext","systemConfig","Error","params","types","targetClass","originalMethod","messageClass","messageIdx","priority","batchMode","handleResultFn","handleResult","res","processResult","__name","result","Promise","then","cachedComponents","Array","length","isInitialized","initDeps","i","dep","wrappedSystem","apply","currentMessage","payload","isArray","call","callArgs","_ViridApp","_ts_decorate","decorators","target","key","desc","__name","globalSwitch","toggleSwitch","enable","clr","reset","red","yellow","blue","magenta","cyan","gray","bold","green","_a","ViridLogHandler","globalInfoHandler","info","header","context","console","log","globalErrorHandler","err","error","globalWarnHandler","warn","registerBasicSystems","app","register","createVirid","config","defaultConfig","app","ViridApp","maxDepth","manual","registerBasicSystems","toggleSwitch","enableLog","onActivate","bindObservers","self","spawn"]}
|