import type { VextAdapter } from "../../types/adapter.js"; import type { VextApp } from "../../types/app.js"; /** * Express Adapter 选项 * * 用户通过 expressAdapter(options) 工厂函数传入, * 控制 Express 实例的初始化行为。 * * 所有选项均可选,默认值已为 vext 场景优化。 */ export interface ExpressAdapterOptions { /** * 请求体大小限制(字符串格式,如 '1mb') * 仅在预收集 rawBody 时用作参考上限。 * 实际的 body 大小限制由 vext body-parser 中间件控制。 * * @default '1mb' */ bodyLimit?: string; } /** * createExpressAdapter — 创建基于 Express 的 VextAdapter 实例 * * 将 Express 作为底层 HTTP 框架,实现 VextAdapter 接口。 * 这是 VextAdapter 的第三个实现(第一个 Hono,第二个 Fastify), * 用于验证 Adapter 抽象层的完备性和通用性。 * * 架构说明: * - Express 用于路由匹配,不使用 Express 自带的中间件机制 * - 中间件链执行由 vext 自己的 executeChain 实现(洋葱模型) * - 请求 / 响应对象在 Express route handler 内转换为 VextRequest / VextResponse * - 全局中间件通过 registerMiddleware() 收集,在每个路由执行时拼接到链头 * * 与 Hono / Fastify Adapter 的核心差异: * - 请求/响应模型:Express 直接操作 Node.js 原生对象(IncomingMessage/ServerResponse), * 增强为 Express.Request/Express.Response(添加 query / params / 便捷方法) * - Body 解析:不注册任何 Express body-parser,通过手动收集 req stream 为 Buffer, * 传给 createVextRequest 的 rawBody 参数,由 vext body-parser 中间件统一处理 * - JSON 序列化:使用 expressRes.end(JSON.stringify(...)) 手动序列化, * 绕过 Express 的 res.json() 自动处理,保证跨 Adapter 行为一致 * - buildHandler:Express app 本身就是 (req, res, next) 函数, * 可直接作为 Node.js requestListener 使用 * * HTTP 服务器: * - Express 不内置 HTTP server 创建(与 Fastify 不同), * adapter 使用 Node.js 原生 http.createServer(app) * - listen() 创建 http.createServer 并调用 server.listen() * - close() 调用 server.close() * - buildHandler() 返回 Express app 作为 Node.js handler, * 用于 dev 模式热重载的 HotSwappableHandler 原子替换 * * @param options Express 适配器配置选项 * @param app VextApp 实例(用于传递给 createVextRequest 的 app 引用) * @returns VextAdapter 实例 * * @see adapters/hono/adapter.ts(Hono Adapter 对应实现) * @see adapters/fastify/adapter.ts(Fastify Adapter 对应实现) */ export declare function createExpressAdapter(options: ExpressAdapterOptions, app: VextApp): VextAdapter;