import type { VextMiddleware } from "../../types/middleware.js"; import type { VextBodyParserConfig, VextMultipartConfig, MultipartRouteConfig } from "../../types/app.js"; /** * parseBytes — 将人类可读的体积字符串转为字节数 * * 支持格式:'512b' | '1kb' | '10mb' | '1gb' 或直接传数字(字节)。 * 大小写不敏感。 * * @param value 体积字符串或字节数 * @returns 字节数 * @throws 格式不合法时抛出 Error */ export declare function parseBytes(value: string | number): number; export declare class PayloadTooLargeError extends Error { readonly maxBytes: number; readonly status = 413; constructor(maxBytes: number); } export declare function createPayloadTooLargeError(maxBytes: number): PayloadTooLargeError; export declare function isPayloadTooLargeError(err: unknown): err is PayloadTooLargeError; export declare function assertBodySize(size: number, maxBytes?: number): void; export declare function resolveBodyParserMaxBytes(globalConfig: VextBodyParserConfig, routeConfig?: VextBodyParserConfig): number; export declare function resolveRouteBodyParserConfig(routeOptions?: { bodyParser?: VextBodyParserConfig; override?: { maxBodySize?: string | number; }; }): VextBodyParserConfig | undefined; export declare function resolveAdapterBodyLimitBytes(args: { globalBodyParser?: VextBodyParserConfig; routeBodyParser?: VextBodyParserConfig; multipart?: VextMultipartConfig; adapterBodyLimit?: string | number; }): number; /** * createBodyParserMiddleware — Body 解析中间件工厂 * * 内置中间件 #3,职责: * 1. 解析 application/json 请求体 → req.body(对象) * 2. 解析 application/x-www-form-urlencoded 请求体 → req.body(对象) * 3. 其他 Content-Type → 跳过,req.body 保持 undefined * 4. 请求体大小检查 → 超过 maxBodySize 返回 413 Payload Too Large * * 配置项(config.bodyParser): * - maxBodySize: 请求体最大体积(默认 '1mb'),支持 '512b' | '1kb' | '10mb' | '1gb' 或数字 * * 内存安全: * body-parser 在读取请求体时逐块累计大小, * 一旦超过 maxBodySize 立即中止读取并返回 413, * 不会将超大请求体完整读入内存。 * * 设计说明: * - GET / HEAD / DELETE / OPTIONS 等无 body 方法直接跳过(不读取流) * - Hono adapter 已将 Node.js IncomingMessage 转为 Web Request, * 但 body 解析由 vext body-parser 在中间件层完成(而非 adapter 层), * 确保用户中间件和 handler 拿到的 req.body 是已解析的对象 * - multipart/form-data:当 multipartConfig.enabled = true 时内置解析并填充 req.files, * 否则跳过(req.files 保持 undefined) * * 与 Hono adapter 的协作: * Hono adapter 的 buildHandler() 将 Node.js IncomingMessage 转为 Web ReadableStream * 作为 Web Request 的 body。createVextRequest 通过 c.req.raw.body 可访问该流。 * body-parser 从 c.req.raw 获取原始请求体文本后解析为对象。 * * 实际实现中,我们通过 req.headers['content-type'] 判断类型, * 通过 req 上附带的原始 body 文本(由 adapter 传递)进行解析。 * 由于 Hono 已经处理了 Web Request 的 body 读取, * 我们在 VextRequest 上通过一个特殊的 _rawBody 字段传递原始字节。 * * 实际上 Hono adapter 中 createVextRequest 保存了 Hono Context 引用, * body-parser 可以通过 (req as any)._honoContext.req.text() 读取原始文本。 * 但为了解耦,我们使用 req 上的 _getRawBody 方法(由 adapter 注入)。 * * → 简化方案:由于 VextRequest 是 adapter 内部创建的对象, * body-parser 直接通过 (req as any)._rawBody() 获取 Promise * 该方法由 createVextRequest 注入(从 Hono Context 读取)。 * * @param config bodyParser 配置(从 VextConfig.bodyParser 提取) * @returns VextMiddleware */ export declare function createBodyParserMiddleware(config: VextBodyParserConfig, multipartConfig?: VextMultipartConfig): VextMiddleware; /** * createRouteMultipartMiddleware — 路由级 multipart 解析中间件工厂 * * 在 router-loader 中,当路由声明 `multipart.enabled = true` 时自动注入。 * 行为语义: * - 若 body-parser(全局)已解析(`req.files !== undefined`): * 用路由级配置做二次校验(覆盖全局限制) * - 若未解析(全局 enabled = false): * 用合并后的配置重新解析(路由级覆盖全局) * * @param routeConfig 路由级 multipart 配置 * @param globalConfig 全局 multipart 配置(提供默认值) */ export declare function createRouteMultipartMiddleware(routeConfig: MultipartRouteConfig, globalConfig?: VextMultipartConfig, globalBodyParser?: VextBodyParserConfig): VextMiddleware;