@hyperttp/core 1.0.5 → 1.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/{dist/Core → Core}/HyperCore.d.ts +10 -36
  2. package/Core/HyperCore.d.ts.map +1 -0
  3. package/{dist/Core → Core}/HyperCore.js +81 -68
  4. package/Core/HyperCore.js.map +1 -0
  5. package/{dist/Core → Core}/RequestExecutor.d.ts +5 -2
  6. package/Core/RequestExecutor.d.ts.map +1 -0
  7. package/{dist/Core → Core}/RequestExecutor.js +35 -33
  8. package/Core/RequestExecutor.js.map +1 -0
  9. package/{dist/Core → Core}/index.d.ts +0 -1
  10. package/{dist/Core → Core}/index.d.ts.map +1 -1
  11. package/{dist/Core → Core}/index.js.map +1 -1
  12. package/defaultConfig.d.ts +3 -0
  13. package/defaultConfig.d.ts.map +1 -0
  14. package/defaultConfig.js +21 -0
  15. package/defaultConfig.js.map +1 -0
  16. package/{dist/index.d.ts → index.d.ts} +2 -1
  17. package/index.d.ts.map +1 -0
  18. package/package.json +7 -7
  19. package/transports/bun.d.ts +20 -0
  20. package/transports/bun.d.ts.map +1 -0
  21. package/transports/bun.js +151 -0
  22. package/transports/bun.js.map +1 -0
  23. package/transports/node.d.ts +10 -0
  24. package/transports/node.d.ts.map +1 -0
  25. package/transports/node.js +85 -0
  26. package/transports/node.js.map +1 -0
  27. package/types/hyper.d.ts +33 -0
  28. package/types/hyper.d.ts.map +1 -0
  29. package/types/hyper.js +2 -0
  30. package/types/hyper.js.map +1 -0
  31. package/{dist/types → types}/metrics.d.ts +2 -0
  32. package/types/metrics.d.ts.map +1 -0
  33. package/{dist/types → types}/options.d.ts +2 -1
  34. package/{dist/types → types}/options.d.ts.map +1 -1
  35. package/{dist/types → types}/plugins.d.ts +8 -0
  36. package/{dist/types → types}/plugins.d.ts.map +1 -1
  37. package/types/transport.d.ts +20 -0
  38. package/types/transport.d.ts.map +1 -0
  39. package/types/transport.js +2 -0
  40. package/types/transport.js.map +1 -0
  41. package/utils/merge.d.ts +2 -0
  42. package/utils/merge.d.ts.map +1 -0
  43. package/utils/merge.js +25 -0
  44. package/utils/merge.js.map +1 -0
  45. package/LICENSE +0 -21
  46. package/README.md +0 -210
  47. package/dist/Core/HyperCore.d.ts.map +0 -1
  48. package/dist/Core/HyperCore.js.map +0 -1
  49. package/dist/Core/RequestExecutor.d.ts.map +0 -1
  50. package/dist/Core/RequestExecutor.js.map +0 -1
  51. package/dist/index.d.ts.map +0 -1
  52. package/dist/types/metrics.d.ts.map +0 -1
  53. /package/{dist/Core → Core}/index.js +0 -0
  54. /package/{dist/index.js → index.js} +0 -0
  55. /package/{dist/index.js.map → index.js.map} +0 -0
  56. /package/{dist/types → types}/errors.d.ts +0 -0
  57. /package/{dist/types → types}/errors.d.ts.map +0 -0
  58. /package/{dist/types → types}/errors.js +0 -0
  59. /package/{dist/types → types}/errors.js.map +0 -0
  60. /package/{dist/types → types}/http.d.ts +0 -0
  61. /package/{dist/types → types}/http.d.ts.map +0 -0
  62. /package/{dist/types → types}/http.js +0 -0
  63. /package/{dist/types → types}/http.js.map +0 -0
  64. /package/{dist/types → types}/metrics.js +0 -0
  65. /package/{dist/types → types}/metrics.js.map +0 -0
  66. /package/{dist/types → types}/network.d.ts +0 -0
  67. /package/{dist/types → types}/network.d.ts.map +0 -0
  68. /package/{dist/types → types}/network.js +0 -0
  69. /package/{dist/types → types}/network.js.map +0 -0
  70. /package/{dist/types → types}/options.js +0 -0
  71. /package/{dist/types → types}/options.js.map +0 -0
  72. /package/{dist/types → types}/plugins.js +0 -0
  73. /package/{dist/types → types}/plugins.js.map +0 -0
  74. /package/{dist/types → types}/request.d.ts +0 -0
  75. /package/{dist/types → types}/request.d.ts.map +0 -0
  76. /package/{dist/types → types}/request.js +0 -0
  77. /package/{dist/types → types}/request.js.map +0 -0
  78. /package/{dist/types → types}/retry.d.ts +0 -0
  79. /package/{dist/types → types}/retry.d.ts.map +0 -0
  80. /package/{dist/types → types}/retry.js +0 -0
  81. /package/{dist/types → types}/retry.js.map +0 -0
  82. /package/{dist/types → types}/stream.d.ts +0 -0
  83. /package/{dist/types → types}/stream.d.ts.map +0 -0
  84. /package/{dist/types → types}/stream.js +0 -0
  85. /package/{dist/types → types}/stream.js.map +0 -0
@@ -1,46 +1,21 @@
1
- import type { Method } from "../types/http.js";
2
1
  import type { HttpClientOptions } from "../types/options.js";
3
2
  import type { RequestBodyData, RequestInterface } from "../types/request.js";
4
3
  import type { StreamResponse } from "../types/stream.js";
5
- import type { Readable } from "node:stream";
6
4
  import type { RequestMetrics } from "../types/metrics.js";
7
- export interface InternalRequest {
8
- method: Method;
9
- url: RequestInterface | string;
10
- headers: Record<string, string>;
11
- body?: RequestBodyData;
12
- signal?: AbortSignal;
13
- isGet: boolean;
14
- meta?: {
15
- timings?: {
16
- serializationMs?: number;
17
- networkMs?: number;
18
- parsingMs?: number;
19
- };
20
- [key: string]: any;
21
- };
22
- }
23
- export interface HttpResponse<T = any> {
24
- status: number;
25
- headers: Record<string, any>;
26
- url?: string;
27
- body: T;
28
- }
29
- export interface HyperStats {
30
- inflightRequests?: number;
31
- cacheSize?: number;
32
- queuedRequests?: number;
33
- activeQueue?: number;
34
- rateLimitHits?: number;
35
- [key: string]: any;
36
- }
5
+ import type { HyperTransport } from "../types/transport.js";
6
+ import type { HttpResponse, HyperStats, InternalRequest } from "../types/hyper.js";
37
7
  export declare class HyperCore {
38
8
  config: HttpClientOptions;
39
- private agent;
40
- private executor;
9
+ private transport;
41
10
  private defaultHeaders;
42
- constructor(config: HttpClientOptions);
11
+ private transportPromise;
12
+ constructor(config: HttpClientOptions, transport?: HyperTransport);
13
+ /**
14
+ * Приватный метод для ленивого создания транспорта при первом запросе
15
+ */
16
+ private ensureTransport;
43
17
  dispatch: <T = any>(req: InternalRequest) => Promise<HttpResponse<T>>;
18
+ stream(req: RequestInterface | string): Promise<StreamResponse<any>>;
44
19
  get<T = any>(req: RequestInterface | string, signal?: AbortSignal): Promise<HttpResponse<T>>;
45
20
  post<T = any>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<HttpResponse<T>>;
46
21
  put<T = any>(req: RequestInterface | string, body?: RequestBodyData): Promise<HttpResponse<T>>;
@@ -50,7 +25,6 @@ export declare class HyperCore {
50
25
  head(req: RequestInterface | string): Promise<HttpResponse<null>>;
51
26
  extend(options: Partial<HttpClientOptions>): HyperCore;
52
27
  create(options: Partial<HttpClientOptions>): HyperCore;
53
- stream(req: RequestInterface | string): Promise<StreamResponse<Readable>>;
54
28
  private requestInternal;
55
29
  getStats(): HyperStats;
56
30
  getAllMetrics(): RequestMetrics[];
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HyperCore.d.ts","sourceRoot":"","sources":["../../src/Core/HyperCore.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EACV,YAAY,EACZ,UAAU,EACV,eAAe,EAChB,MAAM,mBAAmB,CAAC;AAoB3B,qBAAa,SAAS;IACb,MAAM,EAAE,iBAAiB,CAAC;IACjC,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,cAAc,CAAyB;IAC/C,OAAO,CAAC,gBAAgB,CAAwC;gBACpD,MAAM,EAAE,iBAAiB,EAAE,SAAS,CAAC,EAAE,cAAc;IAcjE;;OAEG;YACW,eAAe;IAsBtB,QAAQ,GAAU,CAAC,GAAG,GAAG,EAC9B,KAAK,eAAe,KACnB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAgCzB;IAEW,MAAM,CACjB,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAC7B,OAAO,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IA4BxB,GAAG,CAAC,CAAC,GAAG,GAAG,EAChB,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAC9B,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAapB,IAAI,CAAC,CAAC,GAAG,GAAG,EACjB,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAC9B,IAAI,CAAC,EAAE,eAAe,EACtB,MAAM,CAAC,EAAE,WAAW,GACnB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIpB,GAAG,CAAC,CAAC,GAAG,GAAG,EAChB,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAC9B,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIpB,MAAM,CAAC,CAAC,GAAG,GAAG,EACnB,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAC7B,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIpB,KAAK,CAAC,CAAC,GAAG,GAAG,EAClB,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAC9B,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAIpB,OAAO,CAAC,CAAC,GAAG,GAAG,EACpB,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAC9B,IAAI,CAAC,EAAE,eAAe,GACrB,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAId,IAAI,CACf,GAAG,EAAE,gBAAgB,GAAG,MAAM,GAC7B,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAIvB,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS;IAWtD,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC,GAAG,SAAS;YAI/C,eAAe;IAqBtB,QAAQ,IAAI,UAAU;IAGtB,aAAa,IAAI,cAAc,EAAE;IAI3B,OAAO;CAWrB"}
@@ -1,60 +1,74 @@
1
- import { CookieAgent } from "http-cookie-agent/undici";
2
- import { RequestExecutor } from "./RequestExecutor.js";
1
+ import { defaultConfig } from "../defaultConfig.js";
2
+ import { deepMerge } from "../utils/merge.js";
3
+ const getTimestamp = () => {
4
+ return typeof process !== "undefined" && process.hrtime?.bigint
5
+ ? process.hrtime.bigint()
6
+ : performance.now();
7
+ };
8
+ const getDurationMs = (start, end) => {
9
+ if (typeof start === "bigint" && typeof end === "bigint") {
10
+ return Number(end - start) / 1_000_000;
11
+ }
12
+ return end - start;
13
+ };
3
14
  export class HyperCore {
4
15
  config;
5
- agent;
6
- executor;
16
+ transport = null;
7
17
  defaultHeaders;
8
- constructor(config) {
9
- this.config = config;
10
- const concurrency = config.network?.maxConcurrent === 0
11
- ? Infinity
12
- : (config.network?.maxConcurrent ?? 500);
13
- const pipelining = config.network?.pipelining === 0
14
- ? 256
15
- : (config.network?.pipelining ?? 10);
16
- this.agent = new CookieAgent({
17
- connections: concurrency === Infinity ? 0x7fffffff : concurrency,
18
- pipelining: pipelining,
19
- keepAliveTimeout: config.network?.keepAliveTimeout ?? 30000,
20
- keepAliveMaxTimeout: config.network?.keepAliveTimeout ?? 30000,
21
- connect: { rejectUnauthorized: config.network?.rejectUnauthorized },
22
- allowH2: config.network?.allowHttp2 ?? true,
23
- });
24
- const retryOptions = {
25
- maxRetries: config.retry?.maxRetries ?? 3,
26
- ...config.retry,
27
- };
28
- const network = config.network;
29
- this.executor = new RequestExecutor(this.agent, {
30
- timeout: network?.timeout ?? 30000,
31
- maxRetries: retryOptions.maxRetries ?? 3,
32
- followRedirects: network?.followRedirects ?? true,
33
- maxRedirects: network?.maxRedirects ?? 5,
34
- retryOptions: retryOptions,
35
- verbose: config.verbose ?? false,
36
- logger: config.logger,
37
- });
18
+ transportPromise = null;
19
+ constructor(config, transport) {
20
+ const finalConfig = deepMerge({ ...defaultConfig }, config);
21
+ this.config = finalConfig;
22
+ if (transport) {
23
+ this.transport = transport;
24
+ }
38
25
  this.defaultHeaders = {
39
26
  Accept: "application/json, text/plain, */*",
40
27
  "Accept-Encoding": "gzip, deflate, br",
41
28
  "User-Agent": config.network?.userAgent || "Hyperttp/2.0",
42
29
  };
43
30
  }
31
+ /**
32
+ * Приватный метод для ленивого создания транспорта при первом запросе
33
+ */
34
+ async ensureTransport() {
35
+ if (this.transportPromise)
36
+ return this.transportPromise;
37
+ if (this.transport)
38
+ return this.transport;
39
+ this.transportPromise = (async () => {
40
+ let transport;
41
+ if (typeof Bun !== "undefined") {
42
+ const { BunTransport } = await import("../transports/bun.js");
43
+ transport = new BunTransport(this.config);
44
+ }
45
+ else {
46
+ const { NodeTransport } = await import("../transports/node.js");
47
+ transport = new NodeTransport(this.config);
48
+ }
49
+ this.transport = transport;
50
+ return transport;
51
+ })();
52
+ return this.transportPromise;
53
+ }
44
54
  dispatch = async (req) => {
45
55
  const urlString = typeof req.url === "string" ? req.url : req.url.getURL();
46
56
  if (req.signal?.aborted) {
47
57
  throw new Error("Request aborted by user");
48
58
  }
59
+ const activeTransport = await this.ensureTransport();
49
60
  req.meta = req.meta || {};
50
61
  req.meta.timings = req.meta.timings || {};
51
- const startNetwork = this.config.trackMetrics
52
- ? process.hrtime.bigint()
53
- : null;
54
- const rawResponse = await this.executor.execute(req.method, urlString, req.headers, req.body, req.signal);
62
+ const startNetwork = this.config.trackMetrics ? getTimestamp() : null;
63
+ const rawResponse = await activeTransport.execute({
64
+ method: req.method,
65
+ url: urlString,
66
+ headers: req.headers,
67
+ body: req.body,
68
+ signal: req.signal,
69
+ });
55
70
  if (this.config.trackMetrics && startNetwork !== null) {
56
- req.meta.timings.networkMs =
57
- Number(process.hrtime.bigint() - startNetwork) / 1_000_000;
71
+ req.meta.timings.networkMs = getDurationMs(startNetwork, getTimestamp());
58
72
  }
59
73
  return {
60
74
  status: rawResponse.status,
@@ -63,6 +77,29 @@ export class HyperCore {
63
77
  url: rawResponse.url,
64
78
  };
65
79
  };
80
+ async stream(req) {
81
+ const url = typeof req === "string" ? req : req.getURL();
82
+ const signal = typeof req !== "string"
83
+ ? (req.getSignal?.() ?? req.signal)
84
+ : undefined;
85
+ const headers = {
86
+ ...this.defaultHeaders,
87
+ ...(typeof req !== "string" ? req.getHeaders?.() : {}),
88
+ };
89
+ const activeTransport = await this.ensureTransport();
90
+ const rawResponse = await activeTransport.execute({
91
+ method: "GET",
92
+ url,
93
+ headers,
94
+ signal,
95
+ });
96
+ return {
97
+ status: rawResponse.status,
98
+ headers: rawResponse.headers,
99
+ body: rawResponse.body,
100
+ url: rawResponse.url,
101
+ };
102
+ }
66
103
  get(req, signal) {
67
104
  if (typeof req === "string") {
68
105
  return this.dispatch({
@@ -97,32 +134,12 @@ export class HyperCore {
97
134
  return new HyperCore({
98
135
  ...this.config,
99
136
  ...options,
100
- network: {
101
- ...this.config.network,
102
- ...options.network,
103
- },
104
- });
137
+ network: { ...this.config.network, ...options.network },
138
+ }, this.transport ?? undefined);
105
139
  }
106
140
  create(options) {
107
141
  return this.extend(options);
108
142
  }
109
- async stream(req) {
110
- const url = typeof req === "string" ? req : req.getURL();
111
- const signal = typeof req !== "string"
112
- ? (req.getSignal?.() ?? req.signal)
113
- : undefined;
114
- const headers = {
115
- ...this.defaultHeaders,
116
- ...(typeof req !== "string" ? req.getHeaders?.() : {}),
117
- };
118
- const rawResponse = await this.executor.execute("GET", url, headers, undefined, signal);
119
- return {
120
- status: rawResponse.status,
121
- headers: rawResponse.headers,
122
- body: rawResponse.body,
123
- url: rawResponse.url,
124
- };
125
- }
126
143
  async requestInternal(method, req, body, isGet = false, signal) {
127
144
  return this.dispatch({
128
145
  method,
@@ -144,12 +161,8 @@ export class HyperCore {
144
161
  }
145
162
  async destroy() {
146
163
  try {
147
- const anyAgent = this.agent;
148
- if (typeof anyAgent.destroy === "function") {
149
- await anyAgent.destroy();
150
- }
151
- else if (typeof anyAgent.close === "function") {
152
- await anyAgent.close();
164
+ if (this.transport && typeof this.transport.destroy === "function") {
165
+ await this.transport.destroy();
153
166
  }
154
167
  }
155
168
  catch (error) {
@@ -0,0 +1 @@
1
+ {"version":3,"file":"HyperCore.js","sourceRoot":"","sources":["../../src/Core/HyperCore.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { Agent } from "undici";
2
2
  import type { RetryOptions } from "../types/retry.js";
3
- import type { LogLevel } from "../types/http.js";
3
+ import type { LogLevel, ResponseType } from "../types/http.js";
4
4
  import type { RequestMetrics } from "../types/metrics.js";
5
5
  type LowLevelResponse = {
6
6
  status: number;
@@ -33,7 +33,10 @@ export declare class RequestExecutor {
33
33
  * @en Executes a raw HTTP request.
34
34
  * @ru Выполняет "сырой" HTTP-запрос.
35
35
  */
36
- execute(method: string, url: string, headers: Record<string, string>, body: string | Buffer | undefined, signal?: AbortSignal, metrics?: RequestMetrics, interceptors?: DynamicInterceptor | any): Promise<LowLevelResponse>;
36
+ execute(method: string, url: string, headers: Record<string, string>, body: string | Buffer | undefined, signal?: AbortSignal, metrics?: RequestMetrics, interceptors?: DynamicInterceptor | any, meta?: {
37
+ responseType?: ResponseType;
38
+ }): Promise<LowLevelResponse>;
39
+ get verbose(): boolean;
37
40
  /**
38
41
  * @en Calculates the delay for the next retry attempt using exponential backoff.
39
42
  * @ru Вычисляет задержку для следующей попытки повтора.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestExecutor.d.ts","sourceRoot":"","sources":["../../src/Core/RequestExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,QAAQ,EAAU,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAG1D,KAAK,gBAAgB,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,CAAC,CAAC;IACvD,IAAI,EAAE,GAAG,CAAC;IACV,GAAG,EAAE,MAAM,CAAC;CACb,CAAC;AAEF,UAAU,kBAAkB;IAC1B,YAAY,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACxC,aAAa,CAAC,QAAQ,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;CAC5C;AAED;;;GAGG;AACH,qBAAa,eAAe;IAIxB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,OAAO;IAJjB,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAsC;gBAGhE,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE;QACf,OAAO,EAAE,MAAM,CAAC;QAChB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,OAAO,CAAC;QACzB,YAAY,EAAE,MAAM,CAAC;QACrB,YAAY,EAAE,YAAY,CAAC;QAC3B,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,CAAC;KACjE;IAGH;;;OAGG;IACU,OAAO,CAClB,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,EACjC,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,cAAc,EACxB,YAAY,CAAC,EAAE,kBAAkB,GAAG,GAAG,EACvC,IAAI,CAAC,EAAE;QAAE,YAAY,CAAC,EAAE,YAAY,CAAA;KAAE,GACrC,OAAO,CAAC,gBAAgB,CAAC;IAc5B,IAAW,OAAO,IAAI,OAAO,CAE5B;IAED;;;OAGG;IACH,OAAO,CAAC,SAAS;IAUjB,OAAO,CAAC,KAAK;IAIb;;;OAGG;YACW,SAAS;IAoBvB;;;OAGG;IACH,OAAO,CAAC,WAAW;YAQL,WAAW;CAmL1B"}
@@ -16,8 +16,11 @@ export class RequestExecutor {
16
16
  * @en Executes a raw HTTP request.
17
17
  * @ru Выполняет "сырой" HTTP-запрос.
18
18
  */
19
- async execute(method, url, headers, body, signal, metrics, interceptors) {
20
- return this.executeCore(method, url, headers, body, metrics, signal, async (res) => res.body, interceptors);
19
+ async execute(method, url, headers, body, signal, metrics, interceptors, meta) {
20
+ return this.executeCore(method, url, headers, body, metrics, signal, async (res) => res.body, interceptors, meta?.responseType === "stream");
21
+ }
22
+ get verbose() {
23
+ return this.options.verbose ?? false;
21
24
  }
22
25
  /**
23
26
  * @en Calculates the delay for the next retry attempt using exponential backoff.
@@ -66,7 +69,7 @@ export class RequestExecutor {
66
69
  }
67
70
  return status === 502 || status === 503 || status === 504;
68
71
  }
69
- async executeCore(method, url, headers, body, metrics, signal, parser, interceptors) {
72
+ async executeCore(method, url, headers, body, metrics, signal, parser, interceptors, isStreaming = false) {
70
73
  let currentUrl = url;
71
74
  let currentMethod = method;
72
75
  let currentHeaders = headers;
@@ -78,15 +81,13 @@ export class RequestExecutor {
78
81
  applyResponse: async (r) => r,
79
82
  };
80
83
  const timeoutController = new AbortController();
81
- const timer = setTimeout(() => timeoutController.abort(), this.options.timeout);
82
- const abortHandler = () => timeoutController.abort();
83
- if (signal) {
84
- if (signal.aborted) {
85
- clearTimeout(timer);
86
- throw new HttpClientError("Request aborted by user", "ABORTED", 0, undefined, url, method);
87
- }
88
- signal.addEventListener("abort", abortHandler, { once: true });
89
- }
84
+ const timeoutValue = isStreaming ? 0 : this.options.timeout;
85
+ const timer = timeoutValue > 0
86
+ ? setTimeout(() => timeoutController.abort(), timeoutValue)
87
+ : undefined;
88
+ const combinedSignal = signal
89
+ ? AbortSignal.any([signal, timeoutController.signal])
90
+ : timeoutController.signal;
90
91
  try {
91
92
  while (true) {
92
93
  try {
@@ -101,7 +102,7 @@ export class RequestExecutor {
101
102
  headers: config.headers,
102
103
  body: config.body,
103
104
  dispatcher: this.agent,
104
- signal: timeoutController.signal,
105
+ signal: combinedSignal,
105
106
  });
106
107
  const status = res.statusCode;
107
108
  const resHeaders = res.headers;
@@ -115,22 +116,21 @@ export class RequestExecutor {
115
116
  if (location) {
116
117
  await this.drainBody(res.body);
117
118
  const nextUrl = new URL(location, config.url).toString();
118
- const nextMethod = status === 303 ? "GET" : currentMethod;
119
+ let nextMethod = currentMethod;
120
+ if (status === 303 ||
121
+ ((status === 301 || status === 302) && currentMethod === "POST")) {
122
+ nextMethod = "GET";
123
+ }
119
124
  currentUrl = nextUrl;
120
125
  currentMethod = nextMethod;
121
126
  currentBody = nextMethod === "GET" ? undefined : currentBody;
122
127
  if (nextMethod === "GET") {
123
- if (currentHeaders["content-type"] ||
124
- currentHeaders["Content-Type"] ||
125
- currentHeaders["content-length"] ||
126
- currentHeaders["Content-Length"]) {
127
- const nextHeaders = { ...currentHeaders };
128
- delete nextHeaders["content-type"];
129
- delete nextHeaders["Content-Type"];
130
- delete nextHeaders["content-length"];
131
- delete nextHeaders["Content-Length"];
132
- currentHeaders = nextHeaders;
133
- }
128
+ const nextHeaders = { ...currentHeaders };
129
+ delete nextHeaders["content-type"];
130
+ delete nextHeaders["Content-Type"];
131
+ delete nextHeaders["content-length"];
132
+ delete nextHeaders["Content-Length"];
133
+ currentHeaders = nextHeaders;
134
134
  }
135
135
  redirects++;
136
136
  continue;
@@ -141,9 +141,7 @@ export class RequestExecutor {
141
141
  if (metrics)
142
142
  metrics.retries += 1;
143
143
  await this.drainBody(res.body);
144
- const delay = this.calcDelay(attempt);
145
- if (delay > 0)
146
- await this.sleep(delay);
144
+ await this.sleep(this.calcDelay(attempt));
147
145
  attempt++;
148
146
  continue;
149
147
  }
@@ -164,15 +162,20 @@ export class RequestExecutor {
164
162
  };
165
163
  }
166
164
  catch (err) {
167
- if (err?.name === "AbortError") {
165
+ if (err.name === "AbortError") {
168
166
  if (signal?.aborted) {
169
167
  throw new HttpClientError("Request aborted by user", "ABORTED", 0, err, url, method);
170
168
  }
171
- throw new TimeoutError(url, this.options.timeout);
169
+ if (timeoutController.signal.aborted) {
170
+ throw new TimeoutError(url, this.options.timeout);
171
+ }
172
+ throw new HttpClientError("Request aborted due to transport closure or internal state reset", "TRANSPORT_CLOSED", 0, err, url, method);
172
173
  }
173
174
  if (attempt < this.options.maxRetries &&
174
175
  (err?.code === "ECONNREFUSED" ||
175
176
  err?.code === "ETIMEDOUT" ||
177
+ err?.code === "ECONNRESET" ||
178
+ err?.code === "EPIPE" ||
176
179
  err?.code === "UND_ERR_SOCKET")) {
177
180
  if (metrics)
178
181
  metrics.retries += 1;
@@ -185,9 +188,8 @@ export class RequestExecutor {
185
188
  }
186
189
  }
187
190
  finally {
188
- clearTimeout(timer);
189
- if (signal)
190
- signal.removeEventListener("abort", abortHandler);
191
+ if (timer)
192
+ clearTimeout(timer);
191
193
  }
192
194
  }
193
195
  }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"RequestExecutor.js","sourceRoot":"","sources":["../../src/Core/RequestExecutor.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,3 @@
1
1
  export { HyperCore } from "./HyperCore.js";
2
- export type { InternalRequest } from "./HyperCore.js";
3
2
  export { RequestExecutor } from "./RequestExecutor.js";
4
3
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/Core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/Core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { HttpClientOptions } from "./types/options.js";
2
+ export declare const defaultConfig: HttpClientOptions;
3
+ //# sourceMappingURL=defaultConfig.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultConfig.d.ts","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAEvD,eAAO,MAAM,aAAa,EAAE,iBAmB3B,CAAC"}
@@ -0,0 +1,21 @@
1
+ export const defaultConfig = {
2
+ network: {
3
+ timeout: 30000,
4
+ maxConcurrent: 500,
5
+ allowHttp2: true,
6
+ pipelining: 10,
7
+ keepAliveTimeout: 30000,
8
+ followRedirects: true,
9
+ maxRedirects: 5,
10
+ rejectUnauthorized: true,
11
+ userAgent: "Hyperttp/2.0",
12
+ },
13
+ retry: {
14
+ maxRetries: 3,
15
+ baseDelay: 100,
16
+ maxDelay: 5000,
17
+ jitter: true,
18
+ },
19
+ verbose: false,
20
+ };
21
+ //# sourceMappingURL=defaultConfig.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"defaultConfig.js","sourceRoot":"","sources":["../src/defaultConfig.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,aAAa,GAAsB;IAC9C,OAAO,EAAE;QACP,OAAO,EAAE,KAAK;QACd,aAAa,EAAE,GAAG;QAClB,UAAU,EAAE,IAAI;QAChB,UAAU,EAAE,EAAE;QACd,gBAAgB,EAAE,KAAK;QACvB,eAAe,EAAE,IAAI;QACrB,YAAY,EAAE,CAAC;QACf,kBAAkB,EAAE,IAAI;QACxB,SAAS,EAAE,cAAc;KAC1B;IACD,KAAK,EAAE;QACL,UAAU,EAAE,CAAC;QACb,SAAS,EAAE,GAAG;QACd,QAAQ,EAAE,IAAI;QACd,MAAM,EAAE,IAAI;KACb;IACD,OAAO,EAAE,KAAK;CACf,CAAC"}
@@ -1,8 +1,8 @@
1
1
  export { HyperCore } from "./Core/HyperCore.js";
2
2
  export { RequestExecutor } from "./Core/RequestExecutor.js";
3
- export type { InternalRequest, HttpResponse, HyperStats, } from "./Core/HyperCore.js";
4
3
  export type * from "./types/errors.js";
5
4
  export type * from "./types/http.js";
5
+ export type * from "./types/hyper.js";
6
6
  export type * from "./types/metrics.js";
7
7
  export type * from "./types/network.js";
8
8
  export type * from "./types/options.js";
@@ -10,4 +10,5 @@ export type * from "./types/plugins.js";
10
10
  export type * from "./types/request.js";
11
11
  export type * from "./types/retry.js";
12
12
  export type * from "./types/stream.js";
13
+ export type * from "./types/transport.js";
13
14
  //# sourceMappingURL=index.d.ts.map
package/index.d.ts.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAE5D,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,iBAAiB,CAAC;AACrC,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,oBAAoB,CAAC;AACxC,mBAAmB,kBAAkB,CAAC;AACtC,mBAAmB,mBAAmB,CAAC;AACvC,mBAAmB,sBAAsB,CAAC"}
package/package.json CHANGED
@@ -1,13 +1,10 @@
1
1
  {
2
2
  "name": "@hyperttp/core",
3
- "version": "1.0.5",
3
+ "version": "1.1.0",
4
4
  "description": "High-performance, extensible HTTP client for Node.js and Bun",
5
5
  "type": "module",
6
- "main": "./dist/index.js",
7
- "types": "./dist/index.d.ts",
8
- "files": [
9
- "dist"
10
- ],
6
+ "main": "./index.js",
7
+ "types": "./index.d.ts",
11
8
  "keywords": [
12
9
  "http",
13
10
  "client",
@@ -22,8 +19,11 @@
22
19
  "type": "git",
23
20
  "url": "git+https://github.com/IT-IF-OR/hyperttp-core.git"
24
21
  },
22
+ "peerDependencies": {
23
+ "typescript": "^6.0.3"
24
+ },
25
25
  "dependencies": {
26
26
  "http-cookie-agent": "^8.0.0",
27
27
  "undici": "^8.3.0"
28
28
  }
29
- }
29
+ }
@@ -0,0 +1,20 @@
1
+ import { HttpClientOptions } from "../types/options.js";
2
+ import type { HyperTransport, TransportRequest, TransportResponse } from "../types/transport.js";
3
+ export declare class BunTransport implements HyperTransport {
4
+ private cookieJar;
5
+ private config;
6
+ private activeRequests;
7
+ private concurrencyQueue;
8
+ constructor(config: HttpClientOptions);
9
+ execute(req: TransportRequest): Promise<TransportResponse>;
10
+ /**
11
+ * Ищет куки, подходящие для текущего домена (включая wildcard-домены)
12
+ */
13
+ private getCookiesForDomain;
14
+ /**
15
+ * Парсит Set-Cookie с поддержкой директивы Domain=...
16
+ */
17
+ private updateCookies;
18
+ destroy(): Promise<void>;
19
+ }
20
+ //# sourceMappingURL=bun.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bun.d.ts","sourceRoot":"","sources":["../../src/transports/bun.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EACV,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAc/B,qBAAa,YAAa,YAAW,cAAc;IACjD,OAAO,CAAC,SAAS,CAA6B;IAC9C,OAAO,CAAC,MAAM,CAAoB;IAElC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,gBAAgB,CAAsB;gBAElC,MAAM,EAAE,iBAAiB;IAIxB,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAsEvE;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAiB3B;;OAEG;IACH,OAAO,CAAC,aAAa;IAgDR,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAItC"}