@hyperttp/core 1.4.8 → 1.5.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 (45) hide show
  1. package/Core/HyperCore.d.ts +3 -15
  2. package/Core/HyperCore.d.ts.map +1 -1
  3. package/Core/HyperCore.js +2 -576
  4. package/Core/HyperCore.js.map +7 -1
  5. package/Core/RequestBuilder.d.ts +11 -0
  6. package/Core/RequestBuilder.d.ts.map +1 -0
  7. package/Core/RequestBuilder.js +2 -0
  8. package/Core/RequestBuilder.js.map +7 -0
  9. package/Core/index.js +2 -2
  10. package/Core/index.js.map +7 -1
  11. package/README.md +30 -0
  12. package/defaultConfig.js +2 -19
  13. package/defaultConfig.js.map +7 -1
  14. package/index.js +2 -3
  15. package/index.js.map +7 -1
  16. package/package.json +1 -1
  17. package/transports/browser.d.ts.map +1 -1
  18. package/transports/browser.js +2 -113
  19. package/transports/browser.js.map +7 -1
  20. package/transports/manager.d.ts +0 -33
  21. package/transports/manager.d.ts.map +1 -1
  22. package/transports/manager.js +7 -349
  23. package/transports/manager.js.map +7 -1
  24. package/transports/node.d.ts +1 -0
  25. package/transports/node.d.ts.map +1 -1
  26. package/transports/node.js +2 -380
  27. package/transports/node.js.map +7 -1
  28. package/utils/errors.d.ts +0 -11
  29. package/utils/errors.d.ts.map +1 -1
  30. package/utils/errors.js +2 -53
  31. package/utils/errors.js.map +7 -1
  32. package/utils/merge.js +2 -29
  33. package/utils/merge.js.map +7 -1
  34. package/utils/normalize.d.ts +12 -7
  35. package/utils/normalize.d.ts.map +1 -1
  36. package/utils/normalize.js +2 -285
  37. package/utils/normalize.js.map +7 -1
  38. package/utils/pipeline.js +2 -193
  39. package/utils/pipeline.js.map +7 -1
  40. package/utils/response.d.ts +0 -14
  41. package/utils/response.d.ts.map +1 -1
  42. package/utils/response.js +2 -389
  43. package/utils/response.js.map +7 -1
  44. package/utils/retryUtils.js +2 -55
  45. package/utils/retryUtils.js.map +7 -1
@@ -1,380 +1,2 @@
1
- import http from "node:http";
2
- import https from "node:https";
3
- import net from "node:net";
4
- import { Readable } from "node:stream";
5
- import tls from "node:tls";
6
- import zlib from "node:zlib";
7
- /**
8
- * @ru Статические пресеты браузерных заголовков для маскировки под реальных пользователей.
9
- * Используются stealth-режимом для обхода fingerprint-защит.
10
- * @en Static presets of browser headers for masking as real users.
11
- * Used by stealth mode to bypass fingerprint protections.
12
- */
13
- const STEALTH_HEADER_PRESETS = {
14
- chrome: {
15
- "sec-ch-ua": '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
16
- "sec-ch-ua-mobile": "?0",
17
- "sec-ch-ua-platform": '"Linux"',
18
- "sec-fetch-dest": "document",
19
- "sec-fetch-mode": "navigate",
20
- "sec-fetch-site": "none",
21
- "sec-fetch-user": "?1",
22
- "upgrade-insecure-requests": "1",
23
- "accept-language": "en-US,en;q=0.9",
24
- },
25
- firefox: {
26
- "sec-fetch-dest": "document",
27
- "sec-fetch-mode": "navigate",
28
- "sec-fetch-site": "none",
29
- "accept-language": "en-US,en;q=0.5",
30
- "upgrade-insecure-requests": "1",
31
- },
32
- };
33
- /**
34
- * @ru Пресеты User-Agent, соответствующие TLS-отпечаткам (JA3/JA4).
35
- * @en User-Agent presets matching the TLS fingerprints (JA3/JA4).
36
- */
37
- const STEALTH_UA_PRESETS = {
38
- chrome: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
39
- firefox: "Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0",
40
- safari: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15",
41
- edge: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0",
42
- };
43
- /**
44
- * @ru Возвращает строку шифров TLS для указанного профиля браузера.
45
- * @en Returns the TLS cipher suite string for the specified browser profile.
46
- * @param fingerprint - Browser fingerprint profile.
47
- * @returns Colon-separated cipher suite string, or empty string if not found.
48
- */
49
- function getCiphersForProfile(fingerprint) {
50
- if (!fingerprint)
51
- return "";
52
- switch (fingerprint) {
53
- case "chrome":
54
- case "edge":
55
- return [
56
- "TLS_AES_128_GCM_SHA256",
57
- "TLS_AES_256_GCM_SHA384",
58
- "TLS_CHACHA20_POLY1305_SHA256",
59
- "ECDHE-ECDSA-AES128-GCM-SHA256",
60
- "ECDHE-RSA-AES128-GCM-SHA256",
61
- ].join(":");
62
- case "firefox":
63
- return [
64
- "TLS_AES_128_GCM_SHA256",
65
- "TLS_CHACHA20_POLY1305_SHA256",
66
- "TLS_AES_256_GCM_SHA384",
67
- "ECDHE-ECDSA-AES128-GCM-SHA256",
68
- "ECDHE-RSA-AES128-GCM-SHA256",
69
- ].join(":");
70
- case "safari":
71
- return [
72
- "TLS_AES_256_GCM_SHA384",
73
- "TLS_CHACHA20_POLY1305_SHA256",
74
- "TLS_AES_128_GCM_SHA256",
75
- "ECDHE-ECDSA-AES256-GCM-SHA384",
76
- "ECDHE-RSA-AES256-GCM-SHA384",
77
- ].join(":");
78
- default:
79
- return "";
80
- }
81
- }
82
- /**
83
- * @ru Безопасно применяет стелс-пресеты, отдавая абсолютный приоритет ручным заголовкам.
84
- * @en Safely applies stealth presets, giving absolute priority to manual headers.
85
- * @param headers - The headers object to modify.
86
- * @param stealth - Stealth configuration options.
87
- * @returns The modified headers object.
88
- */
89
- function applyStealthHeaders(headers, stealth) {
90
- if (!stealth || !stealth.fingerprint)
91
- return headers;
92
- const presetName = stealth.fingerprint;
93
- const presetHeaders = STEALTH_HEADER_PRESETS[presetName];
94
- if (presetHeaders) {
95
- for (const key in presetHeaders) {
96
- if (headers[key] === undefined) {
97
- headers[key] = presetHeaders[key];
98
- }
99
- }
100
- }
101
- const currentUA = headers["user-agent"];
102
- if (currentUA === undefined || currentUA === "hyperttp/2.0" || currentUA === "Hyperttp/2.0") {
103
- const browserUA = STEALTH_UA_PRESETS[presetName];
104
- if (browserUA) {
105
- headers["user-agent"] = browserUA;
106
- }
107
- }
108
- return headers;
109
- }
110
- /**
111
- * @ru Кэш HTTP/HTTPS агентов по ключу (протокол + stealth-конфигурация).
112
- * @en Cache of HTTP/HTTPS agents by key (protocol + stealth configuration).
113
- */
114
- const agentCache = new Map();
115
- /**
116
- * @ru Устанавливает метод dump() на прототип ReadableStream для освобождения ресурсов.
117
- * @en Installs dump() method on ReadableStream prototype for resource cleanup.
118
- */
119
- function installReadableStreamDump() {
120
- if (typeof ReadableStream === "undefined")
121
- return;
122
- const proto = ReadableStream.prototype;
123
- if (typeof proto.dump === "function")
124
- return;
125
- Object.defineProperty(proto, "dump", {
126
- value: async function () {
127
- try {
128
- return await this.cancel();
129
- }
130
- catch {
131
- //
132
- }
133
- },
134
- writable: true,
135
- configurable: true,
136
- });
137
- }
138
- /**
139
- * @ru Получает или создаёт нативный HTTP/HTTPS агент с учётом stealth-настроек.
140
- * @en Gets or creates a native HTTP/HTTPS agent considering stealth settings.
141
- * @param isHttps - Whether the connection is HTTPS.
142
- * @param stealth - Optional stealth configuration.
143
- * @returns The HTTP or HTTPS agent.
144
- */
145
- function getNativeAgent(isHttps, stealth) {
146
- const fingerprint = stealth?.fingerprint ?? "none";
147
- const fragment = stealth?.fragment ?? "none";
148
- const cacheKey = `${isHttps ? "https" : "http"}:${fingerprint}:${fragment}`;
149
- let agent = agentCache.get(cacheKey);
150
- if (agent)
151
- return agent;
152
- const agentOpts = {
153
- keepAlive: true,
154
- maxSockets: 256,
155
- };
156
- if (isHttps) {
157
- agentOpts.ciphers = getCiphersForProfile(stealth?.fingerprint);
158
- if (stealth?.fragment === "split") {
159
- agentOpts.createConnection = (options, callback) => {
160
- const socket = net.connect(options);
161
- const originalWrite = socket.write;
162
- let isFirstWrite = true;
163
- socket.write = function (chunk, encodingOrCb, cb) {
164
- if (isFirstWrite && chunk instanceof Uint8Array && chunk.length > 5) {
165
- isFirstWrite = false;
166
- this.write = originalWrite;
167
- let encoding;
168
- let callbackRef;
169
- if (typeof encodingOrCb === "function") {
170
- callbackRef = encodingOrCb;
171
- }
172
- else {
173
- encoding = encodingOrCb;
174
- callbackRef = cb;
175
- }
176
- const part1 = chunk.subarray(0, 3);
177
- const part2 = chunk.subarray(3);
178
- originalWrite.call(this, part1, encoding);
179
- return originalWrite.call(this, part2, encoding, callbackRef);
180
- }
181
- this.write = originalWrite;
182
- return originalWrite.call(this, chunk, encodingOrCb, cb);
183
- };
184
- const tlsSocket = tls.connect({
185
- ...options,
186
- socket,
187
- ciphers: agentOpts.ciphers,
188
- });
189
- tlsSocket.once("secureConnect", () => callback(null, tlsSocket));
190
- tlsSocket.once("error", (err) => callback(err));
191
- return tlsSocket;
192
- };
193
- }
194
- agent = new https.Agent(agentOpts);
195
- }
196
- else {
197
- if (stealth?.fragment === "split") {
198
- agentOpts.createConnection = (options, callback) => {
199
- const socket = net.connect(options);
200
- socket.once("connect", () => callback(null, socket));
201
- socket.once("error", (err) => callback(err));
202
- return socket;
203
- };
204
- }
205
- agent = new http.Agent(agentOpts);
206
- }
207
- agentCache.set(cacheKey, agent);
208
- return agent;
209
- }
210
- installReadableStreamDump();
211
- function isAbsoluteHttpUrl(url) {
212
- return url.startsWith("http://") || url.startsWith("https://");
213
- }
214
- function resolveUrl(baseUrl, url) {
215
- if (isAbsoluteHttpUrl(url))
216
- return url;
217
- return url.charCodeAt(0) === 47 ? baseUrl + url : baseUrl + "/" + url;
218
- }
219
- function isLocalhostUrl(url) {
220
- const schemeIdx = url.indexOf("://");
221
- if (schemeIdx === -1)
222
- return false;
223
- const hostStart = schemeIdx + 3;
224
- let hostEnd = url.indexOf("/", hostStart);
225
- if (hostEnd === -1)
226
- hostEnd = url.length;
227
- const host = url.slice(hostStart, hostEnd);
228
- return host === "localhost" || host.startsWith("localhost:");
229
- }
230
- function normalizeHeaders(headers) {
231
- const out = Object.create(null);
232
- if (!headers)
233
- return out;
234
- if (headers instanceof Headers) {
235
- headers.forEach((value, key) => {
236
- out[key.toLowerCase()] = value;
237
- });
238
- return out;
239
- }
240
- if (Array.isArray(headers)) {
241
- for (let i = 0; i < headers.length; i++) {
242
- const pair = headers[i];
243
- if (!pair || typeof pair[0] !== "string")
244
- continue;
245
- out[pair[0].toLowerCase()] = String(pair[1]);
246
- }
247
- return out;
248
- }
249
- const src = headers;
250
- for (const key in src) {
251
- const value = src[key];
252
- if (value == null)
253
- continue;
254
- const lKey = key.toLowerCase();
255
- if (Array.isArray(value)) {
256
- out[lKey] = lKey === "cookie" ? value.join("; ") : value.join(", ");
257
- continue;
258
- }
259
- out[lKey] = String(value);
260
- }
261
- return out;
262
- }
263
- function normalizeBody(body) {
264
- if (body === undefined || body === null)
265
- return undefined;
266
- if (typeof body === "string" ||
267
- body instanceof Uint8Array ||
268
- body instanceof ArrayBuffer ||
269
- ArrayBuffer.isView(body) ||
270
- (typeof ReadableStream !== "undefined" && body instanceof ReadableStream)) {
271
- return body;
272
- }
273
- if (typeof body === "object") {
274
- return JSON.stringify(body);
275
- }
276
- return String(body);
277
- }
278
- /**
279
- * @ru Реализация транспорта для Node.js с использованием нативных http/https модулей.
280
- * Поддерживает stealth-маскировку, фрагментацию TLS Client Hello и автоматическую декомпрессию.
281
- */
282
- export class NodeTransport {
283
- config;
284
- isProduction;
285
- cleanBaseUrl;
286
- constructor(config) {
287
- this.config = config;
288
- this.isProduction = process.env.NODE_ENV === "production";
289
- const base = config.baseUrl ?? "http://localhost:3000";
290
- this.cleanBaseUrl = base.endsWith("/") ? base.slice(0, -1) : base;
291
- }
292
- async execute(req) {
293
- const fullUrl = resolveUrl(this.cleanBaseUrl, req.url);
294
- if (this.isProduction && isLocalhostUrl(fullUrl)) {
295
- throw new Error("Localhost URL detected in production environment");
296
- }
297
- let headers = normalizeHeaders(req.headers);
298
- if (headers["accept-encoding"] === undefined) {
299
- headers["accept-encoding"] = "gzip, deflate, br";
300
- }
301
- const stealthOpts = req.stealth ?? this.config.stealth ?? this.config.network?.stealth;
302
- if (stealthOpts) {
303
- headers = applyStealthHeaders(headers, stealthOpts);
304
- }
305
- const body = normalizeBody(req.body);
306
- const urlObj = new URL(fullUrl);
307
- const isHttps = urlObj.protocol === "https:";
308
- const agent = getNativeAgent(isHttps, stealthOpts);
309
- return new Promise((resolve, reject) => {
310
- const reqOpts = {
311
- method: req.method,
312
- headers,
313
- agent,
314
- signal: req.signal,
315
- };
316
- const clientReq = (isHttps ? https : http).request(fullUrl, reqOpts, (res) => {
317
- const resHeaders = Object.create(null);
318
- for (const key in res.headers) {
319
- const val = res.headers[key];
320
- if (val !== undefined) {
321
- resHeaders[key] = Array.isArray(val) ? val.join(", ") : val;
322
- }
323
- }
324
- let responseStream = res;
325
- const encoding = resHeaders["content-encoding"]?.toLowerCase();
326
- if (encoding === "gzip") {
327
- responseStream = res.pipe(zlib.createGunzip());
328
- delete resHeaders["content-encoding"];
329
- delete resHeaders["content-length"];
330
- }
331
- else if (encoding === "deflate") {
332
- responseStream = res.pipe(zlib.createInflate());
333
- delete resHeaders["content-encoding"];
334
- delete resHeaders["content-length"];
335
- }
336
- else if (encoding === "br") {
337
- responseStream = res.pipe(zlib.createBrotliDecompress());
338
- delete resHeaders["content-encoding"];
339
- delete resHeaders["content-length"];
340
- }
341
- resolve({
342
- status: res.statusCode ?? 200,
343
- headers: resHeaders,
344
- url: fullUrl,
345
- body: Readable.toWeb(responseStream),
346
- });
347
- });
348
- clientReq.on("error", (err) => reject(err));
349
- if (body !== undefined && body !== null) {
350
- if (typeof body === "string" || body instanceof Uint8Array || ArrayBuffer.isView(body)) {
351
- clientReq.write(body);
352
- clientReq.end();
353
- }
354
- else if (body instanceof ArrayBuffer) {
355
- clientReq.write(Buffer.from(body));
356
- clientReq.end();
357
- }
358
- else if (typeof ReadableStream !== "undefined" && body instanceof ReadableStream) {
359
- Readable.fromWeb(body).pipe(clientReq);
360
- }
361
- else {
362
- clientReq.end();
363
- }
364
- }
365
- else {
366
- clientReq.end();
367
- }
368
- });
369
- }
370
- async close() {
371
- for (const agent of agentCache.values()) {
372
- agent.destroy();
373
- }
374
- agentCache.clear();
375
- }
376
- async destroy() {
377
- await this.close();
378
- }
379
- }
380
- //# sourceMappingURL=node.js.map
1
+ "use strict";import G from"node:http";import U from"node:https";import z from"node:net";import{Readable as R,Transform as D}from"node:stream";import O from"node:tls";import T from"node:zlib";const W={chrome:{"sec-ch-ua":'"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Linux"',"sec-fetch-dest":"document","sec-fetch-mode":"navigate","sec-fetch-site":"none","sec-fetch-user":"?1","upgrade-insecure-requests":"1","accept-language":"en-US,en;q=0.9"},firefox:{"sec-fetch-dest":"document","sec-fetch-mode":"navigate","sec-fetch-site":"none","accept-language":"en-US,en;q=0.5","upgrade-insecure-requests":"1"}},B={chrome:"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",firefox:"Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0",safari:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15",edge:"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"};function K(t){if(!t)return"";switch(t){case"chrome":case"edge":return["TLS_AES_128_GCM_SHA256","TLS_AES_256_GCM_SHA384","TLS_CHACHA20_POLY1305_SHA256","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256"].join(":");case"firefox":return["TLS_AES_128_GCM_SHA256","TLS_CHACHA20_POLY1305_SHA256","TLS_AES_256_GCM_SHA384","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256"].join(":");case"safari":return["TLS_AES_256_GCM_SHA384","TLS_CHACHA20_POLY1305_SHA256","TLS_AES_128_GCM_SHA256","ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384"].join(":");default:return""}}function N(t,e){if(!e||!e.fingerprint)return t;const i=e.fingerprint,o=W[i];if(o)for(const r in o)t[r]===void 0&&(t[r]=o[r]);const n=t["user-agent"];if(n===void 0||n==="hyperttp/2.0"||n==="Hyperttp/2.0"){const r=B[i];r&&(t["user-agent"]=r)}return t}function j(t,e,i,o){const n=e?.fingerprint??"none",r=e?.fragment??"none",y=e?.http2===!0,C=`${t?"https":"http"}:${n}:${r}:${y?"h2":"1.1"}`;let d=i.get(C);if(d)return d;const h={keepAlive:!0,maxSockets:256};if(o!==void 0&&(h.rejectUnauthorized=o),t){if(h.ciphers=K(e?.fingerprint),r==="split"||y){const L=y?["h2","http/1.1"]:void 0;h.createConnection=(u,p)=>{let a=!1;const f=(l,g)=>{const S=z.connect(u);if(r==="split"){const m=S.write;let b=!0;S.write=function(E,_,x){if(b&&E instanceof Uint8Array&&E.length>5){b=!1,this.write=m;let w,H;typeof _=="function"?H=_:(w=_,H=x);const v=E.subarray(0,3),k=E.subarray(3),P=M=>{H?.(M)};try{m.call(this,v,w)}catch(M){return P(M),!1}return m.call(this,k,w,H)}return this.write=m,m.call(this,E,_,x)}}const c={...u,socket:S,ciphers:h.ciphers};l&&(c.ALPNProtocols=l);const s=O.connect(c);s.once("secureConnect",()=>{if(l&&s.alpnProtocol==="h2"&&!a){a=!0,s.destroy(),f(["http/1.1"],g);return}g(null,s)}),s.once("error",m=>g(m))};return f(L,p)}}d=new U.Agent(h)}else d=new G.Agent(h);return i.set(C,d),d}function $(t){return t.startsWith("http://")||t.startsWith("https://")}function F(t,e){if(!e)throw new Error("URL is empty");return $(e)?e:e.charCodeAt(0)===47?t+e:t+"/"+e}function X(t){const e=t.indexOf("://");if(e===-1)return!1;const i=e+3;let o=t.indexOf("/",i);o===-1&&(o=t.length);const n=t.slice(i,o);return n==="localhost"||n.startsWith("localhost:")}function I(t){const e=Object.create(null);if(!t)return e;if(t instanceof Headers)return t.forEach((o,n)=>{e[n.toLowerCase()]=o}),e;if(Array.isArray(t)){for(let o=0;o<t.length;o++){const n=t[o];!n||typeof n[0]!="string"||(e[n[0].toLowerCase()]=String(n[1]))}return e}const i=t;for(const o in i){const n=i[o];if(n==null)continue;const r=o.toLowerCase();if(Array.isArray(n)){e[r]=r==="cookie"?n.join("; "):n.join(", ");continue}e[r]=String(n)}return e}function V(t){let e=0;return new D({transform(i,o,n){if(e+=i.length,e>t){n(new Error(`[Hyperttp] Response size exceeded limit of ${t} bytes`));return}n(null,i)}})}export class NodeTransport{config;isProduction;cleanBaseUrl;agentCache=new Map;constructor(e){this.config=e,this.isProduction=!0;const i=e.baseUrl??"http://localhost:3000";this.cleanBaseUrl=i.endsWith("/")?i.slice(0,-1):i}async execute(e){const i=F(this.cleanBaseUrl,e.url);if(this.isProduction&&X(i))throw new Error("Localhost URL detected in production environment");let o=I(e.headers);o["accept-encoding"]===void 0&&(o["accept-encoding"]="gzip, deflate, br");const n=e.stealth??this.config.stealth??this.config.network?.stealth;n&&(o=N(o,n));const r=e.body,C=new URL(i).protocol==="https:",d=j(C,n,this.agentCache,this.config.network?.rejectUnauthorized);return new Promise((h,A)=>{const L={method:e.method,headers:o,agent:d,signal:e.signal};let u=!1;const p=(C?U:G).request(i,L,a=>{const f=Object.create(null);for(const c in a.headers){const s=a.headers[c];s!==void 0&&(f[c]=Array.isArray(s)?s.join(", "):s)}let l=a;const g=f["content-encoding"]?.toLowerCase();if(g==="gzip"){const c=T.createGunzip();c.on("error",s=>{a.destroy(s),u||A(s)}),l=a.pipe(c),delete f["content-encoding"],delete f["content-length"]}else if(g==="deflate"){const c=T.createInflate();c.on("error",s=>{a.destroy(s),u||A(s)}),l=a.pipe(c),delete f["content-encoding"],delete f["content-length"]}else if(g==="br"){const c=T.createBrotliDecompress();c.on("error",s=>{a.destroy(s),u||A(s)}),l=a.pipe(c),delete f["content-encoding"],delete f["content-length"]}const S=this.config.network?.maxResponseBytes;if(S!=null&&S>0){const c=V(S);c.on("error",s=>{a.destroy(s),u||A(s)}),l=l.pipe(c)}l.on("error",c=>{u||A(c)}),u=!0,h({status:a.statusCode??200,headers:f,url:i,body:R.toWeb(l)})});p.on("error",a=>{u||A(a)}),r!=null?typeof r=="string"||r instanceof Uint8Array||ArrayBuffer.isView(r)?(p.write(r),p.end()):r instanceof ArrayBuffer?(p.write(Buffer.from(r)),p.end()):typeof ReadableStream<"u"&&r instanceof ReadableStream?R.fromWeb(r).pipe(p):p.end():p.end()})}async close(){for(const e of this.agentCache.values())e.destroy();this.agentCache.clear()}async destroy(){for(const e of this.agentCache.values())e.destroy();this.agentCache.clear()}}
2
+ //# sourceMappingURL=node.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"node.js","sourceRoot":"","sources":["../../src/transports/node.ts"],"names":[],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/transports/node.ts"],
4
+ "sourcesContent": ["import type {\n Fingerprint,\n HttpClientOptions,\n HyperTransport,\n StealthOptions,\n TransportRequest,\n TransportResponse,\n TransportResponsePayload,\n} from \"@hyperttp/types\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport net from \"node:net\";\nimport { Readable, Transform } from \"node:stream\";\nimport tls from \"node:tls\";\nimport zlib from \"node:zlib\";\n\n/**\n * @ru \u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F Node.js \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 http/https \u043C\u043E\u0434\u0443\u043B\u0435\u0439.\n * @en Node.js transport configuration using native http/https modules.\n */\nexport interface NodeTransportConfig extends HttpClientOptions {\n /**\n * @ru \u0411\u0430\u0437\u043E\u0432\u044B\u0439 URL \u0434\u043B\u044F \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0443\u0442\u0435\u0439.\n * @en Base URL for relative paths.\n */\n baseUrl?: string;\n /**\n * @ru \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 stealth-\u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Stealth masking settings at the transport level.\n */\n stealth?: StealthOptions;\n}\n\n/**\n * @ru \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043F\u0440\u0435\u0441\u0435\u0442\u044B \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043D\u044B\u0445 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0434\u043B\u044F \u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043F\u043E\u0434 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439.\n * \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F stealth-\u0440\u0435\u0436\u0438\u043C\u043E\u043C \u0434\u043B\u044F \u043E\u0431\u0445\u043E\u0434\u0430 fingerprint-\u0437\u0430\u0449\u0438\u0442.\n * @en Static presets of browser headers for masking as real users.\n * Used by stealth mode to bypass fingerprint protections.\n */\nconst STEALTH_HEADER_PRESETS: Record<string, Record<string, string>> = {\n chrome: {\n \"sec-ch-ua\": '\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"Linux\"',\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"sec-fetch-user\": \"?1\",\n \"upgrade-insecure-requests\": \"1\",\n \"accept-language\": \"en-US,en;q=0.9\",\n },\n firefox: {\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"accept-language\": \"en-US,en;q=0.5\",\n \"upgrade-insecure-requests\": \"1\",\n },\n};\n\n/**\n * @ru \u041F\u0440\u0435\u0441\u0435\u0442\u044B User-Agent, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 TLS-\u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0430\u043C (JA3/JA4).\n * @en User-Agent presets matching the TLS fingerprints (JA3/JA4).\n */\nconst STEALTH_UA_PRESETS: Record<string, string> = {\n chrome:\n \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\",\n firefox: \"Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0\",\n safari:\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15\",\n edge: \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0\",\n};\n\n/**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043E\u043A\u0443 \u0448\u0438\u0444\u0440\u043E\u0432 TLS \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n * @en Returns the TLS cipher suite string for the specified browser profile.\n * @param fingerprint - Browser fingerprint profile.\n * @returns Colon-separated cipher suite string, or empty string if not found.\n */\nfunction getCiphersForProfile(fingerprint: Fingerprint | undefined): string {\n if (!fingerprint) return \"\";\n\n switch (fingerprint) {\n case \"chrome\":\n case \"edge\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"firefox\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"safari\":\n return [\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_128_GCM_SHA256\",\n \"ECDHE-ECDSA-AES256-GCM-SHA384\",\n \"ECDHE-RSA-AES256-GCM-SHA384\",\n ].join(\":\");\n\n default:\n return \"\";\n }\n}\n\n/**\n * @ru \u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442 \u0441\u0442\u0435\u043B\u0441-\u043F\u0440\u0435\u0441\u0435\u0442\u044B, \u043E\u0442\u0434\u0430\u0432\u0430\u044F \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u044B\u0439 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0440\u0443\u0447\u043D\u044B\u043C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u043C.\n * @en Safely applies stealth presets, giving absolute priority to manual headers.\n * @param headers - The headers object to modify.\n * @param stealth - Stealth configuration options.\n * @returns The modified headers object.\n */\nfunction applyStealthHeaders(\n headers: Record<string, string>,\n stealth: StealthOptions,\n): Record<string, string> {\n if (!stealth || !stealth.fingerprint) return headers;\n\n const presetName = stealth.fingerprint;\n const presetHeaders = STEALTH_HEADER_PRESETS[presetName];\n\n if (presetHeaders) {\n for (const key in presetHeaders) {\n if (headers[key] === undefined) {\n headers[key] = presetHeaders[key]!;\n }\n }\n }\n\n const currentUA = headers[\"user-agent\"];\n if (currentUA === undefined || currentUA === \"hyperttp/2.0\" || currentUA === \"Hyperttp/2.0\") {\n const browserUA = STEALTH_UA_PRESETS[presetName];\n if (browserUA) {\n headers[\"user-agent\"] = browserUA;\n }\n }\n\n return headers;\n}\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 HTTP/HTTPS \u0430\u0433\u0435\u043D\u0442 \u0441 \u0443\u0447\u0451\u0442\u043E\u043C stealth-\u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A.\n * @en Creates a native HTTP/HTTPS agent considering stealth settings.\n * @param isHttps - Whether the connection is HTTPS.\n * @param stealth - Optional stealth configuration.\n * @param cache - The agent cache map to use (per-instance).\n * @returns The HTTP or HTTPS agent.\n */\nfunction getNativeAgent(\n isHttps: boolean,\n stealth: StealthOptions | undefined,\n cache: Map<string, http.Agent | https.Agent>,\n rejectUnauthorized?: boolean,\n): http.Agent | https.Agent {\n const fingerprint = stealth?.fingerprint ?? \"none\";\n const fragment = stealth?.fragment ?? \"none\";\n const needHttp2 = stealth?.http2 === true;\n const cacheKey = `${isHttps ? \"https\" : \"http\"}:${fingerprint}:${fragment}:${needHttp2 ? \"h2\" : \"1.1\"}`;\n\n let agent = cache.get(cacheKey);\n if (agent) return agent;\n\n const agentOpts: any = {\n keepAlive: true,\n maxSockets: 256,\n };\n\n if (rejectUnauthorized !== undefined) {\n agentOpts.rejectUnauthorized = rejectUnauthorized;\n }\n\n if (isHttps) {\n agentOpts.ciphers = getCiphersForProfile(stealth?.fingerprint);\n\n const needCustomConnect = fragment === \"split\" || needHttp2;\n\n if (needCustomConnect) {\n const alpnProtocols: string[] | undefined = needHttp2 ? [\"h2\", \"http/1.1\"] : undefined;\n\n agentOpts.createConnection = (\n options: any,\n callback: (err: Error | null, socket?: any) => void,\n ) => {\n let alpnFallback = false;\n\n const createTlsConnection = (\n alpn: string[] | undefined,\n cb: (err: Error | null, socket?: any) => void,\n ) => {\n const socket = net.connect(options);\n\n if (fragment === \"split\") {\n const originalWrite = socket.write;\n let isFirstWrite = true;\n\n socket.write = function (\n this: net.Socket,\n chunk: Uint8Array | string,\n encodingOrCb?: BufferEncoding | ((err?: Error | null) => void),\n cb?: (err?: Error | null) => void,\n ): boolean {\n if (isFirstWrite && chunk instanceof Uint8Array && chunk.length > 5) {\n isFirstWrite = false;\n this.write = originalWrite;\n\n let encoding: BufferEncoding | undefined;\n let callbackRef: ((err?: Error | null) => void) | undefined;\n\n if (typeof encodingOrCb === \"function\") {\n callbackRef = encodingOrCb;\n } else {\n encoding = encodingOrCb;\n callbackRef = cb;\n }\n\n const part1 = chunk.subarray(0, 3);\n const part2 = chunk.subarray(3);\n\n const onError = (err: Error) => {\n callbackRef?.(err);\n };\n\n try {\n originalWrite.call(this, part1, encoding);\n } catch (err) {\n onError(err as Error);\n return false;\n }\n return originalWrite.call(this, part2, encoding, callbackRef);\n }\n\n this.write = originalWrite;\n return originalWrite.call(this, chunk, encodingOrCb as any, cb as any);\n } as any;\n }\n\n const tlsOpts: any = {\n ...options,\n socket,\n ciphers: agentOpts.ciphers,\n };\n if (alpn) tlsOpts.ALPNProtocols = alpn;\n\n const tlsSocket = tls.connect(tlsOpts);\n\n tlsSocket.once(\"secureConnect\", () => {\n if (alpn && tlsSocket.alpnProtocol === \"h2\" && !alpnFallback) {\n alpnFallback = true;\n tlsSocket.destroy();\n createTlsConnection([\"http/1.1\"], cb);\n return;\n }\n cb(null, tlsSocket);\n });\n tlsSocket.once(\"error\", (err) => cb(err));\n };\n\n return createTlsConnection(alpnProtocols, callback);\n };\n }\n\n agent = new https.Agent(agentOpts);\n } else {\n agent = new http.Agent(agentOpts);\n }\n\n cache.set(cacheKey, agent);\n return agent;\n}\n\nfunction isAbsoluteHttpUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n\nfunction resolveUrl(baseUrl: string, url: string): string {\n if (!url) throw new Error(\"URL is empty\");\n if (isAbsoluteHttpUrl(url)) return url;\n return url.charCodeAt(0) === 47 ? baseUrl + url : baseUrl + \"/\" + url;\n}\n\nfunction isLocalhostUrl(url: string): boolean {\n const schemeIdx = url.indexOf(\"://\");\n if (schemeIdx === -1) return false;\n\n const hostStart = schemeIdx + 3;\n let hostEnd = url.indexOf(\"/\", hostStart);\n if (hostEnd === -1) hostEnd = url.length;\n\n const host = url.slice(hostStart, hostEnd);\n return host === \"localhost\" || host.startsWith(\"localhost:\");\n}\n\nfunction normalizeHeaders(headers: TransportRequest[\"headers\"]): Record<string, string> {\n const out: Record<string, string> = Object.create(null);\n if (!headers) return out;\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n }\n\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i++) {\n const pair = headers[i] as unknown as [string, string] | undefined;\n if (!pair || typeof pair[0] !== \"string\") continue;\n out[pair[0].toLowerCase()] = String(pair[1]);\n }\n return out;\n }\n\n const src = headers as Record<string, unknown>;\n for (const key in src) {\n const value = src[key];\n if (value == null) continue;\n\n const lKey = key.toLowerCase();\n if (Array.isArray(value)) {\n out[lKey] = lKey === \"cookie\" ? value.join(\"; \") : value.join(\", \");\n continue;\n }\n\n out[lKey] = String(value);\n }\n\n return out;\n}\n\nfunction createSizeLimitTransform(maxBytes: number): Transform {\n let total = 0;\n return new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n total += chunk.length;\n if (total > maxBytes) {\n callback(new Error(`[Hyperttp] Response size exceeded limit of ${maxBytes} bytes`));\n return;\n }\n callback(null, chunk);\n },\n });\n}\n\n/**\n * @ru \u0420\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F Node.js \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 http/https \u043C\u043E\u0434\u0443\u043B\u0435\u0439.\n * \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 stealth-\u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0443, \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044E TLS Client Hello \u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0443\u044E \u0434\u0435\u043A\u043E\u043C\u043F\u0440\u0435\u0441\u0441\u0438\u044E.\n */\nexport class NodeTransport implements HyperTransport {\n public config: NodeTransportConfig;\n private readonly isProduction: boolean;\n private readonly cleanBaseUrl: string;\n private readonly agentCache = new Map<string, http.Agent | https.Agent>();\n\n constructor(config: NodeTransportConfig) {\n this.config = config;\n this.isProduction = process.env.NODE_ENV === \"production\";\n\n const base = config.baseUrl ?? \"http://localhost:3000\";\n this.cleanBaseUrl = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n }\n\n public async execute(req: TransportRequest): Promise<TransportResponse> {\n const fullUrl = resolveUrl(this.cleanBaseUrl, req.url);\n\n if (this.isProduction && isLocalhostUrl(fullUrl)) {\n throw new Error(\"Localhost URL detected in production environment\");\n }\n\n let headers = normalizeHeaders(req.headers);\n\n if (headers[\"accept-encoding\"] === undefined) {\n headers[\"accept-encoding\"] = \"gzip, deflate, br\";\n }\n\n const stealthOpts = req.stealth ?? this.config.stealth ?? this.config.network?.stealth;\n if (stealthOpts) {\n headers = applyStealthHeaders(headers, stealthOpts);\n }\n\n const body = req.body;\n const urlObj = new URL(fullUrl);\n const isHttps = urlObj.protocol === \"https:\";\n const agent = getNativeAgent(isHttps, stealthOpts, this.agentCache, this.config.network?.rejectUnauthorized);\n\n return new Promise((resolve, reject) => {\n const reqOpts: http.RequestOptions | https.RequestOptions = {\n method: req.method,\n headers,\n agent,\n signal: req.signal,\n };\n\n let settled = false;\n\n const clientReq = (isHttps ? https : http).request(fullUrl, reqOpts, (res) => {\n const resHeaders: Record<string, string> = Object.create(null);\n for (const key in res.headers) {\n const val = res.headers[key];\n if (val !== undefined) {\n resHeaders[key] = Array.isArray(val) ? val.join(\", \") : val;\n }\n }\n\n let responseStream: Readable = res;\n const encoding = resHeaders[\"content-encoding\"]?.toLowerCase();\n\n if (encoding === \"gzip\") {\n const gunzip = zlib.createGunzip();\n gunzip.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(gunzip);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"deflate\") {\n const inflate = zlib.createInflate();\n inflate.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(inflate);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"br\") {\n const brotli = zlib.createBrotliDecompress();\n brotli.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(brotli);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n }\n\n const maxBytes = this.config.network?.maxResponseBytes;\n if (maxBytes != null && maxBytes > 0) {\n const limiter = createSizeLimitTransform(maxBytes);\n limiter.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = responseStream.pipe(limiter);\n }\n\n responseStream.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n settled = true;\n resolve({\n status: res.statusCode ?? 200,\n headers: resHeaders,\n url: fullUrl,\n body: Readable.toWeb(responseStream) as unknown as TransportResponsePayload,\n });\n });\n\n clientReq.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\" || body instanceof Uint8Array || ArrayBuffer.isView(body)) {\n clientReq.write(body);\n clientReq.end();\n } else if (body instanceof ArrayBuffer) {\n clientReq.write(Buffer.from(body));\n clientReq.end();\n } else if (typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream) {\n Readable.fromWeb(body as any).pipe(clientReq);\n } else {\n clientReq.end();\n }\n } else {\n clientReq.end();\n }\n });\n }\n\n public async close(): Promise<void> {\n for (const agent of this.agentCache.values()) {\n agent.destroy();\n }\n this.agentCache.clear();\n }\n\n public async destroy(): Promise<void> {\n for (const agent of this.agentCache.values()) {\n agent.destroy();\n }\n this.agentCache.clear();\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["http", "https", "net", "Readable", "Transform", "tls", "zlib", "STEALTH_HEADER_PRESETS", "STEALTH_UA_PRESETS", "getCiphersForProfile", "fingerprint", "applyStealthHeaders", "headers", "stealth", "presetName", "presetHeaders", "key", "currentUA", "browserUA", "getNativeAgent", "isHttps", "cache", "rejectUnauthorized", "fragment", "needHttp2", "cacheKey", "agent", "agentOpts", "alpnProtocols", "options", "callback", "alpnFallback", "createTlsConnection", "alpn", "cb", "socket", "originalWrite", "isFirstWrite", "chunk", "encodingOrCb", "encoding", "callbackRef", "part1", "part2", "onError", "err", "tlsOpts", "tlsSocket", "isAbsoluteHttpUrl", "url", "resolveUrl", "baseUrl", "isLocalhostUrl", "schemeIdx", "hostStart", "hostEnd", "host", "normalizeHeaders", "out", "value", "i", "pair", "src", "lKey", "createSizeLimitTransform", "maxBytes", "total", "_encoding", "config", "base", "req", "fullUrl", "stealthOpts", "body", "resolve", "reject", "reqOpts", "settled", "clientReq", "res", "resHeaders", "val", "responseStream", "gunzip", "inflate", "brotli", "limiter"]
7
+ }
package/utils/errors.d.ts CHANGED
@@ -25,15 +25,4 @@ export declare class TimeoutError extends HttpClientError {
25
25
  */
26
26
  constructor(url: string, timeout: number);
27
27
  }
28
- /**
29
- * @ru Ошибка, генерируемая при получении HTTP-статуса 429 (превышение лимита частоты запросов).
30
- * @en Error triggered when encountering an HTTP 429 status code indicating rate limit exhaustion.
31
- */
32
- export declare class RateLimitError extends HttpClientError {
33
- /**
34
- * @ru Создает новый экземпляр RateLimitError.
35
- * @en Creates a new RateLimitError instance.
36
- */
37
- constructor(url: string, retryAfter?: number);
38
- }
39
28
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAO/B,IAAI,EAAE,MAAM;IACZ,UAAU,CAAC,EAAE,MAAM;IACnB,aAAa,CAAC,EAAE,KAAK;IACrB,GAAG,CAAC,EAAE,MAAM;IACZ,MAAM,CAAC,EAAE,MAAM;IAVxB;;;OAGG;gBAED,OAAO,EAAE,MAAM,EACR,IAAI,GAAE,MAAqB,EAC3B,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,aAAa,CAAC,EAAE,KAAK,YAAA,EACrB,GAAG,CAAC,EAAE,MAAM,YAAA,EACZ,MAAM,CAAC,EAAE,MAAM,YAAA;CAKzB;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C;;;OAGG;gBACS,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIzC;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,eAAe;IACjD;;;OAGG;gBACS,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAU7C"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAO/B,IAAI,EAAE,MAAM;IACZ,UAAU,CAAC,EAAE,MAAM;IACnB,aAAa,CAAC,EAAE,KAAK;IACrB,GAAG,CAAC,EAAE,MAAM;IACZ,MAAM,CAAC,EAAE,MAAM;IAVxB;;;OAGG;gBAED,OAAO,EAAE,MAAM,EACR,IAAI,GAAE,MAAqB,EAC3B,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,aAAa,CAAC,EAAE,KAAK,YAAA,EACrB,GAAG,CAAC,EAAE,MAAM,YAAA,EACZ,MAAM,CAAC,EAAE,MAAM,YAAA;CAKzB;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C;;;OAGG;gBACS,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIzC"}
package/utils/errors.js CHANGED
@@ -1,53 +1,2 @@
1
- /**
2
- * @ru Базовый класс ошибок клиента Hyperttp, агрегирующий контекст неудачного сетевого запроса.
3
- * @en Base error class for the Hyperttp client, providing explicit layout context for failed requests.
4
- */
5
- export class HttpClientError extends Error {
6
- code;
7
- statusCode;
8
- originalError;
9
- url;
10
- method;
11
- /**
12
- * @ru Создает новый экземпляр HttpClientError.
13
- * @en Creates a new HttpClientError instance.
14
- */
15
- constructor(message, code = "HTTP_ERROR", statusCode, originalError, url, method) {
16
- super(message, originalError ? { cause: originalError } : undefined);
17
- this.code = code;
18
- this.statusCode = statusCode;
19
- this.originalError = originalError;
20
- this.url = url;
21
- this.method = method;
22
- this.name = "HttpClientError";
23
- }
24
- }
25
- /**
26
- * @ru Ошибка, возникающая при превышении лимита времени ожидания ответа от сервера.
27
- * @en Error thrown when a network request exceeds its allocated execution timeout threshold.
28
- */
29
- export class TimeoutError extends HttpClientError {
30
- /**
31
- * @ru Создает новый экземпляр TimeoutError.
32
- * @en Creates a new TimeoutError instance.
33
- */
34
- constructor(url, timeout) {
35
- super(`Timeout after ${timeout}ms`, "TIMEOUT", 408, undefined, url);
36
- this.name = "TimeoutError";
37
- }
38
- }
39
- /**
40
- * @ru Ошибка, генерируемая при получении HTTP-статуса 429 (превышение лимита частоты запросов).
41
- * @en Error triggered when encountering an HTTP 429 status code indicating rate limit exhaustion.
42
- */
43
- export class RateLimitError extends HttpClientError {
44
- /**
45
- * @ru Создает новый экземпляр RateLimitError.
46
- * @en Creates a new RateLimitError instance.
47
- */
48
- constructor(url, retryAfter) {
49
- super(`Rate limited${retryAfter ? ` retry in ${retryAfter}ms` : ""}`, "RATE_LIMIT", 429, undefined, url);
50
- this.name = "RateLimitError";
51
- }
52
- }
53
- //# sourceMappingURL=errors.js.map
1
+ "use strict";export class HttpClientError extends Error{code;statusCode;originalError;url;method;constructor(t,e="HTTP_ERROR",o,r,i,u){super(t,r?{cause:r}:void 0),this.code=e,this.statusCode=o,this.originalError=r,this.url=i,this.method=u,this.name="HttpClientError"}}export class TimeoutError extends HttpClientError{constructor(t,e){super(`Timeout after ${e}ms`,"TIMEOUT",408,void 0,t),this.name="TimeoutError"}}
2
+ //# sourceMappingURL=errors.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAO/B;IACA;IACA;IACA;IACA;IAVT;;;OAGG;IACH,YACE,OAAe,EACR,OAAe,YAAY,EAC3B,UAAmB,EACnB,aAAqB,EACrB,GAAY,EACZ,MAAe;QAEtB,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAN9D,SAAI,GAAJ,IAAI,CAAuB;QAC3B,eAAU,GAAV,UAAU,CAAS;QACnB,kBAAa,GAAb,aAAa,CAAQ;QACrB,QAAG,GAAH,GAAG,CAAS;QACZ,WAAM,GAAN,MAAM,CAAS;QAGtB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,eAAe;IAC/C;;;OAGG;IACH,YAAY,GAAW,EAAE,OAAe;QACtC,KAAK,CAAC,iBAAiB,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD;;;OAGG;IACH,YAAY,GAAW,EAAE,UAAmB;QAC1C,KAAK,CACH,eAAe,UAAU,CAAC,CAAC,CAAC,aAAa,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAC9D,YAAY,EACZ,GAAG,EACH,SAAS,EACT,GAAG,CACJ,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/errors.ts"],
4
+ "sourcesContent": ["/**\n * @ru \u0411\u0430\u0437\u043E\u0432\u044B\u0439 \u043A\u043B\u0430\u0441\u0441 \u043E\u0448\u0438\u0431\u043E\u043A \u043A\u043B\u0438\u0435\u043D\u0442\u0430 Hyperttp, \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u044E\u0449\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u043D\u0435\u0443\u0434\u0430\u0447\u043D\u043E\u0433\u043E \u0441\u0435\u0442\u0435\u0432\u043E\u0433\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0430.\n * @en Base error class for the Hyperttp client, providing explicit layout context for failed requests.\n */\nexport class HttpClientError extends Error {\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0435\u0442 \u043D\u043E\u0432\u044B\u0439 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 HttpClientError.\n * @en Creates a new HttpClientError instance.\n */\n constructor(\n message: string,\n public code: string = \"HTTP_ERROR\",\n public statusCode?: number,\n public originalError?: Error,\n public url?: string,\n public method?: string,\n ) {\n super(message, originalError ? { cause: originalError } : undefined);\n this.name = \"HttpClientError\";\n }\n}\n\n/**\n * @ru \u041E\u0448\u0438\u0431\u043A\u0430, \u0432\u043E\u0437\u043D\u0438\u043A\u0430\u044E\u0449\u0430\u044F \u043F\u0440\u0438 \u043F\u0440\u0435\u0432\u044B\u0448\u0435\u043D\u0438\u0438 \u043B\u0438\u043C\u0438\u0442\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043E\u0442\u0432\u0435\u0442\u0430 \u043E\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n * @en Error thrown when a network request exceeds its allocated execution timeout threshold.\n */\nexport class TimeoutError extends HttpClientError {\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0435\u0442 \u043D\u043E\u0432\u044B\u0439 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 TimeoutError.\n * @en Creates a new TimeoutError instance.\n */\n constructor(url: string, timeout: number) {\n super(`Timeout after ${timeout}ms`, \"TIMEOUT\", 408, undefined, url);\n this.name = \"TimeoutError\";\n }\n}\n\n\n"],
5
+ "mappings": "aAIM,aAAO,wBAAwB,KAAK,CAO/B,KACA,WACA,cACA,IACA,OANT,YACEA,EACOC,EAAe,aACfC,EACAC,EACAC,EACAC,EAAe,CAEtB,MAAML,EAASG,EAAgB,CAAE,MAAOA,CAAa,EAAK,MAAS,EAN5D,KAAA,KAAAF,EACA,KAAA,WAAAC,EACA,KAAA,cAAAC,EACA,KAAA,IAAAC,EACA,KAAA,OAAAC,EAGP,KAAK,KAAO,iBACd,EAOI,aAAO,qBAAqB,eAAe,CAK/C,YAAYD,EAAaE,EAAe,CACtC,MAAM,iBAAiBA,CAAO,KAAM,UAAW,IAAK,OAAWF,CAAG,EAClE,KAAK,KAAO,cACd",
6
+ "names": ["message", "code", "statusCode", "originalError", "url", "method", "timeout"]
7
+ }
package/utils/merge.js CHANGED
@@ -1,29 +1,2 @@
1
- /**
2
- * @ru Рекурсивно объединяет два объекта. Избегает лишних аллокаций памяти и защищает от разделения ссылок nested-структур.
3
- * @en Recursively merges two objects. Avoids redundant memory allocations and prevents shared reference leakage for nested structures.
4
- */
5
- export function deepMerge(target, source) {
6
- const output = { ...target };
7
- for (const key of Object.keys(source)) {
8
- const sourceValue = source[key];
9
- const targetValue = output[key];
10
- if (isObject(sourceValue) && isObject(targetValue)) {
11
- output[key] = deepMerge(targetValue, sourceValue);
12
- continue;
13
- }
14
- if (sourceValue !== undefined) {
15
- output[key] = isObject(sourceValue)
16
- ? deepMerge({}, sourceValue)
17
- : sourceValue;
18
- }
19
- }
20
- return output;
21
- }
22
- /**
23
- * @ru Быстрая проверка, является ли переданный элемент чистым объектом (исключая массивы и null).
24
- * @en Fast check verifying if the provided item is a plain object layout (excluding arrays and null).
25
- */
26
- function isObject(item) {
27
- return Object.prototype.toString.call(item) === "[object Object]";
28
- }
29
- //# sourceMappingURL=merge.js.map
1
+ "use strict";export function deepMerge(o,r){const e={...o};for(const n of Object.keys(r)){const t=r[n],u=e[n];if(c(t)&&c(u)){e[n]=deepMerge(u,t);continue}t!==void 0&&(e[n]=c(t)?deepMerge({},t):t)}return e}function c(o){return Object.prototype.toString.call(o)==="[object Object]"}
2
+ //# sourceMappingURL=merge.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/utils/merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,MAAS,EACT,MAAS;IAET,MAAM,MAAM,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,WAAsC,EACtC,WAAsC,CACvC,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC;gBACjC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,WAAsC,CAAC;gBACvD,CAAC,CAAC,WAAW,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,MAAe,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,IAAa;IAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,iBAAiB,CAAC;AACpE,CAAC"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/merge.ts"],
4
+ "sourcesContent": ["/**\n * @ru \u0420\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u044F\u0435\u0442 \u0434\u0432\u0430 \u043E\u0431\u044A\u0435\u043A\u0442\u0430. \u0418\u0437\u0431\u0435\u0433\u0430\u0435\u0442 \u043B\u0438\u0448\u043D\u0438\u0445 \u0430\u043B\u043B\u043E\u043A\u0430\u0446\u0438\u0439 \u043F\u0430\u043C\u044F\u0442\u0438 \u0438 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043E\u0442 \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0441\u044B\u043B\u043E\u043A nested-\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440.\n * @en Recursively merges two objects. Avoids redundant memory allocations and prevents shared reference leakage for nested structures.\n */\nexport function deepMerge<T extends Record<string, unknown>, S extends Record<string, unknown>>(\n target: T,\n source: S,\n): T & S {\n const output: Record<string, unknown> = { ...target };\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = output[key];\n if (isObject(sourceValue) && isObject(targetValue)) {\n output[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n );\n continue;\n }\n\n if (sourceValue !== undefined) {\n output[key] = isObject(sourceValue)\n ? deepMerge({}, sourceValue as Record<string, unknown>)\n : sourceValue;\n }\n }\n return output as T & S;\n}\n\n/**\n * @ru \u0411\u044B\u0441\u0442\u0440\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430, \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0447\u0438\u0441\u0442\u044B\u043C \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u043C (\u0438\u0441\u043A\u043B\u044E\u0447\u0430\u044F \u043C\u0430\u0441\u0441\u0438\u0432\u044B \u0438 null).\n * @en Fast check verifying if the provided item is a plain object layout (excluding arrays and null).\n */\nfunction isObject(item: unknown): boolean {\n return Object.prototype.toString.call(item) === \"[object Object]\";\n}\n"],
5
+ "mappings": "aAIM,gBAAU,UACdA,EACAC,EAAS,CAET,MAAMC,EAAkC,CAAE,GAAGF,CAAM,EACnD,UAAWG,KAAO,OAAO,KAAKF,CAAM,EAAG,CACrC,MAAMG,EAAcH,EAAOE,CAAG,EACxBE,EAAcH,EAAOC,CAAG,EAC9B,GAAIG,EAASF,CAAW,GAAKE,EAASD,CAAW,EAAG,CAClDH,EAAOC,CAAG,EAAI,UACZE,EACAD,CAAsC,EAExC,QACF,CAEIA,IAAgB,SAClBF,EAAOC,CAAG,EAAIG,EAASF,CAAW,EAC9B,UAAU,CAAA,EAAIA,CAAsC,EACpDA,EAER,CACA,OAAOF,CACT,CAMA,SAASI,EAASC,EAAa,CAC7B,OAAO,OAAO,UAAU,SAAS,KAAKA,CAAI,IAAM,iBAClD",
6
+ "names": ["target", "source", "output", "key", "sourceValue", "targetValue", "isObject", "item"]
7
+ }