@virid/express 0.1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts","../src/app.ts","../src/decorators/register.ts","../src/http/context.ts","../src/http/http-response.ts","../../core/src/core/message.ts","../../core/src/core/io.ts","../../core/src/core/dispatcher.ts","../../core/src/core/event-hub.ts","../../core/src/core/registry.ts","../../core/src/core/internal.ts","../../core/src/container.ts","../../core/src/utils.ts","../../core/src/app.ts","../../core/src/decorators/constant.ts","../../core/src/decorators/ccs.ts","../../core/src/decorators/bind.ts","../../core/src/index.ts","../src/http/utils.ts","../src/http/message.ts","../src/decorators/express.ts","../src/decorators/constant.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: Add express functionality to virid.\n */\nimport { ViridPlugin, type ViridApp } from \"@virid/core\";\nimport { activateApp } from \"./app\";\nimport { PluginOptions } from \"./interfaces\";\n\nexport * from \"./http\";\nexport * from \"./decorators\";\nexport const ExpressPlugin: ViridPlugin<PluginOptions> = {\n name: \"@virid/express\",\n install(app: ViridApp, options) {\n activateApp(app, options);\n },\n};\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Express\n */\nimport { type ViridApp, MessageWriter } from \"@virid/core\";\nimport { type PluginOptions } from \"./interfaces\";\n\nimport { registerHttpSystem, registerHttpRoute } from \"./decorators/register\";\n\nexport interface IViridApp {\n get(identifier: any): any;\n}\n\nlet activeApp: IViridApp | null = null;\n\nexport function activateApp(app: ViridApp, options: PluginOptions) {\n //看看用户提供的配置\n activeApp = app;\n // 注册http相关的系统\n registerHttpSystem(app);\n //初始化express的路由\n registerHttpRoute(options.server);\n}\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 MessageWriter.warn(\n `[Virid Vue] App method \"${String(prop)}\" called before initialization.`,\n );\n return null;\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 Express\n */\nimport { MessageRegistry, MessageWriter, type ViridApp } from \"@virid/core\";\nimport { type HttpMethod, type HttpRouteInfo } from \"../interfaces\";\nimport { type Express, type Request, type Response } from \"express\";\nimport { httpContextStore } from \"../http/context\";\nimport { HttpContext, type RequestId } from \"../http\";\n// 临时的注册器\nexport const stagingSystemRegister = new MessageRegistry();\n// 路由注册器\nexport const httpRouteRegistry = new Map<string, HttpRouteInfo>();\n\nlet _internalHttpIdCounter = 0;\n\n/**\n * 注册HttpSystem到app的调度器里\n */\nexport function registerHttpSystem(app: ViridApp) {\n for (const [\n messageClass,\n systemTasks,\n ] of stagingSystemRegister.systemTaskMap.entries()) {\n for (const task of systemTasks) {\n app.register(messageClass, task.fn, task.priority);\n }\n }\n stagingSystemRegister.systemTaskMap.clear();\n}\n\n/**\n * 注册express路由\n */\nexport function registerHttpRoute(server: Express) {\n for (const [_, routeInfo] of httpRouteRegistry.entries()) {\n const { method, path, httpMessage } = routeInfo;\n const expressMethod = method.toLowerCase() as HttpMethod;\n\n //挂载\n server[expressMethod](path, (req: Request, res: Response) => {\n // 实例化 Message\n const newId = _internalHttpIdCounter++ >>> 0;\n\n //存一下上下文信息\n httpContextStore.set(\n newId,\n new HttpContext(newId, req, res, Date.now(), path),\n );\n const message = new httpMessage(newId as RequestId);\n // finish 代表响应已发送,close 代表连接意外中断,两者都应清理\n res.once(\"finish\", () => httpContextStore.delete(newId));\n res.once(\"close\", () => httpContextStore.delete(newId));\n // 触发消息\n MessageWriter.write(message);\n });\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Express\n */\nimport { BaseMessage, MessageWriter } from \"@virid/core\";\nimport {\n type HttpContext,\n HttpResponse,\n StreamFileResponse,\n HttpError,\n StreamResponse,\n} from \"./http-response\";\nexport const httpContextStore = new Map<number, HttpContext>();\n\n/**\n * 统一处理 System 返回值\n * @param res System 函数的返回值\n * @param ctx 当前请求的 HttpContext\n */\nexport function handleResult(res: any, context: HttpContext) {\n if (!res) {\n context.dec();\n return;\n }\n // 支持数组形式的批量返回\n const results = Array.isArray(res) ? res : [res];\n results.forEach((item) => {\n // 处理物理响应 (HttpResponse)\n\n if (item instanceof HttpResponse) {\n // 如果是终结响应,则处理\n handleHttpResponse(item, context);\n } else if (item instanceof HttpError) {\n // 处理错误\n context.res.status(item.status).json(item.message);\n // 从 store 中移除\n httpContextStore.delete(context.id);\n } else if (item instanceof BaseMessage) {\n // 转发消息\n MessageWriter.write(item);\n }\n // 其他非法类型警告\n else {\n MessageWriter.warn(\n `[Virid Express] Invalid Return Type: ${typeof item}. Expected HttpResponse or Message.`,\n );\n }\n });\n // system不管是出错了还是执行完毕,handleResult都会执行,引用计数-1并检查是否是0\n // 如果是0,而且此时还没关闭,那就强制关闭\n // 第一种情况:上面执行了handleHttpResponse,那么在这之前HttpContext就已经被删除了\n // 第二种情况:上面转发了HttpRequestMessage,那么这会抹除此次system执行的痕迹,但是HttpContext由于引用计数,不会被删除\n // 第三种情况:上面转发了其他消息或者其他的返回值,那么引用计数-1并检查是否是0,如果是0,那么强制关闭\n context.dec();\n}\n\nfunction handleHttpResponse(response: HttpResponse, ctx: HttpContext) {\n const { res } = ctx;\n //其他情况,直接返回\n if (response.headers) {\n Object.entries(response.headers).forEach(([k, v]) => res.setHeader(k, v));\n }\n if (response.status) res.status(response.status);\n if (response instanceof StreamFileResponse) {\n //返回异步流,强行增加一个rc续命\n ctx.inc();\n res.sendFile(response.filePath, response.options, (err) => {\n if (!res.headersSent) {\n MessageWriter.error(\n err,\n `[Virid Express] SteamFile Error: Path: ${response.filePath}`,\n );\n }\n //强制删除context\n ctx.res.end();\n httpContextStore.delete(ctx.id);\n ctx.isClosed = true;\n ctx.dec();\n });\n return;\n }\n if (response instanceof StreamResponse) {\n const { stream } = response;\n ctx.inc();\n // 管道传输\n stream.pipe(res);\n // 监听结束,收割上下文\n const cleanup = () => {\n if (!httpContextStore.has(ctx.id)) return;\n ctx.res.end();\n httpContextStore.delete(ctx.id);\n ctx.isClosed = true;\n ctx.dec(); // 触发最后的 finalize\n };\n stream.on(\"end\", cleanup);\n stream.on(\"error\", (err) => {\n if (!res.headersSent) {\n MessageWriter.error(err, `[Virid Express] Stream Error`);\n }\n cleanup();\n });\n stream.on(\"close\", cleanup);\n return;\n }\n\n res.status(response.status).json(response.data);\n //强制删除context\n httpContextStore.delete(ctx.id);\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Express\n */\nimport { type Request, type Response } from \"express\";\nimport { Readable } from \"stream\";\nimport { MessageWriter } from \"@virid/core\";\ninterface HttpHeaders {\n [key: string]: string | string[];\n}\nexport class HttpContext {\n public rc: number = 0;\n public isClosed: boolean = false;\n\n constructor(\n public readonly id: number,\n public readonly req: Request,\n public readonly res: Response,\n public readonly timestamp: number,\n public readonly route: string,\n ) {}\n\n /**\n * Increment Reference Count (进入 System)\n */\n inc() {\n this.rc++;\n }\n\n /**\n * Decrement Reference Count (离开 System)\n * 如果归零且未响应,则判定为孤立响应,强制收割\n */\n dec() {\n this.rc--;\n if (this.rc === 0) {\n this.tryFinalize();\n }\n }\n\n private tryFinalize() {\n // 如果已经由 System 正常返回\n // 或者已经强制关闭过,则直接跳过\n if (this.res.writableEnded || this.isClosed) return;\n\n this.isClosed = true;\n\n // 强制报错并关闭连接\n const errorMsg = `[Virid Express] Request Orphaned: The connection was closed because all systems finished execution without sending a response. \n Route: ${this.route}\n Uptime: ${Date.now() - this.timestamp}ms`;\n\n MessageWriter.error(new Error(errorMsg));\n\n if (!this.res.headersSent) {\n this.res.status(500).json({\n error: \"Internal Logic Error\",\n message:\n \"Request processed but no response was returned by any system.\",\n });\n } else {\n // 如果 header 已经发了但没写完,强行结束流\n this.res.end();\n }\n }\n}\n\nexport abstract class HttpResponse {\n constructor(\n public status: number,\n public data: any = null,\n public headers: HttpHeaders = {},\n ) {}\n}\n\n// --- 2xx Success ---\nexport class OkResponse extends HttpResponse {\n constructor(data: any, headers: HttpHeaders = {}) {\n super(200, data, headers);\n }\n}\n\nexport class CreatedResponse extends HttpResponse {\n constructor(data: any, headers: HttpHeaders = {}) {\n super(201, data, headers);\n }\n}\n\nexport class NoContentResponse extends HttpResponse {\n constructor() {\n super(204, null);\n }\n}\n\n// --- 4xx Client Error ---\nexport class BadRequestResponse extends HttpResponse {\n constructor(message: string = \"Bad Request\") {\n super(400, { error: message });\n }\n}\n\nexport class UnauthorizedResponse extends HttpResponse {\n constructor(message: string = \"Unauthorized\") {\n super(401, { error: message });\n }\n}\n\nexport class ForbiddenResponse extends HttpResponse {\n constructor(message: string = \"Forbidden\") {\n super(403, { error: message });\n }\n}\n\nexport class NotFoundResponse extends HttpResponse {\n constructor(message: string = \"Not Found\") {\n super(404, { error: message });\n }\n}\n\nexport class ConflictResponse extends HttpResponse {\n constructor(message: string = \"Conflict\") {\n super(409, { error: message });\n }\n}\n\nexport class UnprocessableEntityResponse extends HttpResponse {\n constructor(errors: any) {\n super(422, { errors });\n }\n}\n\n// --- 5xx Server Error ---\nexport class InternalServerErrorResponse extends HttpResponse {\n constructor(message: string = \"Internal Server Error\") {\n super(500, { error: message });\n }\n}\n\n// --- 万能类 (Custom) ---\nexport class CustomResponseResponse extends HttpResponse {\n constructor(status: number, data: any, headers: HttpHeaders = {}) {\n super(status, data, headers);\n }\n}\n/**\n * @description: Express sendFile 配置项的强类型定义\n */\nexport interface StreamFileOptions {\n /** 根目录(如果 path 是相对路径则必填) */\n root?: string;\n /** * 对以 . 开头的文件处理策略:\n * - allow: 允许发送\n * - deny: 拒绝并返回 403\n * - ignore: 当作不存在返回 404\n */\n dotfiles?: \"allow\" | \"deny\" | \"ignore\";\n /** 是否发送 ETag */\n etag?: boolean;\n /** 扩展的 HTTP 响应头 */\n headers?: HttpHeaders;\n /** 缓存最大时长 (毫秒) */\n maxAge?: number | string;\n /** 是否在 Cache-Control 中添加 immutable */\n immutable?: boolean;\n /** 是否根据文件系统设置 Last-Modified */\n lastModified?: boolean;\n /** 是否支持断点续传 (Range 请求) */\n acceptRanges?: boolean;\n /** 还有一些不常用的(如 cacheControl, extensions)也可以按需添加 */\n}\nexport class StreamFileResponse extends HttpResponse {\n constructor(\n public readonly filePath: string,\n public readonly options: StreamFileOptions = { dotfiles: \"allow\" },\n ) {\n super(206, options);\n }\n}\n\nexport class StreamResponse extends HttpResponse {\n constructor(\n public readonly stream: Readable,\n public readonly options: {\n status?: number;\n headers?: HttpHeaders;\n } = {},\n ) {\n super(options.status, {}, options.headers);\n }\n}\n// --- 辅助工厂函数 ---\n\n/** 200 OK */\nexport const Ok = (data: any, headers: HttpHeaders = {}) =>\n new OkResponse(data, headers);\n\n/** 201 Created */\nexport const Created = (data: any, headers: HttpHeaders = {}) =>\n new CreatedResponse(data, headers);\n\n/** 204 No Content */\nexport const NoContent = () => new NoContentResponse();\n\n/** 400 Bad Request */\nexport const BadRequest = (msg = \"Bad Request\") => new BadRequestResponse(msg);\n\n/** 401 Unauthorized */\nexport const Unauthorized = (msg = \"Unauthorized\") =>\n new UnauthorizedResponse(msg);\n\n/** 403 Forbidden */\nexport const Forbidden = (msg = \"Forbidden\") => new ForbiddenResponse(msg);\n\n/** 404 Not Found */\nexport const NotFound = (msg = \"Not Found\") => new NotFoundResponse(msg);\n\n/** 500 Internal Error */\nexport const InternalServerError = (msg = \"Internal Server Error\") =>\n new InternalServerErrorResponse(msg);\n\nexport const CustomResponse = (\n status: number,\n data: any,\n headers: HttpHeaders = {},\n) => new CustomResponseResponse(status, data, headers);\n\n/** 发送本地文件 (自动处理 Range/206) */\nexport const StreamFile = (path: string, options?: StreamFileOptions) =>\n new StreamFileResponse(path, options);\n/**\n * 发送流响应\n */\nexport const Stream = (stream: Readable, options?: StreamResponse[\"options\"]) =>\n new StreamResponse(stream, options);\n\nexport class HttpError extends Error {\n constructor(\n public readonly status: number,\n public readonly message: string,\n ) {\n super(message);\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 // 实例化并传递给 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","/*\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 Express\n */\nimport { MessageWriter } from \"packages/core/dist\";\nimport { HttpError } from \".\";\nimport { type TransformPipe } from \"../interfaces\";\n\nexport function ParseIntPipe(val: string) {\n const res = parseInt(val, 10);\n if (isNaN(res))\n throw new HttpError(400, `Validation failed: \"${val}\" is not a number.`);\n return res;\n}\n\nexport function ParseBoolPipe(val: string) {\n if (val === \"true\" || val === \"1\") return true;\n if (val === \"false\" || val === \"0\") return false;\n return !!val;\n}\n\n/** 存储类型与 Pipe 的映射 */\nconst autoPipeMap = new Map<any, TransformPipe<any>>();\nautoPipeMap.set(Number, ParseIntPipe);\nautoPipeMap.set(Boolean, ParseBoolPipe);\n\n/**\n * 让用户注册自定义类型的转换方法\n */\nexport function addAutoPipe<T>(type: T, pipe: TransformPipe<T>) {\n if (autoPipeMap.has(type)) {\n MessageWriter.error(\n new Error(\n `[Virid Express Pipe] Repeated Pipe: Auto pipe for ${type} has already been registered.`,\n ),\n );\n return;\n }\n autoPipeMap.set(type, pipe);\n}\n\n/**\n * 内部调用:根据 TS 类型获取 Pipe\n */\nexport function getAutoPipe<T>(type: T): TransformPipe<T> | undefined {\n return autoPipeMap.get(type);\n}\n\n/**\n * 将 cookie 字符串转换为对象\n */\nexport function parseRawCookie(\n cookieHeader: string | undefined,\n): Record<string, string> {\n const result: Record<string, string> = {};\n\n if (!cookieHeader) return result;\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const indexOfEq = pair.indexOf(\"=\");\n if (indexOfEq === -1) continue;\n\n // 提取 key 和 value,并进行 trim 处理\n const key = pair.substring(0, indexOfEq).trim();\n if (!key) continue;\n\n let value = pair.substring(indexOfEq + 1).trim();\n\n if (value[0] === '\"' && value[value.length - 1] === '\"') {\n value = value.slice(1, -1);\n }\n\n try {\n // 只在必要时进行 URL 解码\n result[key] = value.includes(\"%\") ? decodeURIComponent(value) : value;\n } catch (e) {\n // 如果解码失败(比如恶意构造的序列),保留原样,防止崩溃\n result[key] = value;\n }\n }\n\n return result;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Express\n */\nimport { EventMessage } from \"@virid/core\";\nimport { httpContextStore } from \"./context\";\nexport type RequestId = number & { readonly __brand: unique symbol };\n\nexport class HttpRequestMessage extends EventMessage {\n // id 必须是 RequestId 类型\n constructor(private readonly __virid_express_id: RequestId) {\n super();\n //从context里捞出来自己的,挂上引用计数+1\n httpContextStore.get(this.__virid_express_id).inc();\n }\n // 暴露一个只读属性给业务层使用\n public get requestId(): RequestId {\n return this.__virid_express_id;\n }\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Express\n */\nimport {\n type Newable,\n type SystemParams,\n type SystemContext,\n type MessageMetadata,\n MessageWriter,\n} from \"@virid/core\";\nimport {\n type HttpRouteConfig,\n type HttpRouteInfo,\n type BodyMetadata,\n type HeaderMetadata,\n type QueryMetadata,\n type RequestMetadata,\n type ResponseMetadata,\n type ContextMetadata,\n type ParamMetadata,\n type TransformPipe,\n CookieMetadata,\n} from \"../interfaces\";\nimport {\n HttpContext,\n HttpError,\n HttpRequestMessage,\n InternalServerError,\n parseRawCookie,\n} from \"../http\";\nimport { handleResult, httpContextStore } from \"../http/context\";\nimport { httpRouteRegistry, stagingSystemRegister } from \"./register\";\nimport { VIRID_EXPRESS_METADATA } from \"./constant\";\nimport { viridApp } from \"../app\";\nimport { getAutoPipe } from \"../http\";\nexport function HttpRoute(config: HttpRouteConfig) {\n return (constructor: Newable<HttpRequestMessage>) => {\n // 唯一性校验:组合 Method 和 Path\n const routeKey = `${config.method}:${config.path}`;\n if (httpRouteRegistry.has(routeKey)) {\n MessageWriter.error(\n new Error(\n `[Virid Http] Routing Conflict: The request method ${config.method} for path ${config.path} has already been registered by ${constructor.name}`,\n ),\n );\n }\n\n // 路径参数解析\n const params: string[] = [];\n const pathParts = config.path.split(\"/\");\n pathParts.forEach((part) => {\n if (part.startsWith(\":\")) {\n params.push(part.substring(1));\n }\n });\n\n const routeInfo: HttpRouteInfo = {\n ...config,\n httpMessage: constructor,\n params,\n };\n\n // 存入缓冲区\n httpRouteRegistry.set(routeKey, routeInfo);\n };\n}\n\n/**\n * @description: 系统装饰器\n * @param priority 优先级,数值越大越早执行\n */\nexport function HttpSystem(\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 // 获得元数据\n const types = Reflect.getMetadata(\"design:paramtypes\", target, key);\n const messageMetadata: MessageMetadata | null =\n Reflect.getMetadata(VIRID_EXPRESS_METADATA.MESSAGE, target, key) || null;\n const httpMetadata = getHttpMetadata(target, key, types);\n // 参数检查\n if (!types) {\n const error = new Error(\n `[Virid HttpSystem] 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 HttpSystem] 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 MessageWriter.error(error);\n return;\n }\n\n // 不能同时使用@message() 和 SystemParams\n if (params.messageClass && messageMetadata) {\n MessageWriter.error(\n new Error(\n `[Virid HttpSystem] 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 HttpSystem] System Parameter Loss:\\nPlease declare the message type using the Message decorator`,\n ),\n );\n return;\n }\n // Message必须是继承自HttpRequestMessage\n const messageClass = params.messageClass ?? messageMetadata.messageClass;\n if (!HttpRequestMessage.isPrototypeOf(messageClass)) {\n MessageWriter.error(\n new Error(\n `[Virid HttpSystem] Wrong Message Type: ${messageClass.name} is not a derived subclass of HttpRequestMessage!`,\n ),\n );\n return;\n }\n //封装system\n const wrappedSystem = (currentMessage: HttpRequestMessage) => {\n // 获取当前请求的上下文\n const context = httpContextStore.get(currentMessage.requestId);\n if (!context) {\n //如果没有context,那直接停止执行\n throw new Error(\n `[Virid Express HttpSystem] Invalid Request Context: The request context for message ${currentMessage.requestId} is missing.`,\n );\n }\n try {\n const args = types.map((type: any, index: number) => {\n // 如果是message,则注入\n // 三个条件缺一不可\n if (messageMetadata && messageMetadata.index == index) {\n if (!(currentMessage instanceof messageClass)) {\n // 如果类型不匹配,说明 Dispatcher 路由逻辑或元数据配置有问题\n const receivedName = (currentMessage as object).constructor.name;\n throw new Error(\n `[Virid Express HttpSystem] Type Mismatch: Expected ${messageClass.name}, but received ${receivedName}`,\n );\n }\n return currentMessage;\n } else {\n return getHttpSystemArgs(type, index, context, httpMetadata);\n }\n });\n // 执行业务逻辑\n const result = originalMethod.apply(target, args);\n // 返回值必须是一个新的HttpRequestMessage数组,或者一个HttpResponse类型\n return result instanceof Promise\n ? result\n .then((res) => {\n handleResult(res, context);\n })\n .catch((error) => {\n // 异步出错要给客户端发 500\n handleResult(InternalServerError(), context);\n // 继续抛出,让 Dispatcher 捕获并打印详细堆栈\n throw error;\n })\n : handleResult(result, context);\n } catch (error) {\n if (error instanceof HttpError) {\n // 如果手动 throw new HttpError\n handleResult(error, context);\n } else {\n // 真正的崩溃,返回 500\n handleResult(InternalServerError(), context);\n }\n throw error; // 继续抛出给 Dispatcher 记录日志\n }\n };\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 stagingSystemRegister.register(messageClass, wrappedSystem, params.priority);\n };\n}\n\n/**\n * @description: 标记参数为 Body\n */\n\nexport function Body() {\n return (target: any, key: string, index: number) => {\n if (Reflect.hasOwnMetadata(VIRID_EXPRESS_METADATA.BODY, target, key)) {\n MessageWriter.error(\n new Error(\n `[Virid Express Body] Multiple Body Are Not Allowed: ${key} has multiple @Body() decorators!`,\n ),\n );\n return;\n }\n const bodyMetadata = { index } as BodyMetadata;\n Reflect.defineMetadata(\n VIRID_EXPRESS_METADATA.BODY,\n bodyMetadata,\n target,\n key,\n );\n };\n}\n\n/**\n * @description: 标记参数为 Header\n */\n\nexport function Headers() {\n return (target: any, key: string, index: number) => {\n if (Reflect.hasOwnMetadata(VIRID_EXPRESS_METADATA.HEADERS, target, key)) {\n MessageWriter.error(\n new Error(\n `[Virid Express Headers] Multiple Header Are Not Allowed: ${key} has multiple @Headers() decorators!`,\n ),\n );\n return;\n }\n const headerMetadata = { index } as HeaderMetadata;\n Reflect.defineMetadata(\n VIRID_EXPRESS_METADATA.HEADERS,\n headerMetadata,\n target,\n key,\n );\n };\n}\n\n/**\n * @description: 标记参数为 Header\n */\n\nexport function Cookies() {\n return (target: any, key: string, index: number) => {\n if (Reflect.hasOwnMetadata(VIRID_EXPRESS_METADATA.COOKIES, target, key)) {\n MessageWriter.error(\n new Error(\n `[Virid Express Cookies] Multiple Header Are Not Allowed: ${key} has multiple @Cookies() decorators!`,\n ),\n );\n return;\n }\n const cookiesMetadata = { index } as CookieMetadata;\n Reflect.defineMetadata(\n VIRID_EXPRESS_METADATA.COOKIES,\n cookiesMetadata,\n target,\n key,\n );\n };\n}\n\n/**\n * @description: 标记参数为 Request 对象\n */\nexport function Req() {\n return (target: any, key: string, index: number) => {\n // 检查是否已经定义过 Request 元数据,防止一个方法注入多个 Request 参数\n if (Reflect.hasOwnMetadata(VIRID_EXPRESS_METADATA.REQUEST, target, key)) {\n MessageWriter.error(\n new Error(\n `[Virid Express Req] Multiple Request Objects Are Not Allowed: ${key} has multiple @Req() decorators!`,\n ),\n );\n return;\n }\n const requestMetadata: RequestMetadata = { index };\n Reflect.defineMetadata(\n VIRID_EXPRESS_METADATA.REQUEST,\n requestMetadata,\n target,\n key,\n );\n };\n}\n\n/**\n * @description: 标记参数为 Response 对象\n */\nexport function Res() {\n return (target: any, key: string, index: number) => {\n // 检查是否已经定义过 Response 元数据\n if (Reflect.hasOwnMetadata(VIRID_EXPRESS_METADATA.RESPONSE, target, key)) {\n MessageWriter.error(\n new Error(\n `[Virid Express Res] Multiple Response Objects Are Not Allowed: ${key} has multiple @Res() decorators!`,\n ),\n );\n return;\n }\n const responseMetadata: ResponseMetadata = { index };\n Reflect.defineMetadata(\n VIRID_EXPRESS_METADATA.RESPONSE,\n responseMetadata,\n target,\n key,\n );\n };\n}\n\n/**\n * @description: 标记参数为 Context 对象\n */\nexport function Ctx() {\n return (target: any, key: string, index: number) => {\n // 检查是否已经定义过 context 元数据\n if (Reflect.hasOwnMetadata(VIRID_EXPRESS_METADATA.CONTEXT, target, key)) {\n MessageWriter.error(\n new Error(\n `[Virid Express Ctx] Multiple Context Objects Are Not Allowed: ${key} has multiple @Ctx() decorators!`,\n ),\n );\n return;\n }\n const contextMetadata: ContextMetadata = { index };\n Reflect.defineMetadata(\n VIRID_EXPRESS_METADATA.CONTEXT,\n contextMetadata,\n target,\n key,\n );\n };\n}\n\n/**\n * @description: 标记参数为 Query\n */\nexport function Query(query: string, pipe?: TransformPipe<any>) {\n return (target: any, key: string, index: number) => {\n const existingMetadata: QueryMetadata =\n Reflect.getOwnMetadata(VIRID_EXPRESS_METADATA.QUERY, target, key) || [];\n const newMetadata = [...existingMetadata, { index, query, pipe }];\n Reflect.defineMetadata(\n VIRID_EXPRESS_METADATA.QUERY,\n newMetadata,\n target,\n key,\n );\n };\n}\n\n/**\n * @description: 标记参数为指定的路径参数 (如 /user/:id)\n */\nexport function Params(key?: string, pipe?: TransformPipe<any>) {\n return (target: any, keyName: string, index: number) => {\n const existingMetadata: ParamMetadata =\n Reflect.getOwnMetadata(VIRID_EXPRESS_METADATA.PARAMS, target, keyName) ||\n [];\n const newMetadata = [...existingMetadata, { index, key, pipe }];\n Reflect.defineMetadata(\n VIRID_EXPRESS_METADATA.PARAMS,\n newMetadata,\n target,\n keyName,\n );\n };\n}\n/**\n * @description: 获得各种元数据\n */\nfunction getHttpMetadata(target: any, key: string, types: any[]) {\n // 获取所有的元数据配置\n const bodyMeta: BodyMetadata = Reflect.getOwnMetadata(\n VIRID_EXPRESS_METADATA.BODY,\n target,\n key,\n );\n const headerMeta: HeaderMetadata = Reflect.getOwnMetadata(\n VIRID_EXPRESS_METADATA.HEADERS,\n target,\n key,\n );\n const cookiesMeta: CookieMetadata = Reflect.getOwnMetadata(\n VIRID_EXPRESS_METADATA.COOKIES,\n target,\n key,\n );\n\n const resMeta: ResponseMetadata = Reflect.getOwnMetadata(\n VIRID_EXPRESS_METADATA.RESPONSE,\n target,\n key,\n );\n const reqMeta: RequestMetadata = Reflect.getOwnMetadata(\n VIRID_EXPRESS_METADATA.REQUEST,\n target,\n key,\n );\n const ctxMeta: ContextMetadata = Reflect.getOwnMetadata(\n VIRID_EXPRESS_METADATA.CONTEXT,\n target,\n key,\n );\n const rawQueryMeta: QueryMetadata =\n Reflect.getOwnMetadata(VIRID_EXPRESS_METADATA.QUERY, target, key) || [];\n const queryMeta = rawQueryMeta.map((item) => {\n // 如果没指定 pipe,根据 types[item.index] 自动分配\n if (!item.pipe) {\n const paramType = types[item.index];\n item.pipe = getAutoPipe(paramType);\n }\n return item;\n });\n const rawParamMeta: ParamMetadata =\n Reflect.getOwnMetadata(VIRID_EXPRESS_METADATA.PARAMS, target, key) || [];\n const paramMeta = rawParamMeta.map((item) => {\n if (!item.pipe) {\n const paramType = types[item.index];\n item.pipe = getAutoPipe(paramType);\n }\n return item;\n });\n return {\n bodyMeta,\n headerMeta,\n queryMeta,\n cookiesMeta,\n reqMeta,\n resMeta,\n ctxMeta,\n paramMeta,\n };\n}\n\nfunction getHttpSystemArgs(\n type: any,\n index: number,\n context: HttpContext,\n httpMetadata: ReturnType<typeof getHttpMetadata>,\n): any {\n const { req, res } = context;\n\n // 匹配 @Ctx()\n if (httpMetadata.ctxMeta?.index === index) return context;\n\n // 匹配 @Param() -> 获取路由参数 (:id 等)\n const paramItem = httpMetadata.paramMeta?.find((p) => p.index === index);\n if (paramItem) {\n let val = paramItem.key ? req.params[paramItem.key] : req.params;\n\n // 如果有 Pipe 且值不是 undefined,进行转换\n if (paramItem.pipe && val !== undefined) {\n val = paramItem.pipe(val);\n }\n return val;\n }\n\n // 匹配 @Body() -> 获取请求体\n if (httpMetadata.bodyMeta?.index === index) return req.body;\n\n // 匹配 @Header() -> 获取请求头\n if (httpMetadata.headerMeta?.index === index) return req.headers;\n\n // 匹配 @Cookie() -> 获取Cookie\n if (httpMetadata.cookiesMeta?.index === index)\n return parseRawCookie(req.headers.cookie);\n\n // 匹配 @Req() 和 @Res() -> 原生 Express 对象\n if (httpMetadata.reqMeta?.index === index) return req;\n if (httpMetadata.resMeta?.index === index) return res;\n\n // 匹配 @Query('name') -> 获取特定的 Query 参数\n const queryItem = httpMetadata.queryMeta?.find((q) => q.index === index);\n if (queryItem) {\n let val = req.query[queryItem.query];\n if (val === undefined) {\n throw new Error(`[Virid Express] Missing Query: \"${queryItem.query}\"`);\n }\n\n // 执行 Pipe 转换\n if (queryItem.pipe) {\n val = queryItem.pipe(val);\n }\n return val;\n }\n\n // 处理普通的 IOC 容器依赖注入 (DI)\n const param = viridApp.get(type);\n if (!param) {\n throw new Error(\n `[Virid System] Unknown Inject Type: ${type?.name || \"Anonymous Class\"} at index ${index}. \n Ensure it is registered in the IOC container or has a proper Http Decorator!`,\n );\n }\n\n return param;\n}\n","/*\n * Copyright (c) 2026-present Ailrid.\n * Licensed under the Apache License, Version 2.0.\n * Project: Virid Express\n */\nimport { VIRID_METADATA } from \"@virid/core\";\n\nexport const VIRID_EXPRESS_METADATA = {\n ...VIRID_METADATA,\n HTTPROUTE: \"virid:express:route\",\n HTTPSYSTEM: \"virid:express:system\",\n BODY: \"virid:express:body\",\n QUERY: \"virid:express:query\",\n HEADERS: \"virid:express:header\",\n REQUEST: \"virid:express:request\",\n RESPONSE: \"virid:express:response\",\n CONTEXT: \"virid:express:context\",\n PARAMS: \"virid:express:params\",\n COOKIES: \"virid:express:cookie\",\n} as const;\n"],"mappings":"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","names":["index_exports","__export","BadRequest","BadRequestResponse","Body","ConflictResponse","Cookies","Created","CreatedResponse","Ctx","CustomResponse","CustomResponseResponse","ExpressPlugin","Forbidden","ForbiddenResponse","Headers","HttpContext","HttpError","HttpRequestMessage","HttpResponse","HttpRoute","HttpSystem","InternalServerError","InternalServerErrorResponse","NoContent","NoContentResponse","NotFound","NotFoundResponse","Ok","OkResponse","Params","ParseBoolPipe","ParseIntPipe","Query","Req","Res","Stream","StreamFile","StreamFileResponse","StreamResponse","Unauthorized","UnauthorizedResponse","UnprocessableEntityResponse","addAutoPipe","getAutoPipe","parseRawCookie","__toCommonJS","import_core","import_core","import_core","import_core","HttpContext","id","req","res","timestamp","route","rc","isClosed","inc","dec","tryFinalize","writableEnded","errorMsg","Date","now","MessageWriter","error","Error","headersSent","end","status","json","message","_HttpContext","HttpResponse","data","headers","_HttpResponse","OkResponse","_OkResponse","CreatedResponse","_CreatedResponse","NoContentResponse","_NoContentResponse","BadRequestResponse","_BadRequestResponse","UnauthorizedResponse","_UnauthorizedResponse","ForbiddenResponse","_ForbiddenResponse","NotFoundResponse","_NotFoundResponse","ConflictResponse","_ConflictResponse","UnprocessableEntityResponse","errors","_UnprocessableEntityResponse","InternalServerErrorResponse","_InternalServerErrorResponse","CustomResponseResponse","_CustomResponseResponse","StreamFileResponse","filePath","options","dotfiles","_StreamFileResponse","StreamResponse","stream","_StreamResponse","Ok","__name","Created","NoContent","BadRequest","msg","Unauthorized","Forbidden","NotFound","InternalServerError","CustomResponse","StreamFile","path","Stream","HttpError","_HttpError","httpContextStore","Map","handleResult","res","context","dec","Array","isArray","forEach","item","HttpResponse","handleHttpResponse","HttpError","status","json","message","delete","id","BaseMessage","MessageWriter","write","warn","response","ctx","headers","Object","entries","k","v","setHeader","StreamFileResponse","inc","sendFile","filePath","options","err","headersSent","error","end","isClosed","StreamResponse","stream","pipe","cleanup","__name","has","on","data","BaseMessage","_a","send","args","MessageWriter","write","_BaseMessage","SingleMessage","__kind","_SingleMessage","EventMessage","_EventMessage","ErrorMessage","error","context","i","_ErrorMessage","WarnMessage","_WarnMessage","InfoMessage","_InfoMessage","AtomicModifyMessage","ComponentClass","recipe","label","_AtomicModifyMessage","activeInstance","activateInstance","instance","publisher","Proxy","get","_","prop","message","console","name","dispatch","Reflect","target","e","warn","info","_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","add","tick","systemTaskMap","size","length","clear","reset","Error","queueMicrotask","signalSnapshot","eventSnapshot","executeTickHooks","snapshot","prepareSnapshot","tasks","collectTasks","executeTasks","msg","forEach","s","ExecutionTask","fn","priority","systemContext","payload","signalFnSet","has","peekSignal","sort","a","b","task","result","execute","Promise","catch","hookContext","targetClass","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","event","set","getEventStream","peekEventAt","index","types","delete","_EventHub","MessageRegistry","register","messageClass","systemFn","systems","findIndex","funcName","currentSystems","splice","_MessageRegistry","MessageInternal","dispatcher","registry","middlewares","useMiddleware","mw","onBeforeExecute","onAfterExecute","onBeforeTick","onAfterTick","pipeline","finalAction","next","_MessageInternal","ViridContainer","bindings","singletonInstances","bind","identifier","binding","ctor","toSelf","inSingletonScope","onActivation","onActivate","TargetCtor","rawInstance","processedInstance","_ViridContainer","clr","red","yellow","blue","magenta","cyan","gray","bold","green","withContext","params","Object","originalMethod","ccsContext","globalInfoHandler","err","header","log","globalErrorHandler","globalWarnHandler","atomicModifyHandler","modifications","rawComponent","activeApp","initializeGlobalSystems","app","viridApp","String","targetMethod","apply","installedPlugins","ViridApp","container","messageInternal","activationHooks","addActivationHook","ins","handleActivation","reduce","currentInstance","nextInstance","undefined","bindController","bindComponent","use","plugin","options","install","_ViridApp","bindObservers","VIRID_METADATA","SYSTEM","MESSAGE","CONTROLLER","COMPONENT","SAFE","OBSERVER","handleResult","res","System","key","descriptor","value","getMetadata","messageMetadata","some","t","indexOf","wrappedSystem","currentMessage","map","single","receivedName","param","then","Message","hasOwnMetadata","defineMetadata","Safe","_descriptor","safeMethods","Observer","callback","observerMetadata","Controller","Component","ARRAY_MUTABLE_METHODS","prototype","hasOwnProperty","call","defineProperty","enumerable","configurable","propertyKey","box","logicProxy","includes","oldVal","observerResult","_prop","newVal","getter","__virid_box__","v","ownKeys","desc","getOwnPropertyDescriptor","val","createVirid","ParseIntPipe","val","res","parseInt","isNaN","HttpError","ParseBoolPipe","autoPipeMap","Map","set","Number","Boolean","addAutoPipe","type","pipe","has","MessageWriter","error","Error","getAutoPipe","get","parseRawCookie","cookieHeader","result","pairs","split","pair","indexOfEq","indexOf","key","substring","trim","value","length","slice","includes","decodeURIComponent","import_core","HttpRequestMessage","EventMessage","__virid_express_id","httpContextStore","get","inc","requestId","_HttpRequestMessage","stagingSystemRegister","MessageRegistry","httpRouteRegistry","Map","_internalHttpIdCounter","registerHttpSystem","app","messageClass","systemTasks","systemTaskMap","entries","task","register","fn","priority","clear","registerHttpRoute","server","_","routeInfo","method","path","httpMessage","expressMethod","toLowerCase","req","res","newId","httpContextStore","set","HttpContext","Date","now","message","once","delete","MessageWriter","write","activeApp","activateApp","app","options","registerHttpSystem","registerHttpRoute","server","viridApp","Proxy","get","_","prop","args","MessageWriter","warn","String","targetMethod","apply","import_core","import_core","VIRID_EXPRESS_METADATA","VIRID_METADATA","HTTPROUTE","HTTPSYSTEM","BODY","QUERY","HEADERS","REQUEST","RESPONSE","CONTEXT","PARAMS","COOKIES","HttpRoute","config","constructor","routeKey","method","path","httpRouteRegistry","has","MessageWriter","error","Error","name","params","split","forEach","part","startsWith","push","substring","routeInfo","httpMessage","set","HttpSystem","priority","messageClass","target","key","descriptor","originalMethod","value","types","Reflect","getMetadata","messageMetadata","VIRID_EXPRESS_METADATA","MESSAGE","httpMetadata","getHttpMetadata","some","t","undefined","indexOf","HttpRequestMessage","isPrototypeOf","wrappedSystem","__name","currentMessage","context","httpContextStore","get","requestId","args","map","type","index","receivedName","getHttpSystemArgs","result","apply","Promise","then","res","handleResult","catch","InternalServerError","HttpError","systemContext","targetClass","methodName","stagingSystemRegister","register","Body","hasOwnMetadata","BODY","bodyMetadata","defineMetadata","Headers","HEADERS","headerMetadata","Cookies","COOKIES","cookiesMetadata","Req","REQUEST","requestMetadata","Res","RESPONSE","responseMetadata","Ctx","CONTEXT","contextMetadata","Query","query","pipe","newMetadata","getOwnMetadata","QUERY","Params","keyName","PARAMS","bodyMeta","headerMeta","cookiesMeta","resMeta","reqMeta","ctxMeta","queryMeta","item","paramType","getAutoPipe","paramMeta","req","paramItem","find","p","val","body","headers","parseRawCookie","cookie","queryItem","q","param","viridApp","ExpressPlugin","name","install","app","options","activateApp"]}
@@ -0,0 +1,213 @@
1
+ import { EventMessage, Newable, SystemParams, ViridPlugin } from '@virid/core';
2
+ import { Request, Response, Express } from 'express';
3
+ import { Readable } from 'stream';
4
+
5
+ interface HttpHeaders {
6
+ [key: string]: string | string[];
7
+ }
8
+ declare class HttpContext {
9
+ readonly id: number;
10
+ readonly req: Request;
11
+ readonly res: Response;
12
+ readonly timestamp: number;
13
+ readonly route: string;
14
+ rc: number;
15
+ isClosed: boolean;
16
+ constructor(id: number, req: Request, res: Response, timestamp: number, route: string);
17
+ /**
18
+ * Increment Reference Count (进入 System)
19
+ */
20
+ inc(): void;
21
+ /**
22
+ * Decrement Reference Count (离开 System)
23
+ * 如果归零且未响应,则判定为孤立响应,强制收割
24
+ */
25
+ dec(): void;
26
+ private tryFinalize;
27
+ }
28
+ declare abstract class HttpResponse {
29
+ status: number;
30
+ data: any;
31
+ headers: HttpHeaders;
32
+ constructor(status: number, data?: any, headers?: HttpHeaders);
33
+ }
34
+ declare class OkResponse extends HttpResponse {
35
+ constructor(data: any, headers?: HttpHeaders);
36
+ }
37
+ declare class CreatedResponse extends HttpResponse {
38
+ constructor(data: any, headers?: HttpHeaders);
39
+ }
40
+ declare class NoContentResponse extends HttpResponse {
41
+ constructor();
42
+ }
43
+ declare class BadRequestResponse extends HttpResponse {
44
+ constructor(message?: string);
45
+ }
46
+ declare class UnauthorizedResponse extends HttpResponse {
47
+ constructor(message?: string);
48
+ }
49
+ declare class ForbiddenResponse extends HttpResponse {
50
+ constructor(message?: string);
51
+ }
52
+ declare class NotFoundResponse extends HttpResponse {
53
+ constructor(message?: string);
54
+ }
55
+ declare class ConflictResponse extends HttpResponse {
56
+ constructor(message?: string);
57
+ }
58
+ declare class UnprocessableEntityResponse extends HttpResponse {
59
+ constructor(errors: any);
60
+ }
61
+ declare class InternalServerErrorResponse extends HttpResponse {
62
+ constructor(message?: string);
63
+ }
64
+ declare class CustomResponseResponse extends HttpResponse {
65
+ constructor(status: number, data: any, headers?: HttpHeaders);
66
+ }
67
+ /**
68
+ * @description: Express sendFile 配置项的强类型定义
69
+ */
70
+ interface StreamFileOptions {
71
+ /** 根目录(如果 path 是相对路径则必填) */
72
+ root?: string;
73
+ /** * 对以 . 开头的文件处理策略:
74
+ * - allow: 允许发送
75
+ * - deny: 拒绝并返回 403
76
+ * - ignore: 当作不存在返回 404
77
+ */
78
+ dotfiles?: "allow" | "deny" | "ignore";
79
+ /** 是否发送 ETag */
80
+ etag?: boolean;
81
+ /** 扩展的 HTTP 响应头 */
82
+ headers?: HttpHeaders;
83
+ /** 缓存最大时长 (毫秒) */
84
+ maxAge?: number | string;
85
+ /** 是否在 Cache-Control 中添加 immutable */
86
+ immutable?: boolean;
87
+ /** 是否根据文件系统设置 Last-Modified */
88
+ lastModified?: boolean;
89
+ /** 是否支持断点续传 (Range 请求) */
90
+ acceptRanges?: boolean;
91
+ }
92
+ declare class StreamFileResponse extends HttpResponse {
93
+ readonly filePath: string;
94
+ readonly options: StreamFileOptions;
95
+ constructor(filePath: string, options?: StreamFileOptions);
96
+ }
97
+ declare class StreamResponse extends HttpResponse {
98
+ readonly stream: Readable;
99
+ readonly options: {
100
+ status?: number;
101
+ headers?: HttpHeaders;
102
+ };
103
+ constructor(stream: Readable, options?: {
104
+ status?: number;
105
+ headers?: HttpHeaders;
106
+ });
107
+ }
108
+ /** 200 OK */
109
+ declare const Ok: (data: any, headers?: HttpHeaders) => OkResponse;
110
+ /** 201 Created */
111
+ declare const Created: (data: any, headers?: HttpHeaders) => CreatedResponse;
112
+ /** 204 No Content */
113
+ declare const NoContent: () => NoContentResponse;
114
+ /** 400 Bad Request */
115
+ declare const BadRequest: (msg?: string) => BadRequestResponse;
116
+ /** 401 Unauthorized */
117
+ declare const Unauthorized: (msg?: string) => UnauthorizedResponse;
118
+ /** 403 Forbidden */
119
+ declare const Forbidden: (msg?: string) => ForbiddenResponse;
120
+ /** 404 Not Found */
121
+ declare const NotFound: (msg?: string) => NotFoundResponse;
122
+ /** 500 Internal Error */
123
+ declare const InternalServerError: (msg?: string) => InternalServerErrorResponse;
124
+ declare const CustomResponse: (status: number, data: any, headers?: HttpHeaders) => CustomResponseResponse;
125
+ /** 发送本地文件 (自动处理 Range/206) */
126
+ declare const StreamFile: (path: string, options?: StreamFileOptions) => StreamFileResponse;
127
+ /**
128
+ * 发送流响应
129
+ */
130
+ declare const Stream: (stream: Readable, options?: StreamResponse["options"]) => StreamResponse;
131
+ declare class HttpError extends Error {
132
+ readonly status: number;
133
+ readonly message: string;
134
+ constructor(status: number, message: string);
135
+ }
136
+
137
+ declare function ParseIntPipe(val: string): number;
138
+ declare function ParseBoolPipe(val: string): boolean;
139
+ /**
140
+ * 让用户注册自定义类型的转换方法
141
+ */
142
+ declare function addAutoPipe<T>(type: T, pipe: TransformPipe<T>): void;
143
+ /**
144
+ * 内部调用:根据 TS 类型获取 Pipe
145
+ */
146
+ declare function getAutoPipe<T>(type: T): TransformPipe<T> | undefined;
147
+ /**
148
+ * 将 cookie 字符串转换为对象
149
+ */
150
+ declare function parseRawCookie(cookieHeader: string | undefined): Record<string, string>;
151
+
152
+ type RequestId = number & {
153
+ readonly __brand: unique symbol;
154
+ };
155
+ declare class HttpRequestMessage extends EventMessage {
156
+ private readonly __virid_express_id;
157
+ constructor(__virid_express_id: RequestId);
158
+ get requestId(): RequestId;
159
+ }
160
+
161
+ type HttpMethod = "get" | "post" | "put" | "delete" | "patch";
162
+ interface HttpRouteConfig {
163
+ path: string;
164
+ method: HttpMethod;
165
+ }
166
+ type TransformPipe<T> = (value: any) => T;
167
+
168
+ interface PluginOptions {
169
+ server: Express;
170
+ }
171
+
172
+ declare function HttpRoute(config: HttpRouteConfig): (constructor: Newable<HttpRequestMessage>) => void;
173
+ /**
174
+ * @description: 系统装饰器
175
+ * @param priority 优先级,数值越大越早执行
176
+ */
177
+ declare function HttpSystem(params?: SystemParams): (target: any, key: string, descriptor: PropertyDescriptor) => void;
178
+ /**
179
+ * @description: 标记参数为 Body
180
+ */
181
+ declare function Body(): (target: any, key: string, index: number) => void;
182
+ /**
183
+ * @description: 标记参数为 Header
184
+ */
185
+ declare function Headers(): (target: any, key: string, index: number) => void;
186
+ /**
187
+ * @description: 标记参数为 Header
188
+ */
189
+ declare function Cookies(): (target: any, key: string, index: number) => void;
190
+ /**
191
+ * @description: 标记参数为 Request 对象
192
+ */
193
+ declare function Req(): (target: any, key: string, index: number) => void;
194
+ /**
195
+ * @description: 标记参数为 Response 对象
196
+ */
197
+ declare function Res(): (target: any, key: string, index: number) => void;
198
+ /**
199
+ * @description: 标记参数为 Context 对象
200
+ */
201
+ declare function Ctx(): (target: any, key: string, index: number) => void;
202
+ /**
203
+ * @description: 标记参数为 Query
204
+ */
205
+ declare function Query(query: string, pipe?: TransformPipe<any>): (target: any, key: string, index: number) => void;
206
+ /**
207
+ * @description: 标记参数为指定的路径参数 (如 /user/:id)
208
+ */
209
+ declare function Params(key?: string, pipe?: TransformPipe<any>): (target: any, keyName: string, index: number) => void;
210
+
211
+ declare const ExpressPlugin: ViridPlugin<PluginOptions>;
212
+
213
+ export { BadRequest, BadRequestResponse, Body, ConflictResponse, Cookies, Created, CreatedResponse, Ctx, CustomResponse, CustomResponseResponse, ExpressPlugin, Forbidden, ForbiddenResponse, Headers, HttpContext, HttpError, HttpRequestMessage, HttpResponse, HttpRoute, HttpSystem, InternalServerError, InternalServerErrorResponse, NoContent, NoContentResponse, NotFound, NotFoundResponse, Ok, OkResponse, Params, ParseBoolPipe, ParseIntPipe, Query, Req, type RequestId, Res, Stream, StreamFile, type StreamFileOptions, StreamFileResponse, StreamResponse, Unauthorized, UnauthorizedResponse, UnprocessableEntityResponse, addAutoPipe, getAutoPipe, parseRawCookie };