@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.
Files changed (46) hide show
  1. package/Core/HyperCore.d.ts +135 -77
  2. package/Core/HyperCore.d.ts.map +1 -1
  3. package/Core/HyperCore.js +280 -246
  4. package/Core/HyperCore.js.map +1 -1
  5. package/README.md +169 -96
  6. package/package.json +14 -8
  7. package/transports/browser.d.ts +228 -0
  8. package/transports/browser.d.ts.map +1 -0
  9. package/transports/browser.js +451 -0
  10. package/transports/browser.js.map +1 -0
  11. package/transports/manager.d.ts +9 -85
  12. package/transports/manager.d.ts.map +1 -1
  13. package/transports/manager.js +152 -222
  14. package/transports/manager.js.map +1 -1
  15. package/transports/node.d.ts +4 -36
  16. package/transports/node.d.ts.map +1 -1
  17. package/transports/node.js +119 -159
  18. package/transports/node.js.map +1 -1
  19. package/utils/decompress.d.ts +16 -20
  20. package/utils/decompress.d.ts.map +1 -1
  21. package/utils/decompress.js +151 -60
  22. package/utils/decompress.js.map +1 -1
  23. package/utils/errors.d.ts +0 -10
  24. package/utils/errors.d.ts.map +1 -1
  25. package/utils/errors.js +1 -11
  26. package/utils/errors.js.map +1 -1
  27. package/utils/merge.d.ts +0 -3
  28. package/utils/merge.d.ts.map +1 -1
  29. package/utils/merge.js +12 -22
  30. package/utils/merge.js.map +1 -1
  31. package/utils/normalize.d.ts +40 -21
  32. package/utils/normalize.d.ts.map +1 -1
  33. package/utils/normalize.js +217 -138
  34. package/utils/normalize.js.map +1 -1
  35. package/utils/pipeline.d.ts +10 -30
  36. package/utils/pipeline.d.ts.map +1 -1
  37. package/utils/pipeline.js +44 -44
  38. package/utils/pipeline.js.map +1 -1
  39. package/utils/response.d.ts +105 -23
  40. package/utils/response.d.ts.map +1 -1
  41. package/utils/response.js +308 -38
  42. package/utils/response.js.map +1 -1
  43. package/utils/retryUtils.d.ts +2 -10
  44. package/utils/retryUtils.d.ts.map +1 -1
  45. package/utils/retryUtils.js +17 -21
  46. package/utils/retryUtils.js.map +1 -1
@@ -1,8 +1,19 @@
1
- import { brotliDecompressSync, createBrotliDecompress, createGunzip, createInflate, gunzipSync, inflateSync, } from "node:zlib";
2
- import { Readable } from "node:stream";
1
+ import { runtimeImport } from "../transports/manager.js";
3
2
  /**
4
- * @ru Разбирает строку Content-Encoding на массив кодировок (без identity).
5
- * @en Parses a Content-Encoding string into an array of encodings (excluding identity).
3
+ * @ru Флаг серверного окружения (Node.js/Bun/Deno).
4
+ * @en Server environment flag (Node.js/Bun/Deno).
5
+ */
6
+ const IS_SERVER = typeof window === "undefined" && typeof self === "undefined";
7
+ /**
8
+ * @ru No-op функция для dump() буферов. Буферы не требуют освобождения ресурсов.
9
+ * @en No-op function for buffer dump(). Buffers don't require resource cleanup.
10
+ */
11
+ const NOOP_DUMP = async () => { };
12
+ /**
13
+ * @ru Парсит строку Content-Encoding в массив кодировок.
14
+ * Игнорирует 'identity' (без сжатия) и пустые значения.
15
+ * @en Parses Content-Encoding string into an array of encodings.
16
+ * Ignores 'identity' (no compression) and empty values.
6
17
  * @param encoding - The Content-Encoding header value.
7
18
  * @returns Array of normalized encoding names.
8
19
  */
@@ -13,21 +24,21 @@ function parseEncodings(encoding) {
13
24
  .filter((part) => part.length > 0 && part !== "identity");
14
25
  }
15
26
  /**
16
- * @ru Прикрепляет пустой метод dump к буферу для соответствия интерфейсу TransportStreamExtensions.
17
- * @en Attaches a no-op dump method to a buffer to conform to TransportStreamExtensions.
18
- * @param buffer - The buffer to decorate.
19
- * @returns The same buffer with a dump method.
27
+ * @ru Добавляет no-op метод dump() к буферу.
28
+ * @en Attaches a no-op dump() method to the buffer.
29
+ * @param buffer - The Uint8Array to extend.
30
+ * @returns The buffer with dump() method attached.
20
31
  */
21
32
  function attachNoopDump(buffer) {
22
33
  const payload = buffer;
23
- payload.dump = async () => { };
34
+ payload.dump = NOOP_DUMP;
24
35
  return payload;
25
36
  }
26
37
  /**
27
- * @ru Прикрепляет метод dump, который отменяет поток, к ReadableStream.
28
- * @en Attaches a dump method that cancels the stream to a ReadableStream.
29
- * @param stream - The stream to decorate.
30
- * @returns The same stream with a dump method.
38
+ * @ru Добавляет метод dump() к стриму для отмены и освобождения сокета.
39
+ * @en Attaches a dump() method to the stream for cancellation and socket release.
40
+ * @param stream - The ReadableStream to extend.
41
+ * @returns The stream with dump() method attached.
31
42
  */
32
43
  function attachStreamDump(stream) {
33
44
  const payload = stream;
@@ -42,74 +53,154 @@ function attachStreamDump(stream) {
42
53
  return payload;
43
54
  }
44
55
  /**
45
- * @ru Применяет декомпрессию один раз для заданной кодировки. Поддерживает gzip, deflate, br.
46
- * @en Applies decompression once for a given encoding. Supports gzip, deflate, br.
47
- * @param input - The compressed input buffer.
48
- * @param encoding - Single encoding name (e.g., 'gzip', 'deflate', 'br').
49
- * @returns Decompressed buffer, or original if encoding is not recognized.
56
+ * @ru Декомпрессирует буфер с использованием Web API (DecompressionStream).
57
+ * Поддерживает gzip и deflate. Возвращает исходный буфер, если декомпрессия невозможна.
58
+ * @en Decompresses a buffer using Web API (DecompressionStream).
59
+ * Supports gzip and deflate. Returns the original buffer if decompression is not possible.
60
+ * @param input - The compressed Uint8Array.
61
+ * @param encoding - The compression encoding ('gzip', 'deflate').
62
+ * @returns The decompressed Uint8Array, or the original input if not applicable.
63
+ */
64
+ async function decompressOnceWeb(input, encoding) {
65
+ const enc = encoding.trim().toLowerCase();
66
+ if (typeof globalThis.DecompressionStream === "undefined")
67
+ return input;
68
+ const isGzip = enc === "gzip" || enc === "x-gzip";
69
+ const isDeflate = enc === "deflate";
70
+ if (!isGzip && !isDeflate)
71
+ return input;
72
+ const format = isGzip ? "gzip" : "deflate";
73
+ const inputStream = new ReadableStream({
74
+ start(controller) {
75
+ controller.enqueue(input);
76
+ controller.close();
77
+ },
78
+ });
79
+ const decompressedStream = inputStream.pipeThrough(new globalThis.DecompressionStream(format));
80
+ const reader = decompressedStream.getReader();
81
+ const chunks = [];
82
+ let totalLength = 0;
83
+ try {
84
+ while (true) {
85
+ const { done, value } = await reader.read();
86
+ if (done)
87
+ break;
88
+ if (value) {
89
+ chunks.push(value);
90
+ totalLength += value.byteLength;
91
+ }
92
+ }
93
+ }
94
+ finally {
95
+ reader.releaseLock();
96
+ }
97
+ if (chunks.length === 0)
98
+ return new Uint8Array(0);
99
+ if (chunks.length === 1)
100
+ return chunks[0];
101
+ const result = new Uint8Array(totalLength);
102
+ let offset = 0;
103
+ for (const chunk of chunks) {
104
+ result.set(chunk, offset);
105
+ offset += chunk.byteLength;
106
+ }
107
+ return result;
108
+ }
109
+ /**
110
+ * @ru Декомпрессирует буфер с использованием node:zlib.
111
+ * Поддерживает gzip, deflate и brotli.
112
+ * @en Decompresses a buffer using node:zlib.
113
+ * Supports gzip, deflate, and brotli.
114
+ * @param input - The compressed Uint8Array.
115
+ * @param encoding - The compression encoding.
116
+ * @returns The decompressed Uint8Array.
50
117
  */
51
- function decompressOnce(input, encoding) {
52
- const buffer = Buffer.from(input);
53
- switch (encoding) {
118
+ async function decompressOnceNode(input, encoding) {
119
+ const enc = encoding.trim().toLowerCase();
120
+ const zlib = await runtimeImport("node:zlib");
121
+ const buffer = Buffer.from(input.buffer, input.byteOffset, input.byteLength);
122
+ switch (enc) {
54
123
  case "gzip":
55
124
  case "x-gzip":
56
- return gunzipSync(buffer);
125
+ return new Uint8Array(zlib.gunzipSync(buffer));
57
126
  case "deflate":
58
- return inflateSync(buffer);
127
+ return new Uint8Array(zlib.inflateSync(buffer));
59
128
  case "br":
60
- return brotliDecompressSync(buffer);
129
+ return new Uint8Array(zlib.brotliDecompressSync(buffer));
61
130
  default:
62
131
  return input;
63
132
  }
64
133
  }
65
134
  /**
66
- * @ru Декомпрессирует буфер, последовательно применяя все кодировки из Content-Encoding.
67
- * @en Decompresses a buffer by sequentially applying all encodings from Content-Encoding.
68
- * @param body - Compressed buffer (Uint8Array).
69
- * @param encoding - Content-Encoding header value (e.g., 'gzip, deflate').
70
- * @returns Decompressed buffer with a no-op dump method.
135
+ * @ru Декомпрессирует буфер с поддержкой множественных кодировок.
136
+ * Сначала пытается Web API, затем fallback на node:zlib для серверных сред.
137
+ * @en Decompresses a buffer with support for multiple encodings.
138
+ * Tries Web API first, then falls back to node:zlib for server environments.
139
+ * @param body - The compressed Uint8Array.
140
+ * @param encoding - The Content-Encoding header value (e.g., 'gzip, br').
141
+ * @returns The decompressed buffer with dump() method attached.
71
142
  */
72
- export function decompressBuffer(body, encoding) {
143
+ export async function decompressBuffer(body, encoding) {
73
144
  let current = body;
74
- for (const enc of parseEncodings(encoding)) {
75
- current = decompressOnce(current, enc);
145
+ const encodings = parseEncodings(encoding);
146
+ for (let i = 0; i < encodings.length; i++) {
147
+ const enc = encodings[i];
148
+ const webResult = await decompressOnceWeb(current, enc);
149
+ if (webResult !== current) {
150
+ current = webResult;
151
+ continue;
152
+ }
153
+ if (IS_SERVER && (enc === "br" || enc === "gzip" || enc === "deflate" || enc === "x-gzip")) {
154
+ try {
155
+ current = await decompressOnceNode(current, enc);
156
+ }
157
+ catch {
158
+ continue;
159
+ }
160
+ }
76
161
  }
77
162
  return attachNoopDump(current);
78
163
  }
79
164
  /**
80
- * @ru Создаёт декомпрессирующий поток для тела ответа, поддерживая цепочку кодировок. Использует DecompressionStream (если доступен) или Node.js zlib.
81
- * @en Creates a decompressing stream for the response body, supporting chained encodings. Uses DecompressionStream (if available) or Node.js zlib.
82
- * @param body - Source compressed stream.
83
- * @param encoding - Content-Encoding header value.
84
- * @returns Transformed stream with a dump method that cancels the stream.
165
+ * @ru Создаёт декомпрессированный стрим с поддержкой множественных кодировок.
166
+ * Использует DecompressionStream для Web и node:zlib для Node.js.
167
+ * @en Creates a decompressed stream with support for multiple encodings.
168
+ * Uses DecompressionStream for Web and node:zlib for Node.js.
169
+ * @param body - The compressed ReadableStream.
170
+ * @param encoding - The Content-Encoding header value (e.g., 'gzip, br').
171
+ * @returns The decompressed stream with dump() method attached.
85
172
  */
86
- export function createDecompressStream(body, encoding) {
173
+ export async function createDecompressStream(body, encoding) {
174
+ const encodings = parseEncodings(encoding);
175
+ if (encodings.length === 0)
176
+ return attachStreamDump(body);
87
177
  let current = body;
88
- for (const enc of parseEncodings(encoding)) {
89
- if (enc === "gzip" || enc === "x-gzip") {
90
- if (typeof DecompressionStream !== "undefined") {
91
- current = current.pipeThrough(new DecompressionStream("gzip"));
92
- continue;
93
- }
94
- const nodeReadable = Readable.fromWeb(current);
95
- const decompressed = nodeReadable.pipe(createGunzip());
96
- current = Readable.toWeb(decompressed);
97
- continue;
178
+ for (let i = 0; i < encodings.length; i++) {
179
+ const enc = encodings[i];
180
+ const isGzip = enc === "gzip" || enc === "x-gzip";
181
+ const isDeflate = enc === "deflate";
182
+ const isBrotli = enc === "br";
183
+ if ((isGzip || isDeflate) && typeof globalThis.DecompressionStream !== "undefined") {
184
+ const format = isGzip ? "gzip" : "deflate";
185
+ current = current.pipeThrough(new globalThis.DecompressionStream(format));
98
186
  }
99
- if (enc === "deflate") {
100
- if (typeof DecompressionStream !== "undefined") {
101
- current = current.pipeThrough(new DecompressionStream("deflate"));
187
+ else if (IS_SERVER) {
188
+ try {
189
+ const { Readable } = await runtimeImport("node:stream");
190
+ const zlib = await runtimeImport("node:zlib");
191
+ const nodeReadableStream = Readable.fromWeb(current);
192
+ let transformer = nodeReadableStream;
193
+ if (isGzip)
194
+ transformer = nodeReadableStream.pipe(zlib.createGunzip());
195
+ else if (isDeflate)
196
+ transformer = nodeReadableStream.pipe(zlib.createInflate());
197
+ else if (isBrotli)
198
+ transformer = nodeReadableStream.pipe(zlib.createBrotliDecompress());
199
+ current = Readable.toWeb(transformer);
200
+ }
201
+ catch {
102
202
  continue;
103
203
  }
104
- const nodeReadable = Readable.fromWeb(current);
105
- const decompressed = nodeReadable.pipe(createInflate());
106
- current = Readable.toWeb(decompressed);
107
- continue;
108
- }
109
- if (enc === "br") {
110
- const nodeReadable = Readable.fromWeb(current);
111
- const decompressed = nodeReadable.pipe(createBrotliDecompress());
112
- current = Readable.toWeb(decompressed);
113
204
  }
114
205
  }
115
206
  return attachStreamDump(current);
@@ -1 +1 @@
1
- {"version":3,"file":"decompress.js","sourceRoot":"","sources":["../../src/utils/decompress.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decompress.js","sourceRoot":"","sources":["../../src/utils/decompress.ts"],"names":[],"mappings":"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"}
package/utils/errors.d.ts CHANGED
@@ -11,12 +11,6 @@ export declare class HttpClientError extends Error {
11
11
  /**
12
12
  * @ru Создает новый экземпляр HttpClientError.
13
13
  * @en Creates a new HttpClientError instance.
14
- * @param message - Human-readable error message text.
15
- * @param code - Internal stringified error state identifier code.
16
- * @param statusCode - Numerical HTTP response status code received from the server.
17
- * @param originalError - Raw captured exception instance causing this failure.
18
- * @param url - Targeted request URL destination string.
19
- * @param method - HTTP method verb utilized for the request.
20
14
  */
21
15
  constructor(message: string, code?: string, statusCode?: number | undefined, originalError?: Error | undefined, url?: string | undefined, method?: string | undefined);
22
16
  }
@@ -28,8 +22,6 @@ export declare class TimeoutError extends HttpClientError {
28
22
  /**
29
23
  * @ru Создает новый экземпляр TimeoutError.
30
24
  * @en Creates a new TimeoutError instance.
31
- * @param url - Targeted request URL destination string.
32
- * @param timeout - Threshold duration statement in milliseconds.
33
25
  */
34
26
  constructor(url: string, timeout: number);
35
27
  }
@@ -41,8 +33,6 @@ export declare class RateLimitError extends HttpClientError {
41
33
  /**
42
34
  * @ru Создает новый экземпляр RateLimitError.
43
35
  * @en Creates a new RateLimitError instance.
44
- * @param url - Targeted request URL destination string.
45
- * @param retryAfter - Optional cool-down period duration in milliseconds before the next retry attempt.
46
36
  */
47
37
  constructor(url: string, retryAfter?: number);
48
38
  }
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAa/B,IAAI,EAAE,MAAM;IACZ,UAAU,CAAC,EAAE,MAAM;IACnB,aAAa,CAAC,EAAE,KAAK;IACrB,GAAG,CAAC,EAAE,MAAM;IACZ,MAAM,CAAC,EAAE,MAAM;IAhBxB;;;;;;;;;OASG;gBAED,OAAO,EAAE,MAAM,EACR,IAAI,GAAE,MAAqB,EAC3B,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,aAAa,CAAC,EAAE,KAAK,YAAA,EACrB,GAAG,CAAC,EAAE,MAAM,YAAA,EACZ,MAAM,CAAC,EAAE,MAAM,YAAA;CAKzB;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C;;;;;OAKG;gBACS,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIzC;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,eAAe;IACjD;;;;;OAKG;gBACS,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAU7C"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,eAAgB,SAAQ,KAAK;IAO/B,IAAI,EAAE,MAAM;IACZ,UAAU,CAAC,EAAE,MAAM;IACnB,aAAa,CAAC,EAAE,KAAK;IACrB,GAAG,CAAC,EAAE,MAAM;IACZ,MAAM,CAAC,EAAE,MAAM;IAVxB;;;OAGG;gBAED,OAAO,EAAE,MAAM,EACR,IAAI,GAAE,MAAqB,EAC3B,UAAU,CAAC,EAAE,MAAM,YAAA,EACnB,aAAa,CAAC,EAAE,KAAK,YAAA,EACrB,GAAG,CAAC,EAAE,MAAM,YAAA,EACZ,MAAM,CAAC,EAAE,MAAM,YAAA;CAKzB;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C;;;OAGG;gBACS,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;CAIzC;AAED;;;GAGG;AACH,qBAAa,cAAe,SAAQ,eAAe;IACjD;;;OAGG;gBACS,GAAG,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM;CAU7C"}
package/utils/errors.js CHANGED
@@ -11,15 +11,9 @@ export class HttpClientError extends Error {
11
11
  /**
12
12
  * @ru Создает новый экземпляр HttpClientError.
13
13
  * @en Creates a new HttpClientError instance.
14
- * @param message - Human-readable error message text.
15
- * @param code - Internal stringified error state identifier code.
16
- * @param statusCode - Numerical HTTP response status code received from the server.
17
- * @param originalError - Raw captured exception instance causing this failure.
18
- * @param url - Targeted request URL destination string.
19
- * @param method - HTTP method verb utilized for the request.
20
14
  */
21
15
  constructor(message, code = "HTTP_ERROR", statusCode, originalError, url, method) {
22
- super(message);
16
+ super(message, originalError ? { cause: originalError } : undefined);
23
17
  this.code = code;
24
18
  this.statusCode = statusCode;
25
19
  this.originalError = originalError;
@@ -36,8 +30,6 @@ export class TimeoutError extends HttpClientError {
36
30
  /**
37
31
  * @ru Создает новый экземпляр TimeoutError.
38
32
  * @en Creates a new TimeoutError instance.
39
- * @param url - Targeted request URL destination string.
40
- * @param timeout - Threshold duration statement in milliseconds.
41
33
  */
42
34
  constructor(url, timeout) {
43
35
  super(`Timeout after ${timeout}ms`, "TIMEOUT", 408, undefined, url);
@@ -52,8 +44,6 @@ export class RateLimitError extends HttpClientError {
52
44
  /**
53
45
  * @ru Создает новый экземпляр RateLimitError.
54
46
  * @en Creates a new RateLimitError instance.
55
- * @param url - Targeted request URL destination string.
56
- * @param retryAfter - Optional cool-down period duration in milliseconds before the next retry attempt.
57
47
  */
58
48
  constructor(url, retryAfter) {
59
49
  super(`Rate limited${retryAfter ? ` retry in ${retryAfter}ms` : ""}`, "RATE_LIMIT", 429, undefined, url);
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAa/B;IACA;IACA;IACA;IACA;IAhBT;;;;;;;;;OASG;IACH,YACE,OAAe,EACR,OAAe,YAAY,EAC3B,UAAmB,EACnB,aAAqB,EACrB,GAAY,EACZ,MAAe;QAEtB,KAAK,CAAC,OAAO,CAAC,CAAC;QANR,SAAI,GAAJ,IAAI,CAAuB;QAC3B,eAAU,GAAV,UAAU,CAAS;QACnB,kBAAa,GAAb,aAAa,CAAQ;QACrB,QAAG,GAAH,GAAG,CAAS;QACZ,WAAM,GAAN,MAAM,CAAS;QAGtB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,eAAe;IAC/C;;;;;OAKG;IACH,YAAY,GAAW,EAAE,OAAe;QACtC,KAAK,CAAC,iBAAiB,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD;;;;;OAKG;IACH,YAAY,GAAW,EAAE,UAAmB;QAC1C,KAAK,CACH,eAAe,UAAU,CAAC,CAAC,CAAC,aAAa,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAC9D,YAAY,EACZ,GAAG,EACH,SAAS,EACT,GAAG,CACJ,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAO/B;IACA;IACA;IACA;IACA;IAVT;;;OAGG;IACH,YACE,OAAe,EACR,OAAe,YAAY,EAC3B,UAAmB,EACnB,aAAqB,EACrB,GAAY,EACZ,MAAe;QAEtB,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAN9D,SAAI,GAAJ,IAAI,CAAuB;QAC3B,eAAU,GAAV,UAAU,CAAS;QACnB,kBAAa,GAAb,aAAa,CAAQ;QACrB,QAAG,GAAH,GAAG,CAAS;QACZ,WAAM,GAAN,MAAM,CAAS;QAGtB,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;IAChC,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,YAAa,SAAQ,eAAe;IAC/C;;;OAGG;IACH,YAAY,GAAW,EAAE,OAAe;QACtC,KAAK,CAAC,iBAAiB,OAAO,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;CACF;AAED;;;GAGG;AACH,MAAM,OAAO,cAAe,SAAQ,eAAe;IACjD;;;OAGG;IACH,YAAY,GAAW,EAAE,UAAmB;QAC1C,KAAK,CACH,eAAe,UAAU,CAAC,CAAC,CAAC,aAAa,UAAU,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,EAC9D,YAAY,EACZ,GAAG,EACH,SAAS,EACT,GAAG,CACJ,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF"}
package/utils/merge.d.ts CHANGED
@@ -1,9 +1,6 @@
1
1
  /**
2
2
  * @ru Рекурсивно объединяет два объекта. Избегает лишних аллокаций памяти и защищает от разделения ссылок nested-структур.
3
3
  * @en Recursively merges two objects. Avoids redundant memory allocations and prevents shared reference leakage for nested structures.
4
- * @param target - Foundational target base object layout.
5
- * @param source - High-priority source object containing overrides.
6
- * @returns New deeply merged intersection object.
7
4
  */
8
5
  export declare function deepMerge<T extends Record<string, unknown>, S extends Record<string, unknown>>(target: T, source: S): T & S;
9
6
  //# sourceMappingURL=merge.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/utils/merge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,SAAS,CACvB,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAuB7B"}
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/utils/merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5F,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,CAAC,GACR,CAAC,GAAG,CAAC,CAoBP"}
package/utils/merge.js CHANGED
@@ -1,29 +1,20 @@
1
1
  /**
2
2
  * @ru Рекурсивно объединяет два объекта. Избегает лишних аллокаций памяти и защищает от разделения ссылок nested-структур.
3
3
  * @en Recursively merges two objects. Avoids redundant memory allocations and prevents shared reference leakage for nested structures.
4
- * @param target - Foundational target base object layout.
5
- * @param source - High-priority source object containing overrides.
6
- * @returns New deeply merged intersection object.
7
4
  */
8
5
  export function deepMerge(target, source) {
9
6
  const output = { ...target };
10
- if (isObject(target) && isObject(source)) {
11
- for (const key in source) {
12
- if (Object.prototype.hasOwnProperty.call(source, key)) {
13
- const sourceValue = source[key];
14
- const targetValue = output[key];
15
- if (isObject(sourceValue)) {
16
- if (key in output && isObject(targetValue)) {
17
- output[key] = deepMerge(targetValue, sourceValue);
18
- }
19
- else {
20
- output[key] = deepMerge({}, sourceValue);
21
- }
22
- }
23
- else if (sourceValue !== undefined) {
24
- output[key] = sourceValue;
25
- }
26
- }
7
+ for (const key of Object.keys(source)) {
8
+ const sourceValue = source[key];
9
+ const targetValue = output[key];
10
+ if (isObject(sourceValue) && isObject(targetValue)) {
11
+ output[key] = deepMerge(targetValue, sourceValue);
12
+ continue;
13
+ }
14
+ if (sourceValue !== undefined) {
15
+ output[key] = isObject(sourceValue)
16
+ ? deepMerge({}, sourceValue)
17
+ : sourceValue;
27
18
  }
28
19
  }
29
20
  return output;
@@ -31,9 +22,8 @@ export function deepMerge(target, source) {
31
22
  /**
32
23
  * @ru Быстрая проверка, является ли переданный элемент чистым объектом (исключая массивы и null).
33
24
  * @en Fast check verifying if the provided item is a plain object layout (excluding arrays and null).
34
- * @param item - Evaluated runtime variable value context.
35
25
  */
36
26
  function isObject(item) {
37
- return typeof item === "object" && item !== null && !Array.isArray(item);
27
+ return Object.prototype.toString.call(item) === "[object Object]";
38
28
  }
39
29
  //# sourceMappingURL=merge.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/utils/merge.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,SAAS,CAGvB,MAAS,EAAE,MAAS;IACpB,MAAM,MAAM,GAAG,EAAE,GAAG,MAAM,EAA6B,CAAC;IAExD,IAAI,QAAQ,CAAC,MAAM,CAAC,IAAI,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC;gBACtD,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAChC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;gBAEhC,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;oBAC1B,IAAI,GAAG,IAAI,MAAM,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;wBAC3C,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;oBACpD,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,EAAE,EAAE,WAAW,CAAC,CAAC;oBAC3C,CAAC;gBACH,CAAC;qBAAM,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;oBACrC,MAAM,CAAC,GAAG,CAAC,GAAG,WAAW,CAAC;gBAC5B,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAe,CAAC;AACzB,CAAC;AAED;;;;GAIG;AACH,SAAS,QAAQ,CAAC,IAAa;IAC7B,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;AAC3E,CAAC"}
1
+ {"version":3,"file":"merge.js","sourceRoot":"","sources":["../../src/utils/merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CACvB,MAAS,EACT,MAAS;IAET,MAAM,MAAM,GAA4B,EAAE,GAAG,MAAM,EAAE,CAAC;IACtD,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACtC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,WAAW,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QAChC,IAAI,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACnD,MAAM,CAAC,GAAG,CAAC,GAAG,SAAS,CACrB,WAAsC,EACtC,WAAsC,CACvC,CAAC;YACF,SAAS;QACX,CAAC;QAED,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,CAAC,GAAG,QAAQ,CAAC,WAAW,CAAC;gBACjC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,WAAsC,CAAC;gBACvD,CAAC,CAAC,WAAW,CAAC;QAClB,CAAC;IACH,CAAC;IACD,OAAO,MAAe,CAAC;AACzB,CAAC;AAED;;;GAGG;AACH,SAAS,QAAQ,CAAC,IAAa;IAC7B,OAAO,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,iBAAiB,CAAC;AACpE,CAAC"}
@@ -1,33 +1,52 @@
1
1
  import type { Method, RequestBodyData } from "@hyperttp/types";
2
- export type NormalizedBody = string | Uint8Array | ArrayBuffer | FormData | URLSearchParams | ReadableStream | Blob | null | undefined;
2
+ type NormalizedHeaders = Record<string, string | string[]>;
3
3
  /**
4
- * @ru Нормализует метод HTTP: приводит к верхнему регистру, использует кэш для часто встречающихся методов.
5
- * @en Normalizes an HTTP method: converts to uppercase, uses cache for common methods.
6
- * @param method - Raw method string (e.g., 'get', 'POST').
7
- * @returns Normalized uppercase method.
4
+ * @ru Нормализует HTTP-метод в верхний регистр с кэшированием.
5
+ * @en Normalizes HTTP method to uppercase with caching.
6
+ * @param method - The HTTP method string (e.g., 'get', 'POST').
7
+ * @returns The normalized HTTP method in uppercase.
8
8
  */
9
9
  export declare function normalizeMethod(method: string): Method;
10
10
  /**
11
- * @ru Извлекает URL из объекта запроса или строки. Поддерживает поля url, _url, или комбинацию scheme/host/path.
12
- * @en Extracts a URL from a request object or string. Supports url, _url fields, or scheme/host/path combination.
13
- * @param req - Request object or URL string.
14
- * @returns Normalized URL string.
15
- * @throws If URL cannot be resolved.
11
+ * @ru Извлекает URL из объекта запроса или строки.
12
+ * Поддерживает различные форматы: строка, объект с полем `url`, `_url`, или `scheme/host/path`.
13
+ * @en Extracts URL from a request object or string.
14
+ * Supports various formats: string, object with `url`, `_url`, or `scheme/host/path` fields.
15
+ * @param req - The request object or URL string.
16
+ * @returns The extracted URL string.
17
+ * @throws Error if URL is missing in the request.
16
18
  */
17
- export declare function normalizeUrl(req: any): string;
19
+ export declare function normalizeUrl(req: unknown): string;
18
20
  /**
19
- * @ru Нормализует заголовки из различных форматов (массив, объект) в единый объект с правильной обработкой множественных значений (cookie, set-cookie).
20
- * @en Normalizes headers from various formats (array, object) into a single object with proper handling of multi-value headers (cookie, set-cookie).
21
- * @param headers - Raw headers in array or object format.
22
- * @returns Normalized headers object where values are strings or arrays of strings (for set-cookie).
21
+ * @ru Нормализует заголовки запроса в единый формат с ключами в нижнем регистре.
22
+ * Поддерживает различные входные форматы: объект, массив пар, плоский массив.
23
+ *
24
+ * Специальные правила:
25
+ * - `set-cookie` всегда хранится как массив
26
+ * - `cookie`/`cookie2` объединяются через `; `
27
+ * - Остальные множественные заголовки объединяются через `, `
28
+ * - Заголовки из SINGLE_VALUE_HEADERS перезаписываются (не объединяются)
29
+ *
30
+ * @en Normalizes request headers into a unified format with lowercase keys.
31
+ * Supports various input formats: object, array of pairs, flat array.
32
+ *
33
+ * Special rules:
34
+ * - `set-cookie` is always stored as an array
35
+ * - `cookie`/`cookie2` are joined with `; `
36
+ * - Other multiple headers are joined with `, `
37
+ * - Headers from SINGLE_VALUE_HEADERS are overwritten (not merged)
38
+ *
39
+ * @param headers - The headers to normalize (object, array of pairs, or flat array).
40
+ * @returns Normalized headers object with lowercase keys.
23
41
  */
24
- export declare function normalizeHeaders(headers: unknown): Record<string, string | string[]>;
42
+ export declare function normalizeHeaders(headers: unknown): NormalizedHeaders;
25
43
  /**
26
- * @ru Нормализует тело запроса: для методов GET и HEAD тело всегда undefined, для остальных возвращает переданное тело.
27
- * @en Normalizes request body: for GET and HEAD methods body is always undefined, for others returns the provided body.
28
- * @param method - HTTP method.
29
- * @param body - Raw request body.
30
- * @returns Normalized body or undefined.
44
+ * @ru Нормализует тело запроса, удаляя его для методов GET и HEAD.
45
+ * @en Normalizes request body by removing it for GET and HEAD methods.
46
+ * @param method - The HTTP method.
47
+ * @param body - The request body data.
48
+ * @returns The body for methods that support it, or undefined for GET/HEAD.
31
49
  */
32
50
  export declare function normalizeBody(method: Method, body: RequestBodyData | undefined): RequestBodyData | undefined;
51
+ export {};
33
52
  //# sourceMappingURL=normalize.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE/D,MAAM,MAAM,cAAc,GACtB,MAAM,GACN,UAAU,GACV,WAAW,GACX,QAAQ,GACR,eAAe,GACf,cAAc,GACd,IAAI,GACJ,IAAI,GACJ,SAAS,CAAC;AA+Cd;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAItD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,GAAG,GAAG,MAAM,CAY7C;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,GACf,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CA+HnC;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,eAAe,GAAG,SAAS,GAChC,eAAe,GAAG,SAAS,CAK7B"}
1
+ {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAE/D,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;AAqH3D;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAGtD;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAwBjD;AAmED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,GAAG,iBAAiB,CAqDpE;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,eAAe,GAAG,SAAS,GAChC,eAAe,GAAG,SAAS,CAE7B"}