wreq-js 2.1.1 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/wreq-js.cjs +619 -57
- package/dist/wreq-js.cjs.map +1 -1
- package/dist/wreq-js.d.cts +128 -4
- package/dist/wreq-js.d.ts +128 -4
- package/dist/wreq-js.js +619 -57
- package/dist/wreq-js.js.map +1 -1
- package/package.json +5 -5
- package/rust/wreq-js.darwin-arm64.node +0 -0
- package/rust/wreq-js.darwin-x64.node +0 -0
- package/rust/wreq-js.linux-arm64-gnu.node +0 -0
- package/rust/wreq-js.linux-x64-gnu.node +0 -0
- package/rust/wreq-js.linux-x64-musl.node +0 -0
- package/rust/wreq-js.win32-x64-msvc.node +0 -0
package/dist/wreq-js.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/wreq-js.ts","../src/types.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { STATUS_CODES } from \"node:http\";\nimport { createRequire } from \"node:module\";\nimport { Readable } from \"node:stream\";\nimport { ReadableStream } from \"node:stream/web\";\nimport type {\n BodyInit,\n BrowserProfile,\n CookieMode,\n CreateSessionOptions,\n CreateTransportOptions,\n EmulationOS,\n HeadersInit,\n HeaderTuple,\n LegacySessionWebSocketOptions,\n LegacyWebSocketOptions,\n NativeResponse,\n NativeWebSocketConnection,\n RequestOptions,\n SessionHandle,\n SessionWebSocketOptions,\n WebSocketBinaryType,\n WebSocketCloseEvent,\n WebSocketErrorEvent,\n WebSocketMessageEvent,\n WebSocketOpenEvent,\n WebSocketOptions,\n RequestInit as WreqRequestInit,\n} from \"./types.js\";\nimport { RequestError } from \"./types.js\";\n\ninterface NativeWebSocketCloseEvent {\n code: number;\n reason: string;\n}\n\ninterface NativeWebSocketCloseOptions {\n code?: number;\n reason?: string;\n}\n\ninterface NativeWebSocketOptions {\n url: string;\n browser: BrowserProfile;\n os: EmulationOS;\n headers: HeaderTuple[];\n protocols?: string[];\n proxy?: string;\n onMessage: (data: string | Buffer) => void;\n onClose?: (event: NativeWebSocketCloseEvent) => void;\n onError?: (error: string) => void;\n}\n\ninterface NativeWebSocketSessionOptions {\n url: string;\n sessionId: string;\n transportId: string;\n headers: HeaderTuple[];\n protocols?: string[];\n onMessage: (data: string | Buffer) => void;\n onClose?: (event: NativeWebSocketCloseEvent) => void;\n onError?: (error: string) => void;\n}\n\ninterface NativeSessionOptions {\n sessionId: string;\n}\n\ninterface NativeTransportOptions {\n browser: BrowserProfile;\n os: EmulationOS;\n proxy?: string;\n insecure?: boolean;\n poolIdleTimeout?: number;\n poolMaxIdlePerHost?: number;\n poolMaxSize?: number;\n connectTimeout?: number;\n readTimeout?: number;\n}\n\ninterface NativeRequestOptions {\n url: string;\n method: string;\n browser?: BrowserProfile;\n os?: EmulationOS;\n headers?: HeaderTuple[];\n body?: Buffer;\n proxy?: string;\n timeout?: number;\n redirect?: \"follow\" | \"manual\" | \"error\";\n sessionId: string;\n ephemeral: boolean;\n disableDefaultHeaders?: boolean;\n insecure?: boolean;\n transportId?: string;\n compress?: boolean;\n}\n\nlet nativeBinding: {\n request: (options: NativeRequestOptions, requestId: number, enableCancellation?: boolean) => Promise<NativeResponse>;\n cancelRequest: (requestId: number) => void;\n readBodyChunk: (handleId: number) => Promise<Buffer | null>;\n readBodyAll: (handleId: number) => Promise<Buffer>;\n cancelBody: (handleId: number) => void;\n getProfiles: () => string[];\n websocketConnect: (options: NativeWebSocketOptions) => Promise<NativeWebSocketConnection>;\n websocketConnectSession: (options: NativeWebSocketSessionOptions) => Promise<NativeWebSocketConnection>;\n websocketSend: (ws: NativeWebSocketConnection, data: string | Buffer) => Promise<void>;\n websocketClose: (ws: NativeWebSocketConnection, options?: NativeWebSocketCloseOptions) => Promise<void>;\n createSession: (options: NativeSessionOptions) => string;\n clearSession: (sessionId: string) => void;\n dropSession: (sessionId: string) => void;\n getCookies: (sessionId: string, url: string) => Record<string, string>;\n setCookie: (sessionId: string, name: string, value: string, url: string) => void;\n createTransport: (options: NativeTransportOptions) => string;\n dropTransport: (transportId: string) => void;\n getOperatingSystems?: () => string[];\n};\n\nlet cachedProfiles: BrowserProfile[] | undefined;\nlet cachedProfileSet: Set<string> | undefined;\nlet cachedOperatingSystems: EmulationOS[] | undefined;\nlet cachedOperatingSystemSet: Set<string> | undefined;\n\nfunction detectLibc(): \"gnu\" | \"musl\" | undefined {\n if (process.platform !== \"linux\") {\n return undefined;\n }\n\n const envLibc = process.env.LIBC ?? process.env.npm_config_libc;\n if (envLibc) {\n return envLibc.toLowerCase().includes(\"musl\") ? \"musl\" : \"gnu\";\n }\n\n try {\n const report = process.report?.getReport?.() as { header?: { glibcVersionRuntime?: string } } | undefined;\n const glibcVersion = report?.header?.glibcVersionRuntime;\n\n if (glibcVersion) {\n return \"gnu\";\n }\n\n return \"musl\";\n } catch {\n return \"gnu\";\n }\n}\n\nconst require =\n typeof import.meta !== \"undefined\" && import.meta.url ? createRequire(import.meta.url) : createRequire(__filename);\n\nfunction loadNativeBinding() {\n const platform = process.platform;\n const arch = process.arch;\n const libc = detectLibc();\n\n const platformArchMap: Record<string, Record<string, string | Record<\"gnu\" | \"musl\", string>>> = {\n darwin: { x64: \"darwin-x64\", arm64: \"darwin-arm64\" },\n linux: {\n x64: { gnu: \"linux-x64-gnu\", musl: \"linux-x64-musl\" },\n arm64: \"linux-arm64-gnu\",\n },\n win32: { x64: \"win32-x64-msvc\" },\n };\n\n const platformArchMapEntry = platformArchMap[platform]?.[arch];\n const platformArch =\n typeof platformArchMapEntry === \"string\"\n ? platformArchMapEntry\n : platformArchMapEntry?.[(libc ?? \"gnu\") as \"gnu\" | \"musl\"];\n\n if (!platformArch) {\n throw new Error(\n `Unsupported platform: ${platform}-${arch}${libc ? `-${libc}` : \"\"}. ` +\n `Supported platforms: darwin-x64, darwin-arm64, linux-x64-gnu, linux-x64-musl, ` +\n `linux-arm64-gnu, win32-x64-msvc`,\n );\n }\n\n const binaryName = `wreq-js.${platformArch}.node`;\n\n try {\n return require(`../rust/${binaryName}`);\n } catch {\n try {\n return require(\"../rust/wreq-js.node\");\n } catch {\n throw new Error(\n `Failed to load native module for ${platform}-${arch}. ` +\n `Tried: ../rust/${binaryName} and ../rust/wreq-js.node. ` +\n `Make sure the package is installed correctly and the native module is built for your platform.`,\n );\n }\n }\n}\n\nnativeBinding = loadNativeBinding();\n\nconst websocketFinalizer =\n typeof FinalizationRegistry === \"function\"\n ? new FinalizationRegistry<NativeWebSocketConnection>((connection: NativeWebSocketConnection) => {\n void nativeBinding.websocketClose(connection).catch(() => undefined);\n })\n : undefined;\n\ntype NativeBodyHandle = { id: number; released: boolean };\n\nconst bodyHandleFinalizer =\n typeof FinalizationRegistry === \"function\"\n ? new FinalizationRegistry<NativeBodyHandle>((handle: NativeBodyHandle) => {\n if (handle.released) {\n return;\n }\n\n handle.released = true;\n try {\n nativeBinding.cancelBody(handle.id);\n } catch {\n // Best-effort cleanup; ignore binding-level failures.\n }\n })\n : undefined;\n\nconst DEFAULT_BROWSER: BrowserProfile = \"chrome_142\";\nconst DEFAULT_OS: EmulationOS = \"macos\";\nconst DEFAULT_REQUEST_TIMEOUT_MS = 300_000;\nconst SUPPORTED_OSES: readonly EmulationOS[] = [\"windows\", \"macos\", \"linux\", \"android\", \"ios\"];\nconst UTF8_DECODER = new TextDecoder(\"utf-8\");\n\ntype SessionDefaults = {\n browser: BrowserProfile;\n os: EmulationOS;\n proxy?: string;\n timeout?: number;\n insecure?: boolean;\n defaultHeaders?: HeaderTuple[];\n transportId?: string;\n ownsTransport?: boolean;\n};\n\ntype SessionResolution = {\n sessionId: string;\n cookieMode: CookieMode;\n dropAfterRequest: boolean;\n defaults?: SessionDefaults;\n};\n\ntype TransportResolution = {\n transportId?: string;\n browser?: BrowserProfile;\n os?: EmulationOS;\n proxy?: string;\n insecure?: boolean;\n};\n\ntype LegacyWebSocketCallbacks = {\n onMessage?: (data: string | Buffer) => void;\n onClose?: (event: WebSocketCloseEvent) => void;\n onError?: (error: string) => void;\n};\n\ntype WebSocketOpenDispatchMode = \"automatic\" | \"deferred\";\n\ntype InternalWebSocketInit = {\n readonly _internal: true;\n url: string;\n options: WebSocketOptions;\n openDispatchMode: WebSocketOpenDispatchMode;\n connect: (callbacks: {\n onMessage: (data: string | Buffer) => void;\n onClose: (event: NativeWebSocketCloseEvent) => void;\n onError: (message: string) => void;\n }) => Promise<NativeWebSocketConnection>;\n legacyCallbacks: LegacyWebSocketCallbacks | undefined;\n};\n\n// Persistent sessions need globally-unique IDs; ephemeral ones only need a\n// placeholder that is never looked up again, so a cheap monotonic counter suffices.\nlet ephemeralIdCounter = 0;\nfunction generateEphemeralSessionId(): string {\n return `_e${++ephemeralIdCounter}`;\n}\n\nfunction generateSessionId(): string {\n return randomUUID();\n}\n\nfunction normalizeSessionOptions(options?: CreateSessionOptions): { sessionId: string; defaults: SessionDefaults } {\n const sessionId = options?.sessionId ?? generateSessionId();\n const defaults: SessionDefaults = {\n browser: options?.browser ?? DEFAULT_BROWSER,\n os: options?.os ?? DEFAULT_OS,\n };\n\n if (options?.proxy !== undefined) {\n defaults.proxy = options.proxy;\n }\n\n if (options?.timeout !== undefined) {\n validateTimeout(options.timeout);\n defaults.timeout = options.timeout;\n }\n\n if (options?.insecure !== undefined) {\n defaults.insecure = options.insecure;\n }\n\n if (options?.defaultHeaders !== undefined) {\n defaults.defaultHeaders = headersToTuples(options.defaultHeaders);\n }\n\n return { sessionId, defaults };\n}\n\ntype HeaderStoreEntry = {\n name: string;\n values: string[];\n};\n\nfunction isIterable<T>(value: unknown): value is Iterable<T> {\n return Boolean(value) && typeof (value as Iterable<T>)[Symbol.iterator] === \"function\";\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction coerceHeaderValue(value: unknown): string {\n return String(value);\n}\n\nexport class Headers implements Iterable<[string, string]> {\n private readonly store = new Map<string, HeaderStoreEntry>();\n\n constructor(init?: HeadersInit) {\n if (init) {\n this.applyInit(init);\n }\n }\n\n private applyInit(init: HeadersInit) {\n if (init instanceof Headers) {\n for (const [name, value] of init) {\n this.append(name, value);\n }\n return;\n }\n\n if (Array.isArray(init) || isIterable<[string, string]>(init)) {\n for (const tuple of init as Iterable<[string, string]>) {\n if (!tuple) {\n continue;\n }\n const [name, value] = tuple;\n this.append(name, value);\n }\n return;\n }\n\n if (isPlainObject(init)) {\n for (const [name, value] of Object.entries(init)) {\n if (value === undefined || value === null) {\n continue;\n }\n this.set(name, coerceHeaderValue(value));\n }\n }\n }\n\n private normalizeName(name: string): { key: string; display: string } {\n if (typeof name !== \"string\") {\n throw new TypeError(\"Header name must be a string\");\n }\n const trimmed = name.trim();\n if (!trimmed) {\n throw new TypeError(\"Header name must not be empty\");\n }\n return { key: trimmed.toLowerCase(), display: trimmed };\n }\n\n private assertValue(value: unknown): string {\n if (value === undefined || value === null) {\n throw new TypeError(\"Header value must not be null or undefined\");\n }\n\n return coerceHeaderValue(value);\n }\n\n append(name: string, value: unknown): void {\n const normalized = this.normalizeName(name);\n const existing = this.store.get(normalized.key);\n const coercedValue = this.assertValue(value);\n\n if (existing) {\n existing.values.push(coercedValue);\n return;\n }\n\n this.store.set(normalized.key, {\n name: normalized.display,\n values: [coercedValue],\n });\n }\n\n set(name: string, value: unknown): void {\n const normalized = this.normalizeName(name);\n const coercedValue = this.assertValue(value);\n\n this.store.set(normalized.key, {\n name: normalized.display,\n values: [coercedValue],\n });\n }\n\n get(name: string): string | null {\n const normalized = this.normalizeName(name);\n const entry = this.store.get(normalized.key);\n return entry ? entry.values.join(\", \") : null;\n }\n\n has(name: string): boolean {\n const normalized = this.normalizeName(name);\n return this.store.has(normalized.key);\n }\n\n delete(name: string): void {\n const normalized = this.normalizeName(name);\n this.store.delete(normalized.key);\n }\n\n entries(): IterableIterator<[string, string]> {\n return this[Symbol.iterator]();\n }\n\n *keys(): IterableIterator<string> {\n for (const [name] of this) {\n yield name;\n }\n }\n\n *values(): IterableIterator<string> {\n for (const [, value] of this) {\n yield value;\n }\n }\n\n forEach(callback: (value: string, name: string, parent: Headers) => void, thisArg?: unknown): void {\n for (const [name, value] of this) {\n callback.call(thisArg, value, name, this);\n }\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n const generator = function* (store: Map<string, HeaderStoreEntry>) {\n for (const entry of store.values()) {\n yield [entry.name, entry.values.join(\", \")] as [string, string];\n }\n };\n\n return generator(this.store);\n }\n\n toObject(): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [name, value] of this) {\n result[name] = value;\n }\n\n return result;\n }\n\n toTuples(): HeaderTuple[] {\n const result: HeaderTuple[] = [];\n\n for (const [name, value] of this) {\n result.push([name, value]);\n }\n\n return result;\n }\n}\n\nfunction headersToTuples(init: HeadersInit): HeaderTuple[] {\n return new Headers(init).toTuples();\n}\n\nfunction hasHeaderName(tuples: HeaderTuple[] | undefined, name: string): boolean {\n if (!tuples) {\n return false;\n }\n\n const target = name.toLowerCase();\n for (const [headerName] of tuples) {\n if (headerName.toLowerCase() === target) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction hasWebSocketProtocolHeader(headers: HeadersInit | undefined): boolean {\n const protocolHeaderName = \"Sec-WebSocket-Protocol\";\n if (!headers) {\n return false;\n }\n\n return hasHeaderName(headersToTuples(headers), protocolHeaderName);\n}\n\nfunction assertNoManualWebSocketProtocolHeader(headers: HeadersInit | undefined): void {\n if (hasWebSocketProtocolHeader(headers)) {\n throw new RequestError(\"Do not set `Sec-WebSocket-Protocol` header manually; use the `protocols` option instead.\");\n }\n}\n\nfunction normalizeWebSocketProtocolList(protocols?: string | string[]): string[] | undefined {\n if (protocols === undefined) {\n return undefined;\n }\n\n return typeof protocols === \"string\" ? [protocols] : [...protocols];\n}\n\nfunction mergeHeaderTuples(\n defaults: HeaderTuple[] | undefined,\n overrides: HeadersInit | undefined,\n): HeaderTuple[] | undefined {\n if (!defaults) {\n return overrides === undefined ? undefined : headersToTuples(overrides);\n }\n\n if (overrides === undefined) {\n return defaults;\n }\n\n const overrideTuples = headersToTuples(overrides);\n if (overrideTuples.length === 0) {\n return defaults;\n }\n\n const overrideKeys = new Set<string>();\n for (const tuple of overrideTuples) {\n overrideKeys.add(tuple[0].toLowerCase());\n }\n const merged: HeaderTuple[] = [];\n for (const tuple of defaults) {\n if (!overrideKeys.has(tuple[0].toLowerCase())) {\n merged.push(tuple);\n }\n }\n for (const tuple of overrideTuples) {\n merged.push(tuple);\n }\n return merged;\n}\n\ntype ResponseType = \"basic\" | \"cors\" | \"error\" | \"opaque\" | \"opaqueredirect\";\n\nfunction cloneNativeResponse(payload: NativeResponse): NativeResponse {\n return {\n status: payload.status,\n headers: payload.headers.map(([name, value]): HeaderTuple => [name, value]),\n bodyHandle: payload.bodyHandle,\n bodyBytes: payload.bodyBytes,\n contentLength: payload.contentLength,\n cookies: payload.cookies.map(([name, value]): HeaderTuple => [name, value]),\n url: payload.url,\n };\n}\n\nfunction releaseNativeBody(handle: NativeBodyHandle): void {\n if (handle.released) {\n return;\n }\n\n handle.released = true;\n\n try {\n nativeBinding.cancelBody(handle.id);\n } catch {\n // Best-effort cleanup; ignore binding errors.\n }\n\n bodyHandleFinalizer?.unregister(handle);\n}\n\nfunction markNativeBodyReleased(handle: NativeBodyHandle): void {\n if (handle.released) {\n return;\n }\n\n handle.released = true;\n bodyHandleFinalizer?.unregister(handle);\n}\n\nfunction createNativeBodyStream(handle: NativeBodyHandle): ReadableStream<Uint8Array> {\n const stream = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const chunk = await nativeBinding.readBodyChunk(handle.id);\n\n if (chunk === null) {\n releaseNativeBody(handle);\n controller.close();\n return;\n }\n\n controller.enqueue(chunk);\n } catch (error) {\n releaseNativeBody(handle);\n controller.error(error);\n }\n },\n cancel() {\n releaseNativeBody(handle);\n },\n });\n\n bodyHandleFinalizer?.register(stream, handle, handle);\n\n return stream;\n}\n\nfunction wrapBodyStream(source: ReadableStream<Uint8Array>, onFirstUse: () => void): ReadableStream<Uint8Array> {\n let started = false;\n let reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n if (!started) {\n started = true;\n onFirstUse();\n }\n\n if (!reader) {\n reader = source.getReader();\n }\n\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n return;\n }\n\n controller.enqueue(value);\n } catch (error) {\n controller.error(error);\n }\n },\n cancel(reason) {\n if (!reader) {\n return source.cancel(reason);\n }\n return reader.cancel(reason);\n },\n });\n}\n\nexport class Response {\n readonly status: number;\n readonly ok: boolean;\n readonly contentLength: number | null;\n readonly url: string;\n readonly type: ResponseType = \"basic\";\n bodyUsed = false;\n\n private readonly payload: NativeResponse;\n private readonly requestUrl: string;\n private redirectedMemo: boolean | undefined;\n private readonly headersInit: HeaderTuple[];\n private headersInstance: Headers | null;\n private readonly cookiesInit: HeaderTuple[];\n private cookiesRecord: Record<string, string | string[]> | null;\n private inlineBody: Buffer | null;\n private bodySource: ReadableStream<Uint8Array> | null;\n private bodyStream: ReadableStream<Uint8Array> | null | undefined;\n // Track if we can use the fast path (native handle not yet wrapped in a stream)\n private nativeHandleAvailable: boolean;\n private nativeHandle: NativeBodyHandle | null;\n\n constructor(payload: NativeResponse, requestUrl: string, bodySource?: ReadableStream<Uint8Array> | null) {\n this.payload = payload;\n this.requestUrl = requestUrl;\n this.status = this.payload.status;\n this.ok = this.status >= 200 && this.status < 300;\n this.headersInit = this.payload.headers;\n this.headersInstance = null;\n this.url = this.payload.url;\n this.cookiesInit = this.payload.cookies;\n this.cookiesRecord = null;\n this.contentLength = this.payload.contentLength ?? null;\n this.inlineBody = this.payload.bodyBytes ?? null;\n this.nativeHandle = null;\n\n if (typeof bodySource !== \"undefined\") {\n // External stream provided (e.g., from clone) - no fast path\n this.bodySource = bodySource;\n this.nativeHandleAvailable = false;\n } else if (this.inlineBody !== null) {\n // Inline body provided by native layer\n this.bodySource = null;\n this.nativeHandleAvailable = false;\n } else if (this.payload.bodyHandle !== null) {\n // Defer stream creation - we might use fast path instead\n this.bodySource = null;\n this.nativeHandleAvailable = true;\n this.nativeHandle = { id: this.payload.bodyHandle, released: false };\n bodyHandleFinalizer?.register(this, this.nativeHandle, this.nativeHandle);\n } else {\n this.bodySource = null;\n this.nativeHandleAvailable = false;\n }\n\n this.bodyStream = undefined;\n }\n\n get redirected(): boolean {\n if (this.redirectedMemo !== undefined) {\n return this.redirectedMemo;\n }\n\n if (this.url === this.requestUrl) {\n this.redirectedMemo = false;\n return false;\n }\n\n const normalizedRequestUrl = normalizeUrlForComparison(this.requestUrl);\n this.redirectedMemo = normalizedRequestUrl ? this.url !== normalizedRequestUrl : true;\n return this.redirectedMemo;\n }\n\n get statusText(): string {\n return STATUS_CODES[this.status] ?? \"\";\n }\n\n get headers(): Headers {\n if (!this.headersInstance) {\n this.headersInstance = new Headers(this.headersInit);\n }\n return this.headersInstance;\n }\n\n get cookies(): Record<string, string | string[]> {\n if (!this.cookiesRecord) {\n const record: Record<string, string | string[]> = Object.create(null);\n for (const [name, value] of this.cookiesInit) {\n const existing = record[name];\n if (existing === undefined) {\n record[name] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n record[name] = [existing, value];\n }\n }\n this.cookiesRecord = record;\n }\n\n return this.cookiesRecord;\n }\n\n get body(): ReadableStream<Uint8Array> | null {\n if (this.inlineBody && this.bodySource === null) {\n const bytes = this.inlineBody;\n this.inlineBody = null;\n this.bodySource = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n }\n\n if (this.inlineBody === null && this.payload.bodyHandle === null && this.bodySource === null) {\n return null;\n }\n\n // Lazily create the stream if needed (disables fast path)\n if (this.bodySource === null && this.nativeHandleAvailable && this.payload.bodyHandle !== null) {\n if (this.nativeHandle) {\n bodyHandleFinalizer?.unregister(this.nativeHandle);\n }\n const handle = this.nativeHandle ?? { id: this.payload.bodyHandle, released: false };\n this.nativeHandle = handle;\n this.bodySource = createNativeBodyStream(handle);\n this.nativeHandleAvailable = false;\n }\n\n if (this.bodySource === null) {\n return null;\n }\n\n if (this.bodyStream === undefined) {\n this.bodyStream = wrapBodyStream(this.bodySource, () => {\n this.bodyUsed = true;\n });\n }\n\n return this.bodyStream;\n }\n\n async json<T = unknown>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text) as T;\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n const bytes = await this.consumeBody();\n const { buffer, byteOffset, byteLength } = bytes;\n\n if (buffer instanceof ArrayBuffer) {\n // Zero-copy when the Buffer owns the entire ArrayBuffer.\n if (byteOffset === 0 && byteLength === buffer.byteLength) {\n return buffer;\n }\n return buffer.slice(byteOffset, byteOffset + byteLength);\n }\n\n const view = new Uint8Array(byteLength);\n view.set(bytes);\n return view.buffer;\n }\n\n async text(): Promise<string> {\n const bytes = await this.consumeBody();\n return UTF8_DECODER.decode(bytes);\n }\n\n async blob(): Promise<Blob> {\n const bytes = await this.consumeBody();\n const contentType = this.headers.get(\"content-type\") ?? \"\";\n return new Blob([bytes], contentType ? { type: contentType } : undefined);\n }\n\n async formData(): Promise<FormData> {\n const bytes = await this.consumeBody();\n const contentType = this.headers.get(\"content-type\");\n const response = new globalThis.Response(\n bytes,\n contentType ? { headers: { \"content-type\": contentType } } : undefined,\n );\n return response.formData();\n }\n\n readable(): Readable {\n this.assertBodyAvailable();\n this.bodyUsed = true;\n\n const stream = this.body;\n\n if (stream === null) {\n return Readable.from([]);\n }\n\n return Readable.fromWeb(stream as ReadableStream);\n }\n\n clone(): Response {\n if (this.bodyUsed) {\n throw new TypeError(\"Cannot clone a Response whose body is already used\");\n }\n\n // If we still have the native handle (fast path), we need to create the stream first\n if (this.nativeHandleAvailable && this.payload.bodyHandle !== null) {\n if (this.nativeHandle) {\n bodyHandleFinalizer?.unregister(this.nativeHandle);\n }\n const handle = this.nativeHandle ?? { id: this.payload.bodyHandle, released: false };\n this.nativeHandle = handle;\n this.bodySource = createNativeBodyStream(handle);\n this.nativeHandleAvailable = false;\n }\n\n if (this.bodySource === null) {\n return new Response(cloneNativeResponse(this.payload), this.requestUrl, null);\n }\n\n const [branchA, branchB] = this.bodySource.tee();\n\n // Reset cached stream so the original response uses the new branch lazily.\n this.bodySource = branchA;\n this.bodyStream = undefined;\n\n return new Response(cloneNativeResponse(this.payload), this.requestUrl, branchB);\n }\n\n private assertBodyAvailable(): void {\n if (this.bodyUsed) {\n throw new TypeError(\"Response body is already used\");\n }\n }\n\n private async consumeBody(): Promise<Buffer> {\n this.assertBodyAvailable();\n this.bodyUsed = true;\n\n if (this.inlineBody) {\n const bytes = this.inlineBody;\n this.inlineBody = null;\n return bytes;\n }\n\n // Fast path: if native handle is still available, read entire body in one Rust call\n if (this.nativeHandleAvailable && this.payload.bodyHandle !== null) {\n this.nativeHandleAvailable = false;\n try {\n return await nativeBinding.readBodyAll(this.payload.bodyHandle);\n } catch (error) {\n // Handle already consumed or error\n if (String(error).includes(\"Body handle\") && String(error).includes(\"not found\")) {\n return Buffer.alloc(0);\n }\n throw error;\n } finally {\n if (this.nativeHandle) {\n markNativeBodyReleased(this.nativeHandle);\n }\n }\n }\n\n // Slow path: stream was accessed, use streaming consumption\n const stream = this.body;\n if (!stream) {\n return Buffer.alloc(0);\n }\n\n const reader = stream.getReader();\n const chunks: Buffer[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value && value.byteLength > 0) {\n if (Buffer.isBuffer(value)) {\n chunks.push(value);\n } else {\n chunks.push(Buffer.from(value.buffer, value.byteOffset, value.byteLength));\n }\n }\n }\n } finally {\n // reader.releaseLock() is unnecessary here; letting the stream close naturally\n // ensures the underlying native handle is released.\n }\n\n return chunks.length === 0 ? Buffer.alloc(0) : Buffer.concat(chunks);\n }\n}\n\nexport class Transport {\n readonly id: string;\n private disposed = false;\n\n constructor(id: string) {\n this.id = id;\n }\n\n get closed(): boolean {\n return this.disposed;\n }\n\n async close(): Promise<void> {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n try {\n nativeBinding.dropTransport(this.id);\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n}\n\nexport class Session implements SessionHandle {\n readonly id: string;\n private disposed = false;\n private readonly defaults: SessionDefaults;\n\n constructor(id: string, defaults: SessionDefaults) {\n this.id = id;\n this.defaults = defaults;\n }\n\n get closed(): boolean {\n return this.disposed;\n }\n\n private ensureActive(): void {\n if (this.disposed) {\n throw new RequestError(\"Session has been closed\");\n }\n }\n\n /** @internal */\n getDefaults(): SessionDefaults {\n const snapshot: SessionDefaults = { ...this.defaults };\n if (this.defaults.defaultHeaders) {\n snapshot.defaultHeaders = [...this.defaults.defaultHeaders];\n }\n return snapshot;\n }\n\n /** @internal */\n _defaultsRef(): SessionDefaults {\n return this.defaults;\n }\n\n async fetch(input: string | URL | Request, init?: WreqRequestInit): Promise<Response> {\n this.ensureActive();\n const config: WreqRequestInit = init ? { ...init, session: this } : { session: this };\n return fetch(input, config);\n }\n\n async clearCookies(): Promise<void> {\n this.ensureActive();\n try {\n nativeBinding.clearSession(this.id);\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n\n getCookies(url: string | URL): Record<string, string> {\n this.ensureActive();\n try {\n return nativeBinding.getCookies(this.id, String(url));\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n\n setCookie(name: string, value: string, url: string | URL): void {\n this.ensureActive();\n try {\n nativeBinding.setCookie(this.id, name, value, String(url));\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n\n /**\n * Create a WebSocket connection that shares this session's cookies and TLS configuration.\n *\n * @param urlOrOptions - WebSocket URL or legacy options object\n * @param options - Session WebSocket options\n * @returns Promise that resolves to the WebSocket instance\n */\n async websocket(url: string | URL, options?: SessionWebSocketOptions): Promise<WebSocket>;\n async websocket(options: LegacySessionWebSocketOptions): Promise<WebSocket>;\n async websocket(\n urlOrOptions: string | URL | LegacySessionWebSocketOptions,\n options?: SessionWebSocketOptions,\n ): Promise<WebSocket> {\n this.ensureActive();\n\n const normalized = normalizeSessionWebSocketArgs(urlOrOptions, options);\n validateWebSocketProtocols(normalized.options.protocols);\n assertNoManualWebSocketProtocolHeader(normalized.options.headers);\n const protocols = normalizeWebSocketProtocolList(normalized.options.protocols);\n\n const transportId = this.defaults.transportId;\n if (!transportId) {\n throw new RequestError(\n \"Session has no transport. Create the session with browser/os options or pass a transport to use session.websocket().\",\n );\n }\n\n return WebSocket._connectWithInit({\n _internal: true,\n url: normalized.url,\n options: normalized.options,\n openDispatchMode: \"deferred\",\n connect: (callbacks) =>\n nativeBinding.websocketConnectSession({\n url: normalized.url,\n sessionId: this.id,\n transportId,\n headers: headersToTuples(normalized.options.headers ?? {}),\n ...(protocols && protocols.length > 0 && { protocols }),\n onMessage: callbacks.onMessage,\n onClose: callbacks.onClose,\n onError: callbacks.onError,\n }),\n legacyCallbacks: normalized.legacyCallbacks,\n });\n }\n\n async close(): Promise<void> {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n const transportId = this.defaults.transportId;\n const ownsTransport = this.defaults.ownsTransport;\n\n try {\n nativeBinding.dropSession(this.id);\n } catch (error) {\n if (!ownsTransport || !transportId) {\n throw new RequestError(String(error));\n }\n // Fall through to transport cleanup and surface the original error after.\n const originalError = error;\n try {\n nativeBinding.dropTransport(transportId);\n } catch {\n // Ignore transport cleanup errors when a session drop error already occurred.\n }\n throw new RequestError(String(originalError));\n }\n\n if (ownsTransport && transportId) {\n try {\n nativeBinding.dropTransport(transportId);\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n }\n}\n\nfunction resolveSessionContext(config: WreqRequestInit): SessionResolution {\n const requestedMode = config.cookieMode ?? \"ephemeral\";\n const sessionCandidate = config.session;\n const providedSessionId = typeof config.sessionId === \"string\" ? config.sessionId.trim() : undefined;\n\n if (sessionCandidate && providedSessionId) {\n throw new RequestError(\"Provide either `session` or `sessionId`, not both.\");\n }\n\n if (sessionCandidate) {\n if (!(sessionCandidate instanceof Session)) {\n throw new RequestError(\"`session` must be created via createSession()\");\n }\n\n if (sessionCandidate.closed) {\n throw new RequestError(\"Session has been closed\");\n }\n\n return {\n sessionId: sessionCandidate.id,\n cookieMode: \"session\",\n dropAfterRequest: false,\n defaults: sessionCandidate._defaultsRef(),\n };\n }\n\n if (providedSessionId) {\n if (!providedSessionId) {\n throw new RequestError(\"sessionId must not be empty\");\n }\n\n if (requestedMode === \"ephemeral\") {\n throw new RequestError(\"cookieMode 'ephemeral' cannot be combined with sessionId\");\n }\n\n return {\n sessionId: providedSessionId,\n cookieMode: \"session\",\n dropAfterRequest: false,\n };\n }\n\n if (requestedMode === \"session\") {\n throw new RequestError(\"cookieMode 'session' requires a session or sessionId\");\n }\n\n return {\n sessionId: generateEphemeralSessionId(),\n cookieMode: \"ephemeral\",\n dropAfterRequest: true,\n };\n}\n\nfunction resolveTransportContext(config: WreqRequestInit, sessionDefaults?: SessionDefaults): TransportResolution {\n if (config.transport !== undefined) {\n if (!(config.transport instanceof Transport)) {\n throw new RequestError(\"`transport` must be created via createTransport()\");\n }\n\n if (config.transport.closed) {\n throw new RequestError(\"Transport has been closed\");\n }\n\n const hasProxy = config.proxy !== undefined;\n if (config.browser !== undefined || config.os !== undefined || hasProxy || config.insecure !== undefined) {\n throw new RequestError(\"`transport` cannot be combined with browser/os/proxy/insecure options\");\n }\n\n return { transportId: config.transport.id };\n }\n\n if (sessionDefaults?.transportId) {\n if (config.browser !== undefined) {\n validateBrowserProfile(config.browser);\n if (config.browser !== sessionDefaults.browser) {\n throw new RequestError(\"Session browser cannot be changed after creation\");\n }\n }\n\n if (config.os !== undefined) {\n validateOperatingSystem(config.os);\n if (config.os !== sessionDefaults.os) {\n throw new RequestError(\"Session operating system cannot be changed after creation\");\n }\n }\n\n const initHasProxy = Object.hasOwn(config as object, \"proxy\");\n const requestedProxy = initHasProxy ? (config as { proxy?: string | null }).proxy : undefined;\n if (initHasProxy && requestedProxy !== undefined && (sessionDefaults.proxy ?? null) !== (requestedProxy ?? null)) {\n throw new RequestError(\"Session proxy cannot be changed after creation\");\n }\n\n if (config.insecure !== undefined) {\n const lockedInsecure = sessionDefaults.insecure ?? false;\n if (config.insecure !== lockedInsecure) {\n throw new RequestError(\"Session insecure setting cannot be changed after creation\");\n }\n }\n\n return { transportId: sessionDefaults.transportId };\n }\n\n const browser = config.browser ?? DEFAULT_BROWSER;\n const os = config.os ?? DEFAULT_OS;\n\n validateBrowserProfile(browser);\n validateOperatingSystem(os);\n\n const resolved: TransportResolution = { browser, os };\n if (config.proxy !== undefined) {\n resolved.proxy = config.proxy;\n }\n if (config.insecure !== undefined) {\n resolved.insecure = config.insecure;\n }\n return resolved;\n}\n\ninterface AbortHandler {\n promise: Promise<never>;\n cleanup: () => void;\n}\n\nfunction createAbortError(reason?: unknown): Error {\n const fallbackMessage = typeof reason === \"string\" ? reason : \"The operation was aborted\";\n\n if (typeof DOMException !== \"undefined\" && reason instanceof DOMException) {\n return reason.name === \"AbortError\" ? reason : new DOMException(reason.message || fallbackMessage, \"AbortError\");\n }\n\n if (reason instanceof Error) {\n const error = new Error(reason.message);\n error.name = \"AbortError\";\n error.cause = reason;\n return error;\n }\n\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(fallbackMessage, \"AbortError\");\n }\n\n const error = new Error(fallbackMessage);\n error.name = \"AbortError\";\n return error;\n}\n\nfunction isAbortError(error: unknown): error is Error {\n return Boolean(error) && typeof (error as Error).name === \"string\" && (error as Error).name === \"AbortError\";\n}\n\n// Request IDs must stay below 2^48 to preserve integer precision across the bridge.\nconst REQUEST_ID_MAX = 2 ** 48;\n// Seed with a monotonic-ish value derived from hrtime to avoid collisions after reloads.\nlet requestIdCounter = Math.trunc(Number(process.hrtime.bigint() % BigInt(REQUEST_ID_MAX - 1))) + 1;\n\nfunction generateRequestId(): number {\n requestIdCounter += 1;\n if (requestIdCounter >= REQUEST_ID_MAX) {\n requestIdCounter = 1;\n }\n\n return requestIdCounter;\n}\n\nfunction setupAbort(signal: AbortSignal | null | undefined, cancelNative: () => void): AbortHandler | null {\n if (!signal) {\n return null;\n }\n\n if (signal.aborted) {\n cancelNative();\n throw createAbortError(signal.reason);\n }\n\n let onAbortListener: (() => void) | undefined;\n\n const promise = new Promise<never>((_, reject) => {\n onAbortListener = () => {\n cancelNative();\n reject(createAbortError(signal.reason));\n };\n\n signal.addEventListener(\"abort\", onAbortListener, { once: true });\n });\n\n const cleanup = () => {\n if (onAbortListener) {\n signal.removeEventListener(\"abort\", onAbortListener);\n onAbortListener = undefined;\n }\n };\n\n return { promise, cleanup };\n}\n\nfunction coerceUrlInput(input: string | URL): string {\n if (input instanceof URL) {\n return input.href;\n }\n\n if (input.length === 0) {\n throw new RequestError(\"URL is required\");\n }\n\n // Fast path: skip trim when the string has no leading/trailing whitespace.\n if (input.charCodeAt(0) > 32 && input.charCodeAt(input.length - 1) > 32) {\n return input;\n }\n\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new RequestError(\"URL is required\");\n }\n\n return trimmed;\n}\n\ntype RequestLike = {\n url: string;\n method: string;\n headers: globalThis.Headers;\n signal: AbortSignal | null;\n redirect: string;\n bodyUsed: boolean;\n body: ReadableStream<Uint8Array> | null;\n arrayBuffer(): Promise<ArrayBuffer>;\n};\n\nfunction isRequestLike(input: unknown): input is RequestLike {\n if (!input || typeof input !== \"object\") {\n return false;\n }\n\n if (typeof Request !== \"undefined\" && input instanceof Request) {\n return true;\n }\n\n const candidate = input as Partial<RequestLike>;\n return (\n typeof candidate.url === \"string\" &&\n typeof candidate.method === \"string\" &&\n typeof candidate.arrayBuffer === \"function\" &&\n typeof candidate.redirect === \"string\"\n );\n}\n\nasync function resolveFetchArgs(\n input: string | URL | RequestLike,\n init?: WreqRequestInit,\n): Promise<{\n url: string;\n init: WreqRequestInit;\n}> {\n if (!isRequestLike(input)) {\n return { url: coerceUrlInput(input), init: init ?? {} };\n }\n\n const mergedInit: WreqRequestInit = init ? { ...init } : {};\n\n if (mergedInit.method === undefined) {\n mergedInit.method = input.method;\n }\n if (mergedInit.headers === undefined) {\n mergedInit.headers = input.headers as unknown as HeadersInit;\n }\n if (\n mergedInit.redirect === undefined &&\n (input.redirect === \"follow\" || input.redirect === \"manual\" || input.redirect === \"error\")\n ) {\n mergedInit.redirect = input.redirect;\n }\n if (mergedInit.signal === undefined) {\n mergedInit.signal = input.signal;\n }\n if (mergedInit.body === undefined && input.body !== null) {\n if (input.bodyUsed) {\n throw new TypeError(\"Request body is already used\");\n }\n mergedInit.body = Buffer.from(await input.arrayBuffer());\n }\n\n return { url: coerceUrlInput(input.url), init: mergedInit };\n}\n\nfunction normalizeUrlForComparison(value: string): string | null {\n try {\n return new URL(value).toString();\n } catch {\n return null;\n }\n}\n\nfunction validateRedirectMode(mode?: WreqRequestInit[\"redirect\"]): void {\n if (mode === undefined || mode === \"follow\" || mode === \"manual\" || mode === \"error\") {\n return;\n }\n\n throw new RequestError(`Redirect mode '${mode}' is not supported`);\n}\n\ntype SerializedBody = {\n body?: Buffer;\n contentType?: string;\n};\n\nasync function serializeBody(body?: BodyInit | null): Promise<SerializedBody> {\n if (body === null || body === undefined) {\n return {};\n }\n\n if (typeof body === \"string\") {\n return { body: Buffer.from(body, \"utf8\") };\n }\n\n if (Buffer.isBuffer(body)) {\n return { body };\n }\n\n if (body instanceof URLSearchParams) {\n return {\n body: Buffer.from(body.toString(), \"utf8\"),\n contentType: \"application/x-www-form-urlencoded;charset=UTF-8\",\n };\n }\n\n if (body instanceof ArrayBuffer) {\n return { body: Buffer.from(body) };\n }\n\n if (ArrayBuffer.isView(body)) {\n return { body: Buffer.from(body.buffer, body.byteOffset, body.byteLength) };\n }\n\n if (typeof Blob !== \"undefined\" && body instanceof Blob) {\n const buffer = Buffer.from(await body.arrayBuffer());\n return { body: buffer, ...(body.type ? { contentType: body.type } : {}) };\n }\n\n if (typeof FormData !== \"undefined\" && body instanceof FormData) {\n const encoded = new globalThis.Response(body);\n const contentType = encoded.headers.get(\"content-type\") ?? undefined;\n const buffer = Buffer.from(await encoded.arrayBuffer());\n return { body: buffer, ...(contentType ? { contentType } : {}) };\n }\n\n throw new TypeError(\n \"Unsupported body type; expected string, Buffer, ArrayBuffer, ArrayBufferView, URLSearchParams, Blob, or FormData\",\n );\n}\n\nfunction ensureMethod(method?: string): string {\n if (method === undefined || method.length === 0) {\n return \"GET\";\n }\n\n // Fast path: common methods already in canonical form (avoids trim + toUpperCase).\n switch (method) {\n case \"GET\":\n case \"POST\":\n case \"PUT\":\n case \"DELETE\":\n case \"PATCH\":\n case \"HEAD\":\n case \"OPTIONS\":\n return method;\n }\n\n const normalized = method.trim().toUpperCase();\n return normalized.length > 0 ? normalized : \"GET\";\n}\n\nfunction ensureBodyAllowed(method: string, body?: Buffer): void {\n if (body === undefined) {\n return;\n }\n\n if (method === \"GET\" || method === \"HEAD\") {\n throw new RequestError(`Request with ${method} method cannot have a body`);\n }\n}\n\nfunction validateBrowserProfile(browser?: BrowserProfile | string): void {\n if (browser === undefined) {\n return;\n }\n\n if (typeof browser !== \"string\" || browser.trim().length === 0) {\n throw new RequestError(\"Browser profile must not be empty\");\n }\n\n if (!getProfileSet().has(browser)) {\n throw new RequestError(`Invalid browser profile: ${browser}. Available profiles: ${getProfiles().join(\", \")}`);\n }\n}\n\nfunction validateOperatingSystem(os?: EmulationOS | string): void {\n if (os === undefined) {\n return;\n }\n\n if (typeof os !== \"string\" || os.trim().length === 0) {\n throw new RequestError(\"Operating system must not be empty\");\n }\n\n if (!getOperatingSystemSet().has(os)) {\n throw new RequestError(`Invalid operating system: ${os}. Available options: ${getOperatingSystems().join(\", \")}`);\n }\n}\n\nfunction validateTimeout(timeout?: number): void {\n if (timeout === undefined) {\n return;\n }\n\n if (typeof timeout !== \"number\" || !Number.isFinite(timeout)) {\n throw new RequestError(\"Timeout must be a finite number\");\n }\n\n if (timeout < 0) {\n throw new RequestError(\"Timeout must be 0 (no timeout) or a positive number\");\n }\n}\n\nfunction validatePositiveNumber(value: number, label: string): void {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new RequestError(`${label} must be a finite number`);\n }\n\n if (value <= 0) {\n throw new RequestError(`${label} must be greater than 0`);\n }\n}\n\nfunction validateNonNegativeInteger(value: number, label: string): void {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isInteger(value)) {\n throw new RequestError(`${label} must be an integer`);\n }\n\n if (value < 0) {\n throw new RequestError(`${label} must be greater than or equal to 0`);\n }\n}\n\nfunction validatePositiveInteger(value: number, label: string): void {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isInteger(value)) {\n throw new RequestError(`${label} must be an integer`);\n }\n\n if (value <= 0) {\n throw new RequestError(`${label} must be greater than 0`);\n }\n}\n\nasync function dispatchRequest(\n options: NativeRequestOptions,\n requestUrl: string,\n signal?: AbortSignal | null,\n): Promise<Response> {\n // Fast path when no abort signal is provided: avoid Promise.race/allocation overhead.\n if (!signal) {\n const requestId = generateRequestId();\n let payload: NativeResponse;\n\n try {\n payload = (await nativeBinding.request(options, requestId, false)) as NativeResponse;\n } catch (error) {\n if (error instanceof RequestError) {\n throw error;\n }\n throw new RequestError(String(error));\n }\n\n return new Response(payload, requestUrl);\n }\n\n const requestId = generateRequestId();\n const cancelNative = () => {\n try {\n nativeBinding.cancelRequest(requestId);\n } catch {\n // Cancellation is best-effort; ignore binding errors here.\n }\n };\n\n // setupAbort throws if signal is already aborted and returns null only when signal is falsy\n // (impossible here since we checked `!signal` above). Cast is safe; avoids non-null assertion lint.\n const abortHandler = setupAbort(signal, cancelNative) as AbortHandler;\n\n const pending = Promise.race([nativeBinding.request(options, requestId, true), abortHandler.promise]);\n\n let payload: NativeResponse;\n\n try {\n payload = (await pending) as NativeResponse;\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n\n if (error instanceof RequestError) {\n throw error;\n }\n\n throw new RequestError(String(error));\n } finally {\n abortHandler.cleanup();\n }\n\n return new Response(payload, requestUrl);\n}\n\n/**\n * Fetch-compatible entry point that adds browser impersonation controls.\n *\n * **Important:** The default fetch path is isolated and non-persistent by design.\n * Each call uses an isolated request context, so cookies are not shared across calls.\n * Connection and TLS reuse behavior is handled by the native layer.\n *\n * **Use {@link createSession} or {@link withSession} if you need:**\n * - Cookie persistence across requests\n * - Shared session defaults across requests\n * - A single session context for multi-step flows\n *\n * **Concurrency:** The core is unthrottled by design. Callers are expected to implement\n * their own concurrency control (e.g., p-limit) if needed. Built-in throttling would\n * reduce performance for high-throughput workloads.\n *\n * @param input - Request URL (string or URL) or a Request object\n * @param init - Fetch-compatible init options\n *\n * @example\n * ```typescript\n * // Isolated request (no state persistence)\n * const response = await fetch('https://example.com');\n *\n * // For persistent cookies and connection reuse, use a session:\n * await withSession(async (session) => {\n * await session.fetch('https://example.com/login', { method: 'POST', body: loginData });\n * await session.fetch('https://example.com/protected'); // Cookies from login are sent\n * });\n * ```\n */\nexport async function fetch(input: string | URL | Request, init?: WreqRequestInit): Promise<Response> {\n const resolved = await resolveFetchArgs(input, init);\n const url = resolved.url;\n const config = resolved.init;\n const sessionContext = resolveSessionContext(config);\n const sessionDefaults = sessionContext.defaults;\n\n validateRedirectMode(config.redirect);\n\n if (config.timeout !== undefined) {\n validateTimeout(config.timeout);\n }\n\n const method = ensureMethod(config.method);\n const serializedBody = await serializeBody(config.body ?? null);\n const body = serializedBody.body;\n\n ensureBodyAllowed(method, body);\n\n // Only normalize headers when provided; avoids per-request header allocations on hot paths.\n // If the caller already provides HeaderTuple[], pass it through.\n let headerTuples = mergeHeaderTuples(sessionDefaults?.defaultHeaders, config.headers);\n if (serializedBody.contentType && !hasHeaderName(headerTuples, \"content-type\")) {\n if (!headerTuples) {\n headerTuples = [];\n }\n headerTuples.push([\"Content-Type\", serializedBody.contentType]);\n }\n\n const transport = resolveTransportContext(config, sessionDefaults);\n const timeout = config.timeout ?? sessionDefaults?.timeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\n const requestOptions: NativeRequestOptions = {\n url,\n method,\n sessionId: sessionContext.sessionId,\n ephemeral: sessionContext.dropAfterRequest,\n };\n\n if (body !== undefined) {\n requestOptions.body = body;\n }\n\n if (transport.transportId) {\n requestOptions.transportId = transport.transportId;\n } else {\n requestOptions.browser = transport.browser ?? DEFAULT_BROWSER;\n requestOptions.os = transport.os ?? DEFAULT_OS;\n if (transport.proxy !== undefined) {\n requestOptions.proxy = transport.proxy;\n }\n if (transport.insecure !== undefined) {\n requestOptions.insecure = transport.insecure;\n }\n }\n\n requestOptions.timeout = timeout;\n if (config.redirect !== undefined) {\n requestOptions.redirect = config.redirect;\n }\n if (config.disableDefaultHeaders !== undefined) {\n requestOptions.disableDefaultHeaders = config.disableDefaultHeaders;\n }\n if (config.compress !== undefined) {\n requestOptions.compress = config.compress;\n }\n\n if (headerTuples && headerTuples.length > 0) {\n requestOptions.headers = headerTuples;\n }\n\n return dispatchRequest(requestOptions, url, config.signal ?? null);\n}\n\nexport async function createTransport(options?: CreateTransportOptions): Promise<Transport> {\n const browser = options?.browser ?? DEFAULT_BROWSER;\n const os = options?.os ?? DEFAULT_OS;\n\n validateBrowserProfile(browser);\n validateOperatingSystem(os);\n\n if (options?.poolIdleTimeout !== undefined) {\n validatePositiveNumber(options.poolIdleTimeout, \"poolIdleTimeout\");\n }\n if (options?.poolMaxIdlePerHost !== undefined) {\n validateNonNegativeInteger(options.poolMaxIdlePerHost, \"poolMaxIdlePerHost\");\n }\n if (options?.poolMaxSize !== undefined) {\n validatePositiveInteger(options.poolMaxSize, \"poolMaxSize\");\n }\n if (options?.connectTimeout !== undefined) {\n validatePositiveNumber(options.connectTimeout, \"connectTimeout\");\n }\n if (options?.readTimeout !== undefined) {\n validatePositiveNumber(options.readTimeout, \"readTimeout\");\n }\n\n try {\n const id = nativeBinding.createTransport({\n browser,\n os,\n ...(options?.proxy !== undefined && { proxy: options.proxy }),\n ...(options?.insecure !== undefined && { insecure: options.insecure }),\n ...(options?.poolIdleTimeout !== undefined && { poolIdleTimeout: options.poolIdleTimeout }),\n ...(options?.poolMaxIdlePerHost !== undefined && { poolMaxIdlePerHost: options.poolMaxIdlePerHost }),\n ...(options?.poolMaxSize !== undefined && { poolMaxSize: options.poolMaxSize }),\n ...(options?.connectTimeout !== undefined && { connectTimeout: options.connectTimeout }),\n ...(options?.readTimeout !== undefined && { readTimeout: options.readTimeout }),\n });\n\n return new Transport(id);\n } catch (error) {\n throw new RequestError(String(error));\n }\n}\n\nexport async function createSession(options?: CreateSessionOptions): Promise<Session> {\n const { sessionId, defaults } = normalizeSessionOptions(options);\n\n validateBrowserProfile(defaults.browser);\n validateOperatingSystem(defaults.os);\n\n let createdId: string;\n let transportId: string;\n\n try {\n transportId = nativeBinding.createTransport({\n browser: defaults.browser,\n os: defaults.os,\n ...(defaults.proxy !== undefined && { proxy: defaults.proxy }),\n ...(defaults.insecure !== undefined && { insecure: defaults.insecure }),\n });\n } catch (error) {\n throw new RequestError(String(error));\n }\n\n try {\n createdId = nativeBinding.createSession({\n sessionId,\n });\n } catch (error) {\n try {\n nativeBinding.dropTransport(transportId);\n } catch {\n // Best-effort cleanup; prefer surfacing the original error.\n }\n throw new RequestError(String(error));\n }\n\n defaults.transportId = transportId;\n defaults.ownsTransport = true;\n\n return new Session(createdId, defaults);\n}\n\nexport async function withSession<T>(\n fn: (session: Session) => Promise<T> | T,\n options?: CreateSessionOptions,\n): Promise<T> {\n const session = await createSession(options);\n\n try {\n return await fn(session);\n } finally {\n await session.close();\n }\n}\n\n/**\n * @deprecated Use {@link fetch} instead.\n */\nexport async function request(options: RequestOptions): Promise<Response> {\n if (!options.url) {\n throw new RequestError(\"URL is required\");\n }\n\n const { url, ...rest } = options;\n const init: WreqRequestInit = {};\n const legacy = rest as Partial<WreqRequestInit> & { ephemeral?: boolean };\n\n if (rest.method !== undefined) {\n init.method = rest.method;\n }\n\n if (rest.headers !== undefined) {\n init.headers = rest.headers;\n }\n\n if (rest.body !== undefined) {\n init.body = rest.body;\n }\n\n if (rest.browser !== undefined) {\n init.browser = rest.browser;\n }\n\n if (rest.os !== undefined) {\n init.os = rest.os;\n }\n\n if (rest.proxy !== undefined) {\n init.proxy = rest.proxy;\n }\n\n if (rest.timeout !== undefined) {\n init.timeout = rest.timeout;\n }\n\n if (rest.sessionId !== undefined) {\n init.sessionId = rest.sessionId;\n }\n\n if (rest.transport !== undefined) {\n init.transport = rest.transport;\n }\n\n if (rest.insecure !== undefined) {\n init.insecure = rest.insecure;\n }\n\n if (rest.disableDefaultHeaders !== undefined) {\n init.disableDefaultHeaders = rest.disableDefaultHeaders;\n }\n\n if (rest.redirect !== undefined) {\n init.redirect = rest.redirect;\n }\n\n if (legacy.signal !== undefined) {\n init.signal = legacy.signal;\n }\n\n if (legacy.session !== undefined) {\n init.session = legacy.session;\n }\n\n if (legacy.cookieMode !== undefined) {\n init.cookieMode = legacy.cookieMode;\n } else if (legacy.ephemeral === true) {\n init.cookieMode = \"ephemeral\";\n }\n\n return fetch(url, init);\n}\n\n/**\n * Get list of available browser profiles\n *\n * @returns Array of browser profile names\n *\n * @example\n * ```typescript\n * import { getProfiles } from 'wreq-js';\n *\n * const profiles = getProfiles();\n * console.log(profiles); // ['chrome_131', 'chrome_142', 'firefox_135', 'safari_18', ...]\n * ```\n */\nexport function getProfiles(): BrowserProfile[] {\n if (!cachedProfiles) {\n cachedProfiles = nativeBinding.getProfiles() as BrowserProfile[];\n }\n\n return cachedProfiles;\n}\n\nfunction getProfileSet(): Set<string> {\n if (!cachedProfileSet) {\n cachedProfileSet = new Set(getProfiles());\n }\n\n return cachedProfileSet;\n}\n\n/**\n * Get list of supported operating systems for emulation.\n *\n * @returns Array of operating system identifiers\n */\nexport function getOperatingSystems(): EmulationOS[] {\n if (!cachedOperatingSystems) {\n const fromNative = nativeBinding.getOperatingSystems?.() as EmulationOS[] | undefined;\n cachedOperatingSystems = fromNative && fromNative.length > 0 ? fromNative : [...SUPPORTED_OSES];\n }\n\n return cachedOperatingSystems;\n}\n\nfunction getOperatingSystemSet(): Set<string> {\n if (!cachedOperatingSystemSet) {\n cachedOperatingSystemSet = new Set(getOperatingSystems());\n }\n\n return cachedOperatingSystemSet;\n}\n\n/**\n * Convenience helper for GET requests using {@link fetch}.\n */\nexport async function get(url: string | URL | Request, init?: Omit<WreqRequestInit, \"method\">): Promise<Response> {\n const config: WreqRequestInit = {};\n if (init) {\n Object.assign(config, init);\n }\n config.method = \"GET\";\n return fetch(url, config);\n}\n\n/**\n * Convenience helper for POST requests using {@link fetch}.\n */\nexport async function post(\n url: string | URL | Request,\n body?: BodyInit | null,\n init?: Omit<WreqRequestInit, \"method\" | \"body\">,\n): Promise<Response> {\n const config: WreqRequestInit = {};\n if (init) {\n Object.assign(config, init);\n }\n config.method = \"POST\";\n if (body !== undefined) {\n config.body = body;\n }\n\n return fetch(url, config);\n}\n\nfunction normalizeWebSocketUrl(url: string | URL): string {\n const normalized = String(url).trim();\n if (!normalized) {\n throw new RequestError(\"URL is required\");\n }\n\n let parsed: URL;\n try {\n parsed = new URL(normalized);\n } catch (error) {\n throw new RequestError(String(error));\n }\n\n if (parsed.hash) {\n throw new RequestError(\"WebSocket URL must not include a hash fragment\");\n }\n\n if (parsed.protocol === \"http:\") {\n parsed.protocol = \"ws:\";\n } else if (parsed.protocol === \"https:\") {\n parsed.protocol = \"wss:\";\n }\n\n if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new RequestError(\"expected a ws: or wss: url\");\n }\n\n return parsed.toString();\n}\n\nfunction validateWebSocketProtocols(protocols?: string | string[]): void {\n if (protocols === undefined) {\n return;\n }\n\n const protocolList = typeof protocols === \"string\" ? [protocols] : protocols;\n const seen = new Set<string>();\n const validToken = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n for (const protocol of protocolList) {\n if (typeof protocol !== \"string\" || protocol.length === 0) {\n throw new RequestError(\"WebSocket protocol values must be non-empty strings\");\n }\n if (!validToken.test(protocol)) {\n throw new RequestError(`Invalid WebSocket protocol value: ${protocol}`);\n }\n if (seen.has(protocol)) {\n throw new RequestError(`Duplicate WebSocket protocol: ${protocol}`);\n }\n seen.add(protocol);\n }\n}\n\nfunction normalizeStandaloneWebSocketOptions(options?: Partial<WebSocketOptions>): WebSocketOptions {\n const normalized: WebSocketOptions = {};\n if (!options) {\n return normalized;\n }\n\n if (options.browser !== undefined) {\n normalized.browser = options.browser;\n }\n if (options.os !== undefined) {\n normalized.os = options.os;\n }\n if (options.headers !== undefined) {\n normalized.headers = options.headers;\n }\n if (options.proxy !== undefined) {\n normalized.proxy = options.proxy;\n }\n if (options.protocols !== undefined) {\n normalized.protocols = options.protocols;\n }\n if (options.binaryType !== undefined) {\n if (options.binaryType !== \"nodebuffer\" && options.binaryType !== \"arraybuffer\" && options.binaryType !== \"blob\") {\n throw new RequestError(\"binaryType must be one of: 'nodebuffer', 'arraybuffer', 'blob'\");\n }\n normalized.binaryType = options.binaryType;\n }\n\n return normalized;\n}\n\nfunction normalizeSessionWebSocketOptions(options?: Partial<SessionWebSocketOptions>): SessionWebSocketOptions {\n const normalized: SessionWebSocketOptions = {};\n if (!options) {\n return normalized;\n }\n\n const optionsWithOverrides = options as Partial<WebSocketOptions>;\n if (optionsWithOverrides.browser !== undefined) {\n throw new RequestError(\n \"`browser` is not supported in session.websocket(); the session controls browser emulation.\",\n );\n }\n if (optionsWithOverrides.os !== undefined) {\n throw new RequestError(\"`os` is not supported in session.websocket(); the session controls OS emulation.\");\n }\n if (optionsWithOverrides.proxy !== undefined) {\n throw new RequestError(\"`proxy` is not supported in session.websocket(); the session transport controls proxying.\");\n }\n\n if (options.headers !== undefined) {\n normalized.headers = options.headers;\n }\n if (options.protocols !== undefined) {\n normalized.protocols = options.protocols;\n }\n if (options.binaryType !== undefined) {\n if (options.binaryType !== \"nodebuffer\" && options.binaryType !== \"arraybuffer\" && options.binaryType !== \"blob\") {\n throw new RequestError(\"binaryType must be one of: 'nodebuffer', 'arraybuffer', 'blob'\");\n }\n normalized.binaryType = options.binaryType;\n }\n\n return normalized;\n}\n\nfunction extractLegacyWebSocketCallbacks(options: unknown): LegacyWebSocketCallbacks | undefined {\n if (!isPlainObject(options)) {\n return undefined;\n }\n\n const maybeCallbacks = options as Partial<LegacyWebSocketCallbacks>;\n const callbacks: LegacyWebSocketCallbacks = {};\n\n if (typeof maybeCallbacks.onMessage === \"function\") {\n callbacks.onMessage = maybeCallbacks.onMessage;\n }\n if (typeof maybeCallbacks.onClose === \"function\") {\n callbacks.onClose = maybeCallbacks.onClose;\n }\n if (typeof maybeCallbacks.onError === \"function\") {\n callbacks.onError = maybeCallbacks.onError;\n }\n\n return Object.keys(callbacks).length > 0 ? callbacks : undefined;\n}\n\nfunction normalizeWebSocketCloseOptions(code?: number, reason?: string): NativeWebSocketCloseOptions | undefined {\n if (code === undefined && reason === undefined) {\n return undefined;\n }\n\n if (code === undefined) {\n throw new RequestError(\"A close code is required when providing a close reason\");\n }\n\n if (!Number.isInteger(code)) {\n throw new RequestError(\"Close code must be an integer\");\n }\n if (code !== 1000 && (code < 3000 || code > 4999)) {\n throw new RequestError(\"Close code must be 1000 or in range 3000-4999\");\n }\n\n const normalizedReason = reason ?? \"\";\n if (Buffer.byteLength(normalizedReason, \"utf8\") > 123) {\n throw new RequestError(\"Close reason must be 123 bytes or fewer\");\n }\n\n return {\n code,\n reason: normalizedReason,\n };\n}\n\ntype WebSocketAnyEvent = WebSocketOpenEvent | WebSocketMessageEvent | WebSocketCloseEvent | WebSocketErrorEvent;\ntype WebSocketFunctionListener = (this: WebSocket, event: WebSocketAnyEvent) => void;\ntype WebSocketObjectListener = { handleEvent: (event: WebSocketAnyEvent) => void };\ntype WebSocketListener = WebSocketFunctionListener | WebSocketObjectListener;\ntype WebSocketAddEventListenerOptions = boolean | { once?: boolean; signal?: AbortSignal | null };\ntype WebSocketListenerType = \"open\" | \"message\" | \"close\" | \"error\";\n\ntype WebSocketListenerDescriptor = {\n listener: WebSocketListener;\n order: number;\n once: boolean;\n abortSignal?: AbortSignal | null;\n abortHandler?: () => void;\n};\n\nfunction isWebSocketListenerType(type: string): type is WebSocketListenerType {\n return type === \"open\" || type === \"message\" || type === \"close\" || type === \"error\";\n}\n\n/**\n * WHATWG-style WebSocket API with async connection establishment.\n */\nexport class WebSocket {\n static readonly CONNECTING = 0;\n static readonly OPEN = 1;\n static readonly CLOSING = 2;\n static readonly CLOSED = 3;\n\n readonly url: string;\n protocol = \"\";\n extensions = \"\";\n readyState = WebSocket.CONNECTING;\n private _binaryType: WebSocketBinaryType = \"nodebuffer\";\n private _bufferedAmount = 0;\n\n private _onopen: ((this: WebSocket, event: WebSocketOpenEvent) => void) | null = null;\n private _onmessage: ((this: WebSocket, event: WebSocketMessageEvent) => void) | null = null;\n private _onclose: ((this: WebSocket, event: WebSocketCloseEvent) => void) | null = null;\n private _onerror: ((this: WebSocket, event: WebSocketErrorEvent) => void) | null = null;\n private _onHandlerOrder = {\n open: -1,\n message: -1,\n close: -1,\n error: -1,\n };\n private _listenerOrderCounter = 0;\n\n private readonly _listeners = {\n open: new Map<WebSocketListener, WebSocketListenerDescriptor>(),\n message: new Map<WebSocketListener, WebSocketListenerDescriptor>(),\n close: new Map<WebSocketListener, WebSocketListenerDescriptor>(),\n error: new Map<WebSocketListener, WebSocketListenerDescriptor>(),\n };\n private readonly _legacyCallbacks: LegacyWebSocketCallbacks | undefined;\n private readonly _openDispatchMode: WebSocketOpenDispatchMode;\n private _connection: NativeWebSocketConnection | undefined;\n private _connectPromise!: Promise<void>;\n private _closeOptions: NativeWebSocketCloseOptions | undefined;\n private _finalizerToken: NativeWebSocketConnection | undefined;\n private _openEventDispatched = false;\n private _openEventQueued = false;\n private _closeEventDispatched = false;\n private _nativeCloseStarted = false;\n private _pendingMessages: Array<string | Buffer> = [];\n private _sendChain: Promise<void> = Promise.resolve();\n\n constructor(init: InternalWebSocketInit);\n constructor(url: string | URL, protocols?: string | string[]);\n constructor(url: string | URL, protocols?: string | string[], options?: WebSocketOptions);\n constructor(url: string | URL, options?: WebSocketOptions);\n constructor(\n urlOrInit: string | URL | InternalWebSocketInit,\n protocolsOrOptions?: string | string[] | WebSocketOptions,\n maybeOptions?: WebSocketOptions,\n ) {\n let init: InternalWebSocketInit;\n if (isInternalWebSocketInit(urlOrInit)) {\n init = urlOrInit;\n } else {\n init = WebSocket.buildStandaloneInit(urlOrInit, protocolsOrOptions, maybeOptions);\n }\n\n this.url = init.url;\n this.binaryType = init.options.binaryType ?? \"nodebuffer\";\n this._legacyCallbacks = init.legacyCallbacks;\n this._openDispatchMode = init.openDispatchMode;\n this._connectPromise = this.connect(init.connect);\n void this._connectPromise.catch(() => undefined);\n }\n\n get binaryType(): WebSocketBinaryType {\n return this._binaryType;\n }\n\n set binaryType(value: WebSocketBinaryType) {\n if (value === \"arraybuffer\" || value === \"blob\" || value === \"nodebuffer\") {\n this._binaryType = value;\n }\n }\n\n get bufferedAmount(): number {\n return this._bufferedAmount;\n }\n\n get onopen(): ((this: WebSocket, event: WebSocketOpenEvent) => void) | null {\n return this._onopen;\n }\n\n set onopen(listener: ((this: WebSocket, event: WebSocketOpenEvent) => void) | null) {\n this._onopen = listener;\n this._onHandlerOrder.open = listener ? ++this._listenerOrderCounter : -1;\n }\n\n get onmessage(): ((this: WebSocket, event: WebSocketMessageEvent) => void) | null {\n return this._onmessage;\n }\n\n set onmessage(listener: ((this: WebSocket, event: WebSocketMessageEvent) => void) | null) {\n this._onmessage = listener;\n this._onHandlerOrder.message = listener ? ++this._listenerOrderCounter : -1;\n }\n\n get onclose(): ((this: WebSocket, event: WebSocketCloseEvent) => void) | null {\n return this._onclose;\n }\n\n set onclose(listener: ((this: WebSocket, event: WebSocketCloseEvent) => void) | null) {\n this._onclose = listener;\n this._onHandlerOrder.close = listener ? ++this._listenerOrderCounter : -1;\n }\n\n get onerror(): ((this: WebSocket, event: WebSocketErrorEvent) => void) | null {\n return this._onerror;\n }\n\n set onerror(listener: ((this: WebSocket, event: WebSocketErrorEvent) => void) | null) {\n this._onerror = listener;\n this._onHandlerOrder.error = listener ? ++this._listenerOrderCounter : -1;\n }\n\n static async _connectWithInit(init: InternalWebSocketInit): Promise<WebSocket> {\n const ws = new WebSocket(init);\n await ws._waitUntilConnected();\n ws.scheduleOpenEventAfterAwait();\n return ws;\n }\n\n private static buildStandaloneInit(\n url: string | URL,\n protocolsOrOptions?: string | string[] | WebSocketOptions,\n maybeOptions?: WebSocketOptions,\n ): InternalWebSocketInit {\n const optionsCandidate =\n typeof protocolsOrOptions === \"string\" || Array.isArray(protocolsOrOptions)\n ? maybeOptions\n : (protocolsOrOptions ?? maybeOptions);\n const normalizedOptions = normalizeStandaloneWebSocketOptions(optionsCandidate);\n validateWebSocketProtocols(\n typeof protocolsOrOptions === \"string\" || Array.isArray(protocolsOrOptions)\n ? protocolsOrOptions\n : normalizedOptions.protocols,\n );\n assertNoManualWebSocketProtocolHeader(normalizedOptions.headers);\n validateBrowserProfile(normalizedOptions.browser);\n const os = normalizedOptions.os ?? DEFAULT_OS;\n validateOperatingSystem(os);\n const browser = normalizedOptions.browser ?? DEFAULT_BROWSER;\n const protocols = normalizeWebSocketProtocolList(\n typeof protocolsOrOptions === \"string\" || Array.isArray(protocolsOrOptions)\n ? protocolsOrOptions\n : normalizedOptions.protocols,\n );\n\n return {\n _internal: true,\n url: normalizeWebSocketUrl(url),\n options: normalizedOptions,\n openDispatchMode: \"automatic\",\n connect: (callbacks) =>\n nativeBinding.websocketConnect({\n url: normalizeWebSocketUrl(url),\n browser,\n os,\n headers: headersToTuples(normalizedOptions.headers ?? {}),\n ...(protocols && protocols.length > 0 && { protocols }),\n ...(normalizedOptions.proxy !== undefined && { proxy: normalizedOptions.proxy }),\n onMessage: callbacks.onMessage,\n onClose: callbacks.onClose,\n onError: callbacks.onError,\n }),\n legacyCallbacks: extractLegacyWebSocketCallbacks(optionsCandidate),\n };\n }\n\n private async connect(\n connectFn: (callbacks: {\n onMessage: (data: string | Buffer) => void;\n onClose: (event: NativeWebSocketCloseEvent) => void;\n onError: (message: string) => void;\n }) => Promise<NativeWebSocketConnection>,\n ): Promise<void> {\n try {\n const connection = await connectFn({\n onMessage: (data) => {\n this.handleNativeMessage(data);\n },\n onClose: (event) => {\n this.handleNativeClose(event);\n },\n onError: (message) => {\n this.handleNativeError(message);\n },\n });\n\n this._connection = connection;\n this.protocol = connection.protocol ?? \"\";\n this.extensions = connection.extensions ?? \"\";\n if (websocketFinalizer) {\n this._finalizerToken = connection;\n websocketFinalizer.register(this, connection, connection);\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n this.startNativeClose();\n return;\n }\n\n this.readyState = WebSocket.OPEN;\n if (this._openDispatchMode === \"automatic\") {\n this.scheduleOpenEventAfterConnect();\n }\n } catch (error) {\n this.handleNativeError(String(error));\n this.finalizeClosed({ code: 1006, reason: \"\" }, false);\n throw new RequestError(String(error));\n }\n }\n\n private _waitUntilConnected(): Promise<void> {\n return this._connectPromise;\n }\n\n private scheduleOpenEventAfterConnect(): void {\n this.scheduleOpenEventWithDepth(2);\n }\n\n private scheduleOpenEventAfterAwait(): void {\n this.scheduleOpenEventWithDepth(3);\n }\n\n private scheduleOpenEventWithDepth(depth: number): void {\n if (this._openEventDispatched || this._openEventQueued || this.readyState !== WebSocket.OPEN) {\n return;\n }\n this._openEventQueued = true;\n\n const queue = (remaining: number) => {\n if (remaining === 0) {\n this._openEventQueued = false;\n if (this._openEventDispatched || this.readyState !== WebSocket.OPEN) {\n return;\n }\n this._openEventDispatched = true;\n this.dispatchOpenEvent();\n return;\n }\n\n queueMicrotask(() => {\n queue(remaining - 1);\n });\n };\n\n queue(depth);\n }\n\n private releaseConnectionTracking(): void {\n if (!this._finalizerToken || !websocketFinalizer) {\n return;\n }\n websocketFinalizer.unregister(this._finalizerToken);\n this._finalizerToken = undefined;\n }\n\n private toMessageEventData(data: string | Buffer): string | Buffer | ArrayBuffer | Blob {\n if (typeof data === \"string\") {\n return data;\n }\n if (this._binaryType === \"arraybuffer\") {\n const arrayBuffer = new ArrayBuffer(data.byteLength);\n new Uint8Array(arrayBuffer).set(data);\n return arrayBuffer;\n }\n if (this._binaryType === \"blob\") {\n return new Blob([data]);\n }\n return data;\n }\n\n private invokeListener(listener: WebSocketListener, event: WebSocketAnyEvent): void {\n try {\n if (typeof listener === \"function\") {\n listener.call(this, event);\n } else {\n listener.handleEvent(event);\n }\n } catch {\n // Event listener errors should not break native callback dispatch.\n }\n }\n\n private createBaseEvent<TType extends WebSocketAnyEvent[\"type\"]>(type: TType) {\n return {\n type,\n isTrusted: false as const,\n timeStamp: Date.now(),\n target: this,\n currentTarget: this,\n };\n }\n\n private getOnHandler(type: WebSocketListenerType): WebSocketFunctionListener | null {\n switch (type) {\n case \"open\":\n return this._onopen as WebSocketFunctionListener | null;\n case \"message\":\n return this._onmessage as WebSocketFunctionListener | null;\n case \"close\":\n return this._onclose as WebSocketFunctionListener | null;\n case \"error\":\n return this._onerror as WebSocketFunctionListener | null;\n default:\n return null;\n }\n }\n\n private getOnHandlerOrder(type: WebSocketListenerType): number {\n return this._onHandlerOrder[type];\n }\n\n private getListenerMap(type: WebSocketListenerType): Map<WebSocketListener, WebSocketListenerDescriptor> {\n return this._listeners[type];\n }\n\n private dispatchEvent(type: WebSocketListenerType, event: WebSocketAnyEvent): void {\n const listenerMap = this.getListenerMap(type);\n const onHandler = this.getOnHandler(type);\n if (listenerMap.size === 0 && !onHandler) {\n return;\n }\n\n const ordered: Array<{ order: number; listener: WebSocketListener; once: boolean }> = [];\n for (const descriptor of listenerMap.values()) {\n ordered.push({\n order: descriptor.order,\n listener: descriptor.listener,\n once: descriptor.once,\n });\n }\n\n if (onHandler) {\n ordered.push({\n order: this.getOnHandlerOrder(type),\n listener: onHandler,\n once: false,\n });\n }\n\n ordered.sort((a, b) => a.order - b.order);\n\n for (const entry of ordered) {\n if (entry.once) {\n this.removeEventListener(type, entry.listener);\n }\n this.invokeListener(entry.listener, event);\n }\n }\n\n private dispatchOpenEvent(): void {\n const event: WebSocketOpenEvent = this.createBaseEvent(\"open\");\n this.dispatchEvent(\"open\", event);\n if (!this._closeEventDispatched && this._pendingMessages.length > 0) {\n const pending = this._pendingMessages;\n this._pendingMessages = [];\n for (const data of pending) {\n this.dispatchMessageEvent(this.toMessageEventData(data));\n }\n }\n }\n\n private dispatchMessageEvent(data: string | Buffer | ArrayBuffer | Blob): void {\n const event: WebSocketMessageEvent = {\n ...this.createBaseEvent(\"message\"),\n data,\n };\n this.dispatchEvent(\"message\", event);\n }\n\n private dispatchCloseEvent(event: WebSocketCloseEvent): void {\n this.dispatchEvent(\"close\", event);\n }\n\n private dispatchErrorEvent(message?: string): void {\n const event: WebSocketErrorEvent = {\n ...this.createBaseEvent(\"error\"),\n ...(message !== undefined && { message }),\n };\n this.dispatchEvent(\"error\", event);\n }\n\n private handleNativeMessage(data: string | Buffer): void {\n if (this._closeEventDispatched) {\n return;\n }\n\n this._legacyCallbacks?.onMessage?.(data);\n if (!this._openEventDispatched && this.readyState === WebSocket.OPEN) {\n this._pendingMessages.push(data);\n return;\n }\n this.dispatchMessageEvent(this.toMessageEventData(data));\n }\n\n private handleNativeError(message: string): void {\n this._legacyCallbacks?.onError?.(message);\n this.dispatchErrorEvent(message);\n }\n\n private handleNativeClose(event: NativeWebSocketCloseEvent): void {\n const wasClean = this.readyState === WebSocket.CLOSING || event.code === 1000;\n this.finalizeClosed(event, wasClean);\n }\n\n private finalizeClosed(event: NativeWebSocketCloseEvent, wasClean: boolean): void {\n if (this._closeEventDispatched) {\n return;\n }\n\n this.readyState = WebSocket.CLOSED;\n this._closeEventDispatched = true;\n this._pendingMessages = [];\n this.releaseConnectionTracking();\n\n const closeEvent: WebSocketCloseEvent = {\n ...this.createBaseEvent(\"close\"),\n code: event.code,\n reason: event.reason,\n wasClean,\n };\n\n this._legacyCallbacks?.onClose?.(closeEvent);\n this.dispatchCloseEvent(closeEvent);\n }\n\n private startNativeClose(): void {\n if (this._nativeCloseStarted || !this._connection) {\n return;\n }\n this._nativeCloseStarted = true;\n const connection = this._connection;\n const closeOptions = this._closeOptions;\n\n void nativeBinding.websocketClose(connection, closeOptions).catch((error) => {\n this.handleNativeError(String(error));\n this.finalizeClosed({ code: 1006, reason: \"\" }, false);\n });\n }\n\n addEventListener(\n type: \"open\",\n listener: ((event: WebSocketOpenEvent) => void) | null,\n options?: WebSocketAddEventListenerOptions,\n ): void;\n addEventListener(\n type: \"message\",\n listener: ((event: WebSocketMessageEvent) => void) | null,\n options?: WebSocketAddEventListenerOptions,\n ): void;\n addEventListener(\n type: \"close\",\n listener: ((event: WebSocketCloseEvent) => void) | null,\n options?: WebSocketAddEventListenerOptions,\n ): void;\n addEventListener(\n type: \"error\",\n listener: ((event: WebSocketErrorEvent) => void) | null,\n options?: WebSocketAddEventListenerOptions,\n ): void;\n addEventListener(type: string, listener: unknown, options?: WebSocketAddEventListenerOptions): void;\n addEventListener(type: string, listener: unknown, options?: WebSocketAddEventListenerOptions): void {\n if (!listener || !isWebSocketListenerType(type)) {\n return;\n }\n\n const normalizedListener = listener as WebSocketListener;\n if (\n typeof normalizedListener !== \"function\" &&\n (typeof normalizedListener !== \"object\" ||\n normalizedListener === null ||\n typeof normalizedListener.handleEvent !== \"function\")\n ) {\n return;\n }\n const listenerMap = this.getListenerMap(type);\n if (listenerMap.has(normalizedListener)) {\n return;\n }\n\n const parsedOptions = typeof options === \"boolean\" ? {} : (options ?? {});\n const once = parsedOptions.once === true;\n const signal = parsedOptions.signal;\n\n if (signal?.aborted) {\n return;\n }\n\n const descriptor: WebSocketListenerDescriptor = {\n listener: normalizedListener,\n order: ++this._listenerOrderCounter,\n once,\n };\n\n if (signal) {\n const onAbort = () => {\n this.removeEventListener(type, normalizedListener);\n };\n descriptor.abortSignal = signal;\n descriptor.abortHandler = onAbort;\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n listenerMap.set(normalizedListener, descriptor);\n }\n\n removeEventListener(type: \"open\", listener: ((event: WebSocketOpenEvent) => void) | null): void;\n removeEventListener(type: \"message\", listener: ((event: WebSocketMessageEvent) => void) | null): void;\n removeEventListener(type: \"close\", listener: ((event: WebSocketCloseEvent) => void) | null): void;\n removeEventListener(type: \"error\", listener: ((event: WebSocketErrorEvent) => void) | null): void;\n removeEventListener(type: string, listener: unknown): void;\n removeEventListener(type: string, listener: unknown): void {\n if (!listener || !isWebSocketListenerType(type)) {\n return;\n }\n\n const normalizedListener = listener as WebSocketListener;\n if (typeof normalizedListener !== \"function\" && typeof normalizedListener !== \"object\") {\n return;\n }\n const listenerMap = this.getListenerMap(type);\n const descriptor = listenerMap.get(normalizedListener);\n if (!descriptor) {\n return;\n }\n\n if (descriptor.abortSignal && descriptor.abortHandler) {\n descriptor.abortSignal.removeEventListener(\"abort\", descriptor.abortHandler);\n }\n\n listenerMap.delete(normalizedListener);\n }\n\n private getSendByteLength(data: string | Buffer | ArrayBuffer | ArrayBufferView | Blob): number {\n if (typeof data === \"string\") {\n return Buffer.byteLength(data);\n }\n if (Buffer.isBuffer(data)) {\n return data.byteLength;\n }\n if (data instanceof ArrayBuffer) {\n return data.byteLength;\n }\n if (ArrayBuffer.isView(data)) {\n return data.byteLength;\n }\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return data.size;\n }\n\n throw new TypeError(\"WebSocket data must be a string, Buffer, ArrayBuffer, ArrayBufferView, or Blob\");\n }\n\n private async normalizeSendPayload(\n data: string | Buffer | ArrayBuffer | ArrayBufferView | Blob,\n ): Promise<string | Buffer> {\n if (typeof data === \"string\") {\n return data;\n }\n if (Buffer.isBuffer(data)) {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data);\n }\n if (ArrayBuffer.isView(data)) {\n return Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n }\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return Buffer.from(await data.arrayBuffer());\n }\n\n throw new TypeError(\"WebSocket data must be a string, Buffer, ArrayBuffer, ArrayBufferView, or Blob\");\n }\n\n send(data: string | Buffer | ArrayBuffer | ArrayBufferView | Blob): void {\n if (this.readyState !== WebSocket.OPEN || !this._connection) {\n throw new RequestError(\"WebSocket is not open\");\n }\n\n const queuedBytes = this.getSendByteLength(data);\n const connection = this._connection;\n this._bufferedAmount += queuedBytes;\n const sendTask = async () => {\n try {\n const payload = await this.normalizeSendPayload(data);\n await nativeBinding.websocketSend(connection, payload);\n } catch (error) {\n this.handleNativeError(String(error));\n this.finalizeClosed({ code: 1006, reason: \"\" }, false);\n } finally {\n this._bufferedAmount = Math.max(0, this._bufferedAmount - queuedBytes);\n }\n };\n this._sendChain = this._sendChain.then(sendTask, sendTask);\n }\n\n close(code?: number, reason?: string): void {\n if (this.readyState === WebSocket.CLOSING || this.readyState === WebSocket.CLOSED) {\n return;\n }\n\n this._closeOptions = normalizeWebSocketCloseOptions(code, reason);\n this.readyState = WebSocket.CLOSING;\n this.startNativeClose();\n }\n}\n\nfunction isInternalWebSocketInit(value: unknown): value is InternalWebSocketInit {\n if (!isPlainObject(value)) {\n return false;\n }\n\n const candidate = value as Partial<InternalWebSocketInit>;\n return candidate._internal === true && typeof candidate.url === \"string\" && typeof candidate.connect === \"function\";\n}\n\nfunction normalizeStandaloneWebSocketArgs(\n urlOrOptions: string | URL | LegacyWebSocketOptions,\n options?: WebSocketOptions,\n): { url: string; options: WebSocketOptions; legacyCallbacks: LegacyWebSocketCallbacks | undefined } {\n if (typeof urlOrOptions === \"string\" || urlOrOptions instanceof URL) {\n const normalizedOptions = normalizeStandaloneWebSocketOptions(options);\n return {\n url: normalizeWebSocketUrl(urlOrOptions),\n options: normalizedOptions,\n legacyCallbacks: extractLegacyWebSocketCallbacks(options),\n };\n }\n\n const legacy = urlOrOptions;\n const normalizedOptions = normalizeStandaloneWebSocketOptions(legacy);\n return {\n url: normalizeWebSocketUrl(legacy.url),\n options: normalizedOptions,\n legacyCallbacks: extractLegacyWebSocketCallbacks(legacy),\n };\n}\n\nfunction normalizeSessionWebSocketArgs(\n urlOrOptions: string | URL | LegacySessionWebSocketOptions,\n options?: SessionWebSocketOptions,\n): { url: string; options: SessionWebSocketOptions; legacyCallbacks: LegacyWebSocketCallbacks | undefined } {\n if (typeof urlOrOptions === \"string\" || urlOrOptions instanceof URL) {\n const normalizedOptions = normalizeSessionWebSocketOptions(options);\n return {\n url: normalizeWebSocketUrl(urlOrOptions),\n options: normalizedOptions,\n legacyCallbacks: extractLegacyWebSocketCallbacks(options),\n };\n }\n\n const legacy = urlOrOptions;\n const normalizedOptions = normalizeSessionWebSocketOptions(legacy);\n return {\n url: normalizeWebSocketUrl(legacy.url),\n options: normalizedOptions,\n legacyCallbacks: extractLegacyWebSocketCallbacks(legacy),\n };\n}\n\n/**\n * Create a WebSocket connection with browser impersonation.\n */\nexport async function websocket(url: string | URL, options?: WebSocketOptions): Promise<WebSocket>;\nexport async function websocket(options: LegacyWebSocketOptions): Promise<WebSocket>;\nexport async function websocket(\n urlOrOptions: string | URL | LegacyWebSocketOptions,\n options?: WebSocketOptions,\n): Promise<WebSocket> {\n const normalized = normalizeStandaloneWebSocketArgs(urlOrOptions, options);\n validateWebSocketProtocols(normalized.options.protocols);\n assertNoManualWebSocketProtocolHeader(normalized.options.headers);\n validateBrowserProfile(normalized.options.browser);\n const os = normalized.options.os ?? DEFAULT_OS;\n validateOperatingSystem(os);\n const browser = normalized.options.browser ?? DEFAULT_BROWSER;\n const protocols = normalizeWebSocketProtocolList(normalized.options.protocols);\n\n return WebSocket._connectWithInit({\n _internal: true,\n url: normalized.url,\n options: normalized.options,\n openDispatchMode: \"deferred\",\n connect: (callbacks) =>\n nativeBinding.websocketConnect({\n url: normalized.url,\n browser,\n os,\n headers: headersToTuples(normalized.options.headers ?? {}),\n ...(protocols && protocols.length > 0 && { protocols }),\n ...(normalized.options.proxy !== undefined && { proxy: normalized.options.proxy }),\n onMessage: callbacks.onMessage,\n onClose: callbacks.onClose,\n onError: callbacks.onError,\n }),\n legacyCallbacks: normalized.legacyCallbacks,\n });\n}\n\nexport type {\n BodyInit,\n BrowserProfile,\n CookieMode,\n CreateSessionOptions,\n CreateTransportOptions,\n EmulationOS,\n HeadersInit,\n RequestInit,\n RequestOptions,\n SessionHandle,\n SessionWebSocketOptions,\n WebSocketBinaryType,\n WebSocketCloseEvent,\n WebSocketErrorEvent,\n WebSocketEventType,\n WebSocketMessageEvent,\n WebSocketOpenEvent,\n WebSocketOptions,\n} from \"./types.js\";\n\nexport { RequestError };\n\nexport default {\n fetch,\n request,\n get,\n post,\n getProfiles,\n getOperatingSystems,\n createTransport,\n createSession,\n withSession,\n websocket,\n WebSocket,\n Headers,\n Response,\n Transport,\n Session,\n RequestError,\n};\n","// Import and re-export the auto-generated BrowserProfile and EmulationOS types\nimport type { BrowserProfile, EmulationOS } from \"./generated-types.js\";\nimport type { Session, Transport, WebSocket } from \"./wreq-js.js\";\nexport type { BrowserProfile, EmulationOS };\n\n/**\n * Controls how cookies are scoped for a request.\n * - \"session\": reuse an explicit Session or sessionId across calls.\n * - \"ephemeral\": create an isolated, single-use session.\n */\nexport type CookieMode = \"session\" | \"ephemeral\";\n\n/**\n * Minimal handle implemented by {@link Session}. Exposed for integrations\n * that only need to carry a session id.\n */\nexport interface SessionHandle {\n readonly id: string;\n}\n\n/**\n * A tuple of [name, value] pairs used for initializing headers.\n * Both name and value must be strings.\n *\n * @example\n * ```typescript\n * const headers: HeaderTuple = ['Content-Type', 'application/json'];\n * ```\n */\nexport type HeaderTuple = [string, string];\n\n/**\n * Represents various input types accepted when creating or initializing headers.\n * Can be an iterable of header tuples, an array of tuples, or a plain object.\n *\n * @example\n * ```typescript\n * // As an object\n * const headers: HeadersInit = { 'Content-Type': 'application/json' };\n *\n * // As an array of tuples\n * const headers: HeadersInit = [['Content-Type', 'application/json']];\n *\n * // As an iterable\n * const headers: HeadersInit = new Map([['Content-Type', 'application/json']]);\n * ```\n */\nexport type HeadersInit =\n | Iterable<HeaderTuple>\n | Array<HeaderTuple>\n | Record<string, string | number | boolean | null | undefined>;\n\n/**\n * Represents the various types of data that can be used as a request body.\n * Supports strings, binary payloads, URL-encoded parameters, multipart forms, and blobs.\n *\n * @example\n * ```typescript\n * // String body\n * const body: BodyInit = JSON.stringify({ key: 'value' });\n *\n * // URLSearchParams\n * const body: BodyInit = new URLSearchParams({ key: 'value' });\n *\n * // Buffer\n * const body: BodyInit = Buffer.from('data');\n *\n * // FormData\n * const body: BodyInit = new FormData();\n * ```\n */\nexport type BodyInit = string | ArrayBuffer | ArrayBufferView | URLSearchParams | Buffer | Blob | FormData;\n\n/**\n * Details about why a WebSocket connection closed.\n */\nexport type WebSocketBinaryType = \"nodebuffer\" | \"arraybuffer\" | \"blob\";\n\nexport type WebSocketEventType = \"open\" | \"message\" | \"close\" | \"error\";\n\nexport interface WebSocketOpenEvent {\n type: \"open\";\n isTrusted: false;\n timeStamp: number;\n target: WebSocket;\n currentTarget: WebSocket;\n}\n\nexport interface WebSocketMessageEvent {\n type: \"message\";\n isTrusted: false;\n timeStamp: number;\n data: string | Buffer | ArrayBuffer | Blob;\n target: WebSocket;\n currentTarget: WebSocket;\n}\n\nexport interface WebSocketErrorEvent {\n type: \"error\";\n isTrusted: false;\n timeStamp: number;\n message?: string;\n target: WebSocket;\n currentTarget: WebSocket;\n}\n\nexport interface WebSocketCloseEvent {\n type: \"close\";\n isTrusted: false;\n timeStamp: number;\n\n /**\n * WebSocket close status code (RFC 6455).\n */\n code: number;\n\n /**\n * UTF-8 close reason sent by the peer.\n */\n reason: string;\n\n wasClean: boolean;\n target: WebSocket;\n currentTarget: WebSocket;\n}\n\n/**\n * Options for configuring a fetch style request with wreq-specific extensions\n * for browser impersonation, proxies, sessions, and timeouts.\n *\n * @example\n * ```typescript\n * const options: RequestInit = {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ key: 'value' }),\n * browser: 'chrome_142',\n * proxy: 'http://proxy.example.com:8080',\n * timeout: 5000\n * };\n * ```\n */\nexport interface RequestInit {\n /**\n * A string to set request's method.\n * @default 'GET'\n */\n method?: string;\n\n /**\n * A Headers object, an object literal, or an array of two-item arrays to set request's headers.\n */\n headers?: HeadersInit;\n\n /**\n * A BodyInit object or null to set request's body.\n */\n body?: BodyInit | null;\n\n /**\n * An AbortSignal to set request's signal.\n */\n signal?: AbortSignal | null;\n\n /**\n * A string indicating whether request follows redirects, results in an error upon\n * encountering a redirect, or returns the redirect (in an opaque fashion).\n * @default 'follow'\n */\n redirect?: \"follow\" | \"manual\" | \"error\";\n\n /**\n * Transport instance to use for this request. When provided, transport-level\n * options such as `browser`, `os`, `proxy`, and `insecure` must not be set.\n */\n transport?: Transport;\n\n /**\n * Browser profile to impersonate for this request.\n * Applies browser profile behavior handled by the native layer.\n * Ignored when `transport` is provided.\n * @default 'chrome_142'\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to emulate for this request.\n * Influences platform-specific behavior handled by the native layer.\n * Ignored when `transport` is provided.\n * @default 'macos'\n */\n os?: EmulationOS;\n\n /**\n * Proxy URL to route the request through (e.g., 'http://proxy.example.com:8080').\n * Proxy support depends on the native layer and proxy scheme.\n * Ignored when `transport` is provided.\n */\n proxy?: string;\n\n /**\n * Request timeout in milliseconds. If the request takes longer than this value,\n * it will be aborted.\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Controls how cookies are managed for this call.\n * - \"ephemeral\": default when no session/sessionId is provided. Creates an isolated session per request.\n * - \"session\": requires an explicit session or sessionId and reuses its cookie jar.\n */\n cookieMode?: CookieMode;\n\n /**\n * Session instance to bind this request to. When provided, {@link cookieMode}\n * automatically behaves like `\"session\"`.\n */\n session?: Session;\n\n /**\n * Identifier of an existing session created elsewhere (e.g., via {@link createSession}).\n */\n sessionId?: string;\n\n /**\n * Disable default headers from browser emulation. When enabled, only explicitly\n * provided headers will be sent with the request, preventing emulation headers\n * from being automatically added or appended.\n * @default false\n */\n disableDefaultHeaders?: boolean;\n\n /**\n * Disable HTTPS certificate verification. When enabled, self-signed and invalid\n * certificates will be accepted.\n * Ignored when `transport` is provided.\n *\n * # Warning\n *\n * You should think very carefully before using this method. If invalid\n * certificates are trusted, *any* certificate for *any* site will be\n * trusted for use. This includes expired certificates. This introduces\n * significant vulnerabilities, and should only be used as a last resort.\n *\n * @default false\n */\n insecure?: boolean;\n\n /**\n * Whether to automatically decompress response bodies. When set to `false`,\n * the raw compressed response body is returned as-is and the `Content-Encoding`\n * header is preserved. Useful for proxy scenarios where the downstream client\n * handles decompression.\n * @default true\n */\n compress?: boolean;\n}\n\n/**\n * Configuration for {@link createSession}.\n */\nexport interface CreateSessionOptions {\n /**\n * Provide a custom identifier instead of an auto-generated random ID.\n */\n sessionId?: string;\n\n /**\n * Default headers applied to every request made through this session.\n */\n defaultHeaders?: HeadersInit;\n\n /**\n * Browser profile to bind to this session. Defaults to 'chrome_142'.\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to bind to this session. Defaults to 'macos'.\n */\n os?: EmulationOS;\n /**\n * Optional proxy for every request made through the session.\n */\n proxy?: string;\n /**\n * Default timeout applied when {@link Session.fetch} is called without\n * overriding `timeout`.\n */\n timeout?: number;\n\n /**\n * Disable HTTPS certificate verification. When enabled, self-signed and invalid\n * certificates will be accepted for all requests made through this session.\n *\n * # Warning\n *\n * You should think very carefully before using this method. If invalid\n * certificates are trusted, *any* certificate for *any* site will be\n * trusted for use. This includes expired certificates. This introduces\n * significant vulnerabilities, and should only be used as a last resort.\n *\n * @default false\n */\n insecure?: boolean;\n}\n\n/**\n * Configuration for {@link createTransport}.\n */\nexport interface CreateTransportOptions {\n /**\n * Proxy URL to route requests through (e.g., 'http://proxy.example.com:8080').\n */\n proxy?: string;\n\n /**\n * Browser profile to impersonate for this transport.\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to emulate for this transport.\n */\n os?: EmulationOS;\n\n /**\n * Disable HTTPS certificate verification for this transport.\n */\n insecure?: boolean;\n\n /**\n * Idle timeout for pooled connections (ms).\n */\n poolIdleTimeout?: number;\n\n /**\n * Maximum number of idle connections per host.\n */\n poolMaxIdlePerHost?: number;\n\n /**\n * Maximum total connections in the pool.\n */\n poolMaxSize?: number;\n\n /**\n * TCP connect timeout (ms).\n */\n connectTimeout?: number;\n\n /**\n * Read timeout (ms).\n */\n readTimeout?: number;\n}\n\n/**\n * Legacy request options interface. This interface is deprecated and will be removed in a future version.\n *\n * @deprecated Use {@link RequestInit} with the standard `fetch()` API instead.\n *\n * @example\n * ```typescript\n * // Old (deprecated):\n * const options: RequestOptions = {\n * url: 'https://api.example.com',\n * method: 'POST',\n * body: JSON.stringify({ data: 'value' })\n * };\n *\n * // New (recommended):\n * const response = await fetch('https://api.example.com', {\n * method: 'POST',\n * body: JSON.stringify({ data: 'value' })\n * });\n * ```\n */\nexport interface RequestOptions {\n /**\n * The URL to request.\n */\n url: string;\n\n /**\n * Browser profile to impersonate.\n * Applies browser profile behavior handled by the native layer.\n * @default 'chrome_142'\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to emulate.\n * @default 'macos'\n */\n os?: EmulationOS;\n\n /**\n * HTTP method to use for the request.\n * @default 'GET'\n */\n method?: string;\n\n /**\n * Additional headers to send with the request.\n * Browser-specific headers will be automatically added based on the selected browser profile.\n */\n headers?: Record<string, string> | HeaderTuple[];\n\n /**\n * Request body data (for POST, PUT, PATCH requests).\n */\n body?: BodyInit | null;\n\n /**\n * Transport instance to use for this request. When provided, transport-level\n * options such as `browser`, `os`, `proxy`, and `insecure` must not be set.\n */\n transport?: Transport;\n\n /**\n * Proxy URL to route the request through (e.g., 'http://proxy.example.com:8080').\n * Proxy support depends on the native layer and proxy scheme.\n */\n proxy?: string;\n\n /**\n * Redirect policy applied to this request. Matches the `redirect` option accepted by {@link fetch}.\n * @default \"follow\"\n */\n redirect?: \"follow\" | \"manual\" | \"error\";\n\n /**\n * Request timeout in milliseconds. If the request takes longer than this value,\n * it will be aborted.\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Signal used to abort the request.\n */\n signal?: AbortSignal | null;\n\n /**\n * Session instance to bind this request to.\n */\n session?: Session;\n\n /**\n * Controls cookie scoping behavior for this request.\n */\n cookieMode?: CookieMode;\n\n /**\n * Identifier for the session that should handle this request.\n * @internal\n */\n sessionId?: string;\n\n /**\n * Internal flag indicating whether the session should be discarded once the\n * request finishes.\n * @internal\n */\n ephemeral?: boolean;\n\n /**\n * Disable default headers from browser emulation. When enabled, only explicitly\n * provided headers will be sent with the request, preventing emulation headers\n * from being automatically added or appended.\n * @default false\n */\n disableDefaultHeaders?: boolean;\n\n /**\n * Disable HTTPS certificate verification. When enabled, self-signed and invalid\n * certificates will be accepted.\n *\n * # Warning\n *\n * You should think very carefully before using this method. If invalid\n * certificates are trusted, *any* certificate for *any* site will be\n * trusted for use. This includes expired certificates. This introduces\n * significant vulnerabilities, and should only be used as a last resort.\n *\n * @default false\n */\n insecure?: boolean;\n}\n\n/**\n * Internal response payload returned from the native Rust binding.\n * This interface represents the raw response data before it's converted\n * to a standard Response object.\n *\n * @internal\n */\nexport interface NativeResponse {\n /**\n * HTTP status code (e.g., 200, 404, 500).\n */\n status: number;\n\n /**\n * Response headers as [name, value] tuples.\n * Header names are normalized to lowercase.\n */\n headers: HeaderTuple[];\n\n /**\n * Handle for streaming response body chunks from the native layer.\n * When `null`, the response does not have a body (e.g., HEAD/204/304).\n */\n bodyHandle: number | null;\n\n /**\n * Inline body buffer returned for small payloads. When present, `bodyHandle`\n * will be `null` to avoid a second native round-trip to read the body.\n */\n bodyBytes: Buffer | null;\n\n /**\n * Optional Content-Length hint reported by the server after decompression.\n */\n contentLength: number | null;\n\n /**\n * Cookies set by the server as [name, value] tuples.\n */\n cookies: HeaderTuple[];\n\n /**\n * Final URL after following any redirects.\n * If no redirects occurred, this will match the original request URL.\n */\n url: string;\n}\n\n/**\n * Configuration options for creating a WebSocket connection.\n * Supports browser impersonation and proxies, similar to HTTP requests.\n *\n * @example\n * ```typescript\n * const ws = await websocket('wss://example.com/socket', {\n * browser: 'chrome_142',\n * headers: { 'Authorization': 'Bearer token' },\n * });\n *\n * ws.onmessage = (event) => {\n * console.log('Received:', event.data);\n * };\n * ```\n */\nexport interface WebSocketOptions {\n /**\n * Browser profile to impersonate for the WebSocket upgrade request.\n * Automatically applies browser-specific headers and TLS fingerprints.\n * @default 'chrome_142'\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to emulate for the WebSocket handshake.\n * @default 'macos'\n */\n os?: EmulationOS;\n\n /**\n * Additional headers to send with the WebSocket upgrade request.\n * Common headers include Authorization, Origin, or custom application headers.\n */\n headers?: HeadersInit;\n\n /**\n * Proxy URL to route the connection through (e.g., 'http://proxy.example.com:8080').\n * Proxy support depends on the native layer and proxy scheme.\n */\n proxy?: string;\n\n /**\n * Optional subprotocols for compatibility with the WHATWG WebSocket constructor.\n * Values are validated for non-empty, unique entries and sent in\n * the `Sec-WebSocket-Protocol` handshake header.\n */\n protocols?: string | string[];\n\n /**\n * Controls the binary payload type exposed via `MessageEvent.data`.\n * - \"nodebuffer\": delivers Node.js Buffer instances (default)\n * - \"arraybuffer\": delivers ArrayBuffer instances\n * - \"blob\": delivers Blob instances\n */\n binaryType?: WebSocketBinaryType;\n}\n\nexport interface LegacyWebSocketOptions extends WebSocketOptions {\n /**\n * @deprecated Use `websocket(url, options)` or `new WebSocket(...)`.\n */\n url: string;\n /**\n * @deprecated Use `onmessage` or `addEventListener(\"message\", ...)`.\n */\n onMessage?: (data: string | Buffer) => void;\n /**\n * @deprecated Use `onclose` or `addEventListener(\"close\", ...)`.\n */\n onClose?: (event: WebSocketCloseEvent) => void;\n /**\n * @deprecated Use `onerror` or `addEventListener(\"error\", ...)`.\n */\n onError?: (error: string) => void;\n}\n\nexport type SessionWebSocketOptions = Omit<WebSocketOptions, \"browser\" | \"os\" | \"proxy\">;\n\nexport interface LegacySessionWebSocketOptions extends SessionWebSocketOptions {\n /**\n * @deprecated Use `session.websocket(url, options)`.\n */\n url: string;\n /**\n * @deprecated Use `onmessage` or `addEventListener(\"message\", ...)`.\n */\n onMessage?: (data: string | Buffer) => void;\n /**\n * @deprecated Use `onclose` or `addEventListener(\"close\", ...)`.\n */\n onClose?: (event: WebSocketCloseEvent) => void;\n /**\n * @deprecated Use `onerror` or `addEventListener(\"error\", ...)`.\n */\n onError?: (error: string) => void;\n}\n\n/**\n * Internal WebSocket connection object returned from the native Rust binding.\n * This interface contains the connection ID used to reference the WebSocket\n * in subsequent operations like sending messages or closing the connection.\n *\n * @internal\n */\nexport interface NativeWebSocketConnection {\n /**\n * Unique identifier for this WebSocket connection.\n * Used internally to track and manage the connection.\n * @internal\n */\n _id: number;\n\n /**\n * Selected subprotocol returned by the server, when present.\n * @internal\n */\n protocol?: string;\n\n /**\n * Negotiated extension string returned by the server, when present.\n * @internal\n */\n extensions?: string;\n}\n\n/**\n * Error thrown when a request fails. This can occur due to network errors,\n * timeouts, invalid URLs, or other request-related issues.\n *\n * @example\n * ```typescript\n * try {\n * const response = await fetch('https://api.example.com');\n * } catch (error) {\n * if (error instanceof RequestError) {\n * console.error('Request failed:', error.message);\n * }\n * }\n * ```\n */\nexport class RequestError extends TypeError {\n constructor(message: string) {\n super(message);\n this.name = \"RequestError\";\n }\n}\n"],"mappings":"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","names":["require","error","requestId","payload","normalizedOptions"]}
|
|
1
|
+
{"version":3,"sources":["../src/wreq-js.ts","../src/types.ts"],"sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { STATUS_CODES } from \"node:http\";\nimport { createRequire } from \"node:module\";\nimport { Readable } from \"node:stream\";\nimport { ReadableStream } from \"node:stream/web\";\nimport type {\n AlpnProtocol,\n AlpsProtocol,\n BodyInit,\n BrowserProfile,\n CookieMode,\n CreateSessionOptions,\n CreateTransportOptions,\n CustomEmulationOptions,\n CustomHttp1Options,\n CustomHttp2Options,\n CustomTlsOptions,\n EmulationOS,\n HeadersInit,\n HeaderTuple,\n Http2ExperimentalSetting,\n Http2Priority,\n Http2PseudoHeaderId,\n Http2SettingId,\n Http2StreamDependency,\n LegacySessionWebSocketOptions,\n LegacyWebSocketOptions,\n NativeResponse,\n NativeWebSocketConnection,\n RequestOptions,\n SessionHandle,\n SessionWebSocketOptions,\n TlsVersion,\n WebSocketBinaryType,\n WebSocketCloseEvent,\n WebSocketErrorEvent,\n WebSocketMessageEvent,\n WebSocketOpenEvent,\n WebSocketOptions,\n RequestInit as WreqRequestInit,\n} from \"./types.js\";\nimport { RequestError } from \"./types.js\";\n\ninterface NativeWebSocketCloseEvent {\n code: number;\n reason: string;\n}\n\ninterface NativeWebSocketCloseOptions {\n code?: number;\n reason?: string;\n}\n\ninterface NativeWebSocketOptions {\n url: string;\n browser?: BrowserProfile;\n os?: EmulationOS;\n emulationJson?: string;\n headers: HeaderTuple[];\n protocols?: string[];\n proxy?: string;\n onMessage: (data: string | Buffer) => void;\n onClose?: (event: NativeWebSocketCloseEvent) => void;\n onError?: (error: string) => void;\n}\n\ninterface NativeWebSocketSessionOptions {\n url: string;\n sessionId: string;\n transportId: string;\n headers: HeaderTuple[];\n protocols?: string[];\n onMessage: (data: string | Buffer) => void;\n onClose?: (event: NativeWebSocketCloseEvent) => void;\n onError?: (error: string) => void;\n}\n\ninterface NativeSessionOptions {\n sessionId: string;\n}\n\ninterface NativeTransportOptions {\n browser?: BrowserProfile;\n os?: EmulationOS;\n emulationJson?: string;\n proxy?: string;\n insecure?: boolean;\n poolIdleTimeout?: number;\n poolMaxIdlePerHost?: number;\n poolMaxSize?: number;\n connectTimeout?: number;\n readTimeout?: number;\n}\n\ninterface NativeRequestOptions {\n url: string;\n method: string;\n browser?: BrowserProfile;\n os?: EmulationOS;\n emulationJson?: string;\n headers?: HeaderTuple[];\n body?: Buffer;\n proxy?: string;\n timeout?: number;\n redirect?: \"follow\" | \"manual\" | \"error\";\n sessionId: string;\n ephemeral: boolean;\n disableDefaultHeaders?: boolean;\n insecure?: boolean;\n transportId?: string;\n compress?: boolean;\n}\n\nlet nativeBinding: {\n request: (options: NativeRequestOptions, requestId: number, enableCancellation?: boolean) => Promise<NativeResponse>;\n cancelRequest: (requestId: number) => void;\n readBodyChunk: (handleId: number) => Promise<Buffer | null>;\n readBodyAll: (handleId: number) => Promise<Buffer>;\n cancelBody: (handleId: number) => void;\n getProfiles: () => string[];\n websocketConnect: (options: NativeWebSocketOptions) => Promise<NativeWebSocketConnection>;\n websocketConnectSession: (options: NativeWebSocketSessionOptions) => Promise<NativeWebSocketConnection>;\n websocketSend: (ws: NativeWebSocketConnection, data: string | Buffer) => Promise<void>;\n websocketClose: (ws: NativeWebSocketConnection, options?: NativeWebSocketCloseOptions) => Promise<void>;\n createSession: (options: NativeSessionOptions) => string;\n clearSession: (sessionId: string) => void;\n dropSession: (sessionId: string) => void;\n getCookies: (sessionId: string, url: string) => Record<string, string>;\n setCookie: (sessionId: string, name: string, value: string, url: string) => void;\n createTransport: (options: NativeTransportOptions) => string;\n dropTransport: (transportId: string) => void;\n getOperatingSystems?: () => string[];\n};\n\nlet cachedProfiles: BrowserProfile[] | undefined;\nlet cachedProfileSet: Set<string> | undefined;\nlet cachedOperatingSystems: EmulationOS[] | undefined;\nlet cachedOperatingSystemSet: Set<string> | undefined;\n\nfunction detectLibc(): \"gnu\" | \"musl\" | undefined {\n if (process.platform !== \"linux\") {\n return undefined;\n }\n\n const envLibc = process.env.LIBC ?? process.env.npm_config_libc;\n if (envLibc) {\n return envLibc.toLowerCase().includes(\"musl\") ? \"musl\" : \"gnu\";\n }\n\n try {\n const report = process.report?.getReport?.() as { header?: { glibcVersionRuntime?: string } } | undefined;\n const glibcVersion = report?.header?.glibcVersionRuntime;\n\n if (glibcVersion) {\n return \"gnu\";\n }\n\n return \"musl\";\n } catch {\n return \"gnu\";\n }\n}\n\nconst require =\n typeof import.meta !== \"undefined\" && import.meta.url ? createRequire(import.meta.url) : createRequire(__filename);\n\nfunction loadNativeBinding() {\n const platform = process.platform;\n const arch = process.arch;\n const libc = detectLibc();\n\n const platformArchMap: Record<string, Record<string, string | Record<\"gnu\" | \"musl\", string>>> = {\n darwin: { x64: \"darwin-x64\", arm64: \"darwin-arm64\" },\n linux: {\n x64: { gnu: \"linux-x64-gnu\", musl: \"linux-x64-musl\" },\n arm64: \"linux-arm64-gnu\",\n },\n win32: { x64: \"win32-x64-msvc\" },\n };\n\n const platformArchMapEntry = platformArchMap[platform]?.[arch];\n const platformArch =\n typeof platformArchMapEntry === \"string\"\n ? platformArchMapEntry\n : platformArchMapEntry?.[(libc ?? \"gnu\") as \"gnu\" | \"musl\"];\n\n if (!platformArch) {\n throw new Error(\n `Unsupported platform: ${platform}-${arch}${libc ? `-${libc}` : \"\"}. ` +\n `Supported platforms: darwin-x64, darwin-arm64, linux-x64-gnu, linux-x64-musl, ` +\n `linux-arm64-gnu, win32-x64-msvc`,\n );\n }\n\n const binaryName = `wreq-js.${platformArch}.node`;\n\n try {\n return require(`../rust/${binaryName}`);\n } catch {\n try {\n return require(\"../rust/wreq-js.node\");\n } catch {\n throw new Error(\n `Failed to load native module for ${platform}-${arch}. ` +\n `Tried: ../rust/${binaryName} and ../rust/wreq-js.node. ` +\n `Make sure the package is installed correctly and the native module is built for your platform.`,\n );\n }\n }\n}\n\nnativeBinding = loadNativeBinding();\n\nconst websocketFinalizer =\n typeof FinalizationRegistry === \"function\"\n ? new FinalizationRegistry<NativeWebSocketConnection>((connection: NativeWebSocketConnection) => {\n void nativeBinding.websocketClose(connection).catch(() => undefined);\n })\n : undefined;\n\ntype NativeBodyHandle = { id: number; released: boolean };\n\nconst bodyHandleFinalizer =\n typeof FinalizationRegistry === \"function\"\n ? new FinalizationRegistry<NativeBodyHandle>((handle: NativeBodyHandle) => {\n if (handle.released) {\n return;\n }\n\n handle.released = true;\n try {\n nativeBinding.cancelBody(handle.id);\n } catch {\n // Best-effort cleanup; ignore binding-level failures.\n }\n })\n : undefined;\n\nconst DEFAULT_BROWSER: BrowserProfile = \"chrome_142\";\nconst DEFAULT_OS: EmulationOS = \"macos\";\nconst DEFAULT_REQUEST_TIMEOUT_MS = 300_000;\nconst SUPPORTED_OSES: readonly EmulationOS[] = [\"windows\", \"macos\", \"linux\", \"android\", \"ios\"];\nconst UTF8_DECODER = new TextDecoder(\"utf-8\");\n\ntype SessionDefaults = {\n transportMode: ResolvedEmulationMode;\n proxy?: string;\n timeout?: number;\n insecure?: boolean;\n defaultHeaders?: HeaderTuple[];\n transportId?: string;\n ownsTransport?: boolean;\n};\n\ntype SessionResolution = {\n sessionId: string;\n cookieMode: CookieMode;\n dropAfterRequest: boolean;\n defaults?: SessionDefaults;\n};\n\ntype TransportResolution = {\n transportId?: string;\n mode?: ResolvedEmulationMode;\n proxy?: string;\n insecure?: boolean;\n};\n\ntype SerializedCustomEmulation = {\n tlsOptions?: CustomTlsOptions;\n http1Options?: CustomHttp1Options;\n http2Options?: CustomHttp2Options;\n headers?: HeaderTuple[];\n origHeaders?: string[];\n};\n\ntype PresetEmulationMode = {\n kind: \"preset\";\n browser: BrowserProfile;\n os: EmulationOS;\n emulationJson?: string;\n};\n\ntype CustomEmulationMode = {\n kind: \"custom\";\n emulationJson: string;\n};\n\ntype ResolvedEmulationMode = PresetEmulationMode | CustomEmulationMode;\n\ntype LegacyWebSocketCallbacks = {\n onMessage?: (data: string | Buffer) => void;\n onClose?: (event: WebSocketCloseEvent) => void;\n onError?: (error: string) => void;\n};\n\ntype WebSocketOpenDispatchMode = \"automatic\" | \"deferred\";\n\ntype InternalWebSocketInit = {\n readonly _internal: true;\n url: string;\n options: WebSocketOptions;\n openDispatchMode: WebSocketOpenDispatchMode;\n connect: (callbacks: {\n onMessage: (data: string | Buffer) => void;\n onClose: (event: NativeWebSocketCloseEvent) => void;\n onError: (message: string) => void;\n }) => Promise<NativeWebSocketConnection>;\n legacyCallbacks: LegacyWebSocketCallbacks | undefined;\n};\n\n// Persistent sessions need globally-unique IDs; ephemeral ones only need a\n// placeholder that is never looked up again, so a cheap monotonic counter suffices.\nlet ephemeralIdCounter = 0;\nfunction generateEphemeralSessionId(): string {\n return `_e${++ephemeralIdCounter}`;\n}\n\nfunction generateSessionId(): string {\n return randomUUID();\n}\n\nfunction normalizeSessionOptions(options?: CreateSessionOptions): { sessionId: string; defaults: SessionDefaults } {\n const sessionId = options?.sessionId ?? generateSessionId();\n const defaults: SessionDefaults = {\n transportMode: resolveEmulationMode(options?.browser, options?.os, options?.emulation),\n };\n\n if (options?.proxy !== undefined) {\n defaults.proxy = options.proxy;\n }\n\n if (options?.timeout !== undefined) {\n validateTimeout(options.timeout);\n defaults.timeout = options.timeout;\n }\n\n if (options?.insecure !== undefined) {\n defaults.insecure = options.insecure;\n }\n\n if (options?.defaultHeaders !== undefined) {\n defaults.defaultHeaders = headersToTuples(options.defaultHeaders);\n }\n\n return { sessionId, defaults };\n}\n\ntype HeaderStoreEntry = {\n name: string;\n values: string[];\n};\n\nfunction isIterable<T>(value: unknown): value is Iterable<T> {\n return Boolean(value) && typeof (value as Iterable<T>)[Symbol.iterator] === \"function\";\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (typeof value !== \"object\" || value === null) {\n return false;\n }\n\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\nfunction coerceHeaderValue(value: unknown): string {\n return String(value);\n}\n\nexport class Headers implements Iterable<[string, string]> {\n private readonly store = new Map<string, HeaderStoreEntry>();\n\n constructor(init?: HeadersInit) {\n if (init) {\n this.applyInit(init);\n }\n }\n\n private applyInit(init: HeadersInit) {\n if (init instanceof Headers) {\n for (const [name, value] of init) {\n this.append(name, value);\n }\n return;\n }\n\n if (Array.isArray(init) || isIterable<[string, string]>(init)) {\n for (const tuple of init as Iterable<[string, string]>) {\n if (!tuple) {\n continue;\n }\n const [name, value] = tuple;\n this.append(name, value);\n }\n return;\n }\n\n if (isPlainObject(init)) {\n for (const [name, value] of Object.entries(init)) {\n if (value === undefined || value === null) {\n continue;\n }\n this.set(name, coerceHeaderValue(value));\n }\n }\n }\n\n private normalizeName(name: string): { key: string; display: string } {\n if (typeof name !== \"string\") {\n throw new TypeError(\"Header name must be a string\");\n }\n const trimmed = name.trim();\n if (!trimmed) {\n throw new TypeError(\"Header name must not be empty\");\n }\n return { key: trimmed.toLowerCase(), display: trimmed };\n }\n\n private assertValue(value: unknown): string {\n if (value === undefined || value === null) {\n throw new TypeError(\"Header value must not be null or undefined\");\n }\n\n return coerceHeaderValue(value);\n }\n\n append(name: string, value: unknown): void {\n const normalized = this.normalizeName(name);\n const existing = this.store.get(normalized.key);\n const coercedValue = this.assertValue(value);\n\n if (existing) {\n existing.values.push(coercedValue);\n return;\n }\n\n this.store.set(normalized.key, {\n name: normalized.display,\n values: [coercedValue],\n });\n }\n\n set(name: string, value: unknown): void {\n const normalized = this.normalizeName(name);\n const coercedValue = this.assertValue(value);\n\n this.store.set(normalized.key, {\n name: normalized.display,\n values: [coercedValue],\n });\n }\n\n get(name: string): string | null {\n const normalized = this.normalizeName(name);\n const entry = this.store.get(normalized.key);\n return entry ? entry.values.join(\", \") : null;\n }\n\n has(name: string): boolean {\n const normalized = this.normalizeName(name);\n return this.store.has(normalized.key);\n }\n\n delete(name: string): void {\n const normalized = this.normalizeName(name);\n this.store.delete(normalized.key);\n }\n\n entries(): IterableIterator<[string, string]> {\n return this[Symbol.iterator]();\n }\n\n *keys(): IterableIterator<string> {\n for (const [name] of this) {\n yield name;\n }\n }\n\n *values(): IterableIterator<string> {\n for (const [, value] of this) {\n yield value;\n }\n }\n\n forEach(callback: (value: string, name: string, parent: Headers) => void, thisArg?: unknown): void {\n for (const [name, value] of this) {\n callback.call(thisArg, value, name, this);\n }\n }\n\n [Symbol.iterator](): IterableIterator<[string, string]> {\n const generator = function* (store: Map<string, HeaderStoreEntry>) {\n for (const entry of store.values()) {\n yield [entry.name, entry.values.join(\", \")] as [string, string];\n }\n };\n\n return generator(this.store);\n }\n\n toObject(): Record<string, string> {\n const result: Record<string, string> = {};\n\n for (const [name, value] of this) {\n result[name] = value;\n }\n\n return result;\n }\n\n toTuples(): HeaderTuple[] {\n const result: HeaderTuple[] = [];\n\n for (const [name, value] of this) {\n result.push([name, value]);\n }\n\n return result;\n }\n}\n\nfunction headersToTuples(init: HeadersInit): HeaderTuple[] {\n return new Headers(init).toTuples();\n}\n\nfunction hasHeaderName(tuples: HeaderTuple[] | undefined, name: string): boolean {\n if (!tuples) {\n return false;\n }\n\n const target = name.toLowerCase();\n for (const [headerName] of tuples) {\n if (headerName.toLowerCase() === target) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction hasWebSocketProtocolHeader(headers: HeadersInit | undefined): boolean {\n const protocolHeaderName = \"Sec-WebSocket-Protocol\";\n if (!headers) {\n return false;\n }\n\n return hasHeaderName(headersToTuples(headers), protocolHeaderName);\n}\n\nfunction assertNoManualWebSocketProtocolHeader(headers: HeadersInit | undefined): void {\n if (hasWebSocketProtocolHeader(headers)) {\n throw new RequestError(\"Do not set `Sec-WebSocket-Protocol` header manually; use the `protocols` option instead.\");\n }\n}\n\nfunction normalizeWebSocketProtocolList(protocols?: string | string[]): string[] | undefined {\n if (protocols === undefined) {\n return undefined;\n }\n\n return typeof protocols === \"string\" ? [protocols] : [...protocols];\n}\n\nfunction mergeHeaderTuples(\n defaults: HeaderTuple[] | undefined,\n overrides: HeadersInit | undefined,\n): HeaderTuple[] | undefined {\n if (!defaults) {\n return overrides === undefined ? undefined : headersToTuples(overrides);\n }\n\n if (overrides === undefined) {\n return defaults;\n }\n\n const overrideTuples = headersToTuples(overrides);\n if (overrideTuples.length === 0) {\n return defaults;\n }\n\n const overrideKeys = new Set<string>();\n for (const tuple of overrideTuples) {\n overrideKeys.add(tuple[0].toLowerCase());\n }\n const merged: HeaderTuple[] = [];\n for (const tuple of defaults) {\n if (!overrideKeys.has(tuple[0].toLowerCase())) {\n merged.push(tuple);\n }\n }\n for (const tuple of overrideTuples) {\n merged.push(tuple);\n }\n return merged;\n}\n\ntype ResponseType = \"basic\" | \"cors\" | \"error\" | \"opaque\" | \"opaqueredirect\";\n\nfunction cloneNativeResponse(payload: NativeResponse): NativeResponse {\n return {\n status: payload.status,\n headers: payload.headers.map(([name, value]): HeaderTuple => [name, value]),\n bodyHandle: payload.bodyHandle,\n bodyBytes: payload.bodyBytes,\n contentLength: payload.contentLength,\n cookies: payload.cookies.map(([name, value]): HeaderTuple => [name, value]),\n url: payload.url,\n };\n}\n\nfunction releaseNativeBody(handle: NativeBodyHandle): void {\n if (handle.released) {\n return;\n }\n\n handle.released = true;\n\n try {\n nativeBinding.cancelBody(handle.id);\n } catch {\n // Best-effort cleanup; ignore binding errors.\n }\n\n bodyHandleFinalizer?.unregister(handle);\n}\n\nfunction markNativeBodyReleased(handle: NativeBodyHandle): void {\n if (handle.released) {\n return;\n }\n\n handle.released = true;\n bodyHandleFinalizer?.unregister(handle);\n}\n\nfunction createNativeBodyStream(handle: NativeBodyHandle): ReadableStream<Uint8Array> {\n const stream = new ReadableStream<Uint8Array>({\n async pull(controller) {\n try {\n const chunk = await nativeBinding.readBodyChunk(handle.id);\n\n if (chunk === null) {\n releaseNativeBody(handle);\n controller.close();\n return;\n }\n\n controller.enqueue(chunk);\n } catch (error) {\n releaseNativeBody(handle);\n controller.error(error);\n }\n },\n cancel() {\n releaseNativeBody(handle);\n },\n });\n\n bodyHandleFinalizer?.register(stream, handle, handle);\n\n return stream;\n}\n\nfunction wrapBodyStream(source: ReadableStream<Uint8Array>, onFirstUse: () => void): ReadableStream<Uint8Array> {\n let started = false;\n let reader: ReadableStreamDefaultReader<Uint8Array> | null = null;\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n if (!started) {\n started = true;\n onFirstUse();\n }\n\n if (!reader) {\n reader = source.getReader();\n }\n\n try {\n const { done, value } = await reader.read();\n\n if (done) {\n controller.close();\n return;\n }\n\n controller.enqueue(value);\n } catch (error) {\n controller.error(error);\n }\n },\n cancel(reason) {\n if (!reader) {\n return source.cancel(reason);\n }\n return reader.cancel(reason);\n },\n });\n}\n\nexport class Response {\n readonly status: number;\n readonly ok: boolean;\n readonly contentLength: number | null;\n readonly url: string;\n readonly type: ResponseType = \"basic\";\n bodyUsed = false;\n\n private readonly payload: NativeResponse;\n private readonly requestUrl: string;\n private redirectedMemo: boolean | undefined;\n private readonly headersInit: HeaderTuple[];\n private headersInstance: Headers | null;\n private readonly cookiesInit: HeaderTuple[];\n private cookiesRecord: Record<string, string | string[]> | null;\n private inlineBody: Buffer | null;\n private bodySource: ReadableStream<Uint8Array> | null;\n private bodyStream: ReadableStream<Uint8Array> | null | undefined;\n // Track if we can use the fast path (native handle not yet wrapped in a stream)\n private nativeHandleAvailable: boolean;\n private nativeHandle: NativeBodyHandle | null;\n\n constructor(payload: NativeResponse, requestUrl: string, bodySource?: ReadableStream<Uint8Array> | null) {\n this.payload = payload;\n this.requestUrl = requestUrl;\n this.status = this.payload.status;\n this.ok = this.status >= 200 && this.status < 300;\n this.headersInit = this.payload.headers;\n this.headersInstance = null;\n this.url = this.payload.url;\n this.cookiesInit = this.payload.cookies;\n this.cookiesRecord = null;\n this.contentLength = this.payload.contentLength ?? null;\n this.inlineBody = this.payload.bodyBytes ?? null;\n this.nativeHandle = null;\n\n if (typeof bodySource !== \"undefined\") {\n // External stream provided (e.g., from clone) - no fast path\n this.bodySource = bodySource;\n this.nativeHandleAvailable = false;\n } else if (this.inlineBody !== null) {\n // Inline body provided by native layer\n this.bodySource = null;\n this.nativeHandleAvailable = false;\n } else if (this.payload.bodyHandle !== null) {\n // Defer stream creation - we might use fast path instead\n this.bodySource = null;\n this.nativeHandleAvailable = true;\n this.nativeHandle = { id: this.payload.bodyHandle, released: false };\n bodyHandleFinalizer?.register(this, this.nativeHandle, this.nativeHandle);\n } else {\n this.bodySource = null;\n this.nativeHandleAvailable = false;\n }\n\n this.bodyStream = undefined;\n }\n\n get redirected(): boolean {\n if (this.redirectedMemo !== undefined) {\n return this.redirectedMemo;\n }\n\n if (this.url === this.requestUrl) {\n this.redirectedMemo = false;\n return false;\n }\n\n const normalizedRequestUrl = normalizeUrlForComparison(this.requestUrl);\n this.redirectedMemo = normalizedRequestUrl ? this.url !== normalizedRequestUrl : true;\n return this.redirectedMemo;\n }\n\n get statusText(): string {\n return STATUS_CODES[this.status] ?? \"\";\n }\n\n get headers(): Headers {\n if (!this.headersInstance) {\n this.headersInstance = new Headers(this.headersInit);\n }\n return this.headersInstance;\n }\n\n get cookies(): Record<string, string | string[]> {\n if (!this.cookiesRecord) {\n const record: Record<string, string | string[]> = Object.create(null);\n for (const [name, value] of this.cookiesInit) {\n const existing = record[name];\n if (existing === undefined) {\n record[name] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n record[name] = [existing, value];\n }\n }\n this.cookiesRecord = record;\n }\n\n return this.cookiesRecord;\n }\n\n get body(): ReadableStream<Uint8Array> | null {\n if (this.inlineBody && this.bodySource === null) {\n const bytes = this.inlineBody;\n this.inlineBody = null;\n this.bodySource = new ReadableStream<Uint8Array>({\n start(controller) {\n controller.enqueue(bytes);\n controller.close();\n },\n });\n }\n\n if (this.inlineBody === null && this.payload.bodyHandle === null && this.bodySource === null) {\n return null;\n }\n\n // Lazily create the stream if needed (disables fast path)\n if (this.bodySource === null && this.nativeHandleAvailable && this.payload.bodyHandle !== null) {\n if (this.nativeHandle) {\n bodyHandleFinalizer?.unregister(this.nativeHandle);\n }\n const handle = this.nativeHandle ?? { id: this.payload.bodyHandle, released: false };\n this.nativeHandle = handle;\n this.bodySource = createNativeBodyStream(handle);\n this.nativeHandleAvailable = false;\n }\n\n if (this.bodySource === null) {\n return null;\n }\n\n if (this.bodyStream === undefined) {\n this.bodyStream = wrapBodyStream(this.bodySource, () => {\n this.bodyUsed = true;\n });\n }\n\n return this.bodyStream;\n }\n\n async json<T = unknown>(): Promise<T> {\n const text = await this.text();\n return JSON.parse(text) as T;\n }\n\n async arrayBuffer(): Promise<ArrayBuffer> {\n const bytes = await this.consumeBody();\n const { buffer, byteOffset, byteLength } = bytes;\n\n if (buffer instanceof ArrayBuffer) {\n // Zero-copy when the Buffer owns the entire ArrayBuffer.\n if (byteOffset === 0 && byteLength === buffer.byteLength) {\n return buffer;\n }\n return buffer.slice(byteOffset, byteOffset + byteLength);\n }\n\n const view = new Uint8Array(byteLength);\n view.set(bytes);\n return view.buffer;\n }\n\n async text(): Promise<string> {\n const bytes = await this.consumeBody();\n return UTF8_DECODER.decode(bytes);\n }\n\n async blob(): Promise<Blob> {\n const bytes = await this.consumeBody();\n const contentType = this.headers.get(\"content-type\") ?? \"\";\n return new Blob([bytes], contentType ? { type: contentType } : undefined);\n }\n\n async formData(): Promise<FormData> {\n const bytes = await this.consumeBody();\n const contentType = this.headers.get(\"content-type\");\n const response = new globalThis.Response(\n bytes,\n contentType ? { headers: { \"content-type\": contentType } } : undefined,\n );\n return response.formData();\n }\n\n readable(): Readable {\n this.assertBodyAvailable();\n this.bodyUsed = true;\n\n const stream = this.body;\n\n if (stream === null) {\n return Readable.from([]);\n }\n\n return Readable.fromWeb(stream as ReadableStream);\n }\n\n clone(): Response {\n if (this.bodyUsed) {\n throw new TypeError(\"Cannot clone a Response whose body is already used\");\n }\n\n // If we still have the native handle (fast path), we need to create the stream first\n if (this.nativeHandleAvailable && this.payload.bodyHandle !== null) {\n if (this.nativeHandle) {\n bodyHandleFinalizer?.unregister(this.nativeHandle);\n }\n const handle = this.nativeHandle ?? { id: this.payload.bodyHandle, released: false };\n this.nativeHandle = handle;\n this.bodySource = createNativeBodyStream(handle);\n this.nativeHandleAvailable = false;\n }\n\n if (this.bodySource === null) {\n return new Response(cloneNativeResponse(this.payload), this.requestUrl, null);\n }\n\n const [branchA, branchB] = this.bodySource.tee();\n\n // Reset cached stream so the original response uses the new branch lazily.\n this.bodySource = branchA;\n this.bodyStream = undefined;\n\n return new Response(cloneNativeResponse(this.payload), this.requestUrl, branchB);\n }\n\n private assertBodyAvailable(): void {\n if (this.bodyUsed) {\n throw new TypeError(\"Response body is already used\");\n }\n }\n\n private async consumeBody(): Promise<Buffer> {\n this.assertBodyAvailable();\n this.bodyUsed = true;\n\n if (this.inlineBody) {\n const bytes = this.inlineBody;\n this.inlineBody = null;\n return bytes;\n }\n\n // Fast path: if native handle is still available, read entire body in one Rust call\n if (this.nativeHandleAvailable && this.payload.bodyHandle !== null) {\n this.nativeHandleAvailable = false;\n try {\n return await nativeBinding.readBodyAll(this.payload.bodyHandle);\n } catch (error) {\n // Handle already consumed or error\n if (String(error).includes(\"Body handle\") && String(error).includes(\"not found\")) {\n return Buffer.alloc(0);\n }\n throw error;\n } finally {\n if (this.nativeHandle) {\n markNativeBodyReleased(this.nativeHandle);\n }\n }\n }\n\n // Slow path: stream was accessed, use streaming consumption\n const stream = this.body;\n if (!stream) {\n return Buffer.alloc(0);\n }\n\n const reader = stream.getReader();\n const chunks: Buffer[] = [];\n\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) {\n break;\n }\n\n if (value && value.byteLength > 0) {\n if (Buffer.isBuffer(value)) {\n chunks.push(value);\n } else {\n chunks.push(Buffer.from(value.buffer, value.byteOffset, value.byteLength));\n }\n }\n }\n } finally {\n // reader.releaseLock() is unnecessary here; letting the stream close naturally\n // ensures the underlying native handle is released.\n }\n\n return chunks.length === 0 ? Buffer.alloc(0) : Buffer.concat(chunks);\n }\n}\n\nexport class Transport {\n readonly id: string;\n private disposed = false;\n\n constructor(id: string) {\n this.id = id;\n }\n\n get closed(): boolean {\n return this.disposed;\n }\n\n async close(): Promise<void> {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n try {\n nativeBinding.dropTransport(this.id);\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n}\n\nexport class Session implements SessionHandle {\n readonly id: string;\n private disposed = false;\n private readonly defaults: SessionDefaults;\n\n constructor(id: string, defaults: SessionDefaults) {\n this.id = id;\n this.defaults = defaults;\n }\n\n get closed(): boolean {\n return this.disposed;\n }\n\n private ensureActive(): void {\n if (this.disposed) {\n throw new RequestError(\"Session has been closed\");\n }\n }\n\n /** @internal */\n getDefaults(): SessionDefaults {\n const snapshot: SessionDefaults = { ...this.defaults };\n if (this.defaults.defaultHeaders) {\n snapshot.defaultHeaders = [...this.defaults.defaultHeaders];\n }\n return snapshot;\n }\n\n /** @internal */\n _defaultsRef(): SessionDefaults {\n return this.defaults;\n }\n\n async fetch(input: string | URL | Request, init?: WreqRequestInit): Promise<Response> {\n this.ensureActive();\n const config: WreqRequestInit = init ? { ...init, session: this } : { session: this };\n return fetch(input, config);\n }\n\n async clearCookies(): Promise<void> {\n this.ensureActive();\n try {\n nativeBinding.clearSession(this.id);\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n\n getCookies(url: string | URL): Record<string, string> {\n this.ensureActive();\n try {\n return nativeBinding.getCookies(this.id, String(url));\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n\n setCookie(name: string, value: string, url: string | URL): void {\n this.ensureActive();\n try {\n nativeBinding.setCookie(this.id, name, value, String(url));\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n\n /**\n * Create a WebSocket connection that shares this session's cookies and TLS configuration.\n *\n * @param urlOrOptions - WebSocket URL or legacy options object\n * @param options - Session WebSocket options\n * @returns Promise that resolves to the WebSocket instance\n */\n async websocket(url: string | URL, options?: SessionWebSocketOptions): Promise<WebSocket>;\n async websocket(options: LegacySessionWebSocketOptions): Promise<WebSocket>;\n async websocket(\n urlOrOptions: string | URL | LegacySessionWebSocketOptions,\n options?: SessionWebSocketOptions,\n ): Promise<WebSocket> {\n this.ensureActive();\n\n const normalized = normalizeSessionWebSocketArgs(urlOrOptions, options);\n validateWebSocketProtocols(normalized.options.protocols);\n assertNoManualWebSocketProtocolHeader(normalized.options.headers);\n const protocols = normalizeWebSocketProtocolList(normalized.options.protocols);\n\n const transportId = this.defaults.transportId;\n if (!transportId) {\n throw new RequestError(\n \"Session has no transport. Create the session with browser/os options or pass a transport to use session.websocket().\",\n );\n }\n\n return WebSocket._connectWithInit({\n _internal: true,\n url: normalized.url,\n options: normalized.options,\n openDispatchMode: \"deferred\",\n connect: (callbacks) =>\n nativeBinding.websocketConnectSession({\n url: normalized.url,\n sessionId: this.id,\n transportId,\n headers: headersToTuples(normalized.options.headers ?? {}),\n ...(protocols && protocols.length > 0 && { protocols }),\n onMessage: callbacks.onMessage,\n onClose: callbacks.onClose,\n onError: callbacks.onError,\n }),\n legacyCallbacks: normalized.legacyCallbacks,\n });\n }\n\n async close(): Promise<void> {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n const transportId = this.defaults.transportId;\n const ownsTransport = this.defaults.ownsTransport;\n\n try {\n nativeBinding.dropSession(this.id);\n } catch (error) {\n if (!ownsTransport || !transportId) {\n throw new RequestError(String(error));\n }\n // Fall through to transport cleanup and surface the original error after.\n const originalError = error;\n try {\n nativeBinding.dropTransport(transportId);\n } catch {\n // Ignore transport cleanup errors when a session drop error already occurred.\n }\n throw new RequestError(String(originalError));\n }\n\n if (ownsTransport && transportId) {\n try {\n nativeBinding.dropTransport(transportId);\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n }\n}\n\nfunction resolveSessionContext(config: WreqRequestInit): SessionResolution {\n const requestedMode = config.cookieMode ?? \"ephemeral\";\n const sessionCandidate = config.session;\n const providedSessionId = typeof config.sessionId === \"string\" ? config.sessionId.trim() : undefined;\n\n if (sessionCandidate && providedSessionId) {\n throw new RequestError(\"Provide either `session` or `sessionId`, not both.\");\n }\n\n if (sessionCandidate) {\n if (!(sessionCandidate instanceof Session)) {\n throw new RequestError(\"`session` must be created via createSession()\");\n }\n\n if (sessionCandidate.closed) {\n throw new RequestError(\"Session has been closed\");\n }\n\n return {\n sessionId: sessionCandidate.id,\n cookieMode: \"session\",\n dropAfterRequest: false,\n defaults: sessionCandidate._defaultsRef(),\n };\n }\n\n if (providedSessionId) {\n if (!providedSessionId) {\n throw new RequestError(\"sessionId must not be empty\");\n }\n\n if (requestedMode === \"ephemeral\") {\n throw new RequestError(\"cookieMode 'ephemeral' cannot be combined with sessionId\");\n }\n\n return {\n sessionId: providedSessionId,\n cookieMode: \"session\",\n dropAfterRequest: false,\n };\n }\n\n if (requestedMode === \"session\") {\n throw new RequestError(\"cookieMode 'session' requires a session or sessionId\");\n }\n\n return {\n sessionId: generateEphemeralSessionId(),\n cookieMode: \"ephemeral\",\n dropAfterRequest: true,\n };\n}\n\nfunction resolveTransportContext(config: WreqRequestInit, sessionDefaults?: SessionDefaults): TransportResolution {\n if (config.transport !== undefined) {\n if (!(config.transport instanceof Transport)) {\n throw new RequestError(\"`transport` must be created via createTransport()\");\n }\n\n if (config.transport.closed) {\n throw new RequestError(\"Transport has been closed\");\n }\n\n const hasProxy = config.proxy !== undefined;\n if (\n config.browser !== undefined ||\n config.os !== undefined ||\n config.emulation !== undefined ||\n hasProxy ||\n config.insecure !== undefined\n ) {\n throw new RequestError(\"`transport` cannot be combined with browser/os/emulation/proxy/insecure options\");\n }\n\n return { transportId: config.transport.id };\n }\n\n if (sessionDefaults?.transportId) {\n if (config.emulation !== undefined) {\n throw new RequestError(\"Session emulation cannot be changed after creation\");\n }\n\n if (config.browser !== undefined) {\n validateBrowserProfile(config.browser);\n const lockedBrowser =\n sessionDefaults.transportMode.kind === \"custom\" ? undefined : sessionDefaults.transportMode.browser;\n if (config.browser !== lockedBrowser) {\n throw new RequestError(\"Session browser cannot be changed after creation\");\n }\n }\n\n if (config.os !== undefined) {\n validateOperatingSystem(config.os);\n const lockedOs = sessionDefaults.transportMode.kind === \"custom\" ? undefined : sessionDefaults.transportMode.os;\n if (config.os !== lockedOs) {\n throw new RequestError(\"Session operating system cannot be changed after creation\");\n }\n }\n\n const initHasProxy = Object.hasOwn(config as object, \"proxy\");\n const requestedProxy = initHasProxy ? (config as { proxy?: string | null }).proxy : undefined;\n if (initHasProxy && requestedProxy !== undefined && (sessionDefaults.proxy ?? null) !== (requestedProxy ?? null)) {\n throw new RequestError(\"Session proxy cannot be changed after creation\");\n }\n\n if (config.insecure !== undefined) {\n const lockedInsecure = sessionDefaults.insecure ?? false;\n if (config.insecure !== lockedInsecure) {\n throw new RequestError(\"Session insecure setting cannot be changed after creation\");\n }\n }\n\n return { transportId: sessionDefaults.transportId };\n }\n\n const resolved: TransportResolution = {\n mode: resolveEmulationMode(config.browser, config.os, config.emulation),\n };\n if (config.proxy !== undefined) {\n resolved.proxy = config.proxy;\n }\n if (config.insecure !== undefined) {\n resolved.insecure = config.insecure;\n }\n return resolved;\n}\n\ninterface AbortHandler {\n promise: Promise<never>;\n cleanup: () => void;\n}\n\nfunction createAbortError(reason?: unknown): Error {\n const fallbackMessage = typeof reason === \"string\" ? reason : \"The operation was aborted\";\n\n if (typeof DOMException !== \"undefined\" && reason instanceof DOMException) {\n return reason.name === \"AbortError\" ? reason : new DOMException(reason.message || fallbackMessage, \"AbortError\");\n }\n\n if (reason instanceof Error) {\n const error = new Error(reason.message);\n error.name = \"AbortError\";\n error.cause = reason;\n return error;\n }\n\n if (typeof DOMException !== \"undefined\") {\n return new DOMException(fallbackMessage, \"AbortError\");\n }\n\n const error = new Error(fallbackMessage);\n error.name = \"AbortError\";\n return error;\n}\n\nfunction isAbortError(error: unknown): error is Error {\n return Boolean(error) && typeof (error as Error).name === \"string\" && (error as Error).name === \"AbortError\";\n}\n\n// Request IDs must stay below 2^48 to preserve integer precision across the bridge.\nconst REQUEST_ID_MAX = 2 ** 48;\n// Seed with a monotonic-ish value derived from hrtime to avoid collisions after reloads.\nlet requestIdCounter = Math.trunc(Number(process.hrtime.bigint() % BigInt(REQUEST_ID_MAX - 1))) + 1;\n\nfunction generateRequestId(): number {\n requestIdCounter += 1;\n if (requestIdCounter >= REQUEST_ID_MAX) {\n requestIdCounter = 1;\n }\n\n return requestIdCounter;\n}\n\nfunction setupAbort(signal: AbortSignal | null | undefined, cancelNative: () => void): AbortHandler | null {\n if (!signal) {\n return null;\n }\n\n if (signal.aborted) {\n cancelNative();\n throw createAbortError(signal.reason);\n }\n\n let onAbortListener: (() => void) | undefined;\n\n const promise = new Promise<never>((_, reject) => {\n onAbortListener = () => {\n cancelNative();\n reject(createAbortError(signal.reason));\n };\n\n signal.addEventListener(\"abort\", onAbortListener, { once: true });\n });\n\n const cleanup = () => {\n if (onAbortListener) {\n signal.removeEventListener(\"abort\", onAbortListener);\n onAbortListener = undefined;\n }\n };\n\n return { promise, cleanup };\n}\n\nfunction coerceUrlInput(input: string | URL): string {\n if (input instanceof URL) {\n return input.href;\n }\n\n if (input.length === 0) {\n throw new RequestError(\"URL is required\");\n }\n\n // Fast path: skip trim when the string has no leading/trailing whitespace.\n if (input.charCodeAt(0) > 32 && input.charCodeAt(input.length - 1) > 32) {\n return input;\n }\n\n const trimmed = input.trim();\n if (trimmed.length === 0) {\n throw new RequestError(\"URL is required\");\n }\n\n return trimmed;\n}\n\ntype RequestLike = {\n url: string;\n method: string;\n headers: globalThis.Headers;\n signal: AbortSignal | null;\n redirect: string;\n bodyUsed: boolean;\n body: ReadableStream<Uint8Array> | null;\n arrayBuffer(): Promise<ArrayBuffer>;\n};\n\nfunction isRequestLike(input: unknown): input is RequestLike {\n if (!input || typeof input !== \"object\") {\n return false;\n }\n\n if (typeof Request !== \"undefined\" && input instanceof Request) {\n return true;\n }\n\n const candidate = input as Partial<RequestLike>;\n return (\n typeof candidate.url === \"string\" &&\n typeof candidate.method === \"string\" &&\n typeof candidate.arrayBuffer === \"function\" &&\n typeof candidate.redirect === \"string\"\n );\n}\n\nasync function resolveFetchArgs(\n input: string | URL | RequestLike,\n init?: WreqRequestInit,\n): Promise<{\n url: string;\n init: WreqRequestInit;\n}> {\n if (!isRequestLike(input)) {\n return { url: coerceUrlInput(input), init: init ?? {} };\n }\n\n const mergedInit: WreqRequestInit = init ? { ...init } : {};\n\n if (mergedInit.method === undefined) {\n mergedInit.method = input.method;\n }\n if (mergedInit.headers === undefined) {\n mergedInit.headers = input.headers as unknown as HeadersInit;\n }\n if (\n mergedInit.redirect === undefined &&\n (input.redirect === \"follow\" || input.redirect === \"manual\" || input.redirect === \"error\")\n ) {\n mergedInit.redirect = input.redirect;\n }\n if (mergedInit.signal === undefined) {\n mergedInit.signal = input.signal;\n }\n if (mergedInit.body === undefined && input.body !== null) {\n if (input.bodyUsed) {\n throw new TypeError(\"Request body is already used\");\n }\n mergedInit.body = Buffer.from(await input.arrayBuffer());\n }\n\n return { url: coerceUrlInput(input.url), init: mergedInit };\n}\n\nfunction normalizeUrlForComparison(value: string): string | null {\n try {\n return new URL(value).toString();\n } catch {\n return null;\n }\n}\n\nfunction validateRedirectMode(mode?: WreqRequestInit[\"redirect\"]): void {\n if (mode === undefined || mode === \"follow\" || mode === \"manual\" || mode === \"error\") {\n return;\n }\n\n throw new RequestError(`Redirect mode '${mode}' is not supported`);\n}\n\ntype SerializedBody = {\n body?: Buffer;\n contentType?: string;\n};\n\nasync function serializeBody(body?: BodyInit | null): Promise<SerializedBody> {\n if (body === null || body === undefined) {\n return {};\n }\n\n if (typeof body === \"string\") {\n return { body: Buffer.from(body, \"utf8\") };\n }\n\n if (Buffer.isBuffer(body)) {\n return { body };\n }\n\n if (body instanceof URLSearchParams) {\n return {\n body: Buffer.from(body.toString(), \"utf8\"),\n contentType: \"application/x-www-form-urlencoded;charset=UTF-8\",\n };\n }\n\n if (body instanceof ArrayBuffer) {\n return { body: Buffer.from(body) };\n }\n\n if (ArrayBuffer.isView(body)) {\n return { body: Buffer.from(body.buffer, body.byteOffset, body.byteLength) };\n }\n\n if (typeof Blob !== \"undefined\" && body instanceof Blob) {\n const buffer = Buffer.from(await body.arrayBuffer());\n return { body: buffer, ...(body.type ? { contentType: body.type } : {}) };\n }\n\n if (typeof FormData !== \"undefined\" && body instanceof FormData) {\n const encoded = new globalThis.Response(body);\n const contentType = encoded.headers.get(\"content-type\") ?? undefined;\n const buffer = Buffer.from(await encoded.arrayBuffer());\n return { body: buffer, ...(contentType ? { contentType } : {}) };\n }\n\n throw new TypeError(\n \"Unsupported body type; expected string, Buffer, ArrayBuffer, ArrayBufferView, URLSearchParams, Blob, or FormData\",\n );\n}\n\nfunction ensureMethod(method?: string): string {\n if (method === undefined || method.length === 0) {\n return \"GET\";\n }\n\n // Fast path: common methods already in canonical form (avoids trim + toUpperCase).\n switch (method) {\n case \"GET\":\n case \"POST\":\n case \"PUT\":\n case \"DELETE\":\n case \"PATCH\":\n case \"HEAD\":\n case \"OPTIONS\":\n return method;\n }\n\n const normalized = method.trim().toUpperCase();\n return normalized.length > 0 ? normalized : \"GET\";\n}\n\nfunction ensureBodyAllowed(method: string, body?: Buffer): void {\n if (body === undefined) {\n return;\n }\n\n if (method === \"GET\" || method === \"HEAD\") {\n throw new RequestError(`Request with ${method} method cannot have a body`);\n }\n}\n\nfunction validateBrowserProfile(browser?: BrowserProfile | string): void {\n if (browser === undefined) {\n return;\n }\n\n if (typeof browser !== \"string\" || browser.trim().length === 0) {\n throw new RequestError(\"Browser profile must not be empty\");\n }\n\n if (!getProfileSet().has(browser)) {\n throw new RequestError(`Invalid browser profile: ${browser}. Available profiles: ${getProfiles().join(\", \")}`);\n }\n}\n\nfunction validateOperatingSystem(os?: EmulationOS | string): void {\n if (os === undefined) {\n return;\n }\n\n if (typeof os !== \"string\" || os.trim().length === 0) {\n throw new RequestError(\"Operating system must not be empty\");\n }\n\n if (!getOperatingSystemSet().has(os)) {\n throw new RequestError(`Invalid operating system: ${os}. Available options: ${getOperatingSystems().join(\", \")}`);\n }\n}\n\nfunction validateTimeout(timeout?: number): void {\n if (timeout === undefined) {\n return;\n }\n\n if (typeof timeout !== \"number\" || !Number.isFinite(timeout)) {\n throw new RequestError(\"Timeout must be a finite number\");\n }\n\n if (timeout < 0) {\n throw new RequestError(\"Timeout must be 0 (no timeout) or a positive number\");\n }\n}\n\nfunction validatePositiveNumber(value: number, label: string): void {\n if (typeof value !== \"number\" || !Number.isFinite(value)) {\n throw new RequestError(`${label} must be a finite number`);\n }\n\n if (value <= 0) {\n throw new RequestError(`${label} must be greater than 0`);\n }\n}\n\nfunction validateNonNegativeInteger(value: number, label: string): void {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isInteger(value)) {\n throw new RequestError(`${label} must be an integer`);\n }\n\n if (value < 0) {\n throw new RequestError(`${label} must be greater than or equal to 0`);\n }\n}\n\nfunction validatePositiveInteger(value: number, label: string): void {\n if (typeof value !== \"number\" || !Number.isFinite(value) || !Number.isInteger(value)) {\n throw new RequestError(`${label} must be an integer`);\n }\n\n if (value <= 0) {\n throw new RequestError(`${label} must be greater than 0`);\n }\n}\n\nfunction validateIntegerInRange(value: number, min: number, max: number, label: string): void {\n validateNonNegativeInteger(value, label);\n if (value < min || value > max) {\n throw new RequestError(`${label} must be between ${min} and ${max}`);\n }\n}\n\nconst SUPPORTED_ALPN_PROTOCOLS = new Set<AlpnProtocol>([\"HTTP1\", \"HTTP2\", \"HTTP3\"]);\nconst SUPPORTED_ALPS_PROTOCOLS = new Set<AlpsProtocol>([\"HTTP1\", \"HTTP2\", \"HTTP3\"]);\nconst SUPPORTED_CERTIFICATE_COMPRESSION_ALGORITHMS = new Set([\"zlib\", \"brotli\", \"zstd\"]);\nconst HTTP2_SETTING_IDS = new Set<Http2SettingId>([\n \"HeaderTableSize\",\n \"EnablePush\",\n \"MaxConcurrentStreams\",\n \"InitialWindowSize\",\n \"MaxFrameSize\",\n \"MaxHeaderListSize\",\n \"EnableConnectProtocol\",\n \"NoRfc7540Priorities\",\n]);\nconst HTTP2_PSEUDO_HEADER_IDS = new Set<Http2PseudoHeaderId>([\"Method\", \"Scheme\", \"Authority\", \"Path\", \"Protocol\"]);\nconst STANDARD_HTTP2_SETTING_ID_VALUES = new Set([1, 2, 3, 4, 5, 6, 8, 9]);\nconst MAX_HTTP2_EXPERIMENTAL_SETTING_ID = 15;\nconst TLS_VERSION_ALIASES = new Map<string, \"1.0\" | \"1.1\" | \"1.2\" | \"1.3\">([\n [\"1.0\", \"1.0\"],\n [\"1.1\", \"1.1\"],\n [\"1.2\", \"1.2\"],\n [\"1.3\", \"1.3\"],\n [\"tls1.0\", \"1.0\"],\n [\"tls1.1\", \"1.1\"],\n [\"tls1.2\", \"1.2\"],\n [\"tls1.3\", \"1.3\"],\n]);\n\nfunction isNonEmpty(value: object): boolean {\n for (const _ in value) return true;\n return false;\n}\n\nfunction normalizeProtocolList<T extends AlpnProtocol | AlpsProtocol>(\n value: T[] | undefined,\n label: string,\n allowed: Set<T>,\n): T[] | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(value)) {\n throw new RequestError(`${label} must be an array`);\n }\n\n for (const protocol of value) {\n if (!allowed.has(protocol)) {\n throw new RequestError(`${label} values must be one of: HTTP1, HTTP2, HTTP3`);\n }\n }\n\n return [...value];\n}\n\nfunction normalizeTlsVersion(value: TlsVersion | undefined, label: string): \"1.0\" | \"1.1\" | \"1.2\" | \"1.3\" | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value !== \"string\") {\n throw new RequestError(`${label} must be a string`);\n }\n\n const normalized = TLS_VERSION_ALIASES.get(value.trim().toLowerCase());\n if (!normalized) {\n throw new RequestError(`${label} must be one of: 1.0, 1.1, 1.2, 1.3`);\n }\n\n return normalized;\n}\n\nfunction normalizeOrigHeaders(origHeaders: string[] | undefined): string[] | undefined {\n if (origHeaders === undefined) {\n return undefined;\n }\n\n if (!Array.isArray(origHeaders)) {\n throw new RequestError(\"emulation.origHeaders must be an array of strings\");\n }\n\n const normalized: string[] = [];\n const seen = new Set<string>();\n\n for (const entry of origHeaders) {\n if (typeof entry !== \"string\" || entry.trim().length === 0) {\n throw new RequestError(\"emulation.origHeaders entries must be non-empty strings\");\n }\n\n const trimmed = entry.trim();\n const duplicateKey = trimmed.toLowerCase();\n if (seen.has(duplicateKey)) {\n throw new RequestError(`Duplicate emulation.origHeaders entry: ${trimmed}`);\n }\n\n seen.add(duplicateKey);\n normalized.push(trimmed);\n }\n\n return normalized.length > 0 ? normalized : undefined;\n}\n\nfunction normalizeCustomTlsOptions(options: CustomTlsOptions | undefined): CustomTlsOptions | undefined {\n if (options === undefined) {\n return undefined;\n }\n\n const normalized: CustomTlsOptions = {};\n\n const alpnProtocols = normalizeProtocolList(\n options.alpnProtocols,\n \"emulation.tlsOptions.alpnProtocols\",\n SUPPORTED_ALPN_PROTOCOLS,\n );\n if (alpnProtocols !== undefined) {\n normalized.alpnProtocols = alpnProtocols;\n }\n\n const alpsProtocols = normalizeProtocolList(\n options.alpsProtocols,\n \"emulation.tlsOptions.alpsProtocols\",\n SUPPORTED_ALPS_PROTOCOLS,\n );\n if (alpsProtocols !== undefined) {\n normalized.alpsProtocols = alpsProtocols;\n }\n\n const minTlsVersion = normalizeTlsVersion(options.minTlsVersion, \"emulation.tlsOptions.minTlsVersion\");\n if (minTlsVersion !== undefined) {\n normalized.minTlsVersion = minTlsVersion;\n }\n\n const maxTlsVersion = normalizeTlsVersion(options.maxTlsVersion, \"emulation.tlsOptions.maxTlsVersion\");\n if (maxTlsVersion !== undefined) {\n normalized.maxTlsVersion = maxTlsVersion;\n }\n\n if (options.alpsUseNewCodepoint !== undefined) {\n normalized.alpsUseNewCodepoint = options.alpsUseNewCodepoint;\n }\n if (options.sessionTicket !== undefined) {\n normalized.sessionTicket = options.sessionTicket;\n }\n if (options.preSharedKey !== undefined) {\n normalized.preSharedKey = options.preSharedKey;\n }\n if (options.enableEchGrease !== undefined) {\n normalized.enableEchGrease = options.enableEchGrease;\n }\n if (options.permuteExtensions !== undefined) {\n normalized.permuteExtensions = options.permuteExtensions;\n }\n if (options.greaseEnabled !== undefined) {\n normalized.greaseEnabled = options.greaseEnabled;\n }\n if (options.enableOcspStapling !== undefined) {\n normalized.enableOcspStapling = options.enableOcspStapling;\n }\n if (options.enableSignedCertTimestamps !== undefined) {\n normalized.enableSignedCertTimestamps = options.enableSignedCertTimestamps;\n }\n if (options.pskSkipSessionTicket !== undefined) {\n normalized.pskSkipSessionTicket = options.pskSkipSessionTicket;\n }\n if (options.pskDheKe !== undefined) {\n normalized.pskDheKe = options.pskDheKe;\n }\n if (options.renegotiation !== undefined) {\n normalized.renegotiation = options.renegotiation;\n }\n if (options.aesHwOverride !== undefined) {\n normalized.aesHwOverride = options.aesHwOverride;\n }\n if (options.preserveTls13CipherList !== undefined) {\n normalized.preserveTls13CipherList = options.preserveTls13CipherList;\n }\n if (options.randomAesHwOverride !== undefined) {\n normalized.randomAesHwOverride = options.randomAesHwOverride;\n }\n if (options.delegatedCredentials !== undefined) {\n normalized.delegatedCredentials = options.delegatedCredentials;\n }\n if (options.curvesList !== undefined) {\n normalized.curvesList = options.curvesList;\n }\n if (options.cipherList !== undefined) {\n normalized.cipherList = options.cipherList;\n }\n if (options.sigalgsList !== undefined) {\n normalized.sigalgsList = options.sigalgsList;\n }\n\n if (options.recordSizeLimit !== undefined) {\n validateIntegerInRange(options.recordSizeLimit, 0, 65535, \"emulation.tlsOptions.recordSizeLimit\");\n normalized.recordSizeLimit = options.recordSizeLimit;\n }\n\n if (options.keySharesLimit !== undefined) {\n validateIntegerInRange(options.keySharesLimit, 0, 255, \"emulation.tlsOptions.keySharesLimit\");\n normalized.keySharesLimit = options.keySharesLimit;\n }\n\n if (options.certificateCompressionAlgorithms !== undefined) {\n if (!Array.isArray(options.certificateCompressionAlgorithms)) {\n throw new RequestError(\"emulation.tlsOptions.certificateCompressionAlgorithms must be an array\");\n }\n\n const algorithms: Array<\"zlib\" | \"brotli\" | \"zstd\"> = [];\n const seen = new Set<string>();\n\n for (const algorithm of options.certificateCompressionAlgorithms) {\n if (!SUPPORTED_CERTIFICATE_COMPRESSION_ALGORITHMS.has(algorithm)) {\n throw new RequestError(\n \"emulation.tlsOptions.certificateCompressionAlgorithms values must be one of: zlib, brotli, zstd\",\n );\n }\n if (seen.has(algorithm)) {\n throw new RequestError(`Duplicate emulation.tlsOptions.certificateCompressionAlgorithms entry: ${algorithm}`);\n }\n seen.add(algorithm);\n algorithms.push(algorithm);\n }\n\n normalized.certificateCompressionAlgorithms = algorithms;\n }\n\n if (options.extensionPermutation !== undefined) {\n if (!Array.isArray(options.extensionPermutation)) {\n throw new RequestError(\"emulation.tlsOptions.extensionPermutation must be an array\");\n }\n\n const permutation: number[] = [];\n const seen = new Set<number>();\n\n for (const extensionId of options.extensionPermutation) {\n validateIntegerInRange(extensionId, 0, 65535, \"emulation.tlsOptions.extensionPermutation\");\n if (seen.has(extensionId)) {\n throw new RequestError(`Duplicate emulation.tlsOptions.extensionPermutation entry: ${extensionId}`);\n }\n seen.add(extensionId);\n permutation.push(extensionId);\n }\n\n normalized.extensionPermutation = permutation;\n }\n\n return isNonEmpty(normalized) ? normalized : undefined;\n}\n\nfunction normalizeCustomHttp1Options(options: CustomHttp1Options | undefined): CustomHttp1Options | undefined {\n if (options === undefined) {\n return undefined;\n }\n\n const normalized: CustomHttp1Options = {};\n\n if (options.http09Responses !== undefined) {\n normalized.http09Responses = options.http09Responses;\n }\n if (options.writev !== undefined) {\n normalized.writev = options.writev;\n }\n if (options.ignoreInvalidHeadersInResponses !== undefined) {\n normalized.ignoreInvalidHeadersInResponses = options.ignoreInvalidHeadersInResponses;\n }\n if (options.allowSpacesAfterHeaderNameInResponses !== undefined) {\n normalized.allowSpacesAfterHeaderNameInResponses = options.allowSpacesAfterHeaderNameInResponses;\n }\n if (options.allowObsoleteMultilineHeadersInResponses !== undefined) {\n normalized.allowObsoleteMultilineHeadersInResponses = options.allowObsoleteMultilineHeadersInResponses;\n }\n\n if (options.maxHeaders !== undefined) {\n validateNonNegativeInteger(options.maxHeaders, \"emulation.http1Options.maxHeaders\");\n normalized.maxHeaders = options.maxHeaders;\n }\n\n if (options.readBufExactSize !== undefined) {\n validateNonNegativeInteger(options.readBufExactSize, \"emulation.http1Options.readBufExactSize\");\n normalized.readBufExactSize = options.readBufExactSize;\n }\n\n if (options.maxBufSize !== undefined) {\n validateNonNegativeInteger(options.maxBufSize, \"emulation.http1Options.maxBufSize\");\n if (options.maxBufSize < 8192) {\n throw new RequestError(\"emulation.http1Options.maxBufSize must be greater than or equal to 8192\");\n }\n normalized.maxBufSize = options.maxBufSize;\n }\n\n if (normalized.readBufExactSize !== undefined && normalized.maxBufSize !== undefined) {\n throw new RequestError(\"emulation.http1Options.readBufExactSize and maxBufSize cannot both be set\");\n }\n\n return isNonEmpty(normalized) ? normalized : undefined;\n}\n\nfunction normalizeHttp2StreamDependency(dependency: Http2StreamDependency, label: string): Http2StreamDependency {\n if (!isPlainObject(dependency)) {\n throw new RequestError(`${label} must be an object`);\n }\n\n validateIntegerInRange(dependency.dependencyId, 0, 0x7fffffff, `${label}.dependencyId`);\n validateIntegerInRange(dependency.weight, 0, 255, `${label}.weight`);\n\n const normalized: Http2StreamDependency = {\n dependencyId: dependency.dependencyId,\n weight: dependency.weight,\n };\n if (dependency.exclusive !== undefined) {\n normalized.exclusive = dependency.exclusive;\n }\n return normalized;\n}\n\nfunction normalizeCustomHttp2Options(options: CustomHttp2Options | undefined): CustomHttp2Options | undefined {\n if (options === undefined) {\n return undefined;\n }\n\n const normalized: CustomHttp2Options = {};\n\n if (options.adaptiveWindow !== undefined) {\n normalized.adaptiveWindow = options.adaptiveWindow;\n }\n if (options.keepAliveWhileIdle !== undefined) {\n normalized.keepAliveWhileIdle = options.keepAliveWhileIdle;\n }\n if (options.enablePush !== undefined) {\n normalized.enablePush = options.enablePush;\n }\n if (options.enableConnectProtocol !== undefined) {\n normalized.enableConnectProtocol = options.enableConnectProtocol;\n }\n if (options.noRfc7540Priorities !== undefined) {\n normalized.noRfc7540Priorities = options.noRfc7540Priorities;\n }\n\n if (options.initialStreamId !== undefined) {\n validateNonNegativeInteger(options.initialStreamId, \"emulation.http2Options.initialStreamId\");\n normalized.initialStreamId = options.initialStreamId;\n }\n if (options.initialConnectionWindowSize !== undefined) {\n validateNonNegativeInteger(\n options.initialConnectionWindowSize,\n \"emulation.http2Options.initialConnectionWindowSize\",\n );\n normalized.initialConnectionWindowSize = options.initialConnectionWindowSize;\n }\n if (options.initialWindowSize !== undefined) {\n validateNonNegativeInteger(options.initialWindowSize, \"emulation.http2Options.initialWindowSize\");\n normalized.initialWindowSize = options.initialWindowSize;\n }\n if (options.initialMaxSendStreams !== undefined) {\n validateNonNegativeInteger(options.initialMaxSendStreams, \"emulation.http2Options.initialMaxSendStreams\");\n normalized.initialMaxSendStreams = options.initialMaxSendStreams;\n }\n if (options.maxFrameSize !== undefined) {\n validateNonNegativeInteger(options.maxFrameSize, \"emulation.http2Options.maxFrameSize\");\n normalized.maxFrameSize = options.maxFrameSize;\n }\n if (options.keepAliveInterval !== undefined) {\n validateNonNegativeInteger(options.keepAliveInterval, \"emulation.http2Options.keepAliveInterval\");\n normalized.keepAliveInterval = options.keepAliveInterval;\n }\n if (options.keepAliveTimeout !== undefined) {\n validateNonNegativeInteger(options.keepAliveTimeout, \"emulation.http2Options.keepAliveTimeout\");\n normalized.keepAliveTimeout = options.keepAliveTimeout;\n }\n if (options.maxConcurrentResetStreams !== undefined) {\n validateNonNegativeInteger(options.maxConcurrentResetStreams, \"emulation.http2Options.maxConcurrentResetStreams\");\n normalized.maxConcurrentResetStreams = options.maxConcurrentResetStreams;\n }\n if (options.maxSendBufferSize !== undefined) {\n validateNonNegativeInteger(options.maxSendBufferSize, \"emulation.http2Options.maxSendBufferSize\");\n normalized.maxSendBufferSize = options.maxSendBufferSize;\n }\n if (options.maxConcurrentStreams !== undefined) {\n validateNonNegativeInteger(options.maxConcurrentStreams, \"emulation.http2Options.maxConcurrentStreams\");\n normalized.maxConcurrentStreams = options.maxConcurrentStreams;\n }\n if (options.maxHeaderListSize !== undefined) {\n validateNonNegativeInteger(options.maxHeaderListSize, \"emulation.http2Options.maxHeaderListSize\");\n normalized.maxHeaderListSize = options.maxHeaderListSize;\n }\n if (options.maxPendingAcceptResetStreams !== undefined) {\n validateNonNegativeInteger(\n options.maxPendingAcceptResetStreams,\n \"emulation.http2Options.maxPendingAcceptResetStreams\",\n );\n normalized.maxPendingAcceptResetStreams = options.maxPendingAcceptResetStreams;\n }\n if (options.headerTableSize !== undefined) {\n validateNonNegativeInteger(options.headerTableSize, \"emulation.http2Options.headerTableSize\");\n normalized.headerTableSize = options.headerTableSize;\n }\n\n if (options.settingsOrder !== undefined) {\n if (!Array.isArray(options.settingsOrder)) {\n throw new RequestError(\"emulation.http2Options.settingsOrder must be an array\");\n }\n\n const settingsOrder: Http2SettingId[] = [];\n const seen = new Set<Http2SettingId>();\n for (const settingId of options.settingsOrder) {\n if (!HTTP2_SETTING_IDS.has(settingId)) {\n throw new RequestError(\"emulation.http2Options.settingsOrder contains an unsupported setting id\");\n }\n if (seen.has(settingId)) {\n throw new RequestError(`Duplicate emulation.http2Options.settingsOrder entry: ${settingId}`);\n }\n seen.add(settingId);\n settingsOrder.push(settingId);\n }\n normalized.settingsOrder = settingsOrder;\n }\n\n if (options.headersPseudoOrder !== undefined) {\n if (!Array.isArray(options.headersPseudoOrder)) {\n throw new RequestError(\"emulation.http2Options.headersPseudoOrder must be an array\");\n }\n\n const headersPseudoOrder: Http2PseudoHeaderId[] = [];\n const seenPseudo = new Set<Http2PseudoHeaderId>();\n for (const pseudoId of options.headersPseudoOrder) {\n if (!HTTP2_PSEUDO_HEADER_IDS.has(pseudoId)) {\n throw new RequestError(\"emulation.http2Options.headersPseudoOrder contains an unsupported pseudo-header id\");\n }\n if (seenPseudo.has(pseudoId)) {\n throw new RequestError(`Duplicate emulation.http2Options.headersPseudoOrder entry: ${pseudoId}`);\n }\n seenPseudo.add(pseudoId);\n headersPseudoOrder.push(pseudoId);\n }\n normalized.headersPseudoOrder = headersPseudoOrder;\n }\n\n if (options.headersStreamDependency !== undefined) {\n normalized.headersStreamDependency = normalizeHttp2StreamDependency(\n options.headersStreamDependency,\n \"emulation.http2Options.headersStreamDependency\",\n );\n }\n\n if (options.priorities !== undefined) {\n if (!Array.isArray(options.priorities)) {\n throw new RequestError(\"emulation.http2Options.priorities must be an array\");\n }\n\n const priorities: Http2Priority[] = [];\n const seenStreamIds = new Set<number>();\n for (const [index, priority] of options.priorities.entries()) {\n if (!isPlainObject(priority)) {\n throw new RequestError(`emulation.http2Options.priorities[${index}] must be an object`);\n }\n\n validatePositiveInteger(priority.streamId, `emulation.http2Options.priorities[${index}].streamId`);\n if (seenStreamIds.has(priority.streamId)) {\n throw new RequestError(`Duplicate emulation.http2Options.priorities streamId: ${priority.streamId}`);\n }\n seenStreamIds.add(priority.streamId);\n\n priorities.push({\n streamId: priority.streamId,\n dependency: normalizeHttp2StreamDependency(\n priority.dependency,\n `emulation.http2Options.priorities[${index}].dependency`,\n ),\n });\n }\n normalized.priorities = priorities;\n }\n\n if (options.experimentalSettings !== undefined) {\n if (!Array.isArray(options.experimentalSettings)) {\n throw new RequestError(\"emulation.http2Options.experimentalSettings must be an array\");\n }\n\n const experimentalSettings: Http2ExperimentalSetting[] = [];\n const seenIds = new Set<number>();\n\n for (const [index, setting] of options.experimentalSettings.entries()) {\n if (!isPlainObject(setting)) {\n throw new RequestError(`emulation.http2Options.experimentalSettings[${index}] must be an object`);\n }\n\n validateIntegerInRange(\n setting.id,\n 1,\n MAX_HTTP2_EXPERIMENTAL_SETTING_ID,\n `emulation.http2Options.experimentalSettings[${index}].id`,\n );\n if (STANDARD_HTTP2_SETTING_ID_VALUES.has(setting.id)) {\n throw new RequestError(\n `emulation.http2Options.experimentalSettings[${index}].id must not be a standard HTTP/2 setting id`,\n );\n }\n if (seenIds.has(setting.id)) {\n throw new RequestError(`Duplicate emulation.http2Options.experimentalSettings id: ${setting.id}`);\n }\n seenIds.add(setting.id);\n\n validateIntegerInRange(\n setting.value,\n 0,\n 0xffffffff,\n `emulation.http2Options.experimentalSettings[${index}].value`,\n );\n\n experimentalSettings.push({\n id: setting.id,\n value: setting.value,\n });\n }\n\n normalized.experimentalSettings = experimentalSettings;\n }\n\n return isNonEmpty(normalized) ? normalized : undefined;\n}\n\nfunction normalizeCustomEmulationOptions(\n emulation: CustomEmulationOptions | undefined,\n allowEmpty: boolean,\n): SerializedCustomEmulation | undefined {\n if (emulation === undefined) {\n return undefined;\n }\n\n if (!isPlainObject(emulation)) {\n throw new RequestError(\"emulation must be an object\");\n }\n\n const source = emulation as Partial<CustomEmulationOptions>;\n const normalized: SerializedCustomEmulation = {};\n\n const tlsOptions = normalizeCustomTlsOptions(source.tlsOptions);\n if (tlsOptions !== undefined) {\n normalized.tlsOptions = tlsOptions;\n }\n\n const http1Options = normalizeCustomHttp1Options(source.http1Options);\n if (http1Options !== undefined) {\n normalized.http1Options = http1Options;\n }\n\n const http2Options = normalizeCustomHttp2Options(source.http2Options);\n if (http2Options !== undefined) {\n normalized.http2Options = http2Options;\n }\n\n if (source.headers !== undefined) {\n const headers = headersToTuples(source.headers);\n if (headers.length > 0) {\n normalized.headers = headers;\n }\n }\n\n const origHeaders = normalizeOrigHeaders(source.origHeaders);\n if (origHeaders !== undefined) {\n normalized.origHeaders = origHeaders;\n }\n\n if (!allowEmpty && !isNonEmpty(normalized)) {\n throw new RequestError(\n \"Standalone custom emulation requires at least one of tlsOptions, http1Options, http2Options, headers, or origHeaders\",\n );\n }\n\n return isNonEmpty(normalized) ? normalized : undefined;\n}\n\nfunction serializeCustomEmulationOptions(\n emulation: CustomEmulationOptions | undefined,\n allowEmpty: boolean,\n): string | undefined {\n const normalized = normalizeCustomEmulationOptions(emulation, allowEmpty);\n return normalized ? JSON.stringify(normalized) : undefined;\n}\n\nfunction resolveEmulationMode(\n browser: BrowserProfile | undefined,\n os: EmulationOS | undefined,\n emulation: CustomEmulationOptions | undefined,\n): ResolvedEmulationMode {\n if (browser !== undefined) {\n validateBrowserProfile(browser);\n if (os !== undefined) {\n validateOperatingSystem(os);\n }\n\n const emulationJson = serializeCustomEmulationOptions(emulation, true);\n return {\n kind: \"preset\",\n browser,\n os: os ?? DEFAULT_OS,\n ...(emulationJson !== undefined && { emulationJson }),\n };\n }\n\n if (os !== undefined) {\n validateOperatingSystem(os);\n const emulationJson = serializeCustomEmulationOptions(emulation, true);\n return {\n kind: \"preset\",\n browser: DEFAULT_BROWSER,\n os,\n ...(emulationJson !== undefined && { emulationJson }),\n };\n }\n\n if (emulation !== undefined) {\n const emulationJson = serializeCustomEmulationOptions(emulation, false);\n if (emulationJson === undefined) {\n throw new RequestError(\n \"Standalone custom emulation requires at least one of tlsOptions, http1Options, http2Options, headers, or origHeaders\",\n );\n }\n return { kind: \"custom\", emulationJson };\n }\n\n return {\n kind: \"preset\",\n browser: DEFAULT_BROWSER,\n os: DEFAULT_OS,\n };\n}\n\nfunction applyNativeEmulationMode(\n target: { browser?: BrowserProfile; os?: EmulationOS; emulationJson?: string },\n mode: ResolvedEmulationMode,\n): void {\n if (mode.kind === \"custom\") {\n target.emulationJson = mode.emulationJson;\n return;\n }\n\n target.browser = mode.browser;\n target.os = mode.os;\n if (mode.emulationJson !== undefined) {\n target.emulationJson = mode.emulationJson;\n }\n}\n\nasync function dispatchRequest(\n options: NativeRequestOptions,\n requestUrl: string,\n signal?: AbortSignal | null,\n): Promise<Response> {\n // Fast path when no abort signal is provided: avoid Promise.race/allocation overhead.\n if (!signal) {\n const requestId = generateRequestId();\n let payload: NativeResponse;\n\n try {\n payload = (await nativeBinding.request(options, requestId, false)) as NativeResponse;\n } catch (error) {\n if (error instanceof RequestError) {\n throw error;\n }\n throw new RequestError(String(error));\n }\n\n return new Response(payload, requestUrl);\n }\n\n const requestId = generateRequestId();\n const cancelNative = () => {\n try {\n nativeBinding.cancelRequest(requestId);\n } catch {\n // Cancellation is best-effort; ignore binding errors here.\n }\n };\n\n // setupAbort throws if signal is already aborted and returns null only when signal is falsy\n // (impossible here since we checked `!signal` above). Cast is safe; avoids non-null assertion lint.\n const abortHandler = setupAbort(signal, cancelNative) as AbortHandler;\n\n const pending = Promise.race([nativeBinding.request(options, requestId, true), abortHandler.promise]);\n\n let payload: NativeResponse;\n\n try {\n payload = (await pending) as NativeResponse;\n } catch (error) {\n if (isAbortError(error)) {\n throw error;\n }\n\n if (error instanceof RequestError) {\n throw error;\n }\n\n throw new RequestError(String(error));\n } finally {\n abortHandler.cleanup();\n }\n\n return new Response(payload, requestUrl);\n}\n\n/**\n * Fetch-compatible entry point that adds browser impersonation controls.\n *\n * **Important:** The default fetch path is isolated and non-persistent by design.\n * Each call uses an isolated request context, so cookies are not shared across calls.\n * Connection and TLS reuse behavior is handled by the native layer.\n *\n * **Use {@link createSession} or {@link withSession} if you need:**\n * - Cookie persistence across requests\n * - Shared session defaults across requests\n * - A single session context for multi-step flows\n *\n * **Concurrency:** The core is unthrottled by design. Callers are expected to implement\n * their own concurrency control (e.g., p-limit) if needed. Built-in throttling would\n * reduce performance for high-throughput workloads.\n *\n * @param input - Request URL (string or URL) or a Request object\n * @param init - Fetch-compatible init options\n *\n * @example\n * ```typescript\n * // Isolated request (no state persistence)\n * const response = await fetch('https://example.com');\n *\n * // For persistent cookies and connection reuse, use a session:\n * await withSession(async (session) => {\n * await session.fetch('https://example.com/login', { method: 'POST', body: loginData });\n * await session.fetch('https://example.com/protected'); // Cookies from login are sent\n * });\n * ```\n */\nexport async function fetch(input: string | URL | Request, init?: WreqRequestInit): Promise<Response> {\n const resolved = await resolveFetchArgs(input, init);\n const url = resolved.url;\n const config = resolved.init;\n const sessionContext = resolveSessionContext(config);\n const sessionDefaults = sessionContext.defaults;\n\n validateRedirectMode(config.redirect);\n\n if (config.timeout !== undefined) {\n validateTimeout(config.timeout);\n }\n\n const method = ensureMethod(config.method);\n const serializedBody = await serializeBody(config.body ?? null);\n const body = serializedBody.body;\n\n ensureBodyAllowed(method, body);\n\n // Only normalize headers when provided; avoids per-request header allocations on hot paths.\n // If the caller already provides HeaderTuple[], pass it through.\n let headerTuples = mergeHeaderTuples(sessionDefaults?.defaultHeaders, config.headers);\n if (serializedBody.contentType && !hasHeaderName(headerTuples, \"content-type\")) {\n if (!headerTuples) {\n headerTuples = [];\n }\n headerTuples.push([\"Content-Type\", serializedBody.contentType]);\n }\n\n const transport = resolveTransportContext(config, sessionDefaults);\n const timeout = config.timeout ?? sessionDefaults?.timeout ?? DEFAULT_REQUEST_TIMEOUT_MS;\n\n const requestOptions: NativeRequestOptions = {\n url,\n method,\n sessionId: sessionContext.sessionId,\n ephemeral: sessionContext.dropAfterRequest,\n };\n\n if (body !== undefined) {\n requestOptions.body = body;\n }\n\n if (transport.transportId) {\n requestOptions.transportId = transport.transportId;\n } else {\n if (transport.mode !== undefined) {\n applyNativeEmulationMode(requestOptions, transport.mode);\n }\n if (transport.proxy !== undefined) {\n requestOptions.proxy = transport.proxy;\n }\n if (transport.insecure !== undefined) {\n requestOptions.insecure = transport.insecure;\n }\n }\n\n requestOptions.timeout = timeout;\n if (config.redirect !== undefined) {\n requestOptions.redirect = config.redirect;\n }\n if (config.disableDefaultHeaders !== undefined) {\n requestOptions.disableDefaultHeaders = config.disableDefaultHeaders;\n }\n if (config.compress !== undefined) {\n requestOptions.compress = config.compress;\n }\n\n if (headerTuples && headerTuples.length > 0) {\n requestOptions.headers = headerTuples;\n }\n\n return dispatchRequest(requestOptions, url, config.signal ?? null);\n}\n\nexport async function createTransport(options?: CreateTransportOptions): Promise<Transport> {\n const mode = resolveEmulationMode(options?.browser, options?.os, options?.emulation);\n\n if (options?.poolIdleTimeout !== undefined) {\n validatePositiveNumber(options.poolIdleTimeout, \"poolIdleTimeout\");\n }\n if (options?.poolMaxIdlePerHost !== undefined) {\n validateNonNegativeInteger(options.poolMaxIdlePerHost, \"poolMaxIdlePerHost\");\n }\n if (options?.poolMaxSize !== undefined) {\n validatePositiveInteger(options.poolMaxSize, \"poolMaxSize\");\n }\n if (options?.connectTimeout !== undefined) {\n validatePositiveNumber(options.connectTimeout, \"connectTimeout\");\n }\n if (options?.readTimeout !== undefined) {\n validatePositiveNumber(options.readTimeout, \"readTimeout\");\n }\n\n try {\n const transportOptions: NativeTransportOptions = {\n ...(options?.proxy !== undefined && { proxy: options.proxy }),\n ...(options?.insecure !== undefined && { insecure: options.insecure }),\n ...(options?.poolIdleTimeout !== undefined && { poolIdleTimeout: options.poolIdleTimeout }),\n ...(options?.poolMaxIdlePerHost !== undefined && { poolMaxIdlePerHost: options.poolMaxIdlePerHost }),\n ...(options?.poolMaxSize !== undefined && { poolMaxSize: options.poolMaxSize }),\n ...(options?.connectTimeout !== undefined && { connectTimeout: options.connectTimeout }),\n ...(options?.readTimeout !== undefined && { readTimeout: options.readTimeout }),\n };\n applyNativeEmulationMode(transportOptions, mode);\n\n const id = nativeBinding.createTransport(transportOptions);\n\n return new Transport(id);\n } catch (error) {\n throw new RequestError(String(error));\n }\n}\n\nexport async function createSession(options?: CreateSessionOptions): Promise<Session> {\n const { sessionId, defaults } = normalizeSessionOptions(options);\n\n let createdId: string;\n let transportId: string;\n\n try {\n const transportOptions: NativeTransportOptions = {\n ...(defaults.proxy !== undefined && { proxy: defaults.proxy }),\n ...(defaults.insecure !== undefined && { insecure: defaults.insecure }),\n };\n applyNativeEmulationMode(transportOptions, defaults.transportMode);\n transportId = nativeBinding.createTransport(transportOptions);\n } catch (error) {\n throw new RequestError(String(error));\n }\n\n try {\n createdId = nativeBinding.createSession({\n sessionId,\n });\n } catch (error) {\n try {\n nativeBinding.dropTransport(transportId);\n } catch {\n // Best-effort cleanup; prefer surfacing the original error.\n }\n throw new RequestError(String(error));\n }\n\n defaults.transportId = transportId;\n defaults.ownsTransport = true;\n\n return new Session(createdId, defaults);\n}\n\nexport async function withSession<T>(\n fn: (session: Session) => Promise<T> | T,\n options?: CreateSessionOptions,\n): Promise<T> {\n const session = await createSession(options);\n\n try {\n return await fn(session);\n } finally {\n await session.close();\n }\n}\n\n/**\n * @deprecated Use {@link fetch} instead.\n */\nexport async function request(options: RequestOptions): Promise<Response> {\n if (!options.url) {\n throw new RequestError(\"URL is required\");\n }\n\n const { url, ...rest } = options;\n const init: WreqRequestInit = {};\n const legacy = rest as Partial<WreqRequestInit> & { ephemeral?: boolean };\n\n if (rest.method !== undefined) {\n init.method = rest.method;\n }\n\n if (rest.headers !== undefined) {\n init.headers = rest.headers;\n }\n\n if (rest.body !== undefined) {\n init.body = rest.body;\n }\n\n if (rest.browser !== undefined) {\n init.browser = rest.browser;\n }\n\n if (rest.os !== undefined) {\n init.os = rest.os;\n }\n\n if (rest.emulation !== undefined) {\n init.emulation = rest.emulation;\n }\n\n if (rest.proxy !== undefined) {\n init.proxy = rest.proxy;\n }\n\n if (rest.timeout !== undefined) {\n init.timeout = rest.timeout;\n }\n\n if (rest.sessionId !== undefined) {\n init.sessionId = rest.sessionId;\n }\n\n if (rest.transport !== undefined) {\n init.transport = rest.transport;\n }\n\n if (rest.insecure !== undefined) {\n init.insecure = rest.insecure;\n }\n\n if (rest.disableDefaultHeaders !== undefined) {\n init.disableDefaultHeaders = rest.disableDefaultHeaders;\n }\n\n if (rest.redirect !== undefined) {\n init.redirect = rest.redirect;\n }\n\n if (legacy.signal !== undefined) {\n init.signal = legacy.signal;\n }\n\n if (legacy.session !== undefined) {\n init.session = legacy.session;\n }\n\n if (legacy.cookieMode !== undefined) {\n init.cookieMode = legacy.cookieMode;\n } else if (legacy.ephemeral === true) {\n init.cookieMode = \"ephemeral\";\n }\n\n return fetch(url, init);\n}\n\n/**\n * Get list of available browser profiles\n *\n * @returns Array of browser profile names\n *\n * @example\n * ```typescript\n * import { getProfiles } from 'wreq-js';\n *\n * const profiles = getProfiles();\n * console.log(profiles); // ['chrome_131', 'chrome_142', 'firefox_135', 'safari_18', ...]\n * ```\n */\nexport function getProfiles(): BrowserProfile[] {\n if (!cachedProfiles) {\n cachedProfiles = nativeBinding.getProfiles() as BrowserProfile[];\n }\n\n return cachedProfiles;\n}\n\nfunction getProfileSet(): Set<string> {\n if (!cachedProfileSet) {\n cachedProfileSet = new Set(getProfiles());\n }\n\n return cachedProfileSet;\n}\n\n/**\n * Get list of supported operating systems for emulation.\n *\n * @returns Array of operating system identifiers\n */\nexport function getOperatingSystems(): EmulationOS[] {\n if (!cachedOperatingSystems) {\n const fromNative = nativeBinding.getOperatingSystems?.() as EmulationOS[] | undefined;\n cachedOperatingSystems = fromNative && fromNative.length > 0 ? fromNative : [...SUPPORTED_OSES];\n }\n\n return cachedOperatingSystems;\n}\n\nfunction getOperatingSystemSet(): Set<string> {\n if (!cachedOperatingSystemSet) {\n cachedOperatingSystemSet = new Set(getOperatingSystems());\n }\n\n return cachedOperatingSystemSet;\n}\n\n/**\n * Convenience helper for GET requests using {@link fetch}.\n */\nexport async function get(url: string | URL | Request, init?: Omit<WreqRequestInit, \"method\">): Promise<Response> {\n const config: WreqRequestInit = {};\n if (init) {\n Object.assign(config, init);\n }\n config.method = \"GET\";\n return fetch(url, config);\n}\n\n/**\n * Convenience helper for POST requests using {@link fetch}.\n */\nexport async function post(\n url: string | URL | Request,\n body?: BodyInit | null,\n init?: Omit<WreqRequestInit, \"method\" | \"body\">,\n): Promise<Response> {\n const config: WreqRequestInit = {};\n if (init) {\n Object.assign(config, init);\n }\n config.method = \"POST\";\n if (body !== undefined) {\n config.body = body;\n }\n\n return fetch(url, config);\n}\n\nfunction normalizeWebSocketUrl(url: string | URL): string {\n const normalized = String(url).trim();\n if (!normalized) {\n throw new RequestError(\"URL is required\");\n }\n\n let parsed: URL;\n try {\n parsed = new URL(normalized);\n } catch (error) {\n throw new RequestError(String(error));\n }\n\n if (parsed.hash) {\n throw new RequestError(\"WebSocket URL must not include a hash fragment\");\n }\n\n if (parsed.protocol === \"http:\") {\n parsed.protocol = \"ws:\";\n } else if (parsed.protocol === \"https:\") {\n parsed.protocol = \"wss:\";\n }\n\n if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new RequestError(\"expected a ws: or wss: url\");\n }\n\n return parsed.toString();\n}\n\nfunction validateWebSocketProtocols(protocols?: string | string[]): void {\n if (protocols === undefined) {\n return;\n }\n\n const protocolList = typeof protocols === \"string\" ? [protocols] : protocols;\n const seen = new Set<string>();\n const validToken = /^[!#$%&'*+\\-.^_`|~0-9A-Za-z]+$/;\n\n for (const protocol of protocolList) {\n if (typeof protocol !== \"string\" || protocol.length === 0) {\n throw new RequestError(\"WebSocket protocol values must be non-empty strings\");\n }\n if (!validToken.test(protocol)) {\n throw new RequestError(`Invalid WebSocket protocol value: ${protocol}`);\n }\n if (seen.has(protocol)) {\n throw new RequestError(`Duplicate WebSocket protocol: ${protocol}`);\n }\n seen.add(protocol);\n }\n}\n\nfunction normalizeStandaloneWebSocketOptions(options?: Partial<WebSocketOptions>): WebSocketOptions {\n const normalized: WebSocketOptions = {};\n if (!options) {\n return normalized;\n }\n\n if (options.browser !== undefined) {\n normalized.browser = options.browser;\n }\n if (options.os !== undefined) {\n normalized.os = options.os;\n }\n if (options.emulation !== undefined) {\n normalized.emulation = options.emulation;\n }\n if (options.headers !== undefined) {\n normalized.headers = options.headers;\n }\n if (options.proxy !== undefined) {\n normalized.proxy = options.proxy;\n }\n if (options.protocols !== undefined) {\n normalized.protocols = options.protocols;\n }\n if (options.binaryType !== undefined) {\n if (options.binaryType !== \"nodebuffer\" && options.binaryType !== \"arraybuffer\" && options.binaryType !== \"blob\") {\n throw new RequestError(\"binaryType must be one of: 'nodebuffer', 'arraybuffer', 'blob'\");\n }\n normalized.binaryType = options.binaryType;\n }\n\n return normalized;\n}\n\nfunction normalizeSessionWebSocketOptions(options?: Partial<SessionWebSocketOptions>): SessionWebSocketOptions {\n const normalized: SessionWebSocketOptions = {};\n if (!options) {\n return normalized;\n }\n\n const optionsWithOverrides = options as Partial<WebSocketOptions>;\n if (optionsWithOverrides.browser !== undefined) {\n throw new RequestError(\n \"`browser` is not supported in session.websocket(); the session controls browser emulation.\",\n );\n }\n if (optionsWithOverrides.os !== undefined) {\n throw new RequestError(\"`os` is not supported in session.websocket(); the session controls OS emulation.\");\n }\n if (optionsWithOverrides.emulation !== undefined) {\n throw new RequestError(\n \"`emulation` is not supported in session.websocket(); the session transport controls emulation.\",\n );\n }\n if (optionsWithOverrides.proxy !== undefined) {\n throw new RequestError(\"`proxy` is not supported in session.websocket(); the session transport controls proxying.\");\n }\n\n if (options.headers !== undefined) {\n normalized.headers = options.headers;\n }\n if (options.protocols !== undefined) {\n normalized.protocols = options.protocols;\n }\n if (options.binaryType !== undefined) {\n if (options.binaryType !== \"nodebuffer\" && options.binaryType !== \"arraybuffer\" && options.binaryType !== \"blob\") {\n throw new RequestError(\"binaryType must be one of: 'nodebuffer', 'arraybuffer', 'blob'\");\n }\n normalized.binaryType = options.binaryType;\n }\n\n return normalized;\n}\n\nfunction extractLegacyWebSocketCallbacks(options: unknown): LegacyWebSocketCallbacks | undefined {\n if (!isPlainObject(options)) {\n return undefined;\n }\n\n const maybeCallbacks = options as Partial<LegacyWebSocketCallbacks>;\n const callbacks: LegacyWebSocketCallbacks = {};\n\n if (typeof maybeCallbacks.onMessage === \"function\") {\n callbacks.onMessage = maybeCallbacks.onMessage;\n }\n if (typeof maybeCallbacks.onClose === \"function\") {\n callbacks.onClose = maybeCallbacks.onClose;\n }\n if (typeof maybeCallbacks.onError === \"function\") {\n callbacks.onError = maybeCallbacks.onError;\n }\n\n return Object.keys(callbacks).length > 0 ? callbacks : undefined;\n}\n\nfunction normalizeWebSocketCloseOptions(code?: number, reason?: string): NativeWebSocketCloseOptions | undefined {\n if (code === undefined && reason === undefined) {\n return undefined;\n }\n\n if (code === undefined) {\n throw new RequestError(\"A close code is required when providing a close reason\");\n }\n\n if (!Number.isInteger(code)) {\n throw new RequestError(\"Close code must be an integer\");\n }\n if (code !== 1000 && (code < 3000 || code > 4999)) {\n throw new RequestError(\"Close code must be 1000 or in range 3000-4999\");\n }\n\n const normalizedReason = reason ?? \"\";\n if (Buffer.byteLength(normalizedReason, \"utf8\") > 123) {\n throw new RequestError(\"Close reason must be 123 bytes or fewer\");\n }\n\n return {\n code,\n reason: normalizedReason,\n };\n}\n\ntype WebSocketAnyEvent = WebSocketOpenEvent | WebSocketMessageEvent | WebSocketCloseEvent | WebSocketErrorEvent;\ntype WebSocketFunctionListener = (this: WebSocket, event: WebSocketAnyEvent) => void;\ntype WebSocketObjectListener = { handleEvent: (event: WebSocketAnyEvent) => void };\ntype WebSocketListener = WebSocketFunctionListener | WebSocketObjectListener;\ntype WebSocketAddEventListenerOptions = boolean | { once?: boolean; signal?: AbortSignal | null };\ntype WebSocketListenerType = \"open\" | \"message\" | \"close\" | \"error\";\n\ntype WebSocketListenerDescriptor = {\n listener: WebSocketListener;\n order: number;\n once: boolean;\n abortSignal?: AbortSignal | null;\n abortHandler?: () => void;\n};\n\nfunction isWebSocketListenerType(type: string): type is WebSocketListenerType {\n return type === \"open\" || type === \"message\" || type === \"close\" || type === \"error\";\n}\n\n/**\n * WHATWG-style WebSocket API with async connection establishment.\n */\nexport class WebSocket {\n static readonly CONNECTING = 0;\n static readonly OPEN = 1;\n static readonly CLOSING = 2;\n static readonly CLOSED = 3;\n\n readonly url: string;\n protocol = \"\";\n extensions = \"\";\n readyState = WebSocket.CONNECTING;\n private _binaryType: WebSocketBinaryType = \"nodebuffer\";\n private _bufferedAmount = 0;\n\n private _onopen: ((this: WebSocket, event: WebSocketOpenEvent) => void) | null = null;\n private _onmessage: ((this: WebSocket, event: WebSocketMessageEvent) => void) | null = null;\n private _onclose: ((this: WebSocket, event: WebSocketCloseEvent) => void) | null = null;\n private _onerror: ((this: WebSocket, event: WebSocketErrorEvent) => void) | null = null;\n private _onHandlerOrder = {\n open: -1,\n message: -1,\n close: -1,\n error: -1,\n };\n private _listenerOrderCounter = 0;\n\n private readonly _listeners = {\n open: new Map<WebSocketListener, WebSocketListenerDescriptor>(),\n message: new Map<WebSocketListener, WebSocketListenerDescriptor>(),\n close: new Map<WebSocketListener, WebSocketListenerDescriptor>(),\n error: new Map<WebSocketListener, WebSocketListenerDescriptor>(),\n };\n private readonly _legacyCallbacks: LegacyWebSocketCallbacks | undefined;\n private readonly _openDispatchMode: WebSocketOpenDispatchMode;\n private _connection: NativeWebSocketConnection | undefined;\n private _connectPromise!: Promise<void>;\n private _closeOptions: NativeWebSocketCloseOptions | undefined;\n private _finalizerToken: NativeWebSocketConnection | undefined;\n private _openEventDispatched = false;\n private _openEventQueued = false;\n private _closeEventDispatched = false;\n private _nativeCloseStarted = false;\n private _pendingMessages: Array<string | Buffer> = [];\n private _sendChain: Promise<void> = Promise.resolve();\n\n constructor(init: InternalWebSocketInit);\n constructor(url: string | URL, protocols?: string | string[]);\n constructor(url: string | URL, protocols?: string | string[], options?: WebSocketOptions);\n constructor(url: string | URL, options?: WebSocketOptions);\n constructor(\n urlOrInit: string | URL | InternalWebSocketInit,\n protocolsOrOptions?: string | string[] | WebSocketOptions,\n maybeOptions?: WebSocketOptions,\n ) {\n let init: InternalWebSocketInit;\n if (isInternalWebSocketInit(urlOrInit)) {\n init = urlOrInit;\n } else {\n init = WebSocket.buildStandaloneInit(urlOrInit, protocolsOrOptions, maybeOptions);\n }\n\n this.url = init.url;\n this.binaryType = init.options.binaryType ?? \"nodebuffer\";\n this._legacyCallbacks = init.legacyCallbacks;\n this._openDispatchMode = init.openDispatchMode;\n this._connectPromise = this.connect(init.connect);\n void this._connectPromise.catch(() => undefined);\n }\n\n get binaryType(): WebSocketBinaryType {\n return this._binaryType;\n }\n\n set binaryType(value: WebSocketBinaryType) {\n if (value === \"arraybuffer\" || value === \"blob\" || value === \"nodebuffer\") {\n this._binaryType = value;\n }\n }\n\n get bufferedAmount(): number {\n return this._bufferedAmount;\n }\n\n get onopen(): ((this: WebSocket, event: WebSocketOpenEvent) => void) | null {\n return this._onopen;\n }\n\n set onopen(listener: ((this: WebSocket, event: WebSocketOpenEvent) => void) | null) {\n this._onopen = listener;\n this._onHandlerOrder.open = listener ? ++this._listenerOrderCounter : -1;\n }\n\n get onmessage(): ((this: WebSocket, event: WebSocketMessageEvent) => void) | null {\n return this._onmessage;\n }\n\n set onmessage(listener: ((this: WebSocket, event: WebSocketMessageEvent) => void) | null) {\n this._onmessage = listener;\n this._onHandlerOrder.message = listener ? ++this._listenerOrderCounter : -1;\n }\n\n get onclose(): ((this: WebSocket, event: WebSocketCloseEvent) => void) | null {\n return this._onclose;\n }\n\n set onclose(listener: ((this: WebSocket, event: WebSocketCloseEvent) => void) | null) {\n this._onclose = listener;\n this._onHandlerOrder.close = listener ? ++this._listenerOrderCounter : -1;\n }\n\n get onerror(): ((this: WebSocket, event: WebSocketErrorEvent) => void) | null {\n return this._onerror;\n }\n\n set onerror(listener: ((this: WebSocket, event: WebSocketErrorEvent) => void) | null) {\n this._onerror = listener;\n this._onHandlerOrder.error = listener ? ++this._listenerOrderCounter : -1;\n }\n\n static async _connectWithInit(init: InternalWebSocketInit): Promise<WebSocket> {\n const ws = new WebSocket(init);\n await ws._waitUntilConnected();\n ws.scheduleOpenEventAfterAwait();\n return ws;\n }\n\n private static buildStandaloneInit(\n url: string | URL,\n protocolsOrOptions?: string | string[] | WebSocketOptions,\n maybeOptions?: WebSocketOptions,\n ): InternalWebSocketInit {\n const optionsCandidate =\n typeof protocolsOrOptions === \"string\" || Array.isArray(protocolsOrOptions)\n ? maybeOptions\n : (protocolsOrOptions ?? maybeOptions);\n const normalizedOptions = normalizeStandaloneWebSocketOptions(optionsCandidate);\n validateWebSocketProtocols(\n typeof protocolsOrOptions === \"string\" || Array.isArray(protocolsOrOptions)\n ? protocolsOrOptions\n : normalizedOptions.protocols,\n );\n assertNoManualWebSocketProtocolHeader(normalizedOptions.headers);\n const emulationMode = resolveEmulationMode(\n normalizedOptions.browser,\n normalizedOptions.os,\n normalizedOptions.emulation,\n );\n const protocols = normalizeWebSocketProtocolList(\n typeof protocolsOrOptions === \"string\" || Array.isArray(protocolsOrOptions)\n ? protocolsOrOptions\n : normalizedOptions.protocols,\n );\n\n return {\n _internal: true,\n url: normalizeWebSocketUrl(url),\n options: normalizedOptions,\n openDispatchMode: \"automatic\",\n connect: (callbacks) => {\n const nativeOptions: NativeWebSocketOptions = {\n url: normalizeWebSocketUrl(url),\n headers: headersToTuples(normalizedOptions.headers ?? {}),\n ...(protocols && protocols.length > 0 && { protocols }),\n ...(normalizedOptions.proxy !== undefined && { proxy: normalizedOptions.proxy }),\n onMessage: callbacks.onMessage,\n onClose: callbacks.onClose,\n onError: callbacks.onError,\n };\n applyNativeEmulationMode(nativeOptions, emulationMode);\n return nativeBinding.websocketConnect(nativeOptions);\n },\n legacyCallbacks: extractLegacyWebSocketCallbacks(optionsCandidate),\n };\n }\n\n private async connect(\n connectFn: (callbacks: {\n onMessage: (data: string | Buffer) => void;\n onClose: (event: NativeWebSocketCloseEvent) => void;\n onError: (message: string) => void;\n }) => Promise<NativeWebSocketConnection>,\n ): Promise<void> {\n try {\n const connection = await connectFn({\n onMessage: (data) => {\n this.handleNativeMessage(data);\n },\n onClose: (event) => {\n this.handleNativeClose(event);\n },\n onError: (message) => {\n this.handleNativeError(message);\n },\n });\n\n this._connection = connection;\n this.protocol = connection.protocol ?? \"\";\n this.extensions = connection.extensions ?? \"\";\n if (websocketFinalizer) {\n this._finalizerToken = connection;\n websocketFinalizer.register(this, connection, connection);\n }\n\n if (this.readyState === WebSocket.CLOSING) {\n this.startNativeClose();\n return;\n }\n\n this.readyState = WebSocket.OPEN;\n if (this._openDispatchMode === \"automatic\") {\n this.scheduleOpenEventAfterConnect();\n }\n } catch (error) {\n this.handleNativeError(String(error));\n this.finalizeClosed({ code: 1006, reason: \"\" }, false);\n throw new RequestError(String(error));\n }\n }\n\n private _waitUntilConnected(): Promise<void> {\n return this._connectPromise;\n }\n\n private scheduleOpenEventAfterConnect(): void {\n this.scheduleOpenEventWithDepth(2);\n }\n\n private scheduleOpenEventAfterAwait(): void {\n this.scheduleOpenEventWithDepth(3);\n }\n\n private scheduleOpenEventWithDepth(depth: number): void {\n if (this._openEventDispatched || this._openEventQueued || this.readyState !== WebSocket.OPEN) {\n return;\n }\n this._openEventQueued = true;\n\n const queue = (remaining: number) => {\n if (remaining === 0) {\n this._openEventQueued = false;\n if (this._openEventDispatched || this.readyState !== WebSocket.OPEN) {\n return;\n }\n this._openEventDispatched = true;\n this.dispatchOpenEvent();\n return;\n }\n\n queueMicrotask(() => {\n queue(remaining - 1);\n });\n };\n\n queue(depth);\n }\n\n private releaseConnectionTracking(): void {\n if (!this._finalizerToken || !websocketFinalizer) {\n return;\n }\n websocketFinalizer.unregister(this._finalizerToken);\n this._finalizerToken = undefined;\n }\n\n private toMessageEventData(data: string | Buffer): string | Buffer | ArrayBuffer | Blob {\n if (typeof data === \"string\") {\n return data;\n }\n if (this._binaryType === \"arraybuffer\") {\n const arrayBuffer = new ArrayBuffer(data.byteLength);\n new Uint8Array(arrayBuffer).set(data);\n return arrayBuffer;\n }\n if (this._binaryType === \"blob\") {\n return new Blob([data]);\n }\n return data;\n }\n\n private invokeListener(listener: WebSocketListener, event: WebSocketAnyEvent): void {\n try {\n if (typeof listener === \"function\") {\n listener.call(this, event);\n } else {\n listener.handleEvent(event);\n }\n } catch {\n // Event listener errors should not break native callback dispatch.\n }\n }\n\n private createBaseEvent<TType extends WebSocketAnyEvent[\"type\"]>(type: TType) {\n return {\n type,\n isTrusted: false as const,\n timeStamp: Date.now(),\n target: this,\n currentTarget: this,\n };\n }\n\n private getOnHandler(type: WebSocketListenerType): WebSocketFunctionListener | null {\n switch (type) {\n case \"open\":\n return this._onopen as WebSocketFunctionListener | null;\n case \"message\":\n return this._onmessage as WebSocketFunctionListener | null;\n case \"close\":\n return this._onclose as WebSocketFunctionListener | null;\n case \"error\":\n return this._onerror as WebSocketFunctionListener | null;\n default:\n return null;\n }\n }\n\n private getOnHandlerOrder(type: WebSocketListenerType): number {\n return this._onHandlerOrder[type];\n }\n\n private getListenerMap(type: WebSocketListenerType): Map<WebSocketListener, WebSocketListenerDescriptor> {\n return this._listeners[type];\n }\n\n private dispatchEvent(type: WebSocketListenerType, event: WebSocketAnyEvent): void {\n const listenerMap = this.getListenerMap(type);\n const onHandler = this.getOnHandler(type);\n if (listenerMap.size === 0 && !onHandler) {\n return;\n }\n\n const ordered: Array<{ order: number; listener: WebSocketListener; once: boolean }> = [];\n for (const descriptor of listenerMap.values()) {\n ordered.push({\n order: descriptor.order,\n listener: descriptor.listener,\n once: descriptor.once,\n });\n }\n\n if (onHandler) {\n ordered.push({\n order: this.getOnHandlerOrder(type),\n listener: onHandler,\n once: false,\n });\n }\n\n ordered.sort((a, b) => a.order - b.order);\n\n for (const entry of ordered) {\n if (entry.once) {\n this.removeEventListener(type, entry.listener);\n }\n this.invokeListener(entry.listener, event);\n }\n }\n\n private dispatchOpenEvent(): void {\n const event: WebSocketOpenEvent = this.createBaseEvent(\"open\");\n this.dispatchEvent(\"open\", event);\n if (!this._closeEventDispatched && this._pendingMessages.length > 0) {\n const pending = this._pendingMessages;\n this._pendingMessages = [];\n for (const data of pending) {\n this.dispatchMessageEvent(this.toMessageEventData(data));\n }\n }\n }\n\n private dispatchMessageEvent(data: string | Buffer | ArrayBuffer | Blob): void {\n const event: WebSocketMessageEvent = {\n ...this.createBaseEvent(\"message\"),\n data,\n };\n this.dispatchEvent(\"message\", event);\n }\n\n private dispatchCloseEvent(event: WebSocketCloseEvent): void {\n this.dispatchEvent(\"close\", event);\n }\n\n private dispatchErrorEvent(message?: string): void {\n const event: WebSocketErrorEvent = {\n ...this.createBaseEvent(\"error\"),\n ...(message !== undefined && { message }),\n };\n this.dispatchEvent(\"error\", event);\n }\n\n private handleNativeMessage(data: string | Buffer): void {\n if (this._closeEventDispatched) {\n return;\n }\n\n this._legacyCallbacks?.onMessage?.(data);\n if (!this._openEventDispatched && this.readyState === WebSocket.OPEN) {\n this._pendingMessages.push(data);\n return;\n }\n this.dispatchMessageEvent(this.toMessageEventData(data));\n }\n\n private handleNativeError(message: string): void {\n this._legacyCallbacks?.onError?.(message);\n this.dispatchErrorEvent(message);\n }\n\n private handleNativeClose(event: NativeWebSocketCloseEvent): void {\n const wasClean = this.readyState === WebSocket.CLOSING || event.code === 1000;\n this.finalizeClosed(event, wasClean);\n }\n\n private finalizeClosed(event: NativeWebSocketCloseEvent, wasClean: boolean): void {\n if (this._closeEventDispatched) {\n return;\n }\n\n this.readyState = WebSocket.CLOSED;\n this._closeEventDispatched = true;\n this._pendingMessages = [];\n this.releaseConnectionTracking();\n\n const closeEvent: WebSocketCloseEvent = {\n ...this.createBaseEvent(\"close\"),\n code: event.code,\n reason: event.reason,\n wasClean,\n };\n\n this._legacyCallbacks?.onClose?.(closeEvent);\n this.dispatchCloseEvent(closeEvent);\n }\n\n private startNativeClose(): void {\n if (this._nativeCloseStarted || !this._connection) {\n return;\n }\n this._nativeCloseStarted = true;\n const connection = this._connection;\n const closeOptions = this._closeOptions;\n\n void nativeBinding.websocketClose(connection, closeOptions).catch((error) => {\n this.handleNativeError(String(error));\n this.finalizeClosed({ code: 1006, reason: \"\" }, false);\n });\n }\n\n addEventListener(\n type: \"open\",\n listener: ((event: WebSocketOpenEvent) => void) | null,\n options?: WebSocketAddEventListenerOptions,\n ): void;\n addEventListener(\n type: \"message\",\n listener: ((event: WebSocketMessageEvent) => void) | null,\n options?: WebSocketAddEventListenerOptions,\n ): void;\n addEventListener(\n type: \"close\",\n listener: ((event: WebSocketCloseEvent) => void) | null,\n options?: WebSocketAddEventListenerOptions,\n ): void;\n addEventListener(\n type: \"error\",\n listener: ((event: WebSocketErrorEvent) => void) | null,\n options?: WebSocketAddEventListenerOptions,\n ): void;\n addEventListener(type: string, listener: unknown, options?: WebSocketAddEventListenerOptions): void;\n addEventListener(type: string, listener: unknown, options?: WebSocketAddEventListenerOptions): void {\n if (!listener || !isWebSocketListenerType(type)) {\n return;\n }\n\n const normalizedListener = listener as WebSocketListener;\n if (\n typeof normalizedListener !== \"function\" &&\n (typeof normalizedListener !== \"object\" ||\n normalizedListener === null ||\n typeof normalizedListener.handleEvent !== \"function\")\n ) {\n return;\n }\n const listenerMap = this.getListenerMap(type);\n if (listenerMap.has(normalizedListener)) {\n return;\n }\n\n const parsedOptions = typeof options === \"boolean\" ? {} : (options ?? {});\n const once = parsedOptions.once === true;\n const signal = parsedOptions.signal;\n\n if (signal?.aborted) {\n return;\n }\n\n const descriptor: WebSocketListenerDescriptor = {\n listener: normalizedListener,\n order: ++this._listenerOrderCounter,\n once,\n };\n\n if (signal) {\n const onAbort = () => {\n this.removeEventListener(type, normalizedListener);\n };\n descriptor.abortSignal = signal;\n descriptor.abortHandler = onAbort;\n signal.addEventListener(\"abort\", onAbort, { once: true });\n }\n\n listenerMap.set(normalizedListener, descriptor);\n }\n\n removeEventListener(type: \"open\", listener: ((event: WebSocketOpenEvent) => void) | null): void;\n removeEventListener(type: \"message\", listener: ((event: WebSocketMessageEvent) => void) | null): void;\n removeEventListener(type: \"close\", listener: ((event: WebSocketCloseEvent) => void) | null): void;\n removeEventListener(type: \"error\", listener: ((event: WebSocketErrorEvent) => void) | null): void;\n removeEventListener(type: string, listener: unknown): void;\n removeEventListener(type: string, listener: unknown): void {\n if (!listener || !isWebSocketListenerType(type)) {\n return;\n }\n\n const normalizedListener = listener as WebSocketListener;\n if (typeof normalizedListener !== \"function\" && typeof normalizedListener !== \"object\") {\n return;\n }\n const listenerMap = this.getListenerMap(type);\n const descriptor = listenerMap.get(normalizedListener);\n if (!descriptor) {\n return;\n }\n\n if (descriptor.abortSignal && descriptor.abortHandler) {\n descriptor.abortSignal.removeEventListener(\"abort\", descriptor.abortHandler);\n }\n\n listenerMap.delete(normalizedListener);\n }\n\n private getSendByteLength(data: string | Buffer | ArrayBuffer | ArrayBufferView | Blob): number {\n if (typeof data === \"string\") {\n return Buffer.byteLength(data);\n }\n if (Buffer.isBuffer(data)) {\n return data.byteLength;\n }\n if (data instanceof ArrayBuffer) {\n return data.byteLength;\n }\n if (ArrayBuffer.isView(data)) {\n return data.byteLength;\n }\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return data.size;\n }\n\n throw new TypeError(\"WebSocket data must be a string, Buffer, ArrayBuffer, ArrayBufferView, or Blob\");\n }\n\n private async normalizeSendPayload(\n data: string | Buffer | ArrayBuffer | ArrayBufferView | Blob,\n ): Promise<string | Buffer> {\n if (typeof data === \"string\") {\n return data;\n }\n if (Buffer.isBuffer(data)) {\n return data;\n }\n if (data instanceof ArrayBuffer) {\n return Buffer.from(data);\n }\n if (ArrayBuffer.isView(data)) {\n return Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n }\n if (typeof Blob !== \"undefined\" && data instanceof Blob) {\n return Buffer.from(await data.arrayBuffer());\n }\n\n throw new TypeError(\"WebSocket data must be a string, Buffer, ArrayBuffer, ArrayBufferView, or Blob\");\n }\n\n send(data: string | Buffer | ArrayBuffer | ArrayBufferView | Blob): void {\n if (this.readyState !== WebSocket.OPEN || !this._connection) {\n throw new RequestError(\"WebSocket is not open\");\n }\n\n const queuedBytes = this.getSendByteLength(data);\n const connection = this._connection;\n this._bufferedAmount += queuedBytes;\n const sendTask = async () => {\n try {\n const payload = await this.normalizeSendPayload(data);\n await nativeBinding.websocketSend(connection, payload);\n } catch (error) {\n this.handleNativeError(String(error));\n this.finalizeClosed({ code: 1006, reason: \"\" }, false);\n } finally {\n this._bufferedAmount = Math.max(0, this._bufferedAmount - queuedBytes);\n }\n };\n this._sendChain = this._sendChain.then(sendTask, sendTask);\n }\n\n close(code?: number, reason?: string): void {\n if (this.readyState === WebSocket.CLOSING || this.readyState === WebSocket.CLOSED) {\n return;\n }\n\n this._closeOptions = normalizeWebSocketCloseOptions(code, reason);\n this.readyState = WebSocket.CLOSING;\n this.startNativeClose();\n }\n}\n\nfunction isInternalWebSocketInit(value: unknown): value is InternalWebSocketInit {\n if (!isPlainObject(value)) {\n return false;\n }\n\n const candidate = value as Partial<InternalWebSocketInit>;\n return candidate._internal === true && typeof candidate.url === \"string\" && typeof candidate.connect === \"function\";\n}\n\nfunction normalizeStandaloneWebSocketArgs(\n urlOrOptions: string | URL | LegacyWebSocketOptions,\n options?: WebSocketOptions,\n): { url: string; options: WebSocketOptions; legacyCallbacks: LegacyWebSocketCallbacks | undefined } {\n if (typeof urlOrOptions === \"string\" || urlOrOptions instanceof URL) {\n const normalizedOptions = normalizeStandaloneWebSocketOptions(options);\n return {\n url: normalizeWebSocketUrl(urlOrOptions),\n options: normalizedOptions,\n legacyCallbacks: extractLegacyWebSocketCallbacks(options),\n };\n }\n\n const legacy = urlOrOptions;\n const normalizedOptions = normalizeStandaloneWebSocketOptions(legacy);\n return {\n url: normalizeWebSocketUrl(legacy.url),\n options: normalizedOptions,\n legacyCallbacks: extractLegacyWebSocketCallbacks(legacy),\n };\n}\n\nfunction normalizeSessionWebSocketArgs(\n urlOrOptions: string | URL | LegacySessionWebSocketOptions,\n options?: SessionWebSocketOptions,\n): { url: string; options: SessionWebSocketOptions; legacyCallbacks: LegacyWebSocketCallbacks | undefined } {\n if (typeof urlOrOptions === \"string\" || urlOrOptions instanceof URL) {\n const normalizedOptions = normalizeSessionWebSocketOptions(options);\n return {\n url: normalizeWebSocketUrl(urlOrOptions),\n options: normalizedOptions,\n legacyCallbacks: extractLegacyWebSocketCallbacks(options),\n };\n }\n\n const legacy = urlOrOptions;\n const normalizedOptions = normalizeSessionWebSocketOptions(legacy);\n return {\n url: normalizeWebSocketUrl(legacy.url),\n options: normalizedOptions,\n legacyCallbacks: extractLegacyWebSocketCallbacks(legacy),\n };\n}\n\n/**\n * Create a WebSocket connection with browser impersonation.\n */\nexport async function websocket(url: string | URL, options?: WebSocketOptions): Promise<WebSocket>;\nexport async function websocket(options: LegacyWebSocketOptions): Promise<WebSocket>;\nexport async function websocket(\n urlOrOptions: string | URL | LegacyWebSocketOptions,\n options?: WebSocketOptions,\n): Promise<WebSocket> {\n const normalized = normalizeStandaloneWebSocketArgs(urlOrOptions, options);\n validateWebSocketProtocols(normalized.options.protocols);\n assertNoManualWebSocketProtocolHeader(normalized.options.headers);\n const emulationMode = resolveEmulationMode(\n normalized.options.browser,\n normalized.options.os,\n normalized.options.emulation,\n );\n const protocols = normalizeWebSocketProtocolList(normalized.options.protocols);\n\n return WebSocket._connectWithInit({\n _internal: true,\n url: normalized.url,\n options: normalized.options,\n openDispatchMode: \"deferred\",\n connect: (callbacks) => {\n const nativeOptions: NativeWebSocketOptions = {\n url: normalized.url,\n headers: headersToTuples(normalized.options.headers ?? {}),\n ...(protocols && protocols.length > 0 && { protocols }),\n ...(normalized.options.proxy !== undefined && { proxy: normalized.options.proxy }),\n onMessage: callbacks.onMessage,\n onClose: callbacks.onClose,\n onError: callbacks.onError,\n };\n applyNativeEmulationMode(nativeOptions, emulationMode);\n return nativeBinding.websocketConnect(nativeOptions);\n },\n legacyCallbacks: normalized.legacyCallbacks,\n });\n}\n\nexport type {\n AlpnProtocol,\n AlpsProtocol,\n BodyInit,\n BrowserProfile,\n CookieMode,\n CreateSessionOptions,\n CreateTransportOptions,\n CustomEmulationOptions,\n CustomHttp1Options,\n CustomHttp2Options,\n CustomTlsOptions,\n EmulationOS,\n HeadersInit,\n Http2ExperimentalSetting,\n Http2Priority,\n Http2PseudoHeaderId,\n Http2SettingId,\n Http2StreamDependency,\n RequestInit,\n RequestOptions,\n SessionHandle,\n SessionWebSocketOptions,\n TlsVersion,\n WebSocketBinaryType,\n WebSocketCloseEvent,\n WebSocketErrorEvent,\n WebSocketEventType,\n WebSocketMessageEvent,\n WebSocketOpenEvent,\n WebSocketOptions,\n} from \"./types.js\";\n\nexport { RequestError };\n\nexport default {\n fetch,\n request,\n get,\n post,\n getProfiles,\n getOperatingSystems,\n createTransport,\n createSession,\n withSession,\n websocket,\n WebSocket,\n Headers,\n Response,\n Transport,\n Session,\n RequestError,\n};\n","// Import and re-export the auto-generated BrowserProfile and EmulationOS types\nimport type { BrowserProfile, EmulationOS } from \"./generated-types.js\";\nimport type { Session, Transport, WebSocket } from \"./wreq-js.js\";\nexport type { BrowserProfile, EmulationOS };\n\n/**\n * Controls how cookies are scoped for a request.\n * - \"session\": reuse an explicit Session or sessionId across calls.\n * - \"ephemeral\": create an isolated, single-use session.\n */\nexport type CookieMode = \"session\" | \"ephemeral\";\n\n/**\n * Minimal handle implemented by {@link Session}. Exposed for integrations\n * that only need to carry a session id.\n */\nexport interface SessionHandle {\n readonly id: string;\n}\n\n/**\n * A tuple of [name, value] pairs used for initializing headers.\n * Both name and value must be strings.\n *\n * @example\n * ```typescript\n * const headers: HeaderTuple = ['Content-Type', 'application/json'];\n * ```\n */\nexport type HeaderTuple = [string, string];\n\n/**\n * Represents various input types accepted when creating or initializing headers.\n * Can be an iterable of header tuples, an array of tuples, or a plain object.\n *\n * @example\n * ```typescript\n * // As an object\n * const headers: HeadersInit = { 'Content-Type': 'application/json' };\n *\n * // As an array of tuples\n * const headers: HeadersInit = [['Content-Type', 'application/json']];\n *\n * // As an iterable\n * const headers: HeadersInit = new Map([['Content-Type', 'application/json']]);\n * ```\n */\nexport type HeadersInit =\n | Iterable<HeaderTuple>\n | Array<HeaderTuple>\n | Record<string, string | number | boolean | null | undefined>;\n\nexport type AlpnProtocol = \"HTTP1\" | \"HTTP2\" | \"HTTP3\";\n\nexport type AlpsProtocol = \"HTTP1\" | \"HTTP2\" | \"HTTP3\";\n\nexport type TlsVersion = \"1.0\" | \"1.1\" | \"1.2\" | \"1.3\" | \"TLS1.0\" | \"TLS1.1\" | \"TLS1.2\" | \"TLS1.3\";\n\nexport type Http2PseudoHeaderId = \"Method\" | \"Scheme\" | \"Authority\" | \"Path\" | \"Protocol\";\n\nexport type Http2SettingId =\n | \"HeaderTableSize\"\n | \"EnablePush\"\n | \"MaxConcurrentStreams\"\n | \"InitialWindowSize\"\n | \"MaxFrameSize\"\n | \"MaxHeaderListSize\"\n | \"EnableConnectProtocol\"\n | \"NoRfc7540Priorities\";\n\nexport interface Http2StreamDependency {\n dependencyId: number;\n weight: number;\n exclusive?: boolean;\n}\n\nexport interface Http2Priority {\n streamId: number;\n dependency: Http2StreamDependency;\n}\n\nexport interface Http2ExperimentalSetting {\n id: number;\n value: number;\n}\n\nexport interface CustomTlsOptions {\n alpnProtocols?: AlpnProtocol[];\n alpsProtocols?: AlpsProtocol[];\n alpsUseNewCodepoint?: boolean;\n sessionTicket?: boolean;\n minTlsVersion?: TlsVersion;\n maxTlsVersion?: TlsVersion;\n preSharedKey?: boolean;\n enableEchGrease?: boolean;\n permuteExtensions?: boolean;\n greaseEnabled?: boolean;\n enableOcspStapling?: boolean;\n enableSignedCertTimestamps?: boolean;\n recordSizeLimit?: number;\n pskSkipSessionTicket?: boolean;\n keySharesLimit?: number;\n pskDheKe?: boolean;\n renegotiation?: boolean;\n delegatedCredentials?: string;\n curvesList?: string;\n cipherList?: string;\n sigalgsList?: string;\n certificateCompressionAlgorithms?: Array<\"zlib\" | \"brotli\" | \"zstd\">;\n extensionPermutation?: number[];\n aesHwOverride?: boolean;\n preserveTls13CipherList?: boolean;\n randomAesHwOverride?: boolean;\n}\n\nexport interface CustomHttp1Options {\n http09Responses?: boolean;\n writev?: boolean;\n maxHeaders?: number;\n readBufExactSize?: number;\n maxBufSize?: number;\n ignoreInvalidHeadersInResponses?: boolean;\n allowSpacesAfterHeaderNameInResponses?: boolean;\n allowObsoleteMultilineHeadersInResponses?: boolean;\n}\n\nexport interface CustomHttp2Options {\n adaptiveWindow?: boolean;\n initialStreamId?: number;\n initialConnectionWindowSize?: number;\n initialWindowSize?: number;\n initialMaxSendStreams?: number;\n maxFrameSize?: number;\n keepAliveInterval?: number;\n keepAliveTimeout?: number;\n keepAliveWhileIdle?: boolean;\n maxConcurrentResetStreams?: number;\n maxSendBufferSize?: number;\n maxConcurrentStreams?: number;\n maxHeaderListSize?: number;\n maxPendingAcceptResetStreams?: number;\n enablePush?: boolean;\n headerTableSize?: number;\n enableConnectProtocol?: boolean;\n noRfc7540Priorities?: boolean;\n settingsOrder?: Http2SettingId[];\n headersPseudoOrder?: Http2PseudoHeaderId[];\n headersStreamDependency?: Http2StreamDependency;\n priorities?: Http2Priority[];\n experimentalSettings?: Http2ExperimentalSetting[];\n}\n\nexport interface CustomEmulationOptions {\n tlsOptions?: CustomTlsOptions;\n http1Options?: CustomHttp1Options;\n http2Options?: CustomHttp2Options;\n headers?: HeadersInit;\n origHeaders?: string[];\n}\n\n/**\n * Represents the various types of data that can be used as a request body.\n * Supports strings, binary payloads, URL-encoded parameters, multipart forms, and blobs.\n *\n * @example\n * ```typescript\n * // String body\n * const body: BodyInit = JSON.stringify({ key: 'value' });\n *\n * // URLSearchParams\n * const body: BodyInit = new URLSearchParams({ key: 'value' });\n *\n * // Buffer\n * const body: BodyInit = Buffer.from('data');\n *\n * // FormData\n * const body: BodyInit = new FormData();\n * ```\n */\nexport type BodyInit = string | ArrayBuffer | ArrayBufferView | URLSearchParams | Buffer | Blob | FormData;\n\n/**\n * Details about why a WebSocket connection closed.\n */\nexport type WebSocketBinaryType = \"nodebuffer\" | \"arraybuffer\" | \"blob\";\n\nexport type WebSocketEventType = \"open\" | \"message\" | \"close\" | \"error\";\n\nexport interface WebSocketOpenEvent {\n type: \"open\";\n isTrusted: false;\n timeStamp: number;\n target: WebSocket;\n currentTarget: WebSocket;\n}\n\nexport interface WebSocketMessageEvent {\n type: \"message\";\n isTrusted: false;\n timeStamp: number;\n data: string | Buffer | ArrayBuffer | Blob;\n target: WebSocket;\n currentTarget: WebSocket;\n}\n\nexport interface WebSocketErrorEvent {\n type: \"error\";\n isTrusted: false;\n timeStamp: number;\n message?: string;\n target: WebSocket;\n currentTarget: WebSocket;\n}\n\nexport interface WebSocketCloseEvent {\n type: \"close\";\n isTrusted: false;\n timeStamp: number;\n\n /**\n * WebSocket close status code (RFC 6455).\n */\n code: number;\n\n /**\n * UTF-8 close reason sent by the peer.\n */\n reason: string;\n\n wasClean: boolean;\n target: WebSocket;\n currentTarget: WebSocket;\n}\n\n/**\n * Options for configuring a fetch style request with wreq-specific extensions\n * for browser impersonation, proxies, sessions, and timeouts.\n *\n * @example\n * ```typescript\n * const options: RequestInit = {\n * method: 'POST',\n * headers: { 'Content-Type': 'application/json' },\n * body: JSON.stringify({ key: 'value' }),\n * browser: 'chrome_142',\n * proxy: 'http://proxy.example.com:8080',\n * timeout: 5000\n * };\n * ```\n */\nexport interface RequestInit {\n /**\n * A string to set request's method.\n * @default 'GET'\n */\n method?: string;\n\n /**\n * A Headers object, an object literal, or an array of two-item arrays to set request's headers.\n */\n headers?: HeadersInit;\n\n /**\n * A BodyInit object or null to set request's body.\n */\n body?: BodyInit | null;\n\n /**\n * An AbortSignal to set request's signal.\n */\n signal?: AbortSignal | null;\n\n /**\n * A string indicating whether request follows redirects, results in an error upon\n * encountering a redirect, or returns the redirect (in an opaque fashion).\n * @default 'follow'\n */\n redirect?: \"follow\" | \"manual\" | \"error\";\n\n /**\n * Transport instance to use for this request. When provided, transport-level\n * options such as `browser`, `os`, `proxy`, and `insecure` must not be set.\n */\n transport?: Transport;\n\n /**\n * Browser profile to impersonate for this request.\n * Applies browser profile behavior handled by the native layer.\n * Ignored when `transport` is provided.\n * @default 'chrome_142'\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to emulate for this request.\n * Influences platform-specific behavior handled by the native layer.\n * Ignored when `transport` is provided.\n * @default 'macos'\n */\n os?: EmulationOS;\n\n /**\n * Custom emulation overrides. When `browser` or `os` is present, these fields\n * layer on top of the resolved preset profile. When both are omitted, this\n * switches the request into standalone custom emulation mode.\n */\n emulation?: CustomEmulationOptions;\n\n /**\n * Proxy URL to route the request through (e.g., 'http://proxy.example.com:8080').\n * Proxy support depends on the native layer and proxy scheme.\n * Ignored when `transport` is provided.\n */\n proxy?: string;\n\n /**\n * Request timeout in milliseconds. If the request takes longer than this value,\n * it will be aborted.\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Controls how cookies are managed for this call.\n * - \"ephemeral\": default when no session/sessionId is provided. Creates an isolated session per request.\n * - \"session\": requires an explicit session or sessionId and reuses its cookie jar.\n */\n cookieMode?: CookieMode;\n\n /**\n * Session instance to bind this request to. When provided, {@link cookieMode}\n * automatically behaves like `\"session\"`.\n */\n session?: Session;\n\n /**\n * Identifier of an existing session created elsewhere (e.g., via {@link createSession}).\n */\n sessionId?: string;\n\n /**\n * Disable default headers from browser emulation. When enabled, only explicitly\n * provided headers will be sent with the request, preventing emulation headers\n * from being automatically added or appended.\n * @default false\n */\n disableDefaultHeaders?: boolean;\n\n /**\n * Disable HTTPS certificate verification. When enabled, self-signed and invalid\n * certificates will be accepted.\n * Ignored when `transport` is provided.\n *\n * # Warning\n *\n * You should think very carefully before using this method. If invalid\n * certificates are trusted, *any* certificate for *any* site will be\n * trusted for use. This includes expired certificates. This introduces\n * significant vulnerabilities, and should only be used as a last resort.\n *\n * @default false\n */\n insecure?: boolean;\n\n /**\n * Whether to automatically decompress response bodies. When set to `false`,\n * the raw compressed response body is returned as-is and the `Content-Encoding`\n * header is preserved. Useful for proxy scenarios where the downstream client\n * handles decompression.\n * @default true\n */\n compress?: boolean;\n}\n\n/**\n * Configuration for {@link createSession}.\n */\nexport interface CreateSessionOptions {\n /**\n * Provide a custom identifier instead of an auto-generated random ID.\n */\n sessionId?: string;\n\n /**\n * Default headers applied to every request made through this session.\n */\n defaultHeaders?: HeadersInit;\n\n /**\n * Browser profile to bind to this session. Defaults to 'chrome_142'.\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to bind to this session. Defaults to 'macos'.\n */\n os?: EmulationOS;\n\n /**\n * Custom emulation overrides or a standalone custom emulation for the session transport.\n */\n emulation?: CustomEmulationOptions;\n /**\n * Optional proxy for every request made through the session.\n */\n proxy?: string;\n /**\n * Default timeout applied when {@link Session.fetch} is called without\n * overriding `timeout`.\n */\n timeout?: number;\n\n /**\n * Disable HTTPS certificate verification. When enabled, self-signed and invalid\n * certificates will be accepted for all requests made through this session.\n *\n * # Warning\n *\n * You should think very carefully before using this method. If invalid\n * certificates are trusted, *any* certificate for *any* site will be\n * trusted for use. This includes expired certificates. This introduces\n * significant vulnerabilities, and should only be used as a last resort.\n *\n * @default false\n */\n insecure?: boolean;\n}\n\n/**\n * Configuration for {@link createTransport}.\n */\nexport interface CreateTransportOptions {\n /**\n * Proxy URL to route requests through (e.g., 'http://proxy.example.com:8080').\n */\n proxy?: string;\n\n /**\n * Browser profile to impersonate for this transport.\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to emulate for this transport.\n */\n os?: EmulationOS;\n\n /**\n * Custom emulation overrides or a standalone custom emulation for this transport.\n */\n emulation?: CustomEmulationOptions;\n\n /**\n * Disable HTTPS certificate verification for this transport.\n */\n insecure?: boolean;\n\n /**\n * Idle timeout for pooled connections (ms).\n */\n poolIdleTimeout?: number;\n\n /**\n * Maximum number of idle connections per host.\n */\n poolMaxIdlePerHost?: number;\n\n /**\n * Maximum total connections in the pool.\n */\n poolMaxSize?: number;\n\n /**\n * TCP connect timeout (ms).\n */\n connectTimeout?: number;\n\n /**\n * Read timeout (ms).\n */\n readTimeout?: number;\n}\n\n/**\n * Legacy request options interface. This interface is deprecated and will be removed in a future version.\n *\n * @deprecated Use {@link RequestInit} with the standard `fetch()` API instead.\n *\n * @example\n * ```typescript\n * // Old (deprecated):\n * const options: RequestOptions = {\n * url: 'https://api.example.com',\n * method: 'POST',\n * body: JSON.stringify({ data: 'value' })\n * };\n *\n * // New (recommended):\n * const response = await fetch('https://api.example.com', {\n * method: 'POST',\n * body: JSON.stringify({ data: 'value' })\n * });\n * ```\n */\nexport interface RequestOptions {\n /**\n * The URL to request.\n */\n url: string;\n\n /**\n * Browser profile to impersonate.\n * Applies browser profile behavior handled by the native layer.\n * @default 'chrome_142'\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to emulate.\n * @default 'macos'\n */\n os?: EmulationOS;\n\n /**\n * Custom emulation overrides. When `browser` or `os` is present, these fields\n * layer on top of the resolved preset profile. When both are omitted, this\n * switches the request into standalone custom emulation mode.\n */\n emulation?: CustomEmulationOptions;\n\n /**\n * HTTP method to use for the request.\n * @default 'GET'\n */\n method?: string;\n\n /**\n * Additional headers to send with the request.\n * Browser-specific headers will be automatically added based on the selected browser profile.\n */\n headers?: Record<string, string> | HeaderTuple[];\n\n /**\n * Request body data (for POST, PUT, PATCH requests).\n */\n body?: BodyInit | null;\n\n /**\n * Transport instance to use for this request. When provided, transport-level\n * options such as `browser`, `os`, `proxy`, and `insecure` must not be set.\n */\n transport?: Transport;\n\n /**\n * Proxy URL to route the request through (e.g., 'http://proxy.example.com:8080').\n * Proxy support depends on the native layer and proxy scheme.\n */\n proxy?: string;\n\n /**\n * Redirect policy applied to this request. Matches the `redirect` option accepted by {@link fetch}.\n * @default \"follow\"\n */\n redirect?: \"follow\" | \"manual\" | \"error\";\n\n /**\n * Request timeout in milliseconds. If the request takes longer than this value,\n * it will be aborted.\n * @default 30000\n */\n timeout?: number;\n\n /**\n * Signal used to abort the request.\n */\n signal?: AbortSignal | null;\n\n /**\n * Session instance to bind this request to.\n */\n session?: Session;\n\n /**\n * Controls cookie scoping behavior for this request.\n */\n cookieMode?: CookieMode;\n\n /**\n * Identifier for the session that should handle this request.\n * @internal\n */\n sessionId?: string;\n\n /**\n * Internal flag indicating whether the session should be discarded once the\n * request finishes.\n * @internal\n */\n ephemeral?: boolean;\n\n /**\n * Disable default headers from browser emulation. When enabled, only explicitly\n * provided headers will be sent with the request, preventing emulation headers\n * from being automatically added or appended.\n * @default false\n */\n disableDefaultHeaders?: boolean;\n\n /**\n * Disable HTTPS certificate verification. When enabled, self-signed and invalid\n * certificates will be accepted.\n *\n * # Warning\n *\n * You should think very carefully before using this method. If invalid\n * certificates are trusted, *any* certificate for *any* site will be\n * trusted for use. This includes expired certificates. This introduces\n * significant vulnerabilities, and should only be used as a last resort.\n *\n * @default false\n */\n insecure?: boolean;\n}\n\n/**\n * Internal response payload returned from the native Rust binding.\n * This interface represents the raw response data before it's converted\n * to a standard Response object.\n *\n * @internal\n */\nexport interface NativeResponse {\n /**\n * HTTP status code (e.g., 200, 404, 500).\n */\n status: number;\n\n /**\n * Response headers as [name, value] tuples.\n * Header names are normalized to lowercase.\n */\n headers: HeaderTuple[];\n\n /**\n * Handle for streaming response body chunks from the native layer.\n * When `null`, the response does not have a body (e.g., HEAD/204/304).\n */\n bodyHandle: number | null;\n\n /**\n * Inline body buffer returned for small payloads. When present, `bodyHandle`\n * will be `null` to avoid a second native round-trip to read the body.\n */\n bodyBytes: Buffer | null;\n\n /**\n * Optional Content-Length hint reported by the server after decompression.\n */\n contentLength: number | null;\n\n /**\n * Cookies set by the server as [name, value] tuples.\n */\n cookies: HeaderTuple[];\n\n /**\n * Final URL after following any redirects.\n * If no redirects occurred, this will match the original request URL.\n */\n url: string;\n}\n\n/**\n * Configuration options for creating a WebSocket connection.\n * Supports browser impersonation and proxies, similar to HTTP requests.\n *\n * @example\n * ```typescript\n * const ws = await websocket('wss://example.com/socket', {\n * browser: 'chrome_142',\n * headers: { 'Authorization': 'Bearer token' },\n * });\n *\n * ws.onmessage = (event) => {\n * console.log('Received:', event.data);\n * };\n * ```\n */\nexport interface WebSocketOptions {\n /**\n * Browser profile to impersonate for the WebSocket upgrade request.\n * Automatically applies browser-specific headers and TLS fingerprints.\n * @default 'chrome_142'\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to emulate for the WebSocket handshake.\n * @default 'macos'\n */\n os?: EmulationOS;\n\n /**\n * Custom emulation overrides. When `browser` or `os` is present, these fields\n * layer on top of the resolved preset profile. When both are omitted, this\n * switches the handshake into standalone custom emulation mode.\n */\n emulation?: CustomEmulationOptions;\n\n /**\n * Additional headers to send with the WebSocket upgrade request.\n * Common headers include Authorization, Origin, or custom application headers.\n */\n headers?: HeadersInit;\n\n /**\n * Proxy URL to route the connection through (e.g., 'http://proxy.example.com:8080').\n * Proxy support depends on the native layer and proxy scheme.\n */\n proxy?: string;\n\n /**\n * Optional subprotocols for compatibility with the WHATWG WebSocket constructor.\n * Values are validated for non-empty, unique entries and sent in\n * the `Sec-WebSocket-Protocol` handshake header.\n */\n protocols?: string | string[];\n\n /**\n * Controls the binary payload type exposed via `MessageEvent.data`.\n * - \"nodebuffer\": delivers Node.js Buffer instances (default)\n * - \"arraybuffer\": delivers ArrayBuffer instances\n * - \"blob\": delivers Blob instances\n */\n binaryType?: WebSocketBinaryType;\n}\n\nexport interface LegacyWebSocketOptions extends WebSocketOptions {\n /**\n * @deprecated Use `websocket(url, options)` or `new WebSocket(...)`.\n */\n url: string;\n /**\n * @deprecated Use `onmessage` or `addEventListener(\"message\", ...)`.\n */\n onMessage?: (data: string | Buffer) => void;\n /**\n * @deprecated Use `onclose` or `addEventListener(\"close\", ...)`.\n */\n onClose?: (event: WebSocketCloseEvent) => void;\n /**\n * @deprecated Use `onerror` or `addEventListener(\"error\", ...)`.\n */\n onError?: (error: string) => void;\n}\n\nexport type SessionWebSocketOptions = Omit<WebSocketOptions, \"browser\" | \"os\" | \"proxy\" | \"emulation\">;\n\nexport interface LegacySessionWebSocketOptions extends SessionWebSocketOptions {\n /**\n * @deprecated Use `session.websocket(url, options)`.\n */\n url: string;\n /**\n * @deprecated Use `onmessage` or `addEventListener(\"message\", ...)`.\n */\n onMessage?: (data: string | Buffer) => void;\n /**\n * @deprecated Use `onclose` or `addEventListener(\"close\", ...)`.\n */\n onClose?: (event: WebSocketCloseEvent) => void;\n /**\n * @deprecated Use `onerror` or `addEventListener(\"error\", ...)`.\n */\n onError?: (error: string) => void;\n}\n\n/**\n * Internal WebSocket connection object returned from the native Rust binding.\n * This interface contains the connection ID used to reference the WebSocket\n * in subsequent operations like sending messages or closing the connection.\n *\n * @internal\n */\nexport interface NativeWebSocketConnection {\n /**\n * Unique identifier for this WebSocket connection.\n * Used internally to track and manage the connection.\n * @internal\n */\n _id: number;\n\n /**\n * Selected subprotocol returned by the server, when present.\n * @internal\n */\n protocol?: string;\n\n /**\n * Negotiated extension string returned by the server, when present.\n * @internal\n */\n extensions?: string;\n}\n\n/**\n * Error thrown when a request fails. This can occur due to network errors,\n * timeouts, invalid URLs, or other request-related issues.\n *\n * @example\n * ```typescript\n * try {\n * const response = await fetch('https://api.example.com');\n * } catch (error) {\n * if (error instanceof RequestError) {\n * console.error('Request failed:', error.message);\n * }\n * }\n * ```\n */\nexport class RequestError extends TypeError {\n constructor(message: string) {\n super(message);\n this.name = \"RequestError\";\n }\n}\n"],"mappings":"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","names":["require","error","requestId","payload","normalizedOptions"]}
|