@hyperttp/core 1.4.8 → 1.5.1

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 (48) hide show
  1. package/Core/HyperCore.d.ts +66 -124
  2. package/Core/HyperCore.d.ts.map +1 -1
  3. package/Core/HyperCore.js +2 -576
  4. package/Core/HyperCore.js.map +7 -1
  5. package/Core/RequestBuilder.d.ts +36 -0
  6. package/Core/RequestBuilder.d.ts.map +1 -0
  7. package/Core/RequestBuilder.js +2 -0
  8. package/Core/RequestBuilder.js.map +7 -0
  9. package/Core/index.js +2 -2
  10. package/Core/index.js.map +7 -1
  11. package/README.md +30 -0
  12. package/defaultConfig.d.ts +4 -0
  13. package/defaultConfig.d.ts.map +1 -1
  14. package/defaultConfig.js +2 -19
  15. package/defaultConfig.js.map +7 -1
  16. package/index.js +2 -3
  17. package/index.js.map +7 -1
  18. package/package.json +2 -2
  19. package/transports/browser.d.ts.map +1 -1
  20. package/transports/browser.js +2 -113
  21. package/transports/browser.js.map +7 -1
  22. package/transports/manager.d.ts +0 -33
  23. package/transports/manager.d.ts.map +1 -1
  24. package/transports/manager.js +7 -349
  25. package/transports/manager.js.map +7 -1
  26. package/transports/node.d.ts +1 -0
  27. package/transports/node.d.ts.map +1 -1
  28. package/transports/node.js +2 -380
  29. package/transports/node.js.map +7 -1
  30. package/utils/errors.d.ts +0 -11
  31. package/utils/errors.d.ts.map +1 -1
  32. package/utils/errors.js +2 -53
  33. package/utils/errors.js.map +7 -1
  34. package/utils/merge.js +2 -29
  35. package/utils/merge.js.map +7 -1
  36. package/utils/normalize.d.ts +22 -39
  37. package/utils/normalize.d.ts.map +1 -1
  38. package/utils/normalize.js +2 -285
  39. package/utils/normalize.js.map +7 -1
  40. package/utils/pipeline.js +2 -193
  41. package/utils/pipeline.js.map +7 -1
  42. package/utils/response.d.ts +49 -73
  43. package/utils/response.d.ts.map +1 -1
  44. package/utils/response.js +2 -389
  45. package/utils/response.js.map +7 -1
  46. package/utils/retryUtils.d.ts.map +1 -1
  47. package/utils/retryUtils.js +2 -55
  48. package/utils/retryUtils.js.map +7 -1
@@ -1 +1,7 @@
1
- {"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../../src/utils/pipeline.ts"],"names":[],"mappings":"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"}
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/pipeline.ts"],
4
+ "sourcesContent": ["import type {\n HyperPlugin,\n PluginContext,\n InternalRequest,\n HttpResponse,\n HyperttpError,\n HttpClientOptions,\n TransportResponse,\n} from \"@hyperttp/types\";\n\n/**\n * @ru \u0421\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430 \u0437\u0430\u043F\u0438\u0441\u0438 \u0445\u0443\u043A\u0430 \u0441 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u043C\u0438 \u0434\u043B\u044F \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0438.\n * @en Hook record structure with metadata for optimization and sorting.\n */\nexport interface HookRecord<T> {\n /** @ru \u0423\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0438\u043C\u044F \u0445\u0443\u043A\u0430. @en Unique hook name. */\n readonly name: string;\n /** @ru \u041F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F (\u0432\u044B\u0448\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u2014 \u0440\u0430\u043D\u044C\u0448\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435). @en Execution priority (higher value runs earlier). */\n readonly priority: number;\n /** @ru \u0424\u0443\u043D\u043A\u0446\u0438\u044F-\u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A. @en Handler function. */\n readonly run: T;\n}\n\n/**\n * @ru \u041A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440\u043E\u0432 \u0434\u043B\u044F \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0445 \u0444\u0430\u0437 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u0437\u0430\u043F\u0440\u043E\u0441\u0430/\u043E\u0442\u0432\u0435\u0442\u0430.\n * @en Pipeline container for different request/response processing phases.\n */\nexport interface PipelineContainer {\n /** @ru \u0425\u0443\u043A\u0438, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u043E\u0439 \u0437\u0430\u043F\u0440\u043E\u0441\u0430. @en Hooks executed before sending the request. */\n readonly request: HookRecord<Required<HyperPlugin>[\"onRequest\"]>[];\n /** @ru \u0425\u0443\u043A\u0438, \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u0441\u044B\u0440\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430. @en Hooks processing raw transport data. */\n readonly responseData: HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[];\n /** @ru \u0425\u0443\u043A\u0438, \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u043E\u0442\u0432\u0435\u0442 (\u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435). @en Hooks that mutate the response (sequential execution). */\n readonly responseMutators: HookRecord<Required<HyperPlugin>[\"onResponse\"]>[];\n /** @ru \u0425\u0443\u043A\u0438 \u0441 \u043F\u043E\u0431\u043E\u0447\u043D\u044B\u043C\u0438 \u044D\u0444\u0444\u0435\u043A\u0442\u0430\u043C\u0438 (\u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u0432 \u0444\u043E\u043D\u0435). @en Side-effect hooks (executed in the background). */\n readonly responseSideEffects: HookRecord<Required<HyperPlugin>[\"onResponse\"]>[];\n /** @ru \u0425\u0443\u043A\u0438 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043E\u0448\u0438\u0431\u043E\u043A. @en Error interception hooks. */\n readonly error: HookRecord<Required<HyperPlugin>[\"onError\"]>[];\n}\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043F\u0443\u0441\u0442\u043E\u0439 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u0434\u043B\u044F \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440\u043E\u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432.\n * @en Creates an empty container for plugin pipelines.\n * @returns An empty pipeline container.\n */\nexport function createPipelines(): PipelineContainer {\n return {\n request: [],\n responseData: [],\n responseMutators: [],\n responseSideEffects: [],\n error: [],\n };\n}\n\n/**\n * @ru \u0412\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0445\u0443\u043A \u0432 \u043C\u0430\u0441\u0441\u0438\u0432 \u0441 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435\u043C \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0438 \u043F\u043E \u0443\u0431\u044B\u0432\u0430\u043D\u0438\u044E \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u0430 (\u0434\u0435\u0440\u0435\u0432\u044C\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0442\u0443\u0442 \u0438\u0437\u0431\u044B\u0442\u043E\u0447\u043D\u044B).\n * @en Inserts a hook into the array maintaining descending priority order.\n * @param list - Target array to insert into.\n * @param hook - Hook record to insert.\n */\nexport function insertHookSorted<T>(list: HookRecord<T>[], hook: HookRecord<T>): void {\n const len = list.length;\n let i = 0;\n while (i < len && list[i]!.priority >= hook.priority) {\n i++;\n }\n list.splice(i, 0, hook);\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u0440\u0435\u0434-\u0437\u0430\u043F\u0440\u043E\u0441\u0430. \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 short-circuit.\n * @en Executes the pre-request pipeline. Supports short-circuiting.\n */\nexport function executeRequestPipeline(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onRequest\"]>[],\n req: InternalRequest,\n ctx: PluginContext,\n): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null {\n const len = hooks.length;\n if (len === 0) return null;\n for (let i = 0; i < len; i++) {\n const hook = hooks[i]!;\n const res = hook.run(req, ctx);\n if (res !== null && res !== undefined) {\n if (res instanceof Promise) {\n return executeRequestPipelineAsync(hooks, req, ctx, i, res);\n }\n return res;\n }\n }\n return null;\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043D\u0438\u0437\u043A\u043E\u0443\u0440\u043E\u0432\u043D\u0435\u0432\u044B\u0439 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u0441\u044B\u0440\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 (\u0444\u0430\u0437\u0430 DATA).\n * @en Executes low-level transport data transformation pipeline (DATA phase).\n */\nexport function executeResponseDataPipeline(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[],\n res: TransportResponse,\n ctx: PluginContext,\n): Promise<TransportResponse> | TransportResponse {\n const len = hooks.length;\n if (len === 0) return res;\n let currentRes = res;\n for (let i = 0; i < len; i++) {\n const result = hooks[i]!.run(currentRes, ctx);\n if (result instanceof Promise) {\n return executeResponseDataPipelineAsync(hooks, ctx, i, result, currentRes);\n }\n if (result != null) {\n currentRes = result;\n }\n }\n return currentRes;\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u043E\u0441\u0442-\u043E\u0442\u0432\u0435\u0442\u0430. \u0420\u0430\u0437\u0434\u0435\u043B\u0435\u043D \u043D\u0430 \u043C\u0443\u0442\u0430\u0442\u043E\u0440\u044B \u0438 \u0441\u0430\u0439\u0434-\u044D\u0444\u0444\u0435\u043A\u0442\u044B.\n * @en Executes the post-response pipeline. Split into mutators and side-effects.\n */\nexport function executeResponsePipeline(\n mutators: readonly HookRecord<Required<HyperPlugin>[\"onResponse\"]>[],\n sideEffects: readonly HookRecord<Required<HyperPlugin>[\"onResponse\"]>[],\n res: HttpResponse<unknown>,\n req: InternalRequest,\n ctx: PluginContext,\n logger?: HttpClientOptions[\"logger\"],\n): Promise<void> | void {\n const seLen = sideEffects.length;\n if (seLen > 0) {\n for (let i = 0; i < seLen; i++) {\n const effect = sideEffects[i]!;\n try {\n const promise = effect.run(res, req, ctx);\n if (promise instanceof Promise) {\n safelyAttachSideEffectCatch(promise, effect.name, logger);\n }\n } catch (err) {\n handleSideEffectError(err, effect.name, logger);\n }\n }\n }\n const mutLen = mutators.length;\n if (mutLen > 0) {\n for (let i = 0; i < mutLen; i++) {\n const result = mutators[i]!.run(res, req, ctx);\n if (result instanceof Promise) {\n return executeMutatorsAsync(mutators, res, req, ctx, i, result);\n }\n }\n }\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043E\u0448\u0438\u0431\u043E\u043A.\n * @en Executes the error interception pipeline.\n */\nexport function executeErrorPipeline(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onError\"]>[],\n error: HyperttpError,\n req: InternalRequest,\n ctx: PluginContext,\n): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null {\n const len = hooks.length;\n if (len === 0) return null;\n for (let i = 0; i < len; i++) {\n const res = hooks[i]!.run(error, req, ctx);\n if (res instanceof Promise) {\n return executeErrorPipelineAsync(hooks, error, req, ctx, i, res);\n }\n if (res != null) return res;\n }\n return null;\n}\n\nasync function executeRequestPipelineAsync(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onRequest\"]>[],\n req: InternalRequest,\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<HttpResponse<unknown> | void>,\n): Promise<HttpResponse<unknown> | null> {\n const shortCircuit = await initialPromise;\n if (shortCircuit != null) return shortCircuit;\n const len = hooks.length;\n for (let i = startIndex + 1; i < len; i++) {\n const res = hooks[i]!.run(req, ctx);\n if (res instanceof Promise) {\n const asyncRes = await res;\n if (asyncRes != null) return asyncRes;\n } else if (res != null) {\n return res;\n }\n }\n return null;\n}\n\nasync function executeResponseDataPipelineAsync(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[],\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<TransportResponse | void>,\n lastRes: TransportResponse,\n): Promise<TransportResponse> {\n let currentRes = lastRes;\n const firstAsyncResult = await initialPromise;\n if (firstAsyncResult != null) {\n currentRes = firstAsyncResult;\n }\n const len = hooks.length;\n for (let i = startIndex + 1; i < len; i++) {\n const result = hooks[i]!.run(currentRes, ctx);\n if (result instanceof Promise) {\n const asyncResult = await result;\n if (asyncResult != null) {\n currentRes = asyncResult;\n }\n } else if (result != null) {\n currentRes = result;\n }\n }\n return currentRes;\n}\n\nasync function executeMutatorsAsync(\n mutators: readonly HookRecord<Required<HyperPlugin>[\"onResponse\"]>[],\n res: HttpResponse<unknown>,\n req: InternalRequest,\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<unknown>,\n): Promise<void> {\n await initialPromise;\n const len = mutators.length;\n for (let i = startIndex + 1; i < len; i++) {\n const result = mutators[i]!.run(res, req, ctx);\n if (result instanceof Promise) {\n await result;\n }\n }\n}\n\nasync function executeErrorPipelineAsync(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onError\"]>[],\n error: HyperttpError,\n req: InternalRequest,\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<HttpResponse<unknown> | void>,\n): Promise<HttpResponse<unknown> | null> {\n const recovered = await initialPromise;\n if (recovered != null) return recovered;\n const len = hooks.length;\n for (let i = startIndex + 1; i < len; i++) {\n const res = hooks[i]!.run(error, req, ctx);\n if (res instanceof Promise) {\n const asyncRes = await res;\n if (asyncRes != null) return asyncRes;\n } else if (res != null) {\n return res;\n }\n }\n return null;\n}\n\nfunction safelyAttachSideEffectCatch(\n promise: Promise<unknown>,\n hookName: string,\n logger?: HttpClientOptions[\"logger\"],\n): void {\n promise.catch((err) => handleSideEffectError(err, hookName, logger));\n}\n\nfunction handleSideEffectError(\n err: unknown,\n hookName: string,\n logger?: HttpClientOptions[\"logger\"],\n): void {\n const errorObject = err instanceof Error ? err : new Error(String(err));\n if (logger) {\n logger(\"warn\", `Background hook \"${hookName}\" crashed: ${errorObject.message}`, errorObject);\n } else {\n console.warn(`[Hyperttp] Background hook \"${hookName}\" crashed:`, errorObject);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["list", "hook", "len", "i", "hooks", "req", "ctx", "res", "executeRequestPipelineAsync", "currentRes", "result", "executeResponseDataPipelineAsync", "mutators", "sideEffects", "logger", "seLen", "effect", "promise", "safelyAttachSideEffectCatch", "err", "handleSideEffectError", "mutLen", "executeMutatorsAsync", "error", "executeErrorPipelineAsync", "startIndex", "initialPromise", "shortCircuit", "asyncRes", "lastRes", "firstAsyncResult", "asyncResult", "recovered", "hookName", "errorObject"]
7
+ }
@@ -1,116 +1,94 @@
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
- }
3
+ declare const RAW_CACHE: unique symbol;
17
4
  declare const TEXT_CACHE: unique symbol;
18
5
  declare const JSON_CACHE: unique symbol;
19
- declare const ARRAY_BUFFER_CACHE: unique symbol;
20
6
  type CacheHolder = {
7
+ [RAW_CACHE]?: Uint8Array;
21
8
  [TEXT_CACHE]?: string;
22
9
  [JSON_CACHE]?: unknown;
23
- [ARRAY_BUFFER_CACHE]?: ArrayBuffer | SharedArrayBuffer;
24
10
  };
25
11
  /**
26
- * @ru Высокопроизводительное глубокое клонирование тела ответа.
27
- * Избегает накладных расходов structuredClone для простых объектов.
28
- * @en High-performance deep cloning of the response body.
29
- * Avoids structuredClone overhead for simple objects.
30
- * @template T - The type of the body.
31
- * @param body - The body to clone.
32
- * @returns The cloned body.
12
+ * @ru Быстрое клонирование тела ответа с поддержкой structuredClone, JSON и ручного копирования.
13
+ * @en Fast response body clone supporting structuredClone, JSON, and manual copy.
14
+ * @param body - The body value to clone.
15
+ * @returns Cloned body.
33
16
  */
34
17
  export declare const cloneBodyFast: <T>(body: T) => T;
35
18
  /**
36
- * @ru Высокопроизводительный контейнер HTTP-ответа с ленивым парсингом и кэшированием.
37
- * Гарантирует идентичный API чтения тела ответа во всех рантаймах.
38
- * @en High-performance HTTP response container with lazy parsing and caching.
39
- * Guarantees identical response body reading API across all runtimes.
40
- * @template T - Expected type of the parsed response body.
19
+ * @ru Реализация HttpResponse с ленивым потреблением тела, кэшированием raw/text/json и поддержкой пулинга.
20
+ * @en HttpResponse implementation with lazy body consumption, raw/text/json caching, and pooling support.
41
21
  */
42
22
  export declare class HyperHttpResponse<T = unknown> implements HttpResponse<T>, CacheHolder {
43
23
  status: number;
44
24
  headers: Record<string, string | string[]>;
45
- /**
46
- * @ru Тело ответа. Может быть распарсенным типом T, потоком HyperBody, буфером Uint8Array или null.
47
- * @en Response body. Can be the parsed type T, a HyperBody stream, Uint8Array buffer, or null.
48
- */
49
25
  body: T | HyperBody | Uint8Array | null;
50
26
  url: string;
51
27
  data: T | null;
28
+ [RAW_CACHE]: Uint8Array | undefined;
52
29
  [TEXT_CACHE]: string | undefined;
53
30
  [JSON_CACHE]: unknown | undefined;
54
- [ARRAY_BUFFER_CACHE]: ArrayBuffer | SharedArrayBuffer | undefined;
55
31
  private _bodyConsumed;
56
32
  private _raw;
33
+ constructor(rawResponse?: TransportResponse);
57
34
  /**
58
- * @ru Создаёт экземпляр ответа из сырых данных транспорта.
59
- * @en Creates a response instance from raw transport data.
60
- * @param rawResponse - The raw response from the transport layer.
61
- */
62
- constructor(rawResponse: TransportResponse);
63
- /**
64
- * @ru Лениво вычитывает и кэширует тело ответа в виде ArrayBuffer и текста.
65
- * @en Lazily consumes and caches the response body as ArrayBuffer and text.
35
+ * @ru Инициализирует ответ из транспортного ответа. Сбрасывает все кэши.
36
+ * @en Initializes the response from a transport response. Resets all caches.
37
+ * @param rawResponse - The raw transport response.
38
+ * @returns This instance for chaining.
66
39
  */
40
+ init(rawResponse: TransportResponse): this;
67
41
  private _consumeBody;
68
42
  /**
69
- * @ru Возвращает тело ответа как ArrayBuffer. Результат кэшируется.
70
- * @en Returns the response body as an ArrayBuffer. Result is cached.
71
- * @returns Promise resolving to the ArrayBuffer or SharedArrayBuffer.
43
+ * @ru Возвращает тело ответа как ArrayBuffer, потребляя его при необходимости.
44
+ * @en Returns the response body as ArrayBuffer, consuming it if necessary.
45
+ * @returns Promise resolving to an ArrayBuffer.
72
46
  */
73
- arrayBuffer(): Promise<ArrayBuffer | SharedArrayBuffer>;
47
+ arrayBuffer(): Promise<ArrayBuffer>;
74
48
  /**
75
- * @ru Возвращает тело ответа как текст. Результат кэшируется.
76
- * @en Returns the response body as text. Result is cached.
77
- * @returns Promise resolving to the text string.
49
+ * @ru Возвращает тело ответа как строку с кэшированием.
50
+ * @en Returns the response body as text with caching.
51
+ * @returns Promise resolving to the decoded text.
78
52
  */
79
53
  text(): Promise<string>;
80
54
  /**
81
- * @ru Парсит тело ответа как JSON. Результат кэшируется.
82
- * @en Parses the response body as JSON. Result is cached.
83
- * @template TJson - Expected type of the parsed JSON.
84
- * @returns Promise resolving to the parsed JSON object.
55
+ * @ru Возвращает тело ответа, разобранное как JSON. Для объектов возвращает их напрямую (без потребления).
56
+ * @en Returns the response body parsed as JSON. Returns objects directly (no consumption).
57
+ * @returns Promise resolving to the parsed JSON value.
85
58
  */
86
59
  json<TJson = T>(): Promise<TJson>;
87
60
  /**
88
- * @ru Отбрасывает тело ответа для освобождения ресурсов (сокета).
89
- * @en Discards the response body to free up resources (socket).
90
- * @returns Promise that resolves when the body is drained.
61
+ * @ru Сбрасывает тело ответа (для стримов — отменяет/cancel).
62
+ * @en Discards the response body (cancels streams).
63
+ * @returns Promise that resolves when the body is discarded.
91
64
  */
92
65
  dump(): Promise<void>;
93
66
  /**
94
- * @ru Создаёт глубокую изолированную копию ответа.
95
- * Для стримов использует tee() для безопасного раздвоения потока.
96
- * @en Creates a deep isolated copy of the response.
97
- * Uses tee() for streams to safely duplicate the flow.
98
- * @returns A new HttpResponse instance with cloned data.
67
+ * @ru Клонирует ответ с разделением стримов через tee().
68
+ * @en Clones the response, splitting streams via tee().
69
+ * @returns A new HttpResponse instance.
99
70
  */
100
71
  clone(): HttpResponse<T>;
101
72
  }
73
+ export declare const responsePool: HyperHttpResponse<any>[];
102
74
  /**
103
- * @ru Быстрое создание экземпляра HyperHttpResponse из сырого ответа транспорта.
104
- * @en Fast creation of a HyperHttpResponse instance from a raw transport response.
75
+ * @ru Создаёт HttpResponse из транспортного ответа с переиспользованием пула.
76
+ * @en Creates an HttpResponse from a transport response reusing the pool.
105
77
  * @param rawResponse - The raw transport response.
106
- * @returns A new HyperHttpResponse instance.
78
+ * @returns An HttpResponse instance.
107
79
  */
108
80
  export declare const mapResponseFast: (rawResponse: TransportResponse) => HttpResponse<unknown>;
109
81
  /**
110
- * @ru Быстрое создание объекта StreamResponse без overhead-а классов.
111
- * @en Fast creation of a StreamResponse object without class overhead.
82
+ * @ru Возвращает HttpResponse в пул переиспользования.
83
+ * @en Returns an HttpResponse to the reuse pool.
84
+ * @param res - The response to recycle.
85
+ */
86
+ export declare const recycleResponse: (res: HttpResponse<unknown>) => void;
87
+ /**
88
+ * @ru Создаёт StreamResponse без потребления тела.
89
+ * @en Creates a StreamResponse without consuming the body.
112
90
  * @param rawResponse - The raw transport response.
113
- * @returns A lightweight StreamResponse object.
91
+ * @returns A StreamResponse-like object.
114
92
  */
115
93
  export declare const mapStreamFast: (rawResponse: TransportResponse) => {
116
94
  status: number;
@@ -119,13 +97,11 @@ export declare const mapStreamFast: (rawResponse: TransportResponse) => {
119
97
  url: string;
120
98
  };
121
99
  /**
122
- * @ru Оптимизированное слияние заголовков.
123
- * Использует ранний возврат при первой итерации цикла, что быстрее, чем Object.keys().length > 0.
124
- * @en Optimized headers merging.
125
- * Uses early return on the first loop iteration, which is faster than Object.keys().length > 0.
126
- * @param base - Base headers object.
127
- * @param override - Headers to override or add.
128
- * @returns Merged headers object.
100
+ * @ru Быстрое слияние заголовков с мутацией базового объекта.
101
+ * @en Fast header merge mutating the base object.
102
+ * @param base - Base headers object (mutated).
103
+ * @param override - Optional headers to overlay.
104
+ * @returns The mutated base headers object.
129
105
  */
130
106
  export declare const mergeHeadersFast: (base: Record<string, string | string[]>, override?: Record<string, string | string[]>) => Record<string, string | string[]>;
131
107
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"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"}
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;AAaxE,QAAA,MAAM,SAAS,eAA8B,CAAC;AAC9C,QAAA,MAAM,UAAU,eAA+B,CAAC;AAChD,QAAA,MAAM,UAAU,eAA+B,CAAC;AAEhD,KAAK,WAAW,GAAG;IACjB,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC;IACzB,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAmBF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,QAAQ,CAAC,KAAG,CAsC1C,CAAC;AAEF;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC,EAAE,WAAW;IAC1E,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC5C,IAAI,EAAG,CAAC,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC;IACzC,GAAG,EAAG,MAAM,CAAC;IACb,IAAI,EAAG,CAAC,GAAG,IAAI,CAAC;IAEhB,CAAC,SAAS,CAAC,EAAG,UAAU,GAAG,SAAS,CAAC;IACrC,CAAC,UAAU,CAAC,EAAG,MAAM,GAAG,SAAS,CAAC;IAClC,CAAC,UAAU,CAAC,EAAG,OAAO,GAAG,SAAS,CAAC;IAE1C,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,IAAI,CAAiC;IAE7C,YAAY,WAAW,CAAC,EAAE,iBAAiB,EAY1C;IAED;;;;;OAKG;IACI,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAYhD;YAEa,YAAY;IAuD1B;;;;OAIG;IACU,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAS/C;IAED;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAQnC;IAED;;;;OAIG;IACU,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAuB7C;IAED;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAUjC;IAED;;;;OAIG;IACI,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,CA0B9B;CACF;AAED,eAAO,MAAM,YAAY,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAO,CAAC;AAGzD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,gBAAiB,iBAAiB,KAAG,YAAY,CAAC,OAAO,CAGpF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAS,YAAY,CAAC,OAAO,CAAC,KAAG,IAI5D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,gBAAiB,iBAAiB;IAC1D,MAAM;IACN,OAAO;IACP,IAAI;IACJ,GAAG;CACH,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,SACrB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,aAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,KAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBlC,CAAC"}
package/utils/response.js CHANGED
@@ -1,389 +1,2 @@
1
- import { CURRENT_RUNTIME } from "../transports/manager.js";
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 c}from"../transports/manager.js";const s=Symbol("hyperttp.rawCache"),i=Symbol("hyperttp.textCache"),a=Symbol("hyperttp.jsonCache"),d=new TextDecoder,y=new TextEncoder,f=Object.freeze({});function u(e){return typeof e=="object"&&e!==null&&"getReader"in e&&typeof e.getReader=="function"}function h(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 r=Object.getPrototypeOf(e);if(r===Object.prototype||r===null){const n=Object.create(r);for(const o in e)Object.prototype.hasOwnProperty.call(e,o)&&(n[o]=e[o]);return n}try{return structuredClone(e)}catch{try{return JSON.parse(JSON.stringify(e))}catch{const n=Object.create(r);for(const o in e)Object.prototype.hasOwnProperty.call(e,o)&&(n[o]=e[o]);return n}}};export class HyperHttpResponse{status;headers;body;url;data;[s];[i];[a];_bodyConsumed;_raw;constructor(t){this.status=0,this.headers=f,this.body=null,this.url="",this.data=null,this[s]=void 0,this[i]=void 0,this[a]=void 0,this._bodyConsumed=!1,this._raw=void 0,t&&this.init(t)}init(t){return this.status=t.status,this.headers=t.headers||f,this.body=t.body,this.url=t.url??"",this.data=null,this[s]=void 0,this[i]=void 0,this[a]=void 0,this._bodyConsumed=!1,this._raw=t._raw,this}async _consumeBody(){if(this[s]!==void 0)return;const t=this.body;if(t){if(t instanceof Uint8Array){this[s]=t,this._bodyConsumed=!0;return}if(typeof t=="string"){this[s]=y.encode(t),this._bodyConsumed=!0;return}if(t instanceof ArrayBuffer){this[s]=new Uint8Array(t),this._bodyConsumed=!0;return}if(this._raw&&t===this._raw.body&&typeof this._raw.arrayBuffer=="function"){const r=await this._raw.arrayBuffer();this[s]=new Uint8Array(r),this.body=this[s],this._bodyConsumed=!0;return}if(c==="bun"&&t&&typeof t=="object"&&"arrayBuffer"in t){const r=t;if(typeof r.arrayBuffer=="function"){const n=await r.arrayBuffer();this[s]=new Uint8Array(n),this.body=this[s],this._bodyConsumed=!0;return}}if(u(t)||h(t)){if(u(t)&&t.locked)throw new Error("[Hyperttp] Stream is locked.");const n=await new Response(t).arrayBuffer();this[s]=new Uint8Array(n),this.body=this[s],this._bodyConsumed=!0}}}async arrayBuffer(){if(await this._consumeBody(),this[s]===void 0)throw new Error("[Hyperttp] Response body is not available as ArrayBuffer");return this[s].buffer.slice(this[s].byteOffset,this[s].byteOffset+this[s].byteLength)}async text(){if(this[i]!==void 0)return this[i];if(await this._consumeBody(),this[s]===void 0)throw new Error("[Hyperttp] Response body is not available as text");return this[i]=d.decode(this[s]),this[i]}async json(){const t=this.body;if(!this._bodyConsumed&&typeof t=="object"&&t!==null&&!u(t)&&!h(t)&&!(t instanceof Uint8Array)&&!(t instanceof ArrayBuffer))return this._bodyConsumed=!0,t;if(await this._consumeBody(),this[s]===void 0)throw new Error("[Hyperttp] Response body is not available as JSON");return this[i]===void 0&&(this[i]=d.decode(this[s])),JSON.parse(this[i])}async dump(){if(this._bodyConsumed)return;this._bodyConsumed=!0;const t=this.body;u(t)?t.locked||await t.cancel().catch(()=>{}):h(t)&&await t.arrayBuffer()}clone(){const t=new HyperHttpResponse;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[s]=this[s],t[i]=this[i],t[a]=this[a],u(this.body)&&!this._bodyConsumed)if(this.body.locked)t.body=this.body;else{const[r,n]=this.body.tee();this.body=r,t.body=n}else t.body=this.body;return t}}export const responsePool=[];const b=64;export const mapResponseFast=e=>(responsePool.pop()??new HyperHttpResponse).init(e),recycleResponse=e=>{e instanceof HyperHttpResponse&&responsePool.length<b&&responsePool.push(e)},mapStreamFast=e=>({status:e.status,headers:e.headers,body:e.body,url:e.url??""}),mergeHeadersFast=(e,t)=>{if(!t)return e;let r=!1;for(const n in t){r=!0;break}if(!r)return e;for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e};
2
+ //# sourceMappingURL=response.js.map