hyperttp 0.2.1 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Hyperttp/Core/CacheManager.d.ts +40 -3
- package/dist/Hyperttp/Core/CacheManager.d.ts.map +1 -1
- package/dist/Hyperttp/Core/CacheManager.js +61 -12
- package/dist/Hyperttp/Core/CacheManager.js.map +1 -1
- package/dist/Hyperttp/Core/HttpClientImproved.d.ts +69 -97
- package/dist/Hyperttp/Core/HttpClientImproved.d.ts.map +1 -1
- package/dist/Hyperttp/Core/HttpClientImproved.js +331 -642
- package/dist/Hyperttp/Core/HttpClientImproved.js.map +1 -1
- package/dist/Hyperttp/Core/InterceptorManager.d.ts +62 -0
- package/dist/Hyperttp/Core/InterceptorManager.d.ts.map +1 -0
- package/dist/Hyperttp/Core/InterceptorManager.js +64 -0
- package/dist/Hyperttp/Core/InterceptorManager.js.map +1 -0
- package/dist/Hyperttp/Core/MetricsManager.d.ts +80 -0
- package/dist/Hyperttp/Core/MetricsManager.d.ts.map +1 -0
- package/dist/Hyperttp/Core/MetricsManager.js +140 -0
- package/dist/Hyperttp/Core/MetricsManager.js.map +1 -0
- package/dist/Hyperttp/Core/QueueManager.d.ts +5 -40
- package/dist/Hyperttp/Core/QueueManager.d.ts.map +1 -1
- package/dist/Hyperttp/Core/QueueManager.js +41 -47
- package/dist/Hyperttp/Core/QueueManager.js.map +1 -1
- package/dist/Hyperttp/Core/RateLimiter.d.ts +40 -20
- package/dist/Hyperttp/Core/RateLimiter.d.ts.map +1 -1
- package/dist/Hyperttp/Core/RateLimiter.js +65 -44
- package/dist/Hyperttp/Core/RateLimiter.js.map +1 -1
- package/dist/Hyperttp/Core/RequestBuilder.d.ts +48 -64
- package/dist/Hyperttp/Core/RequestBuilder.d.ts.map +1 -1
- package/dist/Hyperttp/Core/RequestBuilder.js +87 -99
- package/dist/Hyperttp/Core/RequestBuilder.js.map +1 -1
- package/dist/Hyperttp/Core/RequestExecutor.d.ts +58 -0
- package/dist/Hyperttp/Core/RequestExecutor.d.ts.map +1 -0
- package/dist/Hyperttp/Core/RequestExecutor.js +160 -0
- package/dist/Hyperttp/Core/RequestExecutor.js.map +1 -0
- package/dist/Hyperttp/Core/ResponseTransformer.d.ts +35 -0
- package/dist/Hyperttp/Core/ResponseTransformer.d.ts.map +1 -0
- package/dist/Hyperttp/Core/ResponseTransformer.js +171 -0
- package/dist/Hyperttp/Core/ResponseTransformer.js.map +1 -0
- package/dist/Hyperttp/Core/index.d.ts +7 -1
- package/dist/Hyperttp/Core/index.d.ts.map +1 -1
- package/dist/Hyperttp/Core/index.js +17 -5
- package/dist/Hyperttp/Core/index.js.map +1 -1
- package/dist/Hyperttp/Request.d.ts +5 -0
- package/dist/Hyperttp/Request.d.ts.map +1 -1
- package/dist/Hyperttp/Request.js +17 -35
- package/dist/Hyperttp/Request.js.map +1 -1
- package/dist/Hyperttp/UrlExtractor.d.ts +1 -1
- package/dist/Hyperttp/UrlExtractor.d.ts.map +1 -1
- package/dist/Hyperttp/UrlExtractor.js.map +1 -1
- package/dist/Hyperttp/index.d.ts +3 -1
- package/dist/Hyperttp/index.d.ts.map +1 -1
- package/dist/Hyperttp/index.js +6 -1
- package/dist/Hyperttp/index.js.map +1 -1
- package/dist/Types/index.d.ts +45 -206
- package/dist/Types/index.d.ts.map +1 -1
- package/dist/Types/index.js +7 -16
- package/dist/Types/index.js.map +1 -1
- package/dist/Types/request.d.ts +15 -100
- package/dist/Types/request.d.ts.map +1 -1
- package/dist/Types/request.js.map +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,23 +1,17 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.RequestBuilder = void 0;
|
|
7
|
-
const HttpClientImproved_1 = __importDefault(require("./HttpClientImproved"));
|
|
8
|
-
let defaultClient = null;
|
|
9
4
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* @example
|
|
5
|
+
* @class RequestBuilder
|
|
6
|
+
* @en Fluent request builder for creating HTTP requests with a chainable API.
|
|
7
|
+
* @ru Fluent request builder для создания HTTP-запросов. Позволяет собирать параметры запроса в цепочку.
|
|
8
|
+
* * @example
|
|
14
9
|
* ```ts
|
|
15
|
-
* const
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
* .send();
|
|
10
|
+
* const user = await client.request('[https://api.example.com/users](https://api.example.com/users)')
|
|
11
|
+
* .post()
|
|
12
|
+
* .jsonBody({ name: 'John' })
|
|
13
|
+
* .headers({ 'X-Custom-Header': 'value' })
|
|
14
|
+
* .send();
|
|
21
15
|
* ```
|
|
22
16
|
*/
|
|
23
17
|
class RequestBuilder {
|
|
@@ -25,148 +19,142 @@ class RequestBuilder {
|
|
|
25
19
|
_method = "GET";
|
|
26
20
|
_headers = {};
|
|
27
21
|
_body;
|
|
28
|
-
_responseType = "
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
*/
|
|
33
|
-
constructor(url) {
|
|
22
|
+
_responseType = "auto";
|
|
23
|
+
_client;
|
|
24
|
+
_signal;
|
|
25
|
+
constructor(url, client) {
|
|
34
26
|
this._url = url;
|
|
27
|
+
this._client = client;
|
|
35
28
|
}
|
|
36
29
|
/**
|
|
37
|
-
*
|
|
38
|
-
* @
|
|
39
|
-
* @returns The builder instance for chaining
|
|
30
|
+
* @en Appends multiple headers to the request.
|
|
31
|
+
* @ru Добавляет несколько заголовков к запросу.
|
|
40
32
|
*/
|
|
41
33
|
headers(headers) {
|
|
42
|
-
this._headers
|
|
34
|
+
Object.assign(this._headers, headers);
|
|
43
35
|
return this;
|
|
44
36
|
}
|
|
45
37
|
/**
|
|
46
|
-
* Sets the request body
|
|
47
|
-
* @
|
|
48
|
-
* @returns The builder instance for chaining
|
|
38
|
+
* @en Sets the request body.
|
|
39
|
+
* @ru Устанавливает тело запроса.
|
|
49
40
|
*/
|
|
50
41
|
body(bodyData) {
|
|
51
42
|
this._body = bodyData;
|
|
52
43
|
return this;
|
|
53
44
|
}
|
|
54
45
|
/**
|
|
55
|
-
* Sets the
|
|
56
|
-
* @
|
|
57
|
-
*/
|
|
58
|
-
json() {
|
|
59
|
-
this._responseType = "json";
|
|
60
|
-
return this;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Sets the response type to plain text.
|
|
64
|
-
* @returns The builder instance for chaining
|
|
46
|
+
* @en Sets the body and ensures Content-Type is application/json.
|
|
47
|
+
* @ru Устанавливает тело запроса и заголовок Content-Type: application/json.
|
|
65
48
|
*/
|
|
66
|
-
|
|
67
|
-
this.
|
|
49
|
+
jsonBody(body) {
|
|
50
|
+
this._body = body;
|
|
51
|
+
this._headers["Content-Type"] = "application/json; charset=utf-8";
|
|
68
52
|
return this;
|
|
69
53
|
}
|
|
70
54
|
/**
|
|
71
|
-
*
|
|
72
|
-
* @
|
|
55
|
+
* @en Adds URL query parameters.
|
|
56
|
+
* @ru Добавляет параметры запроса в URL (search params).
|
|
73
57
|
*/
|
|
74
|
-
|
|
75
|
-
|
|
58
|
+
query(params) {
|
|
59
|
+
const urlObj = new URL(this._url);
|
|
60
|
+
Object.entries(params).forEach(([k, v]) => urlObj.searchParams.set(k, String(v)));
|
|
61
|
+
this._url = urlObj.toString();
|
|
76
62
|
return this;
|
|
77
63
|
}
|
|
78
|
-
/**
|
|
79
|
-
* Sets the HTTP method to POST.
|
|
80
|
-
* @returns The builder instance for chaining
|
|
81
|
-
*/
|
|
64
|
+
/** @en Set method to POST */
|
|
82
65
|
post() {
|
|
83
66
|
this._method = "POST";
|
|
84
67
|
return this;
|
|
85
68
|
}
|
|
86
|
-
/**
|
|
87
|
-
* @ru Устанавливает потоковый режим ответа.
|
|
88
|
-
* @en Sets streaming response mode.
|
|
89
|
-
*/
|
|
90
|
-
stream() {
|
|
91
|
-
this._responseType = "stream";
|
|
92
|
-
return this;
|
|
93
|
-
}
|
|
94
|
-
/**
|
|
95
|
-
* Sets the HTTP method to PUT.
|
|
96
|
-
* @returns The builder instance for chaining
|
|
97
|
-
*/
|
|
69
|
+
/** @en Set method to PUT */
|
|
98
70
|
put() {
|
|
99
71
|
this._method = "PUT";
|
|
100
72
|
return this;
|
|
101
73
|
}
|
|
102
|
-
/**
|
|
103
|
-
* Sets the HTTP method to PATCH.
|
|
104
|
-
* @returns The builder instance for chaining
|
|
105
|
-
*/
|
|
74
|
+
/** @en Set method to PATCH */
|
|
106
75
|
patch() {
|
|
107
76
|
this._method = "PATCH";
|
|
108
77
|
return this;
|
|
109
78
|
}
|
|
110
|
-
/**
|
|
111
|
-
* Sets the HTTP method to DELETE.
|
|
112
|
-
* @returns The builder instance for chaining
|
|
113
|
-
*/
|
|
79
|
+
/** @en Set method to DELETE */
|
|
114
80
|
delete() {
|
|
115
81
|
this._method = "DELETE";
|
|
116
82
|
return this;
|
|
117
83
|
}
|
|
84
|
+
/** @en Set method to HEAD */
|
|
85
|
+
head() {
|
|
86
|
+
this._method = "HEAD";
|
|
87
|
+
return this;
|
|
88
|
+
}
|
|
89
|
+
/** @en Set response type to JSON */
|
|
90
|
+
json() {
|
|
91
|
+
this._responseType = "json";
|
|
92
|
+
return this;
|
|
93
|
+
}
|
|
94
|
+
/** @en Set response type to Plain Text */
|
|
95
|
+
text() {
|
|
96
|
+
this._responseType = "text";
|
|
97
|
+
return this;
|
|
98
|
+
}
|
|
99
|
+
/** @en Set response type to XML */
|
|
100
|
+
xml() {
|
|
101
|
+
this._responseType = "xml";
|
|
102
|
+
return this;
|
|
103
|
+
}
|
|
104
|
+
/** @en Set response type to Buffer */
|
|
105
|
+
buffer() {
|
|
106
|
+
this._responseType = "buffer";
|
|
107
|
+
return this;
|
|
108
|
+
}
|
|
109
|
+
/** @en Set response type to Stream (AsyncIterable) */
|
|
110
|
+
stream() {
|
|
111
|
+
this._responseType = "stream";
|
|
112
|
+
return this;
|
|
113
|
+
}
|
|
118
114
|
/**
|
|
119
|
-
*
|
|
120
|
-
* @
|
|
121
|
-
* @returns The builder instance for chaining
|
|
115
|
+
* @en Attaches an external AbortSignal for manual cancellation.
|
|
116
|
+
* @ru Привязывает внешний AbortSignal для ручной отмены запроса.
|
|
122
117
|
*/
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
Object.entries(params).forEach(([k, v]) => urlObj.searchParams.set(k, String(v)));
|
|
126
|
-
this._url = urlObj.toString();
|
|
118
|
+
signal(signal) {
|
|
119
|
+
this._signal = signal;
|
|
127
120
|
return this;
|
|
128
121
|
}
|
|
129
122
|
/**
|
|
130
|
-
*
|
|
131
|
-
*
|
|
132
|
-
* @param body - The JSON body data
|
|
133
|
-
* @returns The builder instance for chaining
|
|
123
|
+
* @en Creates a timeout signal for this specific request.
|
|
124
|
+
* @ru Устанавливает таймаут для конкретно этого запроса.
|
|
134
125
|
*/
|
|
135
|
-
|
|
136
|
-
this.
|
|
137
|
-
this._headers["Content-Type"] = "application/json; charset=utf-8";
|
|
126
|
+
timeout(ms) {
|
|
127
|
+
this._signal = AbortSignal.timeout(ms);
|
|
138
128
|
return this;
|
|
139
129
|
}
|
|
140
130
|
/**
|
|
141
|
-
*
|
|
142
|
-
* @
|
|
131
|
+
* @en Finalizes and sends the request.
|
|
132
|
+
* @ru Финализирует и отправляет запрос.
|
|
133
|
+
* @returns Promise resolving to the expected type T or StreamResponse.
|
|
143
134
|
*/
|
|
144
135
|
async send() {
|
|
145
|
-
const client = defaultClient ?? (defaultClient = new HttpClientImproved_1.default());
|
|
146
136
|
const req = {
|
|
147
137
|
getURL: () => this._url,
|
|
148
138
|
getBodyData: () => this._body,
|
|
149
139
|
getHeaders: () => this._headers,
|
|
140
|
+
getSignal: () => this._signal,
|
|
150
141
|
};
|
|
142
|
+
if (this._responseType === "stream") {
|
|
143
|
+
return (await this._client.stream(req));
|
|
144
|
+
}
|
|
151
145
|
switch (this._method) {
|
|
152
|
-
case "GET":
|
|
153
|
-
if (this._responseType === "stream") {
|
|
154
|
-
return client.stream(req);
|
|
155
|
-
}
|
|
156
|
-
return client.get(req, this._responseType);
|
|
157
146
|
case "POST":
|
|
158
|
-
return
|
|
147
|
+
return this._client.post(req, this._body, this._responseType);
|
|
159
148
|
case "PUT":
|
|
160
|
-
return
|
|
161
|
-
case "DELETE":
|
|
162
|
-
return client.delete(req, this._responseType);
|
|
149
|
+
return this._client.put(req, this._body, this._responseType);
|
|
163
150
|
case "PATCH":
|
|
164
|
-
return
|
|
151
|
+
return this._client.patch(req, this._body, this._responseType);
|
|
152
|
+
case "DELETE":
|
|
153
|
+
return this._client.delete(req, this._responseType);
|
|
154
|
+
case "HEAD":
|
|
155
|
+
return (await this._client.head(req));
|
|
165
156
|
default:
|
|
166
|
-
|
|
167
|
-
return client.stream(req);
|
|
168
|
-
}
|
|
169
|
-
return client.get(req, this._responseType);
|
|
157
|
+
return this._client.get(req, this._responseType);
|
|
170
158
|
}
|
|
171
159
|
}
|
|
172
160
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestBuilder.js","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"RequestBuilder.js","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RequestBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { Agent } from "undici";
|
|
2
|
+
import { RetryOptions, LogLevel, RequestMetrics } from "../../Types";
|
|
3
|
+
import { InterceptorManager } from "./InterceptorManager";
|
|
4
|
+
/**
|
|
5
|
+
* @class RequestExecutor
|
|
6
|
+
* @en The core engine responsible for low-level HTTP execution, retries, and redirect logic.
|
|
7
|
+
* @ru Основной движок, отвечающий за низкоуровневое выполнение HTTP-запросов, повторы и логику редиректов.
|
|
8
|
+
*/
|
|
9
|
+
export declare class RequestExecutor {
|
|
10
|
+
private agent;
|
|
11
|
+
private interceptors;
|
|
12
|
+
private options;
|
|
13
|
+
constructor(agent: Agent, interceptors: InterceptorManager, options: {
|
|
14
|
+
timeout: number;
|
|
15
|
+
maxRetries: number;
|
|
16
|
+
followRedirects: boolean;
|
|
17
|
+
maxRedirects: number;
|
|
18
|
+
retryOptions: RetryOptions;
|
|
19
|
+
verbose?: boolean;
|
|
20
|
+
logger?: (level: LogLevel, message: string, meta?: any) => void;
|
|
21
|
+
});
|
|
22
|
+
/**
|
|
23
|
+
* @en Internal logger wrapper.
|
|
24
|
+
* @ru Внутренняя обертка для логирования.
|
|
25
|
+
*/
|
|
26
|
+
private log;
|
|
27
|
+
/**
|
|
28
|
+
* @en Calculates the delay before the next retry using Exponential Backoff and Jitter.
|
|
29
|
+
* @ru Вычисляет задержку перед следующим повтором, используя экспоненциальный рост и Jitter (джиттер).
|
|
30
|
+
*/
|
|
31
|
+
private calcDelay;
|
|
32
|
+
/** @en Simple async sleep helper. */
|
|
33
|
+
private sleep;
|
|
34
|
+
/**
|
|
35
|
+
* @en Parses the 'Retry-After' header (can be seconds or a Date string).
|
|
36
|
+
* @ru Парсит заголовок 'Retry-After' (может быть в секундах или в формате даты).
|
|
37
|
+
*/
|
|
38
|
+
private parseRetryAfterMs;
|
|
39
|
+
/**
|
|
40
|
+
* @en Executes an HTTP request with full retry and redirect lifecycle management.
|
|
41
|
+
* @ru Выполняет HTTP-запрос с полным циклом управления повторами и редиректами.
|
|
42
|
+
* @param method - HTTP method
|
|
43
|
+
* @param url - Destination URL
|
|
44
|
+
* @param headers - Request headers
|
|
45
|
+
* @param body - Request payload
|
|
46
|
+
* @param metrics - Performance metrics object to update
|
|
47
|
+
* @param signal - External AbortSignal for user cancellation
|
|
48
|
+
* @param redirects - Internal redirect counter
|
|
49
|
+
* @param attempt - Internal retry attempt counter
|
|
50
|
+
*/
|
|
51
|
+
execute(method: string, url: string, headers: Record<string, string>, body: string | Buffer | undefined, metrics?: RequestMetrics, signal?: AbortSignal, redirects?: number, attempt?: number): Promise<{
|
|
52
|
+
status: number;
|
|
53
|
+
headers: Record<string, any>;
|
|
54
|
+
body: any;
|
|
55
|
+
url: string;
|
|
56
|
+
}>;
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=RequestExecutor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestExecutor.d.ts","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RequestExecutor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,KAAK,EAAE,MAAM,QAAQ,CAAC;AACxC,OAAO,EAGL,YAAY,EACZ,QAAQ,EACR,cAAc,EACf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,kBAAkB,EAAE,MAAM,sBAAsB,CAAC;AAE1D;;;;GAIG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,KAAK;IACb,OAAO,CAAC,YAAY;IACpB,OAAO,CAAC,OAAO;gBAFP,KAAK,EAAE,KAAK,EACZ,YAAY,EAAE,kBAAkB,EAChC,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;IACH,OAAO,CAAC,GAAG;IAMX;;;OAGG;IACH,OAAO,CAAC,SAAS;IAOjB,qCAAqC;IACrC,OAAO,CAAC,KAAK;IAIb;;;OAGG;IACH,OAAO,CAAC,iBAAiB;IAWzB;;;;;;;;;;;OAWG;IACG,OAAO,CACX,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,OAAO,CAAC,EAAE,cAAc,EACxB,MAAM,CAAC,EAAE,WAAW,EACpB,SAAS,SAAI,EACb,OAAO,SAAI,GACV,OAAO,CAAC;QACT,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,GAAG,CAAC;QACV,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;CAsJH"}
|
|
@@ -0,0 +1,160 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RequestExecutor = void 0;
|
|
4
|
+
const undici_1 = require("undici");
|
|
5
|
+
const Types_1 = require("../../Types");
|
|
6
|
+
/**
|
|
7
|
+
* @class RequestExecutor
|
|
8
|
+
* @en The core engine responsible for low-level HTTP execution, retries, and redirect logic.
|
|
9
|
+
* @ru Основной движок, отвечающий за низкоуровневое выполнение HTTP-запросов, повторы и логику редиректов.
|
|
10
|
+
*/
|
|
11
|
+
class RequestExecutor {
|
|
12
|
+
agent;
|
|
13
|
+
interceptors;
|
|
14
|
+
options;
|
|
15
|
+
constructor(agent, interceptors, options) {
|
|
16
|
+
this.agent = agent;
|
|
17
|
+
this.interceptors = interceptors;
|
|
18
|
+
this.options = options;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* @en Internal logger wrapper.
|
|
22
|
+
* @ru Внутренняя обертка для логирования.
|
|
23
|
+
*/
|
|
24
|
+
log(level, msg, meta) {
|
|
25
|
+
if (this.options.verbose && this.options.logger) {
|
|
26
|
+
this.options.logger(level, msg, meta);
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* @en Calculates the delay before the next retry using Exponential Backoff and Jitter.
|
|
31
|
+
* @ru Вычисляет задержку перед следующим повтором, используя экспоненциальный рост и Jitter (джиттер).
|
|
32
|
+
*/
|
|
33
|
+
calcDelay(attempt) {
|
|
34
|
+
const { baseDelay, maxDelay, jitter } = this.options.retryOptions;
|
|
35
|
+
const base = Math.min(baseDelay * Math.pow(2, attempt), maxDelay);
|
|
36
|
+
// Jitter помогает избежать "эффекта стада", распределяя запросы во времени
|
|
37
|
+
return jitter ? base * (0.75 + Math.random() * 0.5) : base;
|
|
38
|
+
}
|
|
39
|
+
/** @en Simple async sleep helper. */
|
|
40
|
+
sleep(ms) {
|
|
41
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* @en Parses the 'Retry-After' header (can be seconds or a Date string).
|
|
45
|
+
* @ru Парсит заголовок 'Retry-After' (может быть в секундах или в формате даты).
|
|
46
|
+
*/
|
|
47
|
+
parseRetryAfterMs(header) {
|
|
48
|
+
if (!header)
|
|
49
|
+
return undefined;
|
|
50
|
+
const raw = Array.isArray(header) ? header[0] : String(header);
|
|
51
|
+
const asSeconds = Number(raw);
|
|
52
|
+
if (Number.isFinite(asSeconds))
|
|
53
|
+
return Math.max(0, Math.floor(asSeconds * 1000));
|
|
54
|
+
const asDate = Date.parse(raw);
|
|
55
|
+
if (!Number.isNaN(asDate))
|
|
56
|
+
return Math.max(0, asDate - Date.now());
|
|
57
|
+
return undefined;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* @en Executes an HTTP request with full retry and redirect lifecycle management.
|
|
61
|
+
* @ru Выполняет HTTP-запрос с полным циклом управления повторами и редиректами.
|
|
62
|
+
* @param method - HTTP method
|
|
63
|
+
* @param url - Destination URL
|
|
64
|
+
* @param headers - Request headers
|
|
65
|
+
* @param body - Request payload
|
|
66
|
+
* @param metrics - Performance metrics object to update
|
|
67
|
+
* @param signal - External AbortSignal for user cancellation
|
|
68
|
+
* @param redirects - Internal redirect counter
|
|
69
|
+
* @param attempt - Internal retry attempt counter
|
|
70
|
+
*/
|
|
71
|
+
async execute(method, url, headers, body, metrics, signal, redirects = 0, attempt = 0) {
|
|
72
|
+
const timeoutController = new AbortController();
|
|
73
|
+
const timer = setTimeout(() => timeoutController.abort(), this.options.timeout);
|
|
74
|
+
const abortHandler = () => timeoutController.abort();
|
|
75
|
+
if (signal) {
|
|
76
|
+
if (signal.aborted) {
|
|
77
|
+
clearTimeout(timer);
|
|
78
|
+
throw new Types_1.HttpClientError("Request aborted by user", "ABORTED", 0, undefined, url, method);
|
|
79
|
+
}
|
|
80
|
+
signal.addEventListener("abort", abortHandler);
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const config = await this.interceptors.applyRequest({
|
|
84
|
+
url,
|
|
85
|
+
method,
|
|
86
|
+
headers,
|
|
87
|
+
body,
|
|
88
|
+
});
|
|
89
|
+
const res = await (0, undici_1.request)(config.url, {
|
|
90
|
+
method: config.method,
|
|
91
|
+
headers: config.headers,
|
|
92
|
+
body: config.body,
|
|
93
|
+
dispatcher: this.agent,
|
|
94
|
+
signal: timeoutController.signal,
|
|
95
|
+
});
|
|
96
|
+
clearTimeout(timer);
|
|
97
|
+
if (this.options.followRedirects &&
|
|
98
|
+
[301, 302, 303, 307, 308].includes(res.statusCode)) {
|
|
99
|
+
if (redirects >= this.options.maxRedirects) {
|
|
100
|
+
throw new Types_1.HttpClientError("Too many redirects", "TOO_MANY_REDIRECTS", res.statusCode);
|
|
101
|
+
}
|
|
102
|
+
const location = res.headers.location;
|
|
103
|
+
if (location) {
|
|
104
|
+
const nextUrl = new URL(location, config.url).toString();
|
|
105
|
+
const nextMethod = res.statusCode === 303 ? "GET" : method;
|
|
106
|
+
const nextHeaders = { ...headers };
|
|
107
|
+
if (nextMethod === "GET") {
|
|
108
|
+
delete nextHeaders["content-type"];
|
|
109
|
+
delete nextHeaders["content-length"];
|
|
110
|
+
}
|
|
111
|
+
return this.execute(nextMethod, nextUrl, nextHeaders, nextMethod === "GET" ? undefined : body, metrics, signal, redirects + 1);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
if (this.options.retryOptions.retryStatusCodes.includes(res.statusCode)) {
|
|
115
|
+
if (attempt < this.options.maxRetries) {
|
|
116
|
+
if (metrics) {
|
|
117
|
+
metrics.retries += 1;
|
|
118
|
+
}
|
|
119
|
+
let delay = this.calcDelay(attempt);
|
|
120
|
+
if (res.statusCode === 429) {
|
|
121
|
+
const retryAfter = this.parseRetryAfterMs(res.headers["retry-after"]);
|
|
122
|
+
if (retryAfter !== undefined)
|
|
123
|
+
delay = retryAfter;
|
|
124
|
+
}
|
|
125
|
+
await this.sleep(delay);
|
|
126
|
+
return this.execute(method, url, headers, body, metrics, signal, redirects, attempt + 1);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
return await this.interceptors.applyResponse({
|
|
130
|
+
status: res.statusCode,
|
|
131
|
+
headers: res.headers,
|
|
132
|
+
body: res.body,
|
|
133
|
+
url: config.url,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
catch (err) {
|
|
137
|
+
clearTimeout(timer);
|
|
138
|
+
if (err.name === "AbortError") {
|
|
139
|
+
if (signal?.aborted)
|
|
140
|
+
throw new Types_1.HttpClientError("Request aborted by user", "ABORTED", 0, err, url, method);
|
|
141
|
+
throw new Types_1.TimeoutError(url, this.options.timeout);
|
|
142
|
+
}
|
|
143
|
+
if (attempt < this.options.maxRetries &&
|
|
144
|
+
(err.code === "ECONNREFUSED" || err.code === "ETIMEDOUT")) {
|
|
145
|
+
if (metrics) {
|
|
146
|
+
metrics.retries += 1;
|
|
147
|
+
}
|
|
148
|
+
await this.sleep(this.calcDelay(attempt));
|
|
149
|
+
return this.execute(method, url, headers, body, metrics, signal, redirects, attempt + 1);
|
|
150
|
+
}
|
|
151
|
+
throw err;
|
|
152
|
+
}
|
|
153
|
+
finally {
|
|
154
|
+
if (signal)
|
|
155
|
+
signal.removeEventListener("abort", abortHandler);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
exports.RequestExecutor = RequestExecutor;
|
|
160
|
+
//# sourceMappingURL=RequestExecutor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RequestExecutor.js","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RequestExecutor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { ResponseType, LogLevel } from "../../Types";
|
|
2
|
+
/**
|
|
3
|
+
* @class ResponseTransformer
|
|
4
|
+
* @en Handles stream reading, decompression (Gzip/Brotli), and parsing (JSON/XML/Text).
|
|
5
|
+
* @ru Обрабатывает чтение стримов, декомпрессию (Gzip/Brotli) и парсинг (JSON/XML/Text).
|
|
6
|
+
*/
|
|
7
|
+
export declare class ResponseTransformer {
|
|
8
|
+
private maxResponseBytes;
|
|
9
|
+
private logger?;
|
|
10
|
+
private xmlParser;
|
|
11
|
+
constructor(maxResponseBytes?: number, logger?: ((level: LogLevel, message: string, meta?: any) => void) | undefined);
|
|
12
|
+
/**
|
|
13
|
+
* @en Reads the response stream into a Buffer while respecting the byte limit.
|
|
14
|
+
* @ru Читает поток ответа в Buffer с соблюдением лимита байтов.
|
|
15
|
+
* @throws {HttpClientError} If response size exceeds maxResponseBytes.
|
|
16
|
+
*/
|
|
17
|
+
readBodyWithLimit(body: any): Promise<Buffer>;
|
|
18
|
+
/**
|
|
19
|
+
* @en Decompresses the buffer based on the Content-Encoding header.
|
|
20
|
+
* @ru Декомпрессия данных (gzip, deflate, br) на основе заголовка Content-Encoding.
|
|
21
|
+
*/
|
|
22
|
+
decompress(buf: Buffer, enc?: string, charset?: BufferEncoding): Promise<string>;
|
|
23
|
+
/**
|
|
24
|
+
* @en Parses the decompressed text content into the requested format.
|
|
25
|
+
* @ru Основной метод парсинга ответа в указанный формат.
|
|
26
|
+
* @param res - Object containing status, headers and raw body buffer.
|
|
27
|
+
* @param responseType - Targeted format (json, xml, text, buffer, auto).
|
|
28
|
+
*/
|
|
29
|
+
parseResponse(res: {
|
|
30
|
+
status: number;
|
|
31
|
+
headers: Record<string, any>;
|
|
32
|
+
body: Buffer;
|
|
33
|
+
}, responseType?: ResponseType): Promise<any>;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=ResponseTransformer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseTransformer.d.ts","sourceRoot":"","sources":["../../../src/Hyperttp/Core/ResponseTransformer.ts"],"names":[],"mappings":"AAIA,OAAO,EAAmB,YAAY,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAMtE;;;;GAIG;AACH,qBAAa,mBAAmB;IAI5B,OAAO,CAAC,gBAAgB;IACxB,OAAO,CAAC,MAAM,CAAC;IAJjB,OAAO,CAAC,SAAS,CAAY;gBAGnB,gBAAgB,GAAE,MAAoB,EACtC,MAAM,CAAC,GAAE,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,GAAG,KAAK,IAAI,aAAA;IAQzE;;;;OAIG;IACG,iBAAiB,CAAC,IAAI,EAAE,GAAG,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBnD;;;OAGG;IACG,UAAU,CACd,GAAG,EAAE,MAAM,EACX,GAAG,CAAC,EAAE,MAAM,EACZ,OAAO,GAAE,cAAwB,GAChC,OAAO,CAAC,MAAM,CAAC;IAoBlB;;;;;OAKG;IACG,aAAa,CACjB,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EACnE,YAAY,GAAE,YAAqB,GAClC,OAAO,CAAC,GAAG,CAAC;CAkEhB"}
|