{"version":3,"sources":["../src/index.ts","../src/stream.ts","../src/debug.ts"],"sourcesContent":["import { createInjectionKey, type VobsPlugin } from '@vobs/vobs'\r\nimport axios from 'axios'\r\nexport { createSSE, createWebSocket } from './stream'\r\nimport { emitHTTPDebug } from './debug'\r\nimport { getRuntimeDebugContext } from '@vobs/runtime'\r\n\r\nexport { emitHTTPDebug, getHTTPDebugHooks, setHTTPDebugHooks, subscribeHTTPDebug } from './debug'\r\nexport type { HTTPDebugCacheStatus, HTTPDebugContext, HTTPDebugHooks, HTTPDebugRequest, HTTPDebugStatus } from './debug'\r\nexport type {\r\n  SSEClient,\r\n  SSEConstructor,\r\n  SSEOptions,\r\n  WebSocketClient,\r\n  WebSocketConstructor,\r\n  WebSocketEventListener,\r\n  WebSocketEventName,\r\n  WebSocketOptions,\r\n  WebSocketState\r\n} from './stream'\r\n\r\nexport type HTTPMethod = 'DELETE' | 'GET' | 'HEAD' | 'OPTIONS' | 'PATCH' | 'POST' | 'PUT'\r\nexport type HTTPResponseType = 'arrayBuffer' | 'blob' | 'json' | 'response' | 'text'\r\nexport type HTTPHeaders = Record<string, string>\r\nexport type RetryDelay = number | ((attempt: number, error: Error) => number)\r\nexport interface HTTPProgress {\r\n  readonly loaded: number\r\n  readonly total: number | undefined\r\n  readonly percent: number | undefined\r\n}\r\nexport type HTTPProgressHandler = (progress: HTTPProgress) => void\r\nconst PROGRESS_HANDLED = Symbol('vobs.http.progress-handled')\r\nlet nextHTTPDebugId = 1\r\n\r\nexport interface RequestOptions {\r\n  url: string\r\n  method?: HTTPMethod\r\n  baseURL?: string\r\n  headers?: HeadersInit\r\n  params?: Record<string, unknown> | URLSearchParams\r\n  body?: unknown\r\n  signal?: AbortSignal\r\n  /** @deprecated Use signal. */\r\n  state?: AbortSignal\r\n  timeout?: number\r\n  retry?: number\r\n  retryDelay?: RetryDelay\r\n  shouldRetry?: (error: Error, attempt: number) => boolean | PromiseLike<boolean>\r\n  cache?: RequestCache\r\n  credentials?: RequestCredentials\r\n  mode?: RequestMode\r\n  responseType?: HTTPResponseType\r\n  onUploadProgress?: HTTPProgressHandler\r\n  onDownloadProgress?: HTTPProgressHandler\r\n  /** Share an in-flight request with the same dedupe key. */\r\n  dedupe?: boolean\r\n  dedupeKey?: string\r\n  /** Optional context copied into DevTools request traces. */\r\n  debugContext?: import('./debug').HTTPDebugContext\r\n}\r\n\r\nexport interface RequestConfig extends Omit<RequestOptions, 'headers' | 'method'> {\r\n  readonly method: HTTPMethod\r\n  headers: HTTPHeaders\r\n  readonly url: string\r\n}\r\n\r\nexport interface HTTPResponse<T = unknown> {\r\n  readonly data: T\r\n  readonly status: number\r\n  readonly statusText: string\r\n  readonly headers: Headers\r\n  readonly config: RequestConfig\r\n  readonly raw: Response | null\r\n}\r\n\r\n/** Adapt an HTTP request to the fetcher contract used by Resource. */\r\nexport type HTTPResourceRequest<T> = (\r\n  signal: AbortSignal\r\n) => HTTPResponse<T> | PromiseLike<HTTPResponse<T>>\r\n\r\nexport function toResourceFetcher<T>(request: HTTPResourceRequest<T>): (signal: AbortSignal) => Promise<T> {\r\n  return signal => Promise.resolve()\r\n    .then(() => request(signal))\r\n    .then(response => response.data)\r\n}\r\n\r\nexport type HTTPAdapter = (\r\n  config: RequestConfig\r\n) => Response | HTTPResponse<unknown> | PromiseLike<Response | HTTPResponse<unknown>>\r\n\r\nexport interface AxiosResponseLike<T = unknown> {\r\n  readonly data: T\r\n  readonly status: number\r\n  readonly statusText?: string\r\n  readonly headers?: HeadersInit\r\n  readonly raw?: Response | null\r\n}\r\n\r\nexport type AxiosRequestConfigLike = RequestConfig & { readonly data?: unknown }\r\nexport type AxiosRequest = <T = unknown>(config: AxiosRequestConfigLike) => PromiseLike<AxiosResponseLike<T>>\r\n\r\n/** Bridges an Axios request function while preserving HTTPResponse<T>.data typing. */\r\nexport function createAxiosAdapter(request: AxiosRequest = builtInAxiosRequest): HTTPAdapter {\r\n  return async config => {\r\n    // normalizeRequest has already serialized params into config.url. Omit\r\n    // params before invoking a custom Axios request so spreading this config\r\n    // into axios.request cannot append the query string a second time.\r\n    const { params: _params, ...requestConfig } = config\r\n    const response = await request<unknown>({ ...requestConfig, data: config.body })\r\n    return {\r\n      data: response.data,\r\n      status: response.status,\r\n      statusText: response.statusText ?? '',\r\n      headers: new Headers(response.headers),\r\n      config,\r\n      raw: response.raw ?? null\r\n    }\r\n  }\r\n}\r\n\r\n/**\r\n * Creates an adapter for deterministic local handlers and test transports.\r\n * Returning a Response or HTTPResponse keeps full control over status and\r\n * headers; any other value becomes a successful 200 payload.\r\n */\r\nexport function createMockAdapter(\r\n  handler: (config: RequestConfig) => unknown | PromiseLike<unknown>\r\n): HTTPAdapter {\r\n  return async config => {\r\n    const result = await handler(config)\r\n    if (isResponse(result) || isHTTPResponse(result)) return result\r\n    return {\r\n      data: result,\r\n      status: 200,\r\n      statusText: 'OK',\r\n      headers: new Headers(),\r\n      config,\r\n      raw: null\r\n    }\r\n  }\r\n}\r\n\r\n/** XMLHttpRequest adapter for upload and download progress events. */\r\nexport function createXHRAdapter(): HTTPAdapter {\r\n  return config => new Promise<Response>((resolve, reject) => {\r\n    if (typeof XMLHttpRequest === 'undefined') {\r\n      reject(new Error('HTTP: 当前环境没有可用的 XMLHttpRequest'))\r\n      return\r\n    }\r\n    const xhr = new XMLHttpRequest()\r\n    xhr.open(config.method, config.url, true)\r\n    if (config.responseType === 'arrayBuffer') xhr.responseType = 'arraybuffer'\r\n    else if (config.responseType === 'blob') xhr.responseType = 'blob'\r\n    const signal = config.signal ?? config.state\r\n    const abort = (): void => xhr.abort()\r\n    if (signal?.aborted) {\r\n      reject(Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))\r\n      return\r\n    }\r\n    const cleanup = (): void => signal?.removeEventListener('abort', abort)\r\n    signal?.addEventListener('abort', abort, { once: true })\r\n    xhr.upload.onprogress = event => config.onUploadProgress?.(toProgress(event.loaded, event.lengthComputable ? event.total : undefined))\r\n    xhr.onprogress = event => config.onDownloadProgress?.(toProgress(event.loaded, event.lengthComputable ? event.total : undefined))\r\n    xhr.onload = () => {\r\n      cleanup()\r\n      const headers = new Headers()\r\n      xhr.getAllResponseHeaders().trim().split(/[\\r\\n]+/).forEach(line => {\r\n        const separator = line.indexOf(':')\r\n        if (separator > 0) headers.set(line.slice(0, separator).trim(), line.slice(separator + 1).trim())\r\n      })\r\n      const body = config.responseType === 'arrayBuffer' || config.responseType === 'blob'\r\n        ? xhr.response\r\n        : xhr.responseText\r\n      const response = new Response(body, {\r\n        status: xhr.status,\r\n        statusText: xhr.statusText,\r\n        headers\r\n      })\r\n      Object.defineProperty(response, PROGRESS_HANDLED, { value: true })\r\n      resolve(response)\r\n    }\r\n    xhr.onerror = () => { cleanup(); reject(new Error('HTTP: XMLHttpRequest 网络错误')) }\r\n    xhr.onabort = () => {\r\n      cleanup()\r\n      reject(Object.assign(new Error('The operation was aborted'), { name: 'AbortError' }))\r\n    }\r\n    try {\r\n      const headers = new Headers(config.headers)\r\n      const body = encodeBody(config.body, headers, config.method)\r\n      headers.forEach((value, key) => xhr.setRequestHeader(key, value))\r\n      xhr.send((body ?? null) as Document | XMLHttpRequestBodyInit | null)\r\n    } catch (error) {\r\n      cleanup()\r\n      reject(error)\r\n    }\r\n  })\r\n}\r\n\r\n/** Explicit fetch transport for applications that do not want the built-in Axios transport. */\r\nexport function createFetchAdapter(): HTTPAdapter {\r\n  return fetchAdapter\r\n}\r\n\r\nexport interface HTTPClientOptions {\r\n  baseURL?: string\r\n  headers?: HeadersInit\r\n  timeout?: number\r\n  adapter?: HTTPAdapter\r\n  retry?: number\r\n  retryDelay?: RetryDelay\r\n  shouldRetry?: (error: Error, attempt: number) => boolean | PromiseLike<boolean>\r\n  concurrency?: number\r\n  dedupe?: boolean\r\n}\r\n\r\nexport interface InterceptorManager<T> {\r\n  use<TResult = T>(\r\n    onFulfilled?: (value: T) => TResult | PromiseLike<TResult>,\r\n    onRejected?: (error: unknown) => TResult | PromiseLike<TResult>\r\n  ): number\r\n  eject(id: number): void\r\n  clear(): void\r\n}\r\n\r\nexport interface HTTPInterceptors {\r\n  readonly request: InterceptorManager<RequestConfig>\r\n  readonly response: InterceptorManager<HTTPResponse<unknown>>\r\n}\r\n\r\nexport interface HTTPClient {\r\n  readonly interceptors: HTTPInterceptors\r\n  request<T = unknown>(options: RequestOptions): Promise<HTTPResponse<T>>\r\n  get<T = unknown>(url: string, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\r\n  delete<T = unknown>(url: string, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\r\n  head<T = unknown>(url: string, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\r\n  post<T = unknown>(url: string, body?: unknown, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\r\n  put<T = unknown>(url: string, body?: unknown, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\r\n  patch<T = unknown>(url: string, body?: unknown, options?: Omit<RequestOptions, 'url' | 'method' | 'body'>): Promise<HTTPResponse<T>>\r\n}\r\n\r\nexport interface ConcurrencyLimiter {\r\n  <T>(task: () => T | PromiseLike<T>): Promise<T>\r\n}\r\n\r\nexport class HTTPError extends Error {\r\n  readonly status: number\r\n  readonly statusText: string\r\n  readonly data: unknown\r\n  readonly config: RequestConfig\r\n  readonly response: HTTPResponse<unknown>\r\n\r\n  constructor(response: HTTPResponse<unknown>) {\r\n    super(`HTTP ${response.status}${response.statusText ? ` ${response.statusText}` : ''}`)\r\n    this.name = 'HTTPError'\r\n    this.status = response.status\r\n    this.statusText = response.statusText\r\n    this.data = response.data\r\n    this.config = response.config\r\n    this.response = response\r\n  }\r\n}\r\n\r\nexport class TimeoutError extends Error {\r\n  readonly code = 'ETIMEDOUT'\r\n\r\n  /**\r\n   * 超时时手上那个错误。\r\n   *\r\n   * 整链预算到点会把当前错误换成 TimeoutError —— 原来原错误就此丢掉（报告 P12：真实的\r\n   * ECONNREFUSED 变成了无 cause 的超时）。挂在这里，排查时还有线索。\r\n   */\r\n  readonly cause?: unknown\r\n\r\n  constructor(timeout: number, cause?: unknown) {\r\n    super(`HTTP 请求超过 ${timeout}ms 未完成`)\r\n    this.name = 'TimeoutError'\r\n    if (cause !== undefined) this.cause = cause\r\n  }\r\n}\r\n\r\nexport const HTTP_KEY = createInjectionKey<HTTPClient>('vobs.http')\r\n\r\nexport interface HTTPPluginOptions extends HTTPClientOptions {\r\n  client?: HTTPClient\r\n}\r\n\r\nexport function createHTTPClient(options: HTTPClientOptions = {}): HTTPClient {\r\n  const defaults = normalizeClientOptions(options)\r\n  const requestInterceptors = createInterceptors<RequestConfig>()\r\n  const responseInterceptors = createInterceptors<HTTPResponse<unknown>>()\r\n  const adapter = options.adapter ?? createAxiosAdapter()\r\n  const limiter = createConcurrencyLimiter(options.concurrency ?? Infinity)\r\n  const pending = new Map<string, Promise<HTTPResponse<unknown>>>()\r\n\r\n  async function request<T>(input: RequestOptions): Promise<HTTPResponse<T>> {\r\n    const initial = normalizeRequest(input, defaults)\r\n    const dedupeKey = getDedupeKey(initial, options.dedupe ?? false)\r\n    if (dedupeKey) {\r\n      const existing = pending.get(dedupeKey)\r\n      if (existing) return existing as Promise<HTTPResponse<T>>\r\n      const shared = executeDebugRequest(initial)\r\n      pending.set(dedupeKey, shared)\r\n      void shared.finally(() => pending.delete(dedupeKey)).catch(() => undefined)\r\n      return shared as Promise<HTTPResponse<T>>\r\n    }\r\n    return executeDebugRequest(initial) as Promise<HTTPResponse<T>>\r\n  }\r\n\r\n  function executeDebugRequest(initial: RequestConfig): Promise<HTTPResponse<unknown>> {\r\n    const id = nextHTTPDebugId++\r\n    const startedAt = Date.now()\r\n    const context = {\r\n      ...getRuntimeDebugContext(),\r\n      ...initial.debugContext\r\n    }\r\n    emitHTTPDebug({\r\n      id,\r\n      phase: 'start',\r\n      status: 'loading',\r\n      url: initial.url,\r\n      method: initial.method,\r\n      headers: debugHeaders(initial.headers),\r\n      requestBody: debugValue(initial.body),\r\n      startedAt,\r\n      attempt: 0,\r\n      retries: 0,\r\n      context: Object.keys(context).length > 0 ? context : undefined\r\n    })\r\n    return executeRequest(initial, id).then(response => {\r\n      const endedAt = Date.now()\r\n      emitHTTPDebug({\r\n        id,\r\n        phase: 'end',\r\n        status: 'success',\r\n        url: response.config.url,\r\n        method: response.config.method,\r\n        headers: debugHeaders(response.config.headers),\r\n        requestBody: debugValue(response.config.body),\r\n        startedAt,\r\n        endedAt,\r\n        duration: endedAt - startedAt,\r\n        attempt: 0,\r\n        retries: 0,\r\n        responseStatus: response.status,\r\n        responseBody: debugValue(response.data),\r\n        context: Object.keys(context).length > 0 ? context : undefined\r\n      })\r\n      return response\r\n    }, error => {\r\n      const endedAt = Date.now()\r\n      const cancelled = isAbortError(error)\r\n      emitHTTPDebug({\r\n        id,\r\n        phase: 'end',\r\n        status: cancelled ? 'cancelled' : 'error',\r\n        url: initial.url,\r\n        method: initial.method,\r\n        headers: debugHeaders(initial.headers),\r\n        requestBody: debugValue(initial.body),\r\n        startedAt,\r\n        endedAt,\r\n        duration: endedAt - startedAt,\r\n        attempt: 0,\r\n        retries: 0,\r\n        responseStatus: error instanceof HTTPError ? error.status : undefined,\r\n        responseBody: error instanceof HTTPError ? debugValue(error.data) : undefined,\r\n        error: { name: error instanceof Error ? error.name : 'Error', message: error instanceof Error ? error.message : String(error) },\r\n        context: Object.keys(context).length > 0 ? context : undefined\r\n      })\r\n      throw error\r\n    })\r\n  }\r\n\r\n  async function executeRequest(initial: RequestConfig, debugId?: number): Promise<HTTPResponse<unknown>> {\r\n    const requestChain = requestInterceptors.handlers()\r\n    const responseChain = responseInterceptors.handlers().reverse()\r\n\r\n    let chain: Promise<unknown> = Promise.resolve(initial)\r\n    for (const handler of requestChain) {\r\n      chain = chain.then(handler.onFulfilled, handler.onRejected)\r\n    }\r\n    chain = chain.then(config => limiter(() => executeWithRetry(config as RequestConfig, adapter, debugId)))\r\n    for (const handler of responseChain) {\r\n      chain = chain.then(handler.onFulfilled, handler.onRejected)\r\n    }\r\n    return chain as Promise<HTTPResponse<unknown>>\r\n  }\r\n\r\n  function method<T>(methodName: HTTPMethod, url: string, input: Omit<RequestOptions, 'url' | 'method' | 'body'> = {}): Promise<HTTPResponse<T>> {\r\n    return request<T>({ ...input, url, method: methodName })\r\n  }\r\n\r\n  function methodWithBody<T>(methodName: HTTPMethod, url: string, body: unknown, input: Omit<RequestOptions, 'url' | 'method' | 'body'> = {}): Promise<HTTPResponse<T>> {\r\n    return request<T>({ ...input, url, method: methodName, body })\r\n  }\r\n\r\n  const client: HTTPClient = {\r\n    interceptors: {\r\n      request: requestInterceptors,\r\n      response: responseInterceptors\r\n    },\r\n    request,\r\n    get: (url, input) => method('GET', url, input),\r\n    delete: (url, input) => method('DELETE', url, input),\r\n    head: (url, input) => method('HEAD', url, input),\r\n    post: (url, body, input) => methodWithBody('POST', url, body, input),\r\n    put: (url, body, input) => methodWithBody('PUT', url, body, input),\r\n    patch: (url, body, input) => methodWithBody('PATCH', url, body, input)\r\n  }\r\n  return client\r\n\r\n  async function executeWithRetry(config: RequestConfig, requestAdapter: HTTPAdapter, debugId?: number): Promise<HTTPResponse<unknown>> {\r\n    const controller = new AbortController()\r\n    const inputSignal = config.signal ?? config.state\r\n    let timedOut = false\r\n    let timeoutId: ReturnType<typeof setTimeout> | undefined\r\n    const abortFromInput = (): void => controller.abort(inputSignal?.reason)\r\n\r\n    if (inputSignal) {\r\n      if (inputSignal.aborted) controller.abort(inputSignal.reason)\r\n      else inputSignal.addEventListener('abort', abortFromInput, { once: true })\r\n    }\r\n    if (config.timeout !== undefined && config.timeout > 0) {\r\n      timeoutId = setTimeout(() => {\r\n        timedOut = true\r\n        controller.abort()\r\n      }, config.timeout)\r\n    }\r\n\r\n    const adapterConfig: RequestConfig = { ...config, signal: controller.signal }\r\n    /*\r\n     * 取消与超时必须是**硬保证**，不能只把 signal 交给适配器就算了。\r\n     *\r\n     * `HTTPAdapter` 是公开扩展点，完全可能不读 `config.signal`；原来这里直接\r\n     * `await requestAdapter(...)`，于是 abort 只是\"建议\"：已 abort 的请求照样发出并返回 200，\r\n     * `timeout: 10` 也要等适配器自己收敛才走到超时判定（实测 74ms 才成功）。适配器永不结算时\r\n     * 更糟：promise 永久 pending（并发闸被占死、去重同 key 永挂）。\r\n     *\r\n     * 所以让 abort 与适配器赛跑 —— 请求 promise 必定收敛。\r\n     */\r\n    let rejectOnAbort: ((reason: unknown) => void) | undefined\r\n    /** 适配器自己报出来的错误（输了赛跑时也能留下来当 cause）。 */\r\n    let lastError: unknown\r\n    const aborted = new Promise<never>((_, reject) => { rejectOnAbort = reject })\r\n    // 空 catch：没人接时不该变成 unhandledRejection（这个坑前面修过）\r\n    aborted.catch(() => {})\r\n    const abortError = (): Error => {\r\n      const reason = controller.signal.reason\r\n      if (reason instanceof Error) return reason\r\n      const error = new Error('Vobs HTTP: 请求已取消')\r\n      error.name = 'AbortError'\r\n      return error\r\n    }\r\n    const onAbort = (): void => { rejectOnAbort?.(abortError()) }\r\n    if (controller.signal.aborted) onAbort()\r\n    else controller.signal.addEventListener('abort', onAbort, { once: true })\r\n\r\n    let attempt = 0\r\n    try {\r\n      while (true) {\r\n        try {\r\n          /*\r\n           * 适配器的 promise 单独拿着：输了赛跑（abort 先到）时它稍后仍可能 reject ——\r\n           * 没人接就会变成 unhandledRejection。这里先挂一个空 catch，同时把它记进 lastError，\r\n           * 好在超时路径里作为 cause 保留下来（真实失败原因不该被丢掉）。\r\n           */\r\n          // 适配器允许同步返回，所以先归一成 promise\r\n          const adapterPromise = Promise.resolve(requestAdapter(adapterConfig))\r\n          adapterPromise.catch(reason => { lastError = reason })\r\n          const result = await Promise.race([adapterPromise, aborted])\r\n          const response = isHTTPResponse(result)\r\n            ? result\r\n            : await parseResponse(result, adapterConfig)\r\n          if (response.status < 200 || response.status >= 300) throw new HTTPError(response)\r\n          return response\r\n        } catch (error) {\r\n          /*\r\n           * 只挂**适配器自己报出来**的错误。\r\n           *\r\n           * 超时的 abort 通常先到，此刻 lastError 还是空的 —— 那就**不挂 cause**，\r\n           * 而不是把内部合成的 abort 错误塞进去当线索（那比没有更误导）。\r\n           * 真实错误若在超时前就已报出，会留在这里。\r\n           */\r\n          if (timedOut) throw new TimeoutError(config.timeout!, lastError)\r\n          if (inputSignal?.aborted || isAbortError(error)) throw error\r\n          const nextAttempt = attempt + 1\r\n          if (nextAttempt > (config.retry ?? 0)) throw toError(error)\r\n          /*\r\n           * 默认只对**幂等**方法自动重试。\r\n           *\r\n           * 原来默认是 `isRetryable(error)`，完全不看方法 —— README 推荐的客户端级 `retry: 2`\r\n           * 会让 POST 在 503 下真的发 3 次（报告实测）。服务端可能因此写入两次：静默重复提交。\r\n           * HTTP 客户端的惯例是\"自动重试只用于幂等方法\"。\r\n           *\r\n           * 调用方一旦显式提供 `shouldRetry`，就完全交给它 —— 需要重试 POST 的人显式打开即可，\r\n           * `retry` 这个预算项本身不变。\r\n           */\r\n          const shouldRetry = config.shouldRetry\r\n            ? await config.shouldRetry(toError(error), nextAttempt)\r\n            : isRetryable(error) && isIdempotentMethod(config.method)\r\n          if (!shouldRetry) throw toError(error)\r\n          attempt = nextAttempt\r\n          const retryContext = {\r\n            ...getRuntimeDebugContext(),\r\n            ...config.debugContext\r\n          }\r\n          emitHTTPDebug({\r\n            id: debugId ?? 0,\r\n            phase: 'retry',\r\n            status: 'retrying',\r\n            url: config.url,\r\n            method: config.method,\r\n            headers: debugHeaders(config.headers),\r\n            requestBody: debugValue(config.body),\r\n            startedAt: Date.now(),\r\n            attempt,\r\n            retries: attempt,\r\n            error: { name: toError(error).name, message: toError(error).message },\r\n            context: Object.keys(retryContext).length > 0 ? retryContext : undefined\r\n          })\r\n          /*\r\n           * 退避取两者**较大值**：\r\n           * - 配置的 `retryDelay`（默认 0，即\"不额外等\"）\r\n           * - 服务端 `Retry-After`（有就必须认，见 serverRetryDelay 的说明）\r\n           *\r\n           * 取较大值而不是\"有就用\"：调用方显式配了更长退避时不该被服务端缩短。\r\n           */\r\n          const serverHint = serverRetryDelay(toError(error))\r\n          const configured = resolveRetryDelay(config.retryDelay ?? 0, attempt, toError(error))\r\n          const delay = Math.max(configured, serverHint ?? 0)\r\n          if (delay > 0) await wait(delay)\r\n        }\r\n      }\r\n    } finally {\r\n      controller.signal.removeEventListener('abort', onAbort)\r\n      if (timeoutId !== undefined) clearTimeout(timeoutId)\r\n      inputSignal?.removeEventListener('abort', abortFromInput)\r\n    }\r\n  }\r\n}\r\n\r\nfunction debugHeaders(headers: HTTPHeaders): HTTPHeaders {\r\n  const safe: HTTPHeaders = {}\r\n  for (const [key, value] of Object.entries(headers)) {\r\n    if (/authorization|cookie|token|password|secret|api[-_]?key/i.test(key)) continue\r\n    safe[key] = value\r\n  }\r\n  return safe\r\n}\r\n\r\nfunction debugValue(value: unknown, depth = 0): unknown {\r\n  if (value === null || typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') return value\r\n  if (value === undefined) return undefined\r\n  if (depth >= 2) return '[MaxDepth]'\r\n  if (typeof value === 'bigint') return `${value}n`\r\n  if (typeof value === 'function') return `[Function ${value.name || 'anonymous'}]`\r\n  if (typeof value !== 'object') return String(value)\r\n  if (Array.isArray(value)) return value.slice(0, 20).map(item => debugValue(item, depth + 1))\r\n  try {\r\n    return Object.fromEntries(Object.entries(value).slice(0, 30).map(([key, item]) => [key, debugValue(item, depth + 1)]))\r\n  } catch {\r\n    return '[Uninspectable]'\r\n  }\r\n}\r\n\r\nexport function httpPlugin(options: HTTPPluginOptions = {}): VobsPlugin {\r\n  return {\r\n    name: '@vobs/http',\r\n    version: '0.1.0',\r\n    install(context) {\r\n      const client = options.client ?? createHTTPClient(options)\r\n      context.provide(HTTP_KEY, client)\r\n    }\r\n  }\r\n}\r\n\r\nfunction createInterceptors<T>(): InterceptorManager<T> & {\r\n  handlers(): Array<{ onFulfilled: (value: unknown) => unknown; onRejected: (error: unknown) => unknown }>\r\n} {\r\n  type Handler = {\r\n    onFulfilled: (value: unknown) => unknown\r\n    onRejected: (error: unknown) => unknown\r\n  }\r\n  const entries: Array<Handler | null> = []\r\n\r\n  return {\r\n    use(\r\n      onFulfilled?: (value: T) => unknown | PromiseLike<unknown>,\r\n      onRejected?: (error: unknown) => unknown | PromiseLike<unknown>\r\n    ) {\r\n      entries.push({\r\n        onFulfilled: (value: unknown) => onFulfilled ? onFulfilled(value as T) : value,\r\n        onRejected: (error: unknown) => onRejected ? onRejected(error) : Promise.reject(error)\r\n      })\r\n      return entries.length - 1\r\n    },\r\n    eject(id) {\r\n      if (id >= 0 && id < entries.length) entries[id] = null\r\n    },\r\n    clear() {\r\n      entries.fill(null)\r\n    },\r\n    handlers() {\r\n      return entries.filter((entry): entry is Handler => entry !== null)\r\n    }\r\n  }\r\n}\r\n\r\nfunction normalizeClientOptions(options: HTTPClientOptions): Required<Pick<HTTPClientOptions, 'baseURL' | 'headers' | 'timeout' | 'retry' | 'retryDelay'>> & Pick<HTTPClientOptions, 'shouldRetry'> {\r\n  return {\r\n    baseURL: options.baseURL ?? '',\r\n    headers: options.headers ?? {},\r\n    timeout: validateTimeout(options.timeout ?? 0),\r\n    retry: validateRetry(options.retry ?? 0),\r\n    retryDelay: options.retryDelay ?? 0,\r\n    shouldRetry: options.shouldRetry\r\n  }\r\n}\r\n\r\nexport function createConcurrencyLimiter(limit: number): ConcurrencyLimiter {\r\n  if (limit !== Infinity && (!Number.isFinite(limit) || limit < 1 || !Number.isInteger(limit))) {\r\n    throw new Error('HTTP: concurrency 必须是大于等于 1 的整数')\r\n  }\r\n  let active = 0\r\n  const queue: Array<() => void> = []\r\n\r\n  return <T>(task: () => T | PromiseLike<T>): Promise<T> => new Promise<T>((resolve, reject) => {\r\n    const run = (): void => {\r\n      active++\r\n      Promise.resolve().then(task).then(resolve, reject).finally(() => {\r\n        active--\r\n        queue.shift()?.()\r\n      })\r\n    }\r\n    if (active < limit) run()\r\n    else queue.push(run)\r\n  })\r\n}\r\n\r\nfunction getDedupeKey(config: RequestConfig, defaultEnabled: boolean): string | undefined {\r\n  if (config.dedupe === false) return undefined\r\n  if (config.dedupeKey) return config.dedupeKey\r\n  if (!(config.dedupe ?? defaultEnabled)) return undefined\r\n  if (config.method !== 'GET' && config.method !== 'HEAD') return undefined\r\n  /*\r\n   * 键里必须带上\"是谁在问\"的凭据。\r\n   *\r\n   * 原来只有 `METHOD url`：两个并发 GET 只要 URL 相同就合并，**哪怕 Authorization 不同** ——\r\n   * B 的请求根本不会发出，直接拿到 A 的响应（拿错数据，属于安全问题）。\r\n   * 只纳入凭据类头，其余头不参与，去重的价值不受影响。\r\n   *\r\n   * 还必须带上**改变响应形态**的选项（`responseShapeFingerprint`）：\r\n   * 同一个 URL 并发要 `responseType:'json'` 与 `'blob'` 时，后者会拿到前者解析好的对象\r\n   * （类型与内容都不对，且完全无声 —— 去重是\"共享同一个响应\"，不是\"共享同一个请求\"）。\r\n   */\r\n  return `${config.method} ${config.url} ${credentialFingerprint(config.headers)} ${responseShapeFingerprint(config)}`\r\n}\r\n\r\n/**\r\n * 参与去重键的\"响应形态\"选项。\r\n *\r\n * 这些选项不改变请求发往哪里，但**改变返回给调用方的东西**，所以声明的形态不同就不能合并：\r\n * - `responseType`：json / text / blob / arrayBuffer / response —— 差异最大\r\n * - `credentials`：include 与 omit 会拿到不同内容（登录态与未登录态的响应可能完全不同）\r\n * - `cache`：default 与 no-store 可能拿到不同的新鲜度\r\n *\r\n * **刻意不纳入**：`onDownloadProgress` / `onUploadProgress` / `signal` / `timeout` / `debugContext`\r\n * / `retry` 等，它们不影响响应内容，只影响\"怎么等\"。\r\n *\r\n * ⚠️ 但要知道 `onDownloadProgress` 的这个取舍有代价：两个调用方若声明了**不同的**进度回调\r\n * 却共享同一个 key，只有先发出那一个的进度回调会被调用（后者静默收不到进度）。\r\n * 这一点写成注释而不是塞进 key —— 把回调塞进 key 会让\"每个新回调都产生新请求\"，\r\n * 去重就彻底失效了。需要独立进度回调的调用方请用 `dedupe: false` 或自定义 `dedupeKey`。\r\n */\r\nfunction responseShapeFingerprint(config: RequestConfig): string {\r\n  return [\r\n    `rt=${config.responseType ?? 'json'}`,\r\n    `cr=${config.credentials ?? 'same-origin'}`,\r\n    `ca=${config.cache ?? 'default'}`\r\n  ].join(' ')\r\n}\r\n\r\n/** 参与去重键的凭据头（小写）。 */\r\nconst DEDUPE_CREDENTIAL_HEADERS = ['authorization', 'cookie', 'proxy-authorization'] as const\r\n\r\nfunction credentialFingerprint(headers: RequestConfig['headers']): string {\r\n  if (!headers) return ''\r\n  const parts: string[] = []\r\n  // for...in 而不是 Object.keys：headers 可能带原型（table 那轮踩过）\r\n  for (const key in headers) {\r\n    const lower = key.toLowerCase()\r\n    if (!(DEDUPE_CREDENTIAL_HEADERS as readonly string[]).includes(lower)) continue\r\n    const value = (headers as Record<string, unknown>)[key]\r\n    parts.push(`${lower}=${typeof value === 'string' ? value : JSON.stringify(value ?? null)}`)\r\n  }\r\n  return parts.sort().join('&')\r\n}\r\n\r\nfunction normalizeRequest(input: RequestOptions, defaults: ReturnType<typeof normalizeClientOptions>): RequestConfig {\r\n  if (!input.url) throw new Error('HTTP: url 不能为空')\r\n  const method = (input.method ?? 'GET').toUpperCase() as HTTPMethod\r\n  const timeout = validateTimeout(input.timeout ?? defaults.timeout)\r\n  const retry = validateRetry(input.retry ?? defaults.retry)\r\n  const retryDelay = input.retryDelay ?? defaults.retryDelay\r\n  const signal = input.signal ?? input.state\r\n  if (input.signal && input.state && input.signal !== input.state) {\r\n    throw new Error('HTTP: signal 和 state 不能同时指向不同的 AbortSignal')\r\n  }\r\n  return {\r\n    ...input,\r\n    url: appendParams(resolveURL(input.url, input.baseURL ?? defaults.baseURL), input.params),\r\n    method,\r\n    headers: toHeaders(defaults.headers, input.headers),\r\n    timeout,\r\n    retry,\r\n    retryDelay,\r\n    shouldRetry: input.shouldRetry ?? defaults.shouldRetry,\r\n    signal\r\n  }\r\n}\r\n\r\nasync function fetchAdapter(config: RequestConfig): Promise<Response> {\r\n  if (typeof fetch !== 'function') throw new Error('HTTP: 当前环境没有可用的 fetch')\r\n  const headers = new Headers(config.headers)\r\n  const body = encodeBody(config.body, headers, config.method)\r\n  return fetch(config.url, {\r\n    method: config.method,\r\n    headers,\r\n    body,\r\n    signal: config.signal,\r\n    cache: config.cache,\r\n    credentials: config.credentials,\r\n    mode: config.mode\r\n  })\r\n}\r\n\r\nasync function parseResponse(response: Response, config: RequestConfig): Promise<HTTPResponse<unknown>> {\r\n  const data = config.responseType === 'response'\r\n    ? response\r\n    : await parseBody(response, config.responseType, hasHandledProgress(response) ? undefined : config.onDownloadProgress)\r\n  return {\r\n    data,\r\n    status: response.status,\r\n    statusText: response.statusText,\r\n    headers: response.headers,\r\n    config,\r\n    raw: response\r\n  }\r\n}\r\n\r\nconst builtInAxiosRequest: AxiosRequest = async <T = unknown>(config: AxiosRequestConfigLike) => {\r\n  const responseType = config.responseType === 'response' ? 'arraybuffer' : toAxiosResponseType(config.responseType)\r\n  const response = await axios.request<T>({\r\n    url: config.url,\r\n    method: config.method,\r\n    headers: config.headers,\r\n    data: config.method === 'GET' || config.method === 'HEAD' ? undefined : config.body,\r\n    signal: config.signal,\r\n    timeout: config.timeout,\r\n    responseType,\r\n    withCredentials: toAxiosCredentials(config.credentials),\r\n    validateStatus: () => true,\r\n    adapter: 'fetch',\r\n    fetchOptions: compactFetchOptions(config),\r\n    onUploadProgress: event => config.onUploadProgress?.(toAxiosProgress(event.loaded, event.total)),\r\n    onDownloadProgress: event => config.onDownloadProgress?.(toAxiosProgress(event.loaded, event.total))\r\n  })\r\n  const raw = config.responseType === 'response'\r\n    ? toRawResponse(response.data, response.status, response.statusText, response.headers as unknown as HeadersInit)\r\n    : null\r\n  return {\r\n    data: (raw ?? response.data) as T,\r\n    status: response.status,\r\n    statusText: response.statusText,\r\n    headers: (typeof response.headers?.toJSON === 'function' ? response.headers.toJSON() : response.headers) as HeadersInit,\r\n    raw\r\n  }\r\n}\r\n\r\n/** 可以安全地自动重试的方法：重复执行与执行一次等价。 */\r\nconst IDEMPOTENT_METHODS = new Set(['GET', 'HEAD', 'OPTIONS', 'PUT', 'DELETE'])\r\n\r\nfunction isIdempotentMethod(method: string | undefined): boolean {\r\n  return IDEMPOTENT_METHODS.has((method ?? 'GET').toUpperCase())\r\n}\r\nfunction toAxiosCredentials(credentials?: RequestCredentials): boolean | undefined {\r\n  if (credentials === 'include') return true\r\n  if (credentials === 'omit') return false\r\n  return undefined\r\n}\r\n\r\nfunction toRawResponse(data: unknown, status: number, statusText: string | undefined, headers: HeadersInit | undefined): Response {\r\n  if (typeof Response === 'undefined') throw new Error('HTTP: 当前环境没有可用的 Response')\r\n  const body = status === 204 || status === 205 ? null : data as BodyInit | null | undefined\r\n  return new Response(body, {\r\n    status,\r\n    statusText: statusText ?? '',\r\n    headers: new Headers(headers)\r\n  })\r\n}\r\n\r\nfunction toAxiosResponseType(responseType?: HTTPResponseType): 'arraybuffer' | 'blob' | 'json' | 'text' | undefined {\r\n  if (responseType === 'arrayBuffer') return 'arraybuffer'\r\n  if (responseType === 'response') return undefined\r\n  return responseType\r\n}\r\n\r\nfunction compactFetchOptions(config: RequestConfig): Record<string, unknown> | undefined {\r\n  const options = {\r\n    cache: config.cache,\r\n    credentials: config.credentials,\r\n    mode: config.mode\r\n  }\r\n  const entries = Object.entries(options).filter(([, value]) => value !== undefined)\r\n  return entries.length === 0 ? undefined : Object.fromEntries(entries)\r\n}\r\n\r\nfunction toAxiosProgress(loaded: number, total: number | undefined): HTTPProgress {\r\n  return {\r\n    loaded,\r\n    total,\r\n    percent: total && total > 0 ? loaded / total * 100 : undefined\r\n  }\r\n}\r\n\r\nasync function parseBody(\r\n  response: Response,\r\n  responseType?: HTTPResponseType,\r\n  onDownloadProgress?: HTTPProgressHandler\r\n): Promise<unknown> {\r\n  if (response.status === 204 || response.status === 205) return null\r\n  const bytes = onDownloadProgress && response.body\r\n    ? await readResponseBytes(response, onDownloadProgress)\r\n    : undefined\r\n  if (responseType === 'blob') return bytes ? new Blob([bytes as unknown as BlobPart]) : response.blob()\r\n  if (responseType === 'arrayBuffer') return bytes ? bytes.buffer : response.arrayBuffer()\r\n  const text = bytes ? new TextDecoder().decode(bytes) : await response.text()\r\n  if (responseType === 'text') return text\r\n  if (!text) return null\r\n  if (responseType === 'json' || response.headers.get('content-type')?.includes('json')) {\r\n    try {\r\n      return JSON.parse(text)\r\n    } catch {\r\n      throw new Error('HTTP: 响应不是有效 JSON')\r\n    }\r\n  }\r\n  return text\r\n}\r\n\r\nasync function readResponseBytes(response: Response, onProgress: HTTPProgressHandler): Promise<Uint8Array> {\r\n  const reader = response.body!.getReader()\r\n  const chunks: Uint8Array[] = []\r\n  const totalHeader = response.headers.get('content-length')\r\n  const parsedTotal = totalHeader ? Number(totalHeader) : NaN\r\n  const total = Number.isFinite(parsedTotal) && parsedTotal >= 0 ? parsedTotal : undefined\r\n  let loaded = 0\r\n  while (true) {\r\n    const next = await reader.read()\r\n    if (next.done) break\r\n    chunks.push(next.value)\r\n    loaded += next.value.byteLength\r\n    onProgress(toProgress(loaded, total))\r\n  }\r\n  const result = new Uint8Array(loaded)\r\n  let offset = 0\r\n  for (const chunk of chunks) {\r\n    result.set(chunk, offset)\r\n    offset += chunk.byteLength\r\n  }\r\n  return result\r\n}\r\n\r\nfunction isHTTPResponse(value: unknown): value is HTTPResponse<unknown> {\r\n  return typeof value === 'object' && value !== null && 'data' in value && 'status' in value && 'config' in value\r\n}\r\n\r\nfunction isResponse(value: unknown): value is Response {\r\n  return typeof Response !== 'undefined' && value instanceof Response\r\n}\r\n\r\nfunction hasHandledProgress(response: Response): boolean {\r\n  return Boolean((response as Response & { [PROGRESS_HANDLED]?: boolean })[PROGRESS_HANDLED])\r\n}\r\n\r\nfunction encodeBody(body: unknown, headers: Headers, method: HTTPMethod): BodyInit | undefined {\r\n  if (body === undefined || body === null || method === 'GET' || method === 'HEAD') return undefined\r\n  if (typeof body === 'string' || body instanceof Blob || body instanceof FormData\r\n    || body instanceof ArrayBuffer || body instanceof URLSearchParams) return body as BodyInit\r\n  if (!headers.has('content-type')) headers.set('content-type', 'application/json')\r\n  return JSON.stringify(body)\r\n}\r\n\r\nfunction toHeaders(...inputs: Array<HeadersInit | undefined>): HTTPHeaders {\r\n  const headers = new Headers()\r\n  for (const input of inputs) {\r\n    if (!input) continue\r\n    new Headers(input).forEach((value, key) => headers.set(key, value))\r\n  }\r\n  const result: HTTPHeaders = {}\r\n  headers.forEach((value, key) => { result[key] = value })\r\n  return result\r\n}\r\n\r\nfunction resolveURL(url: string, baseURL: string): string {\r\n  if (!baseURL || /^[a-z][a-z\\d+.-]*:/i.test(url) || url.startsWith('//')) return url\r\n  if (!baseURL) return url\r\n  return `${baseURL.replace(/\\/$/, '')}/${url.replace(/^\\//, '')}`\r\n}\r\n\r\nfunction appendParams(url: string, params?: Record<string, unknown> | URLSearchParams): string {\r\n  if (!params) return url\r\n  const query = params instanceof URLSearchParams ? params : toSearchParams(params)\r\n  const serialized = query.toString()\r\n  if (!serialized) return url\r\n  return `${url}${url.includes('?') ? '&' : '?'}${serialized}`\r\n}\r\n\r\nfunction toSearchParams(params: Record<string, unknown>): URLSearchParams {\r\n  const search = new URLSearchParams()\r\n  for (const [key, value] of Object.entries(params)) {\r\n    if (value === undefined || value === null) continue\r\n    if (Array.isArray(value)) {\r\n      for (const item of value) search.append(key, String(item))\r\n    } else if (typeof value === 'object') {\r\n      search.set(key, JSON.stringify(value))\r\n    } else {\r\n      search.set(key, String(value))\r\n    }\r\n  }\r\n  return search\r\n}\r\n\r\nfunction isRetryable(error: unknown): boolean {\r\n  return error instanceof HTTPError\r\n    ? error.status === 429 || error.status >= 500\r\n    : !isAbortError(error)\r\n}\r\n\r\nfunction isAbortError(error: unknown): boolean {\r\n  return Boolean(error) && typeof error === 'object'\r\n    && ((error as { name?: unknown }).name === 'AbortError'\r\n      || (error as { code?: unknown }).code === 'ERR_CANCELED')\r\n}\r\n\r\nfunction resolveRetryDelay(retryDelay: RetryDelay, attempt: number, error: Error): number {\r\n  const delay = typeof retryDelay === 'function' ? retryDelay(attempt, error) : retryDelay\r\n  if (!Number.isFinite(delay) || delay < 0) throw new Error('HTTP: retryDelay 必须是大于等于 0 的有限数字')\r\n  return delay\r\n}\r\n\r\n/**\r\n * 服务端在响应里给的**重试提示**（`Retry-After`），没给就返回 undefined。\r\n *\r\n * 为什么必须认它：`429`/`503` 上的 `Retry-After` 是服务端在明确说\r\n * \"**别现在来**\"。客户端零退避连环重试等于把它挡的那部分流量原样打回去 —— 是**放大器**，\r\n * 而且违反协议。实测（审计探针）：服务端回 `429 + retry-after: 5`，客户端在 4ms 内\r\n * 把 3 次请求全打完（间隔 `[2,0]` ms）。全仓此前 grep `retry-after` 零命中。\r\n *\r\n * 支持两种合法格式（RFC 9110 §10.2.3）：\r\n * - 秒数：`Retry-After: 5`\r\n * - HTTP 日期：`Retry-After: Wed, 21 Oct 2015 07:28:00 GMT`\r\n *\r\n * 只接受**非负有限值**；非法值当作没给（不因为服务端写错就阻断重试）。\r\n * 上限 60 秒：避免一个荒谬的 `Retry-After` 把调用方挂死。\r\n */\r\nconst MAX_SERVER_RETRY_DELAY = 60_000\r\n\r\nfunction serverRetryDelay(error: Error): number | undefined {\r\n  if (!(error instanceof HTTPError)) return undefined\r\n  const raw = error.response?.headers?.get('retry-after')\r\n  if (raw === null || raw === undefined) return undefined\r\n  const value = raw.trim()\r\n  if (value === '') return undefined\r\n\r\n  let ms: number | undefined\r\n  if (/^\\d+$/u.test(value)) {\r\n    ms = Number(value) * 1000\r\n  } else {\r\n    const when = Date.parse(value)\r\n    if (!Number.isNaN(when)) ms = when - Date.now()\r\n  }\r\n  if (ms === undefined || !Number.isFinite(ms) || ms < 0) return undefined\r\n  return Math.min(ms, MAX_SERVER_RETRY_DELAY)\r\n}\r\n\r\nfunction validateRetry(retry: number): number {\r\n  if (!Number.isInteger(retry) || retry < 0) throw new Error('HTTP: retry 必须是大于等于 0 的整数')\r\n  return retry\r\n}\r\n\r\nfunction validateTimeout(timeout: number): number {\r\n  if (!Number.isFinite(timeout) || timeout < 0) throw new Error('HTTP: timeout 必须是大于等于 0 的有限数字')\r\n  return timeout\r\n}\r\n\r\nfunction toError(error: unknown): Error {\r\n  return error instanceof Error ? error : new Error(String(error))\r\n}\r\n\r\nfunction wait(delay: number): Promise<void> {\r\n  return new Promise(resolve => setTimeout(resolve, delay))\r\n}\r\n\r\nfunction toProgress(loaded: number, total: number | undefined): HTTPProgress {\r\n  return {\r\n    loaded,\r\n    total,\r\n    percent: total && total > 0 ? loaded / total * 100 : undefined\r\n  }\r\n}\r\n","export interface SSEOptions {\n  readonly withCredentials?: boolean\n  readonly eventSource?: SSEConstructor\n  readonly onOpen?: (event: Event) => void\n  readonly onMessage?: (event: MessageEvent) => void\n  readonly onError?: (event: Event) => void\n}\n\nexport interface SSEClient {\n  readonly source: EventSource\n  close(): void\n}\n\nexport type SSEConstructor = new (url: string, options?: EventSourceInit) => EventSource\n\nexport function createSSE(url: string, options: SSEOptions = {}): SSEClient {\n  const EventSourceImpl = options.eventSource ?? globalThis.EventSource\n  if (!EventSourceImpl) throw new Error('HTTP: 当前环境没有可用的 EventSource')\n  const source = new EventSourceImpl(url, { withCredentials: options.withCredentials ?? false })\n  if (options.onOpen) source.addEventListener('open', options.onOpen)\n  if (options.onMessage) source.addEventListener('message', options.onMessage)\n  if (options.onError) source.addEventListener('error', options.onError)\n  return {\n    source,\n    close: () => source.close()\n  }\n}\n\nexport interface WebSocketOptions {\n  readonly protocols?: string | readonly string[]\n  readonly webSocket?: WebSocketConstructor\n  readonly autoReconnect?: boolean\n  readonly reconnectDelay?: number\n}\n\nexport interface WebSocketClient {\n  readonly socket: WebSocket | null\n  readonly state: WebSocketState\n  connect(): void\n  send(data: string | ArrayBufferLike | Blob | ArrayBufferView): void\n  close(code?: number, reason?: string): void\n  on<K extends WebSocketEventName>(event: K, listener: WebSocketEventListener<K>): () => void\n}\n\nexport type WebSocketState = 'idle' | 'connecting' | 'open' | 'closed'\nexport type WebSocketEventName = 'open' | 'message' | 'error' | 'close'\nexport type WebSocketEventListener<K extends WebSocketEventName> =\n  K extends 'message' ? (event: MessageEvent) => void\n    : K extends 'close' ? (event: CloseEvent) => void\n      : (event: Event) => void\nexport type WebSocketConstructor = new (\n  url: string,\n  protocols?: string | string[]\n) => WebSocket\n\nexport function createWebSocket(url: string, options: WebSocketOptions = {}): WebSocketClient {\n  const WebSocketImpl = options.webSocket ?? globalThis.WebSocket\n  if (!WebSocketImpl) throw new Error('HTTP: 当前环境没有可用的 WebSocket')\n  const reconnectDelay = options.reconnectDelay ?? 1_000\n  if (!Number.isFinite(reconnectDelay) || reconnectDelay < 0) {\n    throw new Error('HTTP: reconnectDelay 必须是大于等于 0 的有限数字')\n  }\n\n  const listeners = new Map<WebSocketEventName, Set<(event: Event) => void>>()\n  let socket: WebSocket | null = null\n  let state: WebSocketState = 'idle'\n  let manuallyClosed = false\n  let reconnectTimer: ReturnType<typeof setTimeout> | undefined\n\n  const client: WebSocketClient = {\n    get socket(): WebSocket | null { return socket },\n    get state(): WebSocketState { return state },\n    connect,\n    send(data) {\n      if (!socket || state !== 'open') throw new Error('HTTP: WebSocket 尚未连接')\n      socket.send(data)\n    },\n    close(code, reason) {\n      manuallyClosed = true\n      if (reconnectTimer !== undefined) clearTimeout(reconnectTimer)\n      socket?.close(code, reason)\n      if (!socket) state = 'closed'\n    },\n    on(event, listener) {\n      let eventListeners = listeners.get(event)\n      if (!eventListeners) {\n        eventListeners = new Set()\n        listeners.set(event, eventListeners)\n      }\n      eventListeners.add(listener as (event: Event) => void)\n      return () => eventListeners?.delete(listener as (event: Event) => void)\n    }\n  }\n\n  connect()\n  return client\n\n  function connect(): void {\n    if (state === 'connecting' || state === 'open') return\n    manuallyClosed = false\n    state = 'connecting'\n    const protocols = options.protocols === undefined\n      ? undefined\n      : typeof options.protocols === 'string' ? options.protocols : [...options.protocols]\n    socket = new WebSocketImpl(url, protocols)\n    socket.addEventListener('open', event => {\n      state = 'open'\n      notify('open', event)\n    })\n    socket.addEventListener('message', event => notify('message', event))\n    socket.addEventListener('error', event => notify('error', event))\n    socket.addEventListener('close', event => {\n      state = 'closed'\n      socket = null\n      notify('close', event)\n      if (options.autoReconnect && !manuallyClosed) {\n        reconnectTimer = setTimeout(() => {\n          reconnectTimer = undefined\n          connect()\n        }, reconnectDelay)\n      }\n    })\n  }\n\n  function notify(event: WebSocketEventName, value: Event): void {\n    for (const listener of [...(listeners.get(event) ?? [])]) listener(value)\n  }\n}\n","import type { HTTPMethod, HTTPHeaders } from './index'\nimport type { RuntimeDebugContext } from '@vobs/runtime'\n\nexport type HTTPDebugStatus = 'loading' | 'retrying' | 'success' | 'error' | 'cancelled'\n\nexport type HTTPDebugCacheStatus = 'hit' | 'miss' | 'revalidated'\n\nexport interface HTTPDebugContext extends RuntimeDebugContext {\n  readonly cacheStatus?: HTTPDebugCacheStatus\n  /** Marks a request created from the DevTools request tester. */\n  readonly test?: boolean\n}\n\nexport interface HTTPDebugRequest {\n  readonly id: number\n  readonly phase: 'start' | 'retry' | 'end'\n  readonly status: HTTPDebugStatus\n  readonly url: string\n  readonly method: HTTPMethod\n  readonly headers: HTTPHeaders\n  readonly requestBody?: unknown\n  readonly startedAt: number\n  readonly endedAt?: number\n  readonly duration?: number\n  readonly attempt: number\n  readonly retries: number\n  readonly responseStatus?: number\n  readonly responseBody?: unknown\n  readonly error?: { readonly name: string; readonly message: string }\n  readonly context?: HTTPDebugContext\n}\n\nexport interface HTTPDebugHooks {\n  request?(event: HTTPDebugRequest): void\n}\n\nlet activeHTTPDebugHooks: HTTPDebugHooks | null = null\nconst httpDebugListeners = new Set<NonNullable<HTTPDebugHooks['request']>>()\n\nexport function setHTTPDebugHooks(hooks: HTTPDebugHooks | null): HTTPDebugHooks | null {\n  const previous = activeHTTPDebugHooks\n  activeHTTPDebugHooks = hooks\n  return previous\n}\n\nexport function getHTTPDebugHooks(): HTTPDebugHooks | null {\n  return activeHTTPDebugHooks\n}\n\nexport function subscribeHTTPDebug(listener: NonNullable<HTTPDebugHooks['request']>): () => void {\n  httpDebugListeners.add(listener)\n  return () => httpDebugListeners.delete(listener)\n}\n\nexport function emitHTTPDebug(event: HTTPDebugRequest): void {\n  try {\n    activeHTTPDebugHooks?.request?.(event)\n  } catch {\n    // Debug tooling must never change request behavior.\n  }\n  for (const listener of [...httpDebugListeners]) {\n    try { listener(event) } catch { /* Debug tooling must never change request behavior. */ }\n  }\n}\n"],"mappings":"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","names":["import_runtime","axios"]}