@hyperttp/core 1.3.1 → 1.4.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.
- package/Core/HyperCore.d.ts +135 -77
- package/Core/HyperCore.d.ts.map +1 -1
- package/Core/HyperCore.js +280 -246
- package/Core/HyperCore.js.map +1 -1
- package/README.md +169 -96
- package/package.json +14 -8
- package/transports/browser.d.ts +228 -0
- package/transports/browser.d.ts.map +1 -0
- package/transports/browser.js +451 -0
- package/transports/browser.js.map +1 -0
- package/transports/manager.d.ts +9 -85
- package/transports/manager.d.ts.map +1 -1
- package/transports/manager.js +152 -222
- package/transports/manager.js.map +1 -1
- package/transports/node.d.ts +4 -36
- package/transports/node.d.ts.map +1 -1
- package/transports/node.js +119 -159
- package/transports/node.js.map +1 -1
- package/utils/decompress.d.ts +16 -20
- package/utils/decompress.d.ts.map +1 -1
- package/utils/decompress.js +151 -60
- package/utils/decompress.js.map +1 -1
- package/utils/errors.d.ts +0 -10
- package/utils/errors.d.ts.map +1 -1
- package/utils/errors.js +1 -11
- package/utils/errors.js.map +1 -1
- package/utils/merge.d.ts +0 -3
- package/utils/merge.d.ts.map +1 -1
- package/utils/merge.js +12 -22
- package/utils/merge.js.map +1 -1
- package/utils/normalize.d.ts +40 -21
- package/utils/normalize.d.ts.map +1 -1
- package/utils/normalize.js +217 -138
- package/utils/normalize.js.map +1 -1
- package/utils/pipeline.d.ts +10 -30
- package/utils/pipeline.d.ts.map +1 -1
- package/utils/pipeline.js +44 -44
- package/utils/pipeline.js.map +1 -1
- package/utils/response.d.ts +105 -23
- package/utils/response.d.ts.map +1 -1
- package/utils/response.js +308 -38
- package/utils/response.js.map +1 -1
- package/utils/retryUtils.d.ts +2 -10
- package/utils/retryUtils.d.ts.map +1 -1
- package/utils/retryUtils.js +17 -21
- package/utils/retryUtils.js.map +1 -1
package/utils/response.js
CHANGED
|
@@ -1,7 +1,84 @@
|
|
|
1
|
+
import { CURRENT_RUNTIME } from "../transports/manager.js";
|
|
1
2
|
/**
|
|
2
|
-
* @ru
|
|
3
|
-
*
|
|
4
|
-
* @
|
|
3
|
+
* @ru Унифицирует ReadableStream во всех средах (Node.js, Bun, Deno, Browser),
|
|
4
|
+
* добавляя методы парсинга (text, json, blob и т.д.) через оптимизированный Response API.
|
|
5
|
+
* @en Unifies ReadableStream across all environments (Node.js, Bun, Deno, Browser)
|
|
6
|
+
* by adding parsing methods (text, json, blob, etc.) via the optimized Response API.
|
|
7
|
+
*/
|
|
8
|
+
const patchReadableStream = () => {
|
|
9
|
+
if (typeof ReadableStream === "undefined")
|
|
10
|
+
return;
|
|
11
|
+
const proto = ReadableStream.prototype;
|
|
12
|
+
const methods = {
|
|
13
|
+
dump: async function () {
|
|
14
|
+
return this.cancel().catch(() => { });
|
|
15
|
+
},
|
|
16
|
+
arrayBuffer: async function () {
|
|
17
|
+
return new Response(this).arrayBuffer();
|
|
18
|
+
},
|
|
19
|
+
text: async function () {
|
|
20
|
+
return new Response(this).text();
|
|
21
|
+
},
|
|
22
|
+
json: async function () {
|
|
23
|
+
return new Response(this).json();
|
|
24
|
+
},
|
|
25
|
+
blob: async function () {
|
|
26
|
+
return new Response(this).blob();
|
|
27
|
+
},
|
|
28
|
+
bytes: async function () {
|
|
29
|
+
const buf = await new Response(this).arrayBuffer();
|
|
30
|
+
return new Uint8Array(buf);
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
for (const [name, fn] of Object.entries(methods)) {
|
|
34
|
+
if (typeof proto[name] !== "function") {
|
|
35
|
+
Object.defineProperty(proto, name, {
|
|
36
|
+
value: fn,
|
|
37
|
+
writable: true,
|
|
38
|
+
configurable: true,
|
|
39
|
+
enumerable: true,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
patchReadableStream();
|
|
45
|
+
/**
|
|
46
|
+
* @ru Символы для скрытого кэширования распарсенных данных тела ответа.
|
|
47
|
+
* Использование Symbol предотвращает коллизии имен и сохраняет мономорфизм в V8.
|
|
48
|
+
* @en Symbols for hidden caching of parsed response body data.
|
|
49
|
+
* Using Symbol prevents name collisions and preserves monomorphism in V8.
|
|
50
|
+
*/
|
|
51
|
+
const TEXT_CACHE = Symbol("hyperttp.textCache");
|
|
52
|
+
const JSON_CACHE = Symbol("hyperttp.jsonCache");
|
|
53
|
+
const ARRAY_BUFFER_CACHE = Symbol("hyperttp.arrayBufferCache");
|
|
54
|
+
const STATIC_DECODER = new TextDecoder();
|
|
55
|
+
const EMPTY_HEADERS = {};
|
|
56
|
+
/**
|
|
57
|
+
* @ru Быстрая проверка, является ли значение ReadableStream.
|
|
58
|
+
* @en Fast check to determine if a value is a ReadableStream.
|
|
59
|
+
* @param value - The value to check.
|
|
60
|
+
* @returns True if the value is a ReadableStream.
|
|
61
|
+
*/
|
|
62
|
+
function isReadableStream(value) {
|
|
63
|
+
return (typeof value === "object" && value !== null && typeof value.getReader === "function");
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* @ru Быстрая проверка, является ли значение Blob.
|
|
67
|
+
* @en Fast check to determine if a value is a Blob.
|
|
68
|
+
* @param value - The value to check.
|
|
69
|
+
* @returns True if the value is a Blob.
|
|
70
|
+
*/
|
|
71
|
+
function isBlob(value) {
|
|
72
|
+
return typeof Blob !== "undefined" && value instanceof Blob;
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* @ru Высокопроизводительное глубокое клонирование тела ответа.
|
|
76
|
+
* Избегает накладных расходов structuredClone для стримов и буферов, возвращая ссылки.
|
|
77
|
+
* @en High-performance deep cloning of the response body.
|
|
78
|
+
* Avoids structuredClone overhead for streams and buffers by returning references.
|
|
79
|
+
* @template T - The type of the body.
|
|
80
|
+
* @param body - The body to clone.
|
|
81
|
+
* @returns The cloned body.
|
|
5
82
|
*/
|
|
6
83
|
export const cloneBodyFast = (body) => {
|
|
7
84
|
if (typeof body !== "object" || body === null)
|
|
@@ -25,38 +102,230 @@ export const cloneBodyFast = (body) => {
|
|
|
25
102
|
}
|
|
26
103
|
};
|
|
27
104
|
/**
|
|
28
|
-
* @ru
|
|
29
|
-
*
|
|
105
|
+
* @ru Высокопроизводительный контейнер HTTP-ответа с ленивым парсингом и кэшированием.
|
|
106
|
+
* Гарантирует идентичный API чтения тела ответа во всех рантаймах.
|
|
107
|
+
* @en High-performance HTTP response container with lazy parsing and caching.
|
|
108
|
+
* Guarantees identical response body reading API across all runtimes.
|
|
109
|
+
* @template T - Expected type of the parsed response body.
|
|
30
110
|
*/
|
|
31
|
-
export
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
111
|
+
export class HyperHttpResponse {
|
|
112
|
+
status;
|
|
113
|
+
headers;
|
|
114
|
+
body;
|
|
115
|
+
url;
|
|
116
|
+
data = null;
|
|
117
|
+
[TEXT_CACHE] = undefined;
|
|
118
|
+
[JSON_CACHE] = undefined;
|
|
119
|
+
[ARRAY_BUFFER_CACHE] = undefined;
|
|
120
|
+
_bodyConsumed = false;
|
|
121
|
+
/**
|
|
122
|
+
* @ru Создаёт экземпляр ответа из сырых данных транспорта.
|
|
123
|
+
* @en Creates a response instance from raw transport data.
|
|
124
|
+
* @param rawResponse - The raw response from the transport layer.
|
|
125
|
+
*/
|
|
126
|
+
constructor(rawResponse) {
|
|
127
|
+
this.status = rawResponse.status;
|
|
128
|
+
this.headers = rawResponse.headers || EMPTY_HEADERS;
|
|
129
|
+
this.body = rawResponse.body;
|
|
130
|
+
this.url = rawResponse.url ?? "";
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* @ru Лениво вычитывает и кэширует тело ответа в виде ArrayBuffer и текста.
|
|
134
|
+
* @en Lazily consumes and caches the response body as ArrayBuffer and text.
|
|
135
|
+
*/
|
|
136
|
+
async _consumeBody() {
|
|
137
|
+
if (this._bodyConsumed)
|
|
138
|
+
return;
|
|
139
|
+
this._bodyConsumed = true;
|
|
140
|
+
const body = this.body;
|
|
141
|
+
if (!body)
|
|
142
|
+
return;
|
|
143
|
+
if (typeof body === "string") {
|
|
144
|
+
this[TEXT_CACHE] = body;
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (body instanceof Uint8Array) {
|
|
148
|
+
this[ARRAY_BUFFER_CACHE] =
|
|
149
|
+
body.buffer.byteLength === body.byteLength
|
|
150
|
+
? body.buffer
|
|
151
|
+
: body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength);
|
|
152
|
+
this[TEXT_CACHE] = STATIC_DECODER.decode(body);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (body instanceof ArrayBuffer) {
|
|
156
|
+
this[ARRAY_BUFFER_CACHE] = body;
|
|
157
|
+
this[TEXT_CACHE] = STATIC_DECODER.decode(body);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
if (CURRENT_RUNTIME === "bun" && typeof body.arrayBuffer === "function") {
|
|
161
|
+
const buf = await body.arrayBuffer();
|
|
162
|
+
this[ARRAY_BUFFER_CACHE] = buf;
|
|
163
|
+
this[TEXT_CACHE] = STATIC_DECODER.decode(buf);
|
|
164
|
+
}
|
|
165
|
+
else if (isReadableStream(body) || isBlob(body)) {
|
|
166
|
+
if (isReadableStream(body) && body.locked) {
|
|
167
|
+
throw new Error("[Hyperttp] Stream is locked.");
|
|
168
|
+
}
|
|
169
|
+
const response = new Response(body);
|
|
170
|
+
const buf = await response.arrayBuffer();
|
|
171
|
+
this[ARRAY_BUFFER_CACHE] = buf;
|
|
172
|
+
this[TEXT_CACHE] = STATIC_DECODER.decode(buf);
|
|
173
|
+
}
|
|
174
|
+
if (this[ARRAY_BUFFER_CACHE]) {
|
|
175
|
+
this.body = new Uint8Array(this[ARRAY_BUFFER_CACHE]);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* @ru Возвращает тело ответа как ArrayBuffer. Результат кэшируется.
|
|
180
|
+
* @en Returns the response body as an ArrayBuffer. Result is cached.
|
|
181
|
+
* @returns Promise resolving to the ArrayBuffer or SharedArrayBuffer.
|
|
182
|
+
*/
|
|
183
|
+
async arrayBuffer() {
|
|
184
|
+
if (this[ARRAY_BUFFER_CACHE] !== undefined)
|
|
185
|
+
return this[ARRAY_BUFFER_CACHE];
|
|
186
|
+
const body = this.body;
|
|
187
|
+
if (body instanceof Uint8Array) {
|
|
188
|
+
return (this[ARRAY_BUFFER_CACHE] =
|
|
189
|
+
body.buffer.byteLength === body.byteLength
|
|
190
|
+
? body.buffer
|
|
191
|
+
: body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength));
|
|
192
|
+
}
|
|
193
|
+
if (body instanceof ArrayBuffer) {
|
|
194
|
+
return (this[ARRAY_BUFFER_CACHE] = body);
|
|
195
|
+
}
|
|
196
|
+
if (CURRENT_RUNTIME === "bun" && typeof body.arrayBuffer === "function") {
|
|
197
|
+
return (this[ARRAY_BUFFER_CACHE] = await body.arrayBuffer());
|
|
198
|
+
}
|
|
199
|
+
if (isBlob(body)) {
|
|
200
|
+
return (this[ARRAY_BUFFER_CACHE] = await body.arrayBuffer());
|
|
201
|
+
}
|
|
202
|
+
await this._consumeBody();
|
|
203
|
+
return this[ARRAY_BUFFER_CACHE];
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* @ru Возвращает тело ответа как текст. Результат кэшируется.
|
|
207
|
+
* @en Returns the response body as text. Result is cached.
|
|
208
|
+
* @returns Promise resolving to the text string.
|
|
209
|
+
*/
|
|
210
|
+
async text() {
|
|
211
|
+
if (this[TEXT_CACHE] !== undefined)
|
|
212
|
+
return this[TEXT_CACHE];
|
|
213
|
+
const body = this.body;
|
|
214
|
+
if (typeof body === "string") {
|
|
215
|
+
this._bodyConsumed = true;
|
|
216
|
+
return (this[TEXT_CACHE] = body);
|
|
217
|
+
}
|
|
218
|
+
if (body instanceof Uint8Array) {
|
|
219
|
+
this._bodyConsumed = true;
|
|
220
|
+
return (this[TEXT_CACHE] = STATIC_DECODER.decode(body));
|
|
221
|
+
}
|
|
222
|
+
if (body instanceof ArrayBuffer) {
|
|
223
|
+
this._bodyConsumed = true;
|
|
224
|
+
return (this[TEXT_CACHE] = STATIC_DECODER.decode(body));
|
|
225
|
+
}
|
|
226
|
+
if (CURRENT_RUNTIME === "bun" && typeof body.text === "function") {
|
|
227
|
+
this._bodyConsumed = true;
|
|
228
|
+
return (this[TEXT_CACHE] = await body.text());
|
|
229
|
+
}
|
|
230
|
+
if (isBlob(body)) {
|
|
231
|
+
this._bodyConsumed = true;
|
|
232
|
+
return (this[TEXT_CACHE] = await body.text());
|
|
233
|
+
}
|
|
234
|
+
await this._consumeBody();
|
|
235
|
+
return this[TEXT_CACHE];
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* @ru Парсит тело ответа как JSON. Результат кэшируется.
|
|
239
|
+
* @en Parses the response body as JSON. Result is cached.
|
|
240
|
+
* @template TJson - Expected type of the parsed JSON.
|
|
241
|
+
* @returns Promise resolving to the parsed JSON object.
|
|
242
|
+
*/
|
|
243
|
+
async json() {
|
|
244
|
+
if (this[JSON_CACHE] !== undefined)
|
|
245
|
+
return this[JSON_CACHE];
|
|
246
|
+
if (this[TEXT_CACHE] !== undefined) {
|
|
247
|
+
return (this[JSON_CACHE] = JSON.parse(this[TEXT_CACHE]));
|
|
248
|
+
}
|
|
249
|
+
const body = this.body;
|
|
250
|
+
if (typeof body === "object" &&
|
|
251
|
+
body !== null &&
|
|
252
|
+
!isReadableStream(body) &&
|
|
253
|
+
!isBlob(body) &&
|
|
254
|
+
!(body instanceof Uint8Array) &&
|
|
255
|
+
!(body instanceof ArrayBuffer)) {
|
|
256
|
+
return (this[JSON_CACHE] = body);
|
|
257
|
+
}
|
|
258
|
+
if (CURRENT_RUNTIME === "bun" && typeof body.json === "function") {
|
|
259
|
+
return (this[JSON_CACHE] = await body.json());
|
|
260
|
+
}
|
|
261
|
+
const str = await this.text();
|
|
262
|
+
return (this[JSON_CACHE] = JSON.parse(str));
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* @ru Отбрасывает тело ответа для освобождения ресурсов (сокета).
|
|
266
|
+
* @en Discards the response body to free up resources (socket).
|
|
267
|
+
* @returns Promise that resolves when the body is drained.
|
|
268
|
+
*/
|
|
269
|
+
async dump() {
|
|
270
|
+
if (this._bodyConsumed)
|
|
271
|
+
return;
|
|
272
|
+
this._bodyConsumed = true;
|
|
273
|
+
const body = this.body;
|
|
274
|
+
if (isReadableStream(body)) {
|
|
275
|
+
if (!body.locked)
|
|
276
|
+
await body.cancel().catch(() => { });
|
|
277
|
+
}
|
|
278
|
+
else if (isBlob(body)) {
|
|
279
|
+
await body.arrayBuffer();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* @ru Создаёт глубокую изолированную копию ответа.
|
|
284
|
+
* Для стримов использует tee() для безопасного раздвоения потока.
|
|
285
|
+
* @en Creates a deep isolated copy of the response.
|
|
286
|
+
* Uses tee() for streams to safely duplicate the flow.
|
|
287
|
+
* @returns A new HttpResponse instance with cloned data.
|
|
288
|
+
*/
|
|
289
|
+
clone() {
|
|
290
|
+
const cloned = Object.create(HyperHttpResponse.prototype);
|
|
291
|
+
cloned.status = this.status;
|
|
292
|
+
cloned.headers = this.headers;
|
|
293
|
+
cloned.url = this.url;
|
|
294
|
+
cloned.data = this.data ? cloneBodyFast(this.data) : null;
|
|
295
|
+
cloned._bodyConsumed = this._bodyConsumed;
|
|
296
|
+
cloned[TEXT_CACHE] = this[TEXT_CACHE];
|
|
297
|
+
cloned[JSON_CACHE] = this[JSON_CACHE];
|
|
298
|
+
cloned[ARRAY_BUFFER_CACHE] = this[ARRAY_BUFFER_CACHE];
|
|
299
|
+
if (isReadableStream(this.body) && !this._bodyConsumed) {
|
|
300
|
+
if (this.body.locked) {
|
|
301
|
+
cloned.body = this.body;
|
|
302
|
+
}
|
|
303
|
+
else {
|
|
304
|
+
const [b1, b2] = this.body.tee();
|
|
305
|
+
this.body = b1;
|
|
306
|
+
cloned.body = b2;
|
|
307
|
+
}
|
|
308
|
+
}
|
|
309
|
+
else {
|
|
310
|
+
cloned.body = this.body;
|
|
311
|
+
}
|
|
312
|
+
return cloned;
|
|
313
|
+
}
|
|
42
314
|
}
|
|
43
315
|
/**
|
|
44
|
-
* @ru
|
|
45
|
-
* @en Fast
|
|
46
|
-
* @param rawResponse -
|
|
316
|
+
* @ru Быстрое создание экземпляра HyperHttpResponse из сырого ответа транспорта.
|
|
317
|
+
* @en Fast creation of a HyperHttpResponse instance from a raw transport response.
|
|
318
|
+
* @param rawResponse - The raw transport response.
|
|
319
|
+
* @returns A new HyperHttpResponse instance.
|
|
47
320
|
*/
|
|
48
|
-
export const mapResponseFast = (rawResponse) =>
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
body: rawResponse.body,
|
|
52
|
-
url: rawResponse.url ?? "",
|
|
53
|
-
clone: responseCloneHandler,
|
|
54
|
-
data: null,
|
|
55
|
-
});
|
|
321
|
+
export const mapResponseFast = (rawResponse) => {
|
|
322
|
+
return new HyperHttpResponse(rawResponse);
|
|
323
|
+
};
|
|
56
324
|
/**
|
|
57
|
-
* @ru
|
|
58
|
-
* @en Fast
|
|
59
|
-
* @param rawResponse -
|
|
325
|
+
* @ru Быстрое создание объекта StreamResponse без overhead-а классов.
|
|
326
|
+
* @en Fast creation of a StreamResponse object without class overhead.
|
|
327
|
+
* @param rawResponse - The raw transport response.
|
|
328
|
+
* @returns A lightweight StreamResponse object.
|
|
60
329
|
*/
|
|
61
330
|
export const mapStreamFast = (rawResponse) => ({
|
|
62
331
|
status: rawResponse.status,
|
|
@@ -65,18 +334,19 @@ export const mapStreamFast = (rawResponse) => ({
|
|
|
65
334
|
url: rawResponse.url ?? "",
|
|
66
335
|
});
|
|
67
336
|
/**
|
|
68
|
-
* @ru
|
|
69
|
-
*
|
|
70
|
-
* @
|
|
71
|
-
*
|
|
337
|
+
* @ru Оптимизированное слияние заголовков.
|
|
338
|
+
* Использует ранний возврат при первой итерации цикла, что быстрее, чем Object.keys().length > 0.
|
|
339
|
+
* @en Optimized headers merging.
|
|
340
|
+
* Uses early return on the first loop iteration, which is faster than Object.keys().length > 0.
|
|
341
|
+
* @param base - Base headers object.
|
|
342
|
+
* @param override - Headers to override or add.
|
|
343
|
+
* @returns Merged headers object.
|
|
72
344
|
*/
|
|
73
345
|
export const mergeHeadersFast = (base, override) => {
|
|
74
346
|
if (!override)
|
|
75
347
|
return base;
|
|
76
|
-
for (const
|
|
77
|
-
|
|
78
|
-
return { ...base, ...override };
|
|
79
|
-
}
|
|
348
|
+
for (const _key in override) {
|
|
349
|
+
return { ...base, ...override };
|
|
80
350
|
}
|
|
81
351
|
return base;
|
|
82
352
|
};
|
package/utils/response.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"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"}
|
package/utils/retryUtils.d.ts
CHANGED
|
@@ -2,24 +2,16 @@ import type { RetryOptions } from "@hyperttp/types";
|
|
|
2
2
|
/**
|
|
3
3
|
* @ru Вычисляет задержку перед повторной попыткой с экспоненциальной задержкой и возможным джиттером.
|
|
4
4
|
* @en Calculates the delay before a retry using exponential backoff and optional jitter.
|
|
5
|
-
* @param attempt - Attempt number (starting from 0).
|
|
6
|
-
* @param retryOptions - Options controlling retry behavior (baseDelay, maxDelay, jitter).
|
|
7
|
-
* @returns Delay in milliseconds.
|
|
8
5
|
*/
|
|
9
6
|
export declare function calcDelay(attempt: number, retryOptions: RetryOptions): number;
|
|
10
7
|
/**
|
|
11
8
|
* @ru Пытается освободить ресурсы тела ответа, не дожидаясь полного потребления. Поддерживает методы dump, resume, destroy.
|
|
12
9
|
* @en Attempts to release response body resources without fully consuming it. Supports dump, resume, destroy methods.
|
|
13
|
-
* @param body - Response body (ReadableStream, Node.js Stream, or similar).
|
|
14
|
-
* @returns Promise that resolves after resource disposal is complete.
|
|
15
10
|
*/
|
|
16
11
|
export declare function drainBody(body: unknown): Promise<void>;
|
|
17
12
|
/**
|
|
18
|
-
* @ru Определяет, следует ли выполнить повторную попытку для данного кода статуса на основе настроек.
|
|
19
|
-
* @en Determines whether to retry for the given status code based on retry options.
|
|
20
|
-
* @param status - HTTP status code.
|
|
21
|
-
* @param retryOptions - Options controlling retry behavior, may include retryStatusCodes.
|
|
22
|
-
* @returns True if the request should be retried.
|
|
13
|
+
* @ru Определяет, следует ли выполнить повторную попытку для данного кода статуса на основе настроек.
|
|
14
|
+
* @en Determines whether to retry for the given status code based on retry options.
|
|
23
15
|
*/
|
|
24
16
|
export declare function shouldRetry(status: number, retryOptions: RetryOptions): boolean;
|
|
25
17
|
//# sourceMappingURL=retryUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retryUtils.d.ts","sourceRoot":"","sources":["../../src/utils/retryUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQpD
|
|
1
|
+
{"version":3,"file":"retryUtils.d.ts","sourceRoot":"","sources":["../../src/utils/retryUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQpD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,CAO7E;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAqB5D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAM/E"}
|
package/utils/retryUtils.js
CHANGED
|
@@ -1,25 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* @ru Коды статуса HTTP, по которым повторные попытки выполняются по
|
|
3
|
-
* @en Default HTTP status codes that trigger retries when no explicit codes are provided
|
|
2
|
+
* @ru Коды статуса HTTP, по которым повторные попытки выполняются по умолчанию.
|
|
3
|
+
* @en Default HTTP status codes that trigger retries when no explicit codes are provided.
|
|
4
4
|
*/
|
|
5
|
-
const DEFAULT_RETRY_STATUS_CODES = [502, 503, 504];
|
|
5
|
+
const DEFAULT_RETRY_STATUS_CODES = new Set([502, 503, 504]);
|
|
6
6
|
/**
|
|
7
7
|
* @ru Вычисляет задержку перед повторной попыткой с экспоненциальной задержкой и возможным джиттером.
|
|
8
8
|
* @en Calculates the delay before a retry using exponential backoff and optional jitter.
|
|
9
|
-
* @param attempt - Attempt number (starting from 0).
|
|
10
|
-
* @param retryOptions - Options controlling retry behavior (baseDelay, maxDelay, jitter).
|
|
11
|
-
* @returns Delay in milliseconds.
|
|
12
9
|
*/
|
|
13
10
|
export function calcDelay(attempt, retryOptions) {
|
|
14
11
|
const { baseDelay = 1000, maxDelay = 10000, jitter = true } = retryOptions;
|
|
15
|
-
const
|
|
16
|
-
|
|
12
|
+
const safeAttempt = Math.min(attempt, 31);
|
|
13
|
+
const base = Math.min(baseDelay * Math.pow(2, safeAttempt), maxDelay);
|
|
14
|
+
if (!jitter)
|
|
15
|
+
return base;
|
|
16
|
+
const jittered = base * (0.75 + Math.random() * 0.5);
|
|
17
|
+
return Math.min(Math.max(0, jittered), maxDelay);
|
|
17
18
|
}
|
|
18
19
|
/**
|
|
19
20
|
* @ru Пытается освободить ресурсы тела ответа, не дожидаясь полного потребления. Поддерживает методы dump, resume, destroy.
|
|
20
21
|
* @en Attempts to release response body resources without fully consuming it. Supports dump, resume, destroy methods.
|
|
21
|
-
* @param body - Response body (ReadableStream, Node.js Stream, or similar).
|
|
22
|
-
* @returns Promise that resolves after resource disposal is complete.
|
|
23
22
|
*/
|
|
24
23
|
export async function drainBody(body) {
|
|
25
24
|
if (!body || typeof body !== "object")
|
|
@@ -30,12 +29,12 @@ export async function drainBody(body) {
|
|
|
30
29
|
await stream.dump();
|
|
31
30
|
return;
|
|
32
31
|
}
|
|
33
|
-
if (typeof stream.resume === "function") {
|
|
34
|
-
stream.resume();
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
32
|
if (typeof stream.destroy === "function") {
|
|
38
33
|
stream.destroy();
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
if (typeof stream.resume === "function") {
|
|
37
|
+
stream.resume();
|
|
39
38
|
}
|
|
40
39
|
}
|
|
41
40
|
catch {
|
|
@@ -43,17 +42,14 @@ export async function drainBody(body) {
|
|
|
43
42
|
}
|
|
44
43
|
}
|
|
45
44
|
/**
|
|
46
|
-
* @ru Определяет, следует ли выполнить повторную попытку для данного кода статуса на основе настроек.
|
|
47
|
-
* @en Determines whether to retry for the given status code based on retry options.
|
|
48
|
-
* @param status - HTTP status code.
|
|
49
|
-
* @param retryOptions - Options controlling retry behavior, may include retryStatusCodes.
|
|
50
|
-
* @returns True if the request should be retried.
|
|
45
|
+
* @ru Определяет, следует ли выполнить повторную попытку для данного кода статуса на основе настроек.
|
|
46
|
+
* @en Determines whether to retry for the given status code based on retry options.
|
|
51
47
|
*/
|
|
52
48
|
export function shouldRetry(status, retryOptions) {
|
|
53
49
|
const codes = retryOptions.retryStatusCodes;
|
|
54
|
-
if (codes && codes.length > 0) {
|
|
50
|
+
if (codes !== undefined && codes.length > 0) {
|
|
55
51
|
return codes.includes(status);
|
|
56
52
|
}
|
|
57
|
-
return DEFAULT_RETRY_STATUS_CODES.
|
|
53
|
+
return DEFAULT_RETRY_STATUS_CODES.has(status);
|
|
58
54
|
}
|
|
59
55
|
//# sourceMappingURL=retryUtils.js.map
|
package/utils/retryUtils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"retryUtils.js","sourceRoot":"","sources":["../../src/utils/retryUtils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,0BAA0B,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"retryUtils.js","sourceRoot":"","sources":["../../src/utils/retryUtils.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAS,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AAEpE;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAC,OAAe,EAAE,YAA0B;IACnE,MAAM,EAAE,SAAS,GAAG,IAAI,EAAE,QAAQ,GAAG,KAAK,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,YAAY,CAAC;IAC3E,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,WAAW,CAAC,EAAE,QAAQ,CAAC,CAAC;IACtE,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;IACrD,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAa;IAC3C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO;IAC9C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAA+B,CAAC;QAE/C,IAAI,OAAO,MAAM,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACtC,MAAO,MAAM,CAAC,IAA4B,EAAE,CAAC;YAC7C,OAAO;QACT,CAAC;QAED,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,UAAU,EAAE,CAAC;YACxC,MAAM,CAAC,OAAsB,EAAE,CAAC;YACjC,OAAO;QACT,CAAC;QAED,IAAI,OAAO,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;YACvC,MAAM,CAAC,MAAqB,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,EAAE;IACJ,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,YAA0B;IACpE,MAAM,KAAK,GAAG,YAAY,CAAC,gBAAgB,CAAC;IAC5C,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,0BAA0B,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAChD,CAAC"}
|