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;
