@hyperttp/transport-bun 0.4.0 → 0.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bun.js CHANGED
@@ -1,592 +1,2 @@
1
- import { fastGetHostname, getAbortError, EMPTY_HEADERS, normalizeHeaders, resolveUrl, TIMEOUT_ERROR, } from "./utils/helpers.js";
2
- import { CacheManager } from "hcacher";
3
- /**
4
- * @ru Статические пресеты браузерных заголовков для маскировки под реальных пользователей.
5
- * Используются stealth-режимом для обхода fingerprint-защит.
6
- * @en Static presets of browser headers for masking as real users.
7
- * Used by stealth mode to bypass fingerprint protections.
8
- */
9
- const STEALTH_HEADER_PRESETS = {
10
- chrome: {
11
- "sec-ch-ua": '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
12
- "sec-ch-ua-mobile": "?0",
13
- "sec-ch-ua-platform": '"Linux"',
14
- "sec-fetch-dest": "document",
15
- "sec-fetch-mode": "navigate",
16
- "sec-fetch-site": "none",
17
- "sec-fetch-user": "?1",
18
- "upgrade-insecure-requests": "1",
19
- "accept-language": "en-US,en;q=0.9",
20
- },
21
- firefox: {
22
- "sec-fetch-dest": "document",
23
- "sec-fetch-mode": "navigate",
24
- "sec-fetch-site": "none",
25
- "accept-language": "en-US,en;q=0.5",
26
- "upgrade-insecure-requests": "1",
27
- },
28
- };
29
- /**
30
- * @ru Пресеты User-Agent, соответствующие TLS-отпечаткам (JA3/JA4).
31
- * @en User-Agent presets matching the TLS fingerprints (JA3/JA4).
32
- */
33
- const STEALTH_UA_PRESETS = {
34
- chrome: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
35
- firefox: "Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0",
36
- 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",
37
- 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",
38
- };
39
- /**
40
- * @ru Возвращает строку шифров TLS для указанного профиля браузера.
41
- * @en Returns the TLS cipher suite string for the specified browser profile.
42
- * @param fingerprint - Browser fingerprint profile.
43
- * @returns Colon-separated cipher suite string, or empty string if not found.
44
- */
45
- function getCiphersForProfile(fingerprint) {
46
- if (!fingerprint)
47
- return "";
48
- switch (fingerprint) {
49
- case "chrome":
50
- case "edge":
51
- return [
52
- "TLS_AES_128_GCM_SHA256",
53
- "TLS_AES_256_GCM_SHA384",
54
- "TLS_CHACHA20_POLY1305_SHA256",
55
- "ECDHE-ECDSA-AES128-GCM-SHA256",
56
- "ECDHE-RSA-AES128-GCM-SHA256",
57
- ].join(":");
58
- case "firefox":
59
- return [
60
- "TLS_AES_128_GCM_SHA256",
61
- "TLS_CHACHA20_POLY1305_SHA256",
62
- "TLS_AES_256_GCM_SHA384",
63
- "ECDHE-ECDSA-AES128-GCM-SHA256",
64
- "ECDHE-RSA-AES128-GCM-SHA256",
65
- ].join(":");
66
- case "safari":
67
- return [
68
- "TLS_AES_256_GCM_SHA384",
69
- "TLS_CHACHA20_POLY1305_SHA256",
70
- "TLS_AES_128_GCM_SHA256",
71
- "ECDHE-ECDSA-AES256-GCM-SHA384",
72
- "ECDHE-RSA-AES256-GCM-SHA384",
73
- ].join(":");
74
- default:
75
- return "";
76
- }
77
- }
78
- /**
79
- * @ru Безопасно применяет стелс-пресеты, отдавая абсолютный приоритет ручным заголовкам.
80
- * @en Safely applies stealth presets, giving absolute priority to manual headers.
81
- * @param headers - The headers object to modify.
82
- * @param stealth - Stealth configuration options.
83
- * @returns The modified headers object.
84
- */
85
- function applyStealthHeaders(headers, stealth) {
86
- if (!stealth || !stealth.fingerprint)
87
- return headers;
88
- const presetName = stealth.fingerprint;
89
- const presetHeaders = STEALTH_HEADER_PRESETS[presetName];
90
- if (presetHeaders) {
91
- for (const key in presetHeaders) {
92
- if (headers[key] === undefined) {
93
- headers[key] = presetHeaders[key];
94
- }
95
- }
96
- }
97
- const currentUA = headers["user-agent"];
98
- if (currentUA === undefined || currentUA === "hyperttp/2.0" || currentUA === "Hyperttp/2.0") {
99
- const browserUA = STEALTH_UA_PRESETS[presetName];
100
- if (browserUA) {
101
- headers["user-agent"] = browserUA;
102
- }
103
- }
104
- return headers;
105
- }
106
- /**
107
- * @ru Высокопроизводительный HTTP-транспорт для Bun с нативными оптимизациями и поддержкой Stealth-мимикрии.
108
- * Включает управление параллелизмом, cookie jar и кэширование доменов.
109
- * @en High-performance HTTP transport for Bun with native optimizations and Stealth mimicry support.
110
- * Includes concurrency management, cookie jar, and domain caching.
111
- */
112
- export class BunTransport {
113
- protocols = ["rest"];
114
- supports(protocol) {
115
- return protocol === "rest";
116
- }
117
- /**
118
- * @ru Конфигурация транспорта.
119
- * @en Transport configuration.
120
- */
121
- config;
122
- servers = new Set();
123
- /**
124
- * @ru Кэш cookies по доменам с TTL и LRU-эвикцией (domain -> name -> value).
125
- * @en Cookie cache by domain with TTL and LRU eviction (domain -> name -> value).
126
- */
127
- cookieStore;
128
- /**
129
- * @ru Кэш сгенерированных строк cookies с TTL.
130
- * @en Cache of generated cookie strings with TTL.
131
- */
132
- cookieStringCache;
133
- /**
134
- * @ru Наличие cookies в jar. Пока сервер не установил cookie, полностью пропускаем cookie hot path.
135
- * @en Whether the jar contains cookies. Skip the cookie hot path until a server sets one.
136
- */
137
- hasCookies = false;
138
- /**
139
- * @ru Включено ли cookie-хранилище. При отключении исключаем cookie work из hot path.
140
- * @en Whether the cookie store is enabled. When disabled, skip cookie work in the hot path.
141
- */
142
- cookiesEnabled;
143
- /**
144
- * @ru Опциональный кэш HTTP-ответов для GET/HEAD запросов.
145
- * @en Optional HTTP response cache for GET/HEAD requests.
146
- */
147
- responseCache;
148
- /**
149
- * @ru Счётчик активных (выполняющихся) запросов.
150
- * @en Counter of active (in-flight) requests.
151
- */
152
- activeRequests = 0;
153
- /**
154
- * @ru Очередь запросов, ожидающих свободного слота при достижении лимита параллелизма.
155
- * @en Queue of requests waiting for a free slot when concurrency limit is reached.
156
- */
157
- concurrencyQueue = Object.create(null);
158
- /**
159
- * @ru Индекс начала очереди (для FIFO обработки).
160
- * @en Queue head index (for FIFO processing).
161
- */
162
- queueHead = 0;
163
- /**
164
- * @ru Индекс конца очереди (для добавления новых элементов).
165
- * @en Queue tail index (for adding new elements).
166
- */
167
- queueTail = 0;
168
- /**
169
- * @ru Максимальное количество одновременных запросов (0 = без лимита).
170
- * @en Maximum number of concurrent requests (0 = unlimited).
171
- */
172
- _maxConcurrent = 0;
173
- /**
174
- * @ru Таймаут запроса в миллисекундах (0 = без таймаута).
175
- * @en Request timeout in milliseconds (0 = no timeout).
176
- */
177
- _timeout = 0;
178
- /**
179
- * @ru Флаг использования keep-alive соединений.
180
- * @en Flag for using keep-alive connections.
181
- */
182
- _keepalive = false;
183
- /**
184
- * @ru Конфигурация TLS (отклонение невалидных сертификатов и шифры).
185
- * @en TLS configuration (reject unauthorized certificates and ciphers).
186
- */
187
- _tlsConfig = null;
188
- /**
189
- * @ru Создаёт экземпляр BunTransport.
190
- * @en Creates a BunTransport instance.
191
- * @param config - Transport configuration.
192
- */
193
- constructor(config) {
194
- this.config = config;
195
- const cookieCfg = config?.network?.cookieCache;
196
- this.cookiesEnabled = cookieCfg?.enabled ?? true;
197
- this.cookieStore = new CacheManager({
198
- enabled: this.cookiesEnabled,
199
- maxSize: cookieCfg?.maxSize ?? 256,
200
- ttl: cookieCfg?.ttl ?? 300_000,
201
- touchOnGet: true,
202
- });
203
- this.cookieStringCache = new CacheManager({
204
- enabled: this.cookiesEnabled,
205
- maxSize: cookieCfg?.maxSize ?? 1024,
206
- ttl: cookieCfg?.ttl ?? 60_000,
207
- touchOnGet: true,
208
- });
209
- const cacheCfg = config?.network?.cache;
210
- if (cacheCfg?.enabled !== false && (cacheCfg?.maxSize || cacheCfg?.ttl)) {
211
- this.responseCache = new CacheManager({
212
- enabled: cacheCfg?.enabled ?? true,
213
- maxSize: cacheCfg?.maxSize ?? 256,
214
- ttl: cacheCfg?.ttl ?? 30_000,
215
- touchOnGet: true,
216
- });
217
- }
218
- this.invalidateConfig();
219
- }
220
- /**
221
- * @ru Принимает HTTP-запросы через Bun.serve без разбора тела.
222
- * @en Accepts HTTP requests through Bun.serve without parsing the body.
223
- */
224
- async listen(options) {
225
- const { signal, onRequest } = options;
226
- if (signal?.aborted)
227
- throw getAbortError(signal);
228
- const server = Bun.serve({
229
- hostname: options.host,
230
- port: options.port,
231
- fetch: async (request) => {
232
- if (!onRequest)
233
- return new Response(null, { status: 503 });
234
- const response = await onRequest({
235
- method: request.method,
236
- url: request.url,
237
- headers: Object.fromEntries(request.headers),
238
- body: request.body,
239
- signal: request.signal,
240
- protocol: "rest",
241
- });
242
- const headers = new Headers();
243
- for (const [name, value] of Object.entries(response.headers)) {
244
- if (Array.isArray(value)) {
245
- for (const item of value)
246
- headers.append(name, item);
247
- }
248
- else {
249
- headers.set(name, value);
250
- }
251
- }
252
- return new Response(response.body, {
253
- status: response.status,
254
- statusText: response.statusText,
255
- headers,
256
- });
257
- },
258
- });
259
- const stop = async (force = false) => {
260
- try {
261
- await server.stop(force);
262
- }
263
- finally {
264
- signal?.removeEventListener("abort", onAbort);
265
- this.servers.delete(stop);
266
- }
267
- };
268
- const onAbort = () => {
269
- void stop(true).catch(() => { });
270
- };
271
- this.servers.add(stop);
272
- signal?.addEventListener("abort", onAbort, { once: true });
273
- if (signal?.aborted) {
274
- await stop(true);
275
- throw getAbortError(signal);
276
- }
277
- return { close: () => stop() };
278
- }
279
- /**
280
- * @ru Обновляет внутреннее состояние на основе конфигурации.
281
- * Вызывается при создании и может быть вызвано при изменении конфига.
282
- * @en Updates internal state based on configuration.
283
- * Called on creation and can be called when config changes.
284
- */
285
- invalidateConfig() {
286
- const net = this.config?.network;
287
- this._maxConcurrent = net?.maxConcurrent ?? 0;
288
- this._timeout = net?.timeout ?? 0;
289
- this._keepalive = !!net?.keepAliveTimeout;
290
- this._tlsConfig = (net?.rejectUnauthorized ?? true) ? null : { rejectUnauthorized: false };
291
- }
292
- /**
293
- * @ru Выполняет HTTP-запрос через нативный fetch Bun с управлением параллелизмом и таймаутами.
294
- * @en Executes an HTTP request via Bun's native fetch with concurrency management and timeouts.
295
- * @param req - The normalized transport request.
296
- * @returns Promise resolving to the transport response.
297
- * @throws Error if the request is aborted or times out.
298
- */
299
- async execute(req) {
300
- const maxConcurrent = this._maxConcurrent;
301
- const timeoutMs = this._timeout;
302
- let signal = req.signal;
303
- let timer = null;
304
- let abortHandler = null;
305
- let originalSignal = null;
306
- if (timeoutMs > 0) {
307
- if (!signal) {
308
- signal = AbortSignal.timeout(timeoutMs);
309
- }
310
- else if (signal.aborted) {
311
- throw getAbortError(signal);
312
- }
313
- else {
314
- const controller = new AbortController();
315
- originalSignal = signal;
316
- abortHandler = () => controller.abort(originalSignal.reason);
317
- originalSignal.addEventListener("abort", abortHandler);
318
- timer = setTimeout(() => controller.abort(TIMEOUT_ERROR), timeoutMs);
319
- signal = controller.signal;
320
- }
321
- }
322
- if (signal?.aborted) {
323
- if (timer !== null)
324
- clearTimeout(timer);
325
- if (originalSignal && abortHandler)
326
- originalSignal.removeEventListener("abort", abortHandler);
327
- throw getAbortError(signal);
328
- }
329
- if (maxConcurrent > 0 && this.activeRequests >= maxConcurrent) {
330
- try {
331
- await this.waitForSlot(signal);
332
- }
333
- catch (err) {
334
- if (timer !== null)
335
- clearTimeout(timer);
336
- if (originalSignal && abortHandler)
337
- originalSignal.removeEventListener("abort", abortHandler);
338
- throw err;
339
- }
340
- if (signal?.aborted) {
341
- if (timer !== null)
342
- clearTimeout(timer);
343
- if (originalSignal && abortHandler)
344
- originalSignal.removeEventListener("abort", abortHandler);
345
- throw getAbortError(signal);
346
- }
347
- }
348
- this.activeRequests++;
349
- try {
350
- const fullUrl = resolveUrl(this.config?.baseUrl ?? "", req.url);
351
- if (this.responseCache &&
352
- !req.stream &&
353
- (req.method === "GET" || req.method === "HEAD") &&
354
- !req.body) {
355
- const cacheKey = `${req.method}:${fullUrl}`;
356
- const cached = this.responseCache.get(cacheKey);
357
- if (cached !== undefined) {
358
- return cached;
359
- }
360
- }
361
- let headers = normalizeHeaders(req.headers);
362
- if (this.hasCookies) {
363
- const activeCookies = this.getCookiesForDomain(fastGetHostname(fullUrl));
364
- if (activeCookies.length > 0) {
365
- if (headers === EMPTY_HEADERS)
366
- headers = Object.create(null);
367
- headers["cookie"] = headers["cookie"]
368
- ? headers["cookie"] + "; " + activeCookies
369
- : activeCookies;
370
- }
371
- }
372
- const stealth = req.stealth || this.config.stealth ? { ...this.config.stealth, ...req.stealth } : undefined;
373
- if (stealth) {
374
- if (headers === EMPTY_HEADERS)
375
- headers = Object.create(null);
376
- headers = applyStealthHeaders(headers, stealth);
377
- }
378
- const init = {
379
- method: req.method,
380
- redirect: req.redirect ?? "manual",
381
- };
382
- if (headers !== EMPTY_HEADERS)
383
- init.headers = headers;
384
- if (req.body !== undefined)
385
- init.body = req.body;
386
- if (signal !== undefined)
387
- init.signal = signal;
388
- if (this._keepalive)
389
- init.keepalive = true;
390
- let requestTlsConfig = this._tlsConfig;
391
- if (stealth?.ciphers || stealth?.fingerprint) {
392
- const ciphers = stealth.ciphers ?? getCiphersForProfile(stealth.fingerprint);
393
- if (ciphers) {
394
- requestTlsConfig = requestTlsConfig
395
- ? { ...requestTlsConfig, ciphers }
396
- : { rejectUnauthorized: true, ciphers };
397
- }
398
- }
399
- if (requestTlsConfig !== null)
400
- init.tls = requestTlsConfig;
401
- const nativeRes = await fetch(fullUrl, init);
402
- this.storeCookies(fullUrl, nativeRes.headers);
403
- const bodyStream = nativeRes.body;
404
- const responseHeaders = Object.create(null);
405
- nativeRes.headers.forEach((value, key) => {
406
- responseHeaders[key] = value;
407
- });
408
- const response = {
409
- status: nativeRes.status,
410
- url: nativeRes.url,
411
- body: bodyStream,
412
- headers: responseHeaders,
413
- };
414
- if (this.responseCache &&
415
- !req.stream &&
416
- (req.method === "GET" || req.method === "HEAD") &&
417
- !req.body &&
418
- bodyStream === null) {
419
- const cacheKey = `${req.method}:${fullUrl}`;
420
- this.responseCache.set(cacheKey, response);
421
- }
422
- return response;
423
- }
424
- finally {
425
- if (timer !== null) {
426
- clearTimeout(timer);
427
- }
428
- if (originalSignal && abortHandler) {
429
- originalSignal.removeEventListener("abort", abortHandler);
430
- }
431
- this.activeRequests--;
432
- if (maxConcurrent > 0)
433
- this.releaseSlot();
434
- }
435
- }
436
- /**
437
- * @ru Получает строку cookies для указанного домена с учётом родительских доменов.
438
- * @en Gets the cookie string for the specified domain, considering parent domains.
439
- * @param requestDomain - The domain to get cookies for.
440
- * @returns Semicolon-separated cookie string.
441
- */
442
- getCookiesForDomain(requestDomain) {
443
- const cached = this.cookieStringCache.get(requestDomain);
444
- if (cached !== undefined)
445
- return cached;
446
- let result = "";
447
- const domains = this.cookieStore.size > 0 ? this.getAllCookieDomains() : [];
448
- for (let i = 0; i < domains.length; i++) {
449
- const storedDomain = domains[i];
450
- if (requestDomain !== storedDomain && !requestDomain.endsWith("." + storedDomain))
451
- continue;
452
- const cookiesMap = this.cookieStore.get(storedDomain);
453
- if (!cookiesMap)
454
- continue;
455
- for (const key in cookiesMap) {
456
- if (result.length > 0)
457
- result += "; ";
458
- result += key + "=" + cookiesMap[key];
459
- }
460
- }
461
- this.cookieStringCache.set(requestDomain, result);
462
- return result;
463
- }
464
- /**
465
- * @ru Возвращает все домены из cookie store.
466
- * @en Returns all domains from the cookie store.
467
- */
468
- getAllCookieDomains() {
469
- const domains = [];
470
- const store = this.cookieStore.storage;
471
- for (const key of store.keys()) {
472
- domains.push(key);
473
- }
474
- return domains;
475
- }
476
- /**
477
- * @ru Сохраняет cookies из заголовков Set-Cookie ответа в cookie jar.
478
- * @en Stores cookies from response Set-Cookie headers into the cookie jar.
479
- * @param requestUrl - The request URL for determining the default domain.
480
- * @param headers - Response headers containing Set-Cookie values.
481
- */
482
- storeCookies(requestUrl, headers) {
483
- if (!this.cookiesEnabled || typeof headers.getSetCookie !== "function")
484
- return;
485
- const setCookies = headers.getSetCookie();
486
- if (setCookies.length === 0)
487
- return;
488
- const defaultDomain = fastGetHostname(requestUrl);
489
- for (let i = 0; i < setCookies.length; i++) {
490
- const rawCookie = setCookies[i];
491
- if (!rawCookie)
492
- continue;
493
- const firstSemicolon = rawCookie.indexOf(";");
494
- const mainPair = firstSemicolon === -1 ? rawCookie : rawCookie.slice(0, firstSemicolon);
495
- const eqIdx = mainPair.indexOf("=");
496
- if (eqIdx === -1)
497
- continue;
498
- const name = mainPair.slice(0, eqIdx).trim();
499
- const value = mainPair.slice(eqIdx + 1).trim();
500
- if (!name)
501
- continue;
502
- let domain = defaultDomain;
503
- if (firstSemicolon !== -1) {
504
- const parts = rawCookie.split(";");
505
- for (let j = 1; j < parts.length; j++) {
506
- const part = parts[j].trim();
507
- if (part.length > 7 && part.toLowerCase().startsWith("domain=")) {
508
- const rawDomain = part.slice(7).trim();
509
- if (rawDomain) {
510
- domain = rawDomain.charCodeAt(0) === 46 ? rawDomain.slice(1) : rawDomain;
511
- }
512
- break;
513
- }
514
- }
515
- }
516
- const existing = this.cookieStore.get(domain) ?? Object.create(null);
517
- existing[name] = value;
518
- this.cookieStore.set(domain, existing);
519
- this.hasCookies = true;
520
- this.cookieStringCache.delete(domain);
521
- }
522
- }
523
- /**
524
- * @ru Ожидает освобождения слота в очереди параллелизма.
525
- * @en Waits for a slot to become available in the concurrency queue.
526
- * @param signal - Optional abort signal to cancel waiting.
527
- * @returns Promise that resolves when a slot is available.
528
- * @throws Error if the signal is aborted while waiting.
529
- */
530
- async waitForSlot(signal) {
531
- return new Promise((resolve, reject) => {
532
- const currentTail = this.queueTail++;
533
- const onAbort = () => {
534
- signal?.removeEventListener("abort", onAbort);
535
- delete this.concurrencyQueue[currentTail];
536
- reject(getAbortError(signal));
537
- };
538
- if (signal)
539
- signal.addEventListener("abort", onAbort, { once: true });
540
- this.concurrencyQueue[currentTail] = () => {
541
- signal?.removeEventListener("abort", onAbort);
542
- resolve();
543
- };
544
- });
545
- }
546
- /**
547
- * @ru Освобождает слот и разблокирует следующий запрос в очереди.
548
- * @en Releases a slot and unblocks the next request in the queue.
549
- */
550
- releaseSlot() {
551
- while (this.queueHead < this.queueTail) {
552
- const next = this.concurrencyQueue[this.queueHead];
553
- if (next !== undefined) {
554
- delete this.concurrencyQueue[this.queueHead];
555
- this.queueHead++;
556
- next();
557
- return;
558
- }
559
- this.queueHead++;
560
- }
561
- if (this.queueHead === this.queueTail) {
562
- this.queueHead = 0;
563
- this.queueTail = 0;
564
- }
565
- }
566
- /**
567
- * @ru Мягко закрывает транспорт, очищая очереди и cookie jar.
568
- * @en Gracefully closes the transport, clearing queues and cookie jar.
569
- * @returns Promise that resolves when cleanup is complete.
570
- */
571
- async close() {
572
- await Promise.all(Array.from(this.servers, (stop) => stop()));
573
- this.concurrencyQueue = Object.create(null);
574
- this.queueHead = 0;
575
- this.queueTail = 0;
576
- this.cookieStore.clear();
577
- this.cookieStringCache.clear();
578
- this.hasCookies = false;
579
- this.responseCache?.clear();
580
- this.activeRequests = 0;
581
- }
582
- /**
583
- * @ru Принудительно останавливает серверы и освобождает ресурсы транспорта.
584
- * @en Forcefully stops servers and releases transport resources.
585
- * @returns Promise that resolves when cleanup is complete.
586
- */
587
- async destroy() {
588
- await Promise.all(Array.from(this.servers, (stop) => stop(true)));
589
- await this.close();
590
- }
591
- }
592
- //# sourceMappingURL=bun.js.map
1
+ "use strict";import{fastGetHostname as k,getAbortError as A,EMPTY_HEADERS as p,normalizeHeaders as _,resolveUrl as H,TIMEOUT_ERROR as v}from"./utils/helpers.js";import{CacheManager as b}from"hcacher";const y={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"}},T={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 w(d){if(!d)return"";switch(d){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 L(d,e){if(!e||!e.fingerprint)return d;const i=e.fingerprint,o=y[i];if(o)for(const t in o)d[t]===void 0&&(d[t]=o[t]);const s=d["user-agent"];if(s===void 0||s==="hyperttp/2.0"||s==="Hyperttp/2.0"){const t=T[i];t&&(d["user-agent"]=t)}return d}export class BunTransport{protocols=["rest"];supports(e){return e==="rest"}config;servers=new Set;cookieStore;cookieStringCache;hasCookies=!1;cookiesEnabled;responseCache;activeRequests=0;concurrencyQueue=Object.create(null);queueHead=0;queueTail=0;_maxConcurrent=0;_timeout=0;_keepalive=!1;_tlsConfig=null;constructor(e){this.config=e;const i=e?.network?.cookieCache;this.cookiesEnabled=i?.enabled??!0,this.cookieStore=new b({enabled:this.cookiesEnabled,maxSize:i?.maxSize??256,ttl:i?.ttl??3e5,touchOnGet:!0}),this.cookieStringCache=new b({enabled:this.cookiesEnabled,maxSize:i?.maxSize??1024,ttl:i?.ttl??6e4,touchOnGet:!0});const o=e?.network?.cache;o?.enabled!==!1&&(o?.maxSize||o?.ttl)&&(this.responseCache=new b({enabled:o?.enabled??!0,maxSize:o?.maxSize??256,ttl:o?.ttl??3e4,touchOnGet:!0})),this.invalidateConfig()}async listen(e){const{signal:i,onRequest:o}=e;if(i?.aborted)throw A(i);const s=Bun.serve({hostname:e.host,port:e.port,fetch:async n=>{if(!o)return new Response(null,{status:503});const a=await o({method:n.method,url:n.url,headers:Object.fromEntries(n.headers),body:n.body,signal:n.signal,protocol:"rest"}),c=new Headers;for(const[u,h]of Object.entries(a.headers))if(Array.isArray(h))for(const f of h)c.append(u,f);else c.set(u,h);return new Response(a.body,{status:a.status,statusText:a.statusText,headers:c})}}),t=async(n=!1)=>{try{await s.stop(n)}finally{i?.removeEventListener("abort",r),this.servers.delete(t)}},r=()=>{t(!0).catch(()=>{})};if(this.servers.add(t),i?.addEventListener("abort",r,{once:!0}),i?.aborted)throw await t(!0),A(i);return{close:()=>t()}}invalidateConfig(){const e=this.config?.network;this._maxConcurrent=e?.maxConcurrent??0,this._timeout=e?.timeout??0,this._keepalive=!!e?.keepAliveTimeout,this._tlsConfig=e?.rejectUnauthorized??!0?null:{rejectUnauthorized:!1}}async execute(e){const i=this._maxConcurrent,o=this._timeout;let s=e.signal,t=null,r=null,n=null;if(o>0)if(!s)s=AbortSignal.timeout(o);else{if(s.aborted)throw A(s);{const a=new AbortController;n=s,r=()=>a.abort(n.reason),n.addEventListener("abort",r),t=setTimeout(()=>a.abort(v),o),s=a.signal}}if(s?.aborted)throw t!==null&&clearTimeout(t),n&&r&&n.removeEventListener("abort",r),A(s);if(i>0&&this.activeRequests>=i){try{await this.waitForSlot(s)}catch(a){throw t!==null&&clearTimeout(t),n&&r&&n.removeEventListener("abort",r),a}if(s?.aborted)throw t!==null&&clearTimeout(t),n&&r&&n.removeEventListener("abort",r),A(s)}this.activeRequests++;try{const a=H(this.config?.baseUrl??"",e.url);if(this.responseCache&&!e.stream&&(e.method==="GET"||e.method==="HEAD")&&!e.body){const l=`${e.method}:${a}`,E=this.responseCache.get(l);if(E!==void 0)return E}let c=_(e.headers);if(this.hasCookies){const l=this.getCookiesForDomain(k(a));l.length>0&&(c===p&&(c=Object.create(null)),c.cookie=c.cookie?c.cookie+"; "+l:l)}const u=e.stealth||this.config.stealth?{...this.config.stealth,...e.stealth}:void 0;u&&(c===p&&(c=Object.create(null)),c=L(c,u));const h={method:e.method,redirect:e.redirect??"manual"};c!==p&&(h.headers=c),e.body!==void 0&&(h.body=e.body),s!==void 0&&(h.signal=s),this._keepalive&&(h.keepalive=!0);let f=this._tlsConfig;if(u?.ciphers||u?.fingerprint){const l=u.ciphers??w(u.fingerprint);l&&(f=f?{...f,ciphers:l}:{rejectUnauthorized:!0,ciphers:l})}f!==null&&(h.tls=f);const m=await fetch(a,h);this.storeCookies(a,m.headers);const g=m.body,S=Object.create(null);m.headers.forEach((l,E)=>{S[E]=l});const C={status:m.status,url:m.url,body:g,headers:S};if(this.responseCache&&!e.stream&&(e.method==="GET"||e.method==="HEAD")&&!e.body&&g===null){const l=`${e.method}:${a}`;this.responseCache.set(l,C)}return C}finally{t!==null&&clearTimeout(t),n&&r&&n.removeEventListener("abort",r),this.activeRequests--,i>0&&this.releaseSlot()}}getCookiesForDomain(e){const i=this.cookieStringCache.get(e);if(i!==void 0)return i;let o="";const s=this.cookieStore.size>0?this.getAllCookieDomains():[];for(let t=0;t<s.length;t++){const r=s[t];if(e!==r&&!e.endsWith("."+r))continue;const n=this.cookieStore.get(r);if(n)for(const a in n)o.length>0&&(o+="; "),o+=a+"="+n[a]}return this.cookieStringCache.set(e,o),o}getAllCookieDomains(){const e=[],i=this.cookieStore.storage;for(const o of i.keys())e.push(o);return e}storeCookies(e,i){if(!this.cookiesEnabled||typeof i.getSetCookie!="function")return;const o=i.getSetCookie();if(o.length===0)return;const s=k(e);for(let t=0;t<o.length;t++){const r=o[t];if(!r)continue;const n=r.indexOf(";"),a=n===-1?r:r.slice(0,n),c=a.indexOf("=");if(c===-1)continue;const u=a.slice(0,c).trim(),h=a.slice(c+1).trim();if(!u)continue;let f=s;if(n!==-1){const g=r.split(";");for(let S=1;S<g.length;S++){const C=g[S].trim();if(C.length>7&&C.toLowerCase().startsWith("domain=")){const l=C.slice(7).trim();l&&(f=l.charCodeAt(0)===46?l.slice(1):l);break}}}const m=this.cookieStore.get(f)??Object.create(null);m[u]=h,this.cookieStore.set(f,m),this.hasCookies=!0,this.cookieStringCache.delete(f)}}async waitForSlot(e){return new Promise((i,o)=>{const s=this.queueTail++,t=()=>{e?.removeEventListener("abort",t),delete this.concurrencyQueue[s],o(A(e))};e&&e.addEventListener("abort",t,{once:!0}),this.concurrencyQueue[s]=()=>{e?.removeEventListener("abort",t),i()}})}releaseSlot(){for(;this.queueHead<this.queueTail;){const e=this.concurrencyQueue[this.queueHead];if(e!==void 0){delete this.concurrencyQueue[this.queueHead],this.queueHead++,e();return}this.queueHead++}this.queueHead===this.queueTail&&(this.queueHead=0,this.queueTail=0)}async close(){await Promise.all(Array.from(this.servers,e=>e())),this.concurrencyQueue=Object.create(null),this.queueHead=0,this.queueTail=0,this.cookieStore.clear(),this.cookieStringCache.clear(),this.hasCookies=!1,this.responseCache?.clear(),this.activeRequests=0}async destroy(){await Promise.all(Array.from(this.servers,e=>e(!0))),await this.close()}}
2
+ //# sourceMappingURL=bun.js.map
package/bun.js.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"file":"bun.js","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/bun.ts"],
4
+ "sourcesContent": ["import type {\n HyperTransport,\n TransportListenOptions,\n TransportRequest,\n TransportResponse,\n TransportServer,\n} from \"@hyperttp/types\";\nimport type { BunTransportConfig, Fingerprint, StealthOptions } from \"./types/index.js\";\nimport {\n fastGetHostname,\n getAbortError,\n EMPTY_HEADERS,\n normalizeHeaders,\n resolveUrl,\n TIMEOUT_ERROR,\n} from \"./utils/helpers.js\";\nimport { CacheManager } from \"hcacher\";\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 \u0412\u044B\u0441\u043E\u043A\u043E\u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 HTTP-\u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u0434\u043B\u044F Bun \u0441 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u043C\u0438 \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u044F\u043C\u0438 \u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 Stealth-\u043C\u0438\u043C\u0438\u043A\u0440\u0438\u0438.\n * \u0412\u043A\u043B\u044E\u0447\u0430\u0435\u0442 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435 \u043F\u0430\u0440\u0430\u043B\u043B\u0435\u043B\u0438\u0437\u043C\u043E\u043C, cookie jar \u0438 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0434\u043E\u043C\u0435\u043D\u043E\u0432.\n * @en High-performance HTTP transport for Bun with native optimizations and Stealth mimicry support.\n * Includes concurrency management, cookie jar, and domain caching.\n */\nexport class BunTransport implements HyperTransport {\n public readonly protocols = [\"rest\"] as const;\n\n public supports(protocol: string): boolean {\n return protocol === \"rest\";\n }\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.\n * @en Transport configuration.\n */\n public config: BunTransportConfig;\n\n private readonly servers = new Set<(force?: boolean) => Promise<void>>();\n\n /**\n * @ru \u041A\u044D\u0448 cookies \u043F\u043E \u0434\u043E\u043C\u0435\u043D\u0430\u043C \u0441 TTL \u0438 LRU-\u044D\u0432\u0438\u043A\u0446\u0438\u0435\u0439 (domain -> name -> value).\n * @en Cookie cache by domain with TTL and LRU eviction (domain -> name -> value).\n */\n private readonly cookieStore: CacheManager<Record<string, string>>;\n\n /**\n * @ru \u041A\u044D\u0448 \u0441\u0433\u0435\u043D\u0435\u0440\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0445 \u0441\u0442\u0440\u043E\u043A cookies \u0441 TTL.\n * @en Cache of generated cookie strings with TTL.\n */\n private readonly cookieStringCache: CacheManager<string>;\n\n /**\n * @ru \u041D\u0430\u043B\u0438\u0447\u0438\u0435 cookies \u0432 jar. \u041F\u043E\u043A\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u043D\u0435 \u0443\u0441\u0442\u0430\u043D\u043E\u0432\u0438\u043B cookie, \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u043F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u043C cookie hot path.\n * @en Whether the jar contains cookies. Skip the cookie hot path until a server sets one.\n */\n private hasCookies = false;\n\n /**\n * @ru \u0412\u043A\u043B\u044E\u0447\u0435\u043D\u043E \u043B\u0438 cookie-\u0445\u0440\u0430\u043D\u0438\u043B\u0438\u0449\u0435. \u041F\u0440\u0438 \u043E\u0442\u043A\u043B\u044E\u0447\u0435\u043D\u0438\u0438 \u0438\u0441\u043A\u043B\u044E\u0447\u0430\u0435\u043C cookie work \u0438\u0437 hot path.\n * @en Whether the cookie store is enabled. When disabled, skip cookie work in the hot path.\n */\n private readonly cookiesEnabled: boolean;\n\n /**\n * @ru \u041E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u0439 \u043A\u044D\u0448 HTTP-\u043E\u0442\u0432\u0435\u0442\u043E\u0432 \u0434\u043B\u044F GET/HEAD \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432.\n * @en Optional HTTP response cache for GET/HEAD requests.\n */\n private readonly responseCache?: CacheManager<TransportResponse>;\n\n /**\n * @ru \u0421\u0447\u0451\u0442\u0447\u0438\u043A \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 (\u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0449\u0438\u0445\u0441\u044F) \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432.\n * @en Counter of active (in-flight) requests.\n */\n private activeRequests = 0;\n\n /**\n * @ru \u041E\u0447\u0435\u0440\u0435\u0434\u044C \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432, \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0445 \u0441\u0432\u043E\u0431\u043E\u0434\u043D\u043E\u0433\u043E \u0441\u043B\u043E\u0442\u0430 \u043F\u0440\u0438 \u0434\u043E\u0441\u0442\u0438\u0436\u0435\u043D\u0438\u0438 \u043B\u0438\u043C\u0438\u0442\u0430 \u043F\u0430\u0440\u0430\u043B\u043B\u0435\u043B\u0438\u0437\u043C\u0430.\n * @en Queue of requests waiting for a free slot when concurrency limit is reached.\n */\n private concurrencyQueue: Record<number, () => void> = Object.create(null);\n\n /**\n * @ru \u0418\u043D\u0434\u0435\u043A\u0441 \u043D\u0430\u0447\u0430\u043B\u0430 \u043E\u0447\u0435\u0440\u0435\u0434\u0438 (\u0434\u043B\u044F FIFO \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438).\n * @en Queue head index (for FIFO processing).\n */\n private queueHead = 0;\n\n /**\n * @ru \u0418\u043D\u0434\u0435\u043A\u0441 \u043A\u043E\u043D\u0446\u0430 \u043E\u0447\u0435\u0440\u0435\u0434\u0438 (\u0434\u043B\u044F \u0434\u043E\u0431\u0430\u0432\u043B\u0435\u043D\u0438\u044F \u043D\u043E\u0432\u044B\u0445 \u044D\u043B\u0435\u043C\u0435\u043D\u0442\u043E\u0432).\n * @en Queue tail index (for adding new elements).\n */\n private queueTail = 0;\n\n /**\n * @ru \u041C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0435 \u043A\u043E\u043B\u0438\u0447\u0435\u0441\u0442\u0432\u043E \u043E\u0434\u043D\u043E\u0432\u0440\u0435\u043C\u0435\u043D\u043D\u044B\u0445 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 (0 = \u0431\u0435\u0437 \u043B\u0438\u043C\u0438\u0442\u0430).\n * @en Maximum number of concurrent requests (0 = unlimited).\n */\n private _maxConcurrent = 0;\n\n /**\n * @ru \u0422\u0430\u0439\u043C\u0430\u0443\u0442 \u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u0432 \u043C\u0438\u043B\u043B\u0438\u0441\u0435\u043A\u0443\u043D\u0434\u0430\u0445 (0 = \u0431\u0435\u0437 \u0442\u0430\u0439\u043C\u0430\u0443\u0442\u0430).\n * @en Request timeout in milliseconds (0 = no timeout).\n */\n private _timeout = 0;\n\n /**\n * @ru \u0424\u043B\u0430\u0433 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F keep-alive \u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u0439.\n * @en Flag for using keep-alive connections.\n */\n private _keepalive = false;\n\n /**\n * @ru \u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F TLS (\u043E\u0442\u043A\u043B\u043E\u043D\u0435\u043D\u0438\u0435 \u043D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u044B\u0445 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043A\u0430\u0442\u043E\u0432 \u0438 \u0448\u0438\u0444\u0440\u044B).\n * @en TLS configuration (reject unauthorized certificates and ciphers).\n */\n private _tlsConfig: { rejectUnauthorized: boolean; ciphers?: string } | null = null;\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 BunTransport.\n * @en Creates a BunTransport instance.\n * @param config - Transport configuration.\n */\n constructor(config: BunTransportConfig) {\n this.config = config;\n\n const cookieCfg = config?.network?.cookieCache;\n this.cookiesEnabled = cookieCfg?.enabled ?? true;\n this.cookieStore = new CacheManager<Record<string, string>>({\n enabled: this.cookiesEnabled,\n maxSize: cookieCfg?.maxSize ?? 256,\n ttl: cookieCfg?.ttl ?? 300_000,\n touchOnGet: true,\n });\n\n this.cookieStringCache = new CacheManager<string>({\n enabled: this.cookiesEnabled,\n maxSize: cookieCfg?.maxSize ?? 1024,\n ttl: cookieCfg?.ttl ?? 60_000,\n touchOnGet: true,\n });\n\n const cacheCfg = config?.network?.cache;\n if (cacheCfg?.enabled !== false && (cacheCfg?.maxSize || cacheCfg?.ttl)) {\n this.responseCache = new CacheManager<TransportResponse>({\n enabled: cacheCfg?.enabled ?? true,\n maxSize: cacheCfg?.maxSize ?? 256,\n ttl: cacheCfg?.ttl ?? 30_000,\n touchOnGet: true,\n });\n }\n\n this.invalidateConfig();\n }\n\n /**\n * @ru \u041F\u0440\u0438\u043D\u0438\u043C\u0430\u0435\u0442 HTTP-\u0437\u0430\u043F\u0440\u043E\u0441\u044B \u0447\u0435\u0440\u0435\u0437 Bun.serve \u0431\u0435\u0437 \u0440\u0430\u0437\u0431\u043E\u0440\u0430 \u0442\u0435\u043B\u0430.\n * @en Accepts HTTP requests through Bun.serve without parsing the body.\n */\n public async listen(options: TransportListenOptions): Promise<TransportServer> {\n const { signal, onRequest } = options;\n if (signal?.aborted) throw getAbortError(signal);\n\n const server = Bun.serve({\n hostname: options.host,\n port: options.port,\n fetch: async (request) => {\n if (!onRequest) return new Response(null, { status: 503 });\n\n const response = await onRequest({\n method: request.method,\n url: request.url,\n headers: Object.fromEntries(request.headers),\n body: request.body,\n signal: request.signal,\n protocol: \"rest\",\n });\n const headers = new Headers();\n for (const [name, value] of Object.entries(response.headers)) {\n if (Array.isArray(value)) {\n for (const item of value) headers.append(name, item);\n } else {\n headers.set(name, value);\n }\n }\n\n return new Response(response.body as BodyInit | null | undefined, {\n status: response.status,\n statusText: response.statusText,\n headers,\n });\n },\n });\n\n const stop = async (force = false): Promise<void> => {\n try {\n await server.stop(force);\n } finally {\n signal?.removeEventListener(\"abort\", onAbort);\n this.servers.delete(stop);\n }\n };\n const onAbort = (): void => {\n void stop(true).catch(() => {});\n };\n this.servers.add(stop);\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n if (signal?.aborted) {\n await stop(true);\n throw getAbortError(signal);\n }\n\n return { close: () => stop() };\n }\n\n /**\n * @ru \u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0435\u0435 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u0435 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0438.\n * \u0412\u044B\u0437\u044B\u0432\u0430\u0435\u0442\u0441\u044F \u043F\u0440\u0438 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0438 \u0438 \u043C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0432\u044B\u0437\u0432\u0430\u043D\u043E \u043F\u0440\u0438 \u0438\u0437\u043C\u0435\u043D\u0435\u043D\u0438\u0438 \u043A\u043E\u043D\u0444\u0438\u0433\u0430.\n * @en Updates internal state based on configuration.\n * Called on creation and can be called when config changes.\n */\n private invalidateConfig(): void {\n const net = this.config?.network;\n this._maxConcurrent = net?.maxConcurrent ?? 0;\n this._timeout = net?.timeout ?? 0;\n this._keepalive = !!net?.keepAliveTimeout;\n this._tlsConfig = (net?.rejectUnauthorized ?? true) ? null : { rejectUnauthorized: false };\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 HTTP-\u0437\u0430\u043F\u0440\u043E\u0441 \u0447\u0435\u0440\u0435\u0437 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 fetch Bun \u0441 \u0443\u043F\u0440\u0430\u0432\u043B\u0435\u043D\u0438\u0435\u043C \u043F\u0430\u0440\u0430\u043B\u043B\u0435\u043B\u0438\u0437\u043C\u043E\u043C \u0438 \u0442\u0430\u0439\u043C\u0430\u0443\u0442\u0430\u043C\u0438.\n * @en Executes an HTTP request via Bun's native fetch with concurrency management and timeouts.\n * @param req - The normalized transport request.\n * @returns Promise resolving to the transport response.\n * @throws Error if the request is aborted or times out.\n */\n public async execute(\n req: TransportRequest & { stealth?: StealthOptions; stream?: boolean },\n ): Promise<TransportResponse> {\n const maxConcurrent = this._maxConcurrent;\n const timeoutMs = this._timeout;\n\n let signal = req.signal;\n let timer: ReturnType<typeof setTimeout> | null = null;\n let abortHandler: (() => void) | null = null;\n let originalSignal: AbortSignal | null = null;\n\n if (timeoutMs > 0) {\n if (!signal) {\n signal = AbortSignal.timeout(timeoutMs);\n } else if (signal.aborted) {\n throw getAbortError(signal);\n } else {\n const controller = new AbortController();\n originalSignal = signal;\n\n abortHandler = () => controller.abort(originalSignal!.reason);\n originalSignal.addEventListener(\"abort\", abortHandler);\n timer = setTimeout(() => controller.abort(TIMEOUT_ERROR), timeoutMs);\n signal = controller.signal;\n }\n }\n\n if (signal?.aborted) {\n if (timer !== null) clearTimeout(timer);\n if (originalSignal && abortHandler) originalSignal.removeEventListener(\"abort\", abortHandler);\n throw getAbortError(signal);\n }\n\n if (maxConcurrent > 0 && this.activeRequests >= maxConcurrent) {\n try {\n await this.waitForSlot(signal);\n } catch (err) {\n if (timer !== null) clearTimeout(timer);\n if (originalSignal && abortHandler)\n originalSignal.removeEventListener(\"abort\", abortHandler);\n throw err;\n }\n if (signal?.aborted) {\n if (timer !== null) clearTimeout(timer);\n if (originalSignal && abortHandler)\n originalSignal.removeEventListener(\"abort\", abortHandler);\n throw getAbortError(signal);\n }\n }\n\n this.activeRequests++;\n\n try {\n const fullUrl = resolveUrl(this.config?.baseUrl ?? \"\", req.url);\n\n if (\n this.responseCache &&\n !req.stream &&\n (req.method === \"GET\" || req.method === \"HEAD\") &&\n !req.body\n ) {\n const cacheKey = `${req.method}:${fullUrl}`;\n const cached = this.responseCache.get(cacheKey);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n let headers = normalizeHeaders(req.headers) as Record<string, string>;\n\n if (this.hasCookies) {\n const activeCookies = this.getCookiesForDomain(fastGetHostname(fullUrl));\n if (activeCookies.length > 0) {\n if (headers === EMPTY_HEADERS) headers = Object.create(null);\n headers[\"cookie\"] = headers[\"cookie\"]\n ? headers[\"cookie\"] + \"; \" + activeCookies\n : activeCookies;\n }\n }\n\n const stealth =\n req.stealth || this.config.stealth ? { ...this.config.stealth, ...req.stealth } : undefined;\n\n if (stealth) {\n if (headers === EMPTY_HEADERS) headers = Object.create(null);\n headers = applyStealthHeaders(headers, stealth);\n }\n\n const init: RequestInit & { tls?: unknown } = {\n method: req.method,\n redirect: (req as any).redirect ?? \"manual\",\n };\n if (headers !== EMPTY_HEADERS) init.headers = headers as HeadersInit;\n\n if (req.body !== undefined) init.body = req.body as BodyInit;\n if (signal !== undefined) init.signal = signal;\n if (this._keepalive) init.keepalive = true;\n\n let requestTlsConfig = this._tlsConfig;\n if (stealth?.ciphers || stealth?.fingerprint) {\n const ciphers = stealth.ciphers ?? getCiphersForProfile(stealth.fingerprint);\n if (ciphers) {\n requestTlsConfig = requestTlsConfig\n ? { ...requestTlsConfig, ciphers }\n : { rejectUnauthorized: true, ciphers };\n }\n }\n if (requestTlsConfig !== null) init.tls = requestTlsConfig;\n\n const nativeRes = await fetch(fullUrl, init);\n\n this.storeCookies(fullUrl, nativeRes.headers);\n\n const bodyStream = nativeRes.body;\n\n const responseHeaders: Record<string, string | string[]> = Object.create(null);\n nativeRes.headers.forEach((value, key) => {\n responseHeaders[key] = value;\n });\n\n const response: TransportResponse = {\n status: nativeRes.status,\n url: nativeRes.url,\n body: bodyStream,\n headers: responseHeaders,\n };\n\n if (\n this.responseCache &&\n !req.stream &&\n (req.method === \"GET\" || req.method === \"HEAD\") &&\n !req.body &&\n bodyStream === null\n ) {\n const cacheKey = `${req.method}:${fullUrl}`;\n this.responseCache.set(cacheKey, response);\n }\n\n return response;\n } finally {\n if (timer !== null) {\n clearTimeout(timer);\n }\n if (originalSignal && abortHandler) {\n originalSignal.removeEventListener(\"abort\", abortHandler);\n }\n this.activeRequests--;\n if (maxConcurrent > 0) this.releaseSlot();\n }\n }\n\n /**\n * @ru \u041F\u043E\u043B\u0443\u0447\u0430\u0435\u0442 \u0441\u0442\u0440\u043E\u043A\u0443 cookies \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u0434\u043E\u043C\u0435\u043D\u0430 \u0441 \u0443\u0447\u0451\u0442\u043E\u043C \u0440\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0445 \u0434\u043E\u043C\u0435\u043D\u043E\u0432.\n * @en Gets the cookie string for the specified domain, considering parent domains.\n * @param requestDomain - The domain to get cookies for.\n * @returns Semicolon-separated cookie string.\n */\n private getCookiesForDomain(requestDomain: string): string {\n const cached = this.cookieStringCache.get(requestDomain);\n if (cached !== undefined) return cached;\n\n let result = \"\";\n const domains = this.cookieStore.size > 0 ? this.getAllCookieDomains() : [];\n\n for (let i = 0; i < domains.length; i++) {\n const storedDomain = domains[i]!;\n if (requestDomain !== storedDomain && !requestDomain.endsWith(\".\" + storedDomain)) continue;\n\n const cookiesMap = this.cookieStore.get(storedDomain);\n if (!cookiesMap) continue;\n\n for (const key in cookiesMap) {\n if (result.length > 0) result += \"; \";\n result += key + \"=\" + cookiesMap[key];\n }\n }\n\n this.cookieStringCache.set(requestDomain, result);\n return result;\n }\n\n /**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u0434\u043E\u043C\u0435\u043D\u044B \u0438\u0437 cookie store.\n * @en Returns all domains from the cookie store.\n */\n private getAllCookieDomains(): string[] {\n const domains: string[] = [];\n const store = (this.cookieStore as any).storage as Map<string, unknown>;\n for (const key of store.keys()) {\n domains.push(key);\n }\n return domains;\n }\n\n /**\n * @ru \u0421\u043E\u0445\u0440\u0430\u043D\u044F\u0435\u0442 cookies \u0438\u0437 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 Set-Cookie \u043E\u0442\u0432\u0435\u0442\u0430 \u0432 cookie jar.\n * @en Stores cookies from response Set-Cookie headers into the cookie jar.\n * @param requestUrl - The request URL for determining the default domain.\n * @param headers - Response headers containing Set-Cookie values.\n */\n private storeCookies(requestUrl: string, headers: Headers): void {\n if (!this.cookiesEnabled || typeof headers.getSetCookie !== \"function\") return;\n\n const setCookies = headers.getSetCookie();\n if (setCookies.length === 0) return;\n\n const defaultDomain = fastGetHostname(requestUrl);\n\n for (let i = 0; i < setCookies.length; i++) {\n const rawCookie = setCookies[i];\n if (!rawCookie) continue;\n\n const firstSemicolon = rawCookie.indexOf(\";\");\n const mainPair = firstSemicolon === -1 ? rawCookie : rawCookie.slice(0, firstSemicolon);\n\n const eqIdx = mainPair.indexOf(\"=\");\n if (eqIdx === -1) continue;\n\n const name = mainPair.slice(0, eqIdx).trim();\n const value = mainPair.slice(eqIdx + 1).trim();\n if (!name) continue;\n\n let domain = defaultDomain;\n\n if (firstSemicolon !== -1) {\n const parts = rawCookie.split(\";\");\n for (let j = 1; j < parts.length; j++) {\n const part = parts[j]!.trim();\n if (part.length > 7 && part.toLowerCase().startsWith(\"domain=\")) {\n const rawDomain = part.slice(7).trim();\n if (rawDomain) {\n domain = rawDomain.charCodeAt(0) === 46 ? rawDomain.slice(1) : rawDomain;\n }\n break;\n }\n }\n }\n\n const existing = this.cookieStore.get(domain) ?? Object.create(null);\n existing[name] = value;\n this.cookieStore.set(domain, existing);\n this.hasCookies = true;\n\n this.cookieStringCache.delete(domain);\n }\n }\n\n /**\n * @ru \u041E\u0436\u0438\u0434\u0430\u0435\u0442 \u043E\u0441\u0432\u043E\u0431\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0441\u043B\u043E\u0442\u0430 \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u0438 \u043F\u0430\u0440\u0430\u043B\u043B\u0435\u043B\u0438\u0437\u043C\u0430.\n * @en Waits for a slot to become available in the concurrency queue.\n * @param signal - Optional abort signal to cancel waiting.\n * @returns Promise that resolves when a slot is available.\n * @throws Error if the signal is aborted while waiting.\n */\n private async waitForSlot(signal?: AbortSignal): Promise<void> {\n return new Promise<void>((resolve, reject) => {\n const currentTail = this.queueTail++;\n\n const onAbort = () => {\n signal?.removeEventListener(\"abort\", onAbort);\n delete this.concurrencyQueue[currentTail];\n reject(getAbortError(signal));\n };\n\n if (signal) signal.addEventListener(\"abort\", onAbort, { once: true });\n\n this.concurrencyQueue[currentTail] = () => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n };\n });\n }\n\n /**\n * @ru \u041E\u0441\u0432\u043E\u0431\u043E\u0436\u0434\u0430\u0435\u0442 \u0441\u043B\u043E\u0442 \u0438 \u0440\u0430\u0437\u0431\u043B\u043E\u043A\u0438\u0440\u0443\u0435\u0442 \u0441\u043B\u0435\u0434\u0443\u044E\u0449\u0438\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u0432 \u043E\u0447\u0435\u0440\u0435\u0434\u0438.\n * @en Releases a slot and unblocks the next request in the queue.\n */\n private releaseSlot(): void {\n while (this.queueHead < this.queueTail) {\n const next = this.concurrencyQueue[this.queueHead];\n if (next !== undefined) {\n delete this.concurrencyQueue[this.queueHead];\n this.queueHead++;\n next();\n return;\n }\n this.queueHead++;\n }\n\n if (this.queueHead === this.queueTail) {\n this.queueHead = 0;\n this.queueTail = 0;\n }\n }\n\n /**\n * @ru \u041C\u044F\u0433\u043A\u043E \u0437\u0430\u043A\u0440\u044B\u0432\u0430\u0435\u0442 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442, \u043E\u0447\u0438\u0449\u0430\u044F \u043E\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 cookie jar.\n * @en Gracefully closes the transport, clearing queues and cookie jar.\n * @returns Promise that resolves when cleanup is complete.\n */\n public async close(): Promise<void> {\n await Promise.all(Array.from(this.servers, (stop) => stop()));\n this.concurrencyQueue = Object.create(null);\n this.queueHead = 0;\n this.queueTail = 0;\n this.cookieStore.clear();\n this.cookieStringCache.clear();\n this.hasCookies = false;\n this.responseCache?.clear();\n this.activeRequests = 0;\n }\n\n /**\n * @ru \u041F\u0440\u0438\u043D\u0443\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E \u043E\u0441\u0442\u0430\u043D\u0430\u0432\u043B\u0438\u0432\u0430\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u044B \u0438 \u043E\u0441\u0432\u043E\u0431\u043E\u0436\u0434\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044B \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Forcefully stops servers and releases transport resources.\n * @returns Promise that resolves when cleanup is complete.\n */\n public async destroy(): Promise<void> {\n await Promise.all(Array.from(this.servers, (stop) => stop(true)));\n await this.close();\n }\n}\n"],
5
+ "mappings": "aAQA,OACE,mBAAAA,EACA,iBAAAC,EACA,iBAAAC,EACA,oBAAAC,EACA,cAAAC,EACA,iBAAAC,MACK,qBACP,OAAS,gBAAAC,MAAoB,UAQ7B,MAAMC,EAAiE,CACrE,OAAQ,CACN,YAAa,mEACb,mBAAoB,KACpB,qBAAsB,UACtB,iBAAkB,WAClB,iBAAkB,WAClB,iBAAkB,OAClB,iBAAkB,KAClB,4BAA6B,IAC7B,kBAAmB,kBAErB,QAAS,CACP,iBAAkB,WAClB,iBAAkB,WAClB,iBAAkB,OAClB,kBAAmB,iBACnB,4BAA6B,MAQ3BC,EAA6C,CACjD,OACE,wGACF,QAAS,kEACT,OACE,wHACF,KAAM,uHASR,SAASC,EAAqBC,EAAoC,CAChE,GAAI,CAACA,EAAa,MAAO,GAEzB,OAAQA,EAAa,CACnB,IAAK,SACL,IAAK,OACH,MAAO,CACL,yBACA,yBACA,+BACA,gCACA,+BACA,KAAK,GAAG,EAEZ,IAAK,UACH,MAAO,CACL,yBACA,+BACA,yBACA,gCACA,+BACA,KAAK,GAAG,EAEZ,IAAK,SACH,MAAO,CACL,yBACA,+BACA,yBACA,gCACA,+BACA,KAAK,GAAG,EAEZ,QACE,MAAO,EACX,CACF,CASA,SAASC,EACPC,EACAC,EAAuB,CAEvB,GAAI,CAACA,GAAW,CAACA,EAAQ,YAAa,OAAOD,EAE7C,MAAME,EAAaD,EAAQ,YACrBE,EAAgBR,EAAuBO,CAAU,EAEvD,GAAIC,EACF,UAAWC,KAAOD,EACZH,EAAQI,CAAG,IAAM,SACnBJ,EAAQI,CAAG,EAAID,EAAcC,CAAG,GAKtC,MAAMC,EAAYL,EAAQ,YAAY,EACtC,GAAIK,IAAc,QAAaA,IAAc,gBAAkBA,IAAc,eAAgB,CAC3F,MAAMC,EAAYV,EAAmBM,CAAU,EAC3CI,IACFN,EAAQ,YAAY,EAAIM,EAE5B,CAEA,OAAON,CACT,CAQM,aAAO,YAAY,CACP,UAAY,CAAC,MAAM,EAE5B,SAASO,EAAgB,CAC9B,OAAOA,IAAa,MACtB,CAMO,OAEU,QAAU,IAAI,IAMd,YAMA,kBAMT,WAAa,GAMJ,eAMA,cAMT,eAAiB,EAMjB,iBAA+C,OAAO,OAAO,IAAI,EAMjE,UAAY,EAMZ,UAAY,EAMZ,eAAiB,EAMjB,SAAW,EAMX,WAAa,GAMb,WAAuE,KAO/E,YAAYC,EAA0B,CACpC,KAAK,OAASA,EAEd,MAAMC,EAAYD,GAAQ,SAAS,YACnC,KAAK,eAAiBC,GAAW,SAAW,GAC5C,KAAK,YAAc,IAAIf,EAAqC,CAC1D,QAAS,KAAK,eACd,QAASe,GAAW,SAAW,IAC/B,IAAKA,GAAW,KAAO,IACvB,WAAY,GACb,EAED,KAAK,kBAAoB,IAAIf,EAAqB,CAChD,QAAS,KAAK,eACd,QAASe,GAAW,SAAW,KAC/B,IAAKA,GAAW,KAAO,IACvB,WAAY,GACb,EAED,MAAMC,EAAWF,GAAQ,SAAS,MAC9BE,GAAU,UAAY,KAAUA,GAAU,SAAWA,GAAU,OACjE,KAAK,cAAgB,IAAIhB,EAAgC,CACvD,QAASgB,GAAU,SAAW,GAC9B,QAASA,GAAU,SAAW,IAC9B,IAAKA,GAAU,KAAO,IACtB,WAAY,GACb,GAGH,KAAK,iBAAgB,CACvB,CAMO,MAAM,OAAOC,EAA+B,CACjD,KAAM,CAAE,OAAAC,EAAQ,UAAAC,CAAS,EAAKF,EAC9B,GAAIC,GAAQ,QAAS,MAAMvB,EAAcuB,CAAM,EAE/C,MAAME,EAAS,IAAI,MAAM,CACvB,SAAUH,EAAQ,KAClB,KAAMA,EAAQ,KACd,MAAO,MAAOI,GAAW,CACvB,GAAI,CAACF,EAAW,OAAO,IAAI,SAAS,KAAM,CAAE,OAAQ,GAAG,CAAE,EAEzD,MAAMG,EAAW,MAAMH,EAAU,CAC/B,OAAQE,EAAQ,OAChB,IAAKA,EAAQ,IACb,QAAS,OAAO,YAAYA,EAAQ,OAAO,EAC3C,KAAMA,EAAQ,KACd,OAAQA,EAAQ,OAChB,SAAU,OACX,EACKf,EAAU,IAAI,QACpB,SAAW,CAACiB,EAAMC,CAAK,IAAK,OAAO,QAAQF,EAAS,OAAO,EACzD,GAAI,MAAM,QAAQE,CAAK,EACrB,UAAWC,KAAQD,EAAOlB,EAAQ,OAAOiB,EAAME,CAAI,OAEnDnB,EAAQ,IAAIiB,EAAMC,CAAK,EAI3B,OAAO,IAAI,SAASF,EAAS,KAAqC,CAChE,OAAQA,EAAS,OACjB,WAAYA,EAAS,WACrB,QAAAhB,EACD,CACH,EACD,EAEKoB,EAAO,MAAOC,EAAQ,KAAwB,CAClD,GAAI,CACF,MAAMP,EAAO,KAAKO,CAAK,CACzB,SACET,GAAQ,oBAAoB,QAASU,CAAO,EAC5C,KAAK,QAAQ,OAAOF,CAAI,CAC1B,CACF,EACME,EAAU,IAAW,CACpBF,EAAK,EAAI,EAAE,MAAM,IAAK,CAAE,CAAC,CAChC,EAGA,GAFA,KAAK,QAAQ,IAAIA,CAAI,EACrBR,GAAQ,iBAAiB,QAASU,EAAS,CAAE,KAAM,EAAI,CAAE,EACrDV,GAAQ,QACV,YAAMQ,EAAK,EAAI,EACT/B,EAAcuB,CAAM,EAG5B,MAAO,CAAE,MAAO,IAAMQ,EAAI,CAAE,CAC9B,CAQQ,kBAAgB,CACtB,MAAMG,EAAM,KAAK,QAAQ,QACzB,KAAK,eAAiBA,GAAK,eAAiB,EAC5C,KAAK,SAAWA,GAAK,SAAW,EAChC,KAAK,WAAa,CAAC,CAACA,GAAK,iBACzB,KAAK,WAAcA,GAAK,oBAAsB,GAAQ,KAAO,CAAE,mBAAoB,EAAK,CAC1F,CASO,MAAM,QACXC,EAAsE,CAEtE,MAAMC,EAAgB,KAAK,eACrBC,EAAY,KAAK,SAEvB,IAAId,EAASY,EAAI,OACbG,EAA8C,KAC9CC,EAAoC,KACpCC,EAAqC,KAEzC,GAAIH,EAAY,EACd,GAAI,CAACd,EACHA,EAAS,YAAY,QAAQc,CAAS,MACjC,IAAId,EAAO,QAChB,MAAMvB,EAAcuB,CAAM,EACrB,CACL,MAAMkB,EAAa,IAAI,gBACvBD,EAAiBjB,EAEjBgB,EAAe,IAAME,EAAW,MAAMD,EAAgB,MAAM,EAC5DA,EAAe,iBAAiB,QAASD,CAAY,EACrDD,EAAQ,WAAW,IAAMG,EAAW,MAAMrC,CAAa,EAAGiC,CAAS,EACnEd,EAASkB,EAAW,MACtB,EAGF,GAAIlB,GAAQ,QACV,MAAIe,IAAU,MAAM,aAAaA,CAAK,EAClCE,GAAkBD,GAAcC,EAAe,oBAAoB,QAASD,CAAY,EACtFvC,EAAcuB,CAAM,EAG5B,GAAIa,EAAgB,GAAK,KAAK,gBAAkBA,EAAe,CAC7D,GAAI,CACF,MAAM,KAAK,YAAYb,CAAM,CAC/B,OAASmB,EAAK,CACZ,MAAIJ,IAAU,MAAM,aAAaA,CAAK,EAClCE,GAAkBD,GACpBC,EAAe,oBAAoB,QAASD,CAAY,EACpDG,CACR,CACA,GAAInB,GAAQ,QACV,MAAIe,IAAU,MAAM,aAAaA,CAAK,EAClCE,GAAkBD,GACpBC,EAAe,oBAAoB,QAASD,CAAY,EACpDvC,EAAcuB,CAAM,CAE9B,CAEA,KAAK,iBAEL,GAAI,CACF,MAAMoB,EAAUxC,EAAW,KAAK,QAAQ,SAAW,GAAIgC,EAAI,GAAG,EAE9D,GACE,KAAK,eACL,CAACA,EAAI,SACJA,EAAI,SAAW,OAASA,EAAI,SAAW,SACxC,CAACA,EAAI,KACL,CACA,MAAMS,EAAW,GAAGT,EAAI,MAAM,IAAIQ,CAAO,GACnCE,EAAS,KAAK,cAAc,IAAID,CAAQ,EAC9C,GAAIC,IAAW,OACb,OAAOA,CAEX,CAEA,IAAIlC,EAAUT,EAAiBiC,EAAI,OAAO,EAE1C,GAAI,KAAK,WAAY,CACnB,MAAMW,EAAgB,KAAK,oBAAoB/C,EAAgB4C,CAAO,CAAC,EACnEG,EAAc,OAAS,IACrBnC,IAAYV,IAAeU,EAAU,OAAO,OAAO,IAAI,GAC3DA,EAAQ,OAAYA,EAAQ,OACxBA,EAAQ,OAAY,KAAOmC,EAC3BA,EAER,CAEA,MAAMlC,EACJuB,EAAI,SAAW,KAAK,OAAO,QAAU,CAAE,GAAG,KAAK,OAAO,QAAS,GAAGA,EAAI,OAAO,EAAK,OAEhFvB,IACED,IAAYV,IAAeU,EAAU,OAAO,OAAO,IAAI,GAC3DA,EAAUD,EAAoBC,EAASC,CAAO,GAGhD,MAAMmC,EAAwC,CAC5C,OAAQZ,EAAI,OACZ,SAAWA,EAAY,UAAY,UAEjCxB,IAAYV,IAAe8C,EAAK,QAAUpC,GAE1CwB,EAAI,OAAS,SAAWY,EAAK,KAAOZ,EAAI,MACxCZ,IAAW,SAAWwB,EAAK,OAASxB,GACpC,KAAK,aAAYwB,EAAK,UAAY,IAEtC,IAAIC,EAAmB,KAAK,WAC5B,GAAIpC,GAAS,SAAWA,GAAS,YAAa,CAC5C,MAAMqC,EAAUrC,EAAQ,SAAWJ,EAAqBI,EAAQ,WAAW,EACvEqC,IACFD,EAAmBA,EACf,CAAE,GAAGA,EAAkB,QAAAC,CAAO,EAC9B,CAAE,mBAAoB,GAAM,QAAAA,CAAO,EAE3C,CACID,IAAqB,OAAMD,EAAK,IAAMC,GAE1C,MAAME,EAAY,MAAM,MAAMP,EAASI,CAAI,EAE3C,KAAK,aAAaJ,EAASO,EAAU,OAAO,EAE5C,MAAMC,EAAaD,EAAU,KAEvBE,EAAqD,OAAO,OAAO,IAAI,EAC7EF,EAAU,QAAQ,QAAQ,CAACrB,EAAOd,IAAO,CACvCqC,EAAgBrC,CAAG,EAAIc,CACzB,CAAC,EAED,MAAMF,EAA8B,CAClC,OAAQuB,EAAU,OAClB,IAAKA,EAAU,IACf,KAAMC,EACN,QAASC,GAGX,GACE,KAAK,eACL,CAACjB,EAAI,SACJA,EAAI,SAAW,OAASA,EAAI,SAAW,SACxC,CAACA,EAAI,MACLgB,IAAe,KACf,CACA,MAAMP,EAAW,GAAGT,EAAI,MAAM,IAAIQ,CAAO,GACzC,KAAK,cAAc,IAAIC,EAAUjB,CAAQ,CAC3C,CAEA,OAAOA,CACT,SACMW,IAAU,MACZ,aAAaA,CAAK,EAEhBE,GAAkBD,GACpBC,EAAe,oBAAoB,QAASD,CAAY,EAE1D,KAAK,iBACDH,EAAgB,GAAG,KAAK,YAAW,CACzC,CACF,CAQQ,oBAAoBiB,EAAqB,CAC/C,MAAMR,EAAS,KAAK,kBAAkB,IAAIQ,CAAa,EACvD,GAAIR,IAAW,OAAW,OAAOA,EAEjC,IAAIS,EAAS,GACb,MAAMC,EAAU,KAAK,YAAY,KAAO,EAAI,KAAK,oBAAmB,EAAK,CAAA,EAEzE,QAASC,EAAI,EAAGA,EAAID,EAAQ,OAAQC,IAAK,CACvC,MAAMC,EAAeF,EAAQC,CAAC,EAC9B,GAAIH,IAAkBI,GAAgB,CAACJ,EAAc,SAAS,IAAMI,CAAY,EAAG,SAEnF,MAAMC,EAAa,KAAK,YAAY,IAAID,CAAY,EACpD,GAAKC,EAEL,UAAW3C,KAAO2C,EACZJ,EAAO,OAAS,IAAGA,GAAU,MACjCA,GAAUvC,EAAM,IAAM2C,EAAW3C,CAAG,CAExC,CAEA,YAAK,kBAAkB,IAAIsC,EAAeC,CAAM,EACzCA,CACT,CAMQ,qBAAmB,CACzB,MAAMC,EAAoB,CAAA,EACpBI,EAAS,KAAK,YAAoB,QACxC,UAAW5C,KAAO4C,EAAM,KAAI,EAC1BJ,EAAQ,KAAKxC,CAAG,EAElB,OAAOwC,CACT,CAQQ,aAAaK,EAAoBjD,EAAgB,CACvD,GAAI,CAAC,KAAK,gBAAkB,OAAOA,EAAQ,cAAiB,WAAY,OAExE,MAAMkD,EAAalD,EAAQ,aAAY,EACvC,GAAIkD,EAAW,SAAW,EAAG,OAE7B,MAAMC,EAAgB/D,EAAgB6D,CAAU,EAEhD,QAASJ,EAAI,EAAGA,EAAIK,EAAW,OAAQL,IAAK,CAC1C,MAAMO,EAAYF,EAAWL,CAAC,EAC9B,GAAI,CAACO,EAAW,SAEhB,MAAMC,EAAiBD,EAAU,QAAQ,GAAG,EACtCE,EAAWD,IAAmB,GAAKD,EAAYA,EAAU,MAAM,EAAGC,CAAc,EAEhFE,EAAQD,EAAS,QAAQ,GAAG,EAClC,GAAIC,IAAU,GAAI,SAElB,MAAMtC,EAAOqC,EAAS,MAAM,EAAGC,CAAK,EAAE,KAAI,EACpCrC,EAAQoC,EAAS,MAAMC,EAAQ,CAAC,EAAE,KAAI,EAC5C,GAAI,CAACtC,EAAM,SAEX,IAAIuC,EAASL,EAEb,GAAIE,IAAmB,GAAI,CACzB,MAAMI,EAAQL,EAAU,MAAM,GAAG,EACjC,QAASM,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAAK,CACrC,MAAMC,EAAOF,EAAMC,CAAC,EAAG,KAAI,EAC3B,GAAIC,EAAK,OAAS,GAAKA,EAAK,YAAW,EAAG,WAAW,SAAS,EAAG,CAC/D,MAAMC,EAAYD,EAAK,MAAM,CAAC,EAAE,KAAI,EAChCC,IACFJ,EAASI,EAAU,WAAW,CAAC,IAAM,GAAKA,EAAU,MAAM,CAAC,EAAIA,GAEjE,KACF,CACF,CACF,CAEA,MAAMC,EAAW,KAAK,YAAY,IAAIL,CAAM,GAAK,OAAO,OAAO,IAAI,EACnEK,EAAS5C,CAAI,EAAIC,EACjB,KAAK,YAAY,IAAIsC,EAAQK,CAAQ,EACrC,KAAK,WAAa,GAElB,KAAK,kBAAkB,OAAOL,CAAM,CACtC,CACF,CASQ,MAAM,YAAY5C,EAAoB,CAC5C,OAAO,IAAI,QAAc,CAACkD,EAASC,IAAU,CAC3C,MAAMC,EAAc,KAAK,YAEnB1C,EAAU,IAAK,CACnBV,GAAQ,oBAAoB,QAASU,CAAO,EAC5C,OAAO,KAAK,iBAAiB0C,CAAW,EACxCD,EAAO1E,EAAcuB,CAAM,CAAC,CAC9B,EAEIA,GAAQA,EAAO,iBAAiB,QAASU,EAAS,CAAE,KAAM,EAAI,CAAE,EAEpE,KAAK,iBAAiB0C,CAAW,EAAI,IAAK,CACxCpD,GAAQ,oBAAoB,QAASU,CAAO,EAC5CwC,EAAO,CACT,CACF,CAAC,CACH,CAMQ,aAAW,CACjB,KAAO,KAAK,UAAY,KAAK,WAAW,CACtC,MAAMG,EAAO,KAAK,iBAAiB,KAAK,SAAS,EACjD,GAAIA,IAAS,OAAW,CACtB,OAAO,KAAK,iBAAiB,KAAK,SAAS,EAC3C,KAAK,YACLA,EAAI,EACJ,MACF,CACA,KAAK,WACP,CAEI,KAAK,YAAc,KAAK,YAC1B,KAAK,UAAY,EACjB,KAAK,UAAY,EAErB,CAOO,MAAM,OAAK,CAChB,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK,QAAU7C,GAASA,EAAI,CAAE,CAAC,EAC5D,KAAK,iBAAmB,OAAO,OAAO,IAAI,EAC1C,KAAK,UAAY,EACjB,KAAK,UAAY,EACjB,KAAK,YAAY,MAAK,EACtB,KAAK,kBAAkB,MAAK,EAC5B,KAAK,WAAa,GAClB,KAAK,eAAe,MAAK,EACzB,KAAK,eAAiB,CACxB,CAOO,MAAM,SAAO,CAClB,MAAM,QAAQ,IAAI,MAAM,KAAK,KAAK,QAAUA,GAASA,EAAK,EAAI,CAAC,CAAC,EAChE,MAAM,KAAK,MAAK,CAClB",
6
+ "names": ["fastGetHostname", "getAbortError", "EMPTY_HEADERS", "normalizeHeaders", "resolveUrl", "TIMEOUT_ERROR", "CacheManager", "STEALTH_HEADER_PRESETS", "STEALTH_UA_PRESETS", "getCiphersForProfile", "fingerprint", "applyStealthHeaders", "headers", "stealth", "presetName", "presetHeaders", "key", "currentUA", "browserUA", "protocol", "config", "cookieCfg", "cacheCfg", "options", "signal", "onRequest", "server", "request", "response", "name", "value", "item", "stop", "force", "onAbort", "net", "req", "maxConcurrent", "timeoutMs", "timer", "abortHandler", "originalSignal", "controller", "err", "fullUrl", "cacheKey", "cached", "activeCookies", "init", "requestTlsConfig", "ciphers", "nativeRes", "bodyStream", "responseHeaders", "requestDomain", "result", "domains", "i", "storedDomain", "cookiesMap", "store", "requestUrl", "setCookies", "defaultDomain", "rawCookie", "firstSemicolon", "mainPair", "eqIdx", "domain", "parts", "j", "part", "rawDomain", "existing", "resolve", "reject", "currentTail", "next"]
7
+ }
package/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export { BunTransport } from "./bun.js";
2
- //# sourceMappingURL=index.js.map
1
+ "use strict";export{BunTransport}from"./bun.js";
2
+ //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/index.ts"],
4
+ "sourcesContent": ["export { BunTransport } from \"./bun.js\";\n"],
5
+ "mappings": "aAAA,OAAS,iBAAoB",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,7 +1,21 @@
1
1
  {
2
2
  "name": "@hyperttp/transport-bun",
3
- "version": "0.4.0",
3
+ "version": "0.4.2",
4
4
  "description": "High-performance HTTP transport for Bun with native fetch optimizations",
5
+ "keywords": [
6
+ "bun",
7
+ "fetch",
8
+ "high-performance",
9
+ "http",
10
+ "hyperttp",
11
+ "transport"
12
+ ],
13
+ "license": "MIT",
14
+ "author": "dirold2",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "git+https://github.com/IT-IF-OR/hyperttp-transport-bun.git"
18
+ },
5
19
  "type": "module",
6
20
  "sideEffects": false,
7
21
  "main": "./index.js",
@@ -12,23 +26,9 @@
12
26
  "import": "./index.js"
13
27
  }
14
28
  },
15
- "keywords": [
16
- "http",
17
- "transport",
18
- "high-performance",
19
- "fetch",
20
- "bun",
21
- "hyperttp"
22
- ],
23
- "author": "dirold2",
24
- "license": "MIT",
25
- "repository": {
26
- "type": "git",
27
- "url": "git+https://github.com/IT-IF-OR/hyperttp-transport-bun.git"
28
- },
29
29
  "peerDependencies": {
30
- "@hyperttp/types": "^0.4.2",
31
- "hcacher": "^0.3.0"
30
+ "@hyperttp/types": "^0.5.4",
31
+ "hcacher": "^0.3.1"
32
32
  },
33
33
  "private": false
34
34
  }
package/types/index.js CHANGED
@@ -1,2 +1,2 @@
1
- export {};
2
- //# sourceMappingURL=index.js.map
1
+ "use strict";export{};
2
+ //# sourceMappingURL=index.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
1
+ {
2
+ "version": 3,
3
+ "sources": ["index.js"],
4
+ "sourcesContent": ["export {};\n//# sourceMappingURL=index.js.map"],
5
+ "mappings": "aAAA",
6
+ "names": []
7
+ }
package/utils/helpers.js CHANGED
@@ -1,133 +1,2 @@
1
- /**
2
- * @ru Кэш hostname'ов для быстрого извлечения домена из URL.
3
- * @en Hostname cache for fast domain extraction from URLs.
4
- */
5
- let hostnameCacheSize = 0;
6
- let hostnameCache = Object.create(null);
7
- let lastUrl = "";
8
- let lastHost = "";
9
- /**
10
- * @ru Быстрое извлечение hostname из URL с кэшированием.
11
- * @en Fast hostname extraction from URL with caching.
12
- * @param url - The URL to extract hostname from.
13
- * @returns The extracted hostname.
14
- */
15
- export function fastGetHostname(url) {
16
- if (url === lastUrl)
17
- return lastHost;
18
- if (!url)
19
- return "localhost";
20
- const cached = hostnameCache[url];
21
- if (cached !== undefined) {
22
- lastUrl = url;
23
- lastHost = cached;
24
- return cached;
25
- }
26
- let start = 0;
27
- const first = url.charCodeAt(0);
28
- if (first === 47) {
29
- start = url.charCodeAt(1) === 47 ? 2 : 0;
30
- if (start === 0)
31
- return "localhost";
32
- }
33
- else {
34
- const schemeIdx = url.indexOf("://");
35
- if (schemeIdx !== -1)
36
- start = schemeIdx + 3;
37
- }
38
- let end = url.length;
39
- for (let i = start; i < end; i++) {
40
- const code = url.charCodeAt(i);
41
- if (code === 47 || code === 63 || code === 35) {
42
- end = i;
43
- break;
44
- }
45
- }
46
- const atIdx = url.indexOf("@", start);
47
- if (atIdx !== -1 && atIdx < end)
48
- start = atIdx + 1;
49
- const colonIdx = url.indexOf(":", start);
50
- if (colonIdx !== -1 && colonIdx < end)
51
- end = colonIdx;
52
- const host = url.slice(start, end) || "localhost";
53
- if (hostnameCacheSize > 1024) {
54
- hostnameCache = Object.create(null);
55
- hostnameCacheSize = 0;
56
- }
57
- hostnameCache[url] = host;
58
- hostnameCacheSize++;
59
- lastUrl = url;
60
- lastHost = host;
61
- return host;
62
- }
63
- /**
64
- * @ru Разрешает относительный URL относительно baseUrl.
65
- * @en Resolves a relative URL against a baseUrl.
66
- * @param baseUrl - The base URL.
67
- * @param url - The URL to resolve.
68
- * @returns The resolved absolute URL.
69
- */
70
- export function resolveUrl(baseUrl, url) {
71
- if (url.charCodeAt(0) === 47)
72
- return baseUrl + url;
73
- if (url.startsWith("http://") || url.startsWith("https://"))
74
- return url;
75
- return baseUrl + "/" + url;
76
- }
77
- /**
78
- * @ru Кэшированные DOMException для частых ошибок abort/timeout.
79
- * @en Cached DOMException for frequent abort/timeout errors.
80
- */
81
- export const ABORT_ERROR = new DOMException("The operation was aborted.", "AbortError");
82
- export const TIMEOUT_ERROR = new DOMException("The operation was aborted due to timeout.", "TimeoutError");
83
- /**
84
- * @ru Извлекает причину abort из signal или возвращает кэшированную ошибку.
85
- * @en Extracts abort reason from signal or returns cached error.
86
- * @param signal - Optional abort signal.
87
- * @returns The abort error or reason.
88
- */
89
- export function getAbortError(signal) {
90
- return signal?.reason ?? ABORT_ERROR;
91
- }
92
- export const EMPTY_HEADERS = Object.freeze(Object.create(null));
93
- /**
94
- * @ru Нормализует заголовки, переводя все ключи в нижний регистр (lowercase).
95
- * @en Normalizes headers by transforming all keys into lowercase layout.
96
- */
97
- export function normalizeHeaders(headers) {
98
- if (!headers)
99
- return EMPTY_HEADERS;
100
- if (headers instanceof Headers) {
101
- let out;
102
- headers.forEach((value, key) => {
103
- (out ??= Object.create(null))[key.toLowerCase()] = value;
104
- });
105
- return out ?? EMPTY_HEADERS;
106
- }
107
- if (Array.isArray(headers)) {
108
- let out;
109
- for (let i = 0; i < headers.length; i++) {
110
- const pair = headers[i];
111
- if (!pair)
112
- continue;
113
- (out ??= Object.create(null))[pair[0].toLowerCase()] = pair[1];
114
- }
115
- return out ?? EMPTY_HEADERS;
116
- }
117
- const src = headers;
118
- let out;
119
- for (const key in src) {
120
- const value = src[key];
121
- if (value == null)
122
- continue;
123
- const lowerKey = key.toLowerCase();
124
- const target = out ??= Object.create(null);
125
- if (Array.isArray(value)) {
126
- target[lowerKey] = lowerKey === "cookie" ? value.join("; ") : value.join(", ");
127
- continue;
128
- }
129
- target[lowerKey] = String(value);
130
- }
131
- return out ?? EMPTY_HEADERS;
132
- }
133
- //# sourceMappingURL=helpers.js.map
1
+ "use strict";let l=0,h=Object.create(null),u="",O="";export function fastGetHostname(t){if(t===u)return O;if(!t)return"localhost";const o=h[t];if(o!==void 0)return u=t,O=o,o;let r=0;if(t.charCodeAt(0)===47){if(r=t.charCodeAt(1)===47?2:0,r===0)return"localhost"}else{const i=t.indexOf("://");i!==-1&&(r=i+3)}let e=t.length;for(let i=r;i<e;i++){const f=t.charCodeAt(i);if(f===47||f===63||f===35){e=i;break}}const n=t.indexOf("@",r);n!==-1&&n<e&&(r=n+1);const s=t.indexOf(":",r);s!==-1&&s<e&&(e=s);const a=t.slice(r,e)||"localhost";return l>1024&&(h=Object.create(null),l=0),h[t]=a,l++,u=t,O=a,a}export function resolveUrl(t,o){return o.charCodeAt(0)===47?t+o:o.startsWith("http://")||o.startsWith("https://")?o:t+"/"+o}export const ABORT_ERROR=new DOMException("The operation was aborted.","AbortError"),TIMEOUT_ERROR=new DOMException("The operation was aborted due to timeout.","TimeoutError");export function getAbortError(t){return t?.reason??ABORT_ERROR}export const EMPTY_HEADERS=Object.freeze(Object.create(null));export function normalizeHeaders(t){if(!t)return EMPTY_HEADERS;if(t instanceof Headers){let c;return t.forEach((e,n)=>{(c??=Object.create(null))[n.toLowerCase()]=e}),c??EMPTY_HEADERS}if(Array.isArray(t)){let c;for(let e=0;e<t.length;e++){const n=t[e];n&&((c??=Object.create(null))[n[0].toLowerCase()]=n[1])}return c??EMPTY_HEADERS}const o=t;let r;for(const c in o){const e=o[c];if(e==null)continue;const n=c.toLowerCase(),s=r??=Object.create(null);if(Array.isArray(e)){s[n]=n==="cookie"?e.join("; "):e.join(", ");continue}s[n]=String(e)}return r??EMPTY_HEADERS}
2
+ //# sourceMappingURL=helpers.js.map
@@ -1 +1,7 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/helpers.ts"],
4
+ "sourcesContent": ["import type { TransportRequest } from \"@hyperttp/types\";\n\n/**\n * @ru \u041A\u044D\u0448 hostname'\u043E\u0432 \u0434\u043B\u044F \u0431\u044B\u0441\u0442\u0440\u043E\u0433\u043E \u0438\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u044F \u0434\u043E\u043C\u0435\u043D\u0430 \u0438\u0437 URL.\n * @en Hostname cache for fast domain extraction from URLs.\n */\nlet hostnameCacheSize = 0;\nlet hostnameCache: Record<string, string> = Object.create(null);\nlet lastUrl = \"\";\nlet lastHost = \"\";\n\n/**\n * @ru \u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0438\u0437\u0432\u043B\u0435\u0447\u0435\u043D\u0438\u0435 hostname \u0438\u0437 URL \u0441 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C.\n * @en Fast hostname extraction from URL with caching.\n * @param url - The URL to extract hostname from.\n * @returns The extracted hostname.\n */\nexport function fastGetHostname(url: string): string {\n if (url === lastUrl) return lastHost;\n if (!url) return \"localhost\";\n\n const cached = hostnameCache[url];\n if (cached !== undefined) {\n lastUrl = url;\n lastHost = cached;\n return cached;\n }\n\n let start = 0;\n const first = url.charCodeAt(0);\n\n if (first === 47) {\n start = url.charCodeAt(1) === 47 ? 2 : 0;\n if (start === 0) return \"localhost\";\n } else {\n const schemeIdx = url.indexOf(\"://\");\n if (schemeIdx !== -1) start = schemeIdx + 3;\n }\n\n let end = url.length;\n for (let i = start; i < end; i++) {\n const code = url.charCodeAt(i);\n if (code === 47 || code === 63 || code === 35) {\n end = i;\n break;\n }\n }\n\n const atIdx = url.indexOf(\"@\", start);\n if (atIdx !== -1 && atIdx < end) start = atIdx + 1;\n\n const colonIdx = url.indexOf(\":\", start);\n if (colonIdx !== -1 && colonIdx < end) end = colonIdx;\n\n const host = url.slice(start, end) || \"localhost\";\n\n if (hostnameCacheSize > 1024) {\n hostnameCache = Object.create(null);\n hostnameCacheSize = 0;\n }\n\n hostnameCache[url] = host;\n hostnameCacheSize++;\n lastUrl = url;\n lastHost = host;\n return host;\n}\n\n/**\n * @ru \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 URL \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u043E baseUrl.\n * @en Resolves a relative URL against a baseUrl.\n * @param baseUrl - The base URL.\n * @param url - The URL to resolve.\n * @returns The resolved absolute URL.\n */\nexport function resolveUrl(baseUrl: string, url: string): string {\n if (url.charCodeAt(0) === 47) return baseUrl + url;\n if (url.startsWith(\"http://\") || url.startsWith(\"https://\")) return url;\n return baseUrl + \"/\" + url;\n}\n\n/**\n * @ru \u041A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0435 DOMException \u0434\u043B\u044F \u0447\u0430\u0441\u0442\u044B\u0445 \u043E\u0448\u0438\u0431\u043E\u043A abort/timeout.\n * @en Cached DOMException for frequent abort/timeout errors.\n */\nexport const ABORT_ERROR = new DOMException(\"The operation was aborted.\", \"AbortError\");\nexport const TIMEOUT_ERROR = new DOMException(\n \"The operation was aborted due to timeout.\",\n \"TimeoutError\",\n);\n\n/**\n * @ru \u0418\u0437\u0432\u043B\u0435\u043A\u0430\u0435\u0442 \u043F\u0440\u0438\u0447\u0438\u043D\u0443 abort \u0438\u0437 signal \u0438\u043B\u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u0443\u044E \u043E\u0448\u0438\u0431\u043A\u0443.\n * @en Extracts abort reason from signal or returns cached error.\n * @param signal - Optional abort signal.\n * @returns The abort error or reason.\n */\nexport function getAbortError(signal?: AbortSignal): unknown {\n return signal?.reason ?? ABORT_ERROR;\n}\n\nexport const EMPTY_HEADERS = Object.freeze(Object.create(null)) as Record<string, string>;\n\n/**\n * @ru \u041D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u0443\u0435\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438, \u043F\u0435\u0440\u0435\u0432\u043E\u0434\u044F \u0432\u0441\u0435 \u043A\u043B\u044E\u0447\u0438 \u0432 \u043D\u0438\u0436\u043D\u0438\u0439 \u0440\u0435\u0433\u0438\u0441\u0442\u0440 (lowercase).\n * @en Normalizes headers by transforming all keys into lowercase layout.\n */\nexport function normalizeHeaders(headers: TransportRequest[\"headers\"]): Record<string, string> {\n if (!headers) return EMPTY_HEADERS;\n\n if (headers instanceof Headers) {\n let out: Record<string, string> | undefined;\n headers.forEach((value, key) => {\n (out ??= Object.create(null))[key.toLowerCase()] = value;\n });\n return out ?? EMPTY_HEADERS;\n }\n\n if (Array.isArray(headers)) {\n let out: Record<string, string> | undefined;\n for (let i = 0; i < headers.length; i++) {\n const pair = headers[i] as unknown as [string, string] | undefined;\n if (!pair) continue;\n (out ??= Object.create(null))[pair[0].toLowerCase()] = pair[1];\n }\n return out ?? EMPTY_HEADERS;\n }\n\n const src = headers as Record<string, unknown>;\n let out: Record<string, string> | undefined;\n for (const key in src) {\n const value = src[key];\n if (value == null) continue;\n\n const lowerKey = key.toLowerCase();\n const target = (out ??= Object.create(null));\n if (Array.isArray(value)) {\n target[lowerKey] = lowerKey === \"cookie\" ? value.join(\"; \") : value.join(\", \");\n continue;\n }\n\n target[lowerKey] = String(value);\n }\n\n return out ?? EMPTY_HEADERS;\n}\n"],
5
+ "mappings": "aAMA,IAAIA,EAAoB,EACpBC,EAAwC,OAAO,OAAO,IAAI,EAC1DC,EAAU,GACVC,EAAW,GAQT,gBAAU,gBAAgBC,EAAW,CACzC,GAAIA,IAAQF,EAAS,OAAOC,EAC5B,GAAI,CAACC,EAAK,MAAO,YAEjB,MAAMC,EAASJ,EAAcG,CAAG,EAChC,GAAIC,IAAW,OACb,OAAAH,EAAUE,EACVD,EAAWE,EACJA,EAGT,IAAIC,EAAQ,EAGZ,GAFcF,EAAI,WAAW,CAAC,IAEhB,IAEZ,GADAE,EAAQF,EAAI,WAAW,CAAC,IAAM,GAAK,EAAI,EACnCE,IAAU,EAAG,MAAO,gBACnB,CACL,MAAMC,EAAYH,EAAI,QAAQ,KAAK,EAC/BG,IAAc,KAAID,EAAQC,EAAY,EAC5C,CAEA,IAAIC,EAAMJ,EAAI,OACd,QAAS,EAAIE,EAAO,EAAIE,EAAK,IAAK,CAChC,MAAMC,EAAOL,EAAI,WAAW,CAAC,EAC7B,GAAIK,IAAS,IAAMA,IAAS,IAAMA,IAAS,GAAI,CAC7CD,EAAM,EACN,KACF,CACF,CAEA,MAAME,EAAQN,EAAI,QAAQ,IAAKE,CAAK,EAChCI,IAAU,IAAMA,EAAQF,IAAKF,EAAQI,EAAQ,GAEjD,MAAMC,EAAWP,EAAI,QAAQ,IAAKE,CAAK,EACnCK,IAAa,IAAMA,EAAWH,IAAKA,EAAMG,GAE7C,MAAMC,EAAOR,EAAI,MAAME,EAAOE,CAAG,GAAK,YAEtC,OAAIR,EAAoB,OACtBC,EAAgB,OAAO,OAAO,IAAI,EAClCD,EAAoB,GAGtBC,EAAcG,CAAG,EAAIQ,EACrBZ,IACAE,EAAUE,EACVD,EAAWS,EACJA,CACT,CASM,gBAAU,WAAWC,EAAiBT,EAAW,CACrD,OAAIA,EAAI,WAAW,CAAC,IAAM,GAAWS,EAAUT,EAC3CA,EAAI,WAAW,SAAS,GAAKA,EAAI,WAAW,UAAU,EAAUA,EAC7DS,EAAU,IAAMT,CACzB,CAMO,aAAM,YAAc,IAAI,aAAa,6BAA8B,YAAY,EACzE,cAAgB,IAAI,aAC/B,4CACA,cAAc,EASV,gBAAU,cAAcU,EAAoB,CAChD,OAAOA,GAAQ,QAAU,WAC3B,CAEO,aAAM,cAAgB,OAAO,OAAO,OAAO,OAAO,IAAI,CAAC,EAMxD,gBAAU,iBAAiBC,EAAoC,CACnE,GAAI,CAACA,EAAS,OAAO,cAErB,GAAIA,aAAmB,QAAS,CAC9B,IAAIC,EACJ,OAAAD,EAAQ,QAAQ,CAACE,EAAOC,IAAO,EAC5BF,IAAQ,OAAO,OAAO,IAAI,GAAGE,EAAI,YAAW,CAAE,EAAID,CACrD,CAAC,EACMD,GAAO,aAChB,CAEA,GAAI,MAAM,QAAQD,CAAO,EAAG,CAC1B,IAAIC,EACJ,QAASG,EAAI,EAAGA,EAAIJ,EAAQ,OAAQI,IAAK,CACvC,MAAMC,EAAOL,EAAQI,CAAC,EACjBC,KACJJ,IAAQ,OAAO,OAAO,IAAI,GAAGI,EAAK,CAAC,EAAE,YAAW,CAAE,EAAIA,EAAK,CAAC,EAC/D,CACA,OAAOJ,GAAO,aAChB,CAEA,MAAMK,EAAMN,EACZ,IAAIC,EACJ,UAAWE,KAAOG,EAAK,CACrB,MAAMJ,EAAQI,EAAIH,CAAG,EACrB,GAAID,GAAS,KAAM,SAEnB,MAAMK,EAAWJ,EAAI,YAAW,EAC1BK,EAAUP,IAAQ,OAAO,OAAO,IAAI,EAC1C,GAAI,MAAM,QAAQC,CAAK,EAAG,CACxBM,EAAOD,CAAQ,EAAIA,IAAa,SAAWL,EAAM,KAAK,IAAI,EAAIA,EAAM,KAAK,IAAI,EAC7E,QACF,CAEAM,EAAOD,CAAQ,EAAI,OAAOL,CAAK,CACjC,CAEA,OAAOD,GAAO,aAChB",
6
+ "names": ["hostnameCacheSize", "hostnameCache", "lastUrl", "lastHost", "url", "cached", "start", "schemeIdx", "end", "code", "atIdx", "colonIdx", "host", "baseUrl", "signal", "headers", "out", "value", "key", "i", "pair", "src", "lowerKey", "target"]
7
+ }