fexios
Version:
Fetch based HTTP client with similar API to axios for browser and Node.js
1 lines • 53.2 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../src/models/errors.ts","../../src/models/header-builder.ts","../../src/models/query-builder.ts","../../src/models/response.ts"],"sourcesContent":["import type { FexiosContext, IFexiosResponse } from '../types.js'\n\n/**\n * Error codes for Fexios\n */\nexport enum FexiosErrorCodes {\n BODY_USED = 'BODY_USED',\n NO_BODY_READER = 'NO_BODY_READER',\n TIMEOUT = 'TIMEOUT',\n NETWORK_ERROR = 'NETWORK_ERROR',\n BODY_NOT_ALLOWED = 'BODY_NOT_ALLOWED',\n HOOK_CONTEXT_CHANGED = 'HOOK_CONTEXT_CHANGED',\n ABORTED_BY_HOOK = 'ABORTED_BY_HOOK',\n INVALID_HOOK_CALLBACK = 'INVALID_HOOK_CALLBACK',\n UNEXPECTED_HOOK_RETURN = 'UNEXPECTED_HOOK_RETURN',\n UNSUPPORTED_RESPONSE_TYPE = 'UNSUPPORTED_RESPONSE_TYPE',\n BODY_TRANSFORM_ERROR = 'BODY_TRANSFORM_ERROR',\n}\n\n/**\n * Base Fexios error class\n */\nexport class FexiosError extends Error {\n name = 'FexiosError'\n constructor(\n readonly code: FexiosErrorCodes | string,\n message?: string,\n readonly context?: FexiosContext,\n options?: ErrorOptions\n ) {\n super(message, options)\n }\n static is(e: any, code?: FexiosErrorCodes): e is FexiosError {\n if (!(e instanceof FexiosError) || e instanceof FexiosResponseError) {\n return false\n }\n return code ? e.code === code : true\n }\n}\n\n/**\n * Fexios response error class for HTTP errors\n */\nexport class FexiosResponseError<T> extends FexiosError {\n name = 'FexiosResponseError'\n constructor(\n message: string,\n readonly response: IFexiosResponse<T>,\n options?: ErrorOptions\n ) {\n super(response.statusText, message, undefined, options)\n }\n static is(e: any): e is FexiosResponseError<any> {\n return e instanceof FexiosResponseError\n }\n}\n\n/**\n * Check if the error is a FexiosError that not caused by Response error\n * @deprecated Use FexiosError.is(e) instead\n */\nexport const isFexiosError = (e: any): boolean => {\n return FexiosError.is(e)\n}\n","import { isPlainObject } from '../utils/index.js'\n\n/**\n * Static utility class for building and merging HTTP Headers\n *\n * Notes:\n * - Conversions are not guaranteed to be reversible.\n * - Header names are treated case-insensitively by the `Headers` interface.\n * - Only one-level object is considered when building from a record.\n */\nexport namespace FexiosHeaderBuilder {\n /**\n * Build a Headers object from a plain record, a Map/ReadonlyMap, or an existing Headers.\n *\n * Rules:\n * - Only top-level keys are considered.\n * - Array values: append each element.\n * - Non-primitive values: use `toString()` even if it becomes \"[object Object]\".\n * - `undefined`/`null` values are ignored.\n *\n * @example\n * ```ts\n * makeHeaders({ 'x-foo': 'a', 'x-bar': ['b','c'], obj: { k: 1 } })\n * // => Headers with: x-foo: \"a\"; x-bar: \"b\" (append) \"c\"; obj: \"[object Object]\"\n * ```\n */\n export const makeHeaders = (\n input?:\n | Record<string, unknown>\n | Headers\n | Map<string, unknown>\n | ReadonlyMap<string, unknown>\n ): Headers => {\n if (!input) return new Headers()\n if (input instanceof Headers) return new Headers(input)\n\n const h = new Headers()\n\n if (input instanceof Map) {\n for (const [k, v] of input.entries()) {\n if (v == null) continue\n if (Array.isArray(v)) {\n for (const item of v) {\n if (item == null) continue\n h.append(k, String(item))\n }\n } else {\n h.append(k, String(v))\n }\n }\n return h\n }\n\n if (isPlainObject(input)) {\n for (const [k, v] of Object.entries(input)) {\n if (v == null) continue\n if (Array.isArray(v)) {\n for (const item of v) {\n if (item == null) continue\n h.append(k, String(item))\n }\n } else {\n h.append(k, String(v))\n }\n }\n return h\n }\n\n throw new TypeError(\n 'only plain object, Map/ReadonlyMap, or Headers is supported'\n )\n }\n\n /**\n * Convert Headers into a plain record of string arrays.\n *\n * Notes:\n * - Returns `Record<string, string[]>` (values are arrays).\n * - Multiple underlying header values may already be combined by the platform;\n * we do not attempt to split on commas.\n *\n * @example\n * ```ts\n * toHeaderRecord(new Headers({ 'x-foo': 'a' }))\n * // => { 'x-foo': ['a'] }\n * ```\n */\n export const toHeaderRecord = (\n input: Headers | Map<string, unknown> | ReadonlyMap<string, unknown>\n ): Record<string, string[]> => {\n // Headers → values are what the runtime provides (often joined)\n if (input instanceof Headers) {\n const out: Record<string, string[]> = {}\n input.forEach((value, key) => {\n out[key] = out[key] ? [...out[key], value] : [value]\n })\n return out\n }\n\n // Map / ReadonlyMap\n if (input instanceof Map) {\n const output: Record<string, string[]> = {}\n for (const [key, raw] of input.entries()) {\n if (raw == null) continue\n if (Array.isArray(raw)) {\n const arr = raw.filter((v) => v != null).map((v) => String(v))\n if (arr.length) output[key] = (output[key] ?? []).concat(arr)\n } else {\n const v = String(raw)\n output[key] = output[key] ? [...output[key], v] : [v]\n }\n }\n return output\n }\n\n // 其余类型统一在这里报错(集中化异常)\n throw new TypeError(\n `unsupported type transformation, got: ${Object.prototype.toString.call(\n input\n )}`\n )\n }\n\n /**\n * Merge multiple header representations into a new Headers.\n *\n * Semantics:\n * - `undefined` => no change for that key.\n * - `null` => remove the key.\n * - Array value => remove the key first, then append each element.\n * - Other value => set/overwrite the key (single value).\n *\n * Sources can be `Headers`, plain objects, or Map/ReadonlyMap; processing order is left-to-right.\n * The returned `Headers` is a fresh instance; the original is not mutated.\n *\n * @example\n * ```ts\n * // Starting from existing headers\n * const base = new Headers({ 'x-a': '1', 'x-b': '2' })\n *\n * // Object patch: overwrite x-b, append two values for x-c\n * const merged = mergeHeaders(base, { 'x-b': '3', 'x-c': ['v1','v2'] })\n *\n * // Deletion via null\n * const merged2 = mergeHeaders(merged, { 'x-a': null })\n * ```\n */\n export const mergeHeaders = (\n ...incomes: Array<\n | Record<string, unknown>\n | Headers\n | Map<string, unknown>\n | ReadonlyMap<string, unknown>\n | null\n | undefined\n >\n ): Headers => {\n const output = new Headers()\n\n const mergeOneFromObject = (patch: Record<string, unknown>) => {\n for (const [k, v] of Object.entries(patch)) {\n if (v === undefined) continue\n if (v === null) {\n output.delete(k)\n continue\n }\n if (Array.isArray(v)) {\n output.delete(k)\n for (const item of v) {\n if (item == null) continue\n output.append(k, String(item))\n }\n } else {\n output.set(k, String(v))\n }\n }\n }\n\n for (const input of incomes) {\n if (input == null) continue\n\n if (input instanceof Headers) {\n input.forEach((value, key) => {\n output.set(key, value)\n })\n continue\n }\n\n if (isPlainObject(input)) {\n mergeOneFromObject(input as unknown as Record<string, unknown>)\n continue\n }\n\n const rec = toHeaderRecord(input as any)\n for (const [key, arr] of Object.entries(rec)) {\n output.delete(key)\n for (const v of arr) output.append(key, v)\n }\n }\n\n return output\n }\n}\n","import { clone } from '../utils/clone.js'\nimport { isPlainObject } from '../utils/isPlainObject.js'\n\n/**\n * Static utility class for building URL search parameters\n *\n * @example\n * { foo: 'bar', baz: ['qux', 'quux'] } // ?foo=bar&baz=qux&baz=quux\n * @example\n * { 'foo[]': 'bar', 'baz[]': ['qux', 'quux'] } // ?foo[]=bar&baz[]=qux&baz[]=quux\n */\nexport namespace FexiosQueryBuilder {\n /**\n * Transform a plain object into a URL search params string.\n *\n * @example\n * ```\n * makeSearchParams({ str: '123' }) // str=123\n * makeSearchParams({ num: 123 }) // num=123\n * makeSearchParams({ bool: true }) // bool=true\n * makeSearchParams({ arr: [1, 2, 3] }) // arr=1&arr=2&arr=3\n * makeSearchParams({ plainObj: { a: 1, b: 2 } }) // plainObj[a]=1&plainObj[b]=2\n * makeSearchParams({ deepObj: { a: { b: { c: 3 } } } }) // deepObj[a][b][c]=3\n * makeSearchParams({ obj: <object> }) // obj=<object>.toString() (if object is not a primitive type)\n * makeSearchParams({ empty: '' }) // empty=\n * makeSearchParams({ null: null, undefined: undefined }) // (ignored)\n * ```\n */\n export const makeSearchParams = (\n params?: Record<string, any> | URLSearchParams\n ): URLSearchParams => {\n if (!params) {\n return new URLSearchParams()\n }\n if (params instanceof URLSearchParams) {\n return params\n }\n if (typeof params !== 'object' || params?.constructor !== Object) {\n throw new TypeError('only plain object is supported')\n }\n\n const sp = new URLSearchParams()\n\n const appendValue = (k: string, v: unknown) => {\n if (v === void 0 || v === null) return\n sp.append(k, v as any as string)\n }\n\n const setValue = (k: string, v: unknown) => {\n if (v === void 0 || v === null) return\n sp.set(k, v as any as string)\n }\n\n const handleNested = (prefix: string, val: any) => {\n if (val === void 0 || val === null) return\n\n // Arrays: append multiple entries with the same key\n if (Array.isArray(val)) {\n for (const item of val) appendValue(prefix, item?.toString())\n return\n }\n\n // Plain objects: walk entries and build bracketed keys\n if (typeof val === 'object' && val.constructor === Object) {\n for (const [k, v] of Object.entries(val)) {\n if (v === void 0 || v === null) continue\n\n const isBracketArrayKey = k.endsWith('[]')\n const cleanKey = isBracketArrayKey ? k.slice(0, -2) : k\n const nextPrefix = `${prefix}[${cleanKey}]`\n\n if (isBracketArrayKey) {\n // e.g. obj: { 'tags[]': ['a','b'] } => obj[tags][]=a&obj[tags][]=b\n const arrayKey = `${nextPrefix}[]`\n if (Array.isArray(v)) {\n for (const item of v) appendValue(arrayKey, item?.toString())\n } else if (\n typeof v === 'object' &&\n v !== null &&\n v.constructor === Object\n ) {\n // Rare case: nested object under [] – flatten recursively but keep [] at the end\n // This will produce keys like obj[tags][][sub]=x\n handleNested(`${nextPrefix}[]`, v)\n } else {\n appendValue(arrayKey, (v as any)?.toString())\n }\n } else {\n if (Array.isArray(v)) {\n // e.g. obj: { arr: [1,2] } => obj[arr]=1&obj[arr]=2\n for (const item of v) appendValue(nextPrefix, item?.toString())\n } else if (\n typeof v === 'object' &&\n v !== null &&\n v.constructor === Object\n ) {\n // deeper nesting\n handleNested(nextPrefix, v)\n } else {\n setValue(nextPrefix, (v as any)?.toString())\n }\n }\n }\n return\n }\n\n // Primitives and other objects (e.g., Date)\n setValue(prefix, val?.toString())\n }\n\n for (const [key, value] of Object.entries(params)) {\n handleNested(key, value)\n }\n\n return sp\n }\n\n /**\n * Build query string from a record object with proper array handling\n * @param query - The query object containing key-value pairs\n * @returns URL-encoded query string\n */\n export const makeQueryString = (query: Record<string, any>): string => {\n return makeSearchParams(query).toString()\n }\n\n /**\n * Create a URL object with the given parameters.\n *\n * @example\n * ```\n * makeURL('https://example.com?existing=1', { foo: 'bar' }, 'baz') // https://example.com?existing=1&foo=bar#baz\n */\n export const makeURL = (\n url: string | URL,\n params?: Record<string, any>,\n hash?: string,\n /** for SSR compatibility */\n base?: string | URL\n ): URL => {\n const fallbackBase =\n (typeof window !== 'undefined' && window.location?.origin) ||\n 'http://localhost'\n const u =\n typeof url === 'string'\n ? new URL(url, base ?? fallbackBase)\n : new URL(url)\n\n const existingParams = toQueryRecord(u.searchParams)\n const mergedRecord = mergeQueries(existingParams, params || {})\n const mergedParams = makeSearchParams(mergedRecord)\n u.search = mergedParams.toString()\n if (typeof hash !== 'undefined') u.hash = hash\n return u\n }\n\n /**\n * Convert URLSearchParams back to a plain object\n *\n * @note numbers/booleans or special objects (e.g. Date) are not restored, all values are strings\n *\n * @example\n * ```\n * // Basic key-value pairs\n * toQueryRecord(new URLSearchParams('foo=bar&baz=qux&number=123&bool=true'))\n * // -> { foo: 'bar', baz: 'qux', number: '123', bool: 'true' }\n *\n * // Repeated keys are converted to arrays\n * toQueryRecord(new URLSearchParams('foo=bar&foo=baz&single=value'))\n * // -> { foo: ['bar', 'baz'], single: 'value' }\n *\n * // Nested objects are reconstructed\n * toQueryRecord(new URLSearchParams('obj[foo]=bar&obj[baz]=qux&deep[dark][fantasy]=yes'))\n * // -> { obj: { foo: 'bar', baz: 'qux' }, deep: { dark: { fantasy: 'yes' } } }\n *\n * // Key with [] suffix always treated as array\n * toQueryRecord(new URLSearchParams('arr[]=only-one-value'))\n * // -> { 'arr[]': ['only-one-value'] }\n * ```\n */\n export const toQueryRecord = <T = Record<string, unknown>>(\n input:\n | string\n | URLSearchParams\n | FormData\n | Map<string, any>\n | ReadonlyMap<string, any>\n ): T => {\n if (typeof input === 'string') {\n input = fromString(input)\n }\n\n const output: any = {}\n\n const parseKey = (key: string): { path: string[]; forceArray: boolean } => {\n if (!key.includes('[')) return { path: [key], forceArray: false }\n const base = key.slice(0, key.indexOf('['))\n const parts: string[] = [base]\n const re = /\\[([^\\]]*)\\]/g\n let m: RegExpExecArray | null\n let forceArray = false\n let lastWasEmpty = false\n while ((m = re.exec(key))) {\n if (m[1] === '') {\n forceArray = true\n lastWasEmpty = true\n } else {\n parts.push(m[1])\n lastWasEmpty = false\n }\n }\n if (forceArray && lastWasEmpty) {\n parts[parts.length - 1] = parts[parts.length - 1] + '[]'\n }\n return { path: parts, forceArray }\n }\n\n const setDeep = (\n obj: any,\n path: string[],\n value: string,\n forceArray: boolean\n ) => {\n let cur = obj\n for (let i = 0; i < path.length; i++) {\n const k = path[i]\n const last = i === path.length - 1\n if (last) {\n if (forceArray) {\n if (cur[k] === undefined) cur[k] = [value]\n else if (Array.isArray(cur[k])) cur[k].push(value)\n else cur[k] = [cur[k], value]\n } else {\n if (cur[k] === undefined) cur[k] = value\n else if (Array.isArray(cur[k])) cur[k].push(value)\n else cur[k] = [cur[k], value]\n }\n } else {\n if (\n cur[k] === undefined ||\n typeof cur[k] !== 'object' ||\n Array.isArray(cur[k])\n ) {\n cur[k] = {}\n }\n cur = cur[k]\n }\n }\n }\n\n for (const [rawKey, val] of input.entries()) {\n const { path, forceArray } = parseKey(String(rawKey))\n setDeep(output, path, val?.toString(), forceArray)\n }\n\n return output as T\n }\n\n /**\n * Convert a string to a URLSearchParams object.\n * @param s - The string to convert.\n * @returns The URLSearchParams object.\n * @example\n * ```\n * fromString('?a=1&b=2') // URLSearchParams { 'a' => '1', 'b' => '2' }\n * fromString('a=1&b=2') // URLSearchParams { 'a' => '1', 'b' => '2' }\n * fromString('https://x.com/path?a=1#hash') // URLSearchParams { 'a' => '1' }\n * ```\n */\n export const fromString = (s: string): URLSearchParams => {\n const t = s.trim()\n if (!t) return new URLSearchParams()\n if (t.startsWith('?')) return new URLSearchParams(t.slice(1))\n // full URL like https://x.com/path?a=1#hash\n const qIndex = t.indexOf('?')\n if (qIndex >= 0) {\n const hashIndex = t.indexOf('#', qIndex + 1)\n const query = t.slice(qIndex + 1, hashIndex >= 0 ? hashIndex : undefined)\n return new URLSearchParams(query)\n }\n return new URLSearchParams(t)\n }\n\n /**\n * Merge multiple query representations into a single plain object.\n *\n * @note income `undefined` meaning no change, `null` meaning remove the key.\n *\n * @example\n * ```\n * mergeQueries({ a: '1' }, { b: '2' }, { c: '3' }) // { a: '1', b: '2', c: '3' }\n * mergeQueries({ a: '1', b: '2' }, { b: '3', c: '4' }) // { a: '1', b: '3', c: '4' }\n * mergeQueries({ a: '1', b: '2' }, null, { c: '3' }) // { a: '1', b: '2', c: '3' }\n * mergeQueries({ a: '1', b: '2' }, { b: null }, { c: '3' }) // { a: '1', c: '3' }\n * mergeQueries(new URLSearchParams('a=1&b=2'), { b: '3', c: '4' }) // { a: '1', b: '3', c: '4' }\n * mergeQueries({ a: '1' }, new URLSearchParams('b=2&c=3')) // { a: '1', b: '2', c: '3' }\n */\n export const mergeQueries = <T = any>(\n ...incomes: Array<\n | Record<string, any>\n | URLSearchParams\n | FormData\n | Map<string, any>\n | ReadonlyMap<string, any>\n | string\n | null\n | undefined\n >\n ): T => {\n const output: Record<string, any> = {}\n\n for (const input of incomes) {\n if (input == null) continue\n mergeOne(output, toPlain(input))\n }\n\n return output as T\n }\n\n // internal utils\n function toPlain(src: any): Record<string, any> {\n if (!src) return {}\n if (\n src instanceof URLSearchParams ||\n src instanceof FormData ||\n src instanceof Map\n )\n return toQueryRecord(src)\n if (typeof src === 'string') return toQueryRecord(fromString(src))\n if (isPlainObject(src)) return src\n throw new TypeError(\n `unsupported type transformation, got: ${Object.prototype.toString.call(\n src\n )}`\n )\n }\n\n function mergeOne(target: Record<string, any>, patch: Record<string, any>) {\n for (const [k, v] of Object.entries(patch)) {\n if (v === undefined) continue\n if (v === null) {\n delete target[k]\n continue\n }\n const cur = target[k]\n if (isPlainObject(cur) && isPlainObject(v)) {\n mergeOne(cur, v)\n } else {\n target[k] = clone(v)\n }\n }\n }\n}\n","import type {\n FexiosConfigs,\n IFexiosResponse as IFexiosResponse,\n} from '../types.js'\nimport { FexiosError, FexiosErrorCodes, FexiosResponseError } from './errors.js'\n\n/**\n * Fexios response wrapper class\n * @param data Transformed response body\n * @param responseType Guessed response type\n */\nexport class FexiosResponse<T = unknown> implements IFexiosResponse<T> {\n constructor(\n readonly rawResponse: IFexiosResponse['rawResponse'],\n readonly data: T,\n readonly responseType: IFexiosResponse['responseType']\n ) {\n ;['ok', 'status', 'statusText', 'headers', 'url', 'redirected'].forEach(\n (key) => {\n Reflect.defineProperty(this, key, {\n get: () => (rawResponse as any)[key],\n })\n }\n )\n }\n readonly ok!: boolean\n readonly status!: number\n readonly statusText!: string\n readonly headers!: Headers\n readonly url!: string\n readonly redirected!: boolean\n}\n\nconst concatUint8Arrays = (parts: Uint8Array[]) => {\n const total = parts.reduce((n, p) => n + p.length, 0)\n const out = new Uint8Array(total)\n let off = 0\n for (const p of parts) {\n out.set(p, off)\n off += p.length\n }\n return out\n}\n\nasync function readBody(\n stream: ReadableStream<Uint8Array>,\n contentLength: number,\n onProgress?: (p: number, buf: Uint8Array) => void\n) {\n const reader = stream.getReader()\n if (!reader) {\n throw new FexiosError(\n FexiosErrorCodes.NO_BODY_READER,\n 'Failed to get ReadableStream from response body'\n )\n }\n\n const chunks: Uint8Array[] = []\n let received = 0\n\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n chunks.push(value)\n received += value.length\n if (onProgress && contentLength > 0)\n onProgress(received / contentLength, concatUint8Arrays(chunks))\n }\n } finally {\n reader.releaseLock?.()\n }\n\n const data = concatUint8Arrays(chunks)\n onProgress?.(1, data)\n return data\n}\n\nconst guessFexiosResponseType = (\n contentType: string\n): IFexiosResponse['responseType'] => {\n if (!contentType) return undefined\n if (contentType.includes('application/json') || contentType.endsWith('+json'))\n return 'json'\n if (contentType.startsWith('text/')) return 'text'\n if (\n contentType.includes('multipart/form-data') ||\n contentType.includes('application/x-www-form-urlencoded')\n )\n return 'form'\n if (\n /^image\\//.test(contentType) ||\n /^video\\//.test(contentType) ||\n /^audio\\//.test(contentType) ||\n contentType.includes('application/pdf')\n )\n return 'blob'\n if (\n contentType.includes('application/octet-stream') ||\n contentType.includes('application/zip') ||\n contentType.includes('application/x-tar') ||\n contentType.includes('application/x-7z-compressed') ||\n contentType.includes('application/x-gzip')\n )\n return 'arrayBuffer'\n return undefined\n}\n\n/**\n * Resolve response body based on content type and expected type\n * @param expectedType `undefined` means auto-detect based on content-type header. And also try JSON.stringify if it's a string.\n */\nexport async function createFexiosResponse<T = any>(\n rawResponse: Response,\n expectedType?: FexiosConfigs['responseType'],\n onProgress?: (progress: number, buffer?: Uint8Array) => void,\n shouldThrow?: (response: FexiosResponse<any>) => boolean | void,\n timeout?: number\n): Promise<FexiosResponse<T>> {\n /**\n * IMPORTANT:\n * - We want to expose the original `rawResponse` to user as an unread Response.\n * - But Fexios still needs to decode body to produce `data`.\n * So we read from a clone and keep the original response unconsumed.\n */\n const decodeResponse = rawResponse.clone()\n const contentType =\n rawResponse.headers.get('content-type')?.toLowerCase() ?? ''\n const lenHeader = rawResponse.headers.get('content-length')\n const total = lenHeader ? Number(lenHeader) : 0\n\n // Check for upgrade headers for websocket/stream\n const upgrade = rawResponse.headers.get('upgrade')?.toLowerCase()\n const connection = rawResponse.headers.get('connection')?.toLowerCase()\n\n let resolvedType: IFexiosResponse['responseType'] =\n expectedType ?? guessFexiosResponseType(contentType) ?? 'text'\n\n // Auto-detect websocket/stream from headers if not explicitly set\n if (!expectedType) {\n if (upgrade === 'websocket' && connection === 'upgrade') {\n resolvedType = 'ws'\n } else if (contentType.includes('text/event-stream')) {\n resolvedType = 'stream'\n }\n }\n\n // special-cases that don't need body decoding\n if (resolvedType === 'stream') {\n const url = rawResponse.url || (rawResponse as any).url || ''\n const response = await createFexiosEventSourceResponse(\n url,\n rawResponse,\n timeout\n )\n const decide = shouldThrow?.(response)\n if (typeof decide === 'boolean' ? decide : !response.ok) {\n throw new FexiosResponseError(response.statusText, response)\n }\n return response as FexiosResponse<T>\n }\n if (resolvedType === 'ws') {\n // fetch 不产生 WebSocket;这里只返回占位,交由上层处理\n const url = rawResponse.url || (rawResponse as any).url || ''\n const response = await createFexiosWebSocketResponse(\n url,\n rawResponse,\n timeout\n )\n const decide = shouldThrow?.(response)\n if (typeof decide === 'boolean' ? decide : !response.ok) {\n throw new FexiosResponseError(response.statusText, response)\n }\n return response as FexiosResponse<T>\n }\n\n // decode helpers\n const charset = /\\bcharset=([^;]+)/i.exec(contentType)?.[1]?.trim() || 'utf-8'\n const decoder = new TextDecoder(charset)\n\n let data: any\n\n try {\n if (resolvedType === 'form') {\n // Resolve form data by fetch itself (no progress support)\n data = await decodeResponse.formData()\n } else {\n const bytes = await readBody(decodeResponse.body!, total, onProgress)\n if (resolvedType === 'arrayBuffer') {\n data = bytes.buffer.slice(\n bytes.byteOffset,\n bytes.byteOffset + bytes.byteLength\n )\n } else if (resolvedType === 'blob') {\n data = new Blob([bytes], {\n type: contentType || 'application/octet-stream',\n })\n } else if (resolvedType === 'text') {\n const text = decoder.decode(bytes)\n // auto-detect: if no explicit expected type and text looks like JSON, try to parse as JSON\n if (!expectedType) {\n const trimmed = text.trim()\n if (\n (trimmed.startsWith('{') && trimmed.endsWith('}')) ||\n (trimmed.startsWith('[') && trimmed.endsWith(']'))\n ) {\n try {\n data = JSON.parse(trimmed)\n resolvedType = 'json'\n } catch {\n data = text\n }\n } else {\n data = text\n }\n } else {\n data = text\n }\n } else if (resolvedType === 'json') {\n const text = decoder.decode(bytes)\n data = text.length ? JSON.parse(text) : null\n } else {\n // theoretically should not reach here, unless user provides a expectedType out of scope\n data = bytes\n }\n }\n } catch (e) {\n // if parsing fails, try to read as plain text as last resort\n if (!(e instanceof Error)) throw e\n try {\n const t = await decodeResponse.text()\n data = t\n resolvedType = 'text'\n } catch {\n // if reading as plain text fails, throw the original error\n throw new FexiosError(\n FexiosErrorCodes.BODY_TRANSFORM_ERROR,\n `Failed to transform response body to ${resolvedType}`,\n undefined,\n { cause: e }\n )\n }\n }\n\n const response = new FexiosResponse<T>(\n rawResponse as any,\n data as T,\n resolvedType\n )\n\n const decision = shouldThrow?.(response)\n if (typeof decision === 'boolean' ? decision : !response.ok) {\n throw new FexiosResponseError(response.statusText, response)\n }\n\n return response\n}\n\nexport async function createFexiosWebSocketResponse(\n url: string | URL,\n response?: Response,\n timeout?: number\n) {\n const ws = new WebSocket(url.toString())\n const delay = timeout ?? 60000 // Default 60s timeout\n await new Promise<void>((resolve, reject) => {\n const timer =\n delay > 0\n ? setTimeout(() => {\n ws.close()\n reject(\n new FexiosError(\n FexiosErrorCodes.TIMEOUT,\n `WebSocket connection timed out after ${delay}ms`\n )\n )\n }, delay)\n : undefined\n\n let settled = false\n\n const cleanup = () => {\n clearTimeout(timer)\n ws.removeEventListener('open', onOpen)\n ws.removeEventListener('error', onError)\n ws.removeEventListener('close', onClose)\n }\n\n const onOpen = () => {\n if (!settled) {\n settled = true\n cleanup()\n resolve()\n }\n }\n\n const onError = (event: Event) => {\n if (!settled) {\n settled = true\n cleanup()\n reject(\n new FexiosError(\n FexiosErrorCodes.NETWORK_ERROR,\n `WebSocket connection failed`,\n undefined,\n { cause: event }\n )\n )\n }\n }\n\n const onClose = (event: CloseEvent) => {\n if (!settled) {\n settled = true\n cleanup()\n reject(\n new FexiosError(\n FexiosErrorCodes.NETWORK_ERROR,\n `WebSocket connection closed unexpectedly (code: ${event.code}, reason: ${event.reason})`,\n undefined,\n { cause: event }\n )\n )\n }\n }\n\n ws.addEventListener('open', onOpen)\n ws.addEventListener('error', onError)\n ws.addEventListener('close', onClose)\n })\n return new FexiosResponse<WebSocket>(response || new Response(null), ws, 'ws')\n}\n\nexport async function createFexiosEventSourceResponse(\n url: string | URL,\n response?: Response,\n timeout?: number\n) {\n const es = new EventSource(url.toString())\n const delay = timeout ?? 60000 // Default 60s timeout\n await new Promise<void>((resolve, reject) => {\n const timer =\n delay > 0\n ? setTimeout(() => {\n es.close()\n reject(\n new FexiosError(\n FexiosErrorCodes.TIMEOUT,\n `EventSource connection timed out after ${delay}ms`\n )\n )\n }, delay)\n : undefined\n\n let settled = false\n\n const cleanup = () => {\n clearTimeout(timer)\n es.removeEventListener('open', onOpen)\n es.removeEventListener('error', onError)\n }\n\n const onOpen = () => {\n if (!settled) {\n settled = true\n cleanup()\n resolve()\n }\n }\n\n const onError = (event: Event) => {\n if (!settled) {\n settled = true\n cleanup()\n reject(\n new FexiosError(\n FexiosErrorCodes.NETWORK_ERROR,\n `EventSource connection failed`,\n undefined,\n { cause: event }\n )\n )\n }\n }\n\n es.addEventListener('open', onOpen)\n es.addEventListener('error', onError)\n })\n return new FexiosResponse<EventSource>(\n response || new Response(null),\n es,\n 'stream'\n )\n}\n"],"names":["FexiosErrorCodes","FexiosHeaderBuilder","isPlainObject","FexiosQueryBuilder","clone","response"],"mappings":"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