rezo 1.0.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.
Files changed (135) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +1507 -0
  3. package/assets/icon.svg +37 -0
  4. package/assets/logo-dark.svg +47 -0
  5. package/assets/logo.svg +58 -0
  6. package/dist/adapters/curl.cjs +1034 -0
  7. package/dist/adapters/curl.js +1031 -0
  8. package/dist/adapters/entries/curl.cjs +4 -0
  9. package/dist/adapters/entries/curl.d.ts +2136 -0
  10. package/dist/adapters/entries/curl.js +2 -0
  11. package/dist/adapters/entries/fetch.cjs +2 -0
  12. package/dist/adapters/entries/fetch.d.ts +2127 -0
  13. package/dist/adapters/entries/fetch.js +1 -0
  14. package/dist/adapters/entries/http.cjs +2 -0
  15. package/dist/adapters/entries/http.d.ts +2126 -0
  16. package/dist/adapters/entries/http.js +1 -0
  17. package/dist/adapters/entries/http2.cjs +4 -0
  18. package/dist/adapters/entries/http2.d.ts +2136 -0
  19. package/dist/adapters/entries/http2.js +2 -0
  20. package/dist/adapters/entries/react-native.cjs +2 -0
  21. package/dist/adapters/entries/react-native.d.ts +2126 -0
  22. package/dist/adapters/entries/react-native.js +1 -0
  23. package/dist/adapters/entries/xhr.cjs +2 -0
  24. package/dist/adapters/entries/xhr.d.ts +2127 -0
  25. package/dist/adapters/entries/xhr.js +1 -0
  26. package/dist/adapters/fetch.cjs +740 -0
  27. package/dist/adapters/fetch.js +739 -0
  28. package/dist/adapters/http.cjs +1153 -0
  29. package/dist/adapters/http.js +1151 -0
  30. package/dist/adapters/http2.cjs +957 -0
  31. package/dist/adapters/http2.js +956 -0
  32. package/dist/adapters/index.cjs +6 -0
  33. package/dist/adapters/index.js +7 -0
  34. package/dist/adapters/picker.cjs +342 -0
  35. package/dist/adapters/picker.js +331 -0
  36. package/dist/adapters/react-native.cjs +545 -0
  37. package/dist/adapters/react-native.js +544 -0
  38. package/dist/adapters/xhr.cjs +622 -0
  39. package/dist/adapters/xhr.js +621 -0
  40. package/dist/cache/dns-cache.cjs +118 -0
  41. package/dist/cache/dns-cache.js +113 -0
  42. package/dist/cache/file-cacher.cjs +264 -0
  43. package/dist/cache/file-cacher.js +261 -0
  44. package/dist/cache/index.cjs +13 -0
  45. package/dist/cache/index.js +5 -0
  46. package/dist/cache/lru-cache.cjs +96 -0
  47. package/dist/cache/lru-cache.js +93 -0
  48. package/dist/cache/response-cache.cjs +314 -0
  49. package/dist/cache/response-cache.js +310 -0
  50. package/dist/cache/url-store.cjs +288 -0
  51. package/dist/cache/url-store.js +285 -0
  52. package/dist/core/hooks.cjs +133 -0
  53. package/dist/core/hooks.js +120 -0
  54. package/dist/core/rezo.cjs +464 -0
  55. package/dist/core/rezo.js +458 -0
  56. package/dist/crawler.d.ts +6255 -0
  57. package/dist/dom/index.cjs +1 -0
  58. package/dist/dom/index.d.ts +23 -0
  59. package/dist/dom/index.js +1 -0
  60. package/dist/entries/crawler.cjs +5 -0
  61. package/dist/entries/crawler.js +2 -0
  62. package/dist/errors/rezo-error.cjs +722 -0
  63. package/dist/errors/rezo-error.js +716 -0
  64. package/dist/index.cjs +34 -0
  65. package/dist/index.d.ts +3335 -0
  66. package/dist/index.js +26 -0
  67. package/dist/platform/browser.cjs +9 -0
  68. package/dist/platform/browser.d.ts +3203 -0
  69. package/dist/platform/browser.js +7 -0
  70. package/dist/platform/bun.cjs +9 -0
  71. package/dist/platform/bun.d.ts +3203 -0
  72. package/dist/platform/bun.js +7 -0
  73. package/dist/platform/deno.cjs +9 -0
  74. package/dist/platform/deno.d.ts +3203 -0
  75. package/dist/platform/deno.js +7 -0
  76. package/dist/platform/node.cjs +9 -0
  77. package/dist/platform/node.d.ts +3203 -0
  78. package/dist/platform/node.js +7 -0
  79. package/dist/platform/react-native.cjs +9 -0
  80. package/dist/platform/react-native.d.ts +3203 -0
  81. package/dist/platform/react-native.js +7 -0
  82. package/dist/platform/worker.cjs +9 -0
  83. package/dist/platform/worker.d.ts +3203 -0
  84. package/dist/platform/worker.js +7 -0
  85. package/dist/plugin/addon/decodo/index.cjs +1 -0
  86. package/dist/plugin/addon/decodo/index.js +1 -0
  87. package/dist/plugin/addon/decodo/options.cjs +1 -0
  88. package/dist/plugin/addon/decodo/options.js +1 -0
  89. package/dist/plugin/addon/oxylabs/index.cjs +1 -0
  90. package/dist/plugin/addon/oxylabs/index.js +1 -0
  91. package/dist/plugin/addon/oxylabs/options.cjs +1 -0
  92. package/dist/plugin/addon/oxylabs/options.js +1 -0
  93. package/dist/plugin/crawler-options.cjs +1 -0
  94. package/dist/plugin/crawler-options.js +1 -0
  95. package/dist/plugin/crawler.cjs +519 -0
  96. package/dist/plugin/crawler.js +517 -0
  97. package/dist/plugin/index.cjs +36 -0
  98. package/dist/plugin/index.js +32 -0
  99. package/dist/proxy/index.cjs +142 -0
  100. package/dist/proxy/index.js +139 -0
  101. package/dist/responses/buildError.cjs +452 -0
  102. package/dist/responses/buildError.js +441 -0
  103. package/dist/responses/buildResponse.cjs +365 -0
  104. package/dist/responses/buildResponse.js +361 -0
  105. package/dist/responses/download.cjs +54 -0
  106. package/dist/responses/download.js +52 -0
  107. package/dist/responses/stream.cjs +60 -0
  108. package/dist/responses/stream.js +58 -0
  109. package/dist/responses/upload.cjs +54 -0
  110. package/dist/responses/upload.js +52 -0
  111. package/dist/types/cookies.cjs +394 -0
  112. package/dist/types/cookies.js +391 -0
  113. package/dist/types/download.cjs +10 -0
  114. package/dist/types/download.js +10 -0
  115. package/dist/types/rezo-request.cjs +131 -0
  116. package/dist/types/rezo-request.js +131 -0
  117. package/dist/utils/agent-merger.cjs +111 -0
  118. package/dist/utils/agent-merger.js +108 -0
  119. package/dist/utils/compression.cjs +84 -0
  120. package/dist/utils/compression.js +82 -0
  121. package/dist/utils/cookies.cjs +514 -0
  122. package/dist/utils/cookies.js +511 -0
  123. package/dist/utils/data-operations.cjs +75 -0
  124. package/dist/utils/data-operations.js +73 -0
  125. package/dist/utils/form-data.cjs +164 -0
  126. package/dist/utils/form-data.js +161 -0
  127. package/dist/utils/headers.cjs +162 -0
  128. package/dist/utils/headers.js +161 -0
  129. package/dist/utils/http-config.cjs +723 -0
  130. package/dist/utils/http-config.js +718 -0
  131. package/dist/utils/index.cjs +8 -0
  132. package/dist/utils/index.js +8 -0
  133. package/dist/utils/tools.cjs +18 -0
  134. package/dist/utils/tools.js +15 -0
  135. package/package.json +172 -0
@@ -0,0 +1,2136 @@
1
+ import NodeFormData from 'form-data';
2
+ import { EventEmitter } from 'node:events';
3
+ import { Agent as HttpAgent, OutgoingHttpHeaders } from 'node:http';
4
+ import { Agent as HttpsAgent } from 'node:https';
5
+ import { Socket } from 'node:net';
6
+ import { Readable, Writable, WritableOptions } from 'node:stream';
7
+ import { SecureContext, TLSSocket } from 'node:tls';
8
+ import PQueue from 'p-queue';
9
+ import { Options as Options$1, QueueAddOptions } from 'p-queue';
10
+ import PriorityQueue from 'p-queue/dist/priority-queue';
11
+ import { Cookie as TouchCookie, CookieJar as TouchCookieJar, CreateCookieOptions } from 'tough-cookie';
12
+
13
+ export interface SerializedCookie {
14
+ key: string;
15
+ value: string;
16
+ expires?: string;
17
+ maxAge?: number | "Infinity" | "-Infinity";
18
+ domain?: string;
19
+ path?: string;
20
+ secure?: boolean;
21
+ hostOnly?: boolean;
22
+ creation?: string;
23
+ lastAccessed?: string;
24
+ [key: string]: unknown;
25
+ }
26
+ declare class Cookie extends TouchCookie {
27
+ constructor(options?: CreateCookieOptions);
28
+ /**
29
+ * Fixes date fields that may have become strings during JSON deserialization.
30
+ * This is a workaround for tough-cookie's deserialization behavior in Bun/Node.js
31
+ * where Date objects become ISO strings.
32
+ */
33
+ private fixDateFields;
34
+ private getExpires;
35
+ toNetscapeFormat(): string;
36
+ toSetCookieString(): string;
37
+ /**
38
+ * Retrieves the complete URL from the cookie object
39
+ * @returns {string | undefined} The complete URL including protocol, domain and path. Returns undefined if domain is not set
40
+ * @example
41
+ * const cookie = new Cookie({
42
+ * domain: "example.com",
43
+ * path: "/path",
44
+ * secure: true
45
+ * });
46
+ * cookie.getURL(); // Returns: "https://example.com/path"
47
+ */
48
+ getURL(): string | undefined;
49
+ /**
50
+ * Type guard to check if an object is an instance of Cookie
51
+ * @param cookie - The object to check
52
+ * @returns {boolean} True if the object is a Cookie instance, false otherwise
53
+ * @example
54
+ * const obj = new Cookie();
55
+ * if (Cookie.isCookie(obj)) {
56
+ * // obj is confirmed to be a Cookie instance
57
+ * }
58
+ */
59
+ static isCookie(cookie: any): cookie is Cookie;
60
+ }
61
+ declare class RezoCookieJar extends TouchCookieJar {
62
+ constructor();
63
+ constructor(cookies: Cookie[]);
64
+ constructor(cookies: Cookie[], url: string);
65
+ private generateCookies;
66
+ cookies(): Cookies;
67
+ parseResponseCookies(cookies: Cookie[]): Cookies;
68
+ static toNetscapeCookie(cookies: Cookie[] | SerializedCookie[]): string;
69
+ static toCookieString(cookies: Cookie[] | SerializedCookie[]): string;
70
+ toCookieString(): string;
71
+ toNetscapeCookie(): string;
72
+ toArray(): Cookie[];
73
+ toSetCookies(): string[];
74
+ toSerializedCookies(): SerializedCookie[];
75
+ setCookiesSync(setCookieArray: string[]): Cookies;
76
+ setCookiesSync(setCookieArray: string[], url: string): Cookies;
77
+ setCookiesSync(cookiesString: string): Cookies;
78
+ setCookiesSync(cookiesString: string, url: string): Cookies;
79
+ setCookiesSync(serializedCookies: SerializedCookie[]): Cookies;
80
+ setCookiesSync(serializedCookies: SerializedCookie[], url: string): Cookies;
81
+ setCookiesSync(cookieArray: Cookie[]): Cookies;
82
+ setCookiesSync(cookieArray: Cookie[], url: string): Cookies;
83
+ private splitSetCookiesString;
84
+ private getUrlFromCookie;
85
+ private parseNetscapeCookies;
86
+ /**
87
+ * Converts Netscape cookie format to an array of Set-Cookie header strings
88
+ *
89
+ * @param netscapeCookieText - Netscape format cookie string
90
+ * @returns Array of Set-Cookie header strings
91
+ */
92
+ static netscapeCookiesToSetCookieArray(netscapeCookieText: string): string[];
93
+ /** Path to cookie file for persistence */
94
+ private _cookieFile?;
95
+ /** Get the cookie file path */
96
+ get cookieFile(): string | undefined;
97
+ /**
98
+ * Load cookies from a file (sync version).
99
+ * - .json files are loaded as serialized JSON cookies
100
+ * - .txt files are loaded as Netscape format cookies
101
+ *
102
+ * This method bypasses public suffix validation for persisted cookies only,
103
+ * keeping normal network cookie validation intact.
104
+ *
105
+ * @param filePath - Path to the cookie file
106
+ * @param defaultUrl - Default URL for cookies without domain (optional)
107
+ */
108
+ loadFromFile(filePath: string, defaultUrl?: string): void;
109
+ /**
110
+ * Save cookies to a file.
111
+ * - .json files save cookies as serialized JSON
112
+ * - .txt files save cookies in Netscape format
113
+ *
114
+ * @param filePath - Path to save the cookies (defaults to the loaded file path)
115
+ */
116
+ saveToFile(filePath?: string): void;
117
+ /**
118
+ * Create a new RezoCookieJar from a cookie file.
119
+ * - .json files are loaded as serialized JSON cookies
120
+ * - .txt files are loaded as Netscape format cookies
121
+ *
122
+ * @param filePath - Path to the cookie file
123
+ * @param defaultUrl - Default URL for cookies without domain (optional)
124
+ * @returns A new RezoCookieJar with cookies loaded from the file
125
+ */
126
+ static fromFile(filePath: string, defaultUrl?: string): RezoCookieJar;
127
+ }
128
+ export interface Cookies {
129
+ array: Cookie[];
130
+ serialized: SerializedCookie[];
131
+ netscape: string;
132
+ string: string;
133
+ setCookiesString: string[];
134
+ }
135
+ export interface RezoHttpHeaders {
136
+ accept?: string | undefined;
137
+ "accept-encoding"?: string | undefined;
138
+ "accept-language"?: string | undefined;
139
+ "accept-patch"?: string | undefined;
140
+ "accept-ranges"?: string | undefined;
141
+ "access-control-allow-credentials"?: string | undefined;
142
+ "access-control-allow-headers"?: string | undefined;
143
+ "access-control-allow-methods"?: string | undefined;
144
+ "access-control-allow-origin"?: string | undefined;
145
+ "access-control-expose-headers"?: string | undefined;
146
+ "access-control-max-age"?: string | undefined;
147
+ "access-control-request-headers"?: string | undefined;
148
+ "access-control-request-method"?: string | undefined;
149
+ age?: string | undefined;
150
+ allow?: string | undefined;
151
+ "alt-svc"?: string | undefined;
152
+ authorization?: string | undefined;
153
+ "cache-control"?: string | undefined;
154
+ connection?: string | undefined;
155
+ "content-disposition"?: string | undefined;
156
+ "content-encoding"?: string | undefined;
157
+ "content-language"?: string | undefined;
158
+ "content-length"?: string | undefined;
159
+ "content-location"?: string | undefined;
160
+ "content-range"?: string | undefined;
161
+ "content-type"?: string | undefined;
162
+ cookie?: string | undefined;
163
+ date?: string | undefined;
164
+ etag?: string | undefined;
165
+ expect?: string | undefined;
166
+ expires?: string | undefined;
167
+ forwarded?: string | undefined;
168
+ from?: string | undefined;
169
+ host?: string | undefined;
170
+ "if-match"?: string | undefined;
171
+ "if-modified-since"?: string | undefined;
172
+ "if-none-match"?: string | undefined;
173
+ "if-unmodified-since"?: string | undefined;
174
+ "last-modified"?: string | undefined;
175
+ location?: string | undefined;
176
+ origin?: string | undefined;
177
+ pragma?: string | undefined;
178
+ "proxy-authenticate"?: string | undefined;
179
+ "proxy-authorization"?: string | undefined;
180
+ "public-key-pins"?: string | undefined;
181
+ range?: string | undefined;
182
+ referer?: string | undefined;
183
+ "retry-after"?: string | undefined;
184
+ "sec-fetch-site"?: string | undefined;
185
+ "sec-fetch-mode"?: string | undefined;
186
+ "sec-fetch-user"?: string | undefined;
187
+ "sec-fetch-dest"?: string | undefined;
188
+ "sec-websocket-accept"?: string | undefined;
189
+ "sec-websocket-extensions"?: string | undefined;
190
+ "sec-websocket-key"?: string | undefined;
191
+ "sec-websocket-protocol"?: string | undefined;
192
+ "sec-websocket-version"?: string | undefined;
193
+ "strict-transport-security"?: string | undefined;
194
+ tk?: string | undefined;
195
+ trailer?: string | undefined;
196
+ "transfer-encoding"?: string | undefined;
197
+ upgrade?: string | undefined;
198
+ "user-agent"?: string | undefined;
199
+ vary?: string | undefined;
200
+ via?: string | undefined;
201
+ warning?: string | undefined;
202
+ "www-authenticate"?: string | undefined;
203
+ "accept-charset"?: string | undefined;
204
+ "cdn-cache-control"?: string | undefined;
205
+ "content-security-policy"?: string | undefined;
206
+ "content-security-policy-report-only"?: string | undefined;
207
+ dav?: string | undefined;
208
+ dnt?: string | undefined;
209
+ "if-range"?: string | undefined;
210
+ link?: string | undefined;
211
+ "max-forwards"?: string | undefined;
212
+ "public-key-pins-report-only"?: string | undefined;
213
+ "referrer-policy"?: string | undefined;
214
+ refresh?: string | undefined;
215
+ server?: string | undefined;
216
+ te?: string | undefined;
217
+ "upgrade-insecure-requests"?: string | undefined;
218
+ "x-content-type-options"?: string | undefined;
219
+ "x-dns-prefetch-control"?: string | undefined;
220
+ "x-frame-options"?: string | undefined;
221
+ "x-xss-protection"?: string | undefined;
222
+ "set-cookie"?: string[];
223
+ }
224
+ export type RezoHeadersInit = [
225
+ string,
226
+ string
227
+ ][] | Record<string, string> | Headers | RezoHttpHeaders | RezoHeaders | OutgoingHttpHeaders;
228
+ declare class RezoHeaders extends Headers {
229
+ constructor(init?: RezoHeadersInit);
230
+ getAll(name: "set-cookie" | "Set-Cookie"): string[];
231
+ getSetCookie(): string[];
232
+ get size(): number;
233
+ setContentType(value: string): this;
234
+ getContentType(): string | undefined;
235
+ setAuthorization(value: string): this;
236
+ setUserAgent(value: string): this;
237
+ getUserAgent(): string | undefined;
238
+ getKeys(): string[];
239
+ getValues(): string[];
240
+ toEntries(): [
241
+ string,
242
+ string | string
243
+ ][];
244
+ toNative(): Headers;
245
+ toRaw(): [
246
+ string,
247
+ string
248
+ ][];
249
+ toArray(): {
250
+ key: string;
251
+ value: string;
252
+ }[];
253
+ toObject(omit?: Array<keyof RezoHttpHeaders> | keyof RezoHttpHeaders): Record<string, string | string[]>;
254
+ toString(): string;
255
+ set(name: keyof RezoHttpHeaders, value: string): void;
256
+ set(name: string, value: string): void;
257
+ append(name: keyof RezoHttpHeaders, value: string): void;
258
+ append(name: string, value: string): void;
259
+ get(name: keyof RezoHttpHeaders): string | null;
260
+ get(name: string): string | null;
261
+ has(name: keyof RezoHttpHeaders): boolean;
262
+ has(name: string): boolean;
263
+ [Symbol.iterator](): ArrayIterator<[
264
+ string,
265
+ string | string[]
266
+ ]>;
267
+ [util.inspect.custom](_depth: number, options: util.InspectOptionsStylized): string;
268
+ get [Symbol.toStringTag](): string;
269
+ }
270
+ export interface ReadableOptions {
271
+ highWaterMark?: number;
272
+ encoding?: string;
273
+ objectMode?: boolean;
274
+ read?(this: Readable, size: number): void;
275
+ destroy?(this: Readable, error: Error | null, callback: (error: Error | null) => void): void;
276
+ autoDestroy?: boolean;
277
+ }
278
+ export interface Options extends ReadableOptions {
279
+ writable?: boolean;
280
+ readable?: boolean;
281
+ dataSize?: number;
282
+ maxDataSize?: number;
283
+ pauseStreams?: boolean;
284
+ }
285
+ declare class RezoFormData extends NodeFormData {
286
+ constructor(options?: Options);
287
+ /**
288
+ * Get field entries as array of [name, value] pairs
289
+ * @returns {Promise<Array<[string, any]>>} Array of field entries
290
+ */
291
+ getFieldEntries(): Promise<Array<[
292
+ string,
293
+ any
294
+ ]>>;
295
+ /**
296
+ * Convert to native FormData
297
+ * @returns {Promise<FormData | null>}
298
+ */
299
+ toNativeFormData(): Promise<FormData | null>;
300
+ /**
301
+ * Create RezoFormData from native FormData
302
+ * @param {FormData} formData - Native FormData object
303
+ * @param {Options} options - Optional RezoFormData options
304
+ * @returns {Promise<RezoFormData>}
305
+ */
306
+ static fromNativeFormData(formData: FormData, options?: Options): Promise<RezoFormData>;
307
+ /**
308
+ * Get the content type header for this form data
309
+ * @returns {string} Content type with boundary
310
+ */
311
+ getContentType(): string;
312
+ /**
313
+ * Convert form data to Buffer
314
+ * @returns {Buffer} Form data as buffer
315
+ */
316
+ toBuffer(): Buffer;
317
+ /**
318
+ * Create RezoFormData from object
319
+ * @param {Record<string, any>} obj - Object to convert
320
+ * @param {Options} options - Optional RezoFormData options
321
+ * @returns {RezoFormData}
322
+ */
323
+ static fromObject(obj: Record<string, any>, options?: Options): RezoFormData;
324
+ /**
325
+ * Convert to URL query string
326
+ * Warning: File, Blob, and binary data will be omitted
327
+ * @param {boolean} convertBinaryToBase64 - Convert binary data to base64 strings
328
+ * @returns {Promise<string>} URL query string
329
+ */
330
+ toUrlQueryString(convertBinaryToBase64?: boolean): Promise<string>;
331
+ /**
332
+ * Convert to URLSearchParams object
333
+ * Warning: File, Blob, and binary data will be omitted
334
+ * @param {boolean} convertBinaryToBase64 - Convert binary data to base64 strings
335
+ * @returns {Promise<URLSearchParams>} URLSearchParams object
336
+ */
337
+ toURLSearchParams(convertBinaryToBase64?: boolean): Promise<URLSearchParams>;
338
+ }
339
+ /**
340
+ * Emitted when request is initiated
341
+ * Contains basic request configuration without sensitive data
342
+ */
343
+ export interface RequestStartEvent {
344
+ /** Target URL */
345
+ url: string;
346
+ /** HTTP method */
347
+ method: string;
348
+ /** Request headers being sent */
349
+ headers: RezoHeaders;
350
+ /** Timestamp when request started (performance.now()) */
351
+ timestamp: number;
352
+ /** Request timeout in milliseconds */
353
+ timeout?: number;
354
+ /** Maximum redirects allowed */
355
+ maxRedirects?: number;
356
+ /** Retry configuration */
357
+ retry?: {
358
+ maxRetries?: number;
359
+ delay?: number;
360
+ backoff?: number;
361
+ };
362
+ }
363
+ /**
364
+ * Emitted when response headers are received (first byte)
365
+ * Provides response metadata before body is processed
366
+ */
367
+ export interface ResponseHeadersEvent {
368
+ /** HTTP status code */
369
+ status: number;
370
+ /** HTTP status text */
371
+ statusText: string;
372
+ /** Response headers */
373
+ headers: RezoHeaders;
374
+ /** Content-Type header value */
375
+ contentType?: string;
376
+ /** Content-Length header value (bytes) */
377
+ contentLength?: number;
378
+ /** Cookies from Set-Cookie headers */
379
+ cookies?: Cookie[];
380
+ /** Timing information */
381
+ timing: {
382
+ /** Time to first byte (TTFB) in milliseconds */
383
+ firstByte: number;
384
+ /** Total time elapsed so far in milliseconds */
385
+ total: number;
386
+ };
387
+ }
388
+ /**
389
+ * Emitted AFTER a redirect is followed
390
+ * Provides complete redirect information
391
+ */
392
+ export interface RedirectEvent {
393
+ /** Source URL (where we're redirecting FROM) */
394
+ sourceUrl: string;
395
+ /** Source HTTP status code */
396
+ sourceStatus: number;
397
+ /** Source HTTP status text */
398
+ sourceStatusText: string;
399
+ /** Destination URL (where we're redirecting TO) */
400
+ destinationUrl: string;
401
+ /** Number of redirects followed so far */
402
+ redirectCount: number;
403
+ /** Maximum redirects allowed */
404
+ maxRedirects: number;
405
+ /** Response headers from redirect response */
406
+ headers: RezoHeaders;
407
+ /** Cookies from redirect response */
408
+ cookies: Cookie[];
409
+ /** HTTP method used for the redirect */
410
+ method: string;
411
+ /** Timestamp when redirect occurred */
412
+ timestamp: number;
413
+ /** Duration of this redirect in milliseconds */
414
+ duration: number;
415
+ }
416
+ interface ProgressEvent$1 {
417
+ /** Bytes transferred so far */
418
+ loaded: number;
419
+ /** Total bytes (from Content-Length or file size) */
420
+ total: number;
421
+ /** Progress percentage (0-100) */
422
+ percentage: number;
423
+ /** Current transfer speed in bytes/second */
424
+ speed: number;
425
+ /** Average transfer speed in bytes/second */
426
+ averageSpeed: number;
427
+ /** Estimated time remaining in milliseconds */
428
+ estimatedTime: number;
429
+ /** Timestamp of this progress update */
430
+ timestamp: number;
431
+ }
432
+ /**
433
+ * Emitted when StreamResponse completes
434
+ * Body has already been emitted via 'data' events
435
+ */
436
+ export interface StreamFinishEvent {
437
+ /** HTTP status code */
438
+ status: number;
439
+ /** HTTP status text */
440
+ statusText: string;
441
+ /** Response headers */
442
+ headers: RezoHeaders;
443
+ /** Content-Type header value */
444
+ contentType?: string;
445
+ /** Content-Length (bytes received) */
446
+ contentLength: number;
447
+ /** Final URL after redirects */
448
+ finalUrl: string;
449
+ /** Cookies received */
450
+ cookies: Cookies;
451
+ /** All URLs traversed (includes redirects) */
452
+ urls: string[];
453
+ /** Timing breakdown */
454
+ timing: {
455
+ /** Total request time in milliseconds */
456
+ total: number;
457
+ /** DNS lookup time in milliseconds */
458
+ dns?: number;
459
+ /** TCP connection time in milliseconds */
460
+ tcp?: number;
461
+ /** TLS handshake time in milliseconds */
462
+ tls?: number;
463
+ /** Time to first byte in milliseconds */
464
+ firstByte?: number;
465
+ /** Content download time in milliseconds */
466
+ download?: number;
467
+ };
468
+ /** Response configuration (execution metadata) */
469
+ config: SanitizedRezoConfig;
470
+ }
471
+ /**
472
+ * Emitted when DownloadResponse completes
473
+ * Body has been saved to file
474
+ */
475
+ export interface DownloadFinishEvent {
476
+ /** HTTP status code */
477
+ status: number;
478
+ /** HTTP status text */
479
+ statusText: string;
480
+ /** Response headers */
481
+ headers: RezoHeaders;
482
+ /** Content-Type header value */
483
+ contentType?: string;
484
+ /** Content-Length (bytes downloaded) */
485
+ contentLength: number;
486
+ /** Final URL after redirects */
487
+ finalUrl: string;
488
+ /** Cookies received */
489
+ cookies: Cookies;
490
+ /** All URLs traversed (includes redirects) */
491
+ urls: string[];
492
+ /**
493
+ * File name (supports both basename and fullname)
494
+ * - For fileName: 'report.pdf' → returns 'report.pdf'
495
+ * - For saveTo: '/path/to/report.pdf' → returns '/path/to/report.pdf'
496
+ */
497
+ fileName: string;
498
+ /** File size in bytes */
499
+ fileSize: number;
500
+ /** Timing breakdown */
501
+ timing: {
502
+ /** Total request time in milliseconds */
503
+ total: number;
504
+ /** DNS lookup time in milliseconds */
505
+ dns?: number;
506
+ /** TCP connection time in milliseconds */
507
+ tcp?: number;
508
+ /** TLS handshake time in milliseconds */
509
+ tls?: number;
510
+ /** Time to first byte in milliseconds */
511
+ firstByte?: number;
512
+ /** Download duration in milliseconds */
513
+ download: number;
514
+ };
515
+ /** Average download speed in bytes/second */
516
+ averageSpeed: number;
517
+ /** Response configuration (execution metadata) */
518
+ config: SanitizedRezoConfig;
519
+ }
520
+ /**
521
+ * Emitted when UploadResponse completes
522
+ * Includes server's response body
523
+ */
524
+ export interface UploadFinishEvent {
525
+ /** Server's response to our upload */
526
+ response: {
527
+ /** HTTP status code */
528
+ status: number;
529
+ /** HTTP status text */
530
+ statusText: string;
531
+ /** Response headers */
532
+ headers: RezoHeaders;
533
+ /** Response body from server */
534
+ data: any;
535
+ /** Content-Type header value */
536
+ contentType?: string;
537
+ /** Response content length */
538
+ contentLength?: number;
539
+ };
540
+ /** Final URL after redirects */
541
+ finalUrl: string;
542
+ /** Cookies received */
543
+ cookies: Cookies;
544
+ /** All URLs traversed (includes redirects) */
545
+ urls: string[];
546
+ /** Upload size in bytes */
547
+ uploadSize: number;
548
+ /** File name if uploading a file */
549
+ fileName?: string;
550
+ /** Timing breakdown */
551
+ timing: {
552
+ /** Total request time in milliseconds */
553
+ total: number;
554
+ /** DNS lookup time in milliseconds */
555
+ dns?: number;
556
+ /** TCP connection time in milliseconds */
557
+ tcp?: number;
558
+ /** TLS handshake time in milliseconds */
559
+ tls?: number;
560
+ /** Upload duration in milliseconds */
561
+ upload: number;
562
+ /** Time waiting for server response in milliseconds */
563
+ waiting: number;
564
+ /** Response download time in milliseconds */
565
+ download?: number;
566
+ };
567
+ /** Average upload speed in bytes/second */
568
+ averageUploadSpeed: number;
569
+ /** Average download speed in bytes/second (for response) */
570
+ averageDownloadSpeed?: number;
571
+ /** Response configuration (execution metadata) */
572
+ config: SanitizedRezoConfig;
573
+ }
574
+ /**
575
+ * Sanitized RezoConfig for event emission
576
+ * Excludes only request body/data, includes all metadata
577
+ */
578
+ export type SanitizedRezoConfig = Omit<RezoConfig, "data"> & {
579
+ /** Data field explicitly removed */
580
+ data?: never;
581
+ };
582
+ /**
583
+ * Event map for StreamResponse - defines all available events and their signatures
584
+ */
585
+ export interface StreamResponseEvents {
586
+ close: [
587
+ ];
588
+ drain: [
589
+ ];
590
+ error: [
591
+ err: RezoError
592
+ ];
593
+ finish: [
594
+ info: StreamFinishEvent
595
+ ];
596
+ done: [
597
+ info: StreamFinishEvent
598
+ ];
599
+ start: [
600
+ info: RequestStartEvent
601
+ ];
602
+ initiated: [
603
+ ];
604
+ headers: [
605
+ info: ResponseHeadersEvent
606
+ ];
607
+ cookies: [
608
+ cookies: Cookie[]
609
+ ];
610
+ status: [
611
+ status: number,
612
+ statusText: string
613
+ ];
614
+ redirect: [
615
+ info: RedirectEvent
616
+ ];
617
+ progress: [
618
+ progress: ProgressEvent$1
619
+ ];
620
+ data: [
621
+ chunk: Buffer | string
622
+ ];
623
+ pipe: [
624
+ src: Readable
625
+ ];
626
+ unpipe: [
627
+ src: Readable
628
+ ];
629
+ }
630
+ /**
631
+ * Complete type-safe event method overrides for StreamResponse
632
+ * All event listener methods return 'this' for chaining
633
+ */
634
+ export interface StreamResponseEventOverrides {
635
+ on<K extends keyof StreamResponseEvents>(event: K, listener: (...args: StreamResponseEvents[K]) => void): this;
636
+ on(event: string | symbol, listener: (...args: any[]) => void): this;
637
+ once<K extends keyof StreamResponseEvents>(event: K, listener: (...args: StreamResponseEvents[K]) => void): this;
638
+ once(event: string | symbol, listener: (...args: any[]) => void): this;
639
+ addListener<K extends keyof StreamResponseEvents>(event: K, listener: (...args: StreamResponseEvents[K]) => void): this;
640
+ addListener(event: string | symbol, listener: (...args: any[]) => void): this;
641
+ prependListener<K extends keyof StreamResponseEvents>(event: K, listener: (...args: StreamResponseEvents[K]) => void): this;
642
+ prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
643
+ prependOnceListener<K extends keyof StreamResponseEvents>(event: K, listener: (...args: StreamResponseEvents[K]) => void): this;
644
+ prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
645
+ }
646
+ declare class StreamResponse extends Writable implements StreamResponseEventOverrides {
647
+ private _finished;
648
+ private _encoding?;
649
+ constructor(opts?: WritableOptions);
650
+ /**
651
+ * Set encoding for string chunks
652
+ * @param encoding - Buffer encoding (utf8, ascii, etc.)
653
+ * @returns this for chaining
654
+ */
655
+ setEncoding(encoding: BufferEncoding): this;
656
+ /**
657
+ * Get current encoding
658
+ */
659
+ getEncoding(): BufferEncoding | undefined;
660
+ /**
661
+ * Check if stream has finished
662
+ */
663
+ isFinished(): boolean;
664
+ /**
665
+ * Mark stream as finished (internal use)
666
+ * @internal
667
+ */
668
+ _markFinished(): void;
669
+ /**
670
+ * Internal write implementation required by Writable
671
+ * Emits 'data' event for each chunk received
672
+ * @internal
673
+ */
674
+ _write(chunk: any, _encoding: BufferEncoding, callback: (error?: Error | null) => void): void;
675
+ on(event: string | symbol, listener: (...args: any[]) => void): this;
676
+ once(event: string | symbol, listener: (...args: any[]) => void): this;
677
+ addListener(event: string | symbol, listener: (...args: any[]) => void): this;
678
+ prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
679
+ prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
680
+ off(event: string | symbol, listener: (...args: any[]) => void): this;
681
+ removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
682
+ removeAllListeners(event?: string | symbol): this;
683
+ }
684
+ /**
685
+ * Complete type-safe event method overrides for DownloadResponse
686
+ * All event listener methods return 'this' for chaining
687
+ */
688
+ export interface DownloadResponseEventOverrides {
689
+ on(event: "error", listener: (err: RezoError) => void): this;
690
+ on(event: "finish", listener: (info: DownloadFinishEvent) => void): this;
691
+ on(event: "done", listener: (info: DownloadFinishEvent) => void): this;
692
+ on(event: "start", listener: (info: RequestStartEvent) => void): this;
693
+ on(event: "initiated", listener: () => void): this;
694
+ on(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
695
+ on(event: "cookies", listener: (cookies: Cookie[]) => void): this;
696
+ on(event: "status", listener: (status: number, statusText: string) => void): this;
697
+ on(event: "redirect", listener: (info: RedirectEvent) => void): this;
698
+ on(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
699
+ on(event: string | symbol, listener: (...args: any[]) => void): this;
700
+ once(event: "error", listener: (err: RezoError) => void): this;
701
+ once(event: "finish", listener: (info: DownloadFinishEvent) => void): this;
702
+ once(event: "done", listener: (info: DownloadFinishEvent) => void): this;
703
+ once(event: "start", listener: (info: RequestStartEvent) => void): this;
704
+ once(event: "initiated", listener: () => void): this;
705
+ once(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
706
+ once(event: "cookies", listener: (cookies: Cookie[]) => void): this;
707
+ once(event: "status", listener: (status: number, statusText: string) => void): this;
708
+ once(event: "redirect", listener: (info: RedirectEvent) => void): this;
709
+ once(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
710
+ once(event: string | symbol, listener: (...args: any[]) => void): this;
711
+ addListener(event: "error", listener: (err: RezoError) => void): this;
712
+ addListener(event: "finish", listener: (info: DownloadFinishEvent) => void): this;
713
+ addListener(event: "done", listener: (info: DownloadFinishEvent) => void): this;
714
+ addListener(event: "start", listener: (info: RequestStartEvent) => void): this;
715
+ addListener(event: "initiated", listener: () => void): this;
716
+ addListener(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
717
+ addListener(event: "cookies", listener: (cookies: Cookie[]) => void): this;
718
+ addListener(event: "status", listener: (status: number, statusText: string) => void): this;
719
+ addListener(event: "redirect", listener: (info: RedirectEvent) => void): this;
720
+ addListener(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
721
+ addListener(event: string | symbol, listener: (...args: any[]) => void): this;
722
+ prependListener(event: "error", listener: (err: RezoError) => void): this;
723
+ prependListener(event: "finish", listener: (info: DownloadFinishEvent) => void): this;
724
+ prependListener(event: "done", listener: (info: DownloadFinishEvent) => void): this;
725
+ prependListener(event: "start", listener: (info: RequestStartEvent) => void): this;
726
+ prependListener(event: "initiated", listener: () => void): this;
727
+ prependListener(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
728
+ prependListener(event: "cookies", listener: (cookies: Cookie[]) => void): this;
729
+ prependListener(event: "status", listener: (status: number, statusText: string) => void): this;
730
+ prependListener(event: "redirect", listener: (info: RedirectEvent) => void): this;
731
+ prependListener(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
732
+ prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
733
+ prependOnceListener(event: "error", listener: (err: RezoError) => void): this;
734
+ prependOnceListener(event: "finish", listener: (info: DownloadFinishEvent) => void): this;
735
+ prependOnceListener(event: "done", listener: (info: DownloadFinishEvent) => void): this;
736
+ prependOnceListener(event: "start", listener: (info: RequestStartEvent) => void): this;
737
+ prependOnceListener(event: "initiated", listener: () => void): this;
738
+ prependOnceListener(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
739
+ prependOnceListener(event: "cookies", listener: (cookies: Cookie[]) => void): this;
740
+ prependOnceListener(event: "status", listener: (status: number, statusText: string) => void): this;
741
+ prependOnceListener(event: "redirect", listener: (info: RedirectEvent) => void): this;
742
+ prependOnceListener(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
743
+ prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
744
+ }
745
+ declare class DownloadResponse extends EventEmitter implements DownloadResponseEventOverrides {
746
+ /** File name (basename or fullname) */
747
+ fileName: string;
748
+ /** Target URL */
749
+ url: string;
750
+ /** HTTP status code (set when headers received) */
751
+ status?: number;
752
+ /** HTTP status text (set when headers received) */
753
+ statusText?: string;
754
+ private _finished;
755
+ constructor(fileName: string, url: string);
756
+ /**
757
+ * Check if download has finished
758
+ */
759
+ isFinished(): boolean;
760
+ /**
761
+ * Mark download as finished (internal use)
762
+ * @internal
763
+ */
764
+ _markFinished(): void;
765
+ on(event: string | symbol, listener: (...args: any[]) => void): this;
766
+ once(event: string | symbol, listener: (...args: any[]) => void): this;
767
+ addListener(event: string | symbol, listener: (...args: any[]) => void): this;
768
+ prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
769
+ prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
770
+ off(event: string | symbol, listener: (...args: any[]) => void): this;
771
+ removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
772
+ removeAllListeners(event?: string | symbol): this;
773
+ }
774
+ /**
775
+ * Complete type-safe event method overrides for UploadResponse
776
+ * All event listener methods return 'this' for chaining
777
+ */
778
+ export interface UploadResponseEventOverrides {
779
+ on(event: "error", listener: (err: RezoError) => void): this;
780
+ on(event: "finish", listener: (info: UploadFinishEvent) => void): this;
781
+ on(event: "done", listener: (info: UploadFinishEvent) => void): this;
782
+ on(event: "start", listener: (info: RequestStartEvent) => void): this;
783
+ on(event: "initiated", listener: () => void): this;
784
+ on(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
785
+ on(event: "cookies", listener: (cookies: Cookie[]) => void): this;
786
+ on(event: "status", listener: (status: number, statusText: string) => void): this;
787
+ on(event: "redirect", listener: (info: RedirectEvent) => void): this;
788
+ on(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
789
+ on(event: string | symbol, listener: (...args: any[]) => void): this;
790
+ once(event: "error", listener: (err: RezoError) => void): this;
791
+ once(event: "finish", listener: (info: UploadFinishEvent) => void): this;
792
+ once(event: "done", listener: (info: UploadFinishEvent) => void): this;
793
+ once(event: "start", listener: (info: RequestStartEvent) => void): this;
794
+ once(event: "initiated", listener: () => void): this;
795
+ once(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
796
+ once(event: "cookies", listener: (cookies: Cookie[]) => void): this;
797
+ once(event: "status", listener: (status: number, statusText: string) => void): this;
798
+ once(event: "redirect", listener: (info: RedirectEvent) => void): this;
799
+ once(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
800
+ once(event: string | symbol, listener: (...args: any[]) => void): this;
801
+ addListener(event: "error", listener: (err: RezoError) => void): this;
802
+ addListener(event: "finish", listener: (info: UploadFinishEvent) => void): this;
803
+ addListener(event: "done", listener: (info: UploadFinishEvent) => void): this;
804
+ addListener(event: "start", listener: (info: RequestStartEvent) => void): this;
805
+ addListener(event: "initiated", listener: () => void): this;
806
+ addListener(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
807
+ addListener(event: "cookies", listener: (cookies: Cookie[]) => void): this;
808
+ addListener(event: "status", listener: (status: number, statusText: string) => void): this;
809
+ addListener(event: "redirect", listener: (info: RedirectEvent) => void): this;
810
+ addListener(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
811
+ addListener(event: string | symbol, listener: (...args: any[]) => void): this;
812
+ prependListener(event: "error", listener: (err: RezoError) => void): this;
813
+ prependListener(event: "finish", listener: (info: UploadFinishEvent) => void): this;
814
+ prependListener(event: "done", listener: (info: UploadFinishEvent) => void): this;
815
+ prependListener(event: "start", listener: (info: RequestStartEvent) => void): this;
816
+ prependListener(event: "initiated", listener: () => void): this;
817
+ prependListener(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
818
+ prependListener(event: "cookies", listener: (cookies: Cookie[]) => void): this;
819
+ prependListener(event: "status", listener: (status: number, statusText: string) => void): this;
820
+ prependListener(event: "redirect", listener: (info: RedirectEvent) => void): this;
821
+ prependListener(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
822
+ prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
823
+ prependOnceListener(event: "error", listener: (err: RezoError) => void): this;
824
+ prependOnceListener(event: "finish", listener: (info: UploadFinishEvent) => void): this;
825
+ prependOnceListener(event: "done", listener: (info: UploadFinishEvent) => void): this;
826
+ prependOnceListener(event: "start", listener: (info: RequestStartEvent) => void): this;
827
+ prependOnceListener(event: "initiated", listener: () => void): this;
828
+ prependOnceListener(event: "headers", listener: (info: ResponseHeadersEvent) => void): this;
829
+ prependOnceListener(event: "cookies", listener: (cookies: Cookie[]) => void): this;
830
+ prependOnceListener(event: "status", listener: (status: number, statusText: string) => void): this;
831
+ prependOnceListener(event: "redirect", listener: (info: RedirectEvent) => void): this;
832
+ prependOnceListener(event: "progress", listener: (progress: ProgressEvent$1) => void): this;
833
+ prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
834
+ }
835
+ declare class UploadResponse extends EventEmitter implements UploadResponseEventOverrides {
836
+ /** Target URL */
837
+ url: string;
838
+ /** File name if uploading a file */
839
+ fileName?: string;
840
+ /** HTTP status code (set when headers received) */
841
+ status?: number;
842
+ /** HTTP status text (set when headers received) */
843
+ statusText?: string;
844
+ private _finished;
845
+ constructor(url: string, fileName?: string);
846
+ /**
847
+ * Check if upload has finished
848
+ */
849
+ isFinished(): boolean;
850
+ /**
851
+ * Mark upload as finished (internal use)
852
+ * @internal
853
+ */
854
+ _markFinished(): void;
855
+ on(event: string | symbol, listener: (...args: any[]) => void): this;
856
+ once(event: string | symbol, listener: (...args: any[]) => void): this;
857
+ addListener(event: string | symbol, listener: (...args: any[]) => void): this;
858
+ prependListener(event: string | symbol, listener: (...args: any[]) => void): this;
859
+ prependOnceListener(event: string | symbol, listener: (...args: any[]) => void): this;
860
+ off(event: string | symbol, listener: (...args: any[]) => void): this;
861
+ removeListener(event: string | symbol, listener: (...args: any[]) => void): this;
862
+ removeAllListeners(event?: string | symbol): this;
863
+ }
864
+ /**
865
+ * Standard RezoResponse for non-streaming requests
866
+ * Contains response data, status, headers, cookies, and execution metadata
867
+ */
868
+ export interface RezoResponse<T = any> {
869
+ data: T;
870
+ status: number;
871
+ statusText: string;
872
+ finalUrl: string;
873
+ cookies: Cookies;
874
+ headers: RezoHeaders;
875
+ contentType: string | undefined;
876
+ contentLength: number;
877
+ urls: string[];
878
+ config: RezoConfig;
879
+ }
880
+ /**
881
+ * RezoStreamResponse - For responseType: 'stream'
882
+ * Extends StreamResponse class (EventEmitter)
883
+ * Emits 'data' events for response body chunks
884
+ */
885
+ export interface RezoStreamResponse extends StreamResponse {
886
+ }
887
+ /**
888
+ * RezoDownloadResponse - For fileName/saveTo options
889
+ * Extends DownloadResponse class (EventEmitter)
890
+ * Streams response body directly to file
891
+ */
892
+ export interface RezoDownloadResponse extends DownloadResponse {
893
+ }
894
+ /**
895
+ * RezoUploadResponse - For responseType: 'upload'
896
+ * Extends UploadResponse class (EventEmitter)
897
+ * Tracks upload progress and includes server response body
898
+ */
899
+ export interface RezoUploadResponse extends UploadResponse {
900
+ }
901
+ declare class RezoError<T = any> extends Error {
902
+ readonly code?: string;
903
+ readonly errno?: number;
904
+ readonly config: RezoConfig;
905
+ readonly request?: RezoHttpRequest;
906
+ readonly response?: RezoResponse<T>;
907
+ readonly isRezoError: boolean;
908
+ readonly cause?: Error;
909
+ readonly syscall?: string;
910
+ readonly hostname?: string;
911
+ readonly port?: number;
912
+ readonly address?: string;
913
+ readonly status?: number;
914
+ readonly statusText?: string;
915
+ readonly isTimeout: boolean;
916
+ readonly isAborted: boolean;
917
+ readonly isNetworkError: boolean;
918
+ readonly isHttpError: boolean;
919
+ readonly isProxyError: boolean;
920
+ readonly isSocksError: boolean;
921
+ readonly isTlsError: boolean;
922
+ readonly isRetryable: boolean;
923
+ readonly details: string;
924
+ readonly suggestion: string;
925
+ constructor(message: string, config: RezoConfig, code?: string, request?: RezoHttpRequest, response?: RezoResponse<T>);
926
+ static isRezoError(error: unknown): error is RezoError;
927
+ static fromError<T = any>(error: Error, config: RezoConfig, request?: RezoHttpRequest, response?: RezoResponse<T>): RezoError<T>;
928
+ static createNetworkError<T = any>(message: string, code: string, config: RezoConfig, request?: RezoHttpRequest): RezoError<T>;
929
+ static createHttpError<T = any>(statusCode: number, config: RezoConfig, request?: RezoHttpRequest, response?: RezoResponse<T>): RezoError<T>;
930
+ static createTimeoutError<T = any>(message: string, config: RezoConfig, request?: RezoHttpRequest): RezoError<T>;
931
+ static createAbortError<T = any>(message: string, config: RezoConfig, request?: RezoHttpRequest): RezoError<T>;
932
+ static createParsingError<T = any>(message: string, config: RezoConfig, request?: RezoHttpRequest): RezoError<T>;
933
+ static createEnvironmentError<T = any>(message: string, config: RezoConfig): RezoError<T>;
934
+ static createDecompressionError<T = any>(message: string, config: RezoConfig, request?: RezoHttpRequest, response?: RezoResponse<T>): RezoError<T>;
935
+ static createDownloadError<T = any>(message: string, config: RezoConfig, request?: RezoHttpRequest, response?: RezoResponse<T>): RezoError<T>;
936
+ static createUploadError<T = any>(message: string, config: RezoConfig, request?: RezoHttpRequest, response?: RezoResponse<T>): RezoError<T>;
937
+ static createStreamError<T = any>(message: string, config: RezoConfig, request?: RezoHttpRequest, response?: RezoResponse<T>): RezoError<T>;
938
+ static createRedirectError<T = any>(message: string, config: RezoConfig, request?: RezoHttpRequest, response?: RezoResponse<T>): RezoError<T>;
939
+ static createProxyError<T = any>(code: string, config: RezoConfig, request?: RezoHttpRequest): RezoError<T>;
940
+ static createSocksError<T = any>(code: string, config: RezoConfig, request?: RezoHttpRequest): RezoError<T>;
941
+ static createTlsError<T = any>(code: string, config: RezoConfig, request?: RezoHttpRequest): RezoError<T>;
942
+ static createRateLimitError<T = any>(config: RezoConfig, request?: RezoHttpRequest, response?: RezoResponse<T>): RezoError<T>;
943
+ /**
944
+ * Convert error to JSON - only includes defined values
945
+ */
946
+ toJSON(): Record<string, unknown>;
947
+ toString(): string;
948
+ getFullDetails(): string;
949
+ }
950
+ /**
951
+ * Context provided to beforeRequest hook
952
+ * Contains metadata about the current request state
953
+ */
954
+ export interface BeforeRequestContext {
955
+ /** Current retry count (0 for initial request, 1+ for retries) */
956
+ retryCount: number;
957
+ /** Whether this is a redirect follow-up request */
958
+ isRedirect: boolean;
959
+ /** Number of redirects followed so far */
960
+ redirectCount: number;
961
+ /** Timestamp when request processing started */
962
+ startTime: number;
963
+ }
964
+ /**
965
+ * Context provided to afterResponse hook
966
+ * Includes retry capability for token refresh scenarios
967
+ */
968
+ export interface AfterResponseContext {
969
+ /** Current retry count */
970
+ retryCount: number;
971
+ /** Function to retry request with merged options */
972
+ retryWithMergedOptions: (options: Partial<RezoRequestConfig>) => never;
973
+ }
974
+ /**
975
+ * DNS resolution event data
976
+ */
977
+ export interface DnsLookupEvent {
978
+ /** Hostname being resolved */
979
+ hostname: string;
980
+ /** Resolved IP address */
981
+ address: string;
982
+ /** Address family (4 for IPv4, 6 for IPv6) */
983
+ family: 4 | 6;
984
+ /** DNS lookup duration in milliseconds */
985
+ duration: number;
986
+ /** Timestamp when lookup completed */
987
+ timestamp: number;
988
+ }
989
+ /**
990
+ * TLS handshake event data
991
+ */
992
+ export interface TlsHandshakeEvent {
993
+ /** TLS protocol version (TLSv1.2, TLSv1.3, etc.) */
994
+ protocol: string;
995
+ /** Cipher suite used */
996
+ cipher: string;
997
+ /** Whether certificate is authorized */
998
+ authorized: boolean;
999
+ /** Authorization error if any */
1000
+ authorizationError?: string;
1001
+ /** Server certificate info */
1002
+ certificate?: {
1003
+ subject: string;
1004
+ issuer: string;
1005
+ validFrom: string;
1006
+ validTo: string;
1007
+ fingerprint: string;
1008
+ };
1009
+ /** Handshake duration in milliseconds */
1010
+ duration: number;
1011
+ /** Timestamp when handshake completed */
1012
+ timestamp: number;
1013
+ }
1014
+ /**
1015
+ * Socket event data
1016
+ */
1017
+ export interface SocketEvent {
1018
+ /** Event type */
1019
+ type: "connect" | "close" | "drain" | "error" | "timeout" | "end";
1020
+ /** Local address */
1021
+ localAddress?: string;
1022
+ /** Local port */
1023
+ localPort?: number;
1024
+ /** Remote address */
1025
+ remoteAddress?: string;
1026
+ /** Remote port */
1027
+ remotePort?: number;
1028
+ /** Bytes written */
1029
+ bytesWritten?: number;
1030
+ /** Bytes read */
1031
+ bytesRead?: number;
1032
+ /** Error if applicable */
1033
+ error?: Error;
1034
+ /** Timestamp */
1035
+ timestamp: number;
1036
+ }
1037
+ /**
1038
+ * Timeout event data
1039
+ */
1040
+ export interface TimeoutEvent {
1041
+ /** Type of timeout */
1042
+ type: "connect" | "request" | "response" | "socket" | "lookup";
1043
+ /** Configured timeout value in milliseconds */
1044
+ timeout: number;
1045
+ /** Elapsed time before timeout in milliseconds */
1046
+ elapsed: number;
1047
+ /** URL being requested */
1048
+ url: string;
1049
+ /** Timestamp when timeout occurred */
1050
+ timestamp: number;
1051
+ }
1052
+ /**
1053
+ * Abort event data
1054
+ */
1055
+ export interface AbortEvent {
1056
+ /** Reason for abort */
1057
+ reason: "user" | "timeout" | "signal" | "error";
1058
+ /** Abort message */
1059
+ message?: string;
1060
+ /** URL being requested */
1061
+ url: string;
1062
+ /** Elapsed time before abort in milliseconds */
1063
+ elapsed: number;
1064
+ /** Timestamp when abort occurred */
1065
+ timestamp: number;
1066
+ }
1067
+ /**
1068
+ * Headers received event data (before body)
1069
+ */
1070
+ export interface HeadersReceivedEvent {
1071
+ /** HTTP status code */
1072
+ status: number;
1073
+ /** HTTP status text */
1074
+ statusText: string;
1075
+ /** Response headers */
1076
+ headers: RezoHeaders;
1077
+ /** Content-Type header */
1078
+ contentType?: string;
1079
+ /** Content-Length header */
1080
+ contentLength?: number;
1081
+ /** Time to first byte in milliseconds */
1082
+ ttfb: number;
1083
+ /** Timestamp */
1084
+ timestamp: number;
1085
+ }
1086
+ /**
1087
+ * Parse complete event data
1088
+ */
1089
+ export interface ParseCompleteEvent<T = any> {
1090
+ /** Parsed data */
1091
+ data: T;
1092
+ /** Original raw data before parsing */
1093
+ rawData: string | Buffer;
1094
+ /** Content-Type that triggered parsing */
1095
+ contentType: string;
1096
+ /** Parse duration in milliseconds */
1097
+ parseDuration: number;
1098
+ /** Timestamp */
1099
+ timestamp: number;
1100
+ }
1101
+ /**
1102
+ * Cache event data
1103
+ */
1104
+ export interface CacheEvent {
1105
+ /** HTTP status code */
1106
+ status: number;
1107
+ /** Response headers */
1108
+ headers: RezoHeaders;
1109
+ /** URL being cached */
1110
+ url: string;
1111
+ /** Cache key if applicable */
1112
+ cacheKey?: string;
1113
+ /** Whether response is cacheable by default */
1114
+ isCacheable: boolean;
1115
+ /** Cache-Control header parsed */
1116
+ cacheControl?: {
1117
+ maxAge?: number;
1118
+ sMaxAge?: number;
1119
+ noCache?: boolean;
1120
+ noStore?: boolean;
1121
+ mustRevalidate?: boolean;
1122
+ private?: boolean;
1123
+ public?: boolean;
1124
+ };
1125
+ }
1126
+ /**
1127
+ * Cookie event data
1128
+ */
1129
+ export interface CookieEvent {
1130
+ /** Cookie being set/processed */
1131
+ cookie: Cookie;
1132
+ /** Source of cookie (response header, manual set, etc.) */
1133
+ source: "response" | "request" | "manual";
1134
+ /** URL context */
1135
+ url: string;
1136
+ /** Whether cookie is valid */
1137
+ isValid: boolean;
1138
+ /** Validation errors if any */
1139
+ validationErrors?: string[];
1140
+ }
1141
+ /**
1142
+ * Hook called during options initialization
1143
+ * Use to normalize or validate request options
1144
+ * Must be synchronous
1145
+ */
1146
+ export type InitHook = (plainOptions: Partial<RezoRequestConfig>, options: RezoRequestConfig) => void;
1147
+ /**
1148
+ * Hook called before request is sent
1149
+ * Use to modify config, add headers, sign requests
1150
+ * Can return early with a Response to bypass actual request
1151
+ */
1152
+ export type BeforeRequestHook = (config: RezoConfig, context: BeforeRequestContext) => void | Response | Promise<void | Response>;
1153
+ /**
1154
+ * Hook called before following a redirect
1155
+ * Use to inspect/modify redirect behavior
1156
+ */
1157
+ export type BeforeRedirectHook = (config: RezoConfig, response: RezoResponse) => void | Promise<void>;
1158
+ /**
1159
+ * Hook called before a retry attempt
1160
+ * Use for custom backoff logic, logging
1161
+ */
1162
+ export type BeforeRetryHook = (config: RezoConfig, error: RezoError, retryCount: number) => void | Promise<void>;
1163
+ /**
1164
+ * Hook called after response is received
1165
+ * Use to transform response, refresh tokens
1166
+ * Can trigger retry via context.retryWithMergedOptions
1167
+ * Return modified response or original
1168
+ */
1169
+ export type AfterResponseHook<T = any> = (response: RezoResponse<T>, config: RezoConfig, context: AfterResponseContext) => RezoResponse<T> | Promise<RezoResponse<T>>;
1170
+ /**
1171
+ * Hook called before error is thrown
1172
+ * Use to transform errors, add context
1173
+ * Can return custom Error subclasses
1174
+ */
1175
+ export type BeforeErrorHook = (error: RezoError | Error) => RezoError | Error | Promise<RezoError | Error>;
1176
+ /**
1177
+ * Hook called before caching a response
1178
+ * Return false to prevent caching
1179
+ * Can modify response headers to affect caching behavior
1180
+ */
1181
+ export type BeforeCacheHook = (event: CacheEvent) => boolean | void;
1182
+ /**
1183
+ * Hook called when response headers are received (before body)
1184
+ * Use to inspect headers, abort early, prepare for response
1185
+ */
1186
+ export type AfterHeadersHook = (event: HeadersReceivedEvent, config: RezoConfig) => void | Promise<void>;
1187
+ /**
1188
+ * Hook called after response body is parsed
1189
+ * Use to transform parsed data, validate response
1190
+ */
1191
+ export type AfterParseHook<T = any> = (event: ParseCompleteEvent<T>, config: RezoConfig) => T | Promise<T>;
1192
+ /**
1193
+ * Hook called before a cookie is set
1194
+ * Return false to reject the cookie
1195
+ * Can modify cookie properties
1196
+ */
1197
+ export type BeforeCookieHook = (event: CookieEvent, config: RezoConfig) => boolean | void | Promise<boolean | void>;
1198
+ /**
1199
+ * Hook called after cookies are processed
1200
+ * Use for cookie logging, analytics
1201
+ */
1202
+ export type AfterCookieHook = (cookies: Cookie[], config: RezoConfig) => void | Promise<void>;
1203
+ /**
1204
+ * Hook called on socket events
1205
+ * Use for connection monitoring, metrics
1206
+ */
1207
+ export type OnSocketHook = (event: SocketEvent, socket: Socket | TLSSocket) => void;
1208
+ /**
1209
+ * Hook called when DNS lookup completes
1210
+ * Use for DNS caching, logging, analytics
1211
+ */
1212
+ export type OnDnsHook = (event: DnsLookupEvent, config: RezoConfig) => void;
1213
+ /**
1214
+ * Hook called when TLS handshake completes
1215
+ * Use for certificate validation, security logging
1216
+ */
1217
+ export type OnTlsHook = (event: TlsHandshakeEvent, config: RezoConfig) => void;
1218
+ /**
1219
+ * Hook called when timeout occurs
1220
+ * Use for timeout logging, retry decisions
1221
+ */
1222
+ export type OnTimeoutHook = (event: TimeoutEvent, config: RezoConfig) => void;
1223
+ /**
1224
+ * Hook called when request is aborted
1225
+ * Use for cleanup, logging
1226
+ */
1227
+ export type OnAbortHook = (event: AbortEvent, config: RezoConfig) => void;
1228
+ /**
1229
+ * Collection of all hook types
1230
+ * All hooks are arrays to allow multiple handlers
1231
+ */
1232
+ export interface RezoHooks {
1233
+ init: InitHook[];
1234
+ beforeRequest: BeforeRequestHook[];
1235
+ beforeRedirect: BeforeRedirectHook[];
1236
+ beforeRetry: BeforeRetryHook[];
1237
+ afterResponse: AfterResponseHook[];
1238
+ beforeError: BeforeErrorHook[];
1239
+ beforeCache: BeforeCacheHook[];
1240
+ afterHeaders: AfterHeadersHook[];
1241
+ afterParse: AfterParseHook[];
1242
+ beforeCookie: BeforeCookieHook[];
1243
+ afterCookie: AfterCookieHook[];
1244
+ onSocket: OnSocketHook[];
1245
+ onDns: OnDnsHook[];
1246
+ onTls: OnTlsHook[];
1247
+ onTimeout: OnTimeoutHook[];
1248
+ onAbort: OnAbortHook[];
1249
+ }
1250
+ /**
1251
+ * Supported proxy protocols for network requests
1252
+ */
1253
+ export type ProxyProtocol = "http" | "https" | "socks4" | "socks5";
1254
+ /**
1255
+ * Configuration options for proxy connections
1256
+ */
1257
+ export type ProxyOptions = {
1258
+ /** The proxy protocol to use */
1259
+ protocol: ProxyProtocol;
1260
+ /** Proxy server hostname or IP address */
1261
+ host: string;
1262
+ /** Proxy server port number */
1263
+ port: number;
1264
+ /** Optional authentication credentials for the proxy */
1265
+ auth?: {
1266
+ /** Username for proxy authentication */
1267
+ username: string;
1268
+ /** Password for proxy authentication */
1269
+ password: string;
1270
+ };
1271
+ /** Connection timeout in milliseconds */
1272
+ timeout?: number;
1273
+ /** Whether to keep the connection alive */
1274
+ keepAlive?: boolean;
1275
+ /** Keep-alive timeout in milliseconds */
1276
+ keepAliveMsecs?: number;
1277
+ /** Maximum number of sockets to allow per host */
1278
+ maxSockets?: number;
1279
+ /** Maximum number of free sockets to keep open per host */
1280
+ maxFreeSockets?: number;
1281
+ /** Whether to reject unauthorized SSL certificates */
1282
+ rejectUnauthorized?: boolean;
1283
+ };
1284
+ /**
1285
+ * Maximum upload rate in bytes per second
1286
+ */
1287
+ export type MaxUploadRate = number;
1288
+ /**
1289
+ * Maximum download rate in bytes per second
1290
+ */
1291
+ export type MaxDownloadRate = number;
1292
+ /**
1293
+ * Custom string type for Rezo-specific string values
1294
+ */
1295
+ export type RezoString = string;
1296
+ /**
1297
+ * Standard HTTP methods supported by Rezo
1298
+ */
1299
+ export type HttpMethod = "GET" | "POST" | "PUT" | "DELETE" | "PATCH" | "HEAD" | "OPTIONS" | "TRACE" | "CONNECT";
1300
+ type ResponseType$1 = "json" | "text" | "blob" | "arrayBuffer" | "buffer" | "auto";
1301
+ /**
1302
+ * MIME content types for request/response bodies
1303
+ */
1304
+ export type ContentType = "application/json" | "application/x-www-form-urlencoded" | "multipart/form-data" | "text/plain" | "text/html" | "application/xml" | "application/octet-stream" | RezoString;
1305
+ /**
1306
+ * RezoRequestConfig - Clean interface for internal request processing
1307
+ *
1308
+ * @template D - Type of the request body data
1309
+ */
1310
+ export interface RezoRequestConfig<D = any> {
1311
+ /** The target URL for the request */
1312
+ url: string | URL;
1313
+ /**
1314
+ * The absolute request url
1315
+ */
1316
+ fullUrl: string;
1317
+ /** Request method to use for the request */
1318
+ method: HttpMethod;
1319
+ /** Request headers as various supported formats */
1320
+ headers?: [
1321
+ string,
1322
+ string
1323
+ ][] | Record<string, string> | Headers | RezoHttpHeaders | RezoHeaders | OutgoingHttpHeaders;
1324
+ /** URL query parameters to append to the request */
1325
+ params?: Record<string | number, any>;
1326
+ /**
1327
+ * Queue to use for request execution
1328
+ */
1329
+ queue?: PQueue | null;
1330
+ /**
1331
+ * Controls how the response body is parsed and returned in `response.data`.
1332
+ *
1333
+ * **Available Types:**
1334
+ * - `'json'` - Parse as JSON object/array. Best for REST APIs.
1335
+ * - `'text'` - Return as string. Best for HTML, XML, plain text.
1336
+ * - `'blob'` - Return as Blob (browser). Best for binary in browsers.
1337
+ * - `'arrayBuffer'` - Return as ArrayBuffer. Best for binary processing.
1338
+ * - `'buffer'` - Return as Buffer (Node.js). Best for binary in Node.
1339
+ * - `'auto'` - Auto-detect from Content-Type header (default).
1340
+ *
1341
+ * **For streaming, use dedicated methods instead:**
1342
+ * - `rezo.stream(url)` - Real-time streaming data
1343
+ * - `rezo.download(url, saveTo)` - Download with progress
1344
+ * - `rezo.upload(url, data)` - Upload with progress
1345
+ *
1346
+ * @default 'auto'
1347
+ * @example
1348
+ * // Get JSON
1349
+ * const { data } = await rezo.get('/api/users', { responseType: 'json' });
1350
+ *
1351
+ * // Get HTML as text
1352
+ * const { data: html } = await rezo.get('/page', { responseType: 'text' });
1353
+ *
1354
+ * // Get image as buffer
1355
+ * const { data: img } = await rezo.get('/image.png', { responseType: 'buffer' });
1356
+ */
1357
+ responseType?: ResponseType$1;
1358
+ /** Character encoding for the response */
1359
+ responseEncoding?: string;
1360
+ /** Base URL for the request (used with relative URLs) */
1361
+ baseURL?: string;
1362
+ /** Raw request body data */
1363
+ body?: D;
1364
+ /** JSON object to be serialized as request body */
1365
+ json?: Record<string, any>;
1366
+ /** Form data to be URL-encoded */
1367
+ form?: Record<string, any>;
1368
+ /** Form data for multipart/form-data requests */
1369
+ formData?: Record<string, any> | RezoFormData;
1370
+ /** Multipart data (alias for formData) */
1371
+ multipart?: Record<string, any> | RezoFormData;
1372
+ /** Whether to detect and prevent redirect cycles */
1373
+ enableRedirectCycleDetection?: boolean;
1374
+ /** MIME type for the request content */
1375
+ contentType?: ContentType | string;
1376
+ /** Skip setting Content-Type header automatically */
1377
+ withoutContentType?: boolean;
1378
+ /** Basic authentication credentials */
1379
+ auth?: {
1380
+ /** Username for authentication */
1381
+ username: string;
1382
+ /** Password for authentication */
1383
+ password: string;
1384
+ };
1385
+ /** Request timeout in milliseconds */
1386
+ timeout?: number;
1387
+ /** Whether to reject requests with invalid SSL certificates */
1388
+ rejectUnauthorized?: boolean;
1389
+ /** Retry configuration for failed requests */
1390
+ retry?: {
1391
+ /** Maximum number of retry attempts */
1392
+ maxRetries?: number;
1393
+ /** Delay between retries in milliseconds */
1394
+ retryDelay?: number;
1395
+ /** Whether to increment delay on each retry */
1396
+ incrementDelay?: boolean;
1397
+ /** HTTP status codes that should trigger a retry attempt defaults are (408, 429, 500, 502, 503, 504, 425, 520) */
1398
+ statusCodes?: number[];
1399
+ /** Weather to stop or continue retry when certain condition is met*/
1400
+ condition?: (error: RezoError) => boolean | Promise<boolean>;
1401
+ };
1402
+ /** Whether to use a secure context for HTTPS requests */
1403
+ useSecureContext?: boolean;
1404
+ /** Custom secure context for TLS connections */
1405
+ secureContext?: SecureContext;
1406
+ /** Whether to automatically follow HTTP redirects */
1407
+ followRedirects?: boolean;
1408
+ /** Maximum number of redirects to follow */
1409
+ maxRedirects?: number;
1410
+ /** Whether to automatically decompress response data */
1411
+ decompress?: boolean;
1412
+ /** Whether to keep the connection alive for reuse */
1413
+ keepAlive?: boolean;
1414
+ withoutBodyOnRedirect?: boolean;
1415
+ autoSetReferer?: boolean;
1416
+ autoSetOrigin?: boolean;
1417
+ treat302As303?: boolean;
1418
+ startNewRequest?: boolean;
1419
+ /** Whether to use HTTP/2 protocol */
1420
+ http2?: boolean;
1421
+ /** Whether to use cURL adapter */
1422
+ curl?: boolean;
1423
+ /**
1424
+ * DNS cache configuration for faster repeated requests.
1425
+ *
1426
+ * When enabled, DNS lookups are cached to avoid repeated DNS queries
1427
+ * for the same hostname, significantly improving performance for
1428
+ * applications making many requests to the same servers.
1429
+ *
1430
+ * **Options:**
1431
+ * - `true` - Enable with default settings (1 min TTL, 1000 entries max)
1432
+ * - `false` - Disable DNS caching (default)
1433
+ * - `object` - Custom configuration with ttl and maxEntries
1434
+ *
1435
+ * @example
1436
+ * // Enable with defaults
1437
+ * { dnsCache: true }
1438
+ *
1439
+ * // Custom TTL (5 minutes) and max entries
1440
+ * { dnsCache: { ttl: 300000, maxEntries: 500 } }
1441
+ *
1442
+ * @default false
1443
+ */
1444
+ dnsCache?: boolean | {
1445
+ /** Time-to-live for cached entries in milliseconds */
1446
+ ttl?: number;
1447
+ /** Maximum number of entries to cache */
1448
+ maxEntries?: number;
1449
+ };
1450
+ /**
1451
+ * Response cache configuration for caching HTTP responses.
1452
+ *
1453
+ * When enabled, successful GET/HEAD responses are cached to avoid
1454
+ * repeated network requests. Supports memory-only or file persistence.
1455
+ * Honors Cache-Control headers by default.
1456
+ *
1457
+ * **Options:**
1458
+ * - `true` - Enable memory cache with defaults (5 min TTL, 500 entries)
1459
+ * - `false` - Disable response caching (default)
1460
+ * - `object` - Custom configuration
1461
+ *
1462
+ * **Cache-Control Support:**
1463
+ * - Respects `max-age`, `s-maxage`, `no-store`, `no-cache`
1464
+ * - Sends `If-None-Match` / `If-Modified-Since` for revalidation
1465
+ * - Returns cached response on 304 Not Modified
1466
+ *
1467
+ * @example
1468
+ * // Enable memory-only cache
1469
+ * { cache: true }
1470
+ *
1471
+ * // With file persistence
1472
+ * { cache: { cacheDir: './cache', ttl: 300000 } }
1473
+ *
1474
+ * // Custom settings
1475
+ * { cache: {
1476
+ * ttl: 600000, // 10 minutes
1477
+ * maxEntries: 1000,
1478
+ * methods: ['GET'], // Only cache GET
1479
+ * respectHeaders: true // Honor Cache-Control
1480
+ * }}
1481
+ *
1482
+ * @default false
1483
+ */
1484
+ cache?: boolean | {
1485
+ /** Directory for persistent cache storage (enables file persistence) */
1486
+ cacheDir?: string;
1487
+ /** Time-to-live for cached entries in milliseconds */
1488
+ ttl?: number;
1489
+ /** Maximum number of entries to cache */
1490
+ maxEntries?: number;
1491
+ /** HTTP methods to cache */
1492
+ methods?: string[];
1493
+ /** Whether to respect Cache-Control headers */
1494
+ respectHeaders?: boolean;
1495
+ };
1496
+ /**
1497
+ * Callback invoked when a redirect response is received.
1498
+ * Controls redirect behavior including whether to follow, modify URL, or change HTTP method.
1499
+ *
1500
+ * @param options - Redirect response details
1501
+ * @param options.url - Redirect target URL
1502
+ * @param options.status - HTTP status code
1503
+ * @param options.headers - Response headers
1504
+ * @param options.sameDomain - Whether redirect is to same domain
1505
+ * @returns Boolean to follow/reject redirect, or object for granular control
1506
+ *
1507
+ * @example
1508
+ * ```typescript
1509
+ * beforeRedirect: ({ status, url }) => {
1510
+ * if (status === 301 || status === 302) {
1511
+ * return true; // Follow permanent/temporary redirects
1512
+ * } else if (status === 307 || status === 308) {
1513
+ * return { redirect: true, url: url.toString() }; // Preserve method for 307/308
1514
+ * } else if (status === 303) {
1515
+ * return { redirect: true, url: url.toString(), method: 'GET' }; // Force GET for 303
1516
+ * }
1517
+ * return false; // Reject other redirects
1518
+ * }
1519
+ * ```
1520
+ */
1521
+ beforeRedirect?: (options: OnRedirectOptions) => OnRedirectResponse;
1522
+ /** Whether to send cookies and authorization headers with cross-origin requests */
1523
+ withCredentials?: boolean;
1524
+ /** Proxy configuration (URL string or detailed options) */
1525
+ proxy?: string | ProxyOptions;
1526
+ /** Whether to enable automatic cookie handling */
1527
+ useCookies?: boolean;
1528
+ /** Custom cookie jar for managing cookies */
1529
+ cookieJar?: RezoCookieJar;
1530
+ /** Cookies to send with the request in various formats */
1531
+ cookies?: Cookies["array"] | Cookies["netscape"] | Cookies["serialized"] | Cookies["setCookiesString"];
1532
+ /** Callback for upload progress events */
1533
+ onUploadProgress?: (progressEvent: any) => void;
1534
+ /** Callback for download progress events */
1535
+ onDownloadProgress?: (progressEvent: any) => void;
1536
+ /** Maximum allowed size of the request body in bytes */
1537
+ maxBodyLength?: number;
1538
+ /** Maximum transfer rate (single number or [upload, download] tuple) */
1539
+ maxRate?: number | [
1540
+ MaxUploadRate,
1541
+ MaxDownloadRate
1542
+ ];
1543
+ /** Array of functions to transform request data */
1544
+ transformRequest?: Array<(data: any, headers: RezoHeaders) => any>;
1545
+ /** Array of functions to transform response data */
1546
+ transformResponse?: Array<(data: any) => any>;
1547
+ /** Adapter to use for the request (name or custom function) */
1548
+ adapter?: string | ((config: RezoRequestConfig) => Promise<any>);
1549
+ /** AbortSignal to cancel the request */
1550
+ signal?: AbortSignal;
1551
+ /** File path to save the response to (for downloads) */
1552
+ saveTo?: string;
1553
+ /** Custom filename for downloaded files */
1554
+ fileName?: string;
1555
+ /** Browser simulation configuration for user agent spoofing */
1556
+ browser?: {
1557
+ /** Browser name to simulate */
1558
+ name: "chrome" | "firefox" | "safari" | "edge" | "opera" | "ie" | "chromium";
1559
+ /** Browser version string */
1560
+ version: string;
1561
+ /** Device platform type */
1562
+ platform: "desktop" | "mobile" | "tablet";
1563
+ /** Operating system details */
1564
+ os: {
1565
+ /** Operating system name */
1566
+ name: "windows" | "macos" | "linux" | "ios" | "android" | "chromeos";
1567
+ /** OS version string */
1568
+ version: string;
1569
+ /** CPU architecture */
1570
+ architecture: "x86" | "x64" | "arm" | "arm64";
1571
+ };
1572
+ /** Browser language preference */
1573
+ language?: string;
1574
+ };
1575
+ /** Enable debug logging for the request */
1576
+ debug?: boolean;
1577
+ /** Enable verbose logging with detailed information */
1578
+ verbose?: boolean;
1579
+ /** Name of the cookie containing XSRF token */
1580
+ xsrfCookieName?: string;
1581
+ /** Name of the header to send XSRF token in */
1582
+ xsrfHeaderName?: string;
1583
+ /** Custom HTTP agent for HTTP requests */
1584
+ httpAgent?: HttpAgent;
1585
+ /** Custom HTTPS agent for HTTPS requests */
1586
+ httpsAgent?: HttpsAgent;
1587
+ /** Transitional options for backward compatibility */
1588
+ transitional?: {
1589
+ /** Silently ignore JSON parsing errors */
1590
+ silentJSONParsing?: boolean;
1591
+ /** Force JSON parsing even for non-JSON responses */
1592
+ forcedJSONParsing?: boolean;
1593
+ /** Provide clearer timeout error messages */
1594
+ clarifyTimeoutError?: boolean;
1595
+ };
1596
+ /** Character encoding for request body and response data */
1597
+ encoding?: BufferEncoding;
1598
+ /**
1599
+ * Request lifecycle hooks for intercepting and modifying request/response behavior.
1600
+ * Optional hooks that will be merged with default hooks during request processing.
1601
+ */
1602
+ hooks?: Partial<RezoHooks>;
1603
+ }
1604
+ export interface OnRedirectOptions {
1605
+ url: URL;
1606
+ status: number;
1607
+ headers: RezoHeaders;
1608
+ sameDomain: boolean;
1609
+ method: string;
1610
+ }
1611
+ export type OnRedirectResponse = boolean | ToRedirectOptions | undefined;
1612
+ export type ToRedirectOptions = {
1613
+ redirect: false;
1614
+ message?: string;
1615
+ } | {
1616
+ redirect: true;
1617
+ url: string;
1618
+ method?: "POST" | "GET" | "PUT" | "DELETE" | "PATCH" | "OPTIONS";
1619
+ body?: any;
1620
+ withoutBody?: boolean;
1621
+ setHeaders?: RezoHeaders | OutgoingHttpHeaders;
1622
+ setHeadersOnRedirects?: RezoHeaders | OutgoingHttpHeaders;
1623
+ };
1624
+ /**
1625
+ * RezoHttpRequest - Request configuration type for all methods
1626
+ *
1627
+ * This type excludes internal properties and is specifically designed for public API usage.
1628
+ * Use this type when creating reusable request configurations for the all method.
1629
+ *
1630
+ * @public - Use with all methods
1631
+ * @internal - Do not use internally within the library
1632
+ */
1633
+ export type RezoHttpRequest = Omit<RezoRequestConfig, "body" | "url" | "method" | "form" | "json" | "formData" | "multipart" | "fullUrl" | "responseType">;
1634
+ /**
1635
+ * Configuration object that encapsulates comprehensive request execution metadata and response processing information.
1636
+ * This interface serves as the central configuration hub for HTTP requests, containing both input parameters
1637
+ * and execution tracking data throughout the request lifecycle.
1638
+ *
1639
+ * @interface RezoConfig
1640
+ * @since 1.0.0
1641
+ * @example
1642
+ * ```typescript
1643
+ * const config: RezoConfig = {
1644
+ * originalRequest: requestConfig,
1645
+ * finalUrl: 'https://api.example.com/data',
1646
+ * adapterUsed: 'fetch',
1647
+ * timing: { startTime: Date.now(), endTime: Date.now() + 1000, total: 1000 },
1648
+ * network: { protocol: 'https' },
1649
+ * transfer: { requestSize: 256, responseSize: 1024, headerSize: 128, bodySize: 896 },
1650
+ * retryAttempts: 0,
1651
+ * errors: [],
1652
+ * security: {},
1653
+ * metadata: {}
1654
+ * };
1655
+ * ```
1656
+ */
1657
+ export interface RezoConfig {
1658
+ /** @description The target URL for the HTTP request */
1659
+ url: string;
1660
+ /** @description HTTP method (GET, POST, PUT, DELETE, etc.) */
1661
+ method: RezoRequestConfig["method"];
1662
+ /** @description HTTP headers to be sent with the request */
1663
+ headers: RezoHeaders;
1664
+ /** @description Request payload data (null when not set) */
1665
+ data?: RezoRequestConfig["body"] | null;
1666
+ /** @description URL query parameters */
1667
+ params?: RezoRequestConfig["params"];
1668
+ /** @description Request timeout in milliseconds (null when not set) */
1669
+ timeout?: number | null;
1670
+ /** @description Expected response data type */
1671
+ responseType?: "json" | "text" | "blob" | "arrayBuffer" | "stream" | "download" | "upload" | "buffer" | "binary";
1672
+ /** @description Basic authentication credentials (null when not set) */
1673
+ auth?: RezoRequestConfig["auth"] | null;
1674
+ /** @description Proxy configuration (null when not set) */
1675
+ proxy?: RezoRequestConfig["proxy"] | null;
1676
+ /** @description Maximum number of redirects to follow */
1677
+ maxRedirects: number;
1678
+ /** @description Base URL for relative requests */
1679
+ baseURL?: string;
1680
+ /** @description Enable HTTP/2 protocol */
1681
+ http2: boolean;
1682
+ /** @description Enable cURL command generation */
1683
+ curl: boolean;
1684
+ /** @description Enable detection of redirect cycles */
1685
+ enableRedirectCycleDetection?: boolean;
1686
+ /** @description Reject unauthorized SSL certificates */
1687
+ rejectUnauthorized?: boolean;
1688
+ /** @description Retry configuration */
1689
+ retry?: RezoRequestConfig["retry"];
1690
+ /** @description Compression settings */
1691
+ compression?: {
1692
+ /** @description Enable compression */
1693
+ enabled?: boolean;
1694
+ /** @description Compression threshold in bytes */
1695
+ threshold?: number;
1696
+ /** @description Supported compression algorithms */
1697
+ algorithms?: string[];
1698
+ };
1699
+ /** @description Enable cookie jar for session management */
1700
+ enableCookieJar?: boolean;
1701
+ /** @description Feature flags for adapter capabilities */
1702
+ features?: {
1703
+ /** @description HTTP/2 support */
1704
+ http2?: boolean;
1705
+ /** @description Compression support */
1706
+ compression?: boolean;
1707
+ /** @description Cookie support */
1708
+ cookies?: boolean;
1709
+ /** @description Redirect support */
1710
+ redirects?: boolean;
1711
+ /** @description Proxy support */
1712
+ proxy?: boolean;
1713
+ /** @description Timeout support */
1714
+ timeout?: boolean;
1715
+ /** @description Retry support */
1716
+ retry?: boolean;
1717
+ /** @description Cache support */
1718
+ cache?: boolean;
1719
+ /** @description Metrics support */
1720
+ metrics?: boolean;
1721
+ /** @description Event support */
1722
+ events?: boolean;
1723
+ /** @description Validation support */
1724
+ validation?: boolean;
1725
+ /** @description Browser support */
1726
+ browser?: boolean;
1727
+ /** @description SSL support */
1728
+ ssl?: boolean;
1729
+ };
1730
+ /** @description Use insecure HTTP parser */
1731
+ insecureHTTPParser: boolean;
1732
+ /** @description Custom adapter implementation */
1733
+ adapter?: any;
1734
+ isSecure?: boolean;
1735
+ /**
1736
+ * @description Rate limiting for network transfer speed (bandwidth throttling)
1737
+ *
1738
+ * Controls the maximum transfer speed in bytes per second.
1739
+ *
1740
+ * - `number`: Applies same limit to both download and upload (e.g., 1024000 = ~1MB/s)
1741
+ * - `[download, upload]`: Different limits for each direction (e.g., [5242880, 1048576] = 5MB/s down, 1MB/s up)
1742
+ * - `0` or `null`: No rate limiting (unlimited speed)
1743
+ *
1744
+ * Common values:
1745
+ * - 1048576 = 1 MB/s
1746
+ * - 5242880 = 5 MB/s
1747
+ * - 10485760 = 10 MB/s
1748
+ *
1749
+ * Note: Actual transfer speed may vary based on network conditions and adapter support.
1750
+ * This feature is adapter-dependent (HTTP adapter supports it, other adapters may vary).
1751
+ */
1752
+ maxRate: number | [
1753
+ number,
1754
+ number
1755
+ ];
1756
+ /** @description Cancellation token for request abortion (null when not set) */
1757
+ cancelToken?: any | null;
1758
+ /** @description AbortSignal for request cancellation (null when not set) */
1759
+ signal?: AbortSignal | null;
1760
+ /** @description Function to set the AbortSignal */
1761
+ setSignal: () => void;
1762
+ /** @description HTTP agent for connection pooling (null when not set) */
1763
+ httpAgent?: RezoRequestConfig["httpAgent"] | null;
1764
+ /** @description HTTPS agent for secure connection pooling (null when not set) */
1765
+ httpsAgent?: RezoRequestConfig["httpsAgent"] | null;
1766
+ /** @description Unix socket path (null when not set) */
1767
+ socketPath?: string | null;
1768
+ /** @description File path to save the response (null when not set) */
1769
+ fileName?: string | null;
1770
+ /**
1771
+ * Array of cookies to be sent with the request.
1772
+ * These cookies are configured before the request is made and will be included in the request headers.
1773
+ */
1774
+ requestCookies: Cookie[];
1775
+ /**
1776
+ * Cookies received from the server in the response.
1777
+ * These cookies are parsed from the 'Set-Cookie' response headers and can be used for subsequent requests
1778
+ * or session management. Contains multiple formats: array, serialized, netscape, string, setCookiesString.
1779
+ */
1780
+ responseCookies: Cookies;
1781
+ /**
1782
+ * Path to cookie file for persistence (null when not configured).
1783
+ * - .json files save cookies as serialized JSON
1784
+ * - .txt files save cookies in Netscape format
1785
+ */
1786
+ cookieFile?: string | null;
1787
+ /**
1788
+ * Request lifecycle hooks for intercepting and modifying request/response behavior.
1789
+ * null when no hooks are registered, otherwise contains only hooks with registered functions.
1790
+ * Empty arrays are not included - only hooks with actual handlers appear.
1791
+ *
1792
+ * Available hooks:
1793
+ * - init: During options initialization
1794
+ * - beforeRequest: Before request is sent
1795
+ * - beforeRedirect: Before following redirects
1796
+ * - beforeRetry: Before retry attempts
1797
+ * - afterResponse: After response is received
1798
+ * - beforeError: Before error is thrown
1799
+ * - beforeCache: Before caching response
1800
+ * - afterHeaders: When headers are received
1801
+ * - afterParse: After body is parsed
1802
+ * - beforeCookie/afterCookie: Cookie lifecycle
1803
+ * - onSocket/onDns/onTls/onTimeout/onAbort: Low-level events
1804
+ */
1805
+ hooks: Partial<RezoHooks> | null;
1806
+ /** @description Snapshot of the original request configuration */
1807
+ originalRequest: RezoRequestConfig;
1808
+ /** @description Final resolved URL after redirects and processing */
1809
+ finalUrl: string;
1810
+ /** @description HTTP adapter used for the request */
1811
+ adapterUsed: "http" | "https" | "http2" | "fetch" | "xhr" | "curl";
1812
+ /** @description Metadata about the adapter used */
1813
+ adapterMetadata?: {
1814
+ /** @description Adapter version */
1815
+ version?: string;
1816
+ /** @description Supported features */
1817
+ features?: string[];
1818
+ /** @description Adapter capabilities */
1819
+ capabilities?: Record<string, any>;
1820
+ };
1821
+ /** @description Complete redirect chain history */
1822
+ redirectHistory: {
1823
+ /** @description Cookies set in this redirect */
1824
+ cookies: Cookie[];
1825
+ /** @description Redirect URL */
1826
+ url: string;
1827
+ /** @description HTTP status code */
1828
+ statusCode: number;
1829
+ /** @description HTTP status text */
1830
+ statusText: string;
1831
+ /** @description Response headers */
1832
+ headers: RezoHeaders;
1833
+ /** @description Redirect timestamp */
1834
+ duration: number;
1835
+ /** @description Request configuration at this step */
1836
+ request: RezoRequestConfig;
1837
+ /** @description HTTP method used */
1838
+ method: string;
1839
+ }[];
1840
+ /** @description Number of redirects followed */
1841
+ redirectCount: number;
1842
+ /** @description Whether maximum redirects limit was reached */
1843
+ maxRedirectsReached: boolean;
1844
+ /**
1845
+ * @description Cookie jar instance for session management
1846
+ * Full RezoCookieJar class with all methods available:
1847
+ * - cookies(): Get all cookies in the jar
1848
+ * - setCookiesSync(cookies, url): Set cookies from Set-Cookie headers
1849
+ * - getCookiesSync(url): Get cookies for a URL
1850
+ * - removeAllCookiesSync(): Clear all cookies
1851
+ */
1852
+ cookieJar: RezoCookieJar;
1853
+ /** @description Comprehensive timing information */
1854
+ timing: {
1855
+ /** @description Request start timestamp (absolute performance.now() value) */
1856
+ startTimestamp: number;
1857
+ /** @description Request end timestamp (absolute performance.now() value) */
1858
+ endTimestamp: number;
1859
+ /** @description DNS lookup duration in milliseconds */
1860
+ dnsMs?: number;
1861
+ /** @description TCP connection duration in milliseconds */
1862
+ tcpMs?: number;
1863
+ /** @description TLS handshake duration in milliseconds */
1864
+ tlsMs?: number;
1865
+ /** @description Time to first byte in milliseconds (from start to first response byte) */
1866
+ ttfbMs?: number;
1867
+ /** @description Content transfer duration in milliseconds */
1868
+ transferMs?: number;
1869
+ /** @description Total request duration in milliseconds (endTimestamp - startTimestamp) */
1870
+ durationMs: number;
1871
+ };
1872
+ /** @description Network connection information */
1873
+ network: {
1874
+ /** @description Local IP address */
1875
+ localAddress?: string;
1876
+ /** @description Local port number */
1877
+ localPort?: number;
1878
+ /** @description Remote IP address */
1879
+ remoteAddress?: string;
1880
+ /** @description Remote port number */
1881
+ remotePort?: number;
1882
+ /** @description Protocol used (http/https) */
1883
+ protocol: string;
1884
+ /** @description HTTP version (1.1, 2.0, etc.) */
1885
+ httpVersion?: string;
1886
+ /** @description IP family preference (4 for IPv4, 6 for IPv6) */
1887
+ family?: 4 | 6;
1888
+ /** @description Custom DNS lookup function */
1889
+ lookup?: any;
1890
+ };
1891
+ /** @description Data transfer statistics */
1892
+ transfer: {
1893
+ /** @description Total request size in bytes (headers + body) */
1894
+ requestSize: number;
1895
+ /** @description Request headers size in bytes */
1896
+ requestHeaderSize?: number;
1897
+ /** @description Request body size in bytes */
1898
+ requestBodySize?: number;
1899
+ /** @description Total response size in bytes (headers + body) */
1900
+ responseSize: number;
1901
+ /** @description Response headers size in bytes */
1902
+ headerSize: number;
1903
+ /** @description Response body size in bytes */
1904
+ bodySize: number;
1905
+ /** @description Compression ratio if applicable */
1906
+ compressionRatio?: number;
1907
+ };
1908
+ /** @description Number of retry attempts made */
1909
+ retryAttempts: number;
1910
+ /** @description Error history during request execution */
1911
+ errors: Array<{
1912
+ /** @description Retry attempt number */
1913
+ attempt: number;
1914
+ /** @description Error message */
1915
+ error: RezoError;
1916
+ /** @description Request duration before error */
1917
+ duration: number;
1918
+ }>;
1919
+ /** @description Security and validation information */
1920
+ security: {
1921
+ /** @description TLS version used */
1922
+ tlsVersion?: string;
1923
+ /** @description Cipher suite used */
1924
+ cipher?: string;
1925
+ /** @description Certificate information */
1926
+ certificateInfo?: Record<string, any>;
1927
+ /** @description Validation results */
1928
+ validationResults?: Record<string, boolean>;
1929
+ };
1930
+ /** @description Debug mode flag */
1931
+ debug?: boolean;
1932
+ /** @description Request tracking identifier */
1933
+ requestId: string;
1934
+ /** @description Session identifier */
1935
+ sessionId?: string;
1936
+ /** @description Distributed tracing identifier */
1937
+ traceId?: string;
1938
+ /** @description Request timestamp */
1939
+ timestamp: number;
1940
+ /** @description Additional tracking data */
1941
+ trackingData?: Record<string, unknown>;
1942
+ /**
1943
+ * Callback invoked when a redirect response is received.
1944
+ * Controls redirect behavior including whether to follow, modify URL, or change HTTP method.
1945
+ *
1946
+ * @param options - Redirect response details
1947
+ * @param options.url - Redirect target URL
1948
+ * @param options.status - HTTP status code
1949
+ * @param options.headers - Response headers
1950
+ * @param options.sameDomain - Whether redirect is to same domain
1951
+ * @returns Boolean to follow/reject redirect, or object for granular control
1952
+ *
1953
+ * @example
1954
+ * ```typescript
1955
+ * beforeRedirect: ({ status, url }) => {
1956
+ * if (status === 301 || status === 302) {
1957
+ * return true; // Follow permanent/temporary redirects
1958
+ * } else if (status === 307 || status === 308) {
1959
+ * return { redirect: true, url: url.toString() }; // Preserve method for 307/308
1960
+ * } else if (status === 303) {
1961
+ * return { redirect: true, url: url.toString(), method: 'GET' }; // Force GET for 303
1962
+ * }
1963
+ * return false; // Reject other redirects
1964
+ * }
1965
+ * ```
1966
+ */
1967
+ beforeRedirect?: RezoRequestConfig["beforeRedirect"];
1968
+ /** Character encoding for request body and response data */
1969
+ encoding?: BufferEncoding;
1970
+ /**
1971
+ * Whether to use cookies for the request
1972
+ */
1973
+ useCookies: boolean;
1974
+ }
1975
+ export interface DNSCacheOptions {
1976
+ enable?: boolean;
1977
+ ttl?: number;
1978
+ maxEntries?: number;
1979
+ }
1980
+ export interface ResponseCacheConfig {
1981
+ enable?: boolean;
1982
+ cacheDir?: string;
1983
+ networkCheck?: boolean;
1984
+ ttl?: number;
1985
+ maxEntries?: number;
1986
+ methods?: string[];
1987
+ respectHeaders?: boolean;
1988
+ }
1989
+ export type queueOptions = Options$1<PriorityQueue, QueueAddOptions>;
1990
+ export interface CacheConfig {
1991
+ /** Response cache configuration */
1992
+ response?: boolean | ResponseCacheConfig;
1993
+ /** DNS cache configuration */
1994
+ dns?: boolean | DNSCacheOptions;
1995
+ }
1996
+ export type CacheOption = boolean | CacheConfig;
1997
+ export interface RezoDefaultOptions {
1998
+ baseURL?: string;
1999
+ /** Hooks for request/response lifecycle */
2000
+ hooks?: Partial<RezoHooks>;
2001
+ /** Whether to enable automatic cookie handling (default: true)*/
2002
+ enableCookieJar?: boolean;
2003
+ /** Custom cookie jar for managing cookies */
2004
+ cookieJar?: RezoHttpRequest["cookieJar"];
2005
+ /** Set default cookies to send with the requests in various formats */
2006
+ cookies?: RezoHttpRequest["cookies"];
2007
+ /**
2008
+ * Path to cookie file for persistence.
2009
+ * - .json files save cookies as serialized JSON
2010
+ * - .txt files save cookies in Netscape format
2011
+ * Cookies are loaded on construction and saved automatically after each request.
2012
+ */
2013
+ cookieFile?: string;
2014
+ queueOptions?: {
2015
+ enable: boolean;
2016
+ options?: queueOptions;
2017
+ };
2018
+ /** Request headers as various supported formats */
2019
+ headers?: RezoHttpRequest["headers"];
2020
+ /** Expected response data type */
2021
+ responseType?: ResponseType$1;
2022
+ /** Character encoding for the response */
2023
+ responseEncoding?: string;
2024
+ /** Basic authentication credentials */
2025
+ auth?: RezoHttpRequest["auth"];
2026
+ /** Request timeout in milliseconds */
2027
+ timeout?: number;
2028
+ /** @deprecated Use `timeout` instead */
2029
+ requestTimeout?: number;
2030
+ /** Whether to reject requests with invalid SSL certificates */
2031
+ rejectUnauthorized?: boolean;
2032
+ /** Retry configuration for failed requests */
2033
+ retry?: RezoHttpRequest["retry"];
2034
+ /** Whether to use a secure context for HTTPS requests */
2035
+ useSecureContext?: boolean;
2036
+ /** Custom secure context for TLS connections */
2037
+ secureContext?: RezoHttpRequest["secureContext"];
2038
+ /** Whether to automatically follow HTTP redirects */
2039
+ followRedirects?: boolean;
2040
+ /** Maximum number of redirects to follow */
2041
+ maxRedirects?: number;
2042
+ /** Whether to automatically decompress response data */
2043
+ decompress?: boolean;
2044
+ /** Whether to keep the connection alive for reuse */
2045
+ keepAlive?: boolean;
2046
+ /** Whether to detect and prevent redirect cycles */
2047
+ enableRedirectCycleDetection?: boolean;
2048
+ /** Whether to use HTTP/2 protocol */
2049
+ http2?: boolean;
2050
+ /** Whether to use cURL adapter */
2051
+ curl?: boolean;
2052
+ /** Whether to send cookies and authorization headers with cross-origin requests */
2053
+ withCredentials?: boolean;
2054
+ /** Proxy configuration (URL string or detailed options) */
2055
+ proxy?: RezoHttpRequest["proxy"];
2056
+ /** Maximum allowed size of the request body in bytes */
2057
+ maxBodyLength?: number;
2058
+ /** Maximum transfer rate (single number or [upload, download] tuple) */
2059
+ maxRate?: RezoHttpRequest["maxRate"];
2060
+ /**
2061
+ * Callback invoked when a redirect response is received.
2062
+ * Controls redirect behavior including whether to follow, modify URL, or change HTTP method.
2063
+ *
2064
+ * @param options - Redirect response details
2065
+ * @param options.url - Redirect target URL
2066
+ * @param options.status - HTTP status code
2067
+ * @param options.headers - Response headers
2068
+ * @param options.sameDomain - Whether redirect is to same domain
2069
+ * @returns Boolean to follow/reject redirect, or object for granular control
2070
+ *
2071
+ * @example
2072
+ * ```typescript
2073
+ * beforeRedirect: ({ status, url }) => {
2074
+ * if (status === 301 || status === 302) {
2075
+ * return true; // Follow permanent/temporary redirects
2076
+ * } else if (status === 307 || status === 308) {
2077
+ * return { redirect: true, url: url.toString() }; // Preserve method for 307/308
2078
+ * } else if (status === 303) {
2079
+ * return { redirect: true, url: url.toString(), method: 'GET' }; // Force GET for 303
2080
+ * }
2081
+ * return false; // Reject other redirects
2082
+ * }
2083
+ * ```
2084
+ */
2085
+ beforeRedirect?: RezoHttpRequest["beforeRedirect"];
2086
+ /** Array of functions to transform request data */
2087
+ transformRequest?: RezoHttpRequest["transformRequest"];
2088
+ /** Array of functions to transform response data */
2089
+ transformResponse?: RezoHttpRequest["transformResponse"];
2090
+ /** Adapter to use for the request (name or custom function) */
2091
+ adapter?: RezoHttpRequest["adapter"];
2092
+ /** Browser simulation configuration for user agent spoofing */
2093
+ browser?: RezoHttpRequest["browser"];
2094
+ /** Enable debug logging for the request */
2095
+ debug?: RezoHttpRequest["debug"];
2096
+ /** Enable verbose logging with detailed information */
2097
+ verbose?: RezoHttpRequest["verbose"];
2098
+ /** HTTP agent for HTTP requests */
2099
+ httpAgent?: RezoHttpRequest["httpAgent"];
2100
+ /** HTTPS agent for HTTPS requests */
2101
+ httpsAgent?: RezoHttpRequest["httpsAgent"];
2102
+ /** Transitional options for backward compatibility */
2103
+ transitional?: RezoHttpRequest["transitional"];
2104
+ /** Character encoding for request body and response data */
2105
+ encoding?: BufferEncoding;
2106
+ /**
2107
+ * Cache configuration for response and DNS caching
2108
+ * - `true`: Enable default in-memory cache (fast, sensible defaults)
2109
+ * - `{ response: {...}, dns: {...} }`: Fine-grained control
2110
+ *
2111
+ * Response cache defaults: 30 min TTL, 500 entries, GET/HEAD only
2112
+ * DNS cache defaults: 1 min TTL, 1000 entries
2113
+ */
2114
+ cache?: CacheOption;
2115
+ }
2116
+ /**
2117
+ * Execute cURL request - main adapter entry point
2118
+ * Follows the same pattern as http.ts executeRequest
2119
+ */
2120
+ declare function executeRequest<T = any>(options: RezoRequestConfig, defaultOptions: RezoDefaultOptions, jar: RezoCookieJar): Promise<RezoResponse<T> | RezoStreamResponse | RezoDownloadResponse | RezoUploadResponse>;
2121
+ /**
2122
+ * Execute HTTP request using Node.js http/https modules
2123
+ */
2124
+ declare function executeRequest$1<T = any>(options: RezoRequestConfig, defaultOptions: RezoDefaultOptions, jar: RezoCookieJar): Promise<RezoResponse<T> | RezoStreamResponse | RezoDownloadResponse | RezoUploadResponse>;
2125
+ /**
2126
+ * Unified adapter execution function type.
2127
+ * All adapters implement this signature for consistent behavior.
2128
+ */
2129
+ export type ExecuteRequestFn<T = any> = (options: RezoRequestConfig, defaultOptions: RezoDefaultOptions, jar: RezoCookieJar) => Promise<RezoResponse<T> | RezoStreamResponse | RezoDownloadResponse | RezoUploadResponse>;
2130
+
2131
+ export {
2132
+ executeRequest as executeCurlRequest,
2133
+ executeRequest$1 as executeHttpRequest,
2134
+ };
2135
+
2136
+ export {};