@hyperttp/transport-bun 0.2.1 → 0.2.3
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.d.ts +121 -14
- package/bun.d.ts.map +1 -1
- package/bun.js +392 -218
- package/bun.js.map +1 -1
- package/index.d.ts +1 -1
- package/index.d.ts.map +1 -1
- package/index.js +1 -1
- package/index.js.map +1 -1
- package/package.json +11 -9
- package/types/index.d.ts +18 -0
- package/types/index.d.ts.map +1 -0
- package/types/index.js +2 -0
- package/types/index.js.map +1 -0
- package/utils/helpers.d.ts +42 -0
- package/utils/helpers.d.ts.map +1 -0
- package/utils/helpers.js +158 -0
- package/utils/helpers.js.map +1 -0
package/bun.d.ts
CHANGED
|
@@ -1,29 +1,136 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
3
|
-
|
|
1
|
+
import type { HyperTransport, TransportRequest, TransportResponse } from "@hyperttp/types";
|
|
2
|
+
import type { BunTransportConfig } from "./types/index.js";
|
|
3
|
+
/**
|
|
4
|
+
* @ru Высокопроизводительный HTTP-транспорт для Bun с нативными оптимизациями и поддержкой Stealth-мимикрии.
|
|
5
|
+
* Включает управление параллелизмом, cookie jar и кэширование доменов.
|
|
6
|
+
* @en High-performance HTTP transport for Bun with native optimizations and Stealth mimicry support.
|
|
7
|
+
* Includes concurrency management, cookie jar, and domain caching.
|
|
8
|
+
*/
|
|
4
9
|
export declare class BunTransport implements HyperTransport {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
10
|
+
/**
|
|
11
|
+
* @ru Конфигурация транспорта.
|
|
12
|
+
* @en Transport configuration.
|
|
13
|
+
*/
|
|
14
|
+
config: BunTransportConfig;
|
|
15
|
+
/**
|
|
16
|
+
* @ru Хранилище cookies по доменам (domain -> name -> value).
|
|
17
|
+
* @en Cookie storage by domain (domain -> name -> value).
|
|
18
|
+
*/
|
|
19
|
+
private cookieJar;
|
|
20
|
+
/**
|
|
21
|
+
* @ru Список всех доменов, для которых хранятся cookies.
|
|
22
|
+
* @en List of all domains for which cookies are stored.
|
|
23
|
+
*/
|
|
24
|
+
private readonly cookieDomains;
|
|
25
|
+
/**
|
|
26
|
+
* @ru Кэш сгенерированных строк cookies для быстрого доступа.
|
|
27
|
+
* @en Cache of generated cookie strings for fast access.
|
|
28
|
+
*/
|
|
29
|
+
private cookieCache;
|
|
30
|
+
/**
|
|
31
|
+
* @ru Текущий размер кэша cookies.
|
|
32
|
+
* @en Current size of the cookie cache.
|
|
33
|
+
*/
|
|
34
|
+
private cookieCacheSize;
|
|
35
|
+
/**
|
|
36
|
+
* @ru Счётчик активных (выполняющихся) запросов.
|
|
37
|
+
* @en Counter of active (in-flight) requests.
|
|
38
|
+
*/
|
|
8
39
|
private activeRequests;
|
|
9
|
-
|
|
40
|
+
/**
|
|
41
|
+
* @ru Очередь запросов, ожидающих свободного слота при достижении лимита параллелизма.
|
|
42
|
+
* @en Queue of requests waiting for a free slot when concurrency limit is reached.
|
|
43
|
+
*/
|
|
44
|
+
private concurrencyQueue;
|
|
45
|
+
/**
|
|
46
|
+
* @ru Индекс начала очереди (для FIFO обработки).
|
|
47
|
+
* @en Queue head index (for FIFO processing).
|
|
48
|
+
*/
|
|
10
49
|
private queueHead;
|
|
11
|
-
|
|
50
|
+
/**
|
|
51
|
+
* @ru Индекс конца очереди (для добавления новых элементов).
|
|
52
|
+
* @en Queue tail index (for adding new elements).
|
|
53
|
+
*/
|
|
54
|
+
private queueTail;
|
|
55
|
+
/**
|
|
56
|
+
* @ru Максимальное количество одновременных запросов (0 = без лимита).
|
|
57
|
+
* @en Maximum number of concurrent requests (0 = unlimited).
|
|
58
|
+
*/
|
|
12
59
|
private _maxConcurrent;
|
|
60
|
+
/**
|
|
61
|
+
* @ru Таймаут запроса в миллисекундах (0 = без таймаута).
|
|
62
|
+
* @en Request timeout in milliseconds (0 = no timeout).
|
|
63
|
+
*/
|
|
13
64
|
private _timeout;
|
|
14
|
-
|
|
65
|
+
/**
|
|
66
|
+
* @ru Флаг использования keep-alive соединений.
|
|
67
|
+
* @en Flag for using keep-alive connections.
|
|
68
|
+
*/
|
|
15
69
|
private _keepalive;
|
|
70
|
+
/**
|
|
71
|
+
* @ru Конфигурация TLS (отклонение невалидных сертификатов и шифры).
|
|
72
|
+
* @en TLS configuration (reject unauthorized certificates and ciphers).
|
|
73
|
+
*/
|
|
16
74
|
private _tlsConfig;
|
|
17
|
-
|
|
75
|
+
/**
|
|
76
|
+
* @ru Создаёт экземпляр BunTransport.
|
|
77
|
+
* @en Creates a BunTransport instance.
|
|
78
|
+
* @param config - Transport configuration.
|
|
79
|
+
*/
|
|
80
|
+
constructor(config: BunTransportConfig);
|
|
81
|
+
/**
|
|
82
|
+
* @ru Обновляет внутреннее состояние на основе конфигурации.
|
|
83
|
+
* Вызывается при создании и может быть вызвано при изменении конфига.
|
|
84
|
+
* @en Updates internal state based on configuration.
|
|
85
|
+
* Called on creation and can be called when config changes.
|
|
86
|
+
*/
|
|
18
87
|
private invalidateConfig;
|
|
88
|
+
/**
|
|
89
|
+
* @ru Выполняет HTTP-запрос через нативный fetch Bun с управлением параллелизмом и таймаутами.
|
|
90
|
+
* @en Executes an HTTP request via Bun's native fetch with concurrency management and timeouts.
|
|
91
|
+
* @param req - The normalized transport request.
|
|
92
|
+
* @returns Promise resolving to the transport response.
|
|
93
|
+
* @throws Error if the request is aborted or times out.
|
|
94
|
+
*/
|
|
19
95
|
execute(req: TransportRequest): Promise<TransportResponse>;
|
|
96
|
+
/**
|
|
97
|
+
* @ru Получает строку cookies для указанного домена с учётом родительских доменов.
|
|
98
|
+
* @en Gets the cookie string for the specified domain, considering parent domains.
|
|
99
|
+
* @param requestDomain - The domain to get cookies for.
|
|
100
|
+
* @returns Semicolon-separated cookie string.
|
|
101
|
+
*/
|
|
102
|
+
private getCookiesForDomain;
|
|
103
|
+
/**
|
|
104
|
+
* @ru Сохраняет cookies из заголовков Set-Cookie ответа в cookie jar.
|
|
105
|
+
* @en Stores cookies from response Set-Cookie headers into the cookie jar.
|
|
106
|
+
* @param requestUrl - The request URL for determining the default domain.
|
|
107
|
+
* @param headers - Response headers containing Set-Cookie values.
|
|
108
|
+
*/
|
|
109
|
+
private storeCookies;
|
|
110
|
+
/**
|
|
111
|
+
* @ru Ожидает освобождения слота в очереди параллелизма.
|
|
112
|
+
* @en Waits for a slot to become available in the concurrency queue.
|
|
113
|
+
* @param signal - Optional abort signal to cancel waiting.
|
|
114
|
+
* @returns Promise that resolves when a slot is available.
|
|
115
|
+
* @throws Error if the signal is aborted while waiting.
|
|
116
|
+
*/
|
|
20
117
|
private waitForSlot;
|
|
118
|
+
/**
|
|
119
|
+
* @ru Освобождает слот и разблокирует следующий запрос в очереди.
|
|
120
|
+
* @en Releases a slot and unblocks the next request in the queue.
|
|
121
|
+
*/
|
|
21
122
|
private releaseSlot;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
123
|
+
/**
|
|
124
|
+
* @ru Мягко закрывает транспорт, очищая очереди и cookie jar.
|
|
125
|
+
* @en Gracefully closes the transport, clearing queues and cookie jar.
|
|
126
|
+
* @returns Promise that resolves when cleanup is complete.
|
|
127
|
+
*/
|
|
26
128
|
close(): Promise<void>;
|
|
129
|
+
/**
|
|
130
|
+
* @ru Принудительно уничтожает транспорт (алиас для close()).
|
|
131
|
+
* @en Forcefully destroys the transport (alias for close()).
|
|
132
|
+
* @returns Promise that resolves when cleanup is complete.
|
|
133
|
+
*/
|
|
27
134
|
destroy(): Promise<void>;
|
|
28
135
|
}
|
|
29
136
|
//# sourceMappingURL=bun.d.ts.map
|
package/bun.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bun.d.ts","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,
|
|
1
|
+
{"version":3,"file":"bun.d.ts","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EAIlB,MAAM,iBAAiB,CAAC;AACzB,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAgI3D;;;;;GAKG;AACH,qBAAa,YAAa,YAAW,cAAc;IACjD;;;OAGG;IACI,MAAM,EAAE,kBAAkB,CAAC;IAElC;;;OAGG;IACH,OAAO,CAAC,SAAS,CAA+D;IAEhF;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAgB;IAE9C;;;OAGG;IACH,OAAO,CAAC,WAAW,CAA+C;IAElE;;;OAGG;IACH,OAAO,CAAC,eAAe,CAAK;IAE5B;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAK;IAE3B;;;OAGG;IACH,OAAO,CAAC,gBAAgB,CAAmD;IAE3E;;;OAGG;IACH,OAAO,CAAC,SAAS,CAAK;IAEtB;;;OAGG;IACH,OAAO,CAAC,SAAS,CAAK;IAEtB;;;OAGG;IACH,OAAO,CAAC,cAAc,CAAK;IAE3B;;;OAGG;IACH,OAAO,CAAC,QAAQ,CAAK;IAErB;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAS;IAE3B;;;OAGG;IACH,OAAO,CAAC,UAAU,CAAkE;IAEpF;;;;OAIG;gBACS,MAAM,EAAE,kBAAkB;IAKtC;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IAQxB;;;;;;OAMG;IACU,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAoHvE;;;;;OAKG;IACH,OAAO,CAAC,mBAAmB;IAgC3B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAwDpB;;;;;;OAMG;YACW,WAAW;IAmBzB;;;OAGG;IACH,OAAO,CAAC,WAAW;IAkBnB;;;;OAIG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC;;;;OAIG;IACU,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAGtC"}
|
package/bun.js
CHANGED
|
@@ -1,294 +1,468 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
1
|
+
import { fastGetHostname, getAbortError, normalizeBody, normalizeHeaders, resolveUrl, TIMEOUT_ERROR, } from "./utils/helpers.js";
|
|
2
|
+
/**
|
|
3
|
+
* @ru Статические пресеты браузерных заголовков для маскировки под реальных пользователей.
|
|
4
|
+
* Используются stealth-режимом для обхода fingerprint-защит.
|
|
5
|
+
* @en Static presets of browser headers for masking as real users.
|
|
6
|
+
* Used by stealth mode to bypass fingerprint protections.
|
|
7
|
+
*/
|
|
8
|
+
const STEALTH_HEADER_PRESETS = {
|
|
9
|
+
chrome: {
|
|
10
|
+
"sec-ch-ua": '"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',
|
|
11
|
+
"sec-ch-ua-mobile": "?0",
|
|
12
|
+
"sec-ch-ua-platform": '"Linux"',
|
|
13
|
+
"sec-fetch-dest": "document",
|
|
14
|
+
"sec-fetch-mode": "navigate",
|
|
15
|
+
"sec-fetch-site": "none",
|
|
16
|
+
"sec-fetch-user": "?1",
|
|
17
|
+
"upgrade-insecure-requests": "1",
|
|
18
|
+
"accept-language": "en-US,en;q=0.9",
|
|
19
|
+
},
|
|
20
|
+
firefox: {
|
|
21
|
+
"sec-fetch-dest": "document",
|
|
22
|
+
"sec-fetch-mode": "navigate",
|
|
23
|
+
"sec-fetch-site": "none",
|
|
24
|
+
"accept-language": "en-US,en;q=0.5",
|
|
25
|
+
"upgrade-insecure-requests": "1",
|
|
26
|
+
},
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* @ru Пресеты User-Agent, соответствующие TLS-отпечаткам (JA3/JA4).
|
|
30
|
+
* @en User-Agent presets matching the TLS fingerprints (JA3/JA4).
|
|
31
|
+
*/
|
|
32
|
+
const STEALTH_UA_PRESETS = {
|
|
33
|
+
chrome: "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",
|
|
34
|
+
firefox: "Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0",
|
|
35
|
+
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",
|
|
36
|
+
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",
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* @ru Возвращает строку шифров TLS для указанного профиля браузера.
|
|
40
|
+
* @en Returns the TLS cipher suite string for the specified browser profile.
|
|
41
|
+
* @param fingerprint - Browser fingerprint profile.
|
|
42
|
+
* @returns Colon-separated cipher suite string, or empty string if not found.
|
|
43
|
+
*/
|
|
44
|
+
function getCiphersForProfile(fingerprint) {
|
|
45
|
+
if (!fingerprint)
|
|
46
|
+
return "";
|
|
47
|
+
switch (fingerprint) {
|
|
48
|
+
case "chrome":
|
|
49
|
+
case "edge":
|
|
50
|
+
return [
|
|
51
|
+
"TLS_AES_128_GCM_SHA256",
|
|
52
|
+
"TLS_AES_256_GCM_SHA384",
|
|
53
|
+
"TLS_CHACHA20_POLY1305_SHA256",
|
|
54
|
+
"ECDHE-ECDSA-AES128-GCM-SHA256",
|
|
55
|
+
"ECDHE-RSA-AES128-GCM-SHA256",
|
|
56
|
+
].join(":");
|
|
57
|
+
case "firefox":
|
|
58
|
+
return [
|
|
59
|
+
"TLS_AES_128_GCM_SHA256",
|
|
60
|
+
"TLS_CHACHA20_POLY1305_SHA256",
|
|
61
|
+
"TLS_AES_256_GCM_SHA384",
|
|
62
|
+
"ECDHE-ECDSA-AES128-GCM-SHA256",
|
|
63
|
+
"ECDHE-RSA-AES128-GCM-SHA256",
|
|
64
|
+
].join(":");
|
|
65
|
+
case "safari":
|
|
66
|
+
return [
|
|
67
|
+
"TLS_AES_256_GCM_SHA384",
|
|
68
|
+
"TLS_CHACHA20_POLY1305_SHA256",
|
|
69
|
+
"TLS_AES_128_GCM_SHA256",
|
|
70
|
+
"ECDHE-ECDSA-AES256-GCM-SHA384",
|
|
71
|
+
"ECDHE-RSA-AES256-GCM-SHA384",
|
|
72
|
+
].join(":");
|
|
73
|
+
default:
|
|
74
|
+
return "";
|
|
25
75
|
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* @ru Безопасно применяет стелс-пресеты, отдавая абсолютный приоритет ручным заголовкам.
|
|
79
|
+
* @en Safely applies stealth presets, giving absolute priority to manual headers.
|
|
80
|
+
* @param headers - The headers object to modify.
|
|
81
|
+
* @param stealth - Stealth configuration options.
|
|
82
|
+
* @returns The modified headers object.
|
|
83
|
+
*/
|
|
84
|
+
function applyStealthHeaders(headers, stealth) {
|
|
85
|
+
if (!stealth || !stealth.fingerprint)
|
|
86
|
+
return headers;
|
|
87
|
+
const presetName = stealth.fingerprint;
|
|
88
|
+
const presetHeaders = STEALTH_HEADER_PRESETS[presetName];
|
|
89
|
+
if (presetHeaders) {
|
|
90
|
+
for (const key in presetHeaders) {
|
|
91
|
+
if (headers[key] === undefined) {
|
|
92
|
+
headers[key] = presetHeaders[key];
|
|
93
|
+
}
|
|
30
94
|
}
|
|
31
95
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const
|
|
35
|
-
if (
|
|
36
|
-
|
|
37
|
-
break;
|
|
96
|
+
const currentUA = headers["user-agent"];
|
|
97
|
+
if (currentUA === undefined || currentUA === "hyperttp/2.0" || currentUA === "Hyperttp/2.0") {
|
|
98
|
+
const browserUA = STEALTH_UA_PRESETS[presetName];
|
|
99
|
+
if (browserUA) {
|
|
100
|
+
headers["user-agent"] = browserUA;
|
|
38
101
|
}
|
|
39
102
|
}
|
|
40
|
-
|
|
41
|
-
if (atIdx !== -1 && atIdx < end) {
|
|
42
|
-
start = atIdx + 1;
|
|
43
|
-
}
|
|
44
|
-
const colonIdx = url.indexOf(":", start);
|
|
45
|
-
if (colonIdx !== -1 && colonIdx < end) {
|
|
46
|
-
end = colonIdx;
|
|
47
|
-
}
|
|
48
|
-
const host = url.slice(start, end) || "localhost";
|
|
49
|
-
if (hostnameCache.size > 512) {
|
|
50
|
-
hostnameCache.clear();
|
|
51
|
-
}
|
|
52
|
-
hostnameCache.set(url, host);
|
|
53
|
-
return host;
|
|
54
|
-
}
|
|
55
|
-
export function getAbortError(signal) {
|
|
56
|
-
return (signal?.reason ??
|
|
57
|
-
new DOMException("The operation was aborted.", "AbortError"));
|
|
103
|
+
return headers;
|
|
58
104
|
}
|
|
105
|
+
/**
|
|
106
|
+
* @ru Высокопроизводительный HTTP-транспорт для Bun с нативными оптимизациями и поддержкой Stealth-мимикрии.
|
|
107
|
+
* Включает управление параллелизмом, cookie jar и кэширование доменов.
|
|
108
|
+
* @en High-performance HTTP transport for Bun with native optimizations and Stealth mimicry support.
|
|
109
|
+
* Includes concurrency management, cookie jar, and domain caching.
|
|
110
|
+
*/
|
|
59
111
|
export class BunTransport {
|
|
112
|
+
/**
|
|
113
|
+
* @ru Конфигурация транспорта.
|
|
114
|
+
* @en Transport configuration.
|
|
115
|
+
*/
|
|
60
116
|
config;
|
|
61
|
-
|
|
62
|
-
|
|
117
|
+
/**
|
|
118
|
+
* @ru Хранилище cookies по доменам (domain -> name -> value).
|
|
119
|
+
* @en Cookie storage by domain (domain -> name -> value).
|
|
120
|
+
*/
|
|
121
|
+
cookieJar = Object.create(null);
|
|
122
|
+
/**
|
|
123
|
+
* @ru Список всех доменов, для которых хранятся cookies.
|
|
124
|
+
* @en List of all domains for which cookies are stored.
|
|
125
|
+
*/
|
|
126
|
+
cookieDomains = [];
|
|
127
|
+
/**
|
|
128
|
+
* @ru Кэш сгенерированных строк cookies для быстрого доступа.
|
|
129
|
+
* @en Cache of generated cookie strings for fast access.
|
|
130
|
+
*/
|
|
131
|
+
cookieCache = Object.create(null);
|
|
132
|
+
/**
|
|
133
|
+
* @ru Текущий размер кэша cookies.
|
|
134
|
+
* @en Current size of the cookie cache.
|
|
135
|
+
*/
|
|
136
|
+
cookieCacheSize = 0;
|
|
137
|
+
/**
|
|
138
|
+
* @ru Счётчик активных (выполняющихся) запросов.
|
|
139
|
+
* @en Counter of active (in-flight) requests.
|
|
140
|
+
*/
|
|
63
141
|
activeRequests = 0;
|
|
64
|
-
|
|
142
|
+
/**
|
|
143
|
+
* @ru Очередь запросов, ожидающих свободного слота при достижении лимита параллелизма.
|
|
144
|
+
* @en Queue of requests waiting for a free slot when concurrency limit is reached.
|
|
145
|
+
*/
|
|
146
|
+
concurrencyQueue = Object.create(null);
|
|
147
|
+
/**
|
|
148
|
+
* @ru Индекс начала очереди (для FIFO обработки).
|
|
149
|
+
* @en Queue head index (for FIFO processing).
|
|
150
|
+
*/
|
|
65
151
|
queueHead = 0;
|
|
66
|
-
|
|
152
|
+
/**
|
|
153
|
+
* @ru Индекс конца очереди (для добавления новых элементов).
|
|
154
|
+
* @en Queue tail index (for adding new elements).
|
|
155
|
+
*/
|
|
156
|
+
queueTail = 0;
|
|
157
|
+
/**
|
|
158
|
+
* @ru Максимальное количество одновременных запросов (0 = без лимита).
|
|
159
|
+
* @en Maximum number of concurrent requests (0 = unlimited).
|
|
160
|
+
*/
|
|
67
161
|
_maxConcurrent = 0;
|
|
162
|
+
/**
|
|
163
|
+
* @ru Таймаут запроса в миллисекундах (0 = без таймаута).
|
|
164
|
+
* @en Request timeout in milliseconds (0 = no timeout).
|
|
165
|
+
*/
|
|
68
166
|
_timeout = 0;
|
|
69
|
-
|
|
167
|
+
/**
|
|
168
|
+
* @ru Флаг использования keep-alive соединений.
|
|
169
|
+
* @en Flag for using keep-alive connections.
|
|
170
|
+
*/
|
|
70
171
|
_keepalive = false;
|
|
71
|
-
|
|
172
|
+
/**
|
|
173
|
+
* @ru Конфигурация TLS (отклонение невалидных сертификатов и шифры).
|
|
174
|
+
* @en TLS configuration (reject unauthorized certificates and ciphers).
|
|
175
|
+
*/
|
|
176
|
+
_tlsConfig = null;
|
|
177
|
+
/**
|
|
178
|
+
* @ru Создаёт экземпляр BunTransport.
|
|
179
|
+
* @en Creates a BunTransport instance.
|
|
180
|
+
* @param config - Transport configuration.
|
|
181
|
+
*/
|
|
72
182
|
constructor(config) {
|
|
73
183
|
this.config = config;
|
|
74
184
|
this.invalidateConfig();
|
|
75
185
|
}
|
|
186
|
+
/**
|
|
187
|
+
* @ru Обновляет внутреннее состояние на основе конфигурации.
|
|
188
|
+
* Вызывается при создании и может быть вызвано при изменении конфига.
|
|
189
|
+
* @en Updates internal state based on configuration.
|
|
190
|
+
* Called on creation and can be called when config changes.
|
|
191
|
+
*/
|
|
76
192
|
invalidateConfig() {
|
|
77
|
-
const net = this.config
|
|
193
|
+
const net = this.config?.network;
|
|
78
194
|
this._maxConcurrent = net?.maxConcurrent ?? 0;
|
|
79
195
|
this._timeout = net?.timeout ?? 0;
|
|
80
|
-
this._userAgent = net?.userAgent;
|
|
81
196
|
this._keepalive = !!net?.keepAliveTimeout;
|
|
82
|
-
this._tlsConfig =
|
|
197
|
+
this._tlsConfig = (net?.rejectUnauthorized ?? true) ? null : { rejectUnauthorized: false };
|
|
83
198
|
}
|
|
199
|
+
/**
|
|
200
|
+
* @ru Выполняет HTTP-запрос через нативный fetch Bun с управлением параллелизмом и таймаутами.
|
|
201
|
+
* @en Executes an HTTP request via Bun's native fetch with concurrency management and timeouts.
|
|
202
|
+
* @param req - The normalized transport request.
|
|
203
|
+
* @returns Promise resolving to the transport response.
|
|
204
|
+
* @throws Error if the request is aborted or times out.
|
|
205
|
+
*/
|
|
84
206
|
async execute(req) {
|
|
85
207
|
const maxConcurrent = this._maxConcurrent;
|
|
86
208
|
const timeoutMs = this._timeout;
|
|
87
209
|
let signal = req.signal;
|
|
210
|
+
let timer = null;
|
|
88
211
|
if (timeoutMs > 0) {
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
212
|
+
if (!signal) {
|
|
213
|
+
signal = AbortSignal.timeout(timeoutMs);
|
|
214
|
+
}
|
|
215
|
+
else if (signal.aborted) {
|
|
216
|
+
throw getAbortError(signal);
|
|
217
|
+
}
|
|
218
|
+
else {
|
|
219
|
+
const controller = new AbortController();
|
|
220
|
+
const originalSignal = signal;
|
|
221
|
+
originalSignal.addEventListener("abort", () => controller.abort(originalSignal.reason), {
|
|
222
|
+
once: true,
|
|
223
|
+
});
|
|
224
|
+
timer = setTimeout(() => controller.abort(TIMEOUT_ERROR), timeoutMs);
|
|
225
|
+
signal = controller.signal;
|
|
226
|
+
}
|
|
93
227
|
}
|
|
94
228
|
if (signal?.aborted)
|
|
95
229
|
throw getAbortError(signal);
|
|
96
230
|
if (maxConcurrent > 0 && this.activeRequests >= maxConcurrent) {
|
|
97
231
|
await this.waitForSlot(signal);
|
|
232
|
+
if (signal?.aborted)
|
|
233
|
+
throw getAbortError(signal);
|
|
98
234
|
}
|
|
99
|
-
if (signal?.aborted)
|
|
100
|
-
throw getAbortError(signal);
|
|
101
235
|
this.activeRequests++;
|
|
102
236
|
try {
|
|
237
|
+
const fullUrl = resolveUrl(this.config?.baseUrl ?? "", req.url);
|
|
238
|
+
let headers = normalizeHeaders(req.headers);
|
|
239
|
+
const requestDomain = fastGetHostname(fullUrl);
|
|
240
|
+
const activeCookies = this.getCookiesForDomain(requestDomain);
|
|
241
|
+
if (activeCookies.length > 0) {
|
|
242
|
+
headers["cookie"] = headers["cookie"]
|
|
243
|
+
? headers["cookie"] + "; " + activeCookies
|
|
244
|
+
: activeCookies;
|
|
245
|
+
}
|
|
246
|
+
const stealth = req.stealth || this.config.stealth ? { ...this.config.stealth, ...req.stealth } : undefined;
|
|
247
|
+
if (stealth) {
|
|
248
|
+
headers = applyStealthHeaders(headers, stealth);
|
|
249
|
+
}
|
|
103
250
|
const init = {
|
|
104
251
|
method: req.method,
|
|
105
|
-
headers: this.prepareHeaders(req),
|
|
106
|
-
body: req.body,
|
|
107
|
-
signal,
|
|
108
|
-
keepalive: this._keepalive,
|
|
109
252
|
redirect: "manual",
|
|
110
|
-
|
|
253
|
+
headers: headers,
|
|
111
254
|
};
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
255
|
+
if (req.body !== undefined)
|
|
256
|
+
init.body = normalizeBody(req.body);
|
|
257
|
+
if (signal !== undefined)
|
|
258
|
+
init.signal = signal;
|
|
259
|
+
if (this._keepalive)
|
|
260
|
+
init.keepalive = true;
|
|
261
|
+
let requestTlsConfig = this._tlsConfig;
|
|
262
|
+
if (stealth?.ciphers || stealth?.fingerprint) {
|
|
263
|
+
const ciphers = stealth.ciphers ?? getCiphersForProfile(stealth.fingerprint);
|
|
264
|
+
if (ciphers) {
|
|
265
|
+
requestTlsConfig = requestTlsConfig
|
|
266
|
+
? { ...requestTlsConfig, ciphers }
|
|
267
|
+
: { rejectUnauthorized: true, ciphers };
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
if (requestTlsConfig !== null)
|
|
271
|
+
init.tls = requestTlsConfig;
|
|
272
|
+
const nativeRes = await fetch(fullUrl, init);
|
|
273
|
+
if (timer !== null) {
|
|
274
|
+
clearTimeout(timer);
|
|
275
|
+
timer = null;
|
|
115
276
|
}
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
277
|
+
this.storeCookies(fullUrl, nativeRes.headers);
|
|
278
|
+
const bodyStream = nativeRes.body;
|
|
279
|
+
if (bodyStream !== null && typeof bodyStream.dump !== "function") {
|
|
280
|
+
Object.defineProperty(bodyStream, "dump", {
|
|
281
|
+
value: function () {
|
|
282
|
+
return this.cancel();
|
|
283
|
+
},
|
|
284
|
+
enumerable: false,
|
|
285
|
+
configurable: true,
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
const responseHeaders = (() => {
|
|
289
|
+
const resH = Object.create(null);
|
|
290
|
+
nativeRes.headers.forEach((value, key) => {
|
|
291
|
+
resH[key.toLowerCase()] = value;
|
|
292
|
+
});
|
|
293
|
+
return resH;
|
|
294
|
+
})();
|
|
124
295
|
return {
|
|
125
296
|
status: nativeRes.status,
|
|
126
|
-
headers,
|
|
127
297
|
url: nativeRes.url,
|
|
128
|
-
body,
|
|
298
|
+
body: bodyStream,
|
|
299
|
+
headers: responseHeaders,
|
|
129
300
|
};
|
|
130
301
|
}
|
|
302
|
+
catch (err) {
|
|
303
|
+
if (timer !== null)
|
|
304
|
+
clearTimeout(timer);
|
|
305
|
+
throw err;
|
|
306
|
+
}
|
|
131
307
|
finally {
|
|
132
308
|
this.activeRequests--;
|
|
133
|
-
if (maxConcurrent > 0)
|
|
309
|
+
if (maxConcurrent > 0)
|
|
134
310
|
this.releaseSlot();
|
|
311
|
+
}
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* @ru Получает строку cookies для указанного домена с учётом родительских доменов.
|
|
315
|
+
* @en Gets the cookie string for the specified domain, considering parent domains.
|
|
316
|
+
* @param requestDomain - The domain to get cookies for.
|
|
317
|
+
* @returns Semicolon-separated cookie string.
|
|
318
|
+
*/
|
|
319
|
+
getCookiesForDomain(requestDomain) {
|
|
320
|
+
const cached = this.cookieCache[requestDomain];
|
|
321
|
+
if (cached !== undefined)
|
|
322
|
+
return cached;
|
|
323
|
+
let result = "";
|
|
324
|
+
const domainsLen = this.cookieDomains.length;
|
|
325
|
+
for (let i = 0; i < domainsLen; i++) {
|
|
326
|
+
const storedDomain = this.cookieDomains[i];
|
|
327
|
+
if (!storedDomain)
|
|
328
|
+
continue;
|
|
329
|
+
if (requestDomain !== storedDomain && !requestDomain.endsWith("." + storedDomain))
|
|
330
|
+
continue;
|
|
331
|
+
const cookiesMap = this.cookieJar[storedDomain];
|
|
332
|
+
if (!cookiesMap)
|
|
333
|
+
continue;
|
|
334
|
+
for (const key in cookiesMap) {
|
|
335
|
+
if (result.length > 0)
|
|
336
|
+
result += "; ";
|
|
337
|
+
result += key + "=" + cookiesMap[key];
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
if (this.cookieCacheSize > 1024) {
|
|
341
|
+
this.cookieCache = Object.create(null);
|
|
342
|
+
this.cookieCacheSize = 0;
|
|
343
|
+
}
|
|
344
|
+
this.cookieCache[requestDomain] = result;
|
|
345
|
+
this.cookieCacheSize++;
|
|
346
|
+
return result;
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* @ru Сохраняет cookies из заголовков Set-Cookie ответа в cookie jar.
|
|
350
|
+
* @en Stores cookies from response Set-Cookie headers into the cookie jar.
|
|
351
|
+
* @param requestUrl - The request URL for determining the default domain.
|
|
352
|
+
* @param headers - Response headers containing Set-Cookie values.
|
|
353
|
+
*/
|
|
354
|
+
storeCookies(requestUrl, headers) {
|
|
355
|
+
if (typeof headers.getSetCookie !== "function")
|
|
356
|
+
return;
|
|
357
|
+
const setCookies = headers.getSetCookie();
|
|
358
|
+
if (setCookies.length === 0)
|
|
359
|
+
return;
|
|
360
|
+
const defaultDomain = fastGetHostname(requestUrl);
|
|
361
|
+
let hasChanges = false;
|
|
362
|
+
for (let i = 0; i < setCookies.length; i++) {
|
|
363
|
+
const rawCookie = setCookies[i];
|
|
364
|
+
if (!rawCookie)
|
|
365
|
+
continue;
|
|
366
|
+
const firstSemicolon = rawCookie.indexOf(";");
|
|
367
|
+
const mainPair = firstSemicolon === -1 ? rawCookie : rawCookie.slice(0, firstSemicolon);
|
|
368
|
+
const eqIdx = mainPair.indexOf("=");
|
|
369
|
+
if (eqIdx === -1)
|
|
370
|
+
continue;
|
|
371
|
+
const name = mainPair.slice(0, eqIdx).trim();
|
|
372
|
+
const value = mainPair.slice(eqIdx + 1).trim();
|
|
373
|
+
if (!name)
|
|
374
|
+
continue;
|
|
375
|
+
let domain = defaultDomain;
|
|
376
|
+
if (firstSemicolon !== -1) {
|
|
377
|
+
const parts = rawCookie.split(";");
|
|
378
|
+
for (let j = 1; j < parts.length; j++) {
|
|
379
|
+
const part = parts[j].trim();
|
|
380
|
+
if (part.length > 7 && part.toLowerCase().startsWith("domain=")) {
|
|
381
|
+
const rawDomain = part.slice(7).trim();
|
|
382
|
+
if (rawDomain) {
|
|
383
|
+
domain = rawDomain.charCodeAt(0) === 46 ? rawDomain.slice(1) : rawDomain;
|
|
384
|
+
}
|
|
385
|
+
break;
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (this.cookieJar[domain] === undefined) {
|
|
390
|
+
this.cookieJar[domain] = Object.create(null);
|
|
391
|
+
if (!this.cookieDomains.includes(domain)) {
|
|
392
|
+
this.cookieDomains.push(domain);
|
|
393
|
+
}
|
|
135
394
|
}
|
|
395
|
+
this.cookieJar[domain][name] = value;
|
|
396
|
+
hasChanges = true;
|
|
397
|
+
}
|
|
398
|
+
if (hasChanges) {
|
|
399
|
+
this.cookieCache = Object.create(null);
|
|
400
|
+
this.cookieCacheSize = 0;
|
|
136
401
|
}
|
|
137
402
|
}
|
|
403
|
+
/**
|
|
404
|
+
* @ru Ожидает освобождения слота в очереди параллелизма.
|
|
405
|
+
* @en Waits for a slot to become available in the concurrency queue.
|
|
406
|
+
* @param signal - Optional abort signal to cancel waiting.
|
|
407
|
+
* @returns Promise that resolves when a slot is available.
|
|
408
|
+
* @throws Error if the signal is aborted while waiting.
|
|
409
|
+
*/
|
|
138
410
|
async waitForSlot(signal) {
|
|
139
411
|
return new Promise((resolve, reject) => {
|
|
412
|
+
const currentTail = this.queueTail++;
|
|
140
413
|
const onAbort = () => {
|
|
141
414
|
signal?.removeEventListener("abort", onAbort);
|
|
415
|
+
delete this.concurrencyQueue[currentTail];
|
|
142
416
|
reject(getAbortError(signal));
|
|
143
417
|
};
|
|
144
|
-
if (signal)
|
|
418
|
+
if (signal)
|
|
145
419
|
signal.addEventListener("abort", onAbort, { once: true });
|
|
146
|
-
|
|
147
|
-
this.concurrencyQueue.push(() => {
|
|
420
|
+
this.concurrencyQueue[currentTail] = () => {
|
|
148
421
|
signal?.removeEventListener("abort", onAbort);
|
|
149
422
|
resolve();
|
|
150
|
-
}
|
|
423
|
+
};
|
|
151
424
|
});
|
|
152
425
|
}
|
|
426
|
+
/**
|
|
427
|
+
* @ru Освобождает слот и разблокирует следующий запрос в очереди.
|
|
428
|
+
* @en Releases a slot and unblocks the next request in the queue.
|
|
429
|
+
*/
|
|
153
430
|
releaseSlot() {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
431
|
+
while (this.queueHead < this.queueTail) {
|
|
432
|
+
const next = this.concurrencyQueue[this.queueHead];
|
|
433
|
+
if (next !== undefined) {
|
|
434
|
+
delete this.concurrencyQueue[this.queueHead];
|
|
435
|
+
this.queueHead++;
|
|
158
436
|
next();
|
|
159
|
-
|
|
437
|
+
return;
|
|
160
438
|
}
|
|
439
|
+
this.queueHead++;
|
|
161
440
|
}
|
|
162
|
-
if (this.queueHead ===
|
|
163
|
-
this.concurrencyQueue.length = 0;
|
|
164
|
-
this.queueHead = 0;
|
|
165
|
-
}
|
|
166
|
-
else if (this.queueHead > 128) {
|
|
167
|
-
this.concurrencyQueue.splice(0, this.queueHead);
|
|
441
|
+
if (this.queueHead === this.queueTail) {
|
|
168
442
|
this.queueHead = 0;
|
|
443
|
+
this.queueTail = 0;
|
|
169
444
|
}
|
|
170
445
|
}
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
const value = original[key];
|
|
177
|
-
if (value == null)
|
|
178
|
-
continue;
|
|
179
|
-
if (typeof value === "string") {
|
|
180
|
-
headers[key] = value;
|
|
181
|
-
}
|
|
182
|
-
else {
|
|
183
|
-
headers[key] =
|
|
184
|
-
key.length === 6 && (key === "Cookie" || key === "cookie")
|
|
185
|
-
? value.join("; ")
|
|
186
|
-
: value.join(", ");
|
|
187
|
-
}
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
const ua = this._userAgent;
|
|
191
|
-
if (ua !== undefined &&
|
|
192
|
-
headers["User-Agent"] === undefined &&
|
|
193
|
-
headers["user-agent"] === undefined) {
|
|
194
|
-
headers["User-Agent"] = ua;
|
|
195
|
-
}
|
|
196
|
-
if (!this.hasCookies) {
|
|
197
|
-
const userCookie = headers["Cookie"];
|
|
198
|
-
if (userCookie !== undefined) {
|
|
199
|
-
headers["Cookie"] = userCookie.trim();
|
|
200
|
-
}
|
|
201
|
-
return headers;
|
|
202
|
-
}
|
|
203
|
-
const domain = fastGetHostname(req.url);
|
|
204
|
-
const savedCookies = this.getCookiesForDomain(domain);
|
|
205
|
-
const hasSavedCookies = savedCookies.length > 0;
|
|
206
|
-
const userCookie = headers["Cookie"];
|
|
207
|
-
const hasUserCookie = userCookie !== undefined && userCookie.length > 0;
|
|
208
|
-
if (hasUserCookie && hasSavedCookies) {
|
|
209
|
-
headers["Cookie"] = `${userCookie.trim()}; ${savedCookies}`;
|
|
210
|
-
}
|
|
211
|
-
else if (hasUserCookie) {
|
|
212
|
-
headers["Cookie"] = userCookie.trim();
|
|
213
|
-
}
|
|
214
|
-
else if (hasSavedCookies) {
|
|
215
|
-
headers["Cookie"] = savedCookies;
|
|
216
|
-
}
|
|
217
|
-
return headers;
|
|
218
|
-
}
|
|
219
|
-
maybeStoreCookies(requestUrl, headers) {
|
|
220
|
-
const setCookies = headers.getSetCookie?.();
|
|
221
|
-
if (!setCookies || setCookies.length === 0)
|
|
222
|
-
return;
|
|
223
|
-
this.updateCookies(fastGetHostname(requestUrl), setCookies);
|
|
224
|
-
}
|
|
225
|
-
getCookiesForDomain(requestDomain) {
|
|
226
|
-
const cached = this.cookieCache.get(requestDomain);
|
|
227
|
-
if (cached !== undefined)
|
|
228
|
-
return cached;
|
|
229
|
-
const matchedCookies = [];
|
|
230
|
-
for (const [storedDomain, cookiesMap] of this.cookieJar) {
|
|
231
|
-
if (requestDomain === storedDomain ||
|
|
232
|
-
requestDomain.endsWith("." + storedDomain)) {
|
|
233
|
-
for (const [key, val] of cookiesMap) {
|
|
234
|
-
matchedCookies.push(`${key}=${val}`);
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
}
|
|
238
|
-
const result = matchedCookies.length > 0 ? matchedCookies.join("; ") : "";
|
|
239
|
-
this.cookieCache.set(requestDomain, result);
|
|
240
|
-
return result;
|
|
241
|
-
}
|
|
242
|
-
updateCookies(requestDomain, setCookies) {
|
|
243
|
-
this.hasCookies = true;
|
|
244
|
-
for (const cookieStr of setCookies) {
|
|
245
|
-
if (!cookieStr)
|
|
246
|
-
continue;
|
|
247
|
-
const parts = cookieStr.split(";");
|
|
248
|
-
const rawPair = parts[0];
|
|
249
|
-
if (!rawPair)
|
|
250
|
-
continue;
|
|
251
|
-
const equalIdx = rawPair.indexOf("=");
|
|
252
|
-
if (equalIdx === -1)
|
|
253
|
-
continue;
|
|
254
|
-
const key = rawPair.slice(0, equalIdx).trim();
|
|
255
|
-
const val = rawPair.slice(equalIdx + 1).trim();
|
|
256
|
-
if (!key)
|
|
257
|
-
continue;
|
|
258
|
-
let targetDomain = requestDomain;
|
|
259
|
-
for (let i = 1; i < parts.length; i++) {
|
|
260
|
-
const attr = parts[i];
|
|
261
|
-
if (!attr)
|
|
262
|
-
continue;
|
|
263
|
-
const trimmed = attr.trim();
|
|
264
|
-
if (trimmed.toLowerCase().startsWith("domain=")) {
|
|
265
|
-
let domVal = trimmed.slice(7).trim();
|
|
266
|
-
if (domVal.startsWith("."))
|
|
267
|
-
domVal = domVal.slice(1);
|
|
268
|
-
if (domVal)
|
|
269
|
-
targetDomain = domVal;
|
|
270
|
-
break;
|
|
271
|
-
}
|
|
272
|
-
}
|
|
273
|
-
let domainMap = this.cookieJar.get(targetDomain);
|
|
274
|
-
if (!domainMap) {
|
|
275
|
-
domainMap = new Map();
|
|
276
|
-
this.cookieJar.set(targetDomain, domainMap);
|
|
277
|
-
}
|
|
278
|
-
domainMap.set(key, val);
|
|
279
|
-
}
|
|
280
|
-
if (this.cookieCache.size > 0) {
|
|
281
|
-
this.cookieCache.clear();
|
|
282
|
-
}
|
|
283
|
-
}
|
|
446
|
+
/**
|
|
447
|
+
* @ru Мягко закрывает транспорт, очищая очереди и cookie jar.
|
|
448
|
+
* @en Gracefully closes the transport, clearing queues and cookie jar.
|
|
449
|
+
* @returns Promise that resolves when cleanup is complete.
|
|
450
|
+
*/
|
|
284
451
|
async close() {
|
|
285
|
-
this.concurrencyQueue
|
|
452
|
+
this.concurrencyQueue = Object.create(null);
|
|
286
453
|
this.queueHead = 0;
|
|
287
|
-
this.
|
|
288
|
-
this.
|
|
454
|
+
this.queueTail = 0;
|
|
455
|
+
this.cookieJar = Object.create(null);
|
|
456
|
+
this.cookieDomains.length = 0;
|
|
457
|
+
this.cookieCache = Object.create(null);
|
|
458
|
+
this.cookieCacheSize = 0;
|
|
289
459
|
this.activeRequests = 0;
|
|
290
|
-
this.hasCookies = false;
|
|
291
460
|
}
|
|
461
|
+
/**
|
|
462
|
+
* @ru Принудительно уничтожает транспорт (алиас для close()).
|
|
463
|
+
* @en Forcefully destroys the transport (alias for close()).
|
|
464
|
+
* @returns Promise that resolves when cleanup is complete.
|
|
465
|
+
*/
|
|
292
466
|
async destroy() {
|
|
293
467
|
await this.close();
|
|
294
468
|
}
|
package/bun.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bun.js","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"bun.js","sourceRoot":"","sources":["../src/bun.ts"],"names":[],"mappings":"AASA,OAAO,EACL,eAAe,EACf,aAAa,EACb,aAAa,EACb,gBAAgB,EAChB,UAAU,EACV,aAAa,GACd,MAAM,oBAAoB,CAAC;AAE5B;;;;;GAKG;AACH,MAAM,sBAAsB,GAA2C;IACrE,MAAM,EAAE;QACN,WAAW,EAAE,kEAAkE;QAC/E,kBAAkB,EAAE,IAAI;QACxB,oBAAoB,EAAE,SAAS;QAC/B,gBAAgB,EAAE,UAAU;QAC5B,gBAAgB,EAAE,UAAU;QAC5B,gBAAgB,EAAE,MAAM;QACxB,gBAAgB,EAAE,IAAI;QACtB,2BAA2B,EAAE,GAAG;QAChC,iBAAiB,EAAE,gBAAgB;KACpC;IACD,OAAO,EAAE;QACP,gBAAgB,EAAE,UAAU;QAC5B,gBAAgB,EAAE,UAAU;QAC5B,gBAAgB,EAAE,MAAM;QACxB,iBAAiB,EAAE,gBAAgB;QACnC,2BAA2B,EAAE,GAAG;KACjC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,kBAAkB,GAA2B;IACjD,MAAM,EACJ,uGAAuG;IACzG,OAAO,EAAE,iEAAiE;IAC1E,MAAM,EACJ,uHAAuH;IACzH,IAAI,EAAE,qHAAqH;CAC5H,CAAC;AAEF;;;;;GAKG;AACH,SAAS,oBAAoB,CAAC,WAAoC;IAChE,IAAI,CAAC,WAAW;QAAE,OAAO,EAAE,CAAC;IAE5B,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC;QACd,KAAK,MAAM;YACT,OAAO;gBACL,wBAAwB;gBACxB,wBAAwB;gBACxB,8BAA8B;gBAC9B,+BAA+B;gBAC/B,6BAA6B;aAC9B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEd,KAAK,SAAS;YACZ,OAAO;gBACL,wBAAwB;gBACxB,8BAA8B;gBAC9B,wBAAwB;gBACxB,+BAA+B;gBAC/B,6BAA6B;aAC9B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEd,KAAK,QAAQ;YACX,OAAO;gBACL,wBAAwB;gBACxB,8BAA8B;gBAC9B,wBAAwB;gBACxB,+BAA+B;gBAC/B,6BAA6B;aAC9B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAEd;YACE,OAAO,EAAE,CAAC;IACd,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAS,mBAAmB,CAC1B,OAA+B,EAC/B,OAAuB;IAEvB,IAAI,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,WAAW;QAAE,OAAO,OAAO,CAAC;IAErD,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC;IACvC,MAAM,aAAa,GAAG,sBAAsB,CAAC,UAAU,CAAC,CAAC;IAEzD,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,MAAM,GAAG,IAAI,aAAa,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,SAAS,EAAE,CAAC;gBAC/B,OAAO,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,GAAG,CAAE,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;QAC5F,MAAM,SAAS,GAAG,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACjD,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,YAAY,CAAC,GAAG,SAAS,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,YAAY;IACvB;;;OAGG;IACI,MAAM,CAAqB;IAElC;;;OAGG;IACK,SAAS,GAA2C,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEhF;;;OAGG;IACc,aAAa,GAAa,EAAE,CAAC;IAE9C;;;OAGG;IACK,WAAW,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAElE;;;OAGG;IACK,eAAe,GAAG,CAAC,CAAC;IAE5B;;;OAGG;IACK,cAAc,GAAG,CAAC,CAAC;IAE3B;;;OAGG;IACK,gBAAgB,GAA+B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAE3E;;;OAGG;IACK,SAAS,GAAG,CAAC,CAAC;IAEtB;;;OAGG;IACK,SAAS,GAAG,CAAC,CAAC;IAEtB;;;OAGG;IACK,cAAc,GAAG,CAAC,CAAC;IAE3B;;;OAGG;IACK,QAAQ,GAAG,CAAC,CAAC;IAErB;;;OAGG;IACK,UAAU,GAAG,KAAK,CAAC;IAE3B;;;OAGG;IACK,UAAU,GAA6D,IAAI,CAAC;IAEpF;;;;OAIG;IACH,YAAY,MAA0B;QACpC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,gBAAgB,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACK,gBAAgB;QACtB,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,GAAG,EAAE,aAAa,IAAI,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,GAAG,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC;QAClC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,GAAG,EAAE,gBAAgB,CAAC;QAC1C,IAAI,CAAC,UAAU,GAAG,CAAC,GAAG,EAAE,kBAAkB,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,kBAAkB,EAAE,KAAK,EAAE,CAAC;IAC7F,CAAC;IAED;;;;;;OAMG;IACI,KAAK,CAAC,OAAO,CAAC,GAAqB;QACxC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QAEhC,IAAI,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACxB,IAAI,KAAK,GAAyC,IAAI,CAAC;QAEvD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,IAAI,CAAC,MAAM,EAAE,CAAC;gBACZ,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC1C,CAAC;iBAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBAC1B,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;iBAAM,CAAC;gBACN,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,cAAc,GAAG,MAAM,CAAC;gBAE9B,cAAc,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE;oBACtF,IAAI,EAAE,IAAI;iBACX,CAAC,CAAC;gBACH,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE,SAAS,CAAC,CAAC;gBACrE,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC;YAC7B,CAAC;QACH,CAAC;QAED,IAAI,MAAM,EAAE,OAAO;YAAE,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QAEjD,IAAI,aAAa,GAAG,CAAC,IAAI,IAAI,CAAC,cAAc,IAAI,aAAa,EAAE,CAAC;YAC9D,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC/B,IAAI,MAAM,EAAE,OAAO;gBAAE,MAAM,aAAa,CAAC,MAAM,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,cAAc,EAAE,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;YAChE,IAAI,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,OAAO,CAA2B,CAAC;YAEtE,MAAM,aAAa,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAC/C,MAAM,aAAa,GAAG,IAAI,CAAC,mBAAmB,CAAC,aAAa,CAAC,CAAC;YAC9D,IAAI,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,OAAO,CAAC,QAAQ,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC;oBACnC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,GAAG,aAAa;oBAC1C,CAAC,CAAC,aAAa,CAAC;YACpB,CAAC;YAED,MAAM,OAAO,GACX,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;YAE9F,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAClD,CAAC;YAED,MAAM,IAAI,GAAoC;gBAC5C,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,QAAQ,EAAE,QAAQ;gBAClB,OAAO,EAAE,OAAsB;aAChC,CAAC;YAEF,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS;gBAAE,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAChE,IAAI,MAAM,KAAK,SAAS;gBAAE,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;YAC/C,IAAI,IAAI,CAAC,UAAU;gBAAE,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC;YAE3C,IAAI,gBAAgB,GAAG,IAAI,CAAC,UAAU,CAAC;YACvC,IAAI,OAAO,EAAE,OAAO,IAAI,OAAO,EAAE,WAAW,EAAE,CAAC;gBAC7C,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,oBAAoB,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;gBAC7E,IAAI,OAAO,EAAE,CAAC;oBACZ,gBAAgB,GAAG,gBAAgB;wBACjC,CAAC,CAAC,EAAE,GAAG,gBAAgB,EAAE,OAAO,EAAE;wBAClC,CAAC,CAAC,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC5C,CAAC;YACH,CAAC;YACD,IAAI,gBAAgB,KAAK,IAAI;gBAAE,IAAI,CAAC,GAAG,GAAG,gBAAgB,CAAC;YAE3D,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YAE7C,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;gBACnB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,KAAK,GAAG,IAAI,CAAC;YACf,CAAC;YAED,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,CAAC,CAAC;YAE9C,MAAM,UAAU,GAAG,SAAS,CAAC,IAAI,CAAC;YAClC,IAAI,UAAU,KAAK,IAAI,IAAI,OAAQ,UAAkB,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;gBAC1E,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE;oBACxC,KAAK,EAAE;wBACL,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;oBACvB,CAAC;oBACD,UAAU,EAAE,KAAK;oBACjB,YAAY,EAAE,IAAI;iBACnB,CAAC,CAAC;YACL,CAAC;YAED,MAAM,eAAe,GAAG,CAAC,GAAG,EAAE;gBAC5B,MAAM,IAAI,GAAsC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACpE,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;oBACvC,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;gBAClC,CAAC,CAAC,CAAC;gBACH,OAAO,IAAI,CAAC;YACd,CAAC,CAAC,EAAE,CAAC;YAEL,OAAO;gBACL,MAAM,EAAE,SAAS,CAAC,MAAM;gBACxB,GAAG,EAAE,SAAS,CAAC,GAAG;gBAClB,IAAI,EAAE,UAAiD;gBACvD,OAAO,EAAE,eAAe;aACzB,CAAC;QACJ,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,KAAK,KAAK,IAAI;gBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,EAAE,CAAC;YACtB,IAAI,aAAa,GAAG,CAAC;gBAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5C,CAAC;IACH,CAAC;IAED;;;;;OAKG;IACK,mBAAmB,CAAC,aAAqB;QAC/C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;QAC/C,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,MAAM,CAAC;QAExC,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC;QAE7C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;YACpC,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,CAAC,YAAY;gBAAE,SAAS;YAE5B,IAAI,aAAa,KAAK,YAAY,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,GAAG,GAAG,YAAY,CAAC;gBAAE,SAAS;YAE5F,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAChD,IAAI,CAAC,UAAU;gBAAE,SAAS;YAE1B,KAAK,MAAM,GAAG,IAAI,UAAU,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC;oBAAE,MAAM,IAAI,IAAI,CAAC;gBACtC,MAAM,IAAI,GAAG,GAAG,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,EAAE,CAAC;YAChC,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QAC3B,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,GAAG,MAAM,CAAC;QACzC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;;;OAKG;IACK,YAAY,CAAC,UAAkB,EAAE,OAAgB;QACvD,IAAI,OAAO,OAAO,CAAC,YAAY,KAAK,UAAU;YAAE,OAAO;QAEvD,MAAM,UAAU,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;QAC1C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEpC,MAAM,aAAa,GAAG,eAAe,CAAC,UAAU,CAAC,CAAC;QAClD,IAAI,UAAU,GAAG,KAAK,CAAC;QAEvB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAChC,IAAI,CAAC,SAAS;gBAAE,SAAS;YAEzB,MAAM,cAAc,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,cAAc,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,cAAc,CAAC,CAAC;YAExF,MAAM,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;YACpC,IAAI,KAAK,KAAK,CAAC,CAAC;gBAAE,SAAS;YAE3B,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;YAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/C,IAAI,CAAC,IAAI;gBAAE,SAAS;YAEpB,IAAI,MAAM,GAAG,aAAa,CAAC;YAE3B,IAAI,cAAc,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC1B,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;gBACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC,IAAI,EAAE,CAAC;oBAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;wBAChE,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;wBACvC,IAAI,SAAS,EAAE,CAAC;4BACd,MAAM,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;wBAC3E,CAAC;wBACD,MAAM;oBACR,CAAC;gBACH,CAAC;YACH,CAAC;YAED,IAAI,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,SAAS,EAAE,CAAC;gBACzC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBAC7C,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBACzC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAClC,CAAC;YACH,CAAC;YAED,IAAI,CAAC,SAAS,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;YACtC,UAAU,GAAG,IAAI,CAAC;QACpB,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;YACvC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED;;;;;;OAMG;IACK,KAAK,CAAC,WAAW,CAAC,MAAoB;QAC5C,OAAO,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YAErC,MAAM,OAAO,GAAG,GAAG,EAAE;gBACnB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9C,OAAO,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;gBAC1C,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;YAChC,CAAC,CAAC;YAEF,IAAI,MAAM;gBAAE,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YAEtE,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,GAAG,GAAG,EAAE;gBACxC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;gBAC9C,OAAO,EAAE,CAAC;YACZ,CAAC,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;;OAGG;IACK,WAAW;QACjB,OAAO,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;YACvC,MAAM,IAAI,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACnD,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC7C,IAAI,CAAC,SAAS,EAAE,CAAC;gBACjB,IAAI,EAAE,CAAC;gBACP,OAAO;YACT,CAAC;YACD,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,CAAC;QAED,IAAI,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;YACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,KAAK;QAChB,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC;QACnB,IAAI,CAAC,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,CAAC;QAC9B,IAAI,CAAC,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,CAAC,eAAe,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,cAAc,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED;;;;OAIG;IACI,KAAK,CAAC,OAAO;QAClB,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
|
package/index.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { BunTransport } from "./bun.js";
|
|
2
2
|
//# sourceMappingURL=index.d.ts.map
|
package/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
|
package/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { BunTransport } from "./bun.js";
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,22 +1,24 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hyperttp/transport-bun",
|
|
3
|
-
"version": "0.2.
|
|
4
|
-
"description": "High-performance
|
|
3
|
+
"version": "0.2.3",
|
|
4
|
+
"description": "High-performance HTTP transport for Bun with native fetch optimizations",
|
|
5
5
|
"type": "module",
|
|
6
|
+
"sideEffects": false,
|
|
7
|
+
"main": "./index.js",
|
|
8
|
+
"types": "./index.d.ts",
|
|
6
9
|
"exports": {
|
|
7
10
|
".": {
|
|
8
11
|
"types": "./index.d.ts",
|
|
9
|
-
"import": "./index.js"
|
|
10
|
-
|
|
11
|
-
},
|
|
12
|
-
"./package.json": "./package.json"
|
|
12
|
+
"import": "./index.js"
|
|
13
|
+
}
|
|
13
14
|
},
|
|
14
15
|
"keywords": [
|
|
15
16
|
"http",
|
|
16
|
-
"
|
|
17
|
+
"transport",
|
|
17
18
|
"high-performance",
|
|
18
19
|
"fetch",
|
|
19
|
-
"bun"
|
|
20
|
+
"bun",
|
|
21
|
+
"hyperttp"
|
|
20
22
|
],
|
|
21
23
|
"author": "dirold2",
|
|
22
24
|
"license": "MIT",
|
|
@@ -25,7 +27,7 @@
|
|
|
25
27
|
"url": "git+https://github.com/IT-IF-OR/hyperttp-transport-bun.git"
|
|
26
28
|
},
|
|
27
29
|
"peerDependencies": {
|
|
28
|
-
"@hyperttp/types": "^0.2.
|
|
30
|
+
"@hyperttp/types": "^0.2.3"
|
|
29
31
|
},
|
|
30
32
|
"private": false
|
|
31
33
|
}
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { HttpClientOptions, StealthOptions } from "@hyperttp/types";
|
|
2
|
+
/**
|
|
3
|
+
* @ru Конфигурация транспорта Bun.
|
|
4
|
+
* @en Bun transport configuration.
|
|
5
|
+
*/
|
|
6
|
+
export interface BunTransportConfig extends HttpClientOptions {
|
|
7
|
+
/**
|
|
8
|
+
* @ru Базовый URL для всех запросов.
|
|
9
|
+
* @en Base URL for all requests.
|
|
10
|
+
*/
|
|
11
|
+
baseUrl?: string;
|
|
12
|
+
/**
|
|
13
|
+
* @ru Параметры скрытности, эмуляции отпечатков TLS (JA3/JA4) и обхода систем DPI.
|
|
14
|
+
* @en Stealth options for TLS fingerprint emulation and DPI evasion strategies.
|
|
15
|
+
*/
|
|
16
|
+
stealth?: StealthOptions;
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEzE;;;GAGG;AACH,MAAM,WAAW,kBAAmB,SAAQ,iBAAiB;IAC3D;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B"}
|
package/types/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/types/index.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import type { TransportRequest } from "@hyperttp/types";
|
|
2
|
+
/**
|
|
3
|
+
* @ru Быстрое извлечение hostname из URL с кэшированием.
|
|
4
|
+
* @en Fast hostname extraction from URL with caching.
|
|
5
|
+
* @param url - The URL to extract hostname from.
|
|
6
|
+
* @returns The extracted hostname.
|
|
7
|
+
*/
|
|
8
|
+
export declare function fastGetHostname(url: string): string;
|
|
9
|
+
/**
|
|
10
|
+
* @ru Разрешает относительный URL относительно baseUrl.
|
|
11
|
+
* @en Resolves a relative URL against a baseUrl.
|
|
12
|
+
* @param baseUrl - The base URL.
|
|
13
|
+
* @param url - The URL to resolve.
|
|
14
|
+
* @returns The resolved absolute URL.
|
|
15
|
+
*/
|
|
16
|
+
export declare function resolveUrl(baseUrl: string, url: string): string;
|
|
17
|
+
/**
|
|
18
|
+
* @ru Кэшированные DOMException для частых ошибок abort/timeout.
|
|
19
|
+
* @en Cached DOMException for frequent abort/timeout errors.
|
|
20
|
+
*/
|
|
21
|
+
export declare const ABORT_ERROR: DOMException;
|
|
22
|
+
export declare const TIMEOUT_ERROR: DOMException;
|
|
23
|
+
/**
|
|
24
|
+
* @ru Извлекает причину abort из signal или возвращает кэшированную ошибку.
|
|
25
|
+
* @en Extracts abort reason from signal or returns cached error.
|
|
26
|
+
* @param signal - Optional abort signal.
|
|
27
|
+
* @returns The abort error or reason.
|
|
28
|
+
*/
|
|
29
|
+
export declare function getAbortError(signal?: AbortSignal): unknown;
|
|
30
|
+
/**
|
|
31
|
+
* @ru Нормализует тело запроса в формат, совместимый с fetch.
|
|
32
|
+
* @en Normalizes request body to fetch-compatible format.
|
|
33
|
+
* @param body - The request body to normalize.
|
|
34
|
+
* @returns The normalized body or undefined.
|
|
35
|
+
*/
|
|
36
|
+
export declare function normalizeBody(body: TransportRequest["body"]): BodyInit | undefined;
|
|
37
|
+
/**
|
|
38
|
+
* @ru Нормализует заголовки, переводя все ключи в нижний регистр (lowercase).
|
|
39
|
+
* @en Normalizes headers by transforming all keys into lowercase layout.
|
|
40
|
+
*/
|
|
41
|
+
export declare function normalizeHeaders(headers: TransportRequest["headers"]): Record<string, string>;
|
|
42
|
+
//# sourceMappingURL=helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAWxD;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAiDnD;AAED;;;;;;GAMG;AACH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAI/D;AAED;;;GAGG;AACH,eAAO,MAAM,WAAW,cAA+D,CAAC;AACxF,eAAO,MAAM,aAAa,cAGzB,CAAC;AAEF;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,CAAC,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,QAAQ,GAAG,SAAS,CAelF;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,gBAAgB,CAAC,SAAS,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAoC7F"}
|
package/utils/helpers.js
ADDED
|
@@ -0,0 +1,158 @@
|
|
|
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
|
+
/**
|
|
93
|
+
* @ru Нормализует тело запроса в формат, совместимый с fetch.
|
|
94
|
+
* @en Normalizes request body to fetch-compatible format.
|
|
95
|
+
* @param body - The request body to normalize.
|
|
96
|
+
* @returns The normalized body or undefined.
|
|
97
|
+
*/
|
|
98
|
+
export function normalizeBody(body) {
|
|
99
|
+
if (body == null)
|
|
100
|
+
return undefined;
|
|
101
|
+
if (typeof body === "string")
|
|
102
|
+
return body;
|
|
103
|
+
if (body instanceof Uint8Array)
|
|
104
|
+
return body;
|
|
105
|
+
if (body instanceof ArrayBuffer)
|
|
106
|
+
return body;
|
|
107
|
+
if (ArrayBuffer.isView(body))
|
|
108
|
+
return body;
|
|
109
|
+
if (typeof ReadableStream !== "undefined" && body instanceof ReadableStream)
|
|
110
|
+
return body;
|
|
111
|
+
if (typeof URLSearchParams !== "undefined" && body instanceof URLSearchParams)
|
|
112
|
+
return body;
|
|
113
|
+
if (typeof FormData !== "undefined" && body instanceof FormData)
|
|
114
|
+
return body;
|
|
115
|
+
if (typeof Blob !== "undefined" && body instanceof Blob)
|
|
116
|
+
return body;
|
|
117
|
+
if (typeof body === "object")
|
|
118
|
+
return JSON.stringify(body);
|
|
119
|
+
return String(body);
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* @ru Нормализует заголовки, переводя все ключи в нижний регистр (lowercase).
|
|
123
|
+
* @en Normalizes headers by transforming all keys into lowercase layout.
|
|
124
|
+
*/
|
|
125
|
+
export function normalizeHeaders(headers) {
|
|
126
|
+
if (!headers)
|
|
127
|
+
return Object.create(null);
|
|
128
|
+
const out = Object.create(null);
|
|
129
|
+
if (headers instanceof Headers) {
|
|
130
|
+
headers.forEach((value, key) => {
|
|
131
|
+
out[key.toLowerCase()] = value;
|
|
132
|
+
});
|
|
133
|
+
return out;
|
|
134
|
+
}
|
|
135
|
+
if (Array.isArray(headers)) {
|
|
136
|
+
for (let i = 0; i < headers.length; i++) {
|
|
137
|
+
const pair = headers[i];
|
|
138
|
+
if (!pair)
|
|
139
|
+
continue;
|
|
140
|
+
out[pair[0].toLowerCase()] = pair[1];
|
|
141
|
+
}
|
|
142
|
+
return out;
|
|
143
|
+
}
|
|
144
|
+
const src = headers;
|
|
145
|
+
for (const key in src) {
|
|
146
|
+
const value = src[key];
|
|
147
|
+
if (value == null)
|
|
148
|
+
continue;
|
|
149
|
+
const lowerKey = key.toLowerCase();
|
|
150
|
+
if (Array.isArray(value)) {
|
|
151
|
+
out[lowerKey] = lowerKey === "cookie" ? value.join("; ") : value.join(", ");
|
|
152
|
+
continue;
|
|
153
|
+
}
|
|
154
|
+
out[lowerKey] = String(value);
|
|
155
|
+
}
|
|
156
|
+
return out;
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"helpers.js","sourceRoot":"","sources":["../../src/utils/helpers.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,IAAI,iBAAiB,GAAG,CAAC,CAAC;AAC1B,IAAI,aAAa,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAChE,IAAI,OAAO,GAAG,EAAE,CAAC;AACjB,IAAI,QAAQ,GAAG,EAAE,CAAC;AAElB;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,GAAG,KAAK,OAAO;QAAE,OAAO,QAAQ,CAAC;IACrC,IAAI,CAAC,GAAG;QAAE,OAAO,WAAW,CAAC;IAE7B,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;QACzB,OAAO,GAAG,GAAG,CAAC;QACd,QAAQ,GAAG,MAAM,CAAC;QAClB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,MAAM,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IAEhC,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACjB,KAAK,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,KAAK,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;IACtC,CAAC;SAAM,CAAC;QACN,MAAM,SAAS,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACrC,IAAI,SAAS,KAAK,CAAC,CAAC;YAAE,KAAK,GAAG,SAAS,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,KAAK,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC;YAC9C,GAAG,GAAG,CAAC,CAAC;YACR,MAAM;QACR,CAAC;IACH,CAAC;IAED,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACtC,IAAI,KAAK,KAAK,CAAC,CAAC,IAAI,KAAK,GAAG,GAAG;QAAE,KAAK,GAAG,KAAK,GAAG,CAAC,CAAC;IAEnD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzC,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,QAAQ,GAAG,GAAG;QAAE,GAAG,GAAG,QAAQ,CAAC;IAEtD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,WAAW,CAAC;IAElD,IAAI,iBAAiB,GAAG,IAAI,EAAE,CAAC;QAC7B,aAAa,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACpC,iBAAiB,GAAG,CAAC,CAAC;IACxB,CAAC;IAED,aAAa,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IAC1B,iBAAiB,EAAE,CAAC;IACpB,OAAO,GAAG,GAAG,CAAC;IACd,QAAQ,GAAG,IAAI,CAAC;IAChB,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,UAAU,CAAC,OAAe,EAAE,GAAW;IACrD,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,EAAE;QAAE,OAAO,OAAO,GAAG,GAAG,CAAC;IACnD,IAAI,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC;QAAE,OAAO,GAAG,CAAC;IACxE,OAAO,OAAO,GAAG,GAAG,GAAG,GAAG,CAAC;AAC7B,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,YAAY,CAAC,4BAA4B,EAAE,YAAY,CAAC,CAAC;AACxF,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,YAAY,CAC3C,2CAA2C,EAC3C,cAAc,CACf,CAAC;AAEF;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAoB;IAChD,OAAO,MAAM,EAAE,MAAM,IAAI,WAAW,CAAC;AACvC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,IAA8B;IAC1D,IAAI,IAAI,IAAI,IAAI;QAAE,OAAO,SAAS,CAAC;IAEnC,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC1C,IAAI,IAAI,YAAY,UAAU;QAAE,OAAO,IAA2B,CAAC;IACnE,IAAI,IAAI,YAAY,WAAW;QAAE,OAAO,IAAI,CAAC;IAC7C,IAAI,WAAW,CAAC,MAAM,CAAC,IAAI,CAAC;QAAE,OAAO,IAA2B,CAAC;IAEjE,IAAI,OAAO,cAAc,KAAK,WAAW,IAAI,IAAI,YAAY,cAAc;QAAE,OAAO,IAAI,CAAC;IACzF,IAAI,OAAO,eAAe,KAAK,WAAW,IAAI,IAAI,YAAY,eAAe;QAAE,OAAO,IAAI,CAAC;IAC3F,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,IAAI,YAAY,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC7E,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,IAAI,YAAY,IAAI;QAAE,OAAO,IAAI,CAAC;IACrE,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAE1D,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;AACtB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAoC;IACnE,IAAI,CAAC,OAAO;QAAE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEzC,MAAM,GAAG,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAExD,IAAI,OAAO,YAAY,OAAO,EAAE,CAAC;QAC/B,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;YAC7B,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,GAAG,KAAK,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxC,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAA4C,CAAC;YACnE,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,MAAM,GAAG,GAAG,OAAkC,CAAC;IAC/C,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,KAAK,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;QACvB,IAAI,KAAK,IAAI,IAAI;YAAE,SAAS;QAE5B,MAAM,QAAQ,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,GAAG,CAAC,QAAQ,CAAC,GAAG,QAAQ,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5E,SAAS;QACX,CAAC;QAED,GAAG,CAAC,QAAQ,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC"}
|