wreq-js 1.4.0 → 1.5.2

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.
Files changed (62) hide show
  1. package/README.md +45 -228
  2. package/dist/wreq-js.cjs +1174 -0
  3. package/dist/wreq-js.cjs.map +1 -0
  4. package/dist/{types.d.ts → wreq-js.d.cts} +244 -22
  5. package/dist/wreq-js.d.ts +479 -27
  6. package/dist/wreq-js.js +1049 -1095
  7. package/dist/wreq-js.js.map +1 -1
  8. package/package.json +23 -14
  9. package/rust/wreq-js.darwin-arm64.node +0 -0
  10. package/rust/wreq-js.darwin-x64.node +0 -0
  11. package/rust/wreq-js.linux-arm64-gnu.node +0 -0
  12. package/rust/wreq-js.linux-x64-gnu.node +0 -0
  13. package/rust/wreq-js.linux-x64-musl.node +0 -0
  14. package/rust/wreq-js.win32-x64-msvc.node +0 -0
  15. package/dist/generated-types.d.ts +0 -13
  16. package/dist/generated-types.d.ts.map +0 -1
  17. package/dist/generated-types.js +0 -7
  18. package/dist/generated-types.js.map +0 -1
  19. package/dist/test/helpers/http.d.ts +0 -4
  20. package/dist/test/helpers/http.d.ts.map +0 -1
  21. package/dist/test/helpers/http.js +0 -14
  22. package/dist/test/helpers/http.js.map +0 -1
  23. package/dist/test/helpers/local-test-server.d.ts +0 -7
  24. package/dist/test/helpers/local-test-server.d.ts.map +0 -1
  25. package/dist/test/helpers/local-test-server.js +0 -406
  26. package/dist/test/helpers/local-test-server.js.map +0 -1
  27. package/dist/test/http/errors.spec.d.ts +0 -2
  28. package/dist/test/http/errors.spec.d.ts.map +0 -1
  29. package/dist/test/http/errors.spec.js +0 -33
  30. package/dist/test/http/errors.spec.js.map +0 -1
  31. package/dist/test/http/headers.spec.d.ts +0 -2
  32. package/dist/test/http/headers.spec.d.ts.map +0 -1
  33. package/dist/test/http/headers.spec.js +0 -98
  34. package/dist/test/http/headers.spec.js.map +0 -1
  35. package/dist/test/http/insecure.spec.d.ts +0 -2
  36. package/dist/test/http/insecure.spec.d.ts.map +0 -1
  37. package/dist/test/http/insecure.spec.js +0 -126
  38. package/dist/test/http/insecure.spec.js.map +0 -1
  39. package/dist/test/http/profiles.spec.d.ts +0 -2
  40. package/dist/test/http/profiles.spec.d.ts.map +0 -1
  41. package/dist/test/http/profiles.spec.js +0 -28
  42. package/dist/test/http/profiles.spec.js.map +0 -1
  43. package/dist/test/http/requests.spec.d.ts +0 -2
  44. package/dist/test/http/requests.spec.d.ts.map +0 -1
  45. package/dist/test/http/requests.spec.js +0 -198
  46. package/dist/test/http/requests.spec.js.map +0 -1
  47. package/dist/test/http/sessions.spec.d.ts +0 -2
  48. package/dist/test/http/sessions.spec.d.ts.map +0 -1
  49. package/dist/test/http/sessions.spec.js +0 -68
  50. package/dist/test/http/sessions.spec.js.map +0 -1
  51. package/dist/test/run-with-local-server.d.ts +0 -2
  52. package/dist/test/run-with-local-server.d.ts.map +0 -1
  53. package/dist/test/run-with-local-server.js +0 -71
  54. package/dist/test/run-with-local-server.js.map +0 -1
  55. package/dist/test/websocket.spec.d.ts +0 -2
  56. package/dist/test/websocket.spec.d.ts.map +0 -1
  57. package/dist/test/websocket.spec.js +0 -122
  58. package/dist/test/websocket.spec.js.map +0 -1
  59. package/dist/types.d.ts.map +0 -1
  60. package/dist/types.js +0 -26
  61. package/dist/types.js.map +0 -1
  62. package/dist/wreq-js.d.ts.map +0 -1
@@ -0,0 +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 { ReadableStream } from \"node:stream/web\";\nimport type {\n BodyInit,\n BrowserProfile,\n CookieMode,\n CreateSessionOptions,\n EmulationOS,\n HeadersInit,\n HeaderTuple,\n NativeResponse,\n NativeWebSocketConnection,\n RequestOptions,\n SessionHandle,\n WebSocketOptions,\n RequestInit as WreqRequestInit,\n} from \"./types.js\";\nimport { RequestError } from \"./types.js\";\n\ninterface NativeWebSocketOptions {\n url: string;\n browser: BrowserProfile;\n os: EmulationOS;\n headers: Record<string, string> | HeaderTuple[];\n proxy?: string;\n onMessage: (data: string | Buffer) => void;\n onClose?: () => void;\n onError?: (error: string) => void;\n}\n\ninterface NativeSessionOptions {\n sessionId: string;\n browser: BrowserProfile;\n os: EmulationOS;\n proxy?: string;\n}\n\nlet nativeBinding: {\n request: (options: RequestOptions, 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 websocketSend: (ws: NativeWebSocketConnection, data: string | Buffer) => Promise<void>;\n websocketClose: (ws: NativeWebSocketConnection) => Promise<void>;\n createSession: (options: NativeSessionOptions) => string;\n clearSession: (sessionId: string) => void;\n dropSession: (sessionId: string) => void;\n getOperatingSystems?: () => string[];\n};\n\nlet cachedProfiles: BrowserProfile[] | undefined;\nlet cachedOperatingSystems: EmulationOS[] | 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 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};\n\ntype SessionResolution = {\n sessionId: string;\n cookieMode: CookieMode;\n dropAfterRequest: boolean;\n defaults?: SessionDefaults;\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 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 // Fast paths for common high-throughput cases.\n if (Array.isArray(init)) {\n return init as HeaderTuple[];\n }\n\n if (init instanceof Headers) {\n return init.toTuples();\n }\n\n const out: HeaderTuple[] = [];\n\n if (isPlainObject(init)) {\n for (const name in init) {\n if (!Object.hasOwn(init, name)) {\n continue;\n }\n\n const value = init[name];\n if (value === undefined || value === null) {\n continue;\n }\n\n out.push([name, String(value)]);\n }\n\n return out;\n }\n\n if (isIterable<HeaderTuple>(init)) {\n for (const tuple of init) {\n if (!tuple) {\n continue;\n }\n const [name, value] = tuple;\n out.push([name, value]);\n }\n\n return out;\n }\n\n return out;\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 createNativeBodyStream(handleId: number): ReadableStream<Uint8Array> {\n const handle: NativeBodyHandle = { id: handleId, released: false };\n\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 const reader = source.getReader();\n\n return new ReadableStream<Uint8Array>({\n async pull(controller) {\n if (!started) {\n started = true;\n onFirstUse();\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 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\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\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 } 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 this.bodySource = createNativeBodyStream(this.payload.bodyHandle);\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 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 clone(): Response {\n if (this.bodyUsed || this.bodyStream) {\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 this.bodySource = createNativeBodyStream(this.payload.bodyHandle);\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(\"not found\")) {\n return Buffer.alloc(0);\n }\n throw error;\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 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 return { ...this.defaults };\n }\n\n /** @internal */\n _defaultsRef(): SessionDefaults {\n return this.defaults;\n }\n\n async fetch(input: string | URL, init?: WreqRequestInit): Promise<Response> {\n this.ensureActive();\n return fetchWithSession(this, input, init);\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 async close(): Promise<void> {\n if (this.disposed) {\n return;\n }\n\n this.disposed = true;\n\n try {\n nativeBinding.dropSession(this.id);\n } catch (error) {\n throw new RequestError(String(error));\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: generateSessionId(),\n cookieMode: \"ephemeral\",\n dropAfterRequest: true,\n };\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 reason.name = \"AbortError\";\n return reason;\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 const value = typeof input === \"string\" ? input.trim() : input.href;\n\n if (!value) {\n throw new RequestError(\"URL is required\");\n }\n\n return value;\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\nfunction serializeBody(body?: BodyInit | null): Buffer | undefined {\n if (body === null || body === undefined) {\n return undefined;\n }\n\n if (typeof body === \"string\") {\n return Buffer.from(body, \"utf8\");\n }\n\n if (Buffer.isBuffer(body)) {\n return body;\n }\n\n if (body instanceof URLSearchParams) {\n return Buffer.from(body.toString(), \"utf8\");\n }\n\n if (body instanceof ArrayBuffer) {\n return Buffer.from(body);\n }\n\n if (ArrayBuffer.isView(body)) {\n return Buffer.from(body.buffer, body.byteOffset, body.byteLength);\n }\n\n throw new TypeError(\"Unsupported body type; expected string, Buffer, ArrayBuffer, or URLSearchParams\");\n}\n\nfunction ensureMethod(method?: string): string {\n const normalized = method?.trim().toUpperCase();\n return normalized && 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): void {\n if (!browser) {\n return;\n }\n\n const profiles = getProfiles();\n\n if (!profiles.includes(browser)) {\n throw new RequestError(`Invalid browser profile: ${browser}. Available profiles: ${profiles.join(\", \")}`);\n }\n}\n\nfunction validateOperatingSystem(os?: EmulationOS): void {\n if (!os) {\n return;\n }\n\n const operatingSystems = getOperatingSystems();\n\n if (!operatingSystems.includes(os)) {\n throw new RequestError(`Invalid operating system: ${os}. Available options: ${operatingSystems.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 greater than 0\");\n }\n}\n\nasync function fetchWithSession(session: Session, input: string | URL, init?: WreqRequestInit): Promise<Response> {\n const providedSessionId = typeof init?.sessionId === \"string\" ? init.sessionId.trim() : undefined;\n if (providedSessionId) {\n throw new RequestError(\"Provide either `session` or `sessionId`, not both.\");\n }\n\n const url = coerceUrlInput(input);\n const method = ensureMethod(init?.method);\n const body = serializeBody(init?.body ?? null);\n\n ensureBodyAllowed(method, body);\n validateRedirectMode(init?.redirect);\n\n const defaults = session._defaultsRef();\n\n if (init?.browser != null && init.browser !== defaults.browser) {\n throw new RequestError(\"Session browser cannot be changed after creation\");\n }\n if (init?.os != null && init.os !== defaults.os) {\n throw new RequestError(\"Session operating system cannot be changed after creation\");\n }\n\n const initHasProxy = Boolean(init) && Object.hasOwn(init as object, \"proxy\");\n const requestedProxy = initHasProxy ? (init as { proxy?: string | null }).proxy : undefined;\n if (initHasProxy && requestedProxy !== undefined && (defaults.proxy ?? null) !== (requestedProxy ?? null)) {\n throw new RequestError(\"Session proxy cannot be changed after creation\");\n }\n\n const timeout = init?.timeout ?? defaults.timeout;\n if (Boolean(init) && (init as { timeout?: number | null }).timeout !== undefined) {\n validateTimeout(timeout);\n }\n\n const insecure = init?.insecure ?? defaults.insecure;\n\n const headerTuples = init?.headers === undefined ? undefined : headersToTuples(init.headers);\n\n const requestOptions: RequestOptions = {\n url,\n method,\n browser: defaults.browser,\n os: defaults.os,\n sessionId: session.id,\n ephemeral: false,\n };\n\n if (body !== undefined) {\n requestOptions.body = body;\n }\n\n const proxy = requestedProxy ?? defaults.proxy;\n if (proxy !== undefined) {\n requestOptions.proxy = proxy;\n }\n\n if (timeout !== undefined) {\n requestOptions.timeout = timeout;\n }\n if (init?.redirect !== undefined) {\n requestOptions.redirect = init.redirect;\n }\n if (init?.disableDefaultHeaders !== undefined) {\n requestOptions.disableDefaultHeaders = init.disableDefaultHeaders;\n }\n if (insecure !== undefined) {\n requestOptions.insecure = insecure;\n }\n if (headerTuples && headerTuples.length > 0) {\n requestOptions.headers = headerTuples;\n }\n\n return dispatchRequest(requestOptions, url, init?.signal ?? null);\n}\n\nasync function dispatchRequest(\n options: RequestOptions,\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 const abortHandler = setupAbort(signal, cancelNative);\n if (!abortHandler) {\n // setupAbort only returns null when the signal is already aborted; treat as immediate abort.\n cancelNative();\n throw createAbortError(signal.reason);\n }\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 is isolated and non-persistent by design. Each request\n * uses a fresh connection with no shared state (cookies, TLS sessions). This prevents\n * TLS fingerprint leakage between requests.\n *\n * **Use {@link createSession} or {@link withSession} if you need:**\n * - Cookie persistence across requests\n * - TLS connection reuse for performance\n * - Shared connection state\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 instance)\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, init?: WreqRequestInit): Promise<Response> {\n const url = coerceUrlInput(input);\n const config = init ?? {};\n const sessionContext = resolveSessionContext(config);\n const sessionDefaults = sessionContext.defaults;\n const browser = config.browser ?? sessionDefaults?.browser ?? DEFAULT_BROWSER;\n const os = config.os ?? sessionDefaults?.os ?? DEFAULT_OS;\n const proxy = config.proxy ?? sessionDefaults?.proxy;\n const timeout = config.timeout ?? sessionDefaults?.timeout;\n const insecure = config.insecure ?? sessionDefaults?.insecure;\n\n validateRedirectMode(config.redirect);\n\n // Defaults from a managed session are already validated at creation time; skip re-validating\n // unless the caller attempts to override them (which would be rejected below).\n if (!sessionDefaults || config.browser !== undefined) {\n validateBrowserProfile(browser);\n }\n if (!sessionDefaults || config.os !== undefined) {\n validateOperatingSystem(os);\n }\n if (!sessionDefaults || config.timeout !== undefined) {\n validateTimeout(timeout);\n }\n\n if (sessionDefaults) {\n if (browser !== sessionDefaults.browser) {\n throw new RequestError(\"Session browser cannot be changed after creation\");\n }\n\n if (os !== sessionDefaults.os) {\n throw new RequestError(\"Session operating system cannot be changed after creation\");\n }\n\n if (config.proxy !== undefined && config.proxy !== sessionDefaults.proxy) {\n throw new RequestError(\"Session proxy cannot be changed after creation\");\n }\n }\n\n const method = ensureMethod(config.method);\n const body = serializeBody(config.body ?? null);\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 const headerTuples = config.headers === undefined ? undefined : headersToTuples(config.headers);\n\n const requestOptions: RequestOptions = {\n url,\n method,\n browser,\n os,\n sessionId: sessionContext.sessionId,\n ephemeral: sessionContext.dropAfterRequest,\n };\n\n if (body !== undefined) {\n requestOptions.body = body;\n }\n if (proxy !== undefined) {\n requestOptions.proxy = proxy;\n }\n if (timeout !== undefined) {\n requestOptions.timeout = timeout;\n }\n if (config.redirect !== undefined) {\n requestOptions.redirect = config.redirect;\n }\n if (config.disableDefaultHeaders !== undefined) {\n requestOptions.disableDefaultHeaders = config.disableDefaultHeaders;\n }\n if (insecure !== undefined) {\n requestOptions.insecure = insecure;\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 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\n try {\n createdId = nativeBinding.createSession({\n sessionId,\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 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\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.disableDefaultHeaders !== undefined) {\n init.disableDefaultHeaders = rest.disableDefaultHeaders;\n }\n\n if (rest.redirect !== undefined) {\n init.redirect = rest.redirect;\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_120', 'chrome_131', 'firefox', ...]\n * ```\n */\nexport function getProfiles(): BrowserProfile[] {\n if (!cachedProfiles) {\n cachedProfiles = nativeBinding.getProfiles() as BrowserProfile[];\n }\n\n return cachedProfiles;\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\n/**\n * Convenience helper for GET requests using {@link fetch}.\n */\nexport async function get(url: string, 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,\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\n/**\n * WebSocket connection class\n *\n * @example\n * ```typescript\n * import { websocket } from 'wreq-js';\n *\n * const ws = await websocket({\n * url: 'wss://echo.websocket.org',\n * browser: 'chrome_142',\n * onMessage: (data) => {\n * console.log('Received:', data);\n * },\n * onClose: () => {\n * console.log('Connection closed');\n * },\n * onError: (error) => {\n * console.error('Error:', error);\n * }\n * });\n *\n * // Send text message\n * await ws.send('Hello World');\n *\n * // Send binary message\n * await ws.send(Buffer.from([1, 2, 3]));\n *\n * // Close connection\n * await ws.close();\n * ```\n */\nexport class WebSocket {\n private _connection: NativeWebSocketConnection;\n private _finalizerToken: NativeWebSocketConnection | undefined;\n private _closed = false;\n\n constructor(connection: NativeWebSocketConnection) {\n this._connection = connection;\n\n if (websocketFinalizer) {\n this._finalizerToken = connection;\n websocketFinalizer.register(this, connection, connection);\n }\n }\n\n /**\n * Send a message (text or binary)\n */\n async send(data: string | Buffer): Promise<void> {\n try {\n await nativeBinding.websocketSend(this._connection, data);\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n\n /**\n * Close the WebSocket connection\n */\n async close(): Promise<void> {\n if (this._closed) {\n return;\n }\n\n this._closed = true;\n\n if (this._finalizerToken && websocketFinalizer) {\n websocketFinalizer.unregister(this._finalizerToken);\n this._finalizerToken = undefined;\n }\n\n try {\n await nativeBinding.websocketClose(this._connection);\n } catch (error) {\n throw new RequestError(String(error));\n }\n }\n}\n\n/**\n * Create a WebSocket connection with browser impersonation\n *\n * @param options - WebSocket options\n * @returns Promise that resolves to the WebSocket instance\n */\nexport async function websocket(options: WebSocketOptions): Promise<WebSocket> {\n if (!options.url) {\n throw new RequestError(\"URL is required\");\n }\n\n if (!options.onMessage) {\n throw new RequestError(\"onMessage callback is required\");\n }\n\n validateBrowserProfile(options.browser);\n const os = options.os ?? DEFAULT_OS;\n validateOperatingSystem(os);\n const browser = options.browser ?? DEFAULT_BROWSER;\n\n try {\n const connection = await nativeBinding.websocketConnect({\n url: options.url,\n browser,\n os,\n headers: options.headers ?? {},\n ...(options.proxy !== undefined && { proxy: options.proxy }),\n onMessage: options.onMessage,\n ...(options.onClose !== undefined && { onClose: options.onClose }),\n ...(options.onError !== undefined && { onError: options.onError }),\n });\n\n return new WebSocket(connection);\n } catch (error) {\n throw new RequestError(String(error));\n }\n}\n\nexport type {\n BodyInit,\n BrowserProfile,\n CookieMode,\n CreateSessionOptions,\n EmulationOS,\n HeadersInit,\n RequestInit,\n RequestOptions,\n SessionHandle,\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 createSession,\n withSession,\n websocket,\n WebSocket,\n Headers,\n Response,\n Session,\n};\n","// Import and re-export the auto-generated BrowserProfile and EmulationOS types\nimport type { BrowserProfile, EmulationOS } from \"./generated-types.js\";\nimport type { Session } 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 string, binary data (ArrayBuffer, ArrayBufferView), URL-encoded parameters, and Node.js Buffer.\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 */\nexport type BodyInit = string | ArrayBuffer | ArrayBufferView | URLSearchParams | Buffer;\n\n/**\n * Options for configuring a fetch request. Compatible with the standard Fetch API\n * with additional wreq-specific extensions for browser impersonation, proxies, 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 * Browser profile to impersonate for this request.\n * Automatically applies browser-specific headers, TLS fingerprints, and HTTP/2 settings.\n * @default 'chrome_142'\n */\n browser?: BrowserProfile;\n\n /**\n * Operating system to emulate for this request.\n * Influences platform-specific headers and TLS fingerprints.\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 * Supports HTTP and SOCKS5 proxies.\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 *\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 createSession}.\n */\nexport interface CreateSessionOptions {\n /**\n * Provide a custom identifier instead of an auto-generated random ID.\n */\n sessionId?: string;\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 * 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 * Automatically applies browser-specific headers, TLS fingerprints, and HTTP/2 settings.\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?: Buffer;\n\n /**\n * Proxy URL to route the request through (e.g., 'http://proxy.example.com:8080').\n * Supports HTTP and SOCKS5 proxies.\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 * 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 createWebSocket({\n * url: 'wss://echo.websocket.org',\n * browser: 'chrome_142',\n * headers: { 'Authorization': 'Bearer token' },\n * onMessage: (data) => {\n * console.log('Received:', data);\n * },\n * onClose: () => {\n * console.log('Connection closed');\n * },\n * onError: (error) => {\n * console.error('WebSocket error:', error);\n * }\n * });\n * ```\n */\nexport interface WebSocketOptions {\n /**\n * The WebSocket URL to connect to. Must use wss:// (secure) or ws:// (insecure) protocol.\n */\n url: string;\n\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?: Record<string, string> | HeaderTuple[];\n\n /**\n * Proxy URL to route the connection through (e.g., 'http://proxy.example.com:8080').\n * Supports HTTP and SOCKS5 proxies.\n */\n proxy?: string;\n\n /**\n * Callback function invoked when a message is received from the server.\n * The data parameter will be a string for text frames or a Buffer for binary frames.\n *\n * @param data - The received message as a string or Buffer\n */\n onMessage: (data: string | Buffer) => void;\n\n /**\n * Callback function invoked when the WebSocket connection is closed.\n * This is called for both clean closes and connection errors.\n */\n onClose?: () => void;\n\n /**\n * Callback function invoked when a connection or protocol error occurs.\n *\n * @param error - A string describing the error that occurred\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/**\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 Error {\n constructor(message: string) {\n super(message);\n this.name = \"RequestError\";\n }\n}\n"],"mappings":"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","names":["require","requestId","payload"]}
@@ -1,16 +1,29 @@
1
- import type { BrowserProfile, EmulationOS } from "./generated-types";
2
- export type { BrowserProfile, EmulationOS };
1
+ import { ReadableStream } from 'node:stream/web';
2
+
3
+ /**
4
+ * Auto-generated from Rust build script
5
+ * DO NOT EDIT MANUALLY
6
+ */
7
+ /**
8
+ * Browser profile names supported
9
+ */
10
+ type BrowserProfile = 'chrome_100' | 'chrome_101' | 'chrome_104' | 'chrome_105' | 'chrome_106' | 'chrome_107' | 'chrome_108' | 'chrome_109' | 'chrome_110' | 'chrome_114' | 'chrome_116' | 'chrome_117' | 'chrome_118' | 'chrome_119' | 'chrome_120' | 'chrome_123' | 'chrome_124' | 'chrome_126' | 'chrome_127' | 'chrome_128' | 'chrome_129' | 'chrome_130' | 'chrome_131' | 'chrome_132' | 'chrome_133' | 'chrome_134' | 'chrome_135' | 'chrome_136' | 'chrome_137' | 'chrome_138' | 'chrome_139' | 'chrome_140' | 'chrome_141' | 'chrome_142' | 'chrome_143' | 'edge_101' | 'edge_122' | 'edge_127' | 'edge_131' | 'edge_134' | 'edge_135' | 'edge_136' | 'edge_137' | 'edge_138' | 'edge_139' | 'edge_140' | 'edge_141' | 'edge_142' | 'opera_116' | 'opera_117' | 'opera_118' | 'opera_119' | 'safari_ios_17.2' | 'safari_ios_17.4.1' | 'safari_ios_16.5' | 'safari_15.3' | 'safari_15.5' | 'safari_15.6.1' | 'safari_16' | 'safari_16.5' | 'safari_17.0' | 'safari_17.2.1' | 'safari_17.4.1' | 'safari_17.5' | 'safari_17.6' | 'safari_18' | 'safari_ipad_18' | 'safari_18.2' | 'safari_ios_18.1.1' | 'safari_18.3' | 'safari_18.3.1' | 'safari_18.5' | 'safari_26' | 'safari_26.1' | 'safari_26.2' | 'safari_ipad_26' | 'safari_ipad_26.2' | 'safari_ios_26' | 'safari_ios_26.2' | 'firefox_109' | 'firefox_117' | 'firefox_128' | 'firefox_133' | 'firefox_135' | 'firefox_private_135' | 'firefox_android_135' | 'firefox_136' | 'firefox_private_136' | 'firefox_139' | 'firefox_142' | 'firefox_143' | 'firefox_144' | 'firefox_145' | 'okhttp_3.9' | 'okhttp_3.11' | 'okhttp_3.13' | 'okhttp_3.14' | 'okhttp_4.9' | 'okhttp_4.10' | 'okhttp_4.12' | 'okhttp_5';
11
+ /**
12
+ * Operating systems supported for emulation
13
+ */
14
+ type EmulationOS = 'windows' | 'macos' | 'linux' | 'android' | 'ios';
15
+
3
16
  /**
4
17
  * Controls how cookies are scoped for a request.
5
18
  * - "session": reuse an explicit Session or sessionId across calls.
6
19
  * - "ephemeral": create an isolated, single-use session.
7
20
  */
8
- export type CookieMode = "session" | "ephemeral";
21
+ type CookieMode = "session" | "ephemeral";
9
22
  /**
10
- * Minimal handle implemented by {@link Session}. Exposed so {@link RequestInit.session}
11
- * can accept either a Session instance or a compatible object.
23
+ * Minimal handle implemented by {@link Session}. Exposed for integrations
24
+ * that only need to carry a session id.
12
25
  */
13
- export interface SessionHandle {
26
+ interface SessionHandle {
14
27
  readonly id: string;
15
28
  }
16
29
  /**
@@ -22,7 +35,7 @@ export interface SessionHandle {
22
35
  * const headers: HeaderTuple = ['Content-Type', 'application/json'];
23
36
  * ```
24
37
  */
25
- export type HeaderTuple = [string, string];
38
+ type HeaderTuple = [string, string];
26
39
  /**
27
40
  * Represents various input types accepted when creating or initializing headers.
28
41
  * Can be an iterable of header tuples, an array of tuples, or a plain object.
@@ -39,7 +52,7 @@ export type HeaderTuple = [string, string];
39
52
  * const headers: HeadersInit = new Map([['Content-Type', 'application/json']]);
40
53
  * ```
41
54
  */
42
- export type HeadersInit = Iterable<HeaderTuple> | Array<HeaderTuple> | Record<string, string | number | boolean | null | undefined>;
55
+ type HeadersInit = Iterable<HeaderTuple> | Array<HeaderTuple> | Record<string, string | number | boolean | null | undefined>;
43
56
  /**
44
57
  * Represents the various types of data that can be used as a request body.
45
58
  * Supports string, binary data (ArrayBuffer, ArrayBufferView), URL-encoded parameters, and Node.js Buffer.
@@ -56,7 +69,7 @@ export type HeadersInit = Iterable<HeaderTuple> | Array<HeaderTuple> | Record<st
56
69
  * const body: BodyInit = Buffer.from('data');
57
70
  * ```
58
71
  */
59
- export type BodyInit = string | ArrayBuffer | ArrayBufferView | URLSearchParams | Buffer;
72
+ type BodyInit = string | ArrayBuffer | ArrayBufferView | URLSearchParams | Buffer;
60
73
  /**
61
74
  * Options for configuring a fetch request. Compatible with the standard Fetch API
62
75
  * with additional wreq-specific extensions for browser impersonation, proxies, and timeouts.
@@ -73,7 +86,7 @@ export type BodyInit = string | ArrayBuffer | ArrayBufferView | URLSearchParams
73
86
  * };
74
87
  * ```
75
88
  */
76
- export interface RequestInit {
89
+ interface RequestInit {
77
90
  /**
78
91
  * A string to set request's method.
79
92
  * @default 'GET'
@@ -130,7 +143,7 @@ export interface RequestInit {
130
143
  * Session instance to bind this request to. When provided, {@link cookieMode}
131
144
  * automatically behaves like `"session"`.
132
145
  */
133
- session?: SessionHandle;
146
+ session?: Session;
134
147
  /**
135
148
  * Identifier of an existing session created elsewhere (e.g., via {@link createSession}).
136
149
  */
@@ -160,7 +173,7 @@ export interface RequestInit {
160
173
  /**
161
174
  * Configuration for {@link createSession}.
162
175
  */
163
- export interface CreateSessionOptions {
176
+ interface CreateSessionOptions {
164
177
  /**
165
178
  * Provide a custom identifier instead of an auto-generated random ID.
166
179
  */
@@ -218,7 +231,7 @@ export interface CreateSessionOptions {
218
231
  * });
219
232
  * ```
220
233
  */
221
- export interface RequestOptions {
234
+ interface RequestOptions {
222
235
  /**
223
236
  * The URL to request.
224
237
  */
@@ -304,16 +317,16 @@ export interface RequestOptions {
304
317
  *
305
318
  * @internal
306
319
  */
307
- export interface NativeResponse {
320
+ interface NativeResponse {
308
321
  /**
309
322
  * HTTP status code (e.g., 200, 404, 500).
310
323
  */
311
324
  status: number;
312
325
  /**
313
- * Response headers as key-value pairs.
326
+ * Response headers as [name, value] tuples.
314
327
  * Header names are normalized to lowercase.
315
328
  */
316
- headers: Record<string, string>;
329
+ headers: HeaderTuple[];
317
330
  /**
318
331
  * Handle for streaming response body chunks from the native layer.
319
332
  * When `null`, the response does not have a body (e.g., HEAD/204/304).
@@ -329,9 +342,9 @@ export interface NativeResponse {
329
342
  */
330
343
  contentLength: number | null;
331
344
  /**
332
- * Cookies set by the server as key-value pairs.
345
+ * Cookies set by the server as [name, value] tuples.
333
346
  */
334
- cookies: Record<string, string>;
347
+ cookies: HeaderTuple[];
335
348
  /**
336
349
  * Final URL after following any redirects.
337
350
  * If no redirects occurred, this will match the original request URL.
@@ -360,7 +373,7 @@ export interface NativeResponse {
360
373
  * });
361
374
  * ```
362
375
  */
363
- export interface WebSocketOptions {
376
+ interface WebSocketOptions {
364
377
  /**
365
378
  * The WebSocket URL to connect to. Must use wss:// (secure) or ws:// (insecure) protocol.
366
379
  */
@@ -412,7 +425,7 @@ export interface WebSocketOptions {
412
425
  *
413
426
  * @internal
414
427
  */
415
- export interface NativeWebSocketConnection {
428
+ interface NativeWebSocketConnection {
416
429
  /**
417
430
  * Unique identifier for this WebSocket connection.
418
431
  * Used internally to track and manage the connection.
@@ -435,7 +448,216 @@ export interface NativeWebSocketConnection {
435
448
  * }
436
449
  * ```
437
450
  */
438
- export declare class RequestError extends Error {
451
+ declare class RequestError extends Error {
439
452
  constructor(message: string);
440
453
  }
441
- //# sourceMappingURL=types.d.ts.map
454
+
455
+ type SessionDefaults = {
456
+ browser: BrowserProfile;
457
+ os: EmulationOS;
458
+ proxy?: string;
459
+ timeout?: number;
460
+ insecure?: boolean;
461
+ };
462
+ declare class Headers implements Iterable<[string, string]> {
463
+ private readonly store;
464
+ constructor(init?: HeadersInit);
465
+ private applyInit;
466
+ private normalizeName;
467
+ private assertValue;
468
+ append(name: string, value: unknown): void;
469
+ set(name: string, value: unknown): void;
470
+ get(name: string): string | null;
471
+ has(name: string): boolean;
472
+ delete(name: string): void;
473
+ entries(): IterableIterator<[string, string]>;
474
+ keys(): IterableIterator<string>;
475
+ values(): IterableIterator<string>;
476
+ forEach(callback: (value: string, name: string, parent: Headers) => void, thisArg?: unknown): void;
477
+ [Symbol.iterator](): IterableIterator<[string, string]>;
478
+ toObject(): Record<string, string>;
479
+ toTuples(): HeaderTuple[];
480
+ }
481
+ type ResponseType = "basic" | "cors" | "error" | "opaque" | "opaqueredirect";
482
+ declare class Response {
483
+ readonly status: number;
484
+ readonly ok: boolean;
485
+ readonly contentLength: number | null;
486
+ readonly url: string;
487
+ readonly type: ResponseType;
488
+ bodyUsed: boolean;
489
+ private readonly payload;
490
+ private readonly requestUrl;
491
+ private redirectedMemo;
492
+ private readonly headersInit;
493
+ private headersInstance;
494
+ private readonly cookiesInit;
495
+ private cookiesRecord;
496
+ private inlineBody;
497
+ private bodySource;
498
+ private bodyStream;
499
+ private nativeHandleAvailable;
500
+ constructor(payload: NativeResponse, requestUrl: string, bodySource?: ReadableStream<Uint8Array> | null);
501
+ get redirected(): boolean;
502
+ get statusText(): string;
503
+ get headers(): Headers;
504
+ get cookies(): Record<string, string | string[]>;
505
+ get body(): ReadableStream<Uint8Array> | null;
506
+ json<T = unknown>(): Promise<T>;
507
+ arrayBuffer(): Promise<ArrayBuffer>;
508
+ text(): Promise<string>;
509
+ clone(): Response;
510
+ private assertBodyAvailable;
511
+ private consumeBody;
512
+ }
513
+ declare class Session implements SessionHandle {
514
+ readonly id: string;
515
+ private disposed;
516
+ private readonly defaults;
517
+ constructor(id: string, defaults: SessionDefaults);
518
+ get closed(): boolean;
519
+ private ensureActive;
520
+ /** @internal */
521
+ getDefaults(): SessionDefaults;
522
+ /** @internal */
523
+ _defaultsRef(): SessionDefaults;
524
+ fetch(input: string | URL, init?: RequestInit): Promise<Response>;
525
+ clearCookies(): Promise<void>;
526
+ close(): Promise<void>;
527
+ }
528
+ /**
529
+ * Fetch-compatible entry point that adds browser impersonation controls.
530
+ *
531
+ * **Important:** The default fetch is isolated and non-persistent by design. Each request
532
+ * uses a fresh connection with no shared state (cookies, TLS sessions). This prevents
533
+ * TLS fingerprint leakage between requests.
534
+ *
535
+ * **Use {@link createSession} or {@link withSession} if you need:**
536
+ * - Cookie persistence across requests
537
+ * - TLS connection reuse for performance
538
+ * - Shared connection state
539
+ *
540
+ * **Concurrency:** The core is unthrottled by design. Callers are expected to implement
541
+ * their own concurrency control (e.g., p-limit) if needed. Built-in throttling would
542
+ * reduce performance for high-throughput workloads.
543
+ *
544
+ * @param input - Request URL (string or URL instance)
545
+ * @param init - Fetch-compatible init options
546
+ *
547
+ * @example
548
+ * ```typescript
549
+ * // Isolated request (no state persistence)
550
+ * const response = await fetch('https://example.com');
551
+ *
552
+ * // For persistent cookies and connection reuse, use a session:
553
+ * await withSession(async (session) => {
554
+ * await session.fetch('https://example.com/login', { method: 'POST', body: loginData });
555
+ * await session.fetch('https://example.com/protected'); // Cookies from login are sent
556
+ * });
557
+ * ```
558
+ */
559
+ declare function fetch(input: string | URL, init?: RequestInit): Promise<Response>;
560
+ declare function createSession(options?: CreateSessionOptions): Promise<Session>;
561
+ declare function withSession<T>(fn: (session: Session) => Promise<T> | T, options?: CreateSessionOptions): Promise<T>;
562
+ /**
563
+ * @deprecated Use {@link fetch} instead.
564
+ */
565
+ declare function request(options: RequestOptions): Promise<Response>;
566
+ /**
567
+ * Get list of available browser profiles
568
+ *
569
+ * @returns Array of browser profile names
570
+ *
571
+ * @example
572
+ * ```typescript
573
+ * import { getProfiles } from 'wreq-js';
574
+ *
575
+ * const profiles = getProfiles();
576
+ * console.log(profiles); // ['chrome_120', 'chrome_131', 'firefox', ...]
577
+ * ```
578
+ */
579
+ declare function getProfiles(): BrowserProfile[];
580
+ /**
581
+ * Get list of supported operating systems for emulation.
582
+ *
583
+ * @returns Array of operating system identifiers
584
+ */
585
+ declare function getOperatingSystems(): EmulationOS[];
586
+ /**
587
+ * Convenience helper for GET requests using {@link fetch}.
588
+ */
589
+ declare function get(url: string, init?: Omit<RequestInit, "method">): Promise<Response>;
590
+ /**
591
+ * Convenience helper for POST requests using {@link fetch}.
592
+ */
593
+ declare function post(url: string, body?: BodyInit | null, init?: Omit<RequestInit, "method" | "body">): Promise<Response>;
594
+ /**
595
+ * WebSocket connection class
596
+ *
597
+ * @example
598
+ * ```typescript
599
+ * import { websocket } from 'wreq-js';
600
+ *
601
+ * const ws = await websocket({
602
+ * url: 'wss://echo.websocket.org',
603
+ * browser: 'chrome_142',
604
+ * onMessage: (data) => {
605
+ * console.log('Received:', data);
606
+ * },
607
+ * onClose: () => {
608
+ * console.log('Connection closed');
609
+ * },
610
+ * onError: (error) => {
611
+ * console.error('Error:', error);
612
+ * }
613
+ * });
614
+ *
615
+ * // Send text message
616
+ * await ws.send('Hello World');
617
+ *
618
+ * // Send binary message
619
+ * await ws.send(Buffer.from([1, 2, 3]));
620
+ *
621
+ * // Close connection
622
+ * await ws.close();
623
+ * ```
624
+ */
625
+ declare class WebSocket {
626
+ private _connection;
627
+ private _finalizerToken;
628
+ private _closed;
629
+ constructor(connection: NativeWebSocketConnection);
630
+ /**
631
+ * Send a message (text or binary)
632
+ */
633
+ send(data: string | Buffer): Promise<void>;
634
+ /**
635
+ * Close the WebSocket connection
636
+ */
637
+ close(): Promise<void>;
638
+ }
639
+ /**
640
+ * Create a WebSocket connection with browser impersonation
641
+ *
642
+ * @param options - WebSocket options
643
+ * @returns Promise that resolves to the WebSocket instance
644
+ */
645
+ declare function websocket(options: WebSocketOptions): Promise<WebSocket>;
646
+
647
+ declare const _default: {
648
+ fetch: typeof fetch;
649
+ request: typeof request;
650
+ get: typeof get;
651
+ post: typeof post;
652
+ getProfiles: typeof getProfiles;
653
+ getOperatingSystems: typeof getOperatingSystems;
654
+ createSession: typeof createSession;
655
+ withSession: typeof withSession;
656
+ websocket: typeof websocket;
657
+ WebSocket: typeof WebSocket;
658
+ Headers: typeof Headers;
659
+ Response: typeof Response;
660
+ Session: typeof Session;
661
+ };
662
+
663
+ export { type BodyInit, type BrowserProfile, type CookieMode, type CreateSessionOptions, type EmulationOS, Headers, type HeadersInit, RequestError, type RequestInit, type RequestOptions, Response, Session, type SessionHandle, WebSocket, type WebSocketOptions, createSession, _default as default, fetch, get, getOperatingSystems, getProfiles, post, request, websocket, withSession };