hyperttp 0.2.2 → 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 +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 +313 -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/package.json +2 -2
|
@@ -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":";;;AAGA;;;;;;;;;;;;GAYG;AACH,MAAa,cAAc;IACjB,IAAI,CAAS;IACb,OAAO,GAAyD,KAAK,CAAC;IACtE,QAAQ,GAA2B,EAAE,CAAC;IACtC,KAAK,CAAO;IACZ,aAAa,GAAiB,MAAM,CAAC;IACrC,OAAO,CAAqB;IAC5B,OAAO,CAAe;IAE9B,YAAY,GAAW,EAAE,MAA0B;QACjD,IAAI,CAAC,IAAI,GAAG,GAAG,CAAC;QAChB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,OAA+B;QACrC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,IAAI,CAAC,QAAa;QAChB,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,QAAQ,CAAI,IAAO;QACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,GAAG,iCAAiC,CAAC;QAClE,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,MAAiD;QACrD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CACxC,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CACtC,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6BAA6B;IAC7B,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,4BAA4B;IAC5B,GAAG;QACD,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;QACrB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,8BAA8B;IAC9B,KAAK;QACH,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,+BAA+B;IAC/B,MAAM;QACJ,IAAI,CAAC,OAAO,GAAG,QAAQ,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,6BAA6B;IAC7B,IAAI;QACF,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,oCAAoC;IACpC,IAAI;QACF,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,0CAA0C;IAC1C,IAAI;QACF,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,mCAAmC;IACnC,GAAG;QACD,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sCAAsC;IACtC,MAAM;QACJ,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED,sDAAsD;IACtD,MAAM;QACJ,IAAI,CAAC,aAAa,GAAG,QAAQ,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,MAAmB;QACxB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;OAGG;IACH,OAAO,CAAC,EAAU;QAChB,IAAI,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACvC,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAqB;YAC5B,MAAM,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI;YACvB,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK;YAC7B,UAAU,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,QAAQ;YAC/B,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,OAAO;SAC9B,CAAC;QAEF,IAAI,IAAI,CAAC,aAAa,KAAK,QAAQ,EAAE,CAAC;YACpC,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAQ,CAAC;QACjD,CAAC;QAED,QAAQ,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,KAAK,MAAM;gBACT,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAChE,KAAK,KAAK;gBACR,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YAC/D,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACjE,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;YACtD,KAAK,MAAM;gBACT,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAQ,CAAC;YAC/C;gBACE,OAAO,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;QACrD,CAAC;IACH,CAAC;CACF;AArKD,wCAqKC"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
36
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
37
|
+
};
|
|
38
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
39
|
+
exports.ResponseTransformer = void 0;
|
|
40
|
+
const zlib = __importStar(require("zlib"));
|
|
41
|
+
const util_1 = require("util");
|
|
42
|
+
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
43
|
+
const fast_xml_builder_1 = __importDefault(require("fast-xml-builder"));
|
|
44
|
+
const Types_1 = require("../../Types");
|
|
45
|
+
const gunzip = (0, util_1.promisify)(zlib.gunzip);
|
|
46
|
+
const inflate = (0, util_1.promisify)(zlib.inflate);
|
|
47
|
+
const brotliDecompress = (0, util_1.promisify)(zlib.brotliDecompress);
|
|
48
|
+
/**
|
|
49
|
+
* @class ResponseTransformer
|
|
50
|
+
* @en Handles stream reading, decompression (Gzip/Brotli), and parsing (JSON/XML/Text).
|
|
51
|
+
* @ru Обрабатывает чтение стримов, декомпрессию (Gzip/Brotli) и парсинг (JSON/XML/Text).
|
|
52
|
+
*/
|
|
53
|
+
class ResponseTransformer {
|
|
54
|
+
maxResponseBytes;
|
|
55
|
+
logger;
|
|
56
|
+
xmlParser;
|
|
57
|
+
constructor(maxResponseBytes = 1024 * 1024, logger) {
|
|
58
|
+
this.maxResponseBytes = maxResponseBytes;
|
|
59
|
+
this.logger = logger;
|
|
60
|
+
this.xmlParser = new fast_xml_parser_1.XMLParser({
|
|
61
|
+
ignoreAttributes: false,
|
|
62
|
+
allowBooleanAttributes: true,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @en Reads the response stream into a Buffer while respecting the byte limit.
|
|
67
|
+
* @ru Читает поток ответа в Buffer с соблюдением лимита байтов.
|
|
68
|
+
* @throws {HttpClientError} If response size exceeds maxResponseBytes.
|
|
69
|
+
*/
|
|
70
|
+
async readBodyWithLimit(body) {
|
|
71
|
+
const chunks = [];
|
|
72
|
+
let receivedBytes = 0;
|
|
73
|
+
for await (const chunk of body) {
|
|
74
|
+
receivedBytes += chunk.length;
|
|
75
|
+
if (this.maxResponseBytes > 0 && receivedBytes > this.maxResponseBytes) {
|
|
76
|
+
if (typeof body.destroy === "function")
|
|
77
|
+
body.destroy();
|
|
78
|
+
throw new Types_1.HttpClientError(`Response size limit exceeded (${this.maxResponseBytes} bytes)`, "HTTP_ERROR", 0);
|
|
79
|
+
}
|
|
80
|
+
chunks.push(Buffer.from(chunk));
|
|
81
|
+
}
|
|
82
|
+
return Buffer.concat(chunks);
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* @en Decompresses the buffer based on the Content-Encoding header.
|
|
86
|
+
* @ru Декомпрессия данных (gzip, deflate, br) на основе заголовка Content-Encoding.
|
|
87
|
+
*/
|
|
88
|
+
async decompress(buf, enc, charset = "utf-8") {
|
|
89
|
+
if (!enc || buf.length === 0)
|
|
90
|
+
return buf.toString(charset);
|
|
91
|
+
try {
|
|
92
|
+
switch (enc.toLowerCase()) {
|
|
93
|
+
case "gzip":
|
|
94
|
+
return (await gunzip(buf)).toString(charset);
|
|
95
|
+
case "deflate":
|
|
96
|
+
return (await inflate(buf)).toString(charset);
|
|
97
|
+
case "br":
|
|
98
|
+
return (await brotliDecompress(buf)).toString(charset);
|
|
99
|
+
default:
|
|
100
|
+
return buf.toString(charset);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
catch (error) {
|
|
104
|
+
this.logger?.("error", `Decompression failed for encoding ${enc}`, error);
|
|
105
|
+
return buf.toString(charset);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* @en Parses the decompressed text content into the requested format.
|
|
110
|
+
* @ru Основной метод парсинга ответа в указанный формат.
|
|
111
|
+
* @param res - Object containing status, headers and raw body buffer.
|
|
112
|
+
* @param responseType - Targeted format (json, xml, text, buffer, auto).
|
|
113
|
+
*/
|
|
114
|
+
async parseResponse(res, responseType = "auto") {
|
|
115
|
+
try {
|
|
116
|
+
const text = await this.decompress(res.body, res.headers["content-encoding"]);
|
|
117
|
+
const trimmed = text.trim();
|
|
118
|
+
switch (responseType) {
|
|
119
|
+
case "json": {
|
|
120
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
|
|
121
|
+
return JSON.parse(trimmed);
|
|
122
|
+
}
|
|
123
|
+
if (trimmed.startsWith("<")) {
|
|
124
|
+
return this.xmlParser.parse(trimmed);
|
|
125
|
+
}
|
|
126
|
+
return { data: trimmed };
|
|
127
|
+
}
|
|
128
|
+
case "xml": {
|
|
129
|
+
if (trimmed.startsWith("<"))
|
|
130
|
+
return trimmed;
|
|
131
|
+
try {
|
|
132
|
+
const obj = JSON.parse(trimmed);
|
|
133
|
+
const builder = new fast_xml_builder_1.default({
|
|
134
|
+
format: true,
|
|
135
|
+
indentBy: " ",
|
|
136
|
+
ignoreAttributes: false,
|
|
137
|
+
});
|
|
138
|
+
return builder.build(obj);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return text;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
case "text":
|
|
145
|
+
return text;
|
|
146
|
+
case "buffer":
|
|
147
|
+
return res.body;
|
|
148
|
+
case "auto":
|
|
149
|
+
default: {
|
|
150
|
+
const contentType = (res.headers["content-type"] || "").toLowerCase();
|
|
151
|
+
if (contentType.includes("json") ||
|
|
152
|
+
trimmed.startsWith("{") ||
|
|
153
|
+
trimmed.startsWith("[")) {
|
|
154
|
+
try {
|
|
155
|
+
return JSON.parse(trimmed);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
return text;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
return text;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
throw new Types_1.HttpClientError(`Parsing failed: ${err?.message ?? String(err)}`, "PARSING_ERROR", res.status);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
exports.ResponseTransformer = ResponseTransformer;
|
|
171
|
+
//# sourceMappingURL=ResponseTransformer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ResponseTransformer.js","sourceRoot":"","sources":["../../../src/Hyperttp/Core/ResponseTransformer.ts"],"names":[],"mappings":"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"}
|
|
@@ -18,6 +18,9 @@ export { QueueManager } from "./QueueManager.js";
|
|
|
18
18
|
export { CacheManager } from "./CacheManager.js";
|
|
19
19
|
export { RateLimiter } from "./RateLimiter.js";
|
|
20
20
|
export { MetricsManager } from "./MetricsManager.js";
|
|
21
|
+
export { InterceptorManager } from "./InterceptorManager.js";
|
|
22
|
+
export { RequestExecutor } from "./RequestExecutor.js";
|
|
23
|
+
export { ResponseTransformer } from "./ResponseTransformer.js";
|
|
21
24
|
export { HttpClientError, TimeoutError, RateLimitError, } from "../../Types/index.js";
|
|
22
25
|
export type { HttpClientInterface, HttpClientOptions, RequestInterface, RequestConfig, RequestBodyData, RequestHeaders, RequestQuery, ResponseType, StreamResponse, RequestMetrics, RequestInterceptor, ResponseInterceptor, RetryOptions, LogLevel, Method, } from "../../Types/index.js";
|
|
23
26
|
export type { CacheManagerOptions } from "./CacheManager.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Hyperttp/Core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/Hyperttp/Core/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,OAAO,IAAI,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAE/D,OAAO,EACL,eAAe,EACf,YAAY,EACZ,cAAc,GACf,MAAM,sBAAsB,CAAC;AAE9B,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,gBAAgB,EAChB,aAAa,EACb,eAAe,EACf,cAAc,EACd,YAAY,EACZ,YAAY,EACZ,cAAc,EACd,cAAc,EACd,kBAAkB,EAClB,mBAAmB,EACnB,YAAY,EACZ,QAAQ,EACR,MAAM,GACP,MAAM,sBAAsB,CAAC;AAG9B,YAAY,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,YAAY,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,YAAY,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.RateLimitError = exports.TimeoutError = exports.HttpClientError = exports.MetricsManager = exports.RateLimiter = exports.CacheManager = exports.QueueManager = exports.RequestBuilder = exports.HttpClientImproved = void 0;
|
|
6
|
+
exports.RateLimitError = exports.TimeoutError = exports.HttpClientError = exports.ResponseTransformer = exports.RequestExecutor = exports.InterceptorManager = exports.MetricsManager = exports.RateLimiter = exports.CacheManager = exports.QueueManager = exports.RequestBuilder = exports.HttpClientImproved = void 0;
|
|
7
7
|
/**
|
|
8
8
|
* HTTP Client Library
|
|
9
9
|
*
|
|
@@ -30,6 +30,12 @@ var RateLimiter_js_1 = require("./RateLimiter.js");
|
|
|
30
30
|
Object.defineProperty(exports, "RateLimiter", { enumerable: true, get: function () { return RateLimiter_js_1.RateLimiter; } });
|
|
31
31
|
var MetricsManager_js_1 = require("./MetricsManager.js");
|
|
32
32
|
Object.defineProperty(exports, "MetricsManager", { enumerable: true, get: function () { return MetricsManager_js_1.MetricsManager; } });
|
|
33
|
+
var InterceptorManager_js_1 = require("./InterceptorManager.js");
|
|
34
|
+
Object.defineProperty(exports, "InterceptorManager", { enumerable: true, get: function () { return InterceptorManager_js_1.InterceptorManager; } });
|
|
35
|
+
var RequestExecutor_js_1 = require("./RequestExecutor.js");
|
|
36
|
+
Object.defineProperty(exports, "RequestExecutor", { enumerable: true, get: function () { return RequestExecutor_js_1.RequestExecutor; } });
|
|
37
|
+
var ResponseTransformer_js_1 = require("./ResponseTransformer.js");
|
|
38
|
+
Object.defineProperty(exports, "ResponseTransformer", { enumerable: true, get: function () { return ResponseTransformer_js_1.ResponseTransformer; } });
|
|
33
39
|
var index_js_1 = require("../../Types/index.js");
|
|
34
40
|
Object.defineProperty(exports, "HttpClientError", { enumerable: true, get: function () { return index_js_1.HttpClientError; } });
|
|
35
41
|
Object.defineProperty(exports, "TimeoutError", { enumerable: true, get: function () { return index_js_1.TimeoutError; } });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Hyperttp/Core/index.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;;;;;;;;;GAaG;AACH,iEAAwE;AAA/D,4IAAA,OAAO,OAAsB;AACtC,yDAAqD;AAA5C,mHAAA,cAAc,OAAA;AACvB,qDAAiD;AAAxC,+GAAA,YAAY,OAAA;AACrB,qDAAiD;AAAxC,+GAAA,YAAY,OAAA;AACrB,mDAA+C;AAAtC,6GAAA,WAAW,OAAA;AACpB,yDAAqD;AAA5C,mHAAA,cAAc,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/Hyperttp/Core/index.ts"],"names":[],"mappings":";;;;;;AAAA;;;;;;;;;;;;;GAaG;AACH,iEAAwE;AAA/D,4IAAA,OAAO,OAAsB;AACtC,yDAAqD;AAA5C,mHAAA,cAAc,OAAA;AACvB,qDAAiD;AAAxC,+GAAA,YAAY,OAAA;AACrB,qDAAiD;AAAxC,+GAAA,YAAY,OAAA;AACrB,mDAA+C;AAAtC,6GAAA,WAAW,OAAA;AACpB,yDAAqD;AAA5C,mHAAA,cAAc,OAAA;AACvB,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA;AAC3B,2DAAuD;AAA9C,qHAAA,eAAe,OAAA;AACxB,mEAA+D;AAAtD,6HAAA,mBAAmB,OAAA;AAE5B,iDAI8B;AAH5B,2GAAA,eAAe,OAAA;AACf,wGAAA,YAAY,OAAA;AACZ,0GAAA,cAAc,OAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "hyperttp",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "A high-performance, universal HTTP client for Node.js with caching, retries, queueing, rate limiting, cookies and logging.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
"undici": "^8.1.0",
|
|
27
27
|
"tough-cookie": "^6.0.1",
|
|
28
28
|
"http-cookie-agent": "^7.0.3",
|
|
29
|
-
"fast-xml-parser": "^5.7.
|
|
29
|
+
"fast-xml-parser": "^5.7.2",
|
|
30
30
|
"lru-cache": "^11.3.5"
|
|
31
31
|
}
|
|
32
32
|
}
|