/** * api 域路由块:注册端点并给每条请求套上围栏——回环围栏(非回环一律 403,必须用共享层默认参数:放行 `no-cors` 的开关 * 只给资源伺服路由)、方法围栏(方法不在表里给 405 而不是 404)、异常收口(漏出去的异常留下的不是错误页,是一个挂住的连接)。 */ import type { ServerResponse } from "node:http"; import type { LoggerPort, RegisterRoute } from "../../deps.js"; import type { Endpoint } from "./type.js"; /** * 写一个 JSON 响应。泛型而不是固定形状:响应体有设置视图、历史数组、状态表各不相同的形状, * 而序列化只关心它能被 JSON 表达。 */ export declare function sendJson(res: ServerResponse, status: number, body: T, headers?: Record): void; /** * 失败负载。三个字段分开不是冗余:客户端把 `error` 当提示文本、把 `code` 当分流依据(版本冲突靠 * `SETTINGS_CONFLICT` 判,不靠中文文案),`details` 给结构化细节——合成一个字符串就等于让客户端 * 去匹配文案,而文案是本地化的。 */ interface FailureBody { /** 面向用户的失败原因。 */ error?: string; /** 结构化细节(请求体非法等)。 */ details?: string; /** 补充说明(如合法取值范围);客户端不读它,用它的是直接看响应的排查者。 */ hint?: string; /** 机器可判的失败类别。 */ code?: string; } /** 写一个失败响应:`{ ok: false, error: {...} }`,与端点的成功体同族。 */ export declare function sendFailure(res: ServerResponse, status: number, failure: FailureBody, headers?: Record): void; /** * 注册端点组,返回摘除器清单(与装配顺序相反地释放)。 * * **中途抛错整单回滚**:本函数逐条注册,第 N 条抛错时前 N-1 条已经挂在宿主上,而它们的摘除器 * 只存在于下面这个局部表里——调用方(按返回值登记)拿不到它们,不就地摘就是永久泄漏 * (实测后续卸载摘掉 0 条路由)。 * * 回滚与成功路径共用同一把「逐项隔离」的尺子:一条摘除器抛错不阻断其余。实测组合故障(注册第 4 条 * kinds 抛错,且第 3 条 status 的摘除器也抛错)下去掉隔离,则 3 条里只摘 1 条、泄漏 2 条,抛给调用方的 * 错误还会从「注册失败」变成「摘除失败」——那同时违反本文件「清理路径不盖首因」那条承诺。 * * **「逆序」这一半在这里不钉**:8 条路由彼此独立、谁先撤没有语义差别,把整条序钉死只会让加一条 * 端点就红一次。真正有语义的那处逆序在 api 域装配面(「帧订阅排在第一条路由之前」,先断帧的来路 * 再拆它的出口),那一处有判据。 */ export declare function registerEndpoints(register: RegisterRoute, endpoints: Endpoint[], logger: LoggerPort): Array<() => void>; export {};