@hyperttp/core 1.4.7 → 1.5.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 +3 -15
- package/Core/HyperCore.d.ts.map +1 -1
- package/Core/HyperCore.js +2 -576
- package/Core/HyperCore.js.map +7 -1
- package/Core/RequestBuilder.d.ts +11 -0
- package/Core/RequestBuilder.d.ts.map +1 -0
- package/Core/RequestBuilder.js +2 -0
- package/Core/RequestBuilder.js.map +7 -0
- package/Core/index.js +2 -2
- package/Core/index.js.map +7 -1
- package/README.md +30 -0
- package/defaultConfig.d.ts.map +1 -1
- package/defaultConfig.js +2 -20
- package/defaultConfig.js.map +7 -1
- package/index.js +2 -3
- package/index.js.map +7 -1
- package/package.json +1 -1
- package/transports/browser.d.ts.map +1 -1
- package/transports/browser.js +2 -113
- package/transports/browser.js.map +7 -1
- package/transports/manager.d.ts +0 -33
- package/transports/manager.d.ts.map +1 -1
- package/transports/manager.js +7 -349
- package/transports/manager.js.map +7 -1
- package/transports/node.d.ts +1 -0
- package/transports/node.d.ts.map +1 -1
- package/transports/node.js +2 -380
- package/transports/node.js.map +7 -1
- package/utils/errors.d.ts +0 -11
- package/utils/errors.d.ts.map +1 -1
- package/utils/errors.js +2 -53
- package/utils/errors.js.map +7 -1
- package/utils/merge.js +2 -29
- package/utils/merge.js.map +7 -1
- package/utils/normalize.d.ts +12 -7
- package/utils/normalize.d.ts.map +1 -1
- package/utils/normalize.js +2 -285
- package/utils/normalize.js.map +7 -1
- package/utils/pipeline.js +2 -193
- package/utils/pipeline.js.map +7 -1
- package/utils/response.d.ts +0 -14
- package/utils/response.d.ts.map +1 -1
- package/utils/response.js +2 -389
- package/utils/response.js.map +7 -1
- package/utils/retryUtils.js +2 -55
- package/utils/retryUtils.js.map +7 -1
package/utils/response.d.ts
CHANGED
|
@@ -1,19 +1,5 @@
|
|
|
1
1
|
import type { HttpResponse, HyperTransport, HyperBody } from "@hyperttp/types";
|
|
2
2
|
type TransportResponse = Awaited<ReturnType<HyperTransport["execute"]>>;
|
|
3
|
-
/**
|
|
4
|
-
* @ru Декларация глобального расширения ReadableStream для типов потребителей библиотеки.
|
|
5
|
-
* @en Global declaration extending ReadableStream for library consumers' types.
|
|
6
|
-
*/
|
|
7
|
-
declare global {
|
|
8
|
-
interface ReadableStream {
|
|
9
|
-
dump?(): Promise<void>;
|
|
10
|
-
arrayBuffer?(): Promise<ArrayBuffer>;
|
|
11
|
-
text?(): Promise<string>;
|
|
12
|
-
json?(): Promise<unknown>;
|
|
13
|
-
blob?(): Promise<Blob>;
|
|
14
|
-
bytes?(): Promise<Uint8Array>;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
3
|
declare const TEXT_CACHE: unique symbol;
|
|
18
4
|
declare const JSON_CACHE: unique symbol;
|
|
19
5
|
declare const ARRAY_BUFFER_CACHE: unique symbol;
|
package/utils/response.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG/E,KAAK,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG/E,KAAK,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAuBxE,QAAA,MAAM,UAAU,eAA+B,CAAC;AAChD,QAAA,MAAM,UAAU,eAA+B,CAAC;AAChD,QAAA,MAAM,kBAAkB,eAAsC,CAAC;AAE/D,KAAK,WAAW,GAAG;IACjB,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC;IACvB,CAAC,kBAAkB,CAAC,CAAC,EAAE,WAAW,GAAG,iBAAiB,CAAC;CACxD,CAAC;AAmCF;;;;;;;;GAQG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,EAAE,MAAM,CAAC,KAAG,CA0B1C,CAAC;AAEF;;;;;;GAMG;AACH,qBAAa,iBAAiB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC,EAAE,WAAW;IAC1E,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAElD;;;OAGG;IACI,IAAI,EAAE,CAAC,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC;IAExC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,CAAC,GAAG,IAAI,CAAQ;IAEtB,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAa;IAC7C,CAAC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAa;IAC9C,CAAC,kBAAkB,CAAC,EAAE,WAAW,GAAG,iBAAiB,GAAG,SAAS,CAAa;IAErF,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,IAAI,CAAgC;IAE5C;;;;OAIG;gBACS,WAAW,EAAE,iBAAiB;IAQ1C;;;OAGG;YACW,YAAY;IA0D1B;;;;OAIG;IACU,WAAW,IAAI,OAAO,CAAC,WAAW,GAAG,iBAAiB,CAAC;IA6BpE;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC;IA+BpC;;;;;OAKG;IACU,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC;IA2B9C;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAYlC;;;;;;OAMG;IACI,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC;CA4BhC;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,GAAI,aAAa,iBAAiB,KAAG,YAAY,CAAC,OAAO,CAEpF,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,aAAa,iBAAiB;;;;;CAK1D,CAAC;AAEH;;;;;;;;GAQG;AACH,eAAO,MAAM,gBAAgB,GAC3B,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EACvC,WAAW,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,KAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAMlC,CAAC"}
|
package/utils/response.js
CHANGED
|
@@ -1,389 +1,2 @@
|
|
|
1
|
-
import
|
|
2
|
-
|
|
3
|
-
* @ru Флаг, предотвращающий повторный патчинг ReadableStream.
|
|
4
|
-
* @en Flag to prevent repeated ReadableStream patching.
|
|
5
|
-
*/
|
|
6
|
-
let streamPatched = false;
|
|
7
|
-
/**
|
|
8
|
-
* @ru Унифицирует ReadableStream во всех средах (Node.js, Bun, Deno, Browser),
|
|
9
|
-
* добавляя методы парсинга (text, json, blob и т.д.) через оптимизированный Response API.
|
|
10
|
-
* @en Unifies ReadableStream across all environments (Node.js, Bun, Deno, Browser)
|
|
11
|
-
* by adding parsing methods (text, json, blob, etc.) via the optimized Response API.
|
|
12
|
-
*/
|
|
13
|
-
const patchReadableStream = () => {
|
|
14
|
-
if (streamPatched || typeof ReadableStream === "undefined")
|
|
15
|
-
return;
|
|
16
|
-
streamPatched = true;
|
|
17
|
-
const proto = ReadableStream.prototype;
|
|
18
|
-
const methods = {
|
|
19
|
-
dump: async function () {
|
|
20
|
-
return this.cancel().catch(() => { });
|
|
21
|
-
},
|
|
22
|
-
arrayBuffer: async function () {
|
|
23
|
-
return new Response(this).arrayBuffer();
|
|
24
|
-
},
|
|
25
|
-
text: async function () {
|
|
26
|
-
return new Response(this).text();
|
|
27
|
-
},
|
|
28
|
-
json: async function () {
|
|
29
|
-
return new Response(this).json();
|
|
30
|
-
},
|
|
31
|
-
blob: async function () {
|
|
32
|
-
return new Response(this).blob();
|
|
33
|
-
},
|
|
34
|
-
bytes: async function () {
|
|
35
|
-
const buf = await new Response(this).arrayBuffer();
|
|
36
|
-
return new Uint8Array(buf);
|
|
37
|
-
},
|
|
38
|
-
};
|
|
39
|
-
for (const [name, fn] of Object.entries(methods)) {
|
|
40
|
-
if (typeof proto[name] !== "function") {
|
|
41
|
-
Object.defineProperty(proto, name, {
|
|
42
|
-
value: fn,
|
|
43
|
-
writable: true,
|
|
44
|
-
configurable: true,
|
|
45
|
-
enumerable: true,
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
};
|
|
50
|
-
patchReadableStream();
|
|
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
|
-
/**
|
|
56
|
-
* @ru Замороженный пустой объект заголовков для избежания лишних аллокаций.
|
|
57
|
-
* @en Frozen empty headers object to avoid redundant allocations.
|
|
58
|
-
*/
|
|
59
|
-
const EMPTY_HEADERS = Object.freeze({});
|
|
60
|
-
/**
|
|
61
|
-
* @ru Быстрая проверка, является ли значение ReadableStream.
|
|
62
|
-
* @en Fast check to determine if a value is a ReadableStream.
|
|
63
|
-
* @param value - The value to check.
|
|
64
|
-
* @returns True if the value is a ReadableStream.
|
|
65
|
-
*/
|
|
66
|
-
function isReadableStream(value) {
|
|
67
|
-
return (typeof value === "object" &&
|
|
68
|
-
value !== null &&
|
|
69
|
-
"getReader" in value &&
|
|
70
|
-
typeof value.getReader === "function");
|
|
71
|
-
}
|
|
72
|
-
/**
|
|
73
|
-
* @ru Быстрая проверка, является ли значение Blob.
|
|
74
|
-
* @en Fast check to determine if a value is a Blob.
|
|
75
|
-
* @param value - The value to check.
|
|
76
|
-
* @returns True if the value is a Blob.
|
|
77
|
-
*/
|
|
78
|
-
function isBlob(value) {
|
|
79
|
-
return typeof Blob !== "undefined" && value instanceof Blob;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* @ru Высокопроизводительное глубокое клонирование тела ответа.
|
|
83
|
-
* Избегает накладных расходов structuredClone для простых объектов.
|
|
84
|
-
* @en High-performance deep cloning of the response body.
|
|
85
|
-
* Avoids structuredClone overhead for simple objects.
|
|
86
|
-
* @template T - The type of the body.
|
|
87
|
-
* @param body - The body to clone.
|
|
88
|
-
* @returns The cloned body.
|
|
89
|
-
*/
|
|
90
|
-
export const cloneBodyFast = (body) => {
|
|
91
|
-
if (typeof body !== "object" || body === null)
|
|
92
|
-
return body;
|
|
93
|
-
const obj = body;
|
|
94
|
-
if (body instanceof Uint8Array ||
|
|
95
|
-
typeof obj.pipe === "function" ||
|
|
96
|
-
typeof obj.getReader === "function") {
|
|
97
|
-
return body;
|
|
98
|
-
}
|
|
99
|
-
const proto = Object.getPrototypeOf(body);
|
|
100
|
-
if (proto === Object.prototype || proto === null) {
|
|
101
|
-
return { ...body };
|
|
102
|
-
}
|
|
103
|
-
try {
|
|
104
|
-
return structuredClone(body);
|
|
105
|
-
}
|
|
106
|
-
catch {
|
|
107
|
-
try {
|
|
108
|
-
return JSON.parse(JSON.stringify(body));
|
|
109
|
-
}
|
|
110
|
-
catch {
|
|
111
|
-
return { ...body };
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
/**
|
|
116
|
-
* @ru Высокопроизводительный контейнер HTTP-ответа с ленивым парсингом и кэшированием.
|
|
117
|
-
* Гарантирует идентичный API чтения тела ответа во всех рантаймах.
|
|
118
|
-
* @en High-performance HTTP response container with lazy parsing and caching.
|
|
119
|
-
* Guarantees identical response body reading API across all runtimes.
|
|
120
|
-
* @template T - Expected type of the parsed response body.
|
|
121
|
-
*/
|
|
122
|
-
export class HyperHttpResponse {
|
|
123
|
-
status;
|
|
124
|
-
headers;
|
|
125
|
-
/**
|
|
126
|
-
* @ru Тело ответа. Может быть распарсенным типом T, потоком HyperBody, буфером Uint8Array или null.
|
|
127
|
-
* @en Response body. Can be the parsed type T, a HyperBody stream, Uint8Array buffer, or null.
|
|
128
|
-
*/
|
|
129
|
-
body;
|
|
130
|
-
url;
|
|
131
|
-
data = null;
|
|
132
|
-
[TEXT_CACHE] = undefined;
|
|
133
|
-
[JSON_CACHE] = undefined;
|
|
134
|
-
[ARRAY_BUFFER_CACHE] = undefined;
|
|
135
|
-
_bodyConsumed = false;
|
|
136
|
-
_raw;
|
|
137
|
-
/**
|
|
138
|
-
* @ru Создаёт экземпляр ответа из сырых данных транспорта.
|
|
139
|
-
* @en Creates a response instance from raw transport data.
|
|
140
|
-
* @param rawResponse - The raw response from the transport layer.
|
|
141
|
-
*/
|
|
142
|
-
constructor(rawResponse) {
|
|
143
|
-
this.status = rawResponse.status;
|
|
144
|
-
this.headers = rawResponse.headers || EMPTY_HEADERS;
|
|
145
|
-
this.body = rawResponse.body;
|
|
146
|
-
this.url = rawResponse.url ?? "";
|
|
147
|
-
this._raw = rawResponse._raw;
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* @ru Лениво вычитывает и кэширует тело ответа в виде ArrayBuffer и текста.
|
|
151
|
-
* @en Lazily consumes and caches the response body as ArrayBuffer and text.
|
|
152
|
-
*/
|
|
153
|
-
async _consumeBody() {
|
|
154
|
-
if (this._bodyConsumed)
|
|
155
|
-
return;
|
|
156
|
-
this._bodyConsumed = true;
|
|
157
|
-
const body = this.body;
|
|
158
|
-
if (!body)
|
|
159
|
-
return;
|
|
160
|
-
if (typeof body === "string") {
|
|
161
|
-
this[TEXT_CACHE] = body;
|
|
162
|
-
return;
|
|
163
|
-
}
|
|
164
|
-
if (body instanceof Uint8Array) {
|
|
165
|
-
this[ARRAY_BUFFER_CACHE] =
|
|
166
|
-
body.buffer.byteLength === body.byteLength
|
|
167
|
-
? body.buffer
|
|
168
|
-
: body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength);
|
|
169
|
-
this[TEXT_CACHE] = STATIC_DECODER.decode(body);
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
if (body instanceof ArrayBuffer) {
|
|
173
|
-
this[ARRAY_BUFFER_CACHE] = body;
|
|
174
|
-
this[TEXT_CACHE] = STATIC_DECODER.decode(body);
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
if (isReadableStream(body) || isBlob(body)) {
|
|
178
|
-
if (isReadableStream(body) && body.locked) {
|
|
179
|
-
throw new Error("[Hyperttp] Stream is locked.");
|
|
180
|
-
}
|
|
181
|
-
const response = new Response(body);
|
|
182
|
-
const buf = await response.arrayBuffer();
|
|
183
|
-
this[ARRAY_BUFFER_CACHE] = buf;
|
|
184
|
-
this[TEXT_CACHE] = STATIC_DECODER.decode(buf);
|
|
185
|
-
}
|
|
186
|
-
if (this[ARRAY_BUFFER_CACHE]) {
|
|
187
|
-
this.body = new Uint8Array(this[ARRAY_BUFFER_CACHE]);
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
/**
|
|
191
|
-
* @ru Возвращает тело ответа как ArrayBuffer. Результат кэшируется.
|
|
192
|
-
* @en Returns the response body as an ArrayBuffer. Result is cached.
|
|
193
|
-
* @returns Promise resolving to the ArrayBuffer or SharedArrayBuffer.
|
|
194
|
-
*/
|
|
195
|
-
async arrayBuffer() {
|
|
196
|
-
if (this[ARRAY_BUFFER_CACHE] !== undefined)
|
|
197
|
-
return this[ARRAY_BUFFER_CACHE];
|
|
198
|
-
const body = this.body;
|
|
199
|
-
if (body instanceof Uint8Array) {
|
|
200
|
-
return (this[ARRAY_BUFFER_CACHE] =
|
|
201
|
-
body.buffer.byteLength === body.byteLength
|
|
202
|
-
? body.buffer
|
|
203
|
-
: body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength));
|
|
204
|
-
}
|
|
205
|
-
if (body instanceof ArrayBuffer) {
|
|
206
|
-
return (this[ARRAY_BUFFER_CACHE] = body);
|
|
207
|
-
}
|
|
208
|
-
if (this._raw && body === this._raw.body && typeof this._raw.arrayBuffer === "function") {
|
|
209
|
-
this._bodyConsumed = true;
|
|
210
|
-
return (this[ARRAY_BUFFER_CACHE] = await this._raw.arrayBuffer());
|
|
211
|
-
}
|
|
212
|
-
if (CURRENT_RUNTIME === "bun" && body && typeof body === "object" && "arrayBuffer" in body) {
|
|
213
|
-
const bunBody = body;
|
|
214
|
-
if (typeof bunBody.arrayBuffer === "function") {
|
|
215
|
-
this._bodyConsumed = true;
|
|
216
|
-
return (this[ARRAY_BUFFER_CACHE] = await bunBody.arrayBuffer());
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
if (isBlob(body)) {
|
|
220
|
-
return (this[ARRAY_BUFFER_CACHE] = await body.arrayBuffer());
|
|
221
|
-
}
|
|
222
|
-
await this._consumeBody();
|
|
223
|
-
return this[ARRAY_BUFFER_CACHE];
|
|
224
|
-
}
|
|
225
|
-
/**
|
|
226
|
-
* @ru Возвращает тело ответа как текст. Результат кэшируется.
|
|
227
|
-
* @en Returns the response body as text. Result is cached.
|
|
228
|
-
* @returns Promise resolving to the text string.
|
|
229
|
-
*/
|
|
230
|
-
async text() {
|
|
231
|
-
if (this[TEXT_CACHE] !== undefined)
|
|
232
|
-
return this[TEXT_CACHE];
|
|
233
|
-
const body = this.body;
|
|
234
|
-
if (typeof body === "string") {
|
|
235
|
-
this._bodyConsumed = true;
|
|
236
|
-
return (this[TEXT_CACHE] = body);
|
|
237
|
-
}
|
|
238
|
-
if (body instanceof Uint8Array) {
|
|
239
|
-
this._bodyConsumed = true;
|
|
240
|
-
return (this[TEXT_CACHE] = STATIC_DECODER.decode(body));
|
|
241
|
-
}
|
|
242
|
-
if (body instanceof ArrayBuffer) {
|
|
243
|
-
this._bodyConsumed = true;
|
|
244
|
-
return (this[TEXT_CACHE] = STATIC_DECODER.decode(body));
|
|
245
|
-
}
|
|
246
|
-
if (this._raw && body === this._raw.body && typeof this._raw.text === "function") {
|
|
247
|
-
this._bodyConsumed = true;
|
|
248
|
-
return (this[TEXT_CACHE] = await this._raw.text());
|
|
249
|
-
}
|
|
250
|
-
if (CURRENT_RUNTIME === "bun" && body && typeof body === "object" && "text" in body) {
|
|
251
|
-
const bunBody = body;
|
|
252
|
-
if (typeof bunBody.text === "function") {
|
|
253
|
-
this._bodyConsumed = true;
|
|
254
|
-
return (this[TEXT_CACHE] = await bunBody.text());
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
if (isBlob(body)) {
|
|
258
|
-
this._bodyConsumed = true;
|
|
259
|
-
return (this[TEXT_CACHE] = await body.text());
|
|
260
|
-
}
|
|
261
|
-
await this._consumeBody();
|
|
262
|
-
return this[TEXT_CACHE];
|
|
263
|
-
}
|
|
264
|
-
/**
|
|
265
|
-
* @ru Парсит тело ответа как JSON. Результат кэшируется.
|
|
266
|
-
* @en Parses the response body as JSON. Result is cached.
|
|
267
|
-
* @template TJson - Expected type of the parsed JSON.
|
|
268
|
-
* @returns Promise resolving to the parsed JSON object.
|
|
269
|
-
*/
|
|
270
|
-
async json() {
|
|
271
|
-
if (this[JSON_CACHE] !== undefined)
|
|
272
|
-
return this[JSON_CACHE];
|
|
273
|
-
if (this[TEXT_CACHE] !== undefined) {
|
|
274
|
-
return (this[JSON_CACHE] = JSON.parse(this[TEXT_CACHE]));
|
|
275
|
-
}
|
|
276
|
-
const body = this.body;
|
|
277
|
-
if (typeof body === "object" &&
|
|
278
|
-
body !== null &&
|
|
279
|
-
!isReadableStream(body) &&
|
|
280
|
-
!isBlob(body) &&
|
|
281
|
-
!(body instanceof Uint8Array) &&
|
|
282
|
-
!(body instanceof ArrayBuffer)) {
|
|
283
|
-
return (this[JSON_CACHE] = body);
|
|
284
|
-
}
|
|
285
|
-
if (this._raw && body === this._raw.body && typeof this._raw.json === "function") {
|
|
286
|
-
this._bodyConsumed = true;
|
|
287
|
-
return (this[JSON_CACHE] = await this._raw.json());
|
|
288
|
-
}
|
|
289
|
-
if (CURRENT_RUNTIME === "bun" && body && typeof body === "object" && "json" in body) {
|
|
290
|
-
const bunBody = body;
|
|
291
|
-
if (typeof bunBody.json === "function") {
|
|
292
|
-
this._bodyConsumed = true;
|
|
293
|
-
return (this[JSON_CACHE] = await bunBody.json());
|
|
294
|
-
}
|
|
295
|
-
}
|
|
296
|
-
const str = await this.text();
|
|
297
|
-
return (this[JSON_CACHE] = JSON.parse(str));
|
|
298
|
-
}
|
|
299
|
-
/**
|
|
300
|
-
* @ru Отбрасывает тело ответа для освобождения ресурсов (сокета).
|
|
301
|
-
* @en Discards the response body to free up resources (socket).
|
|
302
|
-
* @returns Promise that resolves when the body is drained.
|
|
303
|
-
*/
|
|
304
|
-
async dump() {
|
|
305
|
-
if (this._bodyConsumed)
|
|
306
|
-
return;
|
|
307
|
-
this._bodyConsumed = true;
|
|
308
|
-
const body = this.body;
|
|
309
|
-
if (isReadableStream(body)) {
|
|
310
|
-
if (!body.locked)
|
|
311
|
-
await body.cancel().catch(() => { });
|
|
312
|
-
}
|
|
313
|
-
else if (isBlob(body)) {
|
|
314
|
-
await body.arrayBuffer();
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
/**
|
|
318
|
-
* @ru Создаёт глубокую изолированную копию ответа.
|
|
319
|
-
* Для стримов использует tee() для безопасного раздвоения потока.
|
|
320
|
-
* @en Creates a deep isolated copy of the response.
|
|
321
|
-
* Uses tee() for streams to safely duplicate the flow.
|
|
322
|
-
* @returns A new HttpResponse instance with cloned data.
|
|
323
|
-
*/
|
|
324
|
-
clone() {
|
|
325
|
-
const cloned = Object.create(HyperHttpResponse.prototype);
|
|
326
|
-
cloned.status = this.status;
|
|
327
|
-
cloned.headers = this.headers;
|
|
328
|
-
cloned.url = this.url;
|
|
329
|
-
cloned.data = this.data ? cloneBodyFast(this.data) : null;
|
|
330
|
-
cloned._bodyConsumed = this._bodyConsumed;
|
|
331
|
-
cloned._raw = this._bodyConsumed ? undefined : this._raw;
|
|
332
|
-
cloned[TEXT_CACHE] = this[TEXT_CACHE];
|
|
333
|
-
cloned[JSON_CACHE] = this[JSON_CACHE];
|
|
334
|
-
cloned[ARRAY_BUFFER_CACHE] = this[ARRAY_BUFFER_CACHE];
|
|
335
|
-
if (isReadableStream(this.body) && !this._bodyConsumed) {
|
|
336
|
-
if (this.body.locked) {
|
|
337
|
-
cloned.body = this.body;
|
|
338
|
-
}
|
|
339
|
-
else {
|
|
340
|
-
const [b1, b2] = this.body.tee();
|
|
341
|
-
this.body = b1;
|
|
342
|
-
cloned.body = b2;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
else {
|
|
346
|
-
cloned.body = this.body;
|
|
347
|
-
}
|
|
348
|
-
return cloned;
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
/**
|
|
352
|
-
* @ru Быстрое создание экземпляра HyperHttpResponse из сырого ответа транспорта.
|
|
353
|
-
* @en Fast creation of a HyperHttpResponse instance from a raw transport response.
|
|
354
|
-
* @param rawResponse - The raw transport response.
|
|
355
|
-
* @returns A new HyperHttpResponse instance.
|
|
356
|
-
*/
|
|
357
|
-
export const mapResponseFast = (rawResponse) => {
|
|
358
|
-
return new HyperHttpResponse(rawResponse);
|
|
359
|
-
};
|
|
360
|
-
/**
|
|
361
|
-
* @ru Быстрое создание объекта StreamResponse без overhead-а классов.
|
|
362
|
-
* @en Fast creation of a StreamResponse object without class overhead.
|
|
363
|
-
* @param rawResponse - The raw transport response.
|
|
364
|
-
* @returns A lightweight StreamResponse object.
|
|
365
|
-
*/
|
|
366
|
-
export const mapStreamFast = (rawResponse) => ({
|
|
367
|
-
status: rawResponse.status,
|
|
368
|
-
headers: rawResponse.headers,
|
|
369
|
-
body: rawResponse.body,
|
|
370
|
-
url: rawResponse.url ?? "",
|
|
371
|
-
});
|
|
372
|
-
/**
|
|
373
|
-
* @ru Оптимизированное слияние заголовков.
|
|
374
|
-
* Использует ранний возврат при первой итерации цикла, что быстрее, чем Object.keys().length > 0.
|
|
375
|
-
* @en Optimized headers merging.
|
|
376
|
-
* Uses early return on the first loop iteration, which is faster than Object.keys().length > 0.
|
|
377
|
-
* @param base - Base headers object.
|
|
378
|
-
* @param override - Headers to override or add.
|
|
379
|
-
* @returns Merged headers object.
|
|
380
|
-
*/
|
|
381
|
-
export const mergeHeadersFast = (base, override) => {
|
|
382
|
-
if (!override)
|
|
383
|
-
return base;
|
|
384
|
-
for (const _ in override) {
|
|
385
|
-
return { ...base, ...override };
|
|
386
|
-
}
|
|
387
|
-
return base;
|
|
388
|
-
};
|
|
389
|
-
//# sourceMappingURL=response.js.map
|
|
1
|
+
"use strict";import{CURRENT_RUNTIME as d}from"../transports/manager.js";const r=Symbol("hyperttp.textCache"),o=Symbol("hyperttp.jsonCache"),s=Symbol("hyperttp.arrayBufferCache"),f=new TextDecoder,h=Object.freeze({});function u(e){return typeof e=="object"&&e!==null&&"getReader"in e&&typeof e.getReader=="function"}function a(e){return typeof Blob<"u"&&e instanceof Blob}export const cloneBodyFast=e=>{if(typeof e!="object"||e===null)return e;const t=e;if(e instanceof Uint8Array||typeof t.pipe=="function"||typeof t.getReader=="function")return e;const n=Object.getPrototypeOf(e);if(n===Object.prototype||n===null)return{...e};try{return structuredClone(e)}catch{try{return JSON.parse(JSON.stringify(e))}catch{return{...e}}}};export class HyperHttpResponse{status;headers;body;url;data=null;[r]=void 0;[o]=void 0;[s]=void 0;_bodyConsumed=!1;_raw;constructor(t){this.status=t.status,this.headers=t.headers||h,this.body=t.body,this.url=t.url??"",this._raw=t._raw}async _consumeBody(){if(this._bodyConsumed)return;this._bodyConsumed=!0;const t=this.body;if(t){if(typeof t=="string"){this[r]=t;return}if(t instanceof Uint8Array){this[s]=t.buffer.byteLength===t.byteLength?t.buffer:t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength),this[r]=f.decode(t);return}if(t instanceof ArrayBuffer){this[s]=t,this[r]=f.decode(t);return}if(this._raw&&t===this._raw.body&&typeof this._raw.arrayBuffer=="function"){const n=await this._raw.arrayBuffer();this[s]=n,this[r]=f.decode(n),this.body=new Uint8Array(n);return}if(d==="bun"&&t&&typeof t=="object"&&"arrayBuffer"in t){const n=t;if(typeof n.arrayBuffer=="function"){const i=await n.arrayBuffer();this[s]=i,this[r]=f.decode(i),this.body=new Uint8Array(i);return}}if(u(t)||a(t)){if(u(t)&&t.locked)throw new Error("[Hyperttp] Stream is locked.");const i=await new Response(t).arrayBuffer();this[s]=i,this[r]=f.decode(i),this.body=new Uint8Array(i)}}}async arrayBuffer(){if(this[s]!==void 0)return this[s];const t=this.body;if(t instanceof Uint8Array)return this._bodyConsumed=!0,this[s]=t.buffer.byteLength===t.byteLength?t.buffer:t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength);if(t instanceof ArrayBuffer)return this._bodyConsumed=!0,this[s]=t;if(a(t))return this._bodyConsumed=!0,this[s]=await t.arrayBuffer();if(await this._consumeBody(),this[s]===void 0)throw new Error("[Hyperttp] Response body is not available as ArrayBuffer");return this[s]}async text(){if(this[r]!==void 0)return this[r];const t=this.body;if(typeof t=="string")return this._bodyConsumed=!0,this[r]=t;if(t instanceof Uint8Array)return this._bodyConsumed=!0,this[r]=f.decode(t);if(t instanceof ArrayBuffer)return this._bodyConsumed=!0,this[r]=f.decode(t);if(a(t))return this._bodyConsumed=!0,this[r]=await t.text();if(await this._consumeBody(),this[r]===void 0)throw new Error("[Hyperttp] Response body is not available as text");return this[r]}async json(){if(this[o]!==void 0)return this[o];if(this[r]!==void 0)return this[o]=JSON.parse(this[r]);const t=this.body;if(typeof t=="object"&&t!==null&&!u(t)&&!a(t)&&!(t instanceof Uint8Array)&&!(t instanceof ArrayBuffer))return this._bodyConsumed=!0,this[o]=t;if(await this._consumeBody(),this[r]!==void 0)return this[o]=JSON.parse(this[r]);throw new Error("[Hyperttp] Response body is not available as JSON")}async dump(){if(this._bodyConsumed)return;this._bodyConsumed=!0;const t=this.body;u(t)?t.locked||await t.cancel().catch(()=>{}):a(t)&&await t.arrayBuffer()}clone(){const t=Object.create(HyperHttpResponse.prototype);if(t.status=this.status,t.headers=this.headers,t.url=this.url,t.data=this.data?cloneBodyFast(this.data):null,t._bodyConsumed=this._bodyConsumed,t._raw=this._bodyConsumed?void 0:this._raw,t[r]=this[r],t[o]=this[o],t[s]=this[s],u(this.body)&&!this._bodyConsumed)if(this.body.locked)t.body=this.body;else{const[n,i]=this.body.tee();this.body=n,t.body=i}else t.body=this.body;return t}}export const mapResponseFast=e=>new HyperHttpResponse(e),mapStreamFast=e=>({status:e.status,headers:e.headers,body:e.body,url:e.url??""}),mergeHeadersFast=(e,t)=>{if(!t)return e;for(const n in t)return{...e,...t};return e};
|
|
2
|
+
//# sourceMappingURL=response.js.map
|
package/utils/response.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{"version":3,"file":"response.js","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/response.ts"],
|
|
4
|
+
"sourcesContent": ["import type { HttpResponse, HyperTransport, HyperBody } from \"@hyperttp/types\";\nimport { CURRENT_RUNTIME } from \"../transports/manager.js\";\n\ntype TransportResponse = Awaited<ReturnType<HyperTransport[\"execute\"]>>;\n\n/**\n * @ru \u0418\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043D\u043D\u043E\u0433\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430, \u0441\u043E\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0441\u043A\u0440\u044B\u0442\u0443\u044E \u0441\u0441\u044B\u043B\u043A\u0443 \u043D\u0430 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 \u0441\u0435\u0442\u0435\u0432\u043E\u0439 \u0438\u043D\u0441\u0442\u0430\u043D\u0441.\n * @en Interface for extended transport response containing a hidden reference to the native network instance.\n */\ninterface InternalTransportResponse extends TransportResponse {\n _raw?: FetchResponseLike;\n}\n\n/**\n * @ru \u0418\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0443\u0442\u0438\u043D\u043E\u0439 \u0442\u0438\u043F\u0438\u0437\u0430\u0446\u0438\u0438 \u0434\u043B\u044F \u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u043E\u0442\u0432\u0435\u0442\u0430 Fetch API \u0438\u043B\u0438 Bun-\u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0433\u043E \u0442\u0435\u043B\u0430.\n * @en Duck-typing interface for native Fetch API response or Bun-compatible body.\n */\ninterface FetchResponseLike {\n body: unknown;\n arrayBuffer(): Promise<ArrayBuffer>;\n text(): Promise<string>;\n json(): Promise<unknown>;\n}\n\n\n\nconst TEXT_CACHE = Symbol(\"hyperttp.textCache\");\nconst JSON_CACHE = Symbol(\"hyperttp.jsonCache\");\nconst ARRAY_BUFFER_CACHE = Symbol(\"hyperttp.arrayBufferCache\");\n\ntype CacheHolder = {\n [TEXT_CACHE]?: string;\n [JSON_CACHE]?: unknown;\n [ARRAY_BUFFER_CACHE]?: ArrayBuffer | SharedArrayBuffer;\n};\n\nconst STATIC_DECODER = new TextDecoder();\n\n/**\n * @ru \u0417\u0430\u043C\u043E\u0440\u043E\u0436\u0435\u043D\u043D\u044B\u0439 \u043F\u0443\u0441\u0442\u043E\u0439 \u043E\u0431\u044A\u0435\u043A\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0434\u043B\u044F \u0438\u0437\u0431\u0435\u0436\u0430\u043D\u0438\u044F \u043B\u0438\u0448\u043D\u0438\u0445 \u0430\u043B\u043B\u043E\u043A\u0430\u0446\u0438\u0439.\n * @en Frozen empty headers object to avoid redundant allocations.\n */\nconst EMPTY_HEADERS: Readonly<Record<string, never>> = Object.freeze({});\n\n/**\n * @ru \u0411\u044B\u0441\u0442\u0440\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430, \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 ReadableStream.\n * @en Fast check to determine if a value is a ReadableStream.\n * @param value - The value to check.\n * @returns True if the value is a ReadableStream.\n */\nfunction isReadableStream(value: unknown): value is ReadableStream<Uint8Array> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"getReader\" in value &&\n typeof (value as Record<string, unknown>).getReader === \"function\"\n );\n}\n\n/**\n * @ru \u0411\u044B\u0441\u0442\u0440\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430, \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 Blob.\n * @en Fast check to determine if a value is a Blob.\n * @param value - The value to check.\n * @returns True if the value is a Blob.\n */\nfunction isBlob(value: unknown): value is Blob {\n return typeof Blob !== \"undefined\" && value instanceof Blob;\n}\n\n/**\n * @ru \u0412\u044B\u0441\u043E\u043A\u043E\u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0433\u043B\u0443\u0431\u043E\u043A\u043E\u0435 \u043A\u043B\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043B\u0430 \u043E\u0442\u0432\u0435\u0442\u0430.\n * \u0418\u0437\u0431\u0435\u0433\u0430\u0435\u0442 \u043D\u0430\u043A\u043B\u0430\u0434\u043D\u044B\u0445 \u0440\u0430\u0441\u0445\u043E\u0434\u043E\u0432 structuredClone \u0434\u043B\u044F \u043F\u0440\u043E\u0441\u0442\u044B\u0445 \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432.\n * @en High-performance deep cloning of the response body.\n * Avoids structuredClone overhead for simple objects.\n * @template T - The type of the body.\n * @param body - The body to clone.\n * @returns The cloned body.\n */\nexport const cloneBodyFast = <T>(body: T): T => {\n if (typeof body !== \"object\" || body === null) return body;\n const obj = body as Record<string, unknown>;\n\n if (\n body instanceof Uint8Array ||\n typeof obj.pipe === \"function\" ||\n typeof obj.getReader === \"function\"\n ) {\n return body;\n }\n\n const proto = Object.getPrototypeOf(body);\n if (proto === Object.prototype || proto === null) {\n return { ...body } as T;\n }\n\n try {\n return structuredClone(body);\n } catch {\n try {\n return JSON.parse(JSON.stringify(body)) as T;\n } catch {\n return { ...body };\n }\n }\n};\n\n/**\n * @ru \u0412\u044B\u0441\u043E\u043A\u043E\u043F\u0440\u043E\u0438\u0437\u0432\u043E\u0434\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 HTTP-\u043E\u0442\u0432\u0435\u0442\u0430 \u0441 \u043B\u0435\u043D\u0438\u0432\u044B\u043C \u043F\u0430\u0440\u0441\u0438\u043D\u0433\u043E\u043C \u0438 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C.\n * \u0413\u0430\u0440\u0430\u043D\u0442\u0438\u0440\u0443\u0435\u0442 \u0438\u0434\u0435\u043D\u0442\u0438\u0447\u043D\u044B\u0439 API \u0447\u0442\u0435\u043D\u0438\u044F \u0442\u0435\u043B\u0430 \u043E\u0442\u0432\u0435\u0442\u0430 \u0432\u043E \u0432\u0441\u0435\u0445 \u0440\u0430\u043D\u0442\u0430\u0439\u043C\u0430\u0445.\n * @en High-performance HTTP response container with lazy parsing and caching.\n * Guarantees identical response body reading API across all runtimes.\n * @template T - Expected type of the parsed response body.\n */\nexport class HyperHttpResponse<T = unknown> implements HttpResponse<T>, CacheHolder {\n public status: number;\n public headers: Record<string, string | string[]>;\n\n /**\n * @ru \u0422\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430. \u041C\u043E\u0436\u0435\u0442 \u0431\u044B\u0442\u044C \u0440\u0430\u0441\u043F\u0430\u0440\u0441\u0435\u043D\u043D\u044B\u043C \u0442\u0438\u043F\u043E\u043C T, \u043F\u043E\u0442\u043E\u043A\u043E\u043C HyperBody, \u0431\u0443\u0444\u0435\u0440\u043E\u043C Uint8Array \u0438\u043B\u0438 null.\n * @en Response body. Can be the parsed type T, a HyperBody stream, Uint8Array buffer, or null.\n */\n public body: T | HyperBody | Uint8Array | null;\n\n public url: string;\n public data: T | null = null;\n\n public [TEXT_CACHE]: string | undefined = undefined;\n public [JSON_CACHE]: unknown | undefined = undefined;\n public [ARRAY_BUFFER_CACHE]: ArrayBuffer | SharedArrayBuffer | undefined = undefined;\n\n private _bodyConsumed = false;\n private _raw: FetchResponseLike | undefined;\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 \u043E\u0442\u0432\u0435\u0442\u0430 \u0438\u0437 \u0441\u044B\u0440\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Creates a response instance from raw transport data.\n * @param rawResponse - The raw response from the transport layer.\n */\n constructor(rawResponse: TransportResponse) {\n this.status = rawResponse.status;\n this.headers = rawResponse.headers || EMPTY_HEADERS;\n this.body = rawResponse.body as T | HyperBody | Uint8Array | null;\n this.url = rawResponse.url ?? \"\";\n this._raw = (rawResponse as InternalTransportResponse)._raw;\n }\n\n /**\n * @ru \u041B\u0435\u043D\u0438\u0432\u043E \u0432\u044B\u0447\u0438\u0442\u044B\u0432\u0430\u0435\u0442 \u0438 \u043A\u044D\u0448\u0438\u0440\u0443\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u0432 \u0432\u0438\u0434\u0435 ArrayBuffer \u0438 \u0442\u0435\u043A\u0441\u0442\u0430.\n * @en Lazily consumes and caches the response body as ArrayBuffer and text.\n */\n private async _consumeBody(): Promise<void> {\n if (this._bodyConsumed) return;\n this._bodyConsumed = true;\n\n const body = this.body;\n if (!body) return;\n\n if (typeof body === \"string\") {\n this[TEXT_CACHE] = body;\n return;\n }\n\n if (body instanceof Uint8Array) {\n this[ARRAY_BUFFER_CACHE] =\n body.buffer.byteLength === body.byteLength\n ? body.buffer\n : body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength);\n this[TEXT_CACHE] = STATIC_DECODER.decode(body);\n return;\n }\n\n if (body instanceof ArrayBuffer) {\n this[ARRAY_BUFFER_CACHE] = body;\n this[TEXT_CACHE] = STATIC_DECODER.decode(body);\n return;\n }\n\n if (this._raw && body === this._raw.body && typeof this._raw.arrayBuffer === \"function\") {\n const buf = await this._raw.arrayBuffer();\n this[ARRAY_BUFFER_CACHE] = buf;\n this[TEXT_CACHE] = STATIC_DECODER.decode(buf);\n this.body = new Uint8Array(buf) as T | HyperBody | Uint8Array | null;\n return;\n }\n\n if (CURRENT_RUNTIME === \"bun\" && body && typeof body === \"object\" && \"arrayBuffer\" in body) {\n const bunBody = body as { arrayBuffer: () => Promise<ArrayBuffer> };\n if (typeof bunBody.arrayBuffer === \"function\") {\n const buf = await bunBody.arrayBuffer();\n this[ARRAY_BUFFER_CACHE] = buf;\n this[TEXT_CACHE] = STATIC_DECODER.decode(buf);\n this.body = new Uint8Array(buf) as T | HyperBody | Uint8Array | null;\n return;\n }\n }\n\n if (isReadableStream(body) || isBlob(body)) {\n if (isReadableStream(body) && body.locked) {\n throw new Error(\"[Hyperttp] Stream is locked.\");\n }\n const response = new Response(body as unknown as BodyInit);\n const buf = await response.arrayBuffer();\n this[ARRAY_BUFFER_CACHE] = buf;\n this[TEXT_CACHE] = STATIC_DECODER.decode(buf);\n this.body = new Uint8Array(buf) as T | HyperBody | Uint8Array | null;\n }\n }\n\n /**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u043A\u0430\u043A ArrayBuffer. \u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043A\u044D\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044F.\n * @en Returns the response body as an ArrayBuffer. Result is cached.\n * @returns Promise resolving to the ArrayBuffer or SharedArrayBuffer.\n */\n public async arrayBuffer(): Promise<ArrayBuffer | SharedArrayBuffer> {\n if (this[ARRAY_BUFFER_CACHE] !== undefined) return this[ARRAY_BUFFER_CACHE]!;\n\n const body = this.body;\n if (body instanceof Uint8Array) {\n this._bodyConsumed = true;\n return (this[ARRAY_BUFFER_CACHE] =\n body.buffer.byteLength === body.byteLength\n ? body.buffer\n : body.buffer.slice(body.byteOffset, body.byteOffset + body.byteLength));\n }\n\n if (body instanceof ArrayBuffer) {\n this._bodyConsumed = true;\n return (this[ARRAY_BUFFER_CACHE] = body);\n }\n\n if (isBlob(body)) {\n this._bodyConsumed = true;\n return (this[ARRAY_BUFFER_CACHE] = await body.arrayBuffer());\n }\n\n await this._consumeBody();\n if (this[ARRAY_BUFFER_CACHE] === undefined) {\n throw new Error(\"[Hyperttp] Response body is not available as ArrayBuffer\");\n }\n return this[ARRAY_BUFFER_CACHE]!;\n }\n\n /**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u043A\u0430\u043A \u0442\u0435\u043A\u0441\u0442. \u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043A\u044D\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044F.\n * @en Returns the response body as text. Result is cached.\n * @returns Promise resolving to the text string.\n */\n public async text(): Promise<string> {\n if (this[TEXT_CACHE] !== undefined) return this[TEXT_CACHE]!;\n\n const body = this.body;\n if (typeof body === \"string\") {\n this._bodyConsumed = true;\n return (this[TEXT_CACHE] = body);\n }\n\n if (body instanceof Uint8Array) {\n this._bodyConsumed = true;\n return (this[TEXT_CACHE] = STATIC_DECODER.decode(body));\n }\n\n if (body instanceof ArrayBuffer) {\n this._bodyConsumed = true;\n return (this[TEXT_CACHE] = STATIC_DECODER.decode(body));\n }\n\n if (isBlob(body)) {\n this._bodyConsumed = true;\n return (this[TEXT_CACHE] = await body.text());\n }\n\n await this._consumeBody();\n if (this[TEXT_CACHE] === undefined) {\n throw new Error(\"[Hyperttp] Response body is not available as text\");\n }\n return this[TEXT_CACHE]!;\n }\n\n /**\n * @ru \u041F\u0430\u0440\u0441\u0438\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u043A\u0430\u043A JSON. \u0420\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442 \u043A\u044D\u0448\u0438\u0440\u0443\u0435\u0442\u0441\u044F.\n * @en Parses the response body as JSON. Result is cached.\n * @template TJson - Expected type of the parsed JSON.\n * @returns Promise resolving to the parsed JSON object.\n */\n public async json<TJson = T>(): Promise<TJson> {\n if (this[JSON_CACHE] !== undefined) return this[JSON_CACHE] as TJson;\n\n if (this[TEXT_CACHE] !== undefined) {\n return (this[JSON_CACHE] = JSON.parse(this[TEXT_CACHE]!)) as TJson;\n }\n\n const body = this.body;\n if (\n typeof body === \"object\" &&\n body !== null &&\n !isReadableStream(body) &&\n !isBlob(body) &&\n !(body instanceof Uint8Array) &&\n !(body instanceof ArrayBuffer)\n ) {\n this._bodyConsumed = true;\n return (this[JSON_CACHE] = body) as TJson;\n }\n\n await this._consumeBody();\n if (this[TEXT_CACHE] !== undefined) {\n return (this[JSON_CACHE] = JSON.parse(this[TEXT_CACHE]!)) as TJson;\n }\n throw new Error(\"[Hyperttp] Response body is not available as JSON\");\n }\n\n /**\n * @ru \u041E\u0442\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u0434\u043B\u044F \u043E\u0441\u0432\u043E\u0431\u043E\u0436\u0434\u0435\u043D\u0438\u044F \u0440\u0435\u0441\u0443\u0440\u0441\u043E\u0432 (\u0441\u043E\u043A\u0435\u0442\u0430).\n * @en Discards the response body to free up resources (socket).\n * @returns Promise that resolves when the body is drained.\n */\n public async dump(): Promise<void> {\n if (this._bodyConsumed) return;\n this._bodyConsumed = true;\n\n const body = this.body;\n if (isReadableStream(body)) {\n if (!body.locked) await body.cancel().catch(() => {});\n } else if (isBlob(body)) {\n await body.arrayBuffer();\n }\n }\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u0433\u043B\u0443\u0431\u043E\u043A\u0443\u044E \u0438\u0437\u043E\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u0443\u044E \u043A\u043E\u043F\u0438\u044E \u043E\u0442\u0432\u0435\u0442\u0430.\n * \u0414\u043B\u044F \u0441\u0442\u0440\u0438\u043C\u043E\u0432 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 tee() \u0434\u043B\u044F \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0433\u043E \u0440\u0430\u0437\u0434\u0432\u043E\u0435\u043D\u0438\u044F \u043F\u043E\u0442\u043E\u043A\u0430.\n * @en Creates a deep isolated copy of the response.\n * Uses tee() for streams to safely duplicate the flow.\n * @returns A new HttpResponse instance with cloned data.\n */\n public clone(): HttpResponse<T> {\n const cloned = Object.create(HyperHttpResponse.prototype) as HyperHttpResponse<T>;\n\n cloned.status = this.status;\n cloned.headers = this.headers;\n cloned.url = this.url;\n cloned.data = this.data ? cloneBodyFast(this.data) : null;\n cloned._bodyConsumed = this._bodyConsumed;\n cloned._raw = this._bodyConsumed ? undefined : this._raw;\n\n cloned[TEXT_CACHE] = this[TEXT_CACHE];\n cloned[JSON_CACHE] = this[JSON_CACHE];\n cloned[ARRAY_BUFFER_CACHE] = this[ARRAY_BUFFER_CACHE];\n\n if (isReadableStream(this.body) && !this._bodyConsumed) {\n if (this.body.locked) {\n cloned.body = this.body;\n } else {\n const [b1, b2] = this.body.tee();\n this.body = b1 as T | HyperBody | Uint8Array | null;\n cloned.body = b2 as T | HyperBody | Uint8Array | null;\n }\n } else {\n cloned.body = this.body;\n }\n\n return cloned;\n }\n}\n\n/**\n * @ru \u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440\u0430 HyperHttpResponse \u0438\u0437 \u0441\u044B\u0440\u043E\u0433\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Fast creation of a HyperHttpResponse instance from a raw transport response.\n * @param rawResponse - The raw transport response.\n * @returns A new HyperHttpResponse instance.\n */\nexport const mapResponseFast = (rawResponse: TransportResponse): HttpResponse<unknown> => {\n return new HyperHttpResponse(rawResponse);\n};\n\n/**\n * @ru \u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u0435 \u043E\u0431\u044A\u0435\u043A\u0442\u0430 StreamResponse \u0431\u0435\u0437 overhead-\u0430 \u043A\u043B\u0430\u0441\u0441\u043E\u0432.\n * @en Fast creation of a StreamResponse object without class overhead.\n * @param rawResponse - The raw transport response.\n * @returns A lightweight StreamResponse object.\n */\nexport const mapStreamFast = (rawResponse: TransportResponse) => ({\n status: rawResponse.status,\n headers: rawResponse.headers,\n body: rawResponse.body,\n url: rawResponse.url ?? \"\",\n});\n\n/**\n * @ru \u041E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0435 \u0441\u043B\u0438\u044F\u043D\u0438\u0435 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432.\n * \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0440\u0430\u043D\u043D\u0438\u0439 \u0432\u043E\u0437\u0432\u0440\u0430\u0442 \u043F\u0440\u0438 \u043F\u0435\u0440\u0432\u043E\u0439 \u0438\u0442\u0435\u0440\u0430\u0446\u0438\u0438 \u0446\u0438\u043A\u043B\u0430, \u0447\u0442\u043E \u0431\u044B\u0441\u0442\u0440\u0435\u0435, \u0447\u0435\u043C Object.keys().length > 0.\n * @en Optimized headers merging.\n * Uses early return on the first loop iteration, which is faster than Object.keys().length > 0.\n * @param base - Base headers object.\n * @param override - Headers to override or add.\n * @returns Merged headers object.\n */\nexport const mergeHeadersFast = (\n base: Record<string, string | string[]>,\n override?: Record<string, string | string[]>,\n): Record<string, string | string[]> => {\n if (!override) return base;\n for (const _ in override) {\n return { ...base, ...override };\n }\n return base;\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["CURRENT_RUNTIME", "TEXT_CACHE", "JSON_CACHE", "ARRAY_BUFFER_CACHE", "STATIC_DECODER", "EMPTY_HEADERS", "isReadableStream", "value", "isBlob", "body", "obj", "proto", "rawResponse", "buf", "bunBody", "cloned", "b1", "b2", "base", "override", "_"]
|
|
7
|
+
}
|
package/utils/retryUtils.js
CHANGED
|
@@ -1,55 +1,2 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
* @en Default HTTP status codes that trigger retries when no explicit codes are provided.
|
|
4
|
-
*/
|
|
5
|
-
const DEFAULT_RETRY_STATUS_CODES = new Set([502, 503, 504]);
|
|
6
|
-
/**
|
|
7
|
-
* @ru Вычисляет задержку перед повторной попыткой с экспоненциальной задержкой и возможным джиттером.
|
|
8
|
-
* @en Calculates the delay before a retry using exponential backoff and optional jitter.
|
|
9
|
-
*/
|
|
10
|
-
export function calcDelay(attempt, retryOptions) {
|
|
11
|
-
const { baseDelay = 1000, maxDelay = 10000, jitter = true } = retryOptions;
|
|
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);
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* @ru Пытается освободить ресурсы тела ответа, не дожидаясь полного потребления. Поддерживает методы dump, resume, destroy.
|
|
21
|
-
* @en Attempts to release response body resources without fully consuming it. Supports dump, resume, destroy methods.
|
|
22
|
-
*/
|
|
23
|
-
export async function drainBody(body) {
|
|
24
|
-
if (!body || typeof body !== "object")
|
|
25
|
-
return;
|
|
26
|
-
try {
|
|
27
|
-
const stream = body;
|
|
28
|
-
if (typeof stream.dump === "function") {
|
|
29
|
-
await stream.dump();
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
if (typeof stream.destroy === "function") {
|
|
33
|
-
stream.destroy();
|
|
34
|
-
return;
|
|
35
|
-
}
|
|
36
|
-
if (typeof stream.resume === "function") {
|
|
37
|
-
stream.resume();
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
catch {
|
|
41
|
-
//
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
/**
|
|
45
|
-
* @ru Определяет, следует ли выполнить повторную попытку для данного кода статуса на основе настроек.
|
|
46
|
-
* @en Determines whether to retry for the given status code based on retry options.
|
|
47
|
-
*/
|
|
48
|
-
export function shouldRetry(status, retryOptions) {
|
|
49
|
-
const codes = retryOptions.retryStatusCodes;
|
|
50
|
-
if (codes !== undefined && codes.length > 0) {
|
|
51
|
-
return codes.includes(status);
|
|
52
|
-
}
|
|
53
|
-
return DEFAULT_RETRY_STATUS_CODES.has(status);
|
|
54
|
-
}
|
|
55
|
-
//# sourceMappingURL=retryUtils.js.map
|
|
1
|
+
"use strict";const u=new Set([502,503,504]);export function calcDelay(e,t){const{baseDelay:n=1e3,maxDelay:r=1e4,jitter:a=!0}=t,c=Math.min(e,31),o=Math.min(n*Math.pow(2,c),r);if(!a)return o;const i=o*(.75+Math.random()*.5);return Math.min(Math.max(0,i),r)}export async function drainBody(e){if(!(!e||typeof e!="object"))try{const t=e;if(typeof t.dump=="function"){await t.dump();return}if(typeof t.destroy=="function"){t.destroy();return}typeof t.resume=="function"&&t.resume()}catch{}}export function shouldRetry(e,t){const n=t.retryStatusCodes;return n!==void 0?n.length>0&&n.includes(e):u.has(e)}
|
|
2
|
+
//# sourceMappingURL=retryUtils.js.map
|
package/utils/retryUtils.js.map
CHANGED
|
@@ -1 +1,7 @@
|
|
|
1
|
-
{
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/utils/retryUtils.ts"],
|
|
4
|
+
"sourcesContent": ["import type { RetryOptions } from \"@hyperttp/types\";\n\n/**\n * @ru \u041A\u043E\u0434\u044B \u0441\u0442\u0430\u0442\u0443\u0441\u0430 HTTP, \u043F\u043E \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.\n * @en Default HTTP status codes that trigger retries when no explicit codes are provided.\n */\nconst DEFAULT_RETRY_STATUS_CODES = new Set<number>([502, 503, 504]);\n\n/**\n * @ru \u0412\u044B\u0447\u0438\u0441\u043B\u044F\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0443 \u043F\u0435\u0440\u0435\u0434 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0439 \u043F\u043E\u043F\u044B\u0442\u043A\u043E\u0439 \u0441 \u044D\u043A\u0441\u043F\u043E\u043D\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0438 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u044B\u043C \u0434\u0436\u0438\u0442\u0442\u0435\u0440\u043E\u043C.\n * @en Calculates the delay before a retry using exponential backoff and optional jitter.\n */\nexport function calcDelay(attempt: number, retryOptions: RetryOptions): number {\n const { baseDelay = 1000, maxDelay = 10000, jitter = true } = retryOptions;\n const safeAttempt = Math.min(attempt, 31);\n const base = Math.min(baseDelay * Math.pow(2, safeAttempt), maxDelay);\n if (!jitter) return base;\n const jittered = base * (0.75 + Math.random() * 0.5);\n return Math.min(Math.max(0, jittered), maxDelay);\n}\n\n/**\n * @ru \u041F\u044B\u0442\u0430\u0435\u0442\u0441\u044F \u043E\u0441\u0432\u043E\u0431\u043E\u0434\u0438\u0442\u044C \u0440\u0435\u0441\u0443\u0440\u0441\u044B \u0442\u0435\u043B\u0430 \u043E\u0442\u0432\u0435\u0442\u0430, \u043D\u0435 \u0434\u043E\u0436\u0438\u0434\u0430\u044F\u0441\u044C \u043F\u043E\u043B\u043D\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043B\u0435\u043D\u0438\u044F. \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043C\u0435\u0442\u043E\u0434\u044B dump, resume, destroy.\n * @en Attempts to release response body resources without fully consuming it. Supports dump, resume, destroy methods.\n */\nexport async function drainBody(body: unknown): Promise<void> {\n if (!body || typeof body !== \"object\") return;\n try {\n const stream = body as Record<string, unknown>;\n\n if (typeof stream.dump === \"function\") {\n await (stream.dump as () => Promise<void>)();\n return;\n }\n\n if (typeof stream.destroy === \"function\") {\n (stream.destroy as () => void)();\n return;\n }\n\n if (typeof stream.resume === \"function\") {\n (stream.resume as () => void)();\n }\n } catch {\n //\n }\n}\n\n/**\n * @ru \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0443\u044E \u043F\u043E\u043F\u044B\u0442\u043A\u0443 \u0434\u043B\u044F \u0434\u0430\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A.\n * @en Determines whether to retry for the given status code based on retry options.\n */\nexport function shouldRetry(status: number, retryOptions: RetryOptions): boolean {\n const codes = retryOptions.retryStatusCodes;\n if (codes !== undefined) {\n return codes.length > 0 && codes.includes(status);\n }\n return DEFAULT_RETRY_STATUS_CODES.has(status);\n}\n"],
|
|
5
|
+
"mappings": "aAMA,MAAMA,EAA6B,IAAI,IAAY,CAAC,IAAK,IAAK,GAAG,CAAC,EAM5D,gBAAU,UAAUC,EAAiBC,EAA0B,CACnE,KAAM,CAAE,UAAAC,EAAY,IAAM,SAAAC,EAAW,IAAO,OAAAC,EAAS,EAAI,EAAKH,EACxDI,EAAc,KAAK,IAAIL,EAAS,EAAE,EAClCM,EAAO,KAAK,IAAIJ,EAAY,KAAK,IAAI,EAAGG,CAAW,EAAGF,CAAQ,EACpE,GAAI,CAACC,EAAQ,OAAOE,EACpB,MAAMC,EAAWD,GAAQ,IAAO,KAAK,OAAM,EAAK,IAChD,OAAO,KAAK,IAAI,KAAK,IAAI,EAAGC,CAAQ,EAAGJ,CAAQ,CACjD,CAMA,sBAAsB,UAAUK,EAAa,CAC3C,GAAI,GAACA,GAAQ,OAAOA,GAAS,UAC7B,GAAI,CACF,MAAMC,EAASD,EAEf,GAAI,OAAOC,EAAO,MAAS,WAAY,CACrC,MAAOA,EAAO,KAA4B,EAC1C,MACF,CAEA,GAAI,OAAOA,EAAO,SAAY,WAAY,CACvCA,EAAO,QAAsB,EAC9B,MACF,CAEI,OAAOA,EAAO,QAAW,YAC1BA,EAAO,OAAqB,CAEjC,MAAQ,CAER,CACF,CAMM,gBAAU,YAAYC,EAAgBT,EAA0B,CACpE,MAAMU,EAAQV,EAAa,iBAC3B,OAAIU,IAAU,OACLA,EAAM,OAAS,GAAKA,EAAM,SAASD,CAAM,EAE3CX,EAA2B,IAAIW,CAAM,CAC9C",
|
|
6
|
+
"names": ["DEFAULT_RETRY_STATUS_CODES", "attempt", "retryOptions", "baseDelay", "maxDelay", "jitter", "safeAttempt", "base", "jittered", "body", "stream", "status", "codes"]
|
|
7
|
+
}
|