hyperttp 0.2.2 → 0.2.4
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 +26 -2
- package/dist/Hyperttp/Core/CacheManager.d.ts.map +1 -1
- package/dist/Hyperttp/Core/CacheManager.js +30 -13
- package/dist/Hyperttp/Core/CacheManager.js.map +1 -1
- package/dist/Hyperttp/Core/HttpClientImproved.d.ts +68 -98
- package/dist/Hyperttp/Core/HttpClientImproved.d.ts.map +1 -1
- package/dist/Hyperttp/Core/HttpClientImproved.js +311 -631
- 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 +50 -2
- package/dist/Hyperttp/Core/MetricsManager.d.ts.map +1 -1
- package/dist/Hyperttp/Core/MetricsManager.js +48 -4
- package/dist/Hyperttp/Core/MetricsManager.js.map +1 -1
- 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 -54
- package/dist/Hyperttp/Core/QueueManager.js.map +1 -1
- package/dist/Hyperttp/Core/RateLimiter.d.ts +50 -0
- package/dist/Hyperttp/Core/RateLimiter.d.ts.map +1 -1
- package/dist/Hyperttp/Core/RateLimiter.js +39 -1
- package/dist/Hyperttp/Core/RateLimiter.js.map +1 -1
- package/dist/Hyperttp/Core/RequestBuilder.d.ts +44 -73
- package/dist/Hyperttp/Core/RequestBuilder.d.ts.map +1 -1
- package/dist/Hyperttp/Core/RequestBuilder.js +71 -106
- 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 +3 -0
- package/dist/Hyperttp/Core/index.d.ts.map +1 -1
- package/dist/Hyperttp/Core/index.js +7 -1
- package/dist/Hyperttp/Core/index.js.map +1 -1
- package/dist/Hyperttp/Request.d.ts +9 -20
- package/dist/Hyperttp/Request.d.ts.map +1 -1
- package/dist/Hyperttp/Request.js +93 -85
- package/dist/Hyperttp/Request.js.map +1 -1
- package/dist/Types/index.d.ts +1 -0
- package/dist/Types/index.d.ts.map +1 -1
- package/dist/Types/request.d.ts +2 -3
- package/dist/Types/request.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -1,7 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @interface RateLimiterConfig
|
|
3
|
+
* @en Configuration for the token bucket rate limiter.
|
|
4
|
+
* @ru Конфигурация для ограничителя частоты запросов (алгоритм Token Bucket).
|
|
5
|
+
*/
|
|
1
6
|
export interface RateLimiterConfig {
|
|
7
|
+
/** * @en Maximum number of requests allowed within the window.
|
|
8
|
+
* @ru Максимальное количество запросов, разрешенных в пределах окна.
|
|
9
|
+
* @default 100
|
|
10
|
+
*/
|
|
2
11
|
maxRequests?: number;
|
|
12
|
+
/** * @en Time window in milliseconds.
|
|
13
|
+
* @ru Временное окно в миллисекундах.
|
|
14
|
+
* @default 60000 (1 minute)
|
|
15
|
+
*/
|
|
3
16
|
windowMs?: number;
|
|
4
17
|
}
|
|
18
|
+
/**
|
|
19
|
+
* @class RateLimiter
|
|
20
|
+
* @en Smooth rate limiting using the Token Bucket algorithm.
|
|
21
|
+
* Allows for short bursts while maintaining a steady long-term rate.
|
|
22
|
+
* @ru Плавное ограничение частоты запросов с использованием алгоритма Token Bucket.
|
|
23
|
+
* Позволяет кратковременные всплески, сохраняя стабильную скорость в долгосрочной перспективе.
|
|
24
|
+
*/
|
|
5
25
|
export declare class RateLimiter {
|
|
6
26
|
private tokens;
|
|
7
27
|
private lastRefill;
|
|
@@ -9,12 +29,42 @@ export declare class RateLimiter {
|
|
|
9
29
|
private readonly window;
|
|
10
30
|
private readonly refillRate;
|
|
11
31
|
constructor(config?: RateLimiterConfig);
|
|
32
|
+
/**
|
|
33
|
+
* @en Waits until enough tokens are available and consumes them.
|
|
34
|
+
* @ru Ожидает появления достаточного количества токенов и потребляет их.
|
|
35
|
+
* @param tokensNeeded - Number of tokens to consume (default: 1)
|
|
36
|
+
*/
|
|
12
37
|
wait(tokensNeeded?: number): Promise<void>;
|
|
38
|
+
/**
|
|
39
|
+
* @en Attempts to consume tokens immediately.
|
|
40
|
+
* @ru Пытается немедленно потребить токены.
|
|
41
|
+
* @returns true if tokens were consumed, false otherwise (limit exceeded).
|
|
42
|
+
*/
|
|
13
43
|
tryConsume(tokensNeeded?: number): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* @en Internal method to refill the bucket based on elapsed time.
|
|
46
|
+
* @ru Внутренний метод для пополнения корзины на основе прошедшего времени.
|
|
47
|
+
*/
|
|
14
48
|
private refill;
|
|
49
|
+
/**
|
|
50
|
+
* @en Returns the number of currently "used" slots.
|
|
51
|
+
* @ru Возвращает количество текущих "занятых" слотов.
|
|
52
|
+
*/
|
|
15
53
|
get currentCount(): number;
|
|
54
|
+
/**
|
|
55
|
+
* @en Returns how many requests can be made right now.
|
|
56
|
+
* @ru Возвращает количество запросов, которые можно выполнить прямо сейчас.
|
|
57
|
+
*/
|
|
16
58
|
get remainingRequests(): number;
|
|
59
|
+
/**
|
|
60
|
+
* @en Estimated time in ms until the next token is available.
|
|
61
|
+
* @ru Ожидаемое время в мс до появления следующего токена.
|
|
62
|
+
*/
|
|
17
63
|
get timeToReset(): number;
|
|
64
|
+
/**
|
|
65
|
+
* @en Instantly refills the bucket to its maximum capacity.
|
|
66
|
+
* @ru Мгновенно пополняет корзину до максимальной емкости.
|
|
67
|
+
*/
|
|
18
68
|
reset(): void;
|
|
19
69
|
}
|
|
20
70
|
//# sourceMappingURL=RateLimiter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RateLimiter.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,CAAC,EAAE,iBAAiB;
|
|
1
|
+
{"version":3,"file":"RateLimiter.d.ts","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RateLimiter.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,WAAW,iBAAiB;IAChC;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,MAAM,CAAC,EAAE,iBAAiB;IAQtC;;;;OAIG;IACG,IAAI,CAAC,YAAY,SAAI,GAAG,OAAO,CAAC,IAAI,CAAC;IAoB3C;;;;OAIG;IACH,UAAU,CAAC,YAAY,SAAI,GAAG,OAAO;IAUrC;;;OAGG;IACH,OAAO,CAAC,MAAM;IASd;;;OAGG;IACH,IAAI,YAAY,IAAI,MAAM,CAGzB;IAED;;;OAGG;IACH,IAAI,iBAAiB,IAAI,MAAM,CAG9B;IAED;;;OAGG;IACH,IAAI,WAAW,IAAI,MAAM,CAMxB;IAED;;;OAGG;IACH,KAAK,IAAI,IAAI;CAId"}
|
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.RateLimiter = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* @class RateLimiter
|
|
6
|
+
* @en Smooth rate limiting using the Token Bucket algorithm.
|
|
7
|
+
* Allows for short bursts while maintaining a steady long-term rate.
|
|
8
|
+
* @ru Плавное ограничение частоты запросов с использованием алгоритма Token Bucket.
|
|
9
|
+
* Позволяет кратковременные всплески, сохраняя стабильную скорость в долгосрочной перспективе.
|
|
10
|
+
*/
|
|
4
11
|
class RateLimiter {
|
|
5
12
|
tokens;
|
|
6
13
|
lastRefill;
|
|
@@ -14,6 +21,11 @@ class RateLimiter {
|
|
|
14
21
|
this.tokens = this.max;
|
|
15
22
|
this.lastRefill = Date.now();
|
|
16
23
|
}
|
|
24
|
+
/**
|
|
25
|
+
* @en Waits until enough tokens are available and consumes them.
|
|
26
|
+
* @ru Ожидает появления достаточного количества токенов и потребляет их.
|
|
27
|
+
* @param tokensNeeded - Number of tokens to consume (default: 1)
|
|
28
|
+
*/
|
|
17
29
|
async wait(tokensNeeded = 1) {
|
|
18
30
|
this.refill();
|
|
19
31
|
tokensNeeded = Math.max(1, tokensNeeded);
|
|
@@ -23,11 +35,17 @@ class RateLimiter {
|
|
|
23
35
|
}
|
|
24
36
|
const deficit = tokensNeeded - this.tokens;
|
|
25
37
|
const waitTimeMs = Math.ceil(deficit / this.refillRate);
|
|
38
|
+
// Приостанавливаем выполнение на расчетное время
|
|
26
39
|
await new Promise((resolve) => setTimeout(resolve, waitTimeMs));
|
|
27
40
|
this.refill();
|
|
28
41
|
this.tokens -= tokensNeeded;
|
|
29
42
|
this.tokens = Math.max(0, this.tokens);
|
|
30
43
|
}
|
|
44
|
+
/**
|
|
45
|
+
* @en Attempts to consume tokens immediately.
|
|
46
|
+
* @ru Пытается немедленно потребить токены.
|
|
47
|
+
* @returns true if tokens were consumed, false otherwise (limit exceeded).
|
|
48
|
+
*/
|
|
31
49
|
tryConsume(tokensNeeded = 1) {
|
|
32
50
|
this.refill();
|
|
33
51
|
tokensNeeded = Math.max(1, tokensNeeded);
|
|
@@ -37,6 +55,10 @@ class RateLimiter {
|
|
|
37
55
|
}
|
|
38
56
|
return false;
|
|
39
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* @en Internal method to refill the bucket based on elapsed time.
|
|
60
|
+
* @ru Внутренний метод для пополнения корзины на основе прошедшего времени.
|
|
61
|
+
*/
|
|
40
62
|
refill() {
|
|
41
63
|
const now = Date.now();
|
|
42
64
|
const elapsedMs = now - this.lastRefill;
|
|
@@ -44,21 +66,37 @@ class RateLimiter {
|
|
|
44
66
|
this.tokens = Math.min(this.max, this.tokens + newTokens);
|
|
45
67
|
this.lastRefill = now;
|
|
46
68
|
}
|
|
69
|
+
/**
|
|
70
|
+
* @en Returns the number of currently "used" slots.
|
|
71
|
+
* @ru Возвращает количество текущих "занятых" слотов.
|
|
72
|
+
*/
|
|
47
73
|
get currentCount() {
|
|
48
74
|
this.refill();
|
|
49
75
|
return Math.floor(this.max - this.tokens);
|
|
50
76
|
}
|
|
77
|
+
/**
|
|
78
|
+
* @en Returns how many requests can be made right now.
|
|
79
|
+
* @ru Возвращает количество запросов, которые можно выполнить прямо сейчас.
|
|
80
|
+
*/
|
|
51
81
|
get remainingRequests() {
|
|
52
82
|
this.refill();
|
|
53
83
|
return Math.floor(this.tokens);
|
|
54
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* @en Estimated time in ms until the next token is available.
|
|
87
|
+
* @ru Ожидаемое время в мс до появления следующего токена.
|
|
88
|
+
*/
|
|
55
89
|
get timeToReset() {
|
|
56
90
|
this.refill();
|
|
57
91
|
if (this.tokens >= 1)
|
|
58
92
|
return 0;
|
|
59
93
|
const deficitToOne = 1 - this.tokens;
|
|
60
|
-
return Math.ceil(deficitToOne / this.refillRate);
|
|
94
|
+
return Math.max(0, Math.ceil(deficitToOne / this.refillRate));
|
|
61
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* @en Instantly refills the bucket to its maximum capacity.
|
|
98
|
+
* @ru Мгновенно пополняет корзину до максимальной емкости.
|
|
99
|
+
*/
|
|
62
100
|
reset() {
|
|
63
101
|
this.tokens = this.max;
|
|
64
102
|
this.lastRefill = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RateLimiter.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"RateLimiter.js","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RateLimiter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
import { StreamResponse } from "../../Types";
|
|
2
1
|
import HttpClientImproved from "./HttpClientImproved";
|
|
3
2
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
* @example
|
|
3
|
+
* @class RequestBuilder
|
|
4
|
+
* @en Fluent request builder for creating HTTP requests with a chainable API.
|
|
5
|
+
* @ru Fluent request builder для создания HTTP-запросов. Позволяет собирать параметры запроса в цепочку.
|
|
6
|
+
* * @example
|
|
8
7
|
* ```ts
|
|
9
|
-
* const
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* .send();
|
|
8
|
+
* const user = await client.request('[https://api.example.com/users](https://api.example.com/users)')
|
|
9
|
+
* .post()
|
|
10
|
+
* .jsonBody({ name: 'John' })
|
|
11
|
+
* .headers({ 'X-Custom-Header': 'value' })
|
|
12
|
+
* .send();
|
|
15
13
|
* ```
|
|
16
14
|
*/
|
|
17
15
|
export declare class RequestBuilder<T = any> {
|
|
@@ -20,91 +18,64 @@ export declare class RequestBuilder<T = any> {
|
|
|
20
18
|
private _headers;
|
|
21
19
|
private _body?;
|
|
22
20
|
private _responseType;
|
|
23
|
-
private _client
|
|
21
|
+
private _client;
|
|
24
22
|
private _signal?;
|
|
23
|
+
constructor(url: string, client: HttpClientImproved);
|
|
25
24
|
/**
|
|
26
|
-
*
|
|
27
|
-
* @
|
|
28
|
-
*/
|
|
29
|
-
constructor(url: string, client?: HttpClientImproved);
|
|
30
|
-
/**
|
|
31
|
-
* Sets HTTP headers for the request.
|
|
32
|
-
* @param headers - Object containing header key-value pairs
|
|
33
|
-
* @returns The builder instance for chaining
|
|
25
|
+
* @en Appends multiple headers to the request.
|
|
26
|
+
* @ru Добавляет несколько заголовков к запросу.
|
|
34
27
|
*/
|
|
35
28
|
headers(headers: Record<string, string>): this;
|
|
36
29
|
/**
|
|
37
|
-
* Sets the request body
|
|
38
|
-
* @
|
|
39
|
-
* @returns The builder instance for chaining
|
|
30
|
+
* @en Sets the request body.
|
|
31
|
+
* @ru Устанавливает тело запроса.
|
|
40
32
|
*/
|
|
41
33
|
body(bodyData: any): this;
|
|
42
34
|
/**
|
|
43
|
-
* Sets the
|
|
44
|
-
* @
|
|
35
|
+
* @en Sets the body and ensures Content-Type is application/json.
|
|
36
|
+
* @ru Устанавливает тело запроса и заголовок Content-Type: application/json.
|
|
45
37
|
*/
|
|
46
|
-
|
|
38
|
+
jsonBody<B>(body: B): this;
|
|
47
39
|
/**
|
|
48
|
-
*
|
|
49
|
-
* @
|
|
50
|
-
*/
|
|
51
|
-
text(): this;
|
|
52
|
-
/**
|
|
53
|
-
* Sets the response type to XML.
|
|
54
|
-
* @returns The builder instance for chaining
|
|
55
|
-
*/
|
|
56
|
-
xml(): this;
|
|
57
|
-
/**
|
|
58
|
-
* Sets the HTTP method to POST.
|
|
59
|
-
* @returns The builder instance for chaining
|
|
40
|
+
* @en Adds URL query parameters.
|
|
41
|
+
* @ru Добавляет параметры запроса в URL (search params).
|
|
60
42
|
*/
|
|
43
|
+
query(params: Record<string, string | number | boolean>): this;
|
|
44
|
+
/** @en Set method to POST */
|
|
61
45
|
post(): this;
|
|
62
|
-
/**
|
|
63
|
-
* @ru Выполняет запрос в режиме потока.
|
|
64
|
-
* @en Executes the request in streaming mode.
|
|
65
|
-
*/
|
|
66
|
-
stream(): Promise<StreamResponse>;
|
|
67
|
-
/**
|
|
68
|
-
* Sets the HTTP method to PUT.
|
|
69
|
-
* @returns The builder instance for chaining
|
|
70
|
-
*/
|
|
46
|
+
/** @en Set method to PUT */
|
|
71
47
|
put(): this;
|
|
72
|
-
/**
|
|
73
|
-
* Sets the HTTP method to PATCH.
|
|
74
|
-
* @returns The builder instance for chaining
|
|
75
|
-
*/
|
|
48
|
+
/** @en Set method to PATCH */
|
|
76
49
|
patch(): this;
|
|
77
|
-
/**
|
|
78
|
-
* Sets the HTTP method to DELETE.
|
|
79
|
-
* @returns The builder instance for chaining
|
|
80
|
-
*/
|
|
50
|
+
/** @en Set method to DELETE */
|
|
81
51
|
delete(): this;
|
|
52
|
+
/** @en Set method to HEAD */
|
|
53
|
+
head(): this;
|
|
54
|
+
/** @en Set response type to JSON */
|
|
55
|
+
json(): this;
|
|
56
|
+
/** @en Set response type to Plain Text */
|
|
57
|
+
text(): this;
|
|
58
|
+
/** @en Set response type to XML */
|
|
59
|
+
xml(): this;
|
|
60
|
+
/** @en Set response type to Buffer */
|
|
61
|
+
buffer(): this;
|
|
62
|
+
/** @en Set response type to Stream (AsyncIterable) */
|
|
63
|
+
stream(): this;
|
|
82
64
|
/**
|
|
83
|
-
*
|
|
84
|
-
* @
|
|
85
|
-
* @returns The builder instance for chaining
|
|
86
|
-
*/
|
|
87
|
-
query(params: Record<string, string | number | boolean>): this;
|
|
88
|
-
/**
|
|
89
|
-
* Sets a JSON body for the request.
|
|
90
|
-
* Automatically sets the Content-Type header to application/json.
|
|
91
|
-
* @param body - The JSON body data
|
|
92
|
-
* @returns The builder instance for chaining
|
|
93
|
-
*/
|
|
94
|
-
jsonBody<T>(body: T): this;
|
|
95
|
-
/**
|
|
96
|
-
* @ru Устанавливает AbortSignal для отмены запроса.
|
|
65
|
+
* @en Attaches an external AbortSignal for manual cancellation.
|
|
66
|
+
* @ru Привязывает внешний AbortSignal для ручной отмены запроса.
|
|
97
67
|
*/
|
|
98
68
|
signal(signal: AbortSignal): this;
|
|
99
69
|
/**
|
|
100
|
-
* @
|
|
70
|
+
* @en Creates a timeout signal for this specific request.
|
|
71
|
+
* @ru Устанавливает таймаут для конкретно этого запроса.
|
|
101
72
|
*/
|
|
102
73
|
timeout(ms: number): this;
|
|
103
74
|
/**
|
|
104
|
-
*
|
|
105
|
-
* @
|
|
75
|
+
* @en Finalizes and sends the request.
|
|
76
|
+
* @ru Финализирует и отправляет запрос.
|
|
77
|
+
* @returns Promise resolving to the expected type T or StreamResponse.
|
|
106
78
|
*/
|
|
107
79
|
send(): Promise<T>;
|
|
108
|
-
private ensureClient;
|
|
109
80
|
}
|
|
110
81
|
//# sourceMappingURL=RequestBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestBuilder.d.ts","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RequestBuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RequestBuilder.d.ts","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RequestBuilder.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,MAAM,sBAAsB,CAAC;AAEtD;;;;;;;;;;;;GAYG;AACH,qBAAa,cAAc,CAAC,CAAC,GAAG,GAAG;IACjC,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,OAAO,CAA+D;IAC9E,OAAO,CAAC,QAAQ,CAA8B;IAC9C,OAAO,CAAC,KAAK,CAAC,CAAM;IACpB,OAAO,CAAC,aAAa,CAAwB;IAC7C,OAAO,CAAC,OAAO,CAAqB;IACpC,OAAO,CAAC,OAAO,CAAC,CAAc;gBAElB,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,kBAAkB;IAKnD;;;OAGG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI;IAK9C;;;OAGG;IACH,IAAI,CAAC,QAAQ,EAAE,GAAG,GAAG,IAAI;IAKzB;;;OAGG;IACH,QAAQ,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,IAAI;IAM1B;;;OAGG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,IAAI;IAS9D,6BAA6B;IAC7B,IAAI,IAAI,IAAI;IAKZ,4BAA4B;IAC5B,GAAG,IAAI,IAAI;IAKX,8BAA8B;IAC9B,KAAK,IAAI,IAAI;IAKb,+BAA+B;IAC/B,MAAM,IAAI,IAAI;IAKd,6BAA6B;IAC7B,IAAI,IAAI,IAAI;IAKZ,oCAAoC;IACpC,IAAI,IAAI,IAAI;IAKZ,0CAA0C;IAC1C,IAAI,IAAI,IAAI;IAKZ,mCAAmC;IACnC,GAAG,IAAI,IAAI;IAKX,sCAAsC;IACtC,MAAM,IAAI,IAAI;IAKd,sDAAsD;IACtD,MAAM,IAAI,IAAI;IAKd;;;OAGG;IACH,MAAM,CAAC,MAAM,EAAE,WAAW,GAAG,IAAI;IAKjC;;;OAGG;IACH,OAAO,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAKzB;;;;OAIG;IACG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC;CA2BzB"}
|
|
@@ -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,146 +19,120 @@ class RequestBuilder {
|
|
|
25
19
|
_method = "GET";
|
|
26
20
|
_headers = {};
|
|
27
21
|
_body;
|
|
28
|
-
_responseType = "auto";
|
|
22
|
+
_responseType = "auto";
|
|
29
23
|
_client;
|
|
30
24
|
_signal;
|
|
31
|
-
/**
|
|
32
|
-
* Creates a new request builder for the specified URL.
|
|
33
|
-
* @param url - The target URL for the request
|
|
34
|
-
*/
|
|
35
25
|
constructor(url, client) {
|
|
36
26
|
this._url = url;
|
|
37
27
|
this._client = client;
|
|
38
28
|
}
|
|
39
29
|
/**
|
|
40
|
-
*
|
|
41
|
-
* @
|
|
42
|
-
* @returns The builder instance for chaining
|
|
30
|
+
* @en Appends multiple headers to the request.
|
|
31
|
+
* @ru Добавляет несколько заголовков к запросу.
|
|
43
32
|
*/
|
|
44
33
|
headers(headers) {
|
|
45
|
-
this._headers
|
|
34
|
+
Object.assign(this._headers, headers);
|
|
46
35
|
return this;
|
|
47
36
|
}
|
|
48
37
|
/**
|
|
49
|
-
* Sets the request body
|
|
50
|
-
* @
|
|
51
|
-
* @returns The builder instance for chaining
|
|
38
|
+
* @en Sets the request body.
|
|
39
|
+
* @ru Устанавливает тело запроса.
|
|
52
40
|
*/
|
|
53
41
|
body(bodyData) {
|
|
54
42
|
this._body = bodyData;
|
|
55
43
|
return this;
|
|
56
44
|
}
|
|
57
45
|
/**
|
|
58
|
-
* Sets the
|
|
59
|
-
* @
|
|
60
|
-
*/
|
|
61
|
-
json() {
|
|
62
|
-
this._responseType = "json";
|
|
63
|
-
return this;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Sets the response type to plain text.
|
|
67
|
-
* @returns The builder instance for chaining
|
|
46
|
+
* @en Sets the body and ensures Content-Type is application/json.
|
|
47
|
+
* @ru Устанавливает тело запроса и заголовок Content-Type: application/json.
|
|
68
48
|
*/
|
|
69
|
-
|
|
70
|
-
this.
|
|
49
|
+
jsonBody(body) {
|
|
50
|
+
this._body = body;
|
|
51
|
+
this._headers["Content-Type"] = "application/json; charset=utf-8";
|
|
71
52
|
return this;
|
|
72
53
|
}
|
|
73
54
|
/**
|
|
74
|
-
*
|
|
75
|
-
* @
|
|
55
|
+
* @en Adds URL query parameters.
|
|
56
|
+
* @ru Добавляет параметры запроса в URL (search params).
|
|
76
57
|
*/
|
|
77
|
-
|
|
78
|
-
|
|
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();
|
|
79
62
|
return this;
|
|
80
63
|
}
|
|
81
|
-
/**
|
|
82
|
-
* Sets the HTTP method to POST.
|
|
83
|
-
* @returns The builder instance for chaining
|
|
84
|
-
*/
|
|
64
|
+
/** @en Set method to POST */
|
|
85
65
|
post() {
|
|
86
66
|
this._method = "POST";
|
|
87
67
|
return this;
|
|
88
68
|
}
|
|
89
|
-
/**
|
|
90
|
-
* @ru Выполняет запрос в режиме потока.
|
|
91
|
-
* @en Executes the request in streaming mode.
|
|
92
|
-
*/
|
|
93
|
-
async stream() {
|
|
94
|
-
const client = this.ensureClient();
|
|
95
|
-
return client.stream({
|
|
96
|
-
getURL: () => this._url,
|
|
97
|
-
getHeaders: () => this._headers,
|
|
98
|
-
getBodyData: () => this._body,
|
|
99
|
-
getSignal: () => this._signal,
|
|
100
|
-
});
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Sets the HTTP method to PUT.
|
|
104
|
-
* @returns The builder instance for chaining
|
|
105
|
-
*/
|
|
69
|
+
/** @en Set method to PUT */
|
|
106
70
|
put() {
|
|
107
71
|
this._method = "PUT";
|
|
108
72
|
return this;
|
|
109
73
|
}
|
|
110
|
-
/**
|
|
111
|
-
* Sets the HTTP method to PATCH.
|
|
112
|
-
* @returns The builder instance for chaining
|
|
113
|
-
*/
|
|
74
|
+
/** @en Set method to PATCH */
|
|
114
75
|
patch() {
|
|
115
76
|
this._method = "PATCH";
|
|
116
77
|
return this;
|
|
117
78
|
}
|
|
118
|
-
/**
|
|
119
|
-
* Sets the HTTP method to DELETE.
|
|
120
|
-
* @returns The builder instance for chaining
|
|
121
|
-
*/
|
|
79
|
+
/** @en Set method to DELETE */
|
|
122
80
|
delete() {
|
|
123
81
|
this._method = "DELETE";
|
|
124
82
|
return this;
|
|
125
83
|
}
|
|
126
|
-
/**
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
* @returns The builder instance for chaining
|
|
130
|
-
*/
|
|
131
|
-
query(params) {
|
|
132
|
-
const urlObj = new URL(this._url);
|
|
133
|
-
Object.entries(params).forEach(([k, v]) => urlObj.searchParams.set(k, String(v)));
|
|
134
|
-
this._url = urlObj.toString();
|
|
84
|
+
/** @en Set method to HEAD */
|
|
85
|
+
head() {
|
|
86
|
+
this._method = "HEAD";
|
|
135
87
|
return this;
|
|
136
88
|
}
|
|
137
|
-
/**
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
this.
|
|
145
|
-
this
|
|
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";
|
|
146
112
|
return this;
|
|
147
113
|
}
|
|
148
114
|
/**
|
|
149
|
-
* @
|
|
115
|
+
* @en Attaches an external AbortSignal for manual cancellation.
|
|
116
|
+
* @ru Привязывает внешний AbortSignal для ручной отмены запроса.
|
|
150
117
|
*/
|
|
151
118
|
signal(signal) {
|
|
152
119
|
this._signal = signal;
|
|
153
120
|
return this;
|
|
154
121
|
}
|
|
155
122
|
/**
|
|
156
|
-
* @
|
|
123
|
+
* @en Creates a timeout signal for this specific request.
|
|
124
|
+
* @ru Устанавливает таймаут для конкретно этого запроса.
|
|
157
125
|
*/
|
|
158
126
|
timeout(ms) {
|
|
159
127
|
this._signal = AbortSignal.timeout(ms);
|
|
160
128
|
return this;
|
|
161
129
|
}
|
|
162
130
|
/**
|
|
163
|
-
*
|
|
164
|
-
* @
|
|
131
|
+
* @en Finalizes and sends the request.
|
|
132
|
+
* @ru Финализирует и отправляет запрос.
|
|
133
|
+
* @returns Promise resolving to the expected type T or StreamResponse.
|
|
165
134
|
*/
|
|
166
135
|
async send() {
|
|
167
|
-
const client = this.ensureClient();
|
|
168
136
|
const req = {
|
|
169
137
|
getURL: () => this._url,
|
|
170
138
|
getBodyData: () => this._body,
|
|
@@ -172,26 +140,23 @@ class RequestBuilder {
|
|
|
172
140
|
getSignal: () => this._signal,
|
|
173
141
|
};
|
|
174
142
|
if (this._responseType === "stream") {
|
|
175
|
-
return (await
|
|
143
|
+
return (await this._client.stream(req));
|
|
176
144
|
}
|
|
177
145
|
switch (this._method) {
|
|
178
146
|
case "POST":
|
|
179
|
-
return
|
|
147
|
+
return this._client.post(req, this._body, this._responseType);
|
|
180
148
|
case "PUT":
|
|
181
|
-
return
|
|
149
|
+
return this._client.put(req, this._body, this._responseType);
|
|
182
150
|
case "PATCH":
|
|
183
|
-
return
|
|
151
|
+
return this._client.patch(req, this._body, this._responseType);
|
|
184
152
|
case "DELETE":
|
|
185
|
-
return
|
|
153
|
+
return this._client.delete(req, this._responseType);
|
|
154
|
+
case "HEAD":
|
|
155
|
+
return (await this._client.head(req));
|
|
186
156
|
default:
|
|
187
|
-
return
|
|
157
|
+
return this._client.get(req, this._responseType);
|
|
188
158
|
}
|
|
189
159
|
}
|
|
190
|
-
ensureClient() {
|
|
191
|
-
return (this._client ??
|
|
192
|
-
defaultClient ??
|
|
193
|
-
(defaultClient = new HttpClientImproved_1.default()));
|
|
194
|
-
}
|
|
195
160
|
}
|
|
196
161
|
exports.RequestBuilder = RequestBuilder;
|
|
197
162
|
//# sourceMappingURL=RequestBuilder.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RequestBuilder.js","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RequestBuilder.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"RequestBuilder.js","sourceRoot":"","sources":["../../../src/Hyperttp/Core/RequestBuilder.ts"],"names":[],"mappings":"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"}
|