@hyperttp/core 1.5.0 → 1.5.1

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.
@@ -1,9 +1,7 @@
1
1
  import type { IHyperCore, HyperTransport, HttpClientOptions, HyperPlugin, InternalRequest, HttpResponse, RequestInterface, StreamResponse, RequestBodyData } from "@hyperttp/types";
2
2
  /**
3
- * @ru Ядро HTTP-клиента Hyperttp. Обеспечивает диспетчеризацию запросов через
4
- * конвейер плагинов, пулинг объектов запросов и кэширование URL.
5
- * @en Hyperttp HTTP client core. Provides request dispatching through the
6
- * plugin pipeline, request object pooling, and URL caching.
3
+ * @ru Основной класс HTTP-клиента Hyperttp. Управляет транспортом, плагинами, повторными попытками и пулом запросов.
4
+ * @en Core Hyperttp HTTP client class. Manages transport, plugins, retries, and request pooling.
7
5
  */
8
6
  export declare class HyperCore implements IHyperCore {
9
7
  config: HttpClientOptions;
@@ -19,71 +17,61 @@ export declare class HyperCore implements IHyperCore {
19
17
  private hasResponseDataPlugins;
20
18
  private hasResponsePlugins;
21
19
  private hasErrorPlugins;
22
- /**
23
- * @ru Создаёт новый экземпляр ядра HTTP-клиента.
24
- * @en Creates a new HTTP client core instance.
25
- * @param config - Client configuration options.
26
- * @param transport - Optional custom transport implementation.
27
- */
20
+ private readonly _cachedMaxRetries;
21
+ private readonly _cachedRetryOpts;
28
22
  constructor(config?: HttpClientOptions, transport?: HyperTransport);
29
23
  /**
30
- * @ru Возвращает имя класса текущего активного транспорта.
31
- * @en Returns the class name of the currently active transport.
32
- * @returns Promise resolving to the transport class name.
24
+ * @ru Возвращает имя текущего транспорта.
25
+ * @en Returns the name of the current transport.
26
+ * @returns Transport constructor name.
33
27
  */
34
28
  getTransportName(): Promise<string>;
35
29
  /**
36
- * @ru Отправляет внутренний запрос через полный конвейер обработки:
37
- * плагины запроса → транспорт → плагины данных ответа → маппинг → плагины ответа.
38
- * @en Dispatches an internal request through the full processing pipeline:
39
- * request plugins → transport → response data plugins → mapping → response plugins.
40
- * @template T - Expected response body type.
41
- * @param req - The normalized internal request object.
30
+ * @ru Основной метод отправки запроса через транспорт с поддержкой плагинов и повторных попыток.
31
+ * @en Core request dispatch method through transport with plugin and retry support.
32
+ * @param req - The internal request to dispatch.
42
33
  * @returns Promise resolving to the HTTP response.
43
34
  */
44
35
  dispatch<T = unknown>(req: InternalRequest): Promise<HttpResponse<T>>;
45
36
  /**
46
- * @ru Регистрирует плагин в экземпляре клиента. Плагины выполняются в порядке приоритета.
47
- * @en Registers a plugin into the client instance. Plugins are executed in priority order.
37
+ * @ru Регистрирует плагин с сортировкой по приоритету. Пропускает отключённые плагины.
38
+ * @en Registers a plugin sorted by priority. Skips disabled plugins.
48
39
  * @param plugin - The plugin instance to register.
49
- * @returns The current instance for chaining.
40
+ * @returns This instance for chaining.
50
41
  */
51
42
  use(plugin: HyperPlugin): this;
52
43
  /**
53
- * @ru Выполняет GET-запрос.
54
- * @en Performs a GET request.
55
- * @template T - Expected response body type.
56
- * @param req - Request URL or RequestInterface object.
44
+ * @ru Выполняет GET-запрос. Использует быстрый путь для простых строковых URL без плагинов/повторов.
45
+ * @en Performs a GET request. Uses a fast path for bare string URLs without plugins/retries.
46
+ * @param req - URL string or RequestInterface.
57
47
  * @param signal - Optional abort signal.
58
48
  * @returns Promise resolving to the HTTP response.
59
49
  */
60
50
  get<T = unknown>(req: RequestInterface | string, signal?: AbortSignal): Promise<HttpResponse<T>>;
51
+ private fastGet;
61
52
  /**
62
- * @ru Выполняет POST-запрос с телом.
63
- * @en Performs a POST request with a body.
64
- * @template T - Expected response body type.
65
- * @param req - Request URL or RequestInterface object.
66
- * @param body - Request body data.
53
+ * @ru Выполняет POST-запрос.
54
+ * @en Performs a POST request.
55
+ * @param req - URL string or RequestInterface.
56
+ * @param body - Optional request body.
67
57
  * @param signal - Optional abort signal.
68
58
  * @returns Promise resolving to the HTTP response.
69
59
  */
70
60
  post<T = unknown>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<HttpResponse<T>>;
71
61
  /**
72
- * @ru Выполняет PUT-запрос с телом.
73
- * @en Performs a PUT request with a body.
74
- * @template T - Expected response body type.
75
- * @param req - Request URL or RequestInterface object.
76
- * @param body - Request body data.
62
+ * @ru Выполняет PUT-запрос.
63
+ * @en Performs a PUT request.
64
+ * @param req - URL string or RequestInterface.
65
+ * @param body - Optional request body.
77
66
  * @param signal - Optional abort signal.
78
67
  * @returns Promise resolving to the HTTP response.
79
68
  */
80
69
  put<T = unknown>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<HttpResponse<T>>;
81
70
  /**
82
- * @ru Выполняет PATCH-запрос с телом.
83
- * @en Performs a PATCH request with a body.
84
- * @template T - Expected response body type.
85
- * @param req - Request URL or RequestInterface object.
86
- * @param body - Request body data.
71
+ * @ru Выполняет PATCH-запрос.
72
+ * @en Performs a PATCH request.
73
+ * @param req - URL string or RequestInterface.
74
+ * @param body - Optional request body.
87
75
  * @param signal - Optional abort signal.
88
76
  * @returns Promise resolving to the HTTP response.
89
77
  */
@@ -91,8 +79,7 @@ export declare class HyperCore implements IHyperCore {
91
79
  /**
92
80
  * @ru Выполняет DELETE-запрос.
93
81
  * @en Performs a DELETE request.
94
- * @template T - Expected response body type.
95
- * @param req - Request URL or RequestInterface object.
82
+ * @param req - URL string or RequestInterface.
96
83
  * @param signal - Optional abort signal.
97
84
  * @returns Promise resolving to the HTTP response.
98
85
  */
@@ -100,118 +87,85 @@ export declare class HyperCore implements IHyperCore {
100
87
  /**
101
88
  * @ru Выполняет OPTIONS-запрос.
102
89
  * @en Performs an OPTIONS request.
103
- * @template T - Expected response body type.
104
- * @param req - Request URL or RequestInterface object.
105
- * @param body - Optional request body data.
90
+ * @param req - URL string or RequestInterface.
91
+ * @param body - Optional request body.
106
92
  * @param signal - Optional abort signal.
107
93
  * @returns Promise resolving to the HTTP response.
108
94
  */
109
95
  options<T = unknown>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<HttpResponse<T>>;
110
96
  /**
111
- * @ru Выполняет HEAD-запрос (без тела ответа).
112
- * @en Performs a HEAD request (no response body).
113
- * @param req - Request URL or RequestInterface object.
97
+ * @ru Выполняет HEAD-запрос.
98
+ * @en Performs a HEAD request.
99
+ * @param req - URL string or RequestInterface.
114
100
  * @param signal - Optional abort signal.
115
101
  * @returns Promise resolving to the HTTP response with null body.
116
102
  */
117
103
  head(req: RequestInterface | string, signal?: AbortSignal): Promise<HttpResponse<null>>;
118
104
  /**
119
- * @ru Инициирует потоковый GET-запрос. Тело ответа возвращается как ReadableStream.
120
- * @en Initiates a streaming GET request. Response body is returned as a ReadableStream.
121
- * @param req - Request URL or RequestInterface object.
105
+ * @ru Выполняет GET-запрос и возвращает стриминг-ответ.
106
+ * @en Performs a GET request and returns a streaming response.
107
+ * @param req - URL string or RequestInterface.
122
108
  * @param signal - Optional abort signal.
123
- * @returns Promise resolving to the stream response.
109
+ * @returns Promise resolving to a StreamResponse.
124
110
  */
125
111
  stream(req: RequestInterface | string, signal?: AbortSignal): Promise<StreamResponse<unknown>>;
126
112
  /**
127
- * @ru Инициирует потоковый POST-запрос с телом. Тело ответа возвращается как ReadableStream.
128
- * @en Initiates a streaming POST request with a body. Response body is returned as a ReadableStream.
129
- * @template T - Expected response body type.
130
- * @param req - Request URL or RequestInterface object.
131
- * @param body - Request body data.
113
+ * @ru Выполняет POST-запрос и возвращает стриминг-ответ.
114
+ * @en Performs a POST request and returns a streaming response.
115
+ * @param req - URL string or RequestInterface.
116
+ * @param body - Optional request body.
132
117
  * @param signal - Optional abort signal.
133
- * @returns Promise resolving to the stream response.
118
+ * @returns Promise resolving to a StreamResponse.
134
119
  */
135
120
  postStream<T = unknown>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<StreamResponse<T>>;
136
121
  /**
137
- * @ru Создаёт новый экземпляр клиента, объединяя текущую конфигурацию с переданными опциями.
138
- * @en Creates a new client instance by merging the current configuration with provided options.
139
- * @param options - Partial configuration options to extend.
122
+ * @ru Создаёт новый экземпляр HyperCore с расширенной/переопределённой конфигурацией.
123
+ * @en Creates a new HyperCore instance with extended/overridden configuration.
124
+ * @param options - Partial configuration overrides.
140
125
  * @returns A new HyperCore instance.
141
126
  */
142
127
  extend(options: Partial<HttpClientOptions>): HyperCore;
143
128
  /**
144
- * @ru Создаёт полностью новый экземпляр клиента на основе переданных опций.
145
- * @en Creates a completely new client instance based on provided options.
146
- * @param options - Partial configuration options for the new instance.
129
+ * @ru Алиас для extend().
130
+ * @en Alias for extend().
131
+ * @param options - Partial configuration overrides.
147
132
  * @returns A new HyperCore instance.
148
133
  */
149
134
  create(options: Partial<HttpClientOptions>): HyperCore;
150
135
  /**
151
- * @ru Завершает работу клиента и освобождает ресурсы (соединения, пулы).
152
- * @en Shuts down the client and releases resources (connections, pools).
153
- * @param graceful - If true, waits for active requests to complete before closing.
136
+ * @ru Завершает работу клиента и освобождает ресурсы транспорта.
137
+ * @en Shuts down the client and releases transport resources.
138
+ * @param graceful - If true, waits for active requests to complete.
154
139
  * @returns Promise that resolves when shutdown is complete.
155
140
  */
156
141
  destroy(graceful?: boolean): Promise<void>;
157
142
  /**
158
- * @ru Выполняет GET-запрос и возвращает распарсенное JSON-тело ответа.
159
- * @en Performs a GET request and returns the parsed JSON response body.
160
- * @template T - Expected type of the parsed JSON.
161
- * @param req - Request URL or RequestInterface object.
143
+ * @ru Выполняет GET-запрос и возвращает тело ответа, разобранное как JSON.
144
+ * @en Performs a GET request and returns the response body parsed as JSON.
145
+ * @param req - URL string or RequestInterface.
162
146
  * @param signal - Optional abort signal.
163
- * @returns Promise resolving to the parsed JSON data.
147
+ * @returns Promise resolving to the parsed JSON value.
164
148
  */
165
149
  json<T = unknown>(req: RequestInterface | string, signal?: AbortSignal): Promise<T>;
166
150
  /**
167
- * @ru Выполняет GET-запрос и возвращает тело ответа как текст.
151
+ * @ru Выполняет GET-запрос и возвращает тело ответа как строку.
168
152
  * @en Performs a GET request and returns the response body as text.
169
- * @param req - Request URL or RequestInterface object.
153
+ * @param req - URL string or RequestInterface.
170
154
  * @param signal - Optional abort signal.
171
155
  * @returns Promise resolving to the response text.
172
156
  */
173
157
  text(req: RequestInterface | string, signal?: AbortSignal): Promise<string>;
174
158
  /**
175
- * @ru Выполняет GET-запрос и немедленно отбрасывает тело ответа для освобождения ресурсов.
176
- * @en Performs a GET request and immediately discards the response body to free resources.
177
- * @param req - Request URL or RequestInterface object.
159
+ * @ru Выполняет GET-запрос и сбрасывает тело ответа (без сохранения).
160
+ * @en Performs a GET request and discards the response body.
161
+ * @param req - URL string or RequestInterface.
178
162
  * @param signal - Optional abort signal.
179
- * @returns Promise that resolves when the stream is drained.
163
+ * @returns Promise that resolves when the body is discarded.
180
164
  */
181
165
  dump(req: RequestInterface | string, signal?: AbortSignal): Promise<void>;
182
- /**
183
- * @ru Обрабатывает ошибку диспетчеризации через конвейер плагинов обработки ошибок.
184
- * @en Handles dispatch errors through the error handling plugin pipeline.
185
- * @template T - Expected response body type.
186
- * @param error - The error that occurred.
187
- * @param req - The original internal request.
188
- * @returns Promise resolving to a recovered HTTP response, or throws if unrecoverable.
189
- */
190
166
  private handleDispatchError;
191
- /**
192
- * @ru Создаёт или переиспользует объект InternalRequest из пула, заполняя его поля.
193
- * @en Creates or reuses an InternalRequest object from the pool, populating its fields.
194
- * @param method - HTTP method (GET, POST, etc.).
195
- * @param req - Request URL or RequestInterface object.
196
- * @param body - Optional request body data.
197
- * @param signal - Optional abort signal.
198
- * @param responseType - Optional response type hint ('stream').
199
- * @returns The populated internal request object.
200
- */
201
167
  private acquireReq;
202
- /**
203
- * @ru Возвращает объект запроса в пул для переиспользования, очищая ссылки для GC.
204
- * @en Returns the request object to the pool for reuse, clearing references for GC.
205
- * @param req - The internal request object to recycle.
206
- */
207
168
  private recycleRequest;
208
- /**
209
- * @ru Выполняет быстрый запрос с автоматическим определением HTTP-метода.
210
- * @en Performs a shortcut request with automatic HTTP method detection.
211
- * @param req - Request URL or RequestInterface object.
212
- * @param signal - Optional abort signal.
213
- * @returns Promise resolving to the HTTP response.
214
- */
215
169
  private shortcut;
216
170
  }
217
171
  //# sourceMappingURL=HyperCore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"HyperCore.d.ts","sourceRoot":"","sources":["../../src/Core/HyperCore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"HyperCore.d.ts","sourceRoot":"","sources":["../../src/Core/HyperCore.ts"],"names":[],"mappings":"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"}
package/Core/HyperCore.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";import{defaultConfig as u}from"../defaultConfig.js";import{mapResponseFast as R,mapStreamFast as y}from"../utils/response.js";import{TransportManager as P}from"../transports/manager.js";import{createPipelines as E,executeErrorPipeline as x,executeRequestPipeline as k,executeResponsePipeline as d,executeResponseDataPipeline as q,insertHookSorted as c}from"../utils/pipeline.js";import{normalizeHeaders as M,normalizeBodyForTransport as T}from"../utils/normalize.js";import{calcDelay as f,shouldRetry as S,drainBody as b}from"../utils/retryUtils.js";import{TimeoutError as D}from"../utils/errors.js";import{RequestBuilder as C}from"./RequestBuilder.js";const m=p=>new Promise(t=>setTimeout(t,p)),H=64;class A{max;current=0;queue=[];constructor(t){this.max=t}acquire(){return this.current<this.max?(this.current++,Promise.resolve()):new Promise(t=>{this.queue.push(()=>{this.current++,t()})})}release(){const t=this.queue.shift();t?t():this.current--}}export class HyperCore{config;transportManager;transportReady;defaultHeaders;pluginCtx;pipelines=E();requestBuilder=new C;requestPool=[];semaphore=null;hasRequestPlugins=!1;hasResponseDataPlugins=!1;hasResponsePlugins=!1;hasErrorPlugins=!1;constructor(t=u,e){this.config={...u,...t,network:{...u.network,...t.network,stealth:t.network?.stealth||u.network?.stealth?Object.assign({},u.network?.stealth,t.network?.stealth):void 0}},this.transportManager=new P(this.config,e),this.transportReady=this.transportManager.getSync()?Promise.resolve(this.transportManager.getSync()):this.transportManager.ensure(),this.defaultHeaders=M({Accept:"application/json, text/plain, */*","Accept-Encoding":"gzip, deflate, br","User-Agent":this.config.network?.userAgent??"Hyperttp/2.0",...this.config.network?.headers});const s=this.config.network?.maxConcurrent;this.semaphore=s!=null&&s>0?new A(s):null,this.pluginCtx={config:this.config,core:this}}async getTransportName(){return(this.transportManager.transport??await this.transportManager.get()).constructor.name}async dispatch(t){const e=this.config.retry??{},s=e.maxRetries??0;for(let i=0;;i++)try{if(this.hasRequestPlugins){const o=k(this.pipelines.request,t,this.pluginCtx),h=o instanceof Promise?await o:o;if(h!=null)return this.recycleRequest(t),h}t.body!=null&&(t.body=T(t.body,t.headers));const n=this.transportManager.transport??this.transportManager.getSync()??await this.transportReady;this.semaphore&&await this.semaphore.acquire();let r;const g=performance.now();try{r=await n.execute(t)}finally{this.semaphore?.release()}const w=performance.now()-g,a=t.meta;if(a.timings&&(a.timings.networkMs=w),i<s&&S(r.status,e)){await b(r.body),await m(f(i,e));continue}if(this.hasResponseDataPlugins){const o=q(this.pipelines.responseData,r,this.pluginCtx);r=o instanceof Promise?await o:o}const l=a.responseType==="stream"?y(r):R(r);if(this.hasResponsePlugins){const o=this.pipelines.responseSideEffects.length>0?{...t,meta:{...a,timings:a.timings?{...a.timings}:void 0}}:t,h=d(this.pipelines.responseMutators,this.pipelines.responseSideEffects,l,o,this.pluginCtx,this.config.logger);h instanceof Promise&&await h}return this.recycleRequest(t),l}catch(n){if(n instanceof Error&&n.name==="AbortError"){const r=this.config.network?.timeout;return r!=null&&r>0?this.handleDispatchError(new D(t.url,r),t):this.handleDispatchError(n,t)}if(i<s&&!t.signal?.aborted){await m(f(i,e));continue}return this.handleDispatchError(n,t)}}use(t){if(!(t.enabled?t.enabled(this.config):!0))return this;t.setup?.(this.pluginCtx);const s=t.priority??0,i={name:t.name,priority:s};if(t.onRequest&&(c(this.pipelines.request,{...i,run:t.onRequest}),this.hasRequestPlugins=!0),t.onResponse){const n=t.mode==="background"?this.pipelines.responseSideEffects:this.pipelines.responseMutators;c(n,{...i,run:t.onResponse}),this.hasResponsePlugins=!0}return t.onResponseData&&(c(this.pipelines.responseData,{...i,run:t.onResponseData}),this.hasResponseDataPlugins=!0),t.onError&&(c(this.pipelines.error,{...i,run:t.onError}),this.hasErrorPlugins=!0),this}get(t,e){return this.dispatch(this.acquireReq("GET",t,void 0,e))}post(t,e,s){return this.dispatch(this.acquireReq("POST",t,e,s))}put(t,e,s){return this.dispatch(this.acquireReq("PUT",t,e,s))}patch(t,e,s){return this.dispatch(this.acquireReq("PATCH",t,e,s))}delete(t,e){return this.dispatch(this.acquireReq("DELETE",t,void 0,e))}options(t,e,s){return this.dispatch(this.acquireReq("OPTIONS",t,e,s))}head(t,e){return this.dispatch(this.acquireReq("HEAD",t,void 0,e))}stream(t,e){return this.dispatch(this.acquireReq("GET",t,void 0,e,"stream"))}postStream(t,e,s){return this.dispatch(this.acquireReq("POST",t,e,s,"stream"))}extend(t){return new HyperCore({...this.config,...t,network:{...this.config.network,...t.network,stealth:t.network?.stealth||this.config.network?.stealth?{...this.config.network?.stealth,...t.network?.stealth}:void 0}},this.transportManager.transport??void 0)}create(t){return this.extend(t)}destroy(t=!0){return this.transportManager.destroy(t)}json(t,e){return this.shortcut(t,e).then(s=>{if(s.json)return s.json();throw new Error("json() not supported")})}text(t,e){return this.shortcut(t,e).then(s=>{if(s.text)return s.text();throw new Error("text() not supported")})}dump(t,e){return this.shortcut(t,e).then(s=>{if(s.dump)return s.dump()})}async handleDispatchError(t,e){try{if(this.hasErrorPlugins){const s=await x(this.pipelines.error,t,e,this.pluginCtx);if(s!=null){if(this.hasResponsePlugins){const i=e.meta,n=this.pipelines.responseSideEffects.length>0?{...e,meta:{...i,timings:i?.timings?{...i.timings}:void 0}}:e,r=d(this.pipelines.responseMutators,this.pipelines.responseSideEffects,s,n,this.pluginCtx,this.config.logger);r instanceof Promise&&await r}return s}}throw t}finally{this.recycleRequest(e)}}acquireReq(t,e,s,i,n){const r=this.requestPool.pop();return this.requestBuilder.build(t,e,s,i,n,this.defaultHeaders,this.config,r)}recycleRequest(t){if(this.requestPool.length<H){t.method="GET",t.url="",t.headers=this.defaultHeaders,t.body=void 0,t.signal=void 0,t.stealth=void 0;const e=t.meta;if(e&&(e.responseType=void 0,e.timings))for(const s in e.timings)e.timings[s]=void 0;this.requestPool.push(t)}}shortcut(t,e){const s=typeof t=="string"?"GET":t.method??"GET";return this.dispatch(this.acquireReq(s,t,void 0,e))}}
1
+ "use strict";import{defaultConfig as h}from"../defaultConfig.js";import{mapResponseFast as g,mapStreamFast as x,recycleResponse as p}from"../utils/response.js";import{TransportManager as E}from"../transports/manager.js";import{createPipelines as k,executeErrorPipeline as q,executeRequestPipeline as M,executeResponsePipeline as y,executeResponseDataPipeline as T,insertHookSorted as u}from"../utils/pipeline.js";import{normalizeHeaders as S,normalizeBodyForTransport as b}from"../utils/normalize.js";import{calcDelay as R,shouldRetry as D,drainBody as C}from"../utils/retryUtils.js";import{TimeoutError as O}from"../utils/errors.js";import{RequestBuilder as A}from"./RequestBuilder.js";const w=l=>new Promise(t=>setTimeout(t,l)),H=64;class j{max;current=0;queue=[];constructor(t){this.max=t}tryAcquire(){return this.current<this.max?(this.current++,!0):!1}acquire(){return this.current<this.max?(this.current++,Promise.resolve()):new Promise(t=>{this.queue.push(()=>{this.current++,t()})})}release(){const t=this.queue.shift();t?t():this.current--}}export class HyperCore{config;transportManager;transportReady;defaultHeaders;pluginCtx;pipelines=k();requestBuilder=new A;requestPool=[];semaphore=null;hasRequestPlugins=!1;hasResponseDataPlugins=!1;hasResponsePlugins=!1;hasErrorPlugins=!1;_cachedMaxRetries;_cachedRetryOpts;constructor(t=h,e){this.config={...h,...t,network:{...h.network,...t.network,stealth:t.network?.stealth||h.network?.stealth?Object.assign({},h.network?.stealth,t.network?.stealth):void 0}},this.transportManager=new E(this.config,e),this.transportReady=this.transportManager.getSync()?Promise.resolve(this.transportManager.getSync()):this.transportManager.ensure(),this.defaultHeaders=S({Accept:"application/json, text/plain, */*","Accept-Encoding":"gzip, deflate, br","User-Agent":this.config.network?.userAgent??"Hyperttp/2.0",...this.config.network?.headers});const s=this.config.network?.maxConcurrent;this.semaphore=s!=null&&s>0?new j(s):null,this._cachedRetryOpts=this.config.retry??{},this._cachedMaxRetries=this._cachedRetryOpts.maxRetries??0,this.pluginCtx={config:this.config,core:this}}async getTransportName(){return(this.transportManager.transport??await this.transportManager.get()).constructor.name}async dispatch(t){const e=this._cachedRetryOpts,s=this._cachedMaxRetries;for(let r=0;;r++)try{if(this.hasRequestPlugins){const a=M(this.pipelines.request,t,this.pluginCtx),m=a instanceof Promise?await a:a;if(m!=null)return this.recycleRequest(t),m}t.body!=null&&(t.body=b(t.body,t.headers));const i=this.transportManager.transport??this.transportManager.getSync()??await this.transportReady;let n=!1;this.semaphore&&(n=this.semaphore.tryAcquire(),n||await this.semaphore.acquire(),n=!0);let o;const c=t.meta,d=!!c.timings,P=d?performance.now():0;try{o=await i.execute(t)}finally{n&&this.semaphore?.release()}if(d&&(c.timings.networkMs=performance.now()-P),r<s&&D(o.status,e)){await C(o.body),await w(R(r,e));continue}if(this.hasResponseDataPlugins){const a=T(this.pipelines.responseData,o,this.pluginCtx);o=a instanceof Promise?await a:a}const f=c.responseType==="stream"?x(o):g(o);if(this.hasResponsePlugins){const a=y(this.pipelines.responseMutators,this.pipelines.responseSideEffects,f,t,this.pluginCtx,this.config.logger);a instanceof Promise&&await a}return this.recycleRequest(t),f}catch(i){if(i instanceof Error&&i.name==="AbortError"){const n=this.config.network?.timeout;return n!=null&&n>0?this.handleDispatchError(new O(t.url,n),t):this.handleDispatchError(i,t)}if(r<s&&!t.signal?.aborted){await w(R(r,e));continue}return this.handleDispatchError(i,t)}}use(t){if(!(t.enabled?t.enabled(this.config):!0))return this;t.setup?.(this.pluginCtx);const s=t.priority??0,r={name:t.name,priority:s,run:null};if(t.onRequest&&(u(this.pipelines.request,{name:r.name,priority:r.priority,run:t.onRequest}),this.hasRequestPlugins=!0),t.onResponse){const i=t.mode==="background"?this.pipelines.responseSideEffects:this.pipelines.responseMutators;u(i,{name:r.name,priority:r.priority,run:t.onResponse}),this.hasResponsePlugins=!0}return t.onResponseData&&(u(this.pipelines.responseData,{name:r.name,priority:r.priority,run:t.onResponseData}),this.hasResponseDataPlugins=!0),t.onError&&(u(this.pipelines.error,{name:r.name,priority:r.priority,run:t.onError}),this.hasErrorPlugins=!0),this}get(t,e){return typeof t=="string"&&t!==""&&!e&&!this.hasRequestPlugins&&!this.hasResponsePlugins&&!this.hasResponseDataPlugins&&!this.hasErrorPlugins&&this._cachedMaxRetries===0?this.fastGet(t):this.dispatch(this.acquireReq("GET",t,void 0,e))}async fastGet(t){const e=this.requestBuilder.resolveUrl(t,this.config.baseURL);let s=!1;this.semaphore&&(s=this.semaphore.tryAcquire(),s||(await this.semaphore.acquire(),s=!0));const r=this.transportManager.transport??this.transportManager.getSync()??await this.transportReady;try{if(typeof r.fastRequest=="function")return await r.fastRequest(e,"GET",this.defaultHeaders);const i=await r.execute({method:"GET",url:e,headers:this.defaultHeaders,body:void 0,signal:void 0,stealth:this.config.network?.stealth});return g(i)}finally{s&&this.semaphore?.release()}}post(t,e,s){return this.dispatch(this.acquireReq("POST",t,e,s))}put(t,e,s){return this.dispatch(this.acquireReq("PUT",t,e,s))}patch(t,e,s){return this.dispatch(this.acquireReq("PATCH",t,e,s))}delete(t,e){return this.dispatch(this.acquireReq("DELETE",t,void 0,e))}options(t,e,s){return this.dispatch(this.acquireReq("OPTIONS",t,e,s))}head(t,e){return this.dispatch(this.acquireReq("HEAD",t,void 0,e))}stream(t,e){return this.dispatch(this.acquireReq("GET",t,void 0,e,"stream"))}postStream(t,e,s){return this.dispatch(this.acquireReq("POST",t,e,s,"stream"))}extend(t){const e={...this.config};for(const s in t)Object.prototype.hasOwnProperty.call(t,s)&&(s==="network"&&t.network?e.network={...this.config.network,...t.network,stealth:t.network.stealth||this.config.network?.stealth?{...this.config.network?.stealth,...t.network.stealth}:void 0}:e[s]=t[s]);return new HyperCore(e,this.transportManager.transport??void 0)}create(t){return this.extend(t)}destroy(t=!0){return this.transportManager.destroy(t)}json(t,e){return this.shortcut(t,e).then(s=>{const r=s.json?s.json():Promise.reject(new Error("json() not supported"));return p(s),r})}text(t,e){return this.shortcut(t,e).then(s=>{const r=s.text?s.text():Promise.reject(new Error("text() not supported"));return p(s),r})}dump(t,e){return this.shortcut(t,e).then(s=>{const r=s.dump?s.dump():Promise.resolve();return p(s),r})}async handleDispatchError(t,e){try{if(this.hasErrorPlugins){const s=await q(this.pipelines.error,t,e,this.pluginCtx);if(s!=null){if(this.hasResponsePlugins){const r=y(this.pipelines.responseMutators,this.pipelines.responseSideEffects,s,e,this.pluginCtx,this.config.logger);r instanceof Promise&&await r}return s}}throw t}finally{this.recycleRequest(e)}}acquireReq(t,e,s,r,i){const n=this.requestPool.pop();return this.requestBuilder.build(t,e,s,r,i,this.defaultHeaders,this.config,n)}recycleRequest(t){if(this.requestPool.length<H){t.method="GET",t.url="",t.headers=this.defaultHeaders,t.body=void 0,t.signal=void 0,t.stealth=void 0;const e=t.meta;e&&(e.responseType=void 0,typeof e.cleanupSignal=="function"&&(e.cleanupSignal(),e.cleanupSignal=void 0),e.timings&&(e.timings.networkMs=void 0)),this.requestPool.push(t)}}shortcut(t,e){const s=typeof t=="string"?"GET":t.method??"GET";return this.dispatch(this.acquireReq(s,t,void 0,e))}}
2
2
  //# sourceMappingURL=HyperCore.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Core/HyperCore.ts"],
4
- "sourcesContent": ["import type {\n IHyperCore,\n HyperTransport,\n HttpClientOptions,\n PluginContext,\n HyperPlugin,\n InternalRequest,\n HttpResponse,\n HyperttpError,\n RequestInterface,\n StreamResponse,\n RequestBodyData,\n Method,\n ResponseType,\n TransportResponse,\n} from \"@hyperttp/types\";\nimport { defaultConfig } from \"../defaultConfig.js\";\nimport { mapResponseFast, mapStreamFast } from \"../utils/response.js\";\nimport { TransportManager } from \"../transports/manager.js\";\nimport {\n createPipelines,\n executeErrorPipeline,\n executeRequestPipeline,\n executeResponsePipeline,\n executeResponseDataPipeline,\n insertHookSorted,\n} from \"../utils/pipeline.js\";\nimport { normalizeHeaders, normalizeBodyForTransport } from \"../utils/normalize.js\";\nimport { calcDelay, shouldRetry, drainBody } from \"../utils/retryUtils.js\";\nimport { TimeoutError } from \"../utils/errors.js\";\nimport { RequestBuilder } from \"./RequestBuilder.js\";\n\ntype TransportArgs = Parameters<HyperTransport[\"execute\"]>[0];\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\nconst MAX_POOL_SIZE = 64;\n\nclass Semaphore {\n private current = 0;\n private queue: Array<() => void> = [];\n\n constructor(private max: number) {}\n\n acquire(): Promise<void> {\n if (this.current < this.max) {\n this.current++;\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n this.queue.push(() => {\n this.current++;\n resolve();\n });\n });\n }\n\n release(): void {\n const next = this.queue.shift();\n if (next) {\n next();\n } else {\n this.current--;\n }\n }\n}\n\n/**\n * @ru \u042F\u0434\u0440\u043E HTTP-\u043A\u043B\u0438\u0435\u043D\u0442\u0430 Hyperttp. \u041E\u0431\u0435\u0441\u043F\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u0434\u0438\u0441\u043F\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u044E \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u0447\u0435\u0440\u0435\u0437\n * \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432, \u043F\u0443\u043B\u0438\u043D\u0433 \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u0438 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 URL.\n * @en Hyperttp HTTP client core. Provides request dispatching through the\n * plugin pipeline, request object pooling, and URL caching.\n */\nexport class HyperCore implements IHyperCore {\n public config: HttpClientOptions;\n private readonly transportManager: TransportManager;\n private readonly transportReady: Promise<HyperTransport>;\n private readonly defaultHeaders: Record<string, string | string[]>;\n private readonly pluginCtx: PluginContext;\n private readonly pipelines = createPipelines();\n private readonly requestBuilder = new RequestBuilder();\n private readonly requestPool: InternalRequest[] = [];\n\n private semaphore: Semaphore | null = null;\n private hasRequestPlugins = false;\n private hasResponseDataPlugins = false;\n private hasResponsePlugins = false;\n private hasErrorPlugins = false;\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043D\u043E\u0432\u044B\u0439 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 \u044F\u0434\u0440\u0430 HTTP-\u043A\u043B\u0438\u0435\u043D\u0442\u0430.\n * @en Creates a new HTTP client core instance.\n * @param config - Client configuration options.\n * @param transport - Optional custom transport implementation.\n */\n constructor(config: HttpClientOptions = defaultConfig, transport?: HyperTransport) {\n this.config = {\n ...defaultConfig,\n ...config,\n network: {\n ...defaultConfig.network,\n ...config.network,\n stealth:\n config.network?.stealth || defaultConfig.network?.stealth\n ? Object.assign({}, defaultConfig.network?.stealth, config.network?.stealth)\n : undefined,\n },\n };\n this.transportManager = new TransportManager(this.config, transport);\n this.transportReady = this.transportManager.getSync()\n ? Promise.resolve(this.transportManager.getSync()!)\n : this.transportManager.ensure();\n\n this.defaultHeaders = normalizeHeaders({\n Accept: \"application/json, text/plain, */*\",\n \"Accept-Encoding\": \"gzip, deflate, br\",\n \"User-Agent\": this.config.network?.userAgent ?? \"Hyperttp/2.0\",\n ...this.config.network?.headers,\n });\n\n const maxConcurrent = this.config.network?.maxConcurrent;\n this.semaphore = maxConcurrent != null && maxConcurrent > 0 ? new Semaphore(maxConcurrent) : null;\n\n this.pluginCtx = { config: this.config, core: this };\n }\n\n /**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043C\u044F \u043A\u043B\u0430\u0441\u0441\u0430 \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0430\u043A\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Returns the class name of the currently active transport.\n * @returns Promise resolving to the transport class name.\n */\n public async getTransportName(): Promise<string> {\n const t = this.transportManager.transport ?? (await this.transportManager.get());\n return t.constructor.name;\n }\n\n /**\n * @ru \u041E\u0442\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u0447\u0435\u0440\u0435\u0437 \u043F\u043E\u043B\u043D\u044B\u0439 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438:\n * \u043F\u043B\u0430\u0433\u0438\u043D\u044B \u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u2192 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u2192 \u043F\u043B\u0430\u0433\u0438\u043D\u044B \u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u0442\u0432\u0435\u0442\u0430 \u2192 \u043C\u0430\u043F\u043F\u0438\u043D\u0433 \u2192 \u043F\u043B\u0430\u0433\u0438\u043D\u044B \u043E\u0442\u0432\u0435\u0442\u0430.\n * @en Dispatches an internal request through the full processing pipeline:\n * request plugins \u2192 transport \u2192 response data plugins \u2192 mapping \u2192 response plugins.\n * @template T - Expected response body type.\n * @param req - The normalized internal request object.\n * @returns Promise resolving to the HTTP response.\n */\n public async dispatch<T = unknown>(req: InternalRequest): Promise<HttpResponse<T>> {\n const retryOpts = this.config.retry ?? {};\n const maxRetries = retryOpts.maxRetries ?? 0;\n\n for (let attempt = 0; ; attempt++) {\n try {\n if (this.hasRequestPlugins) {\n const syncResult = executeRequestPipeline(this.pipelines.request, req, this.pluginCtx);\n const shortCircuit = syncResult instanceof Promise ? await syncResult : syncResult;\n\n if (shortCircuit != null) {\n this.recycleRequest(req);\n return shortCircuit as HttpResponse<T>;\n }\n }\n\n if (req.body != null) {\n req.body = normalizeBodyForTransport(req.body, req.headers);\n }\n\n const transport =\n this.transportManager.transport ??\n this.transportManager.getSync() ??\n (await this.transportReady);\n\n if (this.semaphore) await this.semaphore.acquire();\n let rawResponse: TransportResponse;\n const networkStart = performance.now();\n try {\n rawResponse = await transport.execute(req as TransportArgs);\n } finally {\n this.semaphore?.release();\n }\n const networkMs = performance.now() - networkStart;\n\n const meta = req.meta as {\n responseType?: ResponseType;\n timings?: { networkMs?: number };\n };\n if (meta.timings) {\n meta.timings.networkMs = networkMs;\n }\n\n if (attempt < maxRetries && shouldRetry(rawResponse.status, retryOpts)) {\n await drainBody(rawResponse.body);\n await sleep(calcDelay(attempt, retryOpts));\n continue;\n }\n\n if (this.hasResponseDataPlugins) {\n const syncResult = executeResponseDataPipeline(\n this.pipelines.responseData,\n rawResponse,\n this.pluginCtx,\n );\n rawResponse = syncResult instanceof Promise ? await syncResult : syncResult;\n }\n\n const response =\n meta.responseType === \"stream\"\n ? mapStreamFast(rawResponse)\n : mapResponseFast(rawResponse);\n\n if (this.hasResponsePlugins) {\n const reqForPipeline =\n this.pipelines.responseSideEffects.length > 0\n ? {\n ...req,\n meta: {\n ...meta,\n timings: meta.timings ? { ...meta.timings } : undefined,\n },\n }\n : req;\n\n const syncResult = executeResponsePipeline(\n this.pipelines.responseMutators,\n this.pipelines.responseSideEffects,\n response as HttpResponse,\n reqForPipeline,\n this.pluginCtx,\n this.config.logger,\n );\n if (syncResult instanceof Promise) {\n await syncResult;\n }\n }\n\n this.recycleRequest(req);\n return response as HttpResponse<T>;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n const timeout = this.config.network?.timeout;\n if (timeout != null && timeout > 0) {\n return this.handleDispatchError(new TimeoutError(req.url, timeout), req);\n }\n return this.handleDispatchError(error, req);\n }\n\n if (attempt < maxRetries && !req.signal?.aborted) {\n await sleep(calcDelay(attempt, retryOpts));\n continue;\n }\n\n return this.handleDispatchError(error as Error, req);\n }\n }\n }\n\n /**\n * @ru \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043F\u043B\u0430\u0433\u0438\u043D \u0432 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440\u0435 \u043A\u043B\u0438\u0435\u043D\u0442\u0430. \u041F\u043B\u0430\u0433\u0438\u043D\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u0432 \u043F\u043E\u0440\u044F\u0434\u043A\u0435 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u0430.\n * @en Registers a plugin into the client instance. Plugins are executed in priority order.\n * @param plugin - The plugin instance to register.\n * @returns The current instance for chaining.\n */\n public use(plugin: HyperPlugin): this {\n const isEnabled = plugin.enabled ? plugin.enabled(this.config) : true;\n if (!isEnabled) return this;\n\n plugin.setup?.(this.pluginCtx);\n const priority = (plugin as { priority?: number }).priority ?? 0;\n const hook = { name: plugin.name, priority };\n\n if (plugin.onRequest) {\n insertHookSorted(this.pipelines.request, {\n ...hook,\n run: plugin.onRequest,\n });\n this.hasRequestPlugins = true;\n }\n if (plugin.onResponse) {\n const target =\n plugin.mode === \"background\"\n ? this.pipelines.responseSideEffects\n : this.pipelines.responseMutators;\n insertHookSorted(target, { ...hook, run: plugin.onResponse });\n this.hasResponsePlugins = true;\n }\n if (plugin.onResponseData) {\n insertHookSorted(this.pipelines.responseData, {\n ...hook,\n run: plugin.onResponseData,\n });\n this.hasResponseDataPlugins = true;\n }\n if (plugin.onError) {\n insertHookSorted(this.pipelines.error, { ...hook, run: plugin.onError });\n this.hasErrorPlugins = true;\n }\n return this;\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 GET-\u0437\u0430\u043F\u0440\u043E\u0441.\n * @en Performs a GET request.\n * @template T - Expected response body type.\n * @param req - Request URL or RequestInterface object.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public get<T = unknown>(req: RequestInterface | string, signal?: AbortSignal) {\n return this.dispatch<T>(this.acquireReq(\"GET\", req, undefined, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 POST-\u0437\u0430\u043F\u0440\u043E\u0441 \u0441 \u0442\u0435\u043B\u043E\u043C.\n * @en Performs a POST request with a body.\n * @template T - Expected response body type.\n * @param req - Request URL or RequestInterface object.\n * @param body - Request body data.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public post<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"POST\", req, body, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 PUT-\u0437\u0430\u043F\u0440\u043E\u0441 \u0441 \u0442\u0435\u043B\u043E\u043C.\n * @en Performs a PUT request with a body.\n * @template T - Expected response body type.\n * @param req - Request URL or RequestInterface object.\n * @param body - Request body data.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public put<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"PUT\", req, body, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 PATCH-\u0437\u0430\u043F\u0440\u043E\u0441 \u0441 \u0442\u0435\u043B\u043E\u043C.\n * @en Performs a PATCH request with a body.\n * @template T - Expected response body type.\n * @param req - Request URL or RequestInterface object.\n * @param body - Request body data.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public patch<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"PATCH\", req, body, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 DELETE-\u0437\u0430\u043F\u0440\u043E\u0441.\n * @en Performs a DELETE request.\n * @template T - Expected response body type.\n * @param req - Request URL or RequestInterface object.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public delete<T = unknown>(req: RequestInterface | string, signal?: AbortSignal) {\n return this.dispatch<T>(this.acquireReq(\"DELETE\", req, undefined, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 OPTIONS-\u0437\u0430\u043F\u0440\u043E\u0441.\n * @en Performs an OPTIONS request.\n * @template T - Expected response body type.\n * @param req - Request URL or RequestInterface object.\n * @param body - Optional request body data.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public options<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"OPTIONS\", req, body, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 HEAD-\u0437\u0430\u043F\u0440\u043E\u0441 (\u0431\u0435\u0437 \u0442\u0435\u043B\u0430 \u043E\u0442\u0432\u0435\u0442\u0430).\n * @en Performs a HEAD request (no response body).\n * @param req - Request URL or RequestInterface object.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response with null body.\n */\n public head(req: RequestInterface | string, signal?: AbortSignal) {\n return this.dispatch<null>(this.acquireReq(\"HEAD\", req, undefined, signal));\n }\n\n /**\n * @ru \u0418\u043D\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u043F\u043E\u0442\u043E\u043A\u043E\u0432\u044B\u0439 GET-\u0437\u0430\u043F\u0440\u043E\u0441. \u0422\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044F \u043A\u0430\u043A ReadableStream.\n * @en Initiates a streaming GET request. Response body is returned as a ReadableStream.\n * @param req - Request URL or RequestInterface object.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the stream response.\n */\n public stream(\n req: RequestInterface | string,\n signal?: AbortSignal,\n ): Promise<StreamResponse<unknown>> {\n return this.dispatch(this.acquireReq(\"GET\", req, undefined, signal, \"stream\")) as Promise<\n StreamResponse<unknown>\n >;\n }\n\n /**\n * @ru \u0418\u043D\u0438\u0446\u0438\u0438\u0440\u0443\u0435\u0442 \u043F\u043E\u0442\u043E\u043A\u043E\u0432\u044B\u0439 POST-\u0437\u0430\u043F\u0440\u043E\u0441 \u0441 \u0442\u0435\u043B\u043E\u043C. \u0422\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044F \u043A\u0430\u043A ReadableStream.\n * @en Initiates a streaming POST request with a body. Response body is returned as a ReadableStream.\n * @template T - Expected response body type.\n * @param req - Request URL or RequestInterface object.\n * @param body - Request body data.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the stream response.\n */\n public postStream<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ): Promise<StreamResponse<T>> {\n return this.dispatch(this.acquireReq(\"POST\", req, body, signal, \"stream\")) as Promise<\n StreamResponse<T>\n >;\n }\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043D\u043E\u0432\u044B\u0439 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 \u043A\u043B\u0438\u0435\u043D\u0442\u0430, \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u044F\u044F \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044E \u0441 \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u043D\u044B\u043C\u0438 \u043E\u043F\u0446\u0438\u044F\u043C\u0438.\n * @en Creates a new client instance by merging the current configuration with provided options.\n * @param options - Partial configuration options to extend.\n * @returns A new HyperCore instance.\n */\n public extend(options: Partial<HttpClientOptions>): HyperCore {\n return new HyperCore(\n {\n ...this.config,\n ...options,\n network: {\n ...this.config.network,\n ...options.network,\n stealth:\n options.network?.stealth || this.config.network?.stealth\n ? { ...this.config.network?.stealth, ...options.network?.stealth }\n : undefined,\n },\n },\n this.transportManager.transport ?? undefined,\n );\n }\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043F\u043E\u043B\u043D\u043E\u0441\u0442\u044C\u044E \u043D\u043E\u0432\u044B\u0439 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 \u043A\u043B\u0438\u0435\u043D\u0442\u0430 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u043D\u044B\u0445 \u043E\u043F\u0446\u0438\u0439.\n * @en Creates a completely new client instance based on provided options.\n * @param options - Partial configuration options for the new instance.\n * @returns A new HyperCore instance.\n */\n public create(options: Partial<HttpClientOptions>): HyperCore {\n return this.extend(options);\n }\n\n /**\n * @ru \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043E\u0442\u0443 \u043A\u043B\u0438\u0435\u043D\u0442\u0430 \u0438 \u043E\u0441\u0432\u043E\u0431\u043E\u0436\u0434\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044B (\u0441\u043E\u0435\u0434\u0438\u043D\u0435\u043D\u0438\u044F, \u043F\u0443\u043B\u044B).\n * @en Shuts down the client and releases resources (connections, pools).\n * @param graceful - If true, waits for active requests to complete before closing.\n * @returns Promise that resolves when shutdown is complete.\n */\n public destroy(graceful = true): Promise<void> {\n return this.transportManager.destroy(graceful);\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 GET-\u0437\u0430\u043F\u0440\u043E\u0441 \u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0440\u0430\u0441\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u043E\u0435 JSON-\u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430.\n * @en Performs a GET request and returns the parsed JSON response body.\n * @template T - Expected type of the parsed JSON.\n * @param req - Request URL or RequestInterface object.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the parsed JSON data.\n */\n public json<T = unknown>(req: RequestInterface | string, signal?: AbortSignal): Promise<T> {\n return this.shortcut(req, signal).then((res) => {\n if (res.json) return res.json<T>();\n throw new Error(\"json() not supported\");\n });\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 GET-\u0437\u0430\u043F\u0440\u043E\u0441 \u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u043A\u0430\u043A \u0442\u0435\u043A\u0441\u0442.\n * @en Performs a GET request and returns the response body as text.\n * @param req - Request URL or RequestInterface object.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the response text.\n */\n public text(req: RequestInterface | string, signal?: AbortSignal): Promise<string> {\n return this.shortcut(req, signal).then((res) => {\n if (res.text) return res.text();\n throw new Error(\"text() not supported\");\n });\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 GET-\u0437\u0430\u043F\u0440\u043E\u0441 \u0438 \u043D\u0435\u043C\u0435\u0434\u043B\u0435\u043D\u043D\u043E \u043E\u0442\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u0434\u043B\u044F \u043E\u0441\u0432\u043E\u0431\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0440\u0435\u0441\u0443\u0440\u0441\u043E\u0432.\n * @en Performs a GET request and immediately discards the response body to free resources.\n * @param req - Request URL or RequestInterface object.\n * @param signal - Optional abort signal.\n * @returns Promise that resolves when the stream is drained.\n */\n public dump(req: RequestInterface | string, signal?: AbortSignal): Promise<void> {\n return this.shortcut(req, signal).then((res) => {\n if (res.dump) return res.dump();\n });\n }\n\n /**\n * @ru \u041E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u0435\u0442 \u043E\u0448\u0438\u0431\u043A\u0443 \u0434\u0438\u0441\u043F\u0435\u0442\u0447\u0435\u0440\u0438\u0437\u0430\u0446\u0438\u0438 \u0447\u0435\u0440\u0435\u0437 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u043E\u0448\u0438\u0431\u043E\u043A.\n * @en Handles dispatch errors through the error handling plugin pipeline.\n * @template T - Expected response body type.\n * @param error - The error that occurred.\n * @param req - The original internal request.\n * @returns Promise resolving to a recovered HTTP response, or throws if unrecoverable.\n */\n private async handleDispatchError<T>(\n error: Error,\n req: InternalRequest,\n ): Promise<HttpResponse<T>> {\n try {\n if (this.hasErrorPlugins) {\n const recovered = await executeErrorPipeline(\n this.pipelines.error,\n error as HyperttpError,\n req,\n this.pluginCtx,\n );\n if (recovered != null) {\n if (this.hasResponsePlugins) {\n const meta = req.meta;\n const reqForPipeline =\n this.pipelines.responseSideEffects.length > 0\n ? {\n ...req,\n meta: {\n ...meta,\n timings: meta?.timings ? { ...meta.timings } : undefined,\n },\n }\n : req;\n\n const syncResult = executeResponsePipeline(\n this.pipelines.responseMutators,\n this.pipelines.responseSideEffects,\n recovered as HttpResponse,\n reqForPipeline,\n this.pluginCtx,\n this.config.logger,\n );\n if (syncResult instanceof Promise) {\n await syncResult;\n }\n }\n return recovered as HttpResponse<T>;\n }\n }\n throw error;\n } finally {\n this.recycleRequest(req);\n }\n }\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u0438\u043B\u0438 \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442 InternalRequest \u0438\u0437 \u043F\u0443\u043B\u0430, \u0437\u0430\u043F\u043E\u043B\u043D\u044F\u044F \u0435\u0433\u043E \u043F\u043E\u043B\u044F.\n * @en Creates or reuses an InternalRequest object from the pool, populating its fields.\n * @param method - HTTP method (GET, POST, etc.).\n * @param req - Request URL or RequestInterface object.\n * @param body - Optional request body data.\n * @param signal - Optional abort signal.\n * @param responseType - Optional response type hint ('stream').\n * @returns The populated internal request object.\n */\n private acquireReq(\n method: Method,\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n responseType?: \"stream\",\n ): InternalRequest {\n const pooled = this.requestPool.pop();\n return this.requestBuilder.build(\n method,\n req,\n body,\n signal,\n responseType,\n this.defaultHeaders,\n this.config,\n pooled,\n );\n }\n\n /**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442 \u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u0432 \u043F\u0443\u043B \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F, \u043E\u0447\u0438\u0449\u0430\u044F \u0441\u0441\u044B\u043B\u043A\u0438 \u0434\u043B\u044F GC.\n * @en Returns the request object to the pool for reuse, clearing references for GC.\n * @param req - The internal request object to recycle.\n */\n private recycleRequest(req: InternalRequest): void {\n if (this.requestPool.length < MAX_POOL_SIZE) {\n req.method = \"GET\";\n req.url = \"\";\n req.headers = this.defaultHeaders;\n req.body = undefined;\n req.signal = undefined;\n req.stealth = undefined;\n\n const m = req.meta;\n if (m) {\n m.responseType = undefined;\n if (m.timings) {\n for (const key in m.timings) {\n (m.timings as any)[key] = undefined;\n }\n }\n }\n\n this.requestPool.push(req);\n }\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u0437\u0430\u043F\u0440\u043E\u0441 \u0441 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u043C \u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C HTTP-\u043C\u0435\u0442\u043E\u0434\u0430.\n * @en Performs a shortcut request with automatic HTTP method detection.\n * @param req - Request URL or RequestInterface object.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n private shortcut(\n req: RequestInterface | string,\n signal?: AbortSignal,\n ): Promise<HttpResponse<unknown>> {\n const method = typeof req === \"string\" ? \"GET\" : (req.method ?? \"GET\");\n return this.dispatch(this.acquireReq(method, req, undefined, signal));\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["defaultConfig", "mapResponseFast", "mapStreamFast", "TransportManager", "createPipelines", "executeErrorPipeline", "executeRequestPipeline", "executeResponsePipeline", "executeResponseDataPipeline", "insertHookSorted", "normalizeHeaders", "normalizeBodyForTransport", "calcDelay", "shouldRetry", "drainBody", "TimeoutError", "RequestBuilder", "sleep", "ms", "resolve", "MAX_POOL_SIZE", "Semaphore", "max", "next", "config", "transport", "maxConcurrent", "req", "retryOpts", "maxRetries", "attempt", "syncResult", "shortCircuit", "rawResponse", "networkStart", "networkMs", "meta", "response", "reqForPipeline", "error", "timeout", "plugin", "priority", "hook", "target", "signal", "body", "options", "graceful", "res", "recovered", "method", "responseType", "pooled", "m", "key"]
4
+ "sourcesContent": ["import type {\n IHyperCore,\n HyperTransport,\n HttpClientOptions,\n PluginContext,\n HyperPlugin,\n InternalRequest,\n HttpResponse,\n HyperttpError,\n RequestInterface,\n StreamResponse,\n RequestBodyData,\n Method,\n ResponseType,\n TransportResponse,\n} from \"@hyperttp/types\";\nimport { defaultConfig } from \"../defaultConfig.js\";\nimport { mapResponseFast, mapStreamFast, recycleResponse } from \"../utils/response.js\";\nimport { TransportManager } from \"../transports/manager.js\";\nimport {\n createPipelines,\n executeErrorPipeline,\n executeRequestPipeline,\n executeResponsePipeline,\n executeResponseDataPipeline,\n insertHookSorted,\n} from \"../utils/pipeline.js\";\nimport { normalizeHeaders, normalizeBodyForTransport } from \"../utils/normalize.js\";\nimport { calcDelay, shouldRetry, drainBody } from \"../utils/retryUtils.js\";\nimport { TimeoutError } from \"../utils/errors.js\";\nimport { RequestBuilder } from \"./RequestBuilder.js\";\n\ntype TransportArgs = Parameters<HyperTransport[\"execute\"]>[0];\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\nconst MAX_POOL_SIZE = 64;\n\n/**\n * @ru \u0421\u0435\u043C\u0430\u0444\u043E\u0440 \u0434\u043B\u044F \u043E\u0433\u0440\u0430\u043D\u0438\u0447\u0435\u043D\u0438\u044F \u043A\u043E\u043D\u043A\u0443\u0440\u0435\u043D\u0442\u043D\u044B\u0445 HTTP-\u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432.\n * @en Semaphore for limiting concurrent HTTP requests.\n */\nclass Semaphore {\n private current = 0;\n private queue: Array<() => void> = [];\n\n constructor(private max: number) {}\n\n /**\n * @ru \u041F\u044B\u0442\u0430\u0435\u0442\u0441\u044F \u0437\u0430\u0445\u0432\u0430\u0442\u0438\u0442\u044C \u0441\u043B\u043E\u0442 \u0431\u0435\u0437 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F.\n * @en Attempts to acquire a slot without waiting.\n * @returns true if the slot was acquired.\n */\n tryAcquire(): boolean {\n if (this.current < this.max) {\n this.current++;\n return true;\n }\n return false;\n }\n\n /**\n * @ru \u0417\u0430\u0445\u0432\u0430\u0442\u044B\u0432\u0430\u0435\u0442 \u0441\u043B\u043E\u0442, \u043E\u0436\u0438\u0434\u0430\u044F \u043F\u0440\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438.\n * @en Acquires a slot, waiting if necessary.\n * @returns Promise that resolves when the slot is acquired.\n */\n acquire(): Promise<void> {\n if (this.current < this.max) {\n this.current++;\n return Promise.resolve();\n }\n return new Promise((resolve) => {\n this.queue.push(() => {\n this.current++;\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 \u0437\u0430\u043F\u0443\u0441\u043A\u0430\u0435\u0442 \u043E\u0436\u0438\u0434\u0430\u044E\u0449\u0438\u0439 \u0438\u0437 \u043E\u0447\u0435\u0440\u0435\u0434\u0438.\n * @en Releases a slot and wakes the next waiter in the queue.\n */\n release(): void {\n const next = this.queue.shift();\n if (next) {\n next();\n } else {\n this.current--;\n }\n }\n}\n\n/**\n * @ru \u041E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043A\u043B\u0430\u0441\u0441 HTTP-\u043A\u043B\u0438\u0435\u043D\u0442\u0430 Hyperttp. \u0423\u043F\u0440\u0430\u0432\u043B\u044F\u0435\u0442 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u043E\u043C, \u043F\u043B\u0430\u0433\u0438\u043D\u0430\u043C\u0438, \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u043C\u0438 \u043F\u043E\u043F\u044B\u0442\u043A\u0430\u043C\u0438 \u0438 \u043F\u0443\u043B\u043E\u043C \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432.\n * @en Core Hyperttp HTTP client class. Manages transport, plugins, retries, and request pooling.\n */\nexport class HyperCore implements IHyperCore {\n public config: HttpClientOptions;\n private readonly transportManager: TransportManager;\n private readonly transportReady: Promise<HyperTransport>;\n private readonly defaultHeaders: Record<string, string | string[]>;\n private readonly pluginCtx: PluginContext;\n private readonly pipelines = createPipelines();\n private readonly requestBuilder = new RequestBuilder();\n private readonly requestPool: InternalRequest[] = [];\n\n private semaphore: Semaphore | null = null;\n private hasRequestPlugins = false;\n private hasResponseDataPlugins = false;\n private hasResponsePlugins = false;\n private hasErrorPlugins = false;\n\n private readonly _cachedMaxRetries: number;\n private readonly _cachedRetryOpts: {\n maxRetries?: number;\n [k: string]: unknown;\n };\n\n constructor(config: HttpClientOptions = defaultConfig, transport?: HyperTransport) {\n this.config = {\n ...defaultConfig,\n ...config,\n network: {\n ...defaultConfig.network,\n ...config.network,\n stealth:\n config.network?.stealth || defaultConfig.network?.stealth\n ? Object.assign({}, defaultConfig.network?.stealth, config.network?.stealth)\n : undefined,\n },\n };\n this.transportManager = new TransportManager(this.config, transport);\n this.transportReady = this.transportManager.getSync()\n ? Promise.resolve(this.transportManager.getSync()!)\n : this.transportManager.ensure();\n\n this.defaultHeaders = normalizeHeaders({\n Accept: \"application/json, text/plain, */*\",\n \"Accept-Encoding\": \"gzip, deflate, br\",\n \"User-Agent\": this.config.network?.userAgent ?? \"Hyperttp/2.0\",\n ...this.config.network?.headers,\n });\n\n const maxConcurrent = this.config.network?.maxConcurrent;\n this.semaphore =\n maxConcurrent != null && maxConcurrent > 0 ? new Semaphore(maxConcurrent) : null;\n\n this._cachedRetryOpts = this.config.retry ?? {};\n this._cachedMaxRetries = this._cachedRetryOpts.maxRetries ?? 0;\n\n this.pluginCtx = { config: this.config, core: this };\n }\n\n /**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u043C\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0433\u043E \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Returns the name of the current transport.\n * @returns Transport constructor name.\n */\n public async getTransportName(): Promise<string> {\n const t = this.transportManager.transport ?? (await this.transportManager.get());\n return t.constructor.name;\n }\n\n /**\n * @ru \u041E\u0441\u043D\u043E\u0432\u043D\u043E\u0439 \u043C\u0435\u0442\u043E\u0434 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u0438 \u0437\u0430\u043F\u0440\u043E\u0441\u0430 \u0447\u0435\u0440\u0435\u0437 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432 \u0438 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u0445 \u043F\u043E\u043F\u044B\u0442\u043E\u043A.\n * @en Core request dispatch method through transport with plugin and retry support.\n * @param req - The internal request to dispatch.\n * @returns Promise resolving to the HTTP response.\n */\n public async dispatch<T = unknown>(req: InternalRequest): Promise<HttpResponse<T>> {\n const retryOpts = this._cachedRetryOpts;\n const maxRetries = this._cachedMaxRetries;\n\n for (let attempt = 0; ; attempt++) {\n try {\n if (this.hasRequestPlugins) {\n const syncResult = executeRequestPipeline(this.pipelines.request, req, this.pluginCtx);\n const shortCircuit = syncResult instanceof Promise ? await syncResult : syncResult;\n\n if (shortCircuit != null) {\n this.recycleRequest(req);\n return shortCircuit as HttpResponse<T>;\n }\n }\n\n if (req.body != null) {\n req.body = normalizeBodyForTransport(req.body, req.headers);\n }\n\n const transport =\n this.transportManager.transport ??\n this.transportManager.getSync() ??\n (await this.transportReady);\n\n let acquired = false;\n if (this.semaphore) {\n acquired = this.semaphore.tryAcquire();\n if (!acquired) await this.semaphore.acquire();\n acquired = true;\n }\n let rawResponse: TransportResponse;\n const meta = req.meta as {\n responseType?: ResponseType;\n timings?: { networkMs?: number };\n };\n const shouldTrackTimings = !!meta.timings;\n const networkStart = shouldTrackTimings ? performance.now() : 0;\n try {\n rawResponse = await transport.execute(req as TransportArgs);\n } finally {\n if (acquired) this.semaphore?.release();\n }\n if (shouldTrackTimings) {\n meta.timings!.networkMs = performance.now() - networkStart;\n }\n\n if (attempt < maxRetries && shouldRetry(rawResponse.status, retryOpts)) {\n await drainBody(rawResponse.body);\n await sleep(calcDelay(attempt, retryOpts));\n continue;\n }\n\n if (this.hasResponseDataPlugins) {\n const syncResult = executeResponseDataPipeline(\n this.pipelines.responseData,\n rawResponse,\n this.pluginCtx,\n );\n rawResponse = syncResult instanceof Promise ? await syncResult : syncResult;\n }\n\n const response =\n meta.responseType === \"stream\"\n ? mapStreamFast(rawResponse)\n : mapResponseFast(rawResponse);\n\n if (this.hasResponsePlugins) {\n const syncResult = executeResponsePipeline(\n this.pipelines.responseMutators,\n this.pipelines.responseSideEffects,\n response as HttpResponse,\n req,\n this.pluginCtx,\n this.config.logger,\n );\n if (syncResult instanceof Promise) {\n await syncResult;\n }\n }\n\n this.recycleRequest(req);\n return response as HttpResponse<T>;\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n const timeout = this.config.network?.timeout;\n if (timeout != null && timeout > 0) {\n return this.handleDispatchError(new TimeoutError(req.url, timeout), req);\n }\n return this.handleDispatchError(error, req);\n }\n\n if (attempt < maxRetries && !req.signal?.aborted) {\n await sleep(calcDelay(attempt, retryOpts));\n continue;\n }\n\n return this.handleDispatchError(error as Error, req);\n }\n }\n }\n\n /**\n * @ru \u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0438\u0440\u0443\u0435\u0442 \u043F\u043B\u0430\u0433\u0438\u043D \u0441 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u043E\u0439 \u043F\u043E \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u0443. \u041F\u0440\u043E\u043F\u0443\u0441\u043A\u0430\u0435\u0442 \u043E\u0442\u043A\u043B\u044E\u0447\u0451\u043D\u043D\u044B\u0435 \u043F\u043B\u0430\u0433\u0438\u043D\u044B.\n * @en Registers a plugin sorted by priority. Skips disabled plugins.\n * @param plugin - The plugin instance to register.\n * @returns This instance for chaining.\n */\n public use(plugin: HyperPlugin): this {\n const isEnabled = plugin.enabled ? plugin.enabled(this.config) : true;\n if (!isEnabled) return this;\n\n plugin.setup?.(this.pluginCtx);\n const priority = (plugin as { priority?: number }).priority ?? 0;\n\n const hook = { name: plugin.name, priority, run: null as any };\n\n if (plugin.onRequest) {\n insertHookSorted(this.pipelines.request, {\n name: hook.name,\n priority: hook.priority,\n run: plugin.onRequest,\n });\n this.hasRequestPlugins = true;\n }\n if (plugin.onResponse) {\n const target =\n plugin.mode === \"background\"\n ? this.pipelines.responseSideEffects\n : this.pipelines.responseMutators;\n insertHookSorted(target, {\n name: hook.name,\n priority: hook.priority,\n run: plugin.onResponse,\n });\n this.hasResponsePlugins = true;\n }\n if (plugin.onResponseData) {\n insertHookSorted(this.pipelines.responseData, {\n name: hook.name,\n priority: hook.priority,\n run: plugin.onResponseData,\n });\n this.hasResponseDataPlugins = true;\n }\n if (plugin.onError) {\n insertHookSorted(this.pipelines.error, {\n name: hook.name,\n priority: hook.priority,\n run: plugin.onError,\n });\n this.hasErrorPlugins = true;\n }\n return this;\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 GET-\u0437\u0430\u043F\u0440\u043E\u0441. \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0431\u044B\u0441\u0442\u0440\u044B\u0439 \u043F\u0443\u0442\u044C \u0434\u043B\u044F \u043F\u0440\u043E\u0441\u0442\u044B\u0445 \u0441\u0442\u0440\u043E\u043A\u043E\u0432\u044B\u0445 URL \u0431\u0435\u0437 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432/\u043F\u043E\u0432\u0442\u043E\u0440\u043E\u0432.\n * @en Performs a GET request. Uses a fast path for bare string URLs without plugins/retries.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public get<T = unknown>(req: RequestInterface | string, signal?: AbortSignal) {\n if (\n typeof req === \"string\" &&\n req !== \"\" &&\n !signal &&\n !this.hasRequestPlugins &&\n !this.hasResponsePlugins &&\n !this.hasResponseDataPlugins &&\n !this.hasErrorPlugins &&\n this._cachedMaxRetries === 0\n ) {\n return this.fastGet<T>(req);\n }\n return this.dispatch<T>(this.acquireReq(\"GET\", req, undefined, signal));\n }\n\n private async fastGet<T>(url: string): Promise<HttpResponse<T>> {\n const resolvedUrl = this.requestBuilder.resolveUrl(url, this.config.baseURL);\n\n let acquired = false;\n if (this.semaphore) {\n acquired = this.semaphore.tryAcquire();\n if (!acquired) {\n await this.semaphore.acquire();\n acquired = true;\n }\n }\n\n const transport =\n this.transportManager.transport ??\n this.transportManager.getSync() ??\n (await this.transportReady);\n\n try {\n if (typeof (transport as any).fastRequest === \"function\") {\n return (await (transport as any).fastRequest(\n resolvedUrl,\n \"GET\",\n this.defaultHeaders,\n )) as HttpResponse<T>;\n }\n\n const raw = await transport.execute({\n method: \"GET\",\n url: resolvedUrl,\n headers: this.defaultHeaders as Record<string, string>,\n body: undefined,\n signal: undefined,\n stealth: this.config.network?.stealth,\n } as TransportArgs);\n\n return mapResponseFast(raw) as HttpResponse<T>;\n } finally {\n if (acquired) this.semaphore?.release();\n }\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 POST-\u0437\u0430\u043F\u0440\u043E\u0441.\n * @en Performs a POST request.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public post<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"POST\", req, body, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 PUT-\u0437\u0430\u043F\u0440\u043E\u0441.\n * @en Performs a PUT request.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public put<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"PUT\", req, body, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 PATCH-\u0437\u0430\u043F\u0440\u043E\u0441.\n * @en Performs a PATCH request.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public patch<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"PATCH\", req, body, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 DELETE-\u0437\u0430\u043F\u0440\u043E\u0441.\n * @en Performs a DELETE request.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public delete<T = unknown>(req: RequestInterface | string, signal?: AbortSignal) {\n return this.dispatch<T>(this.acquireReq(\"DELETE\", req, undefined, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 OPTIONS-\u0437\u0430\u043F\u0440\u043E\u0441.\n * @en Performs an OPTIONS request.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public options<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"OPTIONS\", req, body, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 HEAD-\u0437\u0430\u043F\u0440\u043E\u0441.\n * @en Performs a HEAD request.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response with null body.\n */\n public head(req: RequestInterface | string, signal?: AbortSignal) {\n return this.dispatch<null>(this.acquireReq(\"HEAD\", req, undefined, signal));\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 GET-\u0437\u0430\u043F\u0440\u043E\u0441 \u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0438\u043C\u0438\u043D\u0433-\u043E\u0442\u0432\u0435\u0442.\n * @en Performs a GET request and returns a streaming response.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to a StreamResponse.\n */\n public stream(\n req: RequestInterface | string,\n signal?: AbortSignal,\n ): Promise<StreamResponse<unknown>> {\n return this.dispatch(this.acquireReq(\"GET\", req, undefined, signal, \"stream\")) as Promise<\n StreamResponse<unknown>\n >;\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 POST-\u0437\u0430\u043F\u0440\u043E\u0441 \u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u0438\u043C\u0438\u043D\u0433-\u043E\u0442\u0432\u0435\u0442.\n * @en Performs a POST request and returns a streaming response.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to a StreamResponse.\n */\n public postStream<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ): Promise<StreamResponse<T>> {\n return this.dispatch(this.acquireReq(\"POST\", req, body, signal, \"stream\")) as Promise<\n StreamResponse<T>\n >;\n }\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043D\u043E\u0432\u044B\u0439 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 HyperCore \u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u043E\u0439/\u043F\u0435\u0440\u0435\u043E\u043F\u0440\u0435\u0434\u0435\u043B\u0451\u043D\u043D\u043E\u0439 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u0435\u0439.\n * @en Creates a new HyperCore instance with extended/overridden configuration.\n * @param options - Partial configuration overrides.\n * @returns A new HyperCore instance.\n */\n public extend(options: Partial<HttpClientOptions>): HyperCore {\n const nextConfig = { ...this.config };\n for (const key in options) {\n if (Object.prototype.hasOwnProperty.call(options, key)) {\n if (key === \"network\" && options.network) {\n nextConfig.network = {\n ...this.config.network,\n ...options.network,\n stealth:\n options.network.stealth || this.config.network?.stealth\n ? {\n ...this.config.network?.stealth,\n ...options.network.stealth,\n }\n : undefined,\n };\n } else {\n (nextConfig as any)[key] = (options as any)[key];\n }\n }\n }\n return new HyperCore(nextConfig, this.transportManager.transport ?? undefined);\n }\n\n /**\n * @ru \u0410\u043B\u0438\u0430\u0441 \u0434\u043B\u044F extend().\n * @en Alias for extend().\n * @param options - Partial configuration overrides.\n * @returns A new HyperCore instance.\n */\n public create(options: Partial<HttpClientOptions>): HyperCore {\n return this.extend(options);\n }\n\n /**\n * @ru \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043E\u0442\u0443 \u043A\u043B\u0438\u0435\u043D\u0442\u0430 \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 Shuts down the client and releases transport resources.\n * @param graceful - If true, waits for active requests to complete.\n * @returns Promise that resolves when shutdown is complete.\n */\n public destroy(graceful = true): Promise<void> {\n return this.transportManager.destroy(graceful);\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 GET-\u0437\u0430\u043F\u0440\u043E\u0441 \u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430, \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043D\u043E\u0435 \u043A\u0430\u043A JSON.\n * @en Performs a GET request and returns the response body parsed as JSON.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the parsed JSON value.\n */\n public json<T = unknown>(req: RequestInterface | string, signal?: AbortSignal): Promise<T> {\n return this.shortcut(req, signal).then((res) => {\n const out = res.json ? res.json<T>() : Promise.reject(new Error(\"json() not supported\"));\n recycleResponse(res);\n return out;\n });\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 GET-\u0437\u0430\u043F\u0440\u043E\u0441 \u0438 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u043A\u0430\u043A \u0441\u0442\u0440\u043E\u043A\u0443.\n * @en Performs a GET request and returns the response body as text.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the response text.\n */\n public text(req: RequestInterface | string, signal?: AbortSignal): Promise<string> {\n return this.shortcut(req, signal).then((res) => {\n const out = res.text ? res.text() : Promise.reject(new Error(\"text() not supported\"));\n recycleResponse(res);\n return out;\n });\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 GET-\u0437\u0430\u043F\u0440\u043E\u0441 \u0438 \u0441\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 (\u0431\u0435\u0437 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u044F).\n * @en Performs a GET request and discards the response body.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise that resolves when the body is discarded.\n */\n public dump(req: RequestInterface | string, signal?: AbortSignal): Promise<void> {\n return this.shortcut(req, signal).then((res) => {\n const out = res.dump ? res.dump() : Promise.resolve();\n recycleResponse(res);\n return out;\n });\n }\n\n private async handleDispatchError<T>(\n error: Error,\n req: InternalRequest,\n ): Promise<HttpResponse<T>> {\n try {\n if (this.hasErrorPlugins) {\n const recovered = await executeErrorPipeline(\n this.pipelines.error,\n error as HyperttpError,\n req,\n this.pluginCtx,\n );\n if (recovered != null) {\n if (this.hasResponsePlugins) {\n const syncResult = executeResponsePipeline(\n this.pipelines.responseMutators,\n this.pipelines.responseSideEffects,\n recovered as HttpResponse,\n req,\n this.pluginCtx,\n this.config.logger,\n );\n if (syncResult instanceof Promise) {\n await syncResult;\n }\n }\n return recovered as HttpResponse<T>;\n }\n }\n throw error;\n } finally {\n this.recycleRequest(req);\n }\n }\n\n private acquireReq(\n method: Method,\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n responseType?: \"stream\",\n ): InternalRequest {\n const pooled = this.requestPool.pop();\n return this.requestBuilder.build(\n method,\n req,\n body,\n signal,\n responseType,\n this.defaultHeaders,\n this.config,\n pooled,\n );\n }\n\n private recycleRequest(req: InternalRequest): void {\n if (this.requestPool.length < MAX_POOL_SIZE) {\n req.method = \"GET\";\n req.url = \"\";\n req.headers = this.defaultHeaders;\n req.body = undefined;\n req.signal = undefined;\n req.stealth = undefined;\n\n const m = req.meta as any;\n if (m) {\n m.responseType = undefined;\n\n if (typeof m.cleanupSignal === \"function\") {\n m.cleanupSignal();\n m.cleanupSignal = undefined;\n }\n\n if (m.timings) {\n m.timings.networkMs = undefined;\n }\n }\n this.requestPool.push(req);\n }\n }\n\n private shortcut(\n req: RequestInterface | string,\n signal?: AbortSignal,\n ): Promise<HttpResponse<unknown>> {\n const method = typeof req === \"string\" ? \"GET\" : (req.method ?? \"GET\");\n return this.dispatch(this.acquireReq(method, req, undefined, signal));\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["defaultConfig", "mapResponseFast", "mapStreamFast", "recycleResponse", "TransportManager", "createPipelines", "executeErrorPipeline", "executeRequestPipeline", "executeResponsePipeline", "executeResponseDataPipeline", "insertHookSorted", "normalizeHeaders", "normalizeBodyForTransport", "calcDelay", "shouldRetry", "drainBody", "TimeoutError", "RequestBuilder", "sleep", "ms", "resolve", "MAX_POOL_SIZE", "Semaphore", "max", "next", "config", "transport", "maxConcurrent", "req", "retryOpts", "maxRetries", "attempt", "syncResult", "shortCircuit", "acquired", "rawResponse", "meta", "shouldTrackTimings", "networkStart", "response", "error", "timeout", "plugin", "priority", "hook", "target", "signal", "url", "resolvedUrl", "raw", "body", "options", "nextConfig", "key", "graceful", "res", "out", "recovered", "method", "responseType", "pooled", "m"]
7
7
  }
@@ -1,11 +1,36 @@
1
1
  import type { HttpClientOptions, InternalRequest, RequestInterface, RequestBodyData, Method } from "@hyperttp/types";
2
+ /**
3
+ * @ru Строитель внутренних запросов с кэшированием URL и пулом объектов.
4
+ * @en Internal request builder with URL caching and object pooling.
5
+ */
2
6
  export declare class RequestBuilder {
3
7
  private urlCache;
4
- private urlCacheCount;
8
+ private cacheKeys;
9
+ private cacheIndex;
5
10
  private readonly MAX_CACHE_SIZE;
11
+ /**
12
+ * @ru Собирает InternalRequest из публичного API-вызова, переиспользуя пулированный объект.
13
+ * @en Builds an InternalRequest from a public API call, reusing a pooled object.
14
+ * @param method - HTTP method.
15
+ * @param req - URL string or RequestInterface object.
16
+ * @param body - Optional request body.
17
+ * @param signal - Optional abort signal.
18
+ * @param responseType - Response type hint ("stream" or undefined).
19
+ * @param defaultHeaders - Default headers to apply.
20
+ * @param config - Client configuration.
21
+ * @param pooled - Optional pre-allocated InternalRequest to reuse.
22
+ * @returns The built InternalRequest.
23
+ */
6
24
  build(method: Method, req: RequestInterface | string, body: RequestBodyData | undefined, signal: AbortSignal | undefined, responseType: "stream" | undefined, defaultHeaders: Record<string, string | string[]>, config: HttpClientOptions, pooled?: InternalRequest): InternalRequest;
7
- private resolveUrl;
8
- private ensureCacheSpace;
25
+ /**
26
+ * @ru Разрешает URL относительно baseURL с кэшированием результата.
27
+ * @en Resolves a URL against baseURL with result caching.
28
+ * @param url - URL to resolve (absolute or relative).
29
+ * @param baseURL - Optional base URL.
30
+ * @returns The resolved absolute URL.
31
+ */
32
+ resolveUrl(url: string, baseURL?: string): string;
33
+ private writeToCache;
9
34
  private appendQueryParams;
10
35
  }
11
36
  //# sourceMappingURL=RequestBuilder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"RequestBuilder.d.ts","sourceRoot":"","sources":["../../src/Core/RequestBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,MAAM,EAEP,MAAM,iBAAiB,CAAC;AA6CzB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,aAAa,CAAK;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IAEtC,KAAK,CACH,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAC9B,IAAI,EAAE,eAAe,GAAG,SAAS,EACjC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,YAAY,EAAE,QAAQ,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EACjD,MAAM,EAAE,iBAAiB,EACzB,MAAM,CAAC,EAAE,eAAe,GACvB,eAAe;IA6FlB,OAAO,CAAC,UAAU;IAwBlB,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,iBAAiB;CAa1B"}
1
+ {"version":3,"file":"RequestBuilder.d.ts","sourceRoot":"","sources":["../../src/Core/RequestBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,MAAM,EAEP,MAAM,iBAAiB,CAAC;AAgFzB;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAA+C;IAC/D,OAAO,CAAC,SAAS,CAAyC;IAC1D,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAO;IAEtC;;;;;;;;;;;;OAYG;IACH,KAAK,CACH,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAC9B,IAAI,EAAE,eAAe,GAAG,SAAS,EACjC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,YAAY,EAAE,QAAQ,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EACjD,MAAM,EAAE,iBAAiB,EACzB,MAAM,CAAC,EAAE,eAAe,GACvB,eAAe,CA2GjB;IAED;;;;;;OAMG;IACI,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAevD;IAED,OAAO,CAAC,YAAY;IAUpB,OAAO,CAAC,iBAAiB;CAa1B"}
@@ -1,2 +1,2 @@
1
- "use strict";import{normalizeBody as b,normalizeUrl as w}from"../utils/normalize.js";import{mergeHeadersFast as U}from"../utils/response.js";function y(i,e){if(typeof AbortSignal.any=="function")return AbortSignal.any([i,AbortSignal.timeout(e)]);const t=new AbortController;let r;const s=()=>{r?.(),t.abort(i.reason)},h=setTimeout(()=>{t.abort(new DOMException("Timeout","TimeoutError"))},e);return r=()=>{clearTimeout(h)},i.addEventListener("abort",s),t.signal.addEventListener("abort",()=>{i.removeEventListener("abort",s),clearTimeout(h)}),t.signal}function p(i,e){return e==null||e<=0?i:i?y(i,e):AbortSignal.timeout(e)}export class RequestBuilder{urlCache=Object.create(null);urlCacheCount=0;MAX_CACHE_SIZE=512;build(e,t,r,s,l,h,a,m){const n=m??{method:"GET",url:"",headers:h,body:void 0,signal:void 0,meta:{responseType:void 0,timings:{networkMs:void 0}},stealth:void 0},f=n.meta;if(typeof t=="string")return n.method=e,n.url=this.resolveUrl(t,a.baseURL),n.headers={...h},n.body=r!==void 0?b(e,r):void 0,n.signal=p(s,a.network?.timeout),f.responseType=l,n.stealth=a.network?.stealth,n;const o=w(t);if(!o)throw new Error(`[HyperCore] URL is undefined for ${e}`);let C;if(t.query){const u=o+"_base";let c=this.urlCache[u];c||(c=a.baseURL?new URL(o,a.baseURL).href:new URL(o).href,this.ensureCacheSpace(),this.urlCache[u]=c,this.urlCacheCount++);const d=new URL(c);this.appendQueryParams(d,t.query),C=d.href}else{let u=this.urlCache[o];u||(u=a.baseURL?new URL(o,a.baseURL).href:new URL(o).href,this.urlCacheCount>=this.MAX_CACHE_SIZE&&(this.urlCache=Object.create(null),this.urlCacheCount=0),this.urlCache[o]=u,this.urlCacheCount++),C=u}return n.method=e,n.url=C,n.headers=t.headers?U({...h},t.headers):{...h},n.body=b(e,t.body??r),n.signal=p(t.signal??s,a.network?.timeout),f.responseType=l??t.meta?.responseType,t.stealth?n.stealth=a.network?.stealth?{...a.network.stealth,...t.stealth}:t.stealth:n.stealth=a.network?.stealth,n}resolveUrl(e,t){if(!e)throw new Error("[HyperCore] URL is undefined");let r=this.urlCache[e];return r||((e.startsWith("http://")||e.startsWith("https://"))&&!e.includes("?")?r=e:r=t?new URL(e,t).href:new URL(e).href,this.urlCacheCount>=this.MAX_CACHE_SIZE&&(this.urlCache=Object.create(null),this.urlCacheCount=0),this.urlCache[e]=r,this.urlCacheCount++,r)}ensureCacheSpace(){this.urlCacheCount>=this.MAX_CACHE_SIZE&&(this.urlCache=Object.create(null),this.urlCacheCount=0)}appendQueryParams(e,t){for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)){const s=t[r];if(s==null)continue;if(Array.isArray(s))for(let l=0;l<s.length;l++)e.searchParams.append(r,String(s[l]));else e.searchParams.set(r,String(s))}}}
1
+ "use strict";import{normalizeBody as b,normalizeUrl as C}from"../utils/normalize.js";import{mergeHeadersFast as U}from"../utils/response.js";class y{activeControllers=[];constructor(){for(let e=0;e<64;e++)this.activeControllers.push(new AbortController)}acquire(e,t,r){const a=this.activeControllers.pop()??new AbortController;let h=!1;const l=()=>{h||(h=!0,e&&e.removeEventListener("abort",u),clearTimeout(o),this.activeControllers.push(a))},o=setTimeout(()=>{a.abort(new DOMException("Timeout","TimeoutError")),l()},t),u=()=>{a.abort(e?.reason),l()};return e&&e.addEventListener("abort",u),r.cleanupSignal=l,a.signal}}const L=new y;function m(d,e,t){return e==null||e<=0?d:L.acquire(d,e,t)}export class RequestBuilder{urlCache=Object.create(null);cacheKeys=Array.from({length:512});cacheIndex=0;MAX_CACHE_SIZE=512;build(e,t,r,a,h,l,o,u){const s=u??{method:"GET",url:"",headers:l,body:void 0,signal:void 0,meta:{responseType:void 0,timings:{networkMs:void 0}},stealth:void 0},f=s.meta;if(typeof t=="string"){if(s.method=e,s.url=this.resolveUrl(t,o.baseURL),r!==void 0){s.headers=Object.create(null);for(const n in l)s.headers[n]=l[n]}else s.headers=l;return s.body=r!==void 0?b(e,r):void 0,s.signal=m(a,o.network?.timeout,f),f.responseType=h,s.stealth=o.network?.stealth,s}const c=C(t);if(!c)throw new Error(`[HyperCore] URL is undefined for ${e}`);let p;if(t.query){const n=c+"_base";let i=this.urlCache[n];i||(i=o.baseURL?new URL(c,o.baseURL).href:new URL(c).href,this.writeToCache(n,i));const w=new URL(i);this.appendQueryParams(w,t.query),p=w.href}else{let n=this.urlCache[c];n||(n=o.baseURL?new URL(c,o.baseURL).href:new URL(c).href,this.writeToCache(c,n)),p=n}if(s.method=e,s.url=p,t.headers){const n=Object.create(null);for(const i in l)n[i]=l[i];s.headers=U(n,t.headers)}else s.headers=l;if(s.body=b(e,t.body??r),s.signal=m(t.signal??a,o.network?.timeout,f),f.responseType=h??t.meta?.responseType,t.stealth)if(o.network?.stealth){const n=Object.create(null);for(const i in o.network.stealth)n[i]=o.network.stealth[i];for(const i in t.stealth)n[i]=t.stealth[i];s.stealth=n}else s.stealth=t.stealth;else s.stealth=o.network?.stealth;return s}resolveUrl(e,t){if(!e)throw new Error("[HyperCore] URL is undefined");let r=this.urlCache[e];return r||((e.startsWith("http://")||e.startsWith("https://"))&&!e.includes("?")?r=e:r=t?new URL(e,t).href:new URL(e).href,this.writeToCache(e,r),r)}writeToCache(e,t){const r=this.cacheKeys[this.cacheIndex];r!==void 0&&delete this.urlCache[r],this.urlCache[e]=t,this.cacheKeys[this.cacheIndex]=e,this.cacheIndex=(this.cacheIndex+1)%this.MAX_CACHE_SIZE}appendQueryParams(e,t){for(const r in t)if(Object.prototype.hasOwnProperty.call(t,r)){const a=t[r];if(a==null)continue;if(Array.isArray(a))for(let h=0;h<a.length;h++)e.searchParams.append(r,String(a[h]));else e.searchParams.set(r,String(a))}}}
2
2
  //# sourceMappingURL=RequestBuilder.js.map