@virid/core 0.0.1 → 0.1.1
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/LICENSE +190 -0
- package/README.md +187 -173
- package/README.zh.md +182 -130
- package/dist/index.cjs +32 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +240 -0
- package/dist/index.d.ts +139 -117
- package/dist/index.js +32 -712
- package/dist/index.js.map +1 -0
- package/package.json +15 -23
- package/dist/index.d.mts +0 -218
- package/dist/index.mjs +0 -674
|
@@ -0,0 +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"],"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\";\nexport { type ViridApp, type ViridPlugin } from \"./app\";\n\nexport function createVirid(): ViridApp {\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 // @ts-ignore 只用来区分的标识符\n private readonly __kind = \"SingleMessage\" as const;\n constructor() {\n super();\n }\n}\n\n/**\n * 不可合并的消息基类\n */\nexport abstract class EventMessage extends BaseMessage {\n // @ts-ignore 只用来区分的标识符\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 */\nexport class AtomicModifyMessage<T> extends EventMessage {\n constructor(\n public readonly ComponentClass: Newable<T>, // 你要改哪个组件?\n public readonly recipe: (comp: T) => void, // 你打算怎么改?\n public readonly label: string, // 为什么要改?\n ) {\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 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 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 */\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 == 0) {\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 {\n AtomicModifyMessage,\n ErrorMessage,\n InfoMessage,\n MessageWriter,\n WarnMessage,\n} from \"./core\";\nimport { type SystemContext } from \"./interfaces\";\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 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 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 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 * 注册修改处理器\n */\nconst atomicModifyHandler = (modifications: AtomicModifyMessage<any>) => {\n const rawComponent = activeApp.get(modifications.ComponentClass);\n\n if (!rawComponent) {\n console.error(\n `[Virid Modify] Component Not Found:\\n Component ${modifications.ComponentClass.name} not found in Registry.`,\n );\n return;\n }\n // 执行修改逻辑\n try {\n modifications.recipe(rawComponent);\n // 记录显式的审计日志\n MessageWriter.warn(\n `[Virid Modify] Successfully:\\nModify on ${modifications.ComponentClass.name}\\nlabel: ${modifications.label}`,\n );\n } catch (e) {\n MessageWriter.error(\n e as Error,\n `[Virid Error] Modify Failed:\\n${modifications.label}`,\n );\n }\n};\n\n/**\n * 激活真正的 App 实例\n */\nexport function initializeGlobalSystems(app: ViridApp) {\n // 确保全局处理器优先级最高\n app.register(\n AtomicModifyMessage,\n withContext(\n AtomicModifyMessage<any>,\n atomicModifyHandler,\n \"GlobalAtomicModifier\",\n ),\n 1000, // 修改器优先级通常极高,确保状态第一时间更新\n );\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 // @ts-ignore\n return targetMethod.apply(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 = any> {\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(e, `[Virid Container] Activation Hook Failed`);\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 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) {\n return (target: any, key: string) => {\n // 记录哪些属性需要变成响应式\n const observerMetadata: ObserverMetadata =\n Reflect.getMetadata(VIRID_METADATA.OBSERVER, target) || [];\n observerMetadata.push({ key, 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 { 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: any[] =\n Reflect.getMetadata(VIRID_METADATA.OBSERVER, instance.constructor) || [];\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"],"mappings":"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","names":["index_exports","__export","AtomicModifyMessage","BaseMessage","Component","Controller","ErrorMessage","EventMessage","InfoMessage","Message","MessageInternal","MessageRegistry","MessageWriter","Observer","Safe","SingleMessage","System","VIRID_METADATA","WarnMessage","activateInstance","bindObservers","createVirid","handleResult","publisher","__toCommonJS","BaseMessage","send","args","MessageWriter","write","_BaseMessage","SingleMessage","__kind","_SingleMessage","EventMessage","_EventMessage","ErrorMessage","error","context","_ErrorMessage","WarnMessage","_WarnMessage","InfoMessage","_InfoMessage","AtomicModifyMessage","ComponentClass","recipe","label","_AtomicModifyMessage","activeInstance","activateInstance","instance","publisher","Proxy","get","_","prop","message","console","error","name","dispatch","Reflect","MessageWriter","write","target","args","e","context","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","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","atomicModifyHandler","modifications","rawComponent","activeApp","get","ComponentClass","name","recipe","MessageWriter","label","e","initializeGlobalSystems","app","register","AtomicModifyMessage","WarnMessage","ErrorMessage","InfoMessage","viridApp","Proxy","_","prop","args","String","targetMethod","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","originalMethod","value","types","Reflect","getMetadata","messageMetadata","VIRID_METADATA","MESSAGE","error","Error","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","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","createVirid","viridApp"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
type Newable<TInstance = unknown, TArgs extends unknown[] = any[]> = new (...args: TArgs) => TInstance;
|
|
2
|
+
|
|
3
|
+
interface SystemParams {
|
|
4
|
+
priority?: number;
|
|
5
|
+
messageClass?: Newable<BaseMessage> | null;
|
|
6
|
+
}
|
|
7
|
+
interface MessageMetadata {
|
|
8
|
+
index: number;
|
|
9
|
+
messageClass: Newable<BaseMessage>;
|
|
10
|
+
single: boolean;
|
|
11
|
+
}
|
|
12
|
+
interface ObserverItem {
|
|
13
|
+
key: string;
|
|
14
|
+
callback: (oldVal: any, newVal: any) => void | BaseMessage | BaseMessage;
|
|
15
|
+
}
|
|
16
|
+
type ObserverMetadata = ObserverItem[];
|
|
17
|
+
interface SafeMetadata extends Set<string> {
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
type Middleware = (message: BaseMessage, next: () => void) => void;
|
|
21
|
+
type ExecuteHook<T extends BaseMessage> = (message: [BaseMessage] extends [T] ? SingleMessage[] | EventMessage : T extends SingleMessage ? T[] : T, context: ExecuteHookContext) => void | Promise<void>;
|
|
22
|
+
interface ExecuteHookContext {
|
|
23
|
+
context: SystemContext;
|
|
24
|
+
tick: number;
|
|
25
|
+
payload: {
|
|
26
|
+
[key: string]: any;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
interface SystemContext {
|
|
30
|
+
params: any[];
|
|
31
|
+
targetClass: any;
|
|
32
|
+
methodName: string;
|
|
33
|
+
originalMethod: (...args: any[]) => any;
|
|
34
|
+
}
|
|
35
|
+
interface SystemTask {
|
|
36
|
+
fn: (...args: any[]) => any;
|
|
37
|
+
priority: number;
|
|
38
|
+
}
|
|
39
|
+
type MessagePayload<T> = T extends SingleMessage ? T[] : T extends EventMessage ? T : T | T[];
|
|
40
|
+
type MessageIdentifier<T> = (abstract new (...args: any[]) => T) | Newable<T>;
|
|
41
|
+
type TickHook = (context: TickHookContext) => void | Promise<void>;
|
|
42
|
+
interface TickHookContext {
|
|
43
|
+
tick: number;
|
|
44
|
+
timestamp: number;
|
|
45
|
+
payload: {
|
|
46
|
+
[key: string]: any;
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
declare abstract class BaseMessage {
|
|
51
|
+
static send<T extends Newable<any>>(this: T, ...args: ConstructorParameters<T>): void;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* 可合并的信号基类
|
|
55
|
+
*/
|
|
56
|
+
declare abstract class SingleMessage extends BaseMessage {
|
|
57
|
+
private readonly __kind;
|
|
58
|
+
constructor();
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* 不可合并的消息基类
|
|
62
|
+
*/
|
|
63
|
+
declare abstract class EventMessage extends BaseMessage {
|
|
64
|
+
private readonly __kind;
|
|
65
|
+
constructor();
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* 基础错误消息:不可合并,必须被精准捕获
|
|
69
|
+
*/
|
|
70
|
+
declare class ErrorMessage extends EventMessage {
|
|
71
|
+
readonly error: Error;
|
|
72
|
+
readonly context?: string;
|
|
73
|
+
constructor(error: Error, context?: string);
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* 基础警告消息:不可合并,必须被精准捕获
|
|
77
|
+
*/
|
|
78
|
+
declare class WarnMessage extends EventMessage {
|
|
79
|
+
readonly context: string;
|
|
80
|
+
constructor(context: string);
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* 基础信息消息:不可合并,必须被精准捕获
|
|
84
|
+
*/
|
|
85
|
+
declare class InfoMessage extends EventMessage {
|
|
86
|
+
readonly context: string;
|
|
87
|
+
constructor(context: string);
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* 原子修改消息:不可合并,带上组件类型、修改逻辑和语义标签
|
|
91
|
+
*/
|
|
92
|
+
declare class AtomicModifyMessage<T> extends EventMessage {
|
|
93
|
+
readonly ComponentClass: Newable<T>;
|
|
94
|
+
readonly recipe: (comp: T) => void;
|
|
95
|
+
readonly label: string;
|
|
96
|
+
constructor(ComponentClass: Newable<T>, // 你要改哪个组件?
|
|
97
|
+
recipe: (comp: T) => void, // 你打算怎么改?
|
|
98
|
+
label: string);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
declare class MessageInternal {
|
|
102
|
+
private eventHub;
|
|
103
|
+
private dispatcher;
|
|
104
|
+
private registry;
|
|
105
|
+
private middlewares;
|
|
106
|
+
constructor();
|
|
107
|
+
useMiddleware(mw: Middleware, front: boolean): void;
|
|
108
|
+
onBeforeExecute<T extends BaseMessage>(type: MessageIdentifier<T>, hook: ExecuteHook<T>, front: boolean): void;
|
|
109
|
+
onAfterExecute<T extends BaseMessage>(type: MessageIdentifier<T>, hook: ExecuteHook<T>, front: boolean): void;
|
|
110
|
+
onBeforeTick(hook: TickHook, front: boolean): void;
|
|
111
|
+
onAfterTick(hook: TickHook, front: boolean): void;
|
|
112
|
+
/**
|
|
113
|
+
* 消息进入系统的唯一入口
|
|
114
|
+
*/
|
|
115
|
+
dispatch(message: BaseMessage): void;
|
|
116
|
+
private pipeline;
|
|
117
|
+
register(messageClass: any, systemFn: (...args: any[]) => any, priority?: number): () => void;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @description: 消息注册器 - 负责将系统函数或监听器与消息类型关联
|
|
122
|
+
*/
|
|
123
|
+
declare class MessageRegistry {
|
|
124
|
+
systemTaskMap: Map<any, SystemTask[]>;
|
|
125
|
+
/**
|
|
126
|
+
* 注册消息并返回一个卸载函数
|
|
127
|
+
* 这种模式能完美适配 Controller 的生命周期销毁
|
|
128
|
+
*/
|
|
129
|
+
register(messageClass: any, systemFn: (...args: any[]) => any, priority?: number): () => void;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
interface IMessagePublisher {
|
|
133
|
+
dispatch(message: BaseMessage): void;
|
|
134
|
+
}
|
|
135
|
+
declare function activateInstance(instance: MessageInternal): void;
|
|
136
|
+
declare const publisher: IMessagePublisher;
|
|
137
|
+
declare class MessageWriter {
|
|
138
|
+
/**
|
|
139
|
+
* 核心入口:无论是类还是实例,统一交给 Internal 处理
|
|
140
|
+
*/
|
|
141
|
+
static write<T extends BaseMessage, K extends Newable<T>>(target: K | T, ...args: ConstructorParameters<K>): void;
|
|
142
|
+
/**
|
|
143
|
+
* 快捷方式:系统内部常用
|
|
144
|
+
*/
|
|
145
|
+
static error(e: Error, context?: string): void;
|
|
146
|
+
static warn(context: string): void;
|
|
147
|
+
static info(context: string): void;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
declare const handleResult: (res: any) => void;
|
|
151
|
+
/**
|
|
152
|
+
* @description: 系统装饰器
|
|
153
|
+
* @param priority 优先级,数值越大越早执行
|
|
154
|
+
*/
|
|
155
|
+
declare function System(params?: SystemParams): (target: any, key: string, descriptor: PropertyDescriptor) => void;
|
|
156
|
+
/**
|
|
157
|
+
* @description: 标记参数为 MessageReader 并锁定其消息类型
|
|
158
|
+
*/
|
|
159
|
+
declare function Message<T extends BaseMessage>(messageClass: Newable<T>, single?: boolean): (target: any, key: string, index: number) => void;
|
|
160
|
+
/**
|
|
161
|
+
* @description: 标识controller或者组件的方法是否是安全的,可被其他controller直接调用
|
|
162
|
+
*/
|
|
163
|
+
declare function Safe(): (target: any, key: string, _descriptor: PropertyDescriptor) => void;
|
|
164
|
+
/**
|
|
165
|
+
* @description: 标识Component里的这个属性被改了之后需要调用一个回调
|
|
166
|
+
*/
|
|
167
|
+
declare function Observer(callback: (oldVal: any, newVale: any) => void | BaseMessage | BaseMessage, []: Iterable<any, void, undefined>): (target: any, key: string) => void;
|
|
168
|
+
/**
|
|
169
|
+
* @description: 标记Controller身份
|
|
170
|
+
*/
|
|
171
|
+
declare function Controller(): (target: any) => void;
|
|
172
|
+
/**
|
|
173
|
+
* @description: 标记Component身份
|
|
174
|
+
*/
|
|
175
|
+
declare function Component(): (target: any) => void;
|
|
176
|
+
|
|
177
|
+
declare function bindObservers(instance: any): any;
|
|
178
|
+
|
|
179
|
+
declare const VIRID_METADATA: {
|
|
180
|
+
readonly SYSTEM: "virid:core:system";
|
|
181
|
+
readonly MESSAGE: "virid:core:message";
|
|
182
|
+
readonly CONTROLLER: "virid:core:controller";
|
|
183
|
+
readonly COMPONENT: "virid:core:component";
|
|
184
|
+
readonly SAFE: "virid:core:safe";
|
|
185
|
+
readonly OBSERVER: "virid:core:observer";
|
|
186
|
+
};
|
|
187
|
+
|
|
188
|
+
declare class ViridContainer {
|
|
189
|
+
private bindings;
|
|
190
|
+
private singletonInstances;
|
|
191
|
+
bind<T>(identifier: Newable<T>): {
|
|
192
|
+
toSelf: () => {
|
|
193
|
+
inSingletonScope: () => {
|
|
194
|
+
onActivation: (fn: any) => void;
|
|
195
|
+
};
|
|
196
|
+
};
|
|
197
|
+
};
|
|
198
|
+
get<T>(identifier: Newable<T>, onActivate: (instance: T) => T): T;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
interface ViridPlugin<T = any> {
|
|
202
|
+
name: string;
|
|
203
|
+
install: (app: ViridApp, options?: T) => void;
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* 创建 virid 核心实例
|
|
207
|
+
*/
|
|
208
|
+
declare class ViridApp {
|
|
209
|
+
container: ViridContainer;
|
|
210
|
+
private messageInternal;
|
|
211
|
+
private activationHooks;
|
|
212
|
+
addActivationHook(hook: (instance: any) => any): void;
|
|
213
|
+
get<T>(identifier: Newable<T>): T;
|
|
214
|
+
private handleActivation;
|
|
215
|
+
/**
|
|
216
|
+
* 绑定多例 (Controller 通常是多例)
|
|
217
|
+
*/
|
|
218
|
+
bindController<T>(identifier: Newable<T>): {
|
|
219
|
+
inSingletonScope: () => {
|
|
220
|
+
onActivation: () => void;
|
|
221
|
+
};
|
|
222
|
+
};
|
|
223
|
+
/**
|
|
224
|
+
* 绑定单例 (Component 是单例)
|
|
225
|
+
*/
|
|
226
|
+
bindComponent<T>(identifier: Newable<T>): {
|
|
227
|
+
onActivation: () => void;
|
|
228
|
+
};
|
|
229
|
+
useMiddleware(mw: Middleware, front?: boolean): void;
|
|
230
|
+
onBeforeExecute<T extends BaseMessage>(type: MessageIdentifier<T>, hook: ExecuteHook<T>, front?: boolean): void;
|
|
231
|
+
onAfterExecute<T extends BaseMessage>(type: MessageIdentifier<T>, hook: ExecuteHook<T>, front?: boolean): void;
|
|
232
|
+
onBeforeTick(hook: TickHook, front?: boolean): void;
|
|
233
|
+
onAfterTick(hook: TickHook, front?: boolean): void;
|
|
234
|
+
register(messageClass: any, systemFn: (...args: any[]) => any, priority?: number): () => void;
|
|
235
|
+
use<T>(plugin: ViridPlugin<T>, options: T): this;
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
declare function createVirid(): ViridApp;
|
|
239
|
+
|
|
240
|
+
export { AtomicModifyMessage, BaseMessage, Component, Controller, ErrorMessage, EventMessage, type ExecuteHook, type ExecuteHookContext, type IMessagePublisher, InfoMessage, Message, type MessageIdentifier, MessageInternal, type MessageMetadata, type MessagePayload, MessageRegistry, MessageWriter, type Middleware, type Newable, Observer, type ObserverItem, type ObserverMetadata, Safe, type SafeMetadata, SingleMessage, System, type SystemContext, type SystemParams, type SystemTask, type TickHook, type TickHookContext, VIRID_METADATA, ViridApp, type ViridPlugin, WarnMessage, activateInstance, bindObservers, createVirid, handleResult, publisher };
|