import { AliasRequestConfig, ClientConfig, HTTPClientPlugin, HTTPResponse, IHTTPClient, RequestConfig } from "./types.js"; import { HttpEngine } from "./engine/engine.js"; //#region src/client.d.ts /** * 合并请求配置:headers / query 做对象级合并;标量类字段仅在 patch 显式传入且非 undefined 时覆盖。 * `undefined` 不用于清空已有配置。 */ declare function mergeRequestConfig(base: RequestConfig, patch: RequestConfig): RequestConfig; /** * HTTP 请求客户端 * * 提供了一个符合人体工学的,跨端(node 和浏览器)的 HTTP 请求客户端。 * 支持插件系统,可以灵活地组合和增强请求客户端。 * * @example * ```ts * import { HTTPClient } from '@cat-kit/http' * * const http = new HTTPClient('/api', { * origin: 'http://localhost:8080', * timeout: 30 * 1000 * }) * * // 发起请求 * http.request('/user', { method: 'get' }).then(res => { * // ...do some things * }) * * // 请求别名 * http.get('/user', { query: { name: 'Zhang San' } }).then(res => { * // ...do some things * }) * ``` */ declare class HTTPClient implements IHTTPClient { /** 请求前缀 */ private prefix; /** 客户端配置 */ private config; /** 请求引擎 */ private engine; /** 父 client(仅由 group() 内部赋值;根 client 为 undefined) */ private parent?; /** 当前 client 自身持有的插件列表(不含父链继承) */ private ownPlugins; /** * 创建 HTTP 客户端实例 * @param prefix 请求前缀 * @param config 客户端配置 */ constructor(prefix?: string, config?: ClientConfig); /** * 计算当前 client 在运行时生效的插件列表:父链在前、子在后 */ private getEffectivePlugins; getEngine(): HttpEngine; /** * 注册插件(运行时动态装配) * - 插件必须拥有非空字符串 `name`,否则抛 HTTPError({ code: 'PLUGIN' }) * - 插件名在 client 自身及其父链范围内必须唯一,冲突时抛 HTTPError({ code: 'PLUGIN' }) */ registerPlugin(plugin: HTTPClientPlugin): void; /** * 内部注册插件(不做 name 有效性校验,调用方保证已校验通过) * - 校验插件名在整个生效链(父链+自身)中的唯一性,冲突时抛 HTTPError */ private registerPluginInternal; /** * 为同域请求自动附加 XSRF Token(通过 Cookie → Header 注入) * - 不同域请求直接跳过 * - Cookie 不存在时跳过 */ private applyXsrfHeader; /** * 拼接完整请求 URL:前缀 + origin + query 参数 * - 若 url 已是完整 URL 则跳过拼接,仅追加 query 参数 */ private getRequestUrl; /** 判断是否为完整 URL(含协议头或以 // 开头) */ private isAbsoluteUrl; /** * 将 config.query 序列化并拼接到 URL * - 支持数组值(多 key 追加)、对象值(JSON 序列化)、null/undefined */ private appendQueryParams; /** * 获取请求配置, 合并 HTTPClient 实例配置和当前配置 * @param config 当前请求配置 * @returns 合并后的请求配置 */ private getRequestConfig; /** * 依次执行插件 onError 钩子,取首个有效的恢复响应 * - 只有返回 HTTPResponse 时才视为恢复;后续插件仍会执行(用于副作用) */ private runOnErrorPlugins; /** * 执行单次请求的核心流程(含插件管道) */ private _executeRequest; /** * 发送 HTTP 请求 * @param url 请求地址 * @param config 请求配置 * @returns Promise */ request(url: string, config?: RequestConfig): Promise>; /** * 发送 GET 请求 * @param url 请求地址 * @param config 请求选项 * @returns Promise */ get(url: string, config?: AliasRequestConfig): Promise>; /** * 发送 POST 请求 * @param url 请求地址 * @param body 请求体 * @param config 请求选项 * @returns Promise */ post(url: string, body?: RequestConfig['body'], config?: Omit): Promise>; /** * 发送 PUT 请求 * @param url 请求地址 * @param body 请求体 * @param config 请求选项 * @returns Promise */ put(url: string, body?: RequestConfig['body'], config?: Omit): Promise>; /** * 发送 DELETE 请求 * @param url 请求地址 * @param config 请求选项 * @returns Promise */ delete(url: string, config?: Omit): Promise>; /** * 发送 PATCH 请求 * @param url 请求地址 * @param body 请求体 * @param config 请求选项 * @returns Promise */ patch(url: string, body?: RequestConfig['body'], config?: Omit): Promise>; /** * 发送 HEAD 请求 * @param url 请求地址 * @param config 请求选项 * @returns Promise */ head(url: string, config?: Omit): Promise>; /** * 发送 OPTIONS 请求 * @param url 请求地址 * @param config 请求选项 * @returns Promise */ options(url: string, config?: Omit): Promise>; /** * 中止所有请求 */ abort(): void; /** * 创建请求分组 * @param prefix 分组前缀 * @returns HTTPClient 新的客户端实例 * * 插件继承语义: * - 子 client 通过父链继承插件;父后续 `registerPlugin` 会自动反映到子(父影响子) * - 子 `registerPlugin` 仅改动 `child.ownPlugins`(子不影响父) * - 同名校验跨父子层级生效 * * 注意:父子共享同一 `engine` 实例,`abort()` 会中止父或子任意一方触发该引擎的所有在途请求。 * * @example * ```ts * const http = new HTTPClient() * const userGroup = http.group('/user') * * // 等同于 http.get('/user/profile') * userGroup.get('/profile') * * // 中止分组中的所有请求 * userGroup.abort() * ``` */ group(prefix: string): HTTPClient; } //#endregion export { HTTPClient, mergeRequestConfig };