@hyperttp/core 1.5.3 → 1.5.5

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 +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 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 q,executeErrorPipeline as k,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(e=>setTimeout(e,l)),H=64;class j{max;current=0;queue=[];head=0;constructor(e){this.max=e}tryAcquire(){return this.current<this.max?(this.current++,!0):!1}acquire(){return this.current<this.max?(this.current++,Promise.resolve()):new Promise(e=>{this.queue.push(e)})}release(){if(this.head<this.queue.length){const e=this.queue[this.head++];this.current++,e(),this.head>64&&(this.queue=this.queue.slice(this.head),this.head=0)}else this.current--}}export class HyperCore{config;transportManager;transportReady;defaultHeaders;pluginCtx;pipelines=q();requestBuilder=new A;requestPool=[];semaphore=null;hasRequestPlugins=!1;hasResponseDataPlugins=!1;hasResponsePlugins=!1;hasErrorPlugins=!1;_cachedMaxRetries;_cachedRetryOpts;constructor(e=h,t){this.config={...h,...e,network:{...h.network,...e.network,stealth:e.network?.stealth||h.network?.stealth?Object.assign({},h.network?.stealth,e.network?.stealth):void 0}},this.transportManager=new E(this.config,t),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(e){const t=this._cachedRetryOpts,s=this._cachedMaxRetries;for(let r=0;;r++)try{if(this.hasRequestPlugins){const a=M(this.pipelines.request,e,this.pluginCtx),m=a instanceof Promise?await a:a;if(m!=null)return this.recycleRequest(e),m}e.body!=null&&(e.body=b(e.body,e.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=e.meta,d=!!c.timings,P=d?performance.now():0;try{o=await i.execute(e)}finally{n&&this.semaphore?.release()}if(d&&(c.timings.networkMs=performance.now()-P),r<s&&D(o.status,t)){await C(o.body),await w(R(r,t));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,e,this.pluginCtx,this.config.logger);a instanceof Promise&&await a}return this.recycleRequest(e),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(e.url,n),e):this.handleDispatchError(i,e)}if(r<s&&!e.signal?.aborted){await w(R(r,t));continue}return this.handleDispatchError(i,e)}}use(e){if(!(e.enabled?e.enabled(this.config):!0))return this;e.setup?.(this.pluginCtx);const s=e.priority??0,r={name:e.name,priority:s,run:null};if(e.onRequest&&(u(this.pipelines.request,{name:r.name,priority:r.priority,run:e.onRequest}),this.hasRequestPlugins=!0),e.onResponse){const i=e.mode==="background"?this.pipelines.responseSideEffects:this.pipelines.responseMutators;u(i,{name:r.name,priority:r.priority,run:e.onResponse}),this.hasResponsePlugins=!0}return e.onResponseData&&(u(this.pipelines.responseData,{name:r.name,priority:r.priority,run:e.onResponseData}),this.hasResponseDataPlugins=!0),e.onError&&(u(this.pipelines.error,{name:r.name,priority:r.priority,run:e.onError}),this.hasErrorPlugins=!0),this}get(e,t){return typeof e=="string"&&e!==""&&!t&&!this.hasRequestPlugins&&!this.hasResponsePlugins&&!this.hasResponseDataPlugins&&!this.hasErrorPlugins&&this._cachedMaxRetries===0?this.fastGet(e):this.dispatch(this.acquireReq("GET",e,void 0,t))}async fastGet(e){const t=this.requestBuilder.resolveUrl(e,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(t,"GET",this.defaultHeaders);const i=await r.execute({method:"GET",url:t,headers:this.defaultHeaders,body:void 0,signal:void 0,stealth:this.config.network?.stealth});return g(i)}finally{s&&this.semaphore?.release()}}post(e,t,s){return this.dispatch(this.acquireReq("POST",e,t,s))}put(e,t,s){return this.dispatch(this.acquireReq("PUT",e,t,s))}patch(e,t,s){return this.dispatch(this.acquireReq("PATCH",e,t,s))}delete(e,t){return this.dispatch(this.acquireReq("DELETE",e,void 0,t))}options(e,t,s){return this.dispatch(this.acquireReq("OPTIONS",e,t,s))}head(e,t){return this.dispatch(this.acquireReq("HEAD",e,void 0,t))}stream(e,t){return this.dispatch(this.acquireReq("GET",e,void 0,t,"stream"))}postStream(e,t,s){return this.dispatch(this.acquireReq("POST",e,t,s,"stream"))}extend(e){const t={...this.config};for(const s in e)Object.prototype.hasOwnProperty.call(e,s)&&(s==="network"&&e.network?t.network={...this.config.network,...e.network,stealth:e.network.stealth||this.config.network?.stealth?{...this.config.network?.stealth,...e.network.stealth}:void 0}:t[s]=e[s]);return new HyperCore(t,this.transportManager.transport??void 0)}create(e){return this.extend(e)}destroy(e=!0){return this.transportManager.destroy(e)}json(e,t){return this.shortcut(e,t).then(s=>{const r=s.json?s.json():Promise.reject(new Error("json() not supported"));return p(s),r})}text(e,t){return this.shortcut(e,t).then(s=>{const r=s.text?s.text():Promise.reject(new Error("text() not supported"));return p(s),r})}dump(e,t){return this.shortcut(e,t).then(s=>{const r=s.dump?s.dump():Promise.resolve();return p(s),r})}async handleDispatchError(e,t){try{if(this.hasErrorPlugins){const s=await k(this.pipelines.error,e,t,this.pluginCtx);if(s!=null){if(this.hasResponsePlugins){const r=y(this.pipelines.responseMutators,this.pipelines.responseSideEffects,s,t,this.pluginCtx,this.config.logger);r instanceof Promise&&await r}return s}}throw e}finally{this.recycleRequest(t)}}acquireReq(e,t,s,r,i){const n=this.requestPool.pop();return this.requestBuilder.build(e,t,s,r,i,this.defaultHeaders,this.config,n)}recycleRequest(e){if(this.requestPool.length<H){e.method="GET",e.url="",e.headers=this.defaultHeaders,e.body=void 0,e.signal=void 0,e.stealth=void 0;const t=e.meta;t&&(t.responseType=void 0,typeof t.cleanupSignal=="function"&&(t.cleanupSignal(),t.cleanupSignal=void 0),t.timings&&(t.timings.networkMs=void 0)),this.requestPool.push(e)}}shortcut(e,t){const s=typeof e=="string"?"GET":e.method??"GET";return this.dispatch(this.acquireReq(s,e,void 0,t))}}
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 q,executeErrorPipeline as k,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 z{current=0;max;queue;capacity;head=0;tail=0;size=0;constructor(t,e=1024){this.max=t,this.capacity=e;const s=[];s.length=e,this.queue=s}tryAcquire(){return this.current<this.max?(this.current++,!0):!1}acquire(){return this.current<this.max?(this.current++,Promise.resolve()):new Promise(t=>{this.size===this.capacity&&this.grow(),this.queue[this.tail]=t,this.tail=(this.tail+1)%this.capacity,this.size++})}release(){if(this.size>0){const t=this.queue[this.head];this.queue[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,t()}else this.current--}grow(){const t=this.capacity,e=t*2,s=[];s.length=e;for(let i=0;i<this.size;i++)s[i]=this.queue[(this.head+i)%t];this.queue=s,this.capacity=e,this.head=0,this.tail=this.size}}export class HyperCore{config;transportManager;transportReady;defaultHeaders;pluginCtx;pipelines=q();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 z(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 i=0;;i++)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 r=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 r.execute(t)}finally{n&&this.semaphore?.release()}if(d&&(c.timings.networkMs=performance.now()-P),i<s&&D(o.status,e)){await C(o.body),await w(R(i,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(r){if(r instanceof Error&&r.name==="AbortError"){const n=this.config.network?.timeout;return n!=null&&n>0?this.handleDispatchError(new O(t.url,n),t):this.handleDispatchError(r,t)}if(i<s&&!t.signal?.aborted){await w(R(i,e));continue}return this.handleDispatchError(r,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,run:null};if(t.onRequest&&(u(this.pipelines.request,{name:i.name,priority:i.priority,run:t.onRequest}),this.hasRequestPlugins=!0),t.onResponse){const r=t.mode==="background"?this.pipelines.responseSideEffects:this.pipelines.responseMutators;u(r,{name:i.name,priority:i.priority,run:t.onResponse}),this.hasResponsePlugins=!0}return t.onResponseData&&(u(this.pipelines.responseData,{name:i.name,priority:i.priority,run:t.onResponseData}),this.hasResponseDataPlugins=!0),t.onError&&(u(this.pipelines.error,{name:i.name,priority:i.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 i=this.transportManager.transport??this.transportManager.getSync()??await this.transportReady;try{if(typeof i.fastRequest=="function")return await i.fastRequest(e,"GET",this.defaultHeaders);const r=await i.execute({method:"GET",url:e,headers:this.defaultHeaders,body:void 0,signal:void 0,stealth:this.config.network?.stealth});return g(r)}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 i=s.json?s.json():Promise.reject(new Error("json() not supported"));return p(s),i})}text(t,e){return this.shortcut(t,e).then(s=>{const i=s.text?s.text():Promise.reject(new Error("text() not supported"));return p(s),i})}dump(t,e){return this.shortcut(t,e).then(s=>{const i=s.dump?s.dump():Promise.resolve();return p(s),i})}async handleDispatchError(t,e){try{if(this.hasErrorPlugins){const s=await k(this.pipelines.error,t,e,this.pluginCtx);if(s!=null){if(this.hasResponsePlugins){const i=y(this.pipelines.responseMutators,this.pipelines.responseSideEffects,s,e,this.pluginCtx,this.config.logger);i instanceof Promise&&await i}return s}}throw t}finally{this.recycleRequest(e)}}acquireReq(t,e,s,i,r){const n=this.requestPool.pop();return this.requestBuilder.build(t,e,s,i,r,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, 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 private head = 0;\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(resolve);\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 if (this.head < this.queue.length) {\n const next = this.queue[this.head++]!;\n this.current++;\n next();\n if (this.head > 64) {\n this.queue = this.queue.slice(this.head);\n this.head = 0;\n }\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"]
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 \u0412\u044B\u0441\u043E\u043A\u043E\u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u0441\u0435\u043C\u0430\u0444\u043E\u0440 \u043D\u0430 \u0431\u0430\u0437\u0435 \u043A\u043E\u043B\u044C\u0446\u0435\u0432\u043E\u0433\u043E \u0431\u0443\u0444\u0435\u0440\u0430.\n * \u0413\u0430\u0440\u0430\u043D\u0442\u0438\u0440\u0443\u0435\u0442 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u0430\u043B\u043B\u043E\u043A\u0430\u0446\u0438\u0439 \u043C\u0430\u0441\u0441\u0438\u0432\u043E\u0432 \u0432 steady-state \u0440\u0435\u0436\u0438\u043C\u0435.\n * @en High-performance semaphore backed by a ring buffer.\n * Guarantees zero array allocations in steady state.\n */\nclass Semaphore {\n private current = 0;\n private readonly max: number;\n\n private queue: Array<(() => void) | undefined>;\n private capacity: number;\n private head = 0;\n private tail = 0;\n private size = 0;\n\n constructor(max: number, initialCapacity = 1024) {\n this.max = max;\n this.capacity = initialCapacity;\n const arr: Array<(() => void) | undefined> = [];\n arr.length = initialCapacity;\n this.queue = arr;\n }\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\n return new Promise<void>((resolve) => {\n if (this.size === this.capacity) {\n this.grow();\n }\n\n this.queue[this.tail] = resolve;\n this.tail = (this.tail + 1) % this.capacity;\n this.size++;\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 if (this.size > 0) {\n const next = this.queue[this.head]!;\n this.queue[this.head] = undefined;\n this.head = (this.head + 1) % this.capacity;\n this.size--;\n next();\n } else {\n this.current--;\n }\n }\n\n /**\n * @ru \u0423\u0434\u0432\u0430\u0438\u0432\u0430\u0435\u0442 \u0435\u043C\u043A\u043E\u0441\u0442\u044C \u0431\u0443\u0444\u0435\u0440\u0430 \u043F\u0440\u0438 \u043F\u0435\u0440\u0435\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0438.\n * @en Doubles buffer capacity on overflow.\n */\n private grow(): void {\n const oldCapacity = this.capacity;\n const newCapacity = oldCapacity * 2;\n\n const newQueue: Array<(() => void) | undefined> = [];\n newQueue.length = newCapacity;\n\n for (let i = 0; i < this.size; i++) {\n newQueue[i] = this.queue[(this.head + i) % oldCapacity];\n }\n\n this.queue = newQueue;\n this.capacity = newCapacity;\n this.head = 0;\n this.tail = this.size;\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", "initialCapacity", "arr", "next", "oldCapacity", "newCapacity", "newQueue", "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 +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;AAiFzB;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2D;IAEpF;;;;;;;;;;;;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,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;AAmEzB;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2D;IAEpF;;;;;;;;;;;;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,iBAAiB;CAa1B"}
@@ -1,2 +1,2 @@
1
- "use strict";import{CacheManager as U}from"hcacher";import{normalizeBody as b,normalizeUrl as y}from"../utils/normalize.js";import{mergeHeadersFast as C}from"../utils/response.js";class L{activeControllers=[];constructor(){for(let e=0;e<64;e++)this.activeControllers.push(new AbortController)}acquire(e,t,n){const a=this.activeControllers.pop()??new AbortController;let h=!1;const i=()=>{h||(h=!0,e&&e.removeEventListener("abort",f),clearTimeout(o),this.activeControllers.push(a))},o=setTimeout(()=>{a.abort(new DOMException("Timeout","TimeoutError")),i()},t),f=()=>{a.abort(e?.reason),i()};return e&&e.addEventListener("abort",f),n.cleanupSignal=i,a.signal}}const R=new L;function m(u,e,t){return e==null||e<=0?u:R.acquire(u,e,t)}export class RequestBuilder{urlCache=new U({maxSize:512,ttl:6e4});build(e,t,n,a,h,i,o,f){const r=f??{method:"GET",url:"",headers:i,body:void 0,signal:void 0,meta:{responseType:void 0,timings:{networkMs:void 0}},stealth:void 0},p=r.meta;if(typeof t=="string"){if(r.method=e,r.url=this.resolveUrl(t,o.baseURL),n!==void 0){r.headers=Object.create(null);for(const s in i)r.headers[s]=i[s]}else r.headers=i;return r.body=n!==void 0?b(e,n):void 0,r.signal=m(a,o.network?.timeout,p),p.responseType=h,r.stealth=o.network?.stealth,r}const c=y(t);if(!c)throw new Error(`[HyperCore] URL is undefined for ${e}`);let d;if(t.query){const s=c+"_base";let l=this.urlCache.get(s);l||(l=o.baseURL?new URL(c,o.baseURL).href:new URL(c).href,this.urlCache.set(s,l));const w=new URL(l);this.appendQueryParams(w,t.query),d=w.href}else{let s=this.urlCache.get(c);s||(s=o.baseURL?new URL(c,o.baseURL).href:new URL(c).href,this.urlCache.set(c,s)),d=s}if(r.method=e,r.url=d,t.headers){const s=Object.create(null);for(const l in i)s[l]=i[l];r.headers=C(s,t.headers)}else r.headers=i;if(r.body=b(e,t.body??n),r.signal=m(t.signal??a,o.network?.timeout,p),p.responseType=h??t.meta?.responseType,t.stealth)if(o.network?.stealth){const s=Object.create(null);for(const l in o.network.stealth)s[l]=o.network.stealth[l];for(const l in t.stealth)s[l]=t.stealth[l];r.stealth=s}else r.stealth=t.stealth;else r.stealth=o.network?.stealth;return r}resolveUrl(e,t){if(!e)throw new Error("[HyperCore] URL is undefined");let n=this.urlCache.get(e);return n||((e.startsWith("http://")||e.startsWith("https://"))&&!e.includes("?")?n=e:n=t?new URL(e,t).href:new URL(e).href,this.urlCache.set(e,n),n)}appendQueryParams(e,t){for(const n in t)if(Object.prototype.hasOwnProperty.call(t,n)){const a=t[n];if(a==null)continue;if(Array.isArray(a))for(let h=0;h<a.length;h++)e.searchParams.append(n,String(a[h]));else e.searchParams.set(n,String(a))}}}
1
+ "use strict";import{CacheManager as U}from"hcacher";import{normalizeBody as m,normalizeUrl as y}from"../utils/normalize.js";import{mergeHeadersFast as L}from"../utils/response.js";function R(h,t,e){const r=new AbortController;let l=!1;const i=()=>{l||(l=!0,h&&h.removeEventListener("abort",a),clearTimeout(c))},c=setTimeout(()=>{r.abort(new DOMException("Timeout","TimeoutError")),i()},t),a=()=>{r.abort(h?.reason),i()};return h&&h.addEventListener("abort",a),e.cleanupSignal=i,r.signal}function w(h,t,e){return t==null||t<=0?h:R(h,t,e)}export class RequestBuilder{urlCache=new U({maxSize:512,ttl:6e4});build(t,e,r,l,i,c,a,b){const n=b??{method:"GET",url:"",headers:c,body:void 0,signal:void 0,meta:{responseType:void 0,timings:{networkMs:void 0}},stealth:void 0},f=n.meta;if(typeof e=="string"){if(n.method=t,n.url=this.resolveUrl(e,a.baseURL),r!==void 0){n.headers=Object.create(null);for(const s in c)n.headers[s]=c[s]}else n.headers=c;return n.body=r!==void 0?m(t,r):void 0,n.signal=w(l,a.network?.timeout,f),f.responseType=i,n.stealth=a.network?.stealth,n}const u=y(e);if(!u)throw new Error(`[HyperCore] URL is undefined for ${t}`);let d;if(e.query){const s=u+"_base";let o=this.urlCache.get(s);o||(o=a.baseURL?new URL(u,a.baseURL).href:new URL(u).href,this.urlCache.set(s,o));const p=new URL(o);this.appendQueryParams(p,e.query),d=p.href}else{let s=this.urlCache.get(u);s||(s=a.baseURL?new URL(u,a.baseURL).href:new URL(u).href,this.urlCache.set(u,s)),d=s}if(n.method=t,n.url=d,e.headers){const s=Object.create(null);for(const o in c)s[o]=c[o];n.headers=L(s,e.headers)}else n.headers=c;if(n.body=m(t,e.body??r),n.signal=w(e.signal??l,a.network?.timeout,f),f.responseType=i??e.meta?.responseType,e.stealth)if(a.network?.stealth){const s=Object.create(null);for(const o in a.network.stealth)s[o]=a.network.stealth[o];for(const o in e.stealth)s[o]=e.stealth[o];n.stealth=s}else n.stealth=e.stealth;else n.stealth=a.network?.stealth;return n}resolveUrl(t,e){if(!t)throw new Error("[HyperCore] URL is undefined");let r=this.urlCache.get(t);return r||((t.startsWith("http://")||t.startsWith("https://"))&&!t.includes("?")?r=t:r=e?new URL(t,e).href:new URL(t).href,this.urlCache.set(t,r),r)}appendQueryParams(t,e){for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const l=e[r];if(l==null)continue;if(Array.isArray(l))for(let i=0;i<l.length;i++)t.searchParams.append(r,String(l[i]));else t.searchParams.set(r,String(l))}}}
2
2
  //# sourceMappingURL=RequestBuilder.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/Core/RequestBuilder.ts"],
4
- "sourcesContent": ["import type {\n HttpClientOptions,\n InternalRequest,\n RequestInterface,\n RequestBodyData,\n Method,\n ResponseType,\n} from \"@hyperttp/types\";\nimport { CacheManager } from \"hcacher\";\nimport { normalizeBody, normalizeUrl } from \"../utils/normalize.js\";\nimport { mergeHeadersFast } from \"../utils/response.js\";\n\n/**\n * @ru \u041C\u0435\u043D\u0435\u0434\u0436\u0435\u0440 \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0445 AbortController \u0434\u043B\u044F \u0443\u0441\u0442\u0440\u0430\u043D\u0435\u043D\u0438\u044F \u0430\u043B\u043B\u043E\u043A\u0430\u0446\u0438\u0439 \u043F\u0440\u0438 \u0442\u0430\u0439\u043C-\u0430\u0443\u0442\u0430\u0445.\n * @en Reusable AbortController manager to eliminate allocations on timeouts.\n */\nclass AbortHandlerManager {\n public activeControllers: AbortController[] = [];\n\n constructor() {\n for (let i = 0; i < 64; i++) {\n this.activeControllers.push(new AbortController());\n }\n }\n\n /**\n * @ru \u0417\u0430\u0445\u0432\u0430\u0442\u044B\u0432\u0430\u0435\u0442 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440 \u0438\u0437 \u043F\u0443\u043B\u0430, \u043D\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u0442 \u0442\u0430\u0439\u043C-\u0430\u0443\u0442 \u0438 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u0439 \u0441\u0438\u0433\u043D\u0430\u043B.\n * @en Acquires a controller from the pool, sets up timeout and user signal.\n * @param userSignal - Optional external abort signal.\n * @param timeoutMs - Timeout in milliseconds.\n * @param meta - Metadata object receiving cleanup function.\n * @returns AbortSignal bound to the timeout and user signal.\n */\n public acquire(userSignal: AbortSignal | undefined, timeoutMs: number, meta: any): AbortSignal {\n const controller = this.activeControllers.pop() ?? new AbortController();\n\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n\n if (userSignal) {\n userSignal.removeEventListener(\"abort\", onUserAbort);\n }\n clearTimeout(timeoutId);\n\n this.activeControllers.push(controller);\n };\n\n const timeoutId = setTimeout(() => {\n controller.abort(new DOMException(\"Timeout\", \"TimeoutError\"));\n cleanup();\n }, timeoutMs);\n\n const onUserAbort = () => {\n controller.abort(userSignal?.reason);\n cleanup();\n };\n\n if (userSignal) {\n userSignal.addEventListener(\"abort\", onUserAbort);\n }\n\n meta.cleanupSignal = cleanup;\n\n return controller.signal;\n }\n}\n\nconst abortManager = new AbortHandlerManager();\n\n/**\n * @ru \u041F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442 \u0442\u0430\u0439\u043C-\u0430\u0443\u0442 \u043A \u0441\u0438\u0433\u043D\u0430\u043B\u0443 \u043E\u0442\u043C\u0435\u043D\u044B \u0447\u0435\u0440\u0435\u0437 \u043F\u0443\u043B \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u043C\u044B\u0445 \u043A\u043E\u043D\u0442\u0440\u043E\u043B\u043B\u0435\u0440\u043E\u0432.\n * @en Applies a timeout to the abort signal via a pool of reusable controllers.\n * @param signal - Optional external abort signal.\n * @param timeout - Timeout in milliseconds (skip if null/<=0).\n * @param meta - Metadata object receiving cleanup function.\n * @returns New abort signal with timeout, or the original signal.\n */\nfunction applyTimeout(\n signal: AbortSignal | undefined,\n timeout: number | undefined,\n meta: any,\n): AbortSignal | undefined {\n if (timeout == null || timeout <= 0) return signal;\n return abortManager.acquire(signal, timeout, meta);\n}\n\n/**\n * @ru \u0421\u0442\u0440\u043E\u0438\u0442\u0435\u043B\u044C \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u0441 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C URL \u0438 \u043F\u0443\u043B\u043E\u043C \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432.\n * @en Internal request builder with URL caching and object pooling.\n */\nexport class RequestBuilder {\n private readonly urlCache = new CacheManager<string>({ maxSize: 512, ttl: 60_000 });\n\n /**\n * @ru \u0421\u043E\u0431\u0438\u0440\u0430\u0435\u0442 InternalRequest \u0438\u0437 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0433\u043E API-\u0432\u044B\u0437\u043E\u0432\u0430, \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u043F\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u043E\u0431\u044A\u0435\u043A\u0442.\n * @en Builds an InternalRequest from a public API call, reusing a pooled object.\n * @param method - HTTP method.\n * @param req - URL string or RequestInterface object.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @param responseType - Response type hint (\"stream\" or undefined).\n * @param defaultHeaders - Default headers to apply.\n * @param config - Client configuration.\n * @param pooled - Optional pre-allocated InternalRequest to reuse.\n * @returns The built InternalRequest.\n */\n build(\n method: Method,\n req: RequestInterface | string,\n body: RequestBodyData | undefined,\n signal: AbortSignal | undefined,\n responseType: \"stream\" | undefined,\n defaultHeaders: Record<string, string | string[]>,\n config: HttpClientOptions,\n pooled?: InternalRequest,\n ): InternalRequest {\n const internalReq = pooled ?? {\n method: \"GET\" as Method,\n url: \"\",\n headers: defaultHeaders,\n body: undefined,\n signal: undefined,\n meta: {\n responseType: undefined as ResponseType | undefined,\n timings: {\n networkMs: undefined as number | undefined,\n },\n },\n stealth: undefined,\n };\n\n const metaObj = internalReq.meta as {\n responseType: ResponseType | undefined;\n timings: {\n networkMs: number | undefined;\n };\n cleanupSignal?: () => void;\n };\n\n if (typeof req === \"string\") {\n internalReq.method = method;\n internalReq.url = this.resolveUrl(req, config.baseURL);\n\n if (body !== undefined) {\n internalReq.headers = Object.create(null);\n for (const k in defaultHeaders) {\n internalReq.headers[k] = defaultHeaders[k]!;\n }\n } else {\n internalReq.headers = defaultHeaders;\n }\n\n internalReq.body = body !== undefined ? normalizeBody(method, body) : undefined;\n internalReq.signal = applyTimeout(signal, config.network?.timeout, metaObj);\n metaObj.responseType = responseType;\n internalReq.stealth = config.network?.stealth;\n return internalReq;\n }\n\n const rawUrl = normalizeUrl(req);\n if (!rawUrl) throw new Error(`[HyperCore] URL is undefined for ${method}`);\n\n let finalUrl: string;\n\n if (req.query) {\n const cacheKey = rawUrl + \"_base\";\n let baseUrl = this.urlCache.get(cacheKey);\n\n if (!baseUrl) {\n baseUrl = config.baseURL ? new URL(rawUrl, config.baseURL).href : new URL(rawUrl).href;\n this.urlCache.set(cacheKey, baseUrl);\n }\n\n const urlObj = new URL(baseUrl);\n this.appendQueryParams(urlObj, req.query);\n finalUrl = urlObj.href;\n } else {\n let cachedUrl = this.urlCache.get(rawUrl);\n if (!cachedUrl) {\n cachedUrl = config.baseURL ? new URL(rawUrl, config.baseURL).href : new URL(rawUrl).href;\n this.urlCache.set(rawUrl, cachedUrl);\n }\n finalUrl = cachedUrl;\n }\n\n internalReq.method = method;\n internalReq.url = finalUrl;\n\n if (req.headers) {\n const targetHeaders = Object.create(null);\n for (const k in defaultHeaders) {\n targetHeaders[k] = defaultHeaders[k]!;\n }\n internalReq.headers = mergeHeadersFast(targetHeaders, req.headers);\n } else {\n internalReq.headers = defaultHeaders;\n }\n\n internalReq.body = normalizeBody(method, req.body ?? body);\n internalReq.signal = applyTimeout(req.signal ?? signal, config.network?.timeout, metaObj);\n\n metaObj.responseType =\n responseType ?? (req.meta as { responseType?: ResponseType })?.responseType;\n\n if (req.stealth) {\n if (config.network?.stealth) {\n const nextStealth = Object.create(null);\n for (const k in config.network.stealth) {\n nextStealth[k] = (config.network.stealth as any)[k];\n }\n for (const k in req.stealth) {\n nextStealth[k] = (req.stealth as any)[k];\n }\n internalReq.stealth = nextStealth;\n } else {\n internalReq.stealth = req.stealth;\n }\n } else {\n internalReq.stealth = config.network?.stealth;\n }\n\n return internalReq;\n }\n\n /**\n * @ru \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 URL \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u043E baseURL \u0441 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430.\n * @en Resolves a URL against baseURL with result caching.\n * @param url - URL to resolve (absolute or relative).\n * @param baseURL - Optional base URL.\n * @returns The resolved absolute URL.\n */\n public resolveUrl(url: string, baseURL?: string): string {\n if (!url) throw new Error(\"[HyperCore] URL is undefined\");\n\n let finalUrl = this.urlCache.get(url);\n if (finalUrl) return finalUrl;\n\n const isAbsolute = url.startsWith(\"http://\") || url.startsWith(\"https://\");\n if (isAbsolute && !url.includes(\"?\")) {\n finalUrl = url;\n } else {\n finalUrl = baseURL ? new URL(url, baseURL).href : new URL(url).href;\n }\n\n this.urlCache.set(url, finalUrl);\n return finalUrl;\n }\n\n private appendQueryParams(url: URL, query: Record<string, unknown>): void {\n for (const k in query) {\n if (Object.prototype.hasOwnProperty.call(query, k)) {\n const v = query[k];\n if (v == null) continue;\n if (Array.isArray(v)) {\n for (let j = 0; j < v.length; j++) url.searchParams.append(k, String(v[j]));\n } else {\n url.searchParams.set(k, String(v));\n }\n }\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["CacheManager", "normalizeBody", "normalizeUrl", "mergeHeadersFast", "AbortHandlerManager", "i", "userSignal", "timeoutMs", "meta", "controller", "cleaned", "cleanup", "onUserAbort", "timeoutId", "abortManager", "applyTimeout", "signal", "timeout", "method", "req", "body", "responseType", "defaultHeaders", "config", "pooled", "internalReq", "metaObj", "k", "rawUrl", "finalUrl", "cacheKey", "baseUrl", "urlObj", "cachedUrl", "targetHeaders", "nextStealth", "url", "baseURL", "query", "v", "j"]
4
+ "sourcesContent": ["import type {\n HttpClientOptions,\n InternalRequest,\n RequestInterface,\n RequestBodyData,\n Method,\n ResponseType,\n} from \"@hyperttp/types\";\nimport { CacheManager } from \"hcacher\";\nimport { normalizeBody, normalizeUrl } from \"../utils/normalize.js\";\nimport { mergeHeadersFast } from \"../utils/response.js\";\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 AbortSignal \u0441 \u0442\u0430\u0439\u043C-\u0430\u0443\u0442\u043E\u043C \u0438 \u043F\u0440\u0438\u0432\u044F\u0437\u043A\u043E\u0439 \u043A \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u043C\u0443 \u0441\u0438\u0433\u043D\u0430\u043B\u0443 \u043E\u0442\u043C\u0435\u043D\u044B.\n * @en Creates an AbortSignal with timeout and user abort signal binding.\n * @param userSignal - Optional external abort signal.\n * @param timeoutMs - Timeout in milliseconds.\n * @param meta - Metadata object receiving cleanup function.\n * @returns AbortSignal bound to the timeout and user signal.\n */\nfunction createTimeoutSignal(\n userSignal: AbortSignal | undefined,\n timeoutMs: number,\n meta: any,\n): AbortSignal {\n const controller = new AbortController();\n\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n\n if (userSignal) {\n userSignal.removeEventListener(\"abort\", onUserAbort);\n }\n clearTimeout(timeoutId);\n };\n\n const timeoutId = setTimeout(() => {\n controller.abort(new DOMException(\"Timeout\", \"TimeoutError\"));\n cleanup();\n }, timeoutMs);\n\n const onUserAbort = () => {\n controller.abort(userSignal?.reason);\n cleanup();\n };\n\n if (userSignal) {\n userSignal.addEventListener(\"abort\", onUserAbort);\n }\n\n meta.cleanupSignal = cleanup;\n\n return controller.signal;\n}\n\n/**\n * @ru \u041F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442 \u0442\u0430\u0439\u043C-\u0430\u0443\u0442 \u043A \u0441\u0438\u0433\u043D\u0430\u043B\u0443 \u043E\u0442\u043C\u0435\u043D\u044B.\n * @en Applies a timeout to the abort signal.\n * @param signal - Optional external abort signal.\n * @param timeout - Timeout in milliseconds (skip if null/<=0).\n * @param meta - Metadata object receiving cleanup function.\n * @returns New abort signal with timeout, or the original signal.\n */\nfunction applyTimeout(\n signal: AbortSignal | undefined,\n timeout: number | undefined,\n meta: any,\n): AbortSignal | undefined {\n if (timeout == null || timeout <= 0) return signal;\n return createTimeoutSignal(signal, timeout, meta);\n}\n\n/**\n * @ru \u0421\u0442\u0440\u043E\u0438\u0442\u0435\u043B\u044C \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u0441 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C URL \u0438 \u043F\u0443\u043B\u043E\u043C \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432.\n * @en Internal request builder with URL caching and object pooling.\n */\nexport class RequestBuilder {\n private readonly urlCache = new CacheManager<string>({ maxSize: 512, ttl: 60_000 });\n\n /**\n * @ru \u0421\u043E\u0431\u0438\u0440\u0430\u0435\u0442 InternalRequest \u0438\u0437 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0433\u043E API-\u0432\u044B\u0437\u043E\u0432\u0430, \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u043F\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u043E\u0431\u044A\u0435\u043A\u0442.\n * @en Builds an InternalRequest from a public API call, reusing a pooled object.\n * @param method - HTTP method.\n * @param req - URL string or RequestInterface object.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @param responseType - Response type hint (\"stream\" or undefined).\n * @param defaultHeaders - Default headers to apply.\n * @param config - Client configuration.\n * @param pooled - Optional pre-allocated InternalRequest to reuse.\n * @returns The built InternalRequest.\n */\n build(\n method: Method,\n req: RequestInterface | string,\n body: RequestBodyData | undefined,\n signal: AbortSignal | undefined,\n responseType: \"stream\" | undefined,\n defaultHeaders: Record<string, string | string[]>,\n config: HttpClientOptions,\n pooled?: InternalRequest,\n ): InternalRequest {\n const internalReq = pooled ?? {\n method: \"GET\" as Method,\n url: \"\",\n headers: defaultHeaders,\n body: undefined,\n signal: undefined,\n meta: {\n responseType: undefined as ResponseType | undefined,\n timings: {\n networkMs: undefined as number | undefined,\n },\n },\n stealth: undefined,\n };\n\n const metaObj = internalReq.meta as {\n responseType: ResponseType | undefined;\n timings: {\n networkMs: number | undefined;\n };\n cleanupSignal?: () => void;\n };\n\n if (typeof req === \"string\") {\n internalReq.method = method;\n internalReq.url = this.resolveUrl(req, config.baseURL);\n\n if (body !== undefined) {\n internalReq.headers = Object.create(null);\n for (const k in defaultHeaders) {\n internalReq.headers[k] = defaultHeaders[k]!;\n }\n } else {\n internalReq.headers = defaultHeaders;\n }\n\n internalReq.body = body !== undefined ? normalizeBody(method, body) : undefined;\n internalReq.signal = applyTimeout(signal, config.network?.timeout, metaObj);\n metaObj.responseType = responseType;\n internalReq.stealth = config.network?.stealth;\n return internalReq;\n }\n\n const rawUrl = normalizeUrl(req);\n if (!rawUrl) throw new Error(`[HyperCore] URL is undefined for ${method}`);\n\n let finalUrl: string;\n\n if (req.query) {\n const cacheKey = rawUrl + \"_base\";\n let baseUrl = this.urlCache.get(cacheKey);\n\n if (!baseUrl) {\n baseUrl = config.baseURL ? new URL(rawUrl, config.baseURL).href : new URL(rawUrl).href;\n this.urlCache.set(cacheKey, baseUrl);\n }\n\n const urlObj = new URL(baseUrl);\n this.appendQueryParams(urlObj, req.query);\n finalUrl = urlObj.href;\n } else {\n let cachedUrl = this.urlCache.get(rawUrl);\n if (!cachedUrl) {\n cachedUrl = config.baseURL ? new URL(rawUrl, config.baseURL).href : new URL(rawUrl).href;\n this.urlCache.set(rawUrl, cachedUrl);\n }\n finalUrl = cachedUrl;\n }\n\n internalReq.method = method;\n internalReq.url = finalUrl;\n\n if (req.headers) {\n const targetHeaders = Object.create(null);\n for (const k in defaultHeaders) {\n targetHeaders[k] = defaultHeaders[k]!;\n }\n internalReq.headers = mergeHeadersFast(targetHeaders, req.headers);\n } else {\n internalReq.headers = defaultHeaders;\n }\n\n internalReq.body = normalizeBody(method, req.body ?? body);\n internalReq.signal = applyTimeout(req.signal ?? signal, config.network?.timeout, metaObj);\n\n metaObj.responseType =\n responseType ?? (req.meta as { responseType?: ResponseType })?.responseType;\n\n if (req.stealth) {\n if (config.network?.stealth) {\n const nextStealth = Object.create(null);\n for (const k in config.network.stealth) {\n nextStealth[k] = (config.network.stealth as any)[k];\n }\n for (const k in req.stealth) {\n nextStealth[k] = (req.stealth as any)[k];\n }\n internalReq.stealth = nextStealth;\n } else {\n internalReq.stealth = req.stealth;\n }\n } else {\n internalReq.stealth = config.network?.stealth;\n }\n\n return internalReq;\n }\n\n /**\n * @ru \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 URL \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u043E baseURL \u0441 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430.\n * @en Resolves a URL against baseURL with result caching.\n * @param url - URL to resolve (absolute or relative).\n * @param baseURL - Optional base URL.\n * @returns The resolved absolute URL.\n */\n public resolveUrl(url: string, baseURL?: string): string {\n if (!url) throw new Error(\"[HyperCore] URL is undefined\");\n\n let finalUrl = this.urlCache.get(url);\n if (finalUrl) return finalUrl;\n\n const isAbsolute = url.startsWith(\"http://\") || url.startsWith(\"https://\");\n if (isAbsolute && !url.includes(\"?\")) {\n finalUrl = url;\n } else {\n finalUrl = baseURL ? new URL(url, baseURL).href : new URL(url).href;\n }\n\n this.urlCache.set(url, finalUrl);\n return finalUrl;\n }\n\n private appendQueryParams(url: URL, query: Record<string, unknown>): void {\n for (const k in query) {\n if (Object.prototype.hasOwnProperty.call(query, k)) {\n const v = query[k];\n if (v == null) continue;\n if (Array.isArray(v)) {\n for (let j = 0; j < v.length; j++) url.searchParams.append(k, String(v[j]));\n } else {\n url.searchParams.set(k, String(v));\n }\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["CacheManager", "normalizeBody", "normalizeUrl", "mergeHeadersFast", "createTimeoutSignal", "userSignal", "timeoutMs", "meta", "controller", "cleaned", "cleanup", "onUserAbort", "timeoutId", "applyTimeout", "signal", "timeout", "method", "req", "body", "responseType", "defaultHeaders", "config", "pooled", "internalReq", "metaObj", "k", "rawUrl", "finalUrl", "cacheKey", "baseUrl", "urlObj", "cachedUrl", "targetHeaders", "nextStealth", "url", "baseURL", "query", "v", "j"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hyperttp/core",
3
- "version": "1.5.3",
3
+ "version": "1.5.5",
4
4
  "description": "High-performance, extensible HTTP client for Node.js, Bun, Deno and Browser",
5
5
  "type": "module",
6
6
  "sideEffects": false,
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/transports/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AASzB;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAqUD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAC3C,MAAM,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA4E;IACvG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IAErE,YAAY,MAAM,EAAE,mBAAmB,EAMtC;IAEY,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2HtE;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlC;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpC;CACF"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/transports/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AASzB;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAqUD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAC3C,MAAM,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGxB;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IAErE,YAAY,MAAM,EAAE,mBAAmB,EAMtC;IAEY,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2HtE;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlC;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpC;CACF"}
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/transports/node.ts"],
4
- "sourcesContent": ["import type {\n Fingerprint,\n HttpClientOptions,\n HyperTransport,\n StealthOptions,\n TransportRequest,\n TransportResponse,\n TransportResponsePayload,\n} from \"@hyperttp/types\";\nimport { CacheManager } from \"hcacher\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport net from \"node:net\";\nimport { Readable, Transform } from \"node:stream\";\nimport tls from \"node:tls\";\nimport zlib from \"node:zlib\";\n\n/**\n * @ru \u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F Node.js \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 http/https \u043C\u043E\u0434\u0443\u043B\u0435\u0439.\n * @en Node.js transport configuration using native http/https modules.\n */\nexport interface NodeTransportConfig extends HttpClientOptions {\n /**\n * @ru \u0411\u0430\u0437\u043E\u0432\u044B\u0439 URL \u0434\u043B\u044F \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0443\u0442\u0435\u0439.\n * @en Base URL for relative paths.\n */\n baseUrl?: string;\n /**\n * @ru \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 stealth-\u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Stealth masking settings at the transport level.\n */\n stealth?: StealthOptions;\n}\n\n/**\n * @ru \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043F\u0440\u0435\u0441\u0435\u0442\u044B \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043D\u044B\u0445 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0434\u043B\u044F \u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043F\u043E\u0434 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439.\n * \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F stealth-\u0440\u0435\u0436\u0438\u043C\u043E\u043C \u0434\u043B\u044F \u043E\u0431\u0445\u043E\u0434\u0430 fingerprint-\u0437\u0430\u0449\u0438\u0442.\n * @en Static presets of browser headers for masking as real users.\n * Used by stealth mode to bypass fingerprint protections.\n */\nconst STEALTH_HEADER_PRESETS: Record<string, Record<string, string>> = {\n chrome: {\n \"sec-ch-ua\": '\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"Linux\"',\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"sec-fetch-user\": \"?1\",\n \"upgrade-insecure-requests\": \"1\",\n \"accept-language\": \"en-US,en;q=0.9\",\n },\n firefox: {\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"accept-language\": \"en-US,en;q=0.5\",\n \"upgrade-insecure-requests\": \"1\",\n },\n};\n\n/**\n * @ru \u041F\u0440\u0435\u0441\u0435\u0442\u044B User-Agent, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 TLS-\u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0430\u043C (JA3/JA4).\n * @en User-Agent presets matching the TLS fingerprints (JA3/JA4).\n */\nconst STEALTH_UA_PRESETS: Record<string, string> = {\n chrome:\n \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\",\n firefox: \"Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0\",\n safari:\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15\",\n edge: \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0\",\n};\n\n/**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043E\u043A\u0443 \u0448\u0438\u0444\u0440\u043E\u0432 TLS \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n * @en Returns the TLS cipher suite string for the specified browser profile.\n * @param fingerprint - Browser fingerprint profile.\n * @returns Colon-separated cipher suite string, or empty string if not found.\n */\nfunction getCiphersForProfile(fingerprint: Fingerprint | undefined): string {\n if (!fingerprint) return \"\";\n\n switch (fingerprint) {\n case \"chrome\":\n case \"edge\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"firefox\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"safari\":\n return [\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_128_GCM_SHA256\",\n \"ECDHE-ECDSA-AES256-GCM-SHA384\",\n \"ECDHE-RSA-AES256-GCM-SHA384\",\n ].join(\":\");\n\n default:\n return \"\";\n }\n}\n\n/**\n * @ru \u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442 \u0441\u0442\u0435\u043B\u0441-\u043F\u0440\u0435\u0441\u0435\u0442\u044B, \u043E\u0442\u0434\u0430\u0432\u0430\u044F \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u044B\u0439 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0440\u0443\u0447\u043D\u044B\u043C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u043C.\n * @en Safely applies stealth presets, giving absolute priority to manual headers.\n * @param headers - The headers object to modify.\n * @param stealth - Stealth configuration options.\n * @returns The modified headers object.\n */\nfunction applyStealthHeaders(\n headers: Record<string, string>,\n stealth: StealthOptions,\n): Record<string, string> {\n if (!stealth || !stealth.fingerprint) return headers;\n\n const presetName = stealth.fingerprint;\n const presetHeaders = STEALTH_HEADER_PRESETS[presetName];\n\n if (presetHeaders) {\n for (const key in presetHeaders) {\n if (headers[key] === undefined) {\n headers[key] = presetHeaders[key]!;\n }\n }\n }\n\n const currentUA = headers[\"user-agent\"];\n if (currentUA === undefined || currentUA === \"hyperttp/2.0\" || currentUA === \"Hyperttp/2.0\") {\n const browserUA = STEALTH_UA_PRESETS[presetName];\n if (browserUA) {\n headers[\"user-agent\"] = browserUA;\n }\n }\n\n return headers;\n}\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 HTTP/HTTPS \u0430\u0433\u0435\u043D\u0442 \u0441 \u0443\u0447\u0451\u0442\u043E\u043C stealth-\u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A.\n * @en Creates a native HTTP/HTTPS agent considering stealth settings.\n * @param isHttps - Whether the connection is HTTPS.\n * @param stealth - Optional stealth configuration.\n * @param cache - The agent cache map to use (per-instance).\n * @returns The HTTP or HTTPS agent.\n */\nfunction getNativeAgent(\n isHttps: boolean,\n stealth: StealthOptions | undefined,\n cache: CacheManager<http.Agent | https.Agent>,\n trackedAgents: Set<http.Agent | https.Agent>,\n rejectUnauthorized?: boolean,\n): http.Agent | https.Agent {\n const fingerprint = stealth?.fingerprint ?? \"none\";\n const fragment = stealth?.fragment ?? \"none\";\n const needHttp2 = stealth?.http2 === true;\n const cacheKey = `${isHttps ? \"https\" : \"http\"}:${fingerprint}:${fragment}:${needHttp2 ? \"h2\" : \"1.1\"}`;\n\n let agent = cache.get(cacheKey);\n if (agent) return agent;\n\n const agentOpts: any = {\n keepAlive: true,\n maxSockets: 256,\n };\n\n if (rejectUnauthorized !== undefined) {\n agentOpts.rejectUnauthorized = rejectUnauthorized;\n }\n\n if (isHttps) {\n agentOpts.ciphers = getCiphersForProfile(stealth?.fingerprint);\n\n const needCustomConnect = fragment === \"split\" || needHttp2;\n\n if (needCustomConnect) {\n const alpnProtocols: string[] | undefined = needHttp2 ? [\"h2\", \"http/1.1\"] : undefined;\n\n agentOpts.createConnection = (\n options: any,\n callback: (err: Error | null, socket?: any) => void,\n ) => {\n let alpnFallback = false;\n\n const createTlsConnection = (\n alpn: string[] | undefined,\n cb: (err: Error | null, socket?: any) => void,\n ) => {\n const socket = net.connect(options);\n\n if (fragment === \"split\") {\n const originalWrite = socket.write;\n let isFirstWrite = true;\n\n socket.write = function (\n this: net.Socket,\n chunk: Uint8Array | string,\n encodingOrCb?: BufferEncoding | ((err?: Error | null) => void),\n cb?: (err?: Error | null) => void,\n ): boolean {\n if (isFirstWrite && chunk instanceof Uint8Array && chunk.length > 5) {\n isFirstWrite = false;\n this.write = originalWrite;\n\n let encoding: BufferEncoding | undefined;\n let callbackRef: ((err?: Error | null) => void) | undefined;\n\n if (typeof encodingOrCb === \"function\") {\n callbackRef = encodingOrCb;\n } else {\n encoding = encodingOrCb;\n callbackRef = cb;\n }\n\n const part1 = chunk.subarray(0, 3);\n const part2 = chunk.subarray(3);\n\n const onError = (err: Error) => {\n callbackRef?.(err);\n };\n\n try {\n originalWrite.call(this, part1, encoding);\n } catch (err) {\n onError(err as Error);\n return false;\n }\n return originalWrite.call(this, part2, encoding, callbackRef);\n }\n\n this.write = originalWrite;\n return originalWrite.call(this, chunk, encodingOrCb as any, cb as any);\n } as any;\n }\n\n const tlsOpts: any = {\n ...options,\n socket,\n ciphers: agentOpts.ciphers,\n };\n if (alpn) tlsOpts.ALPNProtocols = alpn;\n\n const tlsSocket = tls.connect(tlsOpts);\n\n tlsSocket.once(\"secureConnect\", () => {\n if (alpn && tlsSocket.alpnProtocol === \"h2\" && !alpnFallback) {\n alpnFallback = true;\n tlsSocket.destroy();\n createTlsConnection([\"http/1.1\"], cb);\n return;\n }\n cb(null, tlsSocket);\n });\n tlsSocket.once(\"error\", (err) => cb(err));\n };\n\n return createTlsConnection(alpnProtocols, callback);\n };\n }\n\n agent = new https.Agent(agentOpts);\n } else {\n agent = new http.Agent(agentOpts);\n }\n\n cache.set(cacheKey, agent);\n trackedAgents.add(agent);\n return agent;\n}\n\nfunction isAbsoluteHttpUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n\nfunction resolveUrl(baseUrl: string, url: string): string {\n if (!url) throw new Error(\"URL is empty\");\n if (isAbsoluteHttpUrl(url)) return url;\n return url.charCodeAt(0) === 47 ? baseUrl + url : baseUrl + \"/\" + url;\n}\n\nfunction isLocalhostUrl(url: string): boolean {\n const schemeIdx = url.indexOf(\"://\");\n if (schemeIdx === -1) return false;\n\n const hostStart = schemeIdx + 3;\n let hostEnd = url.indexOf(\"/\", hostStart);\n if (hostEnd === -1) hostEnd = url.length;\n\n const host = url.slice(hostStart, hostEnd);\n return host === \"localhost\" || host.startsWith(\"localhost:\");\n}\n\nfunction normalizeHeaders(headers: TransportRequest[\"headers\"]): Record<string, string> {\n const out: Record<string, string> = Object.create(null);\n if (!headers) return out;\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n }\n\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i++) {\n const pair = headers[i] as unknown as [string, string] | undefined;\n if (!pair || typeof pair[0] !== \"string\") continue;\n out[pair[0].toLowerCase()] = String(pair[1]);\n }\n return out;\n }\n\n const src = headers as Record<string, unknown>;\n for (const key in src) {\n const value = src[key];\n if (value == null) continue;\n\n const lKey = key.toLowerCase();\n if (Array.isArray(value)) {\n out[lKey] = lKey === \"cookie\" ? value.join(\"; \") : value.join(\", \");\n continue;\n }\n\n out[lKey] = String(value);\n }\n\n return out;\n}\n\nfunction createSizeLimitTransform(maxBytes: number): Transform {\n let total = 0;\n return new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n total += chunk.length;\n if (total > maxBytes) {\n callback(new Error(`[Hyperttp] Response size exceeded limit of ${maxBytes} bytes`));\n return;\n }\n callback(null, chunk);\n },\n });\n}\n\n/**\n * @ru \u0420\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F Node.js \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 http/https \u043C\u043E\u0434\u0443\u043B\u0435\u0439.\n * \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 stealth-\u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0443, \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044E TLS Client Hello \u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0443\u044E \u0434\u0435\u043A\u043E\u043C\u043F\u0440\u0435\u0441\u0441\u0438\u044E.\n */\nexport class NodeTransport implements HyperTransport {\n public config: NodeTransportConfig;\n private readonly isProduction: boolean;\n private readonly cleanBaseUrl: string;\n private readonly agentCache = new CacheManager<http.Agent | https.Agent>({ maxSize: 32, ttl: 60_000 });\n private readonly trackedAgents = new Set<http.Agent | https.Agent>();\n\n constructor(config: NodeTransportConfig) {\n this.config = config;\n this.isProduction = process.env.NODE_ENV === \"production\";\n\n const base = config.baseUrl ?? \"http://localhost:3000\";\n this.cleanBaseUrl = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n }\n\n public async execute(req: TransportRequest): Promise<TransportResponse> {\n const fullUrl = resolveUrl(this.cleanBaseUrl, req.url);\n\n if (this.isProduction && isLocalhostUrl(fullUrl)) {\n throw new Error(\"Localhost URL detected in production environment\");\n }\n\n let headers = normalizeHeaders(req.headers);\n\n if (headers[\"accept-encoding\"] === undefined) {\n headers[\"accept-encoding\"] = \"gzip, deflate, br\";\n }\n\n const stealthOpts = req.stealth ?? this.config.stealth ?? this.config.network?.stealth;\n if (stealthOpts) {\n headers = applyStealthHeaders(headers, stealthOpts);\n }\n\n const body = req.body;\n const urlObj = new URL(fullUrl);\n const isHttps = urlObj.protocol === \"https:\";\n const agent = getNativeAgent(\n isHttps,\n stealthOpts,\n this.agentCache,\n this.trackedAgents,\n this.config.network?.rejectUnauthorized,\n );\n\n return new Promise((resolve, reject) => {\n const reqOpts: http.RequestOptions | https.RequestOptions = {\n method: req.method,\n headers,\n agent,\n signal: req.signal,\n };\n\n let settled = false;\n\n const clientReq = (isHttps ? https : http).request(fullUrl, reqOpts, (res) => {\n const resHeaders: Record<string, string> = Object.create(null);\n for (const key in res.headers) {\n const val = res.headers[key];\n if (val !== undefined) {\n resHeaders[key] = Array.isArray(val) ? val.join(\", \") : val;\n }\n }\n\n let responseStream: Readable = res;\n const encoding = resHeaders[\"content-encoding\"]?.toLowerCase();\n\n if (encoding === \"gzip\") {\n const gunzip = zlib.createGunzip();\n gunzip.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(gunzip);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"deflate\") {\n const inflate = zlib.createInflate();\n inflate.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(inflate);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"br\") {\n const brotli = zlib.createBrotliDecompress();\n brotli.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(brotli);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n }\n\n const maxBytes = this.config.network?.maxResponseBytes;\n if (maxBytes != null && maxBytes > 0) {\n const limiter = createSizeLimitTransform(maxBytes);\n limiter.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = responseStream.pipe(limiter);\n }\n\n responseStream.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n settled = true;\n resolve({\n status: res.statusCode ?? 200,\n headers: resHeaders,\n url: fullUrl,\n body: Readable.toWeb(responseStream) as unknown as TransportResponsePayload,\n });\n });\n\n clientReq.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\" || body instanceof Uint8Array || ArrayBuffer.isView(body)) {\n clientReq.write(body);\n clientReq.end();\n } else if (body instanceof ArrayBuffer) {\n clientReq.write(Buffer.from(body));\n clientReq.end();\n } else if (typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream) {\n Readable.fromWeb(body as any).pipe(clientReq);\n } else {\n clientReq.end();\n }\n } else {\n clientReq.end();\n }\n });\n }\n\n public async close(): Promise<void> {\n for (const agent of this.trackedAgents) {\n agent.destroy();\n }\n this.trackedAgents.clear();\n this.agentCache.clear();\n }\n\n public async destroy(): Promise<void> {\n for (const agent of this.trackedAgents) {\n agent.destroy();\n }\n this.trackedAgents.clear();\n this.agentCache.clear();\n }\n}\n"],
5
- "mappings": "aASA,OAAS,gBAAAA,MAAoB,UAC7B,OAAOC,MAAU,YACjB,OAAOC,MAAW,aAClB,OAAOC,MAAS,WAChB,OAAS,YAAAC,EAAU,aAAAC,MAAiB,cACpC,OAAOC,MAAS,WAChB,OAAOC,MAAU,YAyBjB,MAAMC,EAAiE,CACrE,OAAQ,CACN,YAAa,mEACb,mBAAoB,KACpB,qBAAsB,UACtB,iBAAkB,WAClB,iBAAkB,WAClB,iBAAkB,OAClB,iBAAkB,KAClB,4BAA6B,IAC7B,kBAAmB,kBAErB,QAAS,CACP,iBAAkB,WAClB,iBAAkB,WAClB,iBAAkB,OAClB,kBAAmB,iBACnB,4BAA6B,MAQ3BC,EAA6C,CACjD,OACE,wGACF,QAAS,kEACT,OACE,wHACF,KAAM,uHASR,SAASC,EAAqBC,EAAoC,CAChE,GAAI,CAACA,EAAa,MAAO,GAEzB,OAAQA,EAAa,CACnB,IAAK,SACL,IAAK,OACH,MAAO,CACL,yBACA,yBACA,+BACA,gCACA,+BACA,KAAK,GAAG,EAEZ,IAAK,UACH,MAAO,CACL,yBACA,+BACA,yBACA,gCACA,+BACA,KAAK,GAAG,EAEZ,IAAK,SACH,MAAO,CACL,yBACA,+BACA,yBACA,gCACA,+BACA,KAAK,GAAG,EAEZ,QACE,MAAO,EACX,CACF,CASA,SAASC,EACPC,EACAC,EAAuB,CAEvB,GAAI,CAACA,GAAW,CAACA,EAAQ,YAAa,OAAOD,EAE7C,MAAME,EAAaD,EAAQ,YACrBE,EAAgBR,EAAuBO,CAAU,EAEvD,GAAIC,EACF,UAAWC,KAAOD,EACZH,EAAQI,CAAG,IAAM,SACnBJ,EAAQI,CAAG,EAAID,EAAcC,CAAG,GAKtC,MAAMC,EAAYL,EAAQ,YAAY,EACtC,GAAIK,IAAc,QAAaA,IAAc,gBAAkBA,IAAc,eAAgB,CAC3F,MAAMC,EAAYV,EAAmBM,CAAU,EAC3CI,IACFN,EAAQ,YAAY,EAAIM,EAE5B,CAEA,OAAON,CACT,CAUA,SAASO,EACPC,EACAP,EACAQ,EACAC,EACAC,EAA4B,CAE5B,MAAMb,EAAcG,GAAS,aAAe,OACtCW,EAAWX,GAAS,UAAY,OAChCY,EAAYZ,GAAS,QAAU,GAC/Ba,EAAW,GAAGN,EAAU,QAAU,MAAM,IAAIV,CAAW,IAAIc,CAAQ,IAAIC,EAAY,KAAO,KAAK,GAErG,IAAIE,EAAQN,EAAM,IAAIK,CAAQ,EAC9B,GAAIC,EAAO,OAAOA,EAElB,MAAMC,EAAiB,CACrB,UAAW,GACX,WAAY,KAOd,GAJIL,IAAuB,SACzBK,EAAU,mBAAqBL,GAG7BH,EAAS,CAKX,GAJAQ,EAAU,QAAUnB,EAAqBI,GAAS,WAAW,EAEnCW,IAAa,SAAWC,EAE3B,CACrB,MAAMI,EAAsCJ,EAAY,CAAC,KAAM,UAAU,EAAI,OAE7EG,EAAU,iBAAmB,CAC3BE,EACAC,IACE,CACF,IAAIC,EAAe,GAEnB,MAAMC,EAAsB,CAC1BC,EACAC,IACE,CACF,MAAMC,EAASlC,EAAI,QAAQ4B,CAAO,EAElC,GAAIN,IAAa,QAAS,CACxB,MAAMa,EAAgBD,EAAO,MAC7B,IAAIE,EAAe,GAEnBF,EAAO,MAAQ,SAEbG,EACAC,EACAL,EAAiC,CAEjC,GAAIG,GAAgBC,aAAiB,YAAcA,EAAM,OAAS,EAAG,CACnED,EAAe,GACf,KAAK,MAAQD,EAEb,IAAII,EACAC,EAEA,OAAOF,GAAiB,WAC1BE,EAAcF,GAEdC,EAAWD,EACXE,EAAcP,GAGhB,MAAMQ,EAAQJ,EAAM,SAAS,EAAG,CAAC,EAC3BK,EAAQL,EAAM,SAAS,CAAC,EAExBM,EAAWC,GAAc,CAC7BJ,IAAcI,CAAG,CACnB,EAEA,GAAI,CACFT,EAAc,KAAK,KAAMM,EAAOF,CAAQ,CAC1C,OAASK,EAAK,CACZ,OAAAD,EAAQC,CAAY,EACb,EACT,CACA,OAAOT,EAAc,KAAK,KAAMO,EAAOH,EAAUC,CAAW,CAC9D,CAEA,YAAK,MAAQL,EACNA,EAAc,KAAK,KAAME,EAAOC,EAAqBL,CAAS,CACvE,CACF,CAEA,MAAMY,EAAe,CACnB,GAAGjB,EACH,OAAAM,EACA,QAASR,EAAU,SAEjBM,IAAMa,EAAQ,cAAgBb,GAElC,MAAMc,EAAY3C,EAAI,QAAQ0C,CAAO,EAErCC,EAAU,KAAK,gBAAiB,IAAK,CACnC,GAAId,GAAQc,EAAU,eAAiB,MAAQ,CAAChB,EAAc,CAC5DA,EAAe,GACfgB,EAAU,QAAO,EACjBf,EAAoB,CAAC,UAAU,EAAGE,CAAE,EACpC,MACF,CACAA,EAAG,KAAMa,CAAS,CACpB,CAAC,EACDA,EAAU,KAAK,QAAUF,GAAQX,EAAGW,CAAG,CAAC,CAC1C,EAEA,OAAOb,EAAoBJ,EAAeE,CAAQ,CACpD,CACF,CAEAJ,EAAQ,IAAI1B,EAAM,MAAM2B,CAAS,CACnC,MACED,EAAQ,IAAI3B,EAAK,MAAM4B,CAAS,EAGlC,OAAAP,EAAM,IAAIK,EAAUC,CAAK,EACzBL,EAAc,IAAIK,CAAK,EAChBA,CACT,CAEA,SAASsB,EAAkBC,EAAW,CACpC,OAAOA,EAAI,WAAW,SAAS,GAAKA,EAAI,WAAW,UAAU,CAC/D,CAEA,SAASC,EAAWC,EAAiBF,EAAW,CAC9C,GAAI,CAACA,EAAK,MAAM,IAAI,MAAM,cAAc,EACxC,OAAID,EAAkBC,CAAG,EAAUA,EAC5BA,EAAI,WAAW,CAAC,IAAM,GAAKE,EAAUF,EAAME,EAAU,IAAMF,CACpE,CAEA,SAASG,EAAeH,EAAW,CACjC,MAAMI,EAAYJ,EAAI,QAAQ,KAAK,EACnC,GAAII,IAAc,GAAI,MAAO,GAE7B,MAAMC,EAAYD,EAAY,EAC9B,IAAIE,EAAUN,EAAI,QAAQ,IAAKK,CAAS,EACpCC,IAAY,KAAIA,EAAUN,EAAI,QAElC,MAAMO,EAAOP,EAAI,MAAMK,EAAWC,CAAO,EACzC,OAAOC,IAAS,aAAeA,EAAK,WAAW,YAAY,CAC7D,CAEA,SAASC,EAAiB9C,EAAoC,CAC5D,MAAM+C,EAA8B,OAAO,OAAO,IAAI,EACtD,GAAI,CAAC/C,EAAS,OAAO+C,EAErB,GAAI/C,aAAmB,QACrB,OAAAA,EAAQ,QAAQ,CAACgD,EAAO5C,IAAO,CAC7B2C,EAAI3C,EAAI,YAAW,CAAE,EAAI4C,CAC3B,CAAC,EACMD,EAGT,GAAI,MAAM,QAAQ/C,CAAO,EAAG,CAC1B,QAASiD,EAAI,EAAGA,EAAIjD,EAAQ,OAAQiD,IAAK,CACvC,MAAMC,EAAOlD,EAAQiD,CAAC,EAClB,CAACC,GAAQ,OAAOA,EAAK,CAAC,GAAM,WAChCH,EAAIG,EAAK,CAAC,EAAE,YAAW,CAAE,EAAI,OAAOA,EAAK,CAAC,CAAC,EAC7C,CACA,OAAOH,CACT,CAEA,MAAMI,EAAMnD,EACZ,UAAWI,KAAO+C,EAAK,CACrB,MAAMH,EAAQG,EAAI/C,CAAG,EACrB,GAAI4C,GAAS,KAAM,SAEnB,MAAMI,EAAOhD,EAAI,YAAW,EAC5B,GAAI,MAAM,QAAQ4C,CAAK,EAAG,CACxBD,EAAIK,CAAI,EAAIA,IAAS,SAAWJ,EAAM,KAAK,IAAI,EAAIA,EAAM,KAAK,IAAI,EAClE,QACF,CAEAD,EAAIK,CAAI,EAAI,OAAOJ,CAAK,CAC1B,CAEA,OAAOD,CACT,CAEA,SAASM,EAAyBC,EAAgB,CAChD,IAAIC,EAAQ,EACZ,OAAO,IAAI/D,EAAU,CACnB,UAAUmC,EAAe6B,EAAWrC,EAAQ,CAE1C,GADAoC,GAAS5B,EAAM,OACX4B,EAAQD,EAAU,CACpBnC,EAAS,IAAI,MAAM,8CAA8CmC,CAAQ,QAAQ,CAAC,EAClF,MACF,CACAnC,EAAS,KAAMQ,CAAK,CACtB,EACD,CACH,CAMM,aAAO,aAAa,CACjB,OACU,aACA,aACA,WAAa,IAAIxC,EAAuC,CAAE,QAAS,GAAI,IAAK,GAAM,CAAE,EACpF,cAAgB,IAAI,IAErC,YAAYsE,EAA2B,CACrC,KAAK,OAASA,EACd,KAAK,aAAe,GAEpB,MAAMC,EAAOD,EAAO,SAAW,wBAC/B,KAAK,aAAeC,EAAK,SAAS,GAAG,EAAIA,EAAK,MAAM,EAAG,EAAE,EAAIA,CAC/D,CAEO,MAAM,QAAQC,EAAqB,CACxC,MAAMC,EAAUrB,EAAW,KAAK,aAAcoB,EAAI,GAAG,EAErD,GAAI,KAAK,cAAgBlB,EAAemB,CAAO,EAC7C,MAAM,IAAI,MAAM,kDAAkD,EAGpE,IAAI5D,EAAU8C,EAAiBa,EAAI,OAAO,EAEtC3D,EAAQ,iBAAiB,IAAM,SACjCA,EAAQ,iBAAiB,EAAI,qBAG/B,MAAM6D,EAAcF,EAAI,SAAW,KAAK,OAAO,SAAW,KAAK,OAAO,SAAS,QAC3EE,IACF7D,EAAUD,EAAoBC,EAAS6D,CAAW,GAGpD,MAAMC,EAAOH,EAAI,KAEXnD,EADS,IAAI,IAAIoD,CAAO,EACP,WAAa,SAC9B7C,EAAQR,EACZC,EACAqD,EACA,KAAK,WACL,KAAK,cACL,KAAK,OAAO,SAAS,kBAAkB,EAGzC,OAAO,IAAI,QAAQ,CAACE,EAASC,IAAU,CACrC,MAAMC,EAAsD,CAC1D,OAAQN,EAAI,OACZ,QAAA3D,EACA,MAAAe,EACA,OAAQ4C,EAAI,QAGd,IAAIO,EAAU,GAEd,MAAMC,GAAa3D,EAAUnB,EAAQD,GAAM,QAAQwE,EAASK,EAAUG,GAAO,CAC3E,MAAMC,EAAqC,OAAO,OAAO,IAAI,EAC7D,UAAWjE,KAAOgE,EAAI,QAAS,CAC7B,MAAME,EAAMF,EAAI,QAAQhE,CAAG,EACvBkE,IAAQ,SACVD,EAAWjE,CAAG,EAAI,MAAM,QAAQkE,CAAG,EAAIA,EAAI,KAAK,IAAI,EAAIA,EAE5D,CAEA,IAAIC,EAA2BH,EAC/B,MAAMvC,EAAWwC,EAAW,kBAAkB,GAAG,YAAW,EAE5D,GAAIxC,IAAa,OAAQ,CACvB,MAAM2C,EAAS9E,EAAK,aAAY,EAChC8E,EAAO,GAAG,QAAUtC,GAAO,CACzBkC,EAAI,QAAQlC,CAAG,EACVgC,GAASF,EAAO9B,CAAG,CAC1B,CAAC,EACDqC,EAAiBH,EAAI,KAAKI,CAAM,EAChC,OAAOH,EAAW,kBAAkB,EACpC,OAAOA,EAAW,gBAAgB,CACpC,SAAWxC,IAAa,UAAW,CACjC,MAAM4C,EAAU/E,EAAK,cAAa,EAClC+E,EAAQ,GAAG,QAAUvC,GAAO,CAC1BkC,EAAI,QAAQlC,CAAG,EACVgC,GAASF,EAAO9B,CAAG,CAC1B,CAAC,EACDqC,EAAiBH,EAAI,KAAKK,CAAO,EACjC,OAAOJ,EAAW,kBAAkB,EACpC,OAAOA,EAAW,gBAAgB,CACpC,SAAWxC,IAAa,KAAM,CAC5B,MAAM6C,EAAShF,EAAK,uBAAsB,EAC1CgF,EAAO,GAAG,QAAUxC,GAAO,CACzBkC,EAAI,QAAQlC,CAAG,EACVgC,GAASF,EAAO9B,CAAG,CAC1B,CAAC,EACDqC,EAAiBH,EAAI,KAAKM,CAAM,EAChC,OAAOL,EAAW,kBAAkB,EACpC,OAAOA,EAAW,gBAAgB,CACpC,CAEA,MAAMf,EAAW,KAAK,OAAO,SAAS,iBACtC,GAAIA,GAAY,MAAQA,EAAW,EAAG,CACpC,MAAMqB,EAAUtB,EAAyBC,CAAQ,EACjDqB,EAAQ,GAAG,QAAUzC,GAAO,CAC1BkC,EAAI,QAAQlC,CAAG,EACVgC,GAASF,EAAO9B,CAAG,CAC1B,CAAC,EACDqC,EAAiBA,EAAe,KAAKI,CAAO,CAC9C,CAEAJ,EAAe,GAAG,QAAUrC,GAAO,CAC5BgC,GAASF,EAAO9B,CAAG,CAC1B,CAAC,EAEDgC,EAAU,GACVH,EAAQ,CACN,OAAQK,EAAI,YAAc,IAC1B,QAASC,EACT,IAAKT,EACL,KAAMrE,EAAS,MAAMgF,CAAc,EACpC,CACH,CAAC,EAEDJ,EAAU,GAAG,QAAUjC,GAAO,CACvBgC,GAASF,EAAO9B,CAAG,CAC1B,CAAC,EAEyB4B,GAAS,KAC7B,OAAOA,GAAS,UAAYA,aAAgB,YAAc,YAAY,OAAOA,CAAI,GACnFK,EAAU,MAAML,CAAI,EACpBK,EAAU,IAAG,GACJL,aAAgB,aACzBK,EAAU,MAAM,OAAO,KAAKL,CAAI,CAAC,EACjCK,EAAU,IAAG,GACJ,OAAO,eAAmB,KAAeL,aAAgB,eAClEvE,EAAS,QAAQuE,CAAW,EAAE,KAAKK,CAAS,EAE5CA,EAAU,IAAG,EAGfA,EAAU,IAAG,CAEjB,CAAC,CACH,CAEO,MAAM,OAAK,CAChB,UAAWpD,KAAS,KAAK,cACvBA,EAAM,QAAO,EAEf,KAAK,cAAc,MAAK,EACxB,KAAK,WAAW,MAAK,CACvB,CAEO,MAAM,SAAO,CAClB,UAAWA,KAAS,KAAK,cACvBA,EAAM,QAAO,EAEf,KAAK,cAAc,MAAK,EACxB,KAAK,WAAW,MAAK,CACvB",
4
+ "sourcesContent": ["import type {\n Fingerprint,\n HttpClientOptions,\n HyperTransport,\n StealthOptions,\n TransportRequest,\n TransportResponse,\n TransportResponsePayload,\n} from \"@hyperttp/types\";\nimport { CacheManager } from \"hcacher\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport net from \"node:net\";\nimport { Readable, Transform } from \"node:stream\";\nimport tls from \"node:tls\";\nimport zlib from \"node:zlib\";\n\n/**\n * @ru \u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F Node.js \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 http/https \u043C\u043E\u0434\u0443\u043B\u0435\u0439.\n * @en Node.js transport configuration using native http/https modules.\n */\nexport interface NodeTransportConfig extends HttpClientOptions {\n /**\n * @ru \u0411\u0430\u0437\u043E\u0432\u044B\u0439 URL \u0434\u043B\u044F \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0443\u0442\u0435\u0439.\n * @en Base URL for relative paths.\n */\n baseUrl?: string;\n /**\n * @ru \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 stealth-\u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Stealth masking settings at the transport level.\n */\n stealth?: StealthOptions;\n}\n\n/**\n * @ru \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043F\u0440\u0435\u0441\u0435\u0442\u044B \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043D\u044B\u0445 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0434\u043B\u044F \u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043F\u043E\u0434 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439.\n * \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F stealth-\u0440\u0435\u0436\u0438\u043C\u043E\u043C \u0434\u043B\u044F \u043E\u0431\u0445\u043E\u0434\u0430 fingerprint-\u0437\u0430\u0449\u0438\u0442.\n * @en Static presets of browser headers for masking as real users.\n * Used by stealth mode to bypass fingerprint protections.\n */\nconst STEALTH_HEADER_PRESETS: Record<string, Record<string, string>> = {\n chrome: {\n \"sec-ch-ua\": '\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"Linux\"',\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"sec-fetch-user\": \"?1\",\n \"upgrade-insecure-requests\": \"1\",\n \"accept-language\": \"en-US,en;q=0.9\",\n },\n firefox: {\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"accept-language\": \"en-US,en;q=0.5\",\n \"upgrade-insecure-requests\": \"1\",\n },\n};\n\n/**\n * @ru \u041F\u0440\u0435\u0441\u0435\u0442\u044B User-Agent, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 TLS-\u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0430\u043C (JA3/JA4).\n * @en User-Agent presets matching the TLS fingerprints (JA3/JA4).\n */\nconst STEALTH_UA_PRESETS: Record<string, string> = {\n chrome:\n \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\",\n firefox: \"Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0\",\n safari:\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15\",\n edge: \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0\",\n};\n\n/**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043E\u043A\u0443 \u0448\u0438\u0444\u0440\u043E\u0432 TLS \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n * @en Returns the TLS cipher suite string for the specified browser profile.\n * @param fingerprint - Browser fingerprint profile.\n * @returns Colon-separated cipher suite string, or empty string if not found.\n */\nfunction getCiphersForProfile(fingerprint: Fingerprint | undefined): string {\n if (!fingerprint) return \"\";\n\n switch (fingerprint) {\n case \"chrome\":\n case \"edge\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"firefox\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"safari\":\n return [\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_128_GCM_SHA256\",\n \"ECDHE-ECDSA-AES256-GCM-SHA384\",\n \"ECDHE-RSA-AES256-GCM-SHA384\",\n ].join(\":\");\n\n default:\n return \"\";\n }\n}\n\n/**\n * @ru \u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442 \u0441\u0442\u0435\u043B\u0441-\u043F\u0440\u0435\u0441\u0435\u0442\u044B, \u043E\u0442\u0434\u0430\u0432\u0430\u044F \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u044B\u0439 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0440\u0443\u0447\u043D\u044B\u043C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u043C.\n * @en Safely applies stealth presets, giving absolute priority to manual headers.\n * @param headers - The headers object to modify.\n * @param stealth - Stealth configuration options.\n * @returns The modified headers object.\n */\nfunction applyStealthHeaders(\n headers: Record<string, string>,\n stealth: StealthOptions,\n): Record<string, string> {\n if (!stealth || !stealth.fingerprint) return headers;\n\n const presetName = stealth.fingerprint;\n const presetHeaders = STEALTH_HEADER_PRESETS[presetName];\n\n if (presetHeaders) {\n for (const key in presetHeaders) {\n if (headers[key] === undefined) {\n headers[key] = presetHeaders[key]!;\n }\n }\n }\n\n const currentUA = headers[\"user-agent\"];\n if (currentUA === undefined || currentUA === \"hyperttp/2.0\" || currentUA === \"Hyperttp/2.0\") {\n const browserUA = STEALTH_UA_PRESETS[presetName];\n if (browserUA) {\n headers[\"user-agent\"] = browserUA;\n }\n }\n\n return headers;\n}\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 HTTP/HTTPS \u0430\u0433\u0435\u043D\u0442 \u0441 \u0443\u0447\u0451\u0442\u043E\u043C stealth-\u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A.\n * @en Creates a native HTTP/HTTPS agent considering stealth settings.\n * @param isHttps - Whether the connection is HTTPS.\n * @param stealth - Optional stealth configuration.\n * @param cache - The agent cache map to use (per-instance).\n * @returns The HTTP or HTTPS agent.\n */\nfunction getNativeAgent(\n isHttps: boolean,\n stealth: StealthOptions | undefined,\n cache: CacheManager<http.Agent | https.Agent>,\n trackedAgents: Set<http.Agent | https.Agent>,\n rejectUnauthorized?: boolean,\n): http.Agent | https.Agent {\n const fingerprint = stealth?.fingerprint ?? \"none\";\n const fragment = stealth?.fragment ?? \"none\";\n const needHttp2 = stealth?.http2 === true;\n const cacheKey = `${isHttps ? \"https\" : \"http\"}:${fingerprint}:${fragment}:${needHttp2 ? \"h2\" : \"1.1\"}`;\n\n let agent = cache.get(cacheKey);\n if (agent) return agent;\n\n const agentOpts: any = {\n keepAlive: true,\n maxSockets: 256,\n };\n\n if (rejectUnauthorized !== undefined) {\n agentOpts.rejectUnauthorized = rejectUnauthorized;\n }\n\n if (isHttps) {\n agentOpts.ciphers = getCiphersForProfile(stealth?.fingerprint);\n\n const needCustomConnect = fragment === \"split\" || needHttp2;\n\n if (needCustomConnect) {\n const alpnProtocols: string[] | undefined = needHttp2 ? [\"h2\", \"http/1.1\"] : undefined;\n\n agentOpts.createConnection = (\n options: any,\n callback: (err: Error | null, socket?: any) => void,\n ) => {\n let alpnFallback = false;\n\n const createTlsConnection = (\n alpn: string[] | undefined,\n cb: (err: Error | null, socket?: any) => void,\n ) => {\n const socket = net.connect(options);\n\n if (fragment === \"split\") {\n const originalWrite = socket.write;\n let isFirstWrite = true;\n\n socket.write = function (\n this: net.Socket,\n chunk: Uint8Array | string,\n encodingOrCb?: BufferEncoding | ((err?: Error | null) => void),\n cb?: (err?: Error | null) => void,\n ): boolean {\n if (isFirstWrite && chunk instanceof Uint8Array && chunk.length > 5) {\n isFirstWrite = false;\n this.write = originalWrite;\n\n let encoding: BufferEncoding | undefined;\n let callbackRef: ((err?: Error | null) => void) | undefined;\n\n if (typeof encodingOrCb === \"function\") {\n callbackRef = encodingOrCb;\n } else {\n encoding = encodingOrCb;\n callbackRef = cb;\n }\n\n const part1 = chunk.subarray(0, 3);\n const part2 = chunk.subarray(3);\n\n const onError = (err: Error) => {\n callbackRef?.(err);\n };\n\n try {\n originalWrite.call(this, part1, encoding);\n } catch (err) {\n onError(err as Error);\n return false;\n }\n return originalWrite.call(this, part2, encoding, callbackRef);\n }\n\n this.write = originalWrite;\n return originalWrite.call(this, chunk, encodingOrCb as any, cb as any);\n } as any;\n }\n\n const tlsOpts: any = {\n ...options,\n socket,\n ciphers: agentOpts.ciphers,\n };\n if (alpn) tlsOpts.ALPNProtocols = alpn;\n\n const tlsSocket = tls.connect(tlsOpts);\n\n tlsSocket.once(\"secureConnect\", () => {\n if (alpn && tlsSocket.alpnProtocol === \"h2\" && !alpnFallback) {\n alpnFallback = true;\n tlsSocket.destroy();\n createTlsConnection([\"http/1.1\"], cb);\n return;\n }\n cb(null, tlsSocket);\n });\n tlsSocket.once(\"error\", (err) => cb(err));\n };\n\n return createTlsConnection(alpnProtocols, callback);\n };\n }\n\n agent = new https.Agent(agentOpts);\n } else {\n agent = new http.Agent(agentOpts);\n }\n\n cache.set(cacheKey, agent);\n trackedAgents.add(agent);\n return agent;\n}\n\nfunction isAbsoluteHttpUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n\nfunction resolveUrl(baseUrl: string, url: string): string {\n if (!url) throw new Error(\"URL is empty\");\n if (isAbsoluteHttpUrl(url)) return url;\n return url.charCodeAt(0) === 47 ? baseUrl + url : baseUrl + \"/\" + url;\n}\n\nfunction isLocalhostUrl(url: string): boolean {\n const schemeIdx = url.indexOf(\"://\");\n if (schemeIdx === -1) return false;\n\n const hostStart = schemeIdx + 3;\n let hostEnd = url.indexOf(\"/\", hostStart);\n if (hostEnd === -1) hostEnd = url.length;\n\n const host = url.slice(hostStart, hostEnd);\n return host === \"localhost\" || host.startsWith(\"localhost:\");\n}\n\nfunction normalizeHeaders(headers: TransportRequest[\"headers\"]): Record<string, string> {\n const out: Record<string, string> = Object.create(null);\n if (!headers) return out;\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n }\n\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i++) {\n const pair = headers[i] as unknown as [string, string] | undefined;\n if (!pair || typeof pair[0] !== \"string\") continue;\n out[pair[0].toLowerCase()] = String(pair[1]);\n }\n return out;\n }\n\n const src = headers as Record<string, unknown>;\n for (const key in src) {\n const value = src[key];\n if (value == null) continue;\n\n const lKey = key.toLowerCase();\n if (Array.isArray(value)) {\n out[lKey] = lKey === \"cookie\" ? value.join(\"; \") : value.join(\", \");\n continue;\n }\n\n out[lKey] = String(value);\n }\n\n return out;\n}\n\nfunction createSizeLimitTransform(maxBytes: number): Transform {\n let total = 0;\n return new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n total += chunk.length;\n if (total > maxBytes) {\n callback(new Error(`[Hyperttp] Response size exceeded limit of ${maxBytes} bytes`));\n return;\n }\n callback(null, chunk);\n },\n });\n}\n\n/**\n * @ru \u0420\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F Node.js \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 http/https \u043C\u043E\u0434\u0443\u043B\u0435\u0439.\n * \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 stealth-\u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0443, \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044E TLS Client Hello \u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0443\u044E \u0434\u0435\u043A\u043E\u043C\u043F\u0440\u0435\u0441\u0441\u0438\u044E.\n */\nexport class NodeTransport implements HyperTransport {\n public config: NodeTransportConfig;\n private readonly isProduction: boolean;\n private readonly cleanBaseUrl: string;\n private readonly agentCache = new CacheManager<http.Agent | https.Agent>({\n maxSize: 32,\n ttl: 60_000,\n });\n private readonly trackedAgents = new Set<http.Agent | https.Agent>();\n\n constructor(config: NodeTransportConfig) {\n this.config = config;\n this.isProduction = process.env.NODE_ENV === \"production\";\n\n const base = config.baseUrl ?? \"http://localhost:3000\";\n this.cleanBaseUrl = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n }\n\n public async execute(req: TransportRequest): Promise<TransportResponse> {\n const fullUrl = resolveUrl(this.cleanBaseUrl, req.url);\n\n if (this.isProduction && isLocalhostUrl(fullUrl)) {\n throw new Error(\"Localhost URL detected in production environment\");\n }\n\n let headers = normalizeHeaders(req.headers);\n\n if (headers[\"accept-encoding\"] === undefined) {\n headers[\"accept-encoding\"] = \"gzip, deflate, br\";\n }\n\n const stealthOpts = req.stealth ?? this.config.stealth ?? this.config.network?.stealth;\n if (stealthOpts) {\n headers = applyStealthHeaders(headers, stealthOpts);\n }\n\n const body = req.body;\n const urlObj = new URL(fullUrl);\n const isHttps = urlObj.protocol === \"https:\";\n const agent = getNativeAgent(\n isHttps,\n stealthOpts,\n this.agentCache,\n this.trackedAgents,\n this.config.network?.rejectUnauthorized,\n );\n\n return new Promise((resolve, reject) => {\n const reqOpts: http.RequestOptions | https.RequestOptions = {\n method: req.method,\n headers,\n agent,\n signal: req.signal,\n };\n\n let settled = false;\n\n const clientReq = (isHttps ? https : http).request(fullUrl, reqOpts, (res) => {\n const resHeaders: Record<string, string> = Object.create(null);\n for (const key in res.headers) {\n const val = res.headers[key];\n if (val !== undefined) {\n resHeaders[key] = Array.isArray(val) ? val.join(\", \") : val;\n }\n }\n\n let responseStream: Readable = res;\n const encoding = resHeaders[\"content-encoding\"]?.toLowerCase();\n\n if (encoding === \"gzip\") {\n const gunzip = zlib.createGunzip();\n gunzip.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(gunzip);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"deflate\") {\n const inflate = zlib.createInflate();\n inflate.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(inflate);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"br\") {\n const brotli = zlib.createBrotliDecompress();\n brotli.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(brotli);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n }\n\n const maxBytes = this.config.network?.maxResponseBytes;\n if (maxBytes != null && maxBytes > 0) {\n const limiter = createSizeLimitTransform(maxBytes);\n limiter.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = responseStream.pipe(limiter);\n }\n\n responseStream.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n settled = true;\n resolve({\n status: res.statusCode ?? 200,\n headers: resHeaders,\n url: fullUrl,\n body: Readable.toWeb(responseStream) as unknown as TransportResponsePayload,\n });\n });\n\n clientReq.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\" || body instanceof Uint8Array || ArrayBuffer.isView(body)) {\n clientReq.write(body);\n clientReq.end();\n } else if (body instanceof ArrayBuffer) {\n clientReq.write(Buffer.from(body));\n clientReq.end();\n } else if (typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream) {\n Readable.fromWeb(body as any).pipe(clientReq);\n } else {\n clientReq.end();\n }\n } else {\n clientReq.end();\n }\n });\n }\n\n public async close(): Promise<void> {\n for (const agent of this.trackedAgents) {\n agent.destroy();\n }\n this.trackedAgents.clear();\n this.agentCache.clear();\n }\n\n public async destroy(): Promise<void> {\n for (const agent of this.trackedAgents) {\n agent.destroy();\n }\n this.trackedAgents.clear();\n this.agentCache.clear();\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["CacheManager", "http", "https", "net", "Readable", "Transform", "tls", "zlib", "STEALTH_HEADER_PRESETS", "STEALTH_UA_PRESETS", "getCiphersForProfile", "fingerprint", "applyStealthHeaders", "headers", "stealth", "presetName", "presetHeaders", "key", "currentUA", "browserUA", "getNativeAgent", "isHttps", "cache", "trackedAgents", "rejectUnauthorized", "fragment", "needHttp2", "cacheKey", "agent", "agentOpts", "alpnProtocols", "options", "callback", "alpnFallback", "createTlsConnection", "alpn", "cb", "socket", "originalWrite", "isFirstWrite", "chunk", "encodingOrCb", "encoding", "callbackRef", "part1", "part2", "onError", "err", "tlsOpts", "tlsSocket", "isAbsoluteHttpUrl", "url", "resolveUrl", "baseUrl", "isLocalhostUrl", "schemeIdx", "hostStart", "hostEnd", "host", "normalizeHeaders", "out", "value", "i", "pair", "src", "lKey", "createSizeLimitTransform", "maxBytes", "total", "_encoding", "config", "base", "req", "fullUrl", "stealthOpts", "body", "resolve", "reject", "reqOpts", "settled", "clientReq", "res", "resHeaders", "val", "responseStream", "gunzip", "inflate", "brotli", "limiter"]
7
7
  }