@hyperttp/core 1.5.6 → 2.0.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 (113) hide show
  1. package/Core/HyperCore.d.ts +208 -0
  2. package/Core/HyperCore.d.ts.map +1 -0
  3. package/Core/HyperCore.js +2 -0
  4. package/Core/HyperCore.js.map +7 -0
  5. package/README.md +259 -187
  6. package/defaultConfig.d.ts +12 -0
  7. package/defaultConfig.d.ts.map +1 -0
  8. package/defaultConfig.js +2 -0
  9. package/defaultConfig.js.map +7 -0
  10. package/index.d.ts +6 -0
  11. package/index.d.ts.map +1 -0
  12. package/index.js +2 -0
  13. package/index.js.map +7 -0
  14. package/package.json +40 -64
  15. package/protocols/manager.d.ts +37 -0
  16. package/protocols/manager.d.ts.map +1 -0
  17. package/protocols/manager.js +2 -0
  18. package/protocols/manager.js.map +7 -0
  19. package/protocols/rest/index.d.ts +9 -0
  20. package/protocols/rest/index.d.ts.map +1 -0
  21. package/protocols/rest/index.js +2 -0
  22. package/protocols/rest/index.js.map +7 -0
  23. package/protocols/rest/receiver.d.ts +36 -0
  24. package/protocols/rest/receiver.d.ts.map +1 -0
  25. package/protocols/rest/receiver.js +2 -0
  26. package/protocols/rest/receiver.js.map +7 -0
  27. package/protocols/rest/sender.d.ts +31 -0
  28. package/protocols/rest/sender.d.ts.map +1 -0
  29. package/protocols/rest/sender.js +2 -0
  30. package/protocols/rest/sender.js.map +7 -0
  31. package/protocols/rest/type.d.ts +111 -0
  32. package/protocols/rest/type.d.ts.map +1 -0
  33. package/protocols/rest/type.js +2 -0
  34. package/protocols/rest/type.js.map +7 -0
  35. package/rest.d.ts +2 -0
  36. package/rest.d.ts.map +1 -0
  37. package/rest.js +2 -0
  38. package/rest.js.map +7 -0
  39. package/transports/fetch.d.ts +35 -0
  40. package/transports/fetch.d.ts.map +1 -0
  41. package/transports/fetch.js +2 -0
  42. package/transports/fetch.js.map +7 -0
  43. package/transports/manager.d.ts +39 -0
  44. package/transports/manager.d.ts.map +1 -0
  45. package/transports/manager.js +2 -0
  46. package/transports/manager.js.map +7 -0
  47. package/utils/abort.d.ts +23 -0
  48. package/utils/abort.d.ts.map +1 -0
  49. package/utils/abort.js +2 -0
  50. package/utils/abort.js.map +7 -0
  51. package/utils/errors.d.ts +46 -0
  52. package/utils/errors.d.ts.map +1 -0
  53. package/utils/errors.js +2 -0
  54. package/utils/errors.js.map +7 -0
  55. package/dist/Core/HyperCore.d.ts +0 -171
  56. package/dist/Core/HyperCore.d.ts.map +0 -1
  57. package/dist/Core/HyperCore.js +0 -2
  58. package/dist/Core/HyperCore.js.map +0 -7
  59. package/dist/Core/RequestBuilder.d.ts +0 -8
  60. package/dist/Core/RequestBuilder.d.ts.map +0 -1
  61. package/dist/Core/RequestBuilder.js +0 -2
  62. package/dist/Core/RequestBuilder.js.map +0 -7
  63. package/dist/LICENSE +0 -21
  64. package/dist/README.md +0 -291
  65. package/dist/defaultConfig.d.ts +0 -7
  66. package/dist/defaultConfig.d.ts.map +0 -1
  67. package/dist/defaultConfig.js +0 -2
  68. package/dist/defaultConfig.js.map +0 -7
  69. package/dist/index.d.ts +0 -3
  70. package/dist/index.d.ts.map +0 -1
  71. package/dist/index.js +0 -2
  72. package/dist/index.js.map +0 -7
  73. package/dist/package.json +0 -50
  74. package/dist/transports/browser.d.ts +0 -37
  75. package/dist/transports/browser.d.ts.map +0 -1
  76. package/dist/transports/browser.js +0 -2
  77. package/dist/transports/browser.js.map +0 -7
  78. package/dist/transports/manager.d.ts +0 -89
  79. package/dist/transports/manager.d.ts.map +0 -1
  80. package/dist/transports/manager.js +0 -7
  81. package/dist/transports/manager.js.map +0 -7
  82. package/dist/transports/node.d.ts +0 -33
  83. package/dist/transports/node.d.ts.map +0 -1
  84. package/dist/transports/node.js +0 -2
  85. package/dist/transports/node.js.map +0 -7
  86. package/dist/utils/errors.d.ts +0 -38
  87. package/dist/utils/errors.d.ts.map +0 -1
  88. package/dist/utils/errors.js +0 -2
  89. package/dist/utils/errors.js.map +0 -7
  90. package/dist/utils/normalize.d.ts +0 -35
  91. package/dist/utils/normalize.d.ts.map +0 -1
  92. package/dist/utils/normalize.js +0 -2
  93. package/dist/utils/normalize.js.map +0 -7
  94. package/dist/utils/pipeline.d.ts +0 -63
  95. package/dist/utils/pipeline.d.ts.map +0 -1
  96. package/dist/utils/pipeline.js +0 -2
  97. package/dist/utils/pipeline.js.map +0 -7
  98. package/dist/utils/response.d.ts +0 -108
  99. package/dist/utils/response.d.ts.map +0 -1
  100. package/dist/utils/response.js +0 -2
  101. package/dist/utils/response.js.map +0 -7
  102. package/dist/utils/retryUtils.d.ts +0 -17
  103. package/dist/utils/retryUtils.d.ts.map +0 -1
  104. package/dist/utils/retryUtils.js +0 -2
  105. package/dist/utils/retryUtils.js.map +0 -7
  106. /package/{dist/Core → Core}/index.d.ts +0 -0
  107. /package/{dist/Core → Core}/index.d.ts.map +0 -0
  108. /package/{dist/Core → Core}/index.js +0 -0
  109. /package/{dist/Core → Core}/index.js.map +0 -0
  110. /package/{dist/utils → utils}/merge.d.ts +0 -0
  111. /package/{dist/utils → utils}/merge.d.ts.map +0 -0
  112. /package/{dist/utils → utils}/merge.js +0 -0
  113. /package/{dist/utils → utils}/merge.js.map +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/transports/manager.ts"],
4
- "sourcesContent": ["import type { HttpClientOptions, HyperTransport } from \"@hyperttp/types\";\n\n/**\n * @ru Поддерживаемые среды выполнения для автоматического выбора транспорта.\n * @en Supported runtime environments for automatic transport selection.\n */\nexport type Runtime = \"bun\" | \"node\" | \"deno\" | \"browser\";\n\n/**\n * @ru Конструктор транспорта, принимающий конфигурацию клиента.\n * @en Transport constructor accepting client configuration.\n */\ntype TransportCtor = new (config: HttpClientOptions) => HyperTransport;\n\n/**\n * @ru Описание транспорта: имя, поддерживаемые среды, пакет, экспорт и приоритет.\n * @en Transport descriptor: name, supported runtimes, package, export, and priority.\n */\ntype TransportDef = {\n /** @ru Имя транспорта для логирования. @en Transport name for logging. */\n readonly name: string;\n /** @ru Список сред, в которых транспорт может работать. @en List of runtimes where the transport can operate. */\n readonly runtime: readonly Runtime[];\n /** @ru Имя пакета npm или относительный путь для встроенных транспортов. @en npm package name or relative path for built-in transports. */\n readonly pkg: string;\n /** @ru Имя экспортируемого класса транспорта. @en Exported transport class name. */\n readonly export: string;\n /** @ru Приоритет выбора (выше значение = раньше попытка загрузки). @en Selection priority (higher value = earlier load attempt). */\n readonly priority: number;\n};\n\n/**\n * @ru Определяет текущую среду выполнения при загрузке модуля.\n * Порядок проверки: Bun → Deno → Node.js → Browser.\n * @en Detects the current runtime at module load time.\n * Detection order: Bun → Deno → Node.js → Browser.\n */\nexport const CURRENT_RUNTIME: Runtime = (() => {\n if (typeof Bun !== \"undefined\") return \"bun\";\n if (typeof Deno !== \"undefined\") return \"deno\";\n if (typeof process !== \"undefined\" && process.versions?.node) return \"node\";\n return \"browser\";\n})();\n\n/**\n * @ru Внутренний реестр всех доступных транспортов с приоритетами.\n * Заморожен для предотвращения модификаций в runtime.\n * @en Internal registry of all available transports with priorities.\n * Frozen to prevent runtime modifications.\n */\nconst INTERNAL_TRANSPORTS: readonly TransportDef[] = [\n {\n name: \"Bun\",\n runtime: [\"bun\"],\n pkg: \"@hyperttp/transport-bun\",\n export: \"BunTransport\",\n priority: 100,\n },\n {\n name: \"Deno\",\n runtime: [\"deno\"],\n pkg: \"@hyperttp/transport-deno\",\n export: \"DenoTransport\",\n priority: 95,\n },\n {\n name: \"Undici\",\n runtime: [\"node\"],\n pkg: \"@hyperttp/transport-undici\",\n export: \"UndiciTransport\",\n priority: 90,\n },\n {\n name: \"Browser\",\n runtime: [\"browser\"],\n pkg: \"./browser.js\",\n export: \"BrowserTransport\",\n priority: 80,\n },\n {\n name: \"Node\",\n runtime: [\"node\", \"bun\", \"deno\"],\n pkg: \"./node.js\",\n export: \"NodeTransport\",\n priority: 10,\n },\n];\n\nINTERNAL_TRANSPORTS.forEach(Object.freeze);\nObject.freeze(INTERNAL_TRANSPORTS);\n\n/**\n * @ru Белый список разрешённых пакетов для защиты от несанкционированного импорта.\n * @en Whitelist of allowed packages to protect against unauthorized imports.\n */\nconst ALLOWED_PACKAGES = new Set<string>(INTERNAL_TRANSPORTS.map((t) => t.pkg));\n\n/**\n * @ru Отфильтрованный и отсортированный список транспортов для текущей среды.\n * Вычисляется один раз при загрузке модуля.\n * @en Filtered and sorted list of transports for the current runtime.\n * Computed once at module load time.\n */\nconst CANDIDATES = INTERNAL_TRANSPORTS.filter((t) => t.runtime.includes(CURRENT_RUNTIME)).sort(\n (a, b) => b.priority - a.priority,\n);\n\n/**\n * @ru Кэш разрешённого конструктора транспорта для избежания повторного разрешения.\n * @en Cached resolved transport constructor to avoid repeated resolution.\n */\nlet RESOLVED_RUNTIME_CTOR: TransportCtor | null = null;\n\n/**\n * @ru Проверяет, является ли ошибкой отсутствия модуля.\n * Поддерживает коды ERR_MODULE_NOT_FOUND и MODULE_NOT_FOUND,\n * а также сообщения об ошибках (для совместимости с Bun и Deno).\n * @en Checks if the error is a module-not-found error.\n * Supports ERR_MODULE_NOT_FOUND and MODULE_NOT_FOUND codes,\n * as well as error messages (for Bun and Deno compatibility).\n * @param err - The error to check.\n * @returns True if the error indicates a missing module.\n */\nfunction isModuleNotFoundError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n\n const e = err as Record<string, unknown>;\n const code = e.code as string | undefined;\n if (code === \"ERR_MODULE_NOT_FOUND\" || code === \"MODULE_NOT_FOUND\") return true;\n\n const msg = err instanceof Error ? err.message : String(e.message ?? \"\");\n return (\n msg.includes(\"Cannot find module\") ||\n msg.includes(\"Failed to resolve\") ||\n msg.includes(\"Failed to load\")\n );\n}\n\n/**\n * @ru Логирует информацию о неудачной попытке загрузки транспорта.\n * Активируется в режиме DEBUG=1 или при ошибке нативного транспорта в dev-окружении.\n * @en Logs information about failed transport load attempts.\n * Activated in DEBUG=1 mode or when native transport fails in dev environment.\n * @param pkg - Package name that failed to load.\n * @param err - The error that occurred.\n * @param config - Optional client configuration for custom logger.\n */\nfunction logDebugFallback(pkg: string, err: unknown, config?: HttpClientOptions): void {\n const isDev = typeof process !== \"undefined\" && process.env?.NODE_ENV === \"development\";\n const isDebug = typeof process !== \"undefined\" && process.env?.DEBUG === \"1\";\n const isNativeTransport = pkg.includes(CURRENT_RUNTIME);\n\n if (isDebug || (isDev && isNativeTransport)) {\n const primaryMessage = `Failed to load preferred transport \"${pkg}\"`;\n const fallbackMessage = `Falling back to alternative transport...`;\n\n if (config?.logger) {\n config.logger(\"warn\", `[Hyperttp Debug] ${primaryMessage}`, err);\n config.logger(\"warn\", `[Hyperttp Debug] ${fallbackMessage}`);\n } else {\n console.warn(`\\n⚠️ [Hyperttp Debug] ${primaryMessage}:`);\n console.error(err);\n console.warn(`${fallbackMessage}\\n`);\n }\n }\n}\n\n/**\n * @ru Загружает конструктор транспорта из пакета или относительного пути.\n * @en Loads a transport constructor from a package or relative path.\n * @param pkg - Package name or relative path.\n * @param exportName - Name of the exported transport class.\n * @param config - Optional client configuration for debug logging.\n * @returns Transport constructor or null if not found.\n * @throws Error if the package is not in the whitelist.\n */\nasync function loadCtor(\n pkg: string,\n exportName: string,\n config?: HttpClientOptions,\n): Promise<TransportCtor | null> {\n if (!ALLOWED_PACKAGES.has(pkg)) {\n throw new Error(`[Hyperttp Security] Blocked untrusted transport import attempt: ${pkg}`);\n }\n\n try {\n const mod = (await import(pkg)) as Record<string, unknown>;\n const candidate = mod[exportName] ?? mod.default;\n return typeof candidate === \"function\" ? (candidate as TransportCtor) : null;\n } catch (err) {\n if (isModuleNotFoundError(err)) {\n logDebugFallback(pkg, err, config);\n return null;\n }\n throw err;\n }\n}\n\n/**\n * @ru Разрешает и создаёт оптимальный транспорт для текущей среды.\n * Перебирает кандидатов по приоритету, кэширует первый успешный результат.\n * @en Resolves and creates the optimal transport for the current runtime.\n * Iterates candidates by priority, caches the first successful result.\n * @param config - Client configuration options.\n * @returns Promise resolving to the instantiated transport.\n * @throws Error if no compatible transport is found.\n */\nexport async function resolveTransport(config: HttpClientOptions): Promise<HyperTransport> {\n if (config.customTransport) return config.customTransport;\n if (RESOLVED_RUNTIME_CTOR) return new RESOLVED_RUNTIME_CTOR(config);\n\n const failures: string[] = [];\n\n for (let i = 0; i < CANDIDATES.length; i++) {\n const t = CANDIDATES[i]!;\n try {\n const ctor = await loadCtor(t.pkg, t.export, config);\n if (!ctor) {\n failures.push(`${t.pkg} (missing export or not installed)`);\n continue;\n }\n\n RESOLVED_RUNTIME_CTOR = ctor;\n return new ctor(config);\n } catch (err) {\n if (isModuleNotFoundError(err)) {\n failures.push(`${t.pkg} (not installed)`);\n continue;\n }\n throw new Error(`[Hyperttp] Transport crash in ${t.pkg}: ${(err as Error)?.message}`, {\n cause: err,\n });\n }\n }\n\n throw new Error(\n `No compatible transport for runtime=\"${CURRENT_RUNTIME}\".\\nFailures:\\n- ${failures.join(\"\\n- \")}`,\n );\n}\n\n/**\n * @ru Менеджер транспорта с ленивой инициализацией и кэшированием.\n * Поддерживает синхронный доступ, отложенную инициализацию и корректное завершение.\n * @en Transport manager with lazy initialization and caching.\n * Supports synchronous access, deferred initialization, and graceful shutdown.\n */\nexport class TransportManager {\n /**\n * @ru Текущий экземпляр транспорта (null до инициализации).\n * @en Current transport instance (null before initialization).\n */\n public transport: HyperTransport | null = null;\n\n /**\n * @ru Промис отложенной инициализации транспорта.\n * @en Deferred transport initialization promise.\n */\n private promise: Promise<HyperTransport> | null = null;\n\n /**\n * @ru Конфигурация клиента для создания транспорта.\n * @en Client configuration for transport creation.\n */\n private config: HttpClientOptions;\n\n /**\n * @ru Создаёт менеджер транспорта с опциональным пользовательским транспортом.\n * @en Creates a transport manager with an optional custom transport.\n * @param config - Client configuration options.\n * @param custom - Optional custom transport instance.\n */\n constructor(config: HttpClientOptions, custom?: HyperTransport) {\n this.config = config;\n\n if (custom) {\n this.transport = custom;\n } else if (config.customTransport) {\n this.transport = config.customTransport;\n } else if (RESOLVED_RUNTIME_CTOR) {\n this.transport = new RESOLVED_RUNTIME_CTOR(config);\n }\n }\n\n /**\n * @ru Синхронно возвращает текущий транспорт или null, если не инициализирован.\n * @en Synchronously returns the current transport or null if not initialized.\n * @returns The transport instance or null.\n */\n public getSync(): HyperTransport | null {\n return this.transport;\n }\n\n /**\n * @ru Гарантирует наличие транспорта, инициализируя его при необходимости.\n * Повторные вызовы возвращают один и тот же промис.\n * @en Ensures a transport exists, initializing it if necessary.\n * Repeated calls return the same promise.\n * @returns Promise resolving to the transport instance.\n */\n public ensure(): Promise<HyperTransport> {\n if (this.transport !== null) {\n return this.promise || (this.promise = Promise.resolve(this.transport));\n }\n if (this.promise !== null) return this.promise;\n\n return (this.promise = resolveTransport(this.config).then((t) => {\n this.transport = t;\n return t;\n }));\n }\n\n /**\n * @ru Возвращает транспорт синхронно или промис, если требуется инициализация.\n * @en Returns the transport synchronously or a promise if initialization is needed.\n * @returns The transport instance or a promise resolving to it.\n */\n public get(): HyperTransport | Promise<HyperTransport> {\n return this.transport ?? this.ensure();\n }\n\n /**\n * @ru Обновляет конфигурацию транспорта, если он поддерживает setConfig.\n * @en Updates the transport configuration if it supports setConfig.\n * @param config - New client configuration options.\n */\n public setConfig(config: HttpClientOptions): void {\n this.config = config;\n\n const t = this.transport as { setConfig?: (cfg: HttpClientOptions) => void } | null;\n if (typeof t?.setConfig === \"function\") {\n t.setConfig(config);\n }\n }\n\n /**\n * @ru Завершает работу транспорта и освобождает ресурсы.\n * В graceful-режиме вызывает close(), иначе — destroy().\n * @en Shuts down the transport and releases resources.\n * In graceful mode calls close(), otherwise calls destroy().\n * @param graceful - If true, waits for active requests to complete.\n * @returns Promise that resolves when shutdown is complete.\n */\n public async destroy(graceful = true): Promise<void> {\n const t = this.transport as {\n close?: () => Promise<void> | void;\n destroy?: () => Promise<void> | void;\n } | null;\n\n if (!t) return;\n\n try {\n if (graceful && typeof t.close === \"function\") {\n await t.close();\n return;\n }\n if (typeof t.destroy === \"function\") {\n await t.destroy();\n }\n } finally {\n this.transport = null;\n this.promise = null;\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["INTERNAL_TRANSPORTS", "ALLOWED_PACKAGES", "CANDIDATES", "a", "b", "RESOLVED_RUNTIME_CTOR", "isModuleNotFoundError", "err", "e", "code", "msg", "logDebugFallback", "pkg", "config", "isDev", "isDebug", "isNativeTransport", "primaryMessage", "fallbackMessage", "loadCtor", "exportName", "mod", "candidate", "failures", "i", "t", "ctor", "custom", "graceful"]
7
- }
@@ -1,33 +0,0 @@
1
- import type { HttpClientOptions, HyperTransport, StealthOptions, TransportRequest, TransportResponse } from "@hyperttp/types";
2
- /**
3
- * @ru Конфигурация транспорта для Node.js с использованием нативных http/https модулей.
4
- * @en Node.js transport configuration using native http/https modules.
5
- */
6
- export interface NodeTransportConfig extends HttpClientOptions {
7
- /**
8
- * @ru Базовый URL для относительных путей.
9
- * @en Base URL for relative paths.
10
- */
11
- baseUrl?: string;
12
- /**
13
- * @ru Настройки stealth-маскировки на уровне транспорта.
14
- * @en Stealth masking settings at the transport level.
15
- */
16
- stealth?: StealthOptions;
17
- }
18
- /**
19
- * @ru Реализация транспорта для Node.js с использованием нативных http/https модулей.
20
- * Поддерживает stealth-маскировку, фрагментацию TLS Client Hello и автоматическую декомпрессию.
21
- */
22
- export declare class NodeTransport implements HyperTransport {
23
- config: NodeTransportConfig;
24
- private readonly isProduction;
25
- private readonly cleanBaseUrl;
26
- private readonly agentCache;
27
- private readonly trackedAgents;
28
- constructor(config: NodeTransportConfig);
29
- execute(req: TransportRequest): Promise<TransportResponse>;
30
- close(): Promise<void>;
31
- destroy(): Promise<void>;
32
- }
33
- //# sourceMappingURL=node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/transports/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AASzB;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAqUD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAC3C,MAAM,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGxB;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IAErE,YAAY,MAAM,EAAE,mBAAmB,EAMtC;IAEY,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2HtE;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlC;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpC;CACF"}
@@ -1,2 +0,0 @@
1
- "use strict";import{CacheManager as D}from"hcacher";import G from"node:http";import U from"node:https";import O from"node:net";import{Readable as R,Transform as W}from"node:stream";import B from"node:tls";import T from"node:zlib";const K={chrome:{"sec-ch-ua":'"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Linux"',"sec-fetch-dest":"document","sec-fetch-mode":"navigate","sec-fetch-site":"none","sec-fetch-user":"?1","upgrade-insecure-requests":"1","accept-language":"en-US,en;q=0.9"},firefox:{"sec-fetch-dest":"document","sec-fetch-mode":"navigate","sec-fetch-site":"none","accept-language":"en-US,en;q=0.5","upgrade-insecure-requests":"1"}},N={chrome:"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",firefox:"Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0",safari:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15",edge:"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"};function j(t){if(!t)return"";switch(t){case"chrome":case"edge":return["TLS_AES_128_GCM_SHA256","TLS_AES_256_GCM_SHA384","TLS_CHACHA20_POLY1305_SHA256","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256"].join(":");case"firefox":return["TLS_AES_128_GCM_SHA256","TLS_CHACHA20_POLY1305_SHA256","TLS_AES_256_GCM_SHA384","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256"].join(":");case"safari":return["TLS_AES_256_GCM_SHA384","TLS_CHACHA20_POLY1305_SHA256","TLS_AES_128_GCM_SHA256","ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384"].join(":");default:return""}}function $(t,e){if(!e||!e.fingerprint)return t;const r=e.fingerprint,o=K[r];if(o)for(const i in o)t[i]===void 0&&(t[i]=o[i]);const n=t["user-agent"];if(n===void 0||n==="hyperttp/2.0"||n==="Hyperttp/2.0"){const i=N[r];i&&(t["user-agent"]=i)}return t}function F(t,e,r,o,n){const i=e?.fingerprint??"none",_=e?.fragment??"none",m=e?.http2===!0,y=`${t?"https":"http"}:${i}:${_}:${m?"h2":"1.1"}`;let p=r.get(y);if(p)return p;const f={keepAlive:!0,maxSockets:256};if(n!==void 0&&(f.rejectUnauthorized=n),t){if(f.ciphers=j(e?.fingerprint),_==="split"||m){const h=m?["h2","http/1.1"]:void 0;f.createConnection=(u,a)=>{let l=!1;const d=(A,g)=>{const s=O.connect(u);if(_==="split"){const S=s.write;let k=!0;s.write=function(E,H,x){if(k&&E instanceof Uint8Array&&E.length>5){k=!1,this.write=S;let w,L;typeof H=="function"?L=H:(w=H,L=x);const z=E.subarray(0,3),P=E.subarray(3),v=M=>{L?.(M)};try{S.call(this,z,w)}catch(M){return v(M),!1}return S.call(this,P,w,L)}return this.write=S,S.call(this,E,H,x)}}const c={...u,socket:s,ciphers:f.ciphers};A&&(c.ALPNProtocols=A);const C=B.connect(c);C.once("secureConnect",()=>{if(A&&C.alpnProtocol==="h2"&&!l){l=!0,C.destroy(),d(["http/1.1"],g);return}g(null,C)}),C.once("error",S=>g(S))};return d(h,a)}}p=new U.Agent(f)}else p=new G.Agent(f);return r.set(y,p),o.add(p),p}function X(t){return t.startsWith("http://")||t.startsWith("https://")}function I(t,e){if(!e)throw new Error("URL is empty");return X(e)?e:e.charCodeAt(0)===47?t+e:t+"/"+e}function V(t){const e=t.indexOf("://");if(e===-1)return!1;const r=e+3;let o=t.indexOf("/",r);o===-1&&(o=t.length);const n=t.slice(r,o);return n==="localhost"||n.startsWith("localhost:")}function Y(t){const e=Object.create(null);if(!t)return e;if(t instanceof Headers)return t.forEach((o,n)=>{e[n.toLowerCase()]=o}),e;if(Array.isArray(t)){for(let o=0;o<t.length;o++){const n=t[o];!n||typeof n[0]!="string"||(e[n[0].toLowerCase()]=String(n[1]))}return e}const r=t;for(const o in r){const n=r[o];if(n==null)continue;const i=o.toLowerCase();if(Array.isArray(n)){e[i]=i==="cookie"?n.join("; "):n.join(", ");continue}e[i]=String(n)}return e}function q(t){let e=0;return new W({transform(r,o,n){if(e+=r.length,e>t){n(new Error(`[Hyperttp] Response size exceeded limit of ${t} bytes`));return}n(null,r)}})}export class NodeTransport{config;isProduction;cleanBaseUrl;agentCache=new D({maxSize:32,ttl:6e4});trackedAgents=new Set;constructor(e){this.config=e,this.isProduction=!0;const r=e.baseUrl??"http://localhost:3000";this.cleanBaseUrl=r.endsWith("/")?r.slice(0,-1):r}async execute(e){const r=I(this.cleanBaseUrl,e.url);if(this.isProduction&&V(r))throw new Error("Localhost URL detected in production environment");let o=Y(e.headers);o["accept-encoding"]===void 0&&(o["accept-encoding"]="gzip, deflate, br");const n=e.stealth??this.config.stealth??this.config.network?.stealth;n&&(o=$(o,n));const i=e.body,m=new URL(r).protocol==="https:",y=F(m,n,this.agentCache,this.trackedAgents,this.config.network?.rejectUnauthorized);return new Promise((p,f)=>{const b={method:e.method,headers:o,agent:y,signal:e.signal};let h=!1;const u=(m?U:G).request(r,b,a=>{const l=Object.create(null);for(const s in a.headers){const c=a.headers[s];c!==void 0&&(l[s]=Array.isArray(c)?c.join(", "):c)}let d=a;const A=l["content-encoding"]?.toLowerCase();if(A==="gzip"){const s=T.createGunzip();s.on("error",c=>{a.destroy(c),h||f(c)}),d=a.pipe(s),delete l["content-encoding"],delete l["content-length"]}else if(A==="deflate"){const s=T.createInflate();s.on("error",c=>{a.destroy(c),h||f(c)}),d=a.pipe(s),delete l["content-encoding"],delete l["content-length"]}else if(A==="br"){const s=T.createBrotliDecompress();s.on("error",c=>{a.destroy(c),h||f(c)}),d=a.pipe(s),delete l["content-encoding"],delete l["content-length"]}const g=this.config.network?.maxResponseBytes;if(g!=null&&g>0){const s=q(g);s.on("error",c=>{a.destroy(c),h||f(c)}),d=d.pipe(s)}d.on("error",s=>{h||f(s)}),h=!0,p({status:a.statusCode??200,headers:l,url:r,body:R.toWeb(d)})});u.on("error",a=>{h||f(a)}),i!=null?typeof i=="string"||i instanceof Uint8Array||ArrayBuffer.isView(i)?(u.write(i),u.end()):i instanceof ArrayBuffer?(u.write(Buffer.from(i)),u.end()):typeof ReadableStream<"u"&&i instanceof ReadableStream?R.fromWeb(i).pipe(u):u.end():u.end()})}async close(){for(const e of this.trackedAgents)e.destroy();this.trackedAgents.clear(),this.agentCache.clear()}async destroy(){for(const e of this.trackedAgents)e.destroy();this.trackedAgents.clear(),this.agentCache.clear()}}
2
- //# sourceMappingURL=node.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/transports/node.ts"],
4
- "sourcesContent": ["import type {\n Fingerprint,\n HttpClientOptions,\n HyperTransport,\n StealthOptions,\n TransportRequest,\n TransportResponse,\n TransportResponsePayload,\n} from \"@hyperttp/types\";\nimport { CacheManager } from \"hcacher\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport net from \"node:net\";\nimport { Readable, Transform } from \"node:stream\";\nimport tls from \"node:tls\";\nimport zlib from \"node:zlib\";\n\n/**\n * @ru Конфигурация транспорта для Node.js с использованием нативных http/https модулей.\n * @en Node.js transport configuration using native http/https modules.\n */\nexport interface NodeTransportConfig extends HttpClientOptions {\n /**\n * @ru Базовый URL для относительных путей.\n * @en Base URL for relative paths.\n */\n baseUrl?: string;\n /**\n * @ru Настройки stealth-маскировки на уровне транспорта.\n * @en Stealth masking settings at the transport level.\n */\n stealth?: StealthOptions;\n}\n\n/**\n * @ru Статические пресеты браузерных заголовков для маскировки под реальных пользователей.\n * Используются stealth-режимом для обхода fingerprint-защит.\n * @en Static presets of browser headers for masking as real users.\n * Used by stealth mode to bypass fingerprint protections.\n */\nconst STEALTH_HEADER_PRESETS: Record<string, Record<string, string>> = {\n chrome: {\n \"sec-ch-ua\": '\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"Linux\"',\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"sec-fetch-user\": \"?1\",\n \"upgrade-insecure-requests\": \"1\",\n \"accept-language\": \"en-US,en;q=0.9\",\n },\n firefox: {\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"accept-language\": \"en-US,en;q=0.5\",\n \"upgrade-insecure-requests\": \"1\",\n },\n};\n\n/**\n * @ru Пресеты User-Agent, соответствующие TLS-отпечаткам (JA3/JA4).\n * @en User-Agent presets matching the TLS fingerprints (JA3/JA4).\n */\nconst STEALTH_UA_PRESETS: Record<string, string> = {\n chrome:\n \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\",\n firefox: \"Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0\",\n safari:\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15\",\n edge: \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0\",\n};\n\n/**\n * @ru Возвращает строку шифров TLS для указанного профиля браузера.\n * @en Returns the TLS cipher suite string for the specified browser profile.\n * @param fingerprint - Browser fingerprint profile.\n * @returns Colon-separated cipher suite string, or empty string if not found.\n */\nfunction getCiphersForProfile(fingerprint: Fingerprint | undefined): string {\n if (!fingerprint) return \"\";\n\n switch (fingerprint) {\n case \"chrome\":\n case \"edge\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"firefox\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"safari\":\n return [\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_128_GCM_SHA256\",\n \"ECDHE-ECDSA-AES256-GCM-SHA384\",\n \"ECDHE-RSA-AES256-GCM-SHA384\",\n ].join(\":\");\n\n default:\n return \"\";\n }\n}\n\n/**\n * @ru Безопасно применяет стелс-пресеты, отдавая абсолютный приоритет ручным заголовкам.\n * @en Safely applies stealth presets, giving absolute priority to manual headers.\n * @param headers - The headers object to modify.\n * @param stealth - Stealth configuration options.\n * @returns The modified headers object.\n */\nfunction applyStealthHeaders(\n headers: Record<string, string>,\n stealth: StealthOptions,\n): Record<string, string> {\n if (!stealth || !stealth.fingerprint) return headers;\n\n const presetName = stealth.fingerprint;\n const presetHeaders = STEALTH_HEADER_PRESETS[presetName];\n\n if (presetHeaders) {\n for (const key in presetHeaders) {\n if (headers[key] === undefined) {\n headers[key] = presetHeaders[key]!;\n }\n }\n }\n\n const currentUA = headers[\"user-agent\"];\n if (currentUA === undefined || currentUA === \"hyperttp/2.0\" || currentUA === \"Hyperttp/2.0\") {\n const browserUA = STEALTH_UA_PRESETS[presetName];\n if (browserUA) {\n headers[\"user-agent\"] = browserUA;\n }\n }\n\n return headers;\n}\n\n/**\n * @ru Создаёт нативный HTTP/HTTPS агент с учётом stealth-настроек.\n * @en Creates a native HTTP/HTTPS agent considering stealth settings.\n * @param isHttps - Whether the connection is HTTPS.\n * @param stealth - Optional stealth configuration.\n * @param cache - The agent cache map to use (per-instance).\n * @returns The HTTP or HTTPS agent.\n */\nfunction getNativeAgent(\n isHttps: boolean,\n stealth: StealthOptions | undefined,\n cache: CacheManager<http.Agent | https.Agent>,\n trackedAgents: Set<http.Agent | https.Agent>,\n rejectUnauthorized?: boolean,\n): http.Agent | https.Agent {\n const fingerprint = stealth?.fingerprint ?? \"none\";\n const fragment = stealth?.fragment ?? \"none\";\n const needHttp2 = stealth?.http2 === true;\n const cacheKey = `${isHttps ? \"https\" : \"http\"}:${fingerprint}:${fragment}:${needHttp2 ? \"h2\" : \"1.1\"}`;\n\n let agent = cache.get(cacheKey);\n if (agent) return agent;\n\n const agentOpts: any = {\n keepAlive: true,\n maxSockets: 256,\n };\n\n if (rejectUnauthorized !== undefined) {\n agentOpts.rejectUnauthorized = rejectUnauthorized;\n }\n\n if (isHttps) {\n agentOpts.ciphers = getCiphersForProfile(stealth?.fingerprint);\n\n const needCustomConnect = fragment === \"split\" || needHttp2;\n\n if (needCustomConnect) {\n const alpnProtocols: string[] | undefined = needHttp2 ? [\"h2\", \"http/1.1\"] : undefined;\n\n agentOpts.createConnection = (\n options: any,\n callback: (err: Error | null, socket?: any) => void,\n ) => {\n let alpnFallback = false;\n\n const createTlsConnection = (\n alpn: string[] | undefined,\n cb: (err: Error | null, socket?: any) => void,\n ) => {\n const socket = net.connect(options);\n\n if (fragment === \"split\") {\n const originalWrite = socket.write;\n let isFirstWrite = true;\n\n socket.write = function (\n this: net.Socket,\n chunk: Uint8Array | string,\n encodingOrCb?: BufferEncoding | ((err?: Error | null) => void),\n cb?: (err?: Error | null) => void,\n ): boolean {\n if (isFirstWrite && chunk instanceof Uint8Array && chunk.length > 5) {\n isFirstWrite = false;\n this.write = originalWrite;\n\n let encoding: BufferEncoding | undefined;\n let callbackRef: ((err?: Error | null) => void) | undefined;\n\n if (typeof encodingOrCb === \"function\") {\n callbackRef = encodingOrCb;\n } else {\n encoding = encodingOrCb;\n callbackRef = cb;\n }\n\n const part1 = chunk.subarray(0, 3);\n const part2 = chunk.subarray(3);\n\n const onError = (err: Error) => {\n callbackRef?.(err);\n };\n\n try {\n originalWrite.call(this, part1, encoding);\n } catch (err) {\n onError(err as Error);\n return false;\n }\n return originalWrite.call(this, part2, encoding, callbackRef);\n }\n\n this.write = originalWrite;\n return originalWrite.call(this, chunk, encodingOrCb as any, cb as any);\n } as any;\n }\n\n const tlsOpts: any = {\n ...options,\n socket,\n ciphers: agentOpts.ciphers,\n };\n if (alpn) tlsOpts.ALPNProtocols = alpn;\n\n const tlsSocket = tls.connect(tlsOpts);\n\n tlsSocket.once(\"secureConnect\", () => {\n if (alpn && tlsSocket.alpnProtocol === \"h2\" && !alpnFallback) {\n alpnFallback = true;\n tlsSocket.destroy();\n createTlsConnection([\"http/1.1\"], cb);\n return;\n }\n cb(null, tlsSocket);\n });\n tlsSocket.once(\"error\", (err) => cb(err));\n };\n\n return createTlsConnection(alpnProtocols, callback);\n };\n }\n\n agent = new https.Agent(agentOpts);\n } else {\n agent = new http.Agent(agentOpts);\n }\n\n cache.set(cacheKey, agent);\n trackedAgents.add(agent);\n return agent;\n}\n\nfunction isAbsoluteHttpUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n\nfunction resolveUrl(baseUrl: string, url: string): string {\n if (!url) throw new Error(\"URL is empty\");\n if (isAbsoluteHttpUrl(url)) return url;\n return url.charCodeAt(0) === 47 ? baseUrl + url : baseUrl + \"/\" + url;\n}\n\nfunction isLocalhostUrl(url: string): boolean {\n const schemeIdx = url.indexOf(\"://\");\n if (schemeIdx === -1) return false;\n\n const hostStart = schemeIdx + 3;\n let hostEnd = url.indexOf(\"/\", hostStart);\n if (hostEnd === -1) hostEnd = url.length;\n\n const host = url.slice(hostStart, hostEnd);\n return host === \"localhost\" || host.startsWith(\"localhost:\");\n}\n\nfunction normalizeHeaders(headers: TransportRequest[\"headers\"]): Record<string, string> {\n const out: Record<string, string> = Object.create(null);\n if (!headers) return out;\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n }\n\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i++) {\n const pair = headers[i] as unknown as [string, string] | undefined;\n if (!pair || typeof pair[0] !== \"string\") continue;\n out[pair[0].toLowerCase()] = String(pair[1]);\n }\n return out;\n }\n\n const src = headers as Record<string, unknown>;\n for (const key in src) {\n const value = src[key];\n if (value == null) continue;\n\n const lKey = key.toLowerCase();\n if (Array.isArray(value)) {\n out[lKey] = lKey === \"cookie\" ? value.join(\"; \") : value.join(\", \");\n continue;\n }\n\n out[lKey] = String(value);\n }\n\n return out;\n}\n\nfunction createSizeLimitTransform(maxBytes: number): Transform {\n let total = 0;\n return new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n total += chunk.length;\n if (total > maxBytes) {\n callback(new Error(`[Hyperttp] Response size exceeded limit of ${maxBytes} bytes`));\n return;\n }\n callback(null, chunk);\n },\n });\n}\n\n/**\n * @ru Реализация транспорта для Node.js с использованием нативных http/https модулей.\n * Поддерживает stealth-маскировку, фрагментацию TLS Client Hello и автоматическую декомпрессию.\n */\nexport class NodeTransport implements HyperTransport {\n public config: NodeTransportConfig;\n private readonly isProduction: boolean;\n private readonly cleanBaseUrl: string;\n private readonly agentCache = new CacheManager<http.Agent | https.Agent>({\n maxSize: 32,\n ttl: 60_000,\n });\n private readonly trackedAgents = new Set<http.Agent | https.Agent>();\n\n constructor(config: NodeTransportConfig) {\n this.config = config;\n this.isProduction = process.env.NODE_ENV === \"production\";\n\n const base = config.baseUrl ?? \"http://localhost:3000\";\n this.cleanBaseUrl = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n }\n\n public async execute(req: TransportRequest): Promise<TransportResponse> {\n const fullUrl = resolveUrl(this.cleanBaseUrl, req.url);\n\n if (this.isProduction && isLocalhostUrl(fullUrl)) {\n throw new Error(\"Localhost URL detected in production environment\");\n }\n\n let headers = normalizeHeaders(req.headers);\n\n if (headers[\"accept-encoding\"] === undefined) {\n headers[\"accept-encoding\"] = \"gzip, deflate, br\";\n }\n\n const stealthOpts = req.stealth ?? this.config.stealth ?? this.config.network?.stealth;\n if (stealthOpts) {\n headers = applyStealthHeaders(headers, stealthOpts);\n }\n\n const body = req.body;\n const urlObj = new URL(fullUrl);\n const isHttps = urlObj.protocol === \"https:\";\n const agent = getNativeAgent(\n isHttps,\n stealthOpts,\n this.agentCache,\n this.trackedAgents,\n this.config.network?.rejectUnauthorized,\n );\n\n return new Promise((resolve, reject) => {\n const reqOpts: http.RequestOptions | https.RequestOptions = {\n method: req.method,\n headers,\n agent,\n signal: req.signal,\n };\n\n let settled = false;\n\n const clientReq = (isHttps ? https : http).request(fullUrl, reqOpts, (res) => {\n const resHeaders: Record<string, string> = Object.create(null);\n for (const key in res.headers) {\n const val = res.headers[key];\n if (val !== undefined) {\n resHeaders[key] = Array.isArray(val) ? val.join(\", \") : val;\n }\n }\n\n let responseStream: Readable = res;\n const encoding = resHeaders[\"content-encoding\"]?.toLowerCase();\n\n if (encoding === \"gzip\") {\n const gunzip = zlib.createGunzip();\n gunzip.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(gunzip);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"deflate\") {\n const inflate = zlib.createInflate();\n inflate.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(inflate);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"br\") {\n const brotli = zlib.createBrotliDecompress();\n brotli.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(brotli);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n }\n\n const maxBytes = this.config.network?.maxResponseBytes;\n if (maxBytes != null && maxBytes > 0) {\n const limiter = createSizeLimitTransform(maxBytes);\n limiter.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = responseStream.pipe(limiter);\n }\n\n responseStream.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n settled = true;\n resolve({\n status: res.statusCode ?? 200,\n headers: resHeaders,\n url: fullUrl,\n body: Readable.toWeb(responseStream) as unknown as TransportResponsePayload,\n });\n });\n\n clientReq.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\" || body instanceof Uint8Array || ArrayBuffer.isView(body)) {\n clientReq.write(body);\n clientReq.end();\n } else if (body instanceof ArrayBuffer) {\n clientReq.write(Buffer.from(body));\n clientReq.end();\n } else if (typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream) {\n Readable.fromWeb(body as any).pipe(clientReq);\n } else {\n clientReq.end();\n }\n } else {\n clientReq.end();\n }\n });\n }\n\n public async close(): Promise<void> {\n for (const agent of this.trackedAgents) {\n agent.destroy();\n }\n this.trackedAgents.clear();\n this.agentCache.clear();\n }\n\n public async destroy(): Promise<void> {\n for (const agent of this.trackedAgents) {\n agent.destroy();\n }\n this.trackedAgents.clear();\n this.agentCache.clear();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["CacheManager", "http", "https", "net", "Readable", "Transform", "tls", "zlib", "STEALTH_HEADER_PRESETS", "STEALTH_UA_PRESETS", "getCiphersForProfile", "fingerprint", "applyStealthHeaders", "headers", "stealth", "presetName", "presetHeaders", "key", "currentUA", "browserUA", "getNativeAgent", "isHttps", "cache", "trackedAgents", "rejectUnauthorized", "fragment", "needHttp2", "cacheKey", "agent", "agentOpts", "alpnProtocols", "options", "callback", "alpnFallback", "createTlsConnection", "alpn", "cb", "socket", "originalWrite", "isFirstWrite", "chunk", "encodingOrCb", "encoding", "callbackRef", "part1", "part2", "onError", "err", "tlsOpts", "tlsSocket", "isAbsoluteHttpUrl", "url", "resolveUrl", "baseUrl", "isLocalhostUrl", "schemeIdx", "hostStart", "hostEnd", "host", "normalizeHeaders", "out", "value", "i", "pair", "src", "lKey", "createSizeLimitTransform", "maxBytes", "total", "_encoding", "config", "base", "req", "fullUrl", "stealthOpts", "body", "resolve", "reject", "reqOpts", "settled", "clientReq", "res", "resHeaders", "val", "responseStream", "gunzip", "inflate", "brotli", "limiter"]
7
- }
@@ -1,38 +0,0 @@
1
- /**
2
- * @ru Базовый класс ошибок клиента Hyperttp, агрегирующий контекст неудачного сетевого запроса.
3
- * @en Base error class for the Hyperttp client, providing explicit layout context for failed requests.
4
- */
5
- export declare class HttpClientError extends Error {
6
- code: string;
7
- statusCode?: number | undefined;
8
- originalError?: Error | undefined;
9
- url?: string | undefined;
10
- method?: string | undefined;
11
- /**
12
- * @ru Создает новый экземпляр HttpClientError.
13
- * @en Creates a new HttpClientError instance.
14
- */
15
- constructor(message: string, code?: string, statusCode?: number | undefined, originalError?: Error | undefined, url?: string | undefined, method?: string | undefined);
16
- /**
17
- * @ru Проверяет, является ли ошибка экземпляром HttpClientError (безопасно для разрозненных бандлов).
18
- * @en Checks if an error is an HttpClientError instance (bundle boundary safe).
19
- */
20
- static isHttpClientError(err: unknown): err is HttpClientError;
21
- }
22
- /**
23
- * @ru Ошибка, возникающая при превышении лимита времени ожидания ответа от сервера.
24
- * @en Error thrown when a network request exceeds its allocated execution timeout threshold.
25
- */
26
- export declare class TimeoutError extends HttpClientError {
27
- /**
28
- * @ru Создает новый экземпляр TimeoutError.
29
- * @en Creates a new TimeoutError instance.
30
- */
31
- constructor(url: string, timeout: number);
32
- /**
33
- * @ru Проверяет, является ли ошибка экземпляром TimeoutError.
34
- * @en Checks if an error is a TimeoutError instance.
35
- */
36
- static isTimeoutError(err: unknown): err is TimeoutError;
37
- }
38
- //# sourceMappingURL=errors.d.ts.map
@@ -1 +0,0 @@
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;IACH,YACE,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,EAKvB;IAED;;;OAGG;IACH,OAAc,iBAAiB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,eAAe,CAIpE;CACF;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C;;;OAGG;IACH,YAAY,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAIvC;IAED;;;OAGG;IACH,OAAc,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,YAAY,CAE9D;CACF"}
@@ -1,2 +0,0 @@
1
- "use strict";export class HttpClientError extends Error{code;statusCode;originalError;url;method;constructor(t,e="HTTP_ERROR",s,o,r,i){super(t,o?{cause:o}:void 0),this.code=e,this.statusCode=s,this.originalError=o,this.url=r,this.method=i,this.name="HttpClientError",Object.setPrototypeOf(this,new.target.prototype)}static isHttpClientError(t){return t instanceof HttpClientError||t instanceof Error&&t.code==="HTTP_ERROR"}}export class TimeoutError extends HttpClientError{constructor(t,e){super(`Timeout after ${e}ms`,"TIMEOUT",408,void 0,t),this.name="TimeoutError",Object.setPrototypeOf(this,new.target.prototype)}static isTimeoutError(t){return t instanceof TimeoutError||t instanceof Error&&t.code==="TIMEOUT"}}
2
- //# sourceMappingURL=errors.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/errors.ts"],
4
- "sourcesContent": ["/**\n * @ru Базовый класс ошибок клиента Hyperttp, агрегирующий контекст неудачного сетевого запроса.\n * @en Base error class for the Hyperttp client, providing explicit layout context for failed requests.\n */\nexport class HttpClientError extends Error {\n /**\n * @ru Создает новый экземпляр HttpClientError.\n * @en Creates a new HttpClientError instance.\n */\n constructor(\n message: string,\n public code: string = \"HTTP_ERROR\",\n public statusCode?: number,\n public originalError?: Error,\n public url?: string,\n public method?: string,\n ) {\n super(message, originalError ? { cause: originalError } : undefined);\n this.name = \"HttpClientError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * @ru Проверяет, является ли ошибка экземпляром HttpClientError (безопасно для разрозненных бандлов).\n * @en Checks if an error is an HttpClientError instance (bundle boundary safe).\n */\n public static isHttpClientError(err: unknown): err is HttpClientError {\n return (\n err instanceof HttpClientError || (err instanceof Error && (err as any).code === \"HTTP_ERROR\")\n );\n }\n}\n\n/**\n * @ru Ошибка, возникающая при превышении лимита времени ожидания ответа от сервера.\n * @en Error thrown when a network request exceeds its allocated execution timeout threshold.\n */\nexport class TimeoutError extends HttpClientError {\n /**\n * @ru Создает новый экземпляр TimeoutError.\n * @en Creates a new TimeoutError instance.\n */\n constructor(url: string, timeout: number) {\n super(`Timeout after ${timeout}ms`, \"TIMEOUT\", 408, undefined, url);\n this.name = \"TimeoutError\";\n Object.setPrototypeOf(this, new.target.prototype);\n }\n\n /**\n * @ru Проверяет, является ли ошибка экземпляром TimeoutError.\n * @en Checks if an error is a TimeoutError instance.\n */\n public static isTimeoutError(err: unknown): err is TimeoutError {\n return err instanceof TimeoutError || (err instanceof Error && (err as any).code === \"TIMEOUT\");\n }\n}\n"],
5
- "mappings": "aAIM,aAAO,wBAAwB,KAAK,CAO/B,KACA,WACA,cACA,IACA,OANT,YACEA,EACOC,EAAe,aACfC,EACAC,EACAC,EACAC,EAAe,CAEtB,MAAML,EAASG,EAAgB,CAAE,MAAOA,CAAa,EAAK,MAAS,YAN5DF,kBACAC,qBACAC,WACAC,cACAC,EAGP,KAAK,KAAO,kBACZ,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CAMO,OAAO,kBAAkBC,EAAY,CAC1C,OACEA,aAAe,iBAAoBA,aAAe,OAAUA,EAAY,OAAS,YAErF,EAOI,aAAO,qBAAqB,eAAe,CAK/C,YAAYF,EAAaG,EAAe,CACtC,MAAM,iBAAiBA,CAAO,KAAM,UAAW,IAAK,OAAWH,CAAG,EAClE,KAAK,KAAO,eACZ,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CAMO,OAAO,eAAeE,EAAY,CACvC,OAAOA,aAAe,cAAiBA,aAAe,OAAUA,EAAY,OAAS,SACvF",
6
- "names": ["message", "code", "statusCode", "originalError", "url", "method", "err", "timeout"]
7
- }
@@ -1,35 +0,0 @@
1
- import type { Method, RequestBodyData } from "@hyperttp/types";
2
- type NormalizedHeaders = Record<string, string | string[]>;
3
- /**
4
- * @ru Извлекает URL из запроса (строка, объект с url/_url или схема+хост+путь).
5
- * @en Extracts the URL from a request (string, object with url/_url, or scheme+host+path).
6
- * @param req - URL string or request-like object.
7
- * @returns The extracted URL string.
8
- */
9
- export declare function normalizeUrl(req: unknown): string;
10
- /**
11
- * @ru Нормализует заголовки в плоский объект с нижним регистром ключей и обработкой массива/парных форматов.
12
- * @en Normalizes headers into a flat object with lowercased keys, handling array/pair formats.
13
- * @param headers - Headers in any supported format (object, array of pairs, flat array).
14
- * @param out - Optional output object (reused for pooling).
15
- * @returns Normalized headers object.
16
- */
17
- export declare function normalizeHeaders(headers: unknown, out?: NormalizedHeaders): NormalizedHeaders;
18
- /**
19
- * @ru Возвращает undefined для GET/HEAD (тело запрещено), иначе тело как есть.
20
- * @en Returns undefined for GET/HEAD (body disallowed), otherwise the body as-is.
21
- * @param method - HTTP method.
22
- * @param body - Request body.
23
- * @returns Normalized body or undefined.
24
- */
25
- export declare function normalizeBody(method: Method, body: RequestBodyData | undefined): RequestBodyData | undefined;
26
- /**
27
- * @ru Преобразует тело для транспорта: сериализует объекты в JSON, URLSearchParams в строку, проставляет Content-Type.
28
- * @en Transforms body for transport: serializes objects to JSON, URLSearchParams to string, sets Content-Type.
29
- * @param body - Request body.
30
- * @param headers - Headers object (may be mutated to add Content-Type).
31
- * @returns Body ready for transport.
32
- */
33
- export declare function normalizeBodyForTransport(body: RequestBodyData, headers: Record<string, string | string[]>): RequestBodyData;
34
- export {};
35
- //# sourceMappingURL=normalize.d.ts.map
@@ -1 +0,0 @@
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;AAsE3D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAwBjD;AA8DD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,GAAE,iBAAsB,GAAG,iBAAiB,CAoDjG;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,eAAe,GAAG,SAAS,GAChC,eAAe,GAAG,SAAS,CAE7B;AASD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GACzC,eAAe,CA8BjB"}
@@ -1,2 +0,0 @@
1
- "use strict";const u=Object.create(null),p=["content-type","content-length","content-encoding","content-disposition","host","authorization","proxy-authorization","user-agent","referer","origin","location","etag","last-modified"];for(let n=0;n<p.length;n++)u[p[n]]=1;const a=Object.create(null),l=["accept","accept-encoding","accept-language","authorization","cache-control","connection","content-encoding","content-length","content-type","cookie","date","etag","host","if-modified-since","if-none-match","keep-alive","location","origin","pragma","proxy-authorization","referer","sec-ch-ua","server","set-cookie","transfer-encoding","user-agent","x-forwarded-for","x-requested-with"];for(let n=0;n<l.length;n++){const t=l[n];a[t]=t}function s(n){const t=a[n];if(t!==void 0)return t;const e=n.toLowerCase();return a[n]=e,e}export function normalizeUrl(n){if(typeof n=="string")return n;if(n&&typeof n=="object"){const t=n,e=t.url;if(typeof e=="string")return e;if(e!=null)return String(e);const i=t._url;if(typeof i=="string")return i;if(i!=null)return String(i);const r=t.scheme,o=t.host,f=t.path;if(typeof r=="string"&&typeof o=="string"&&typeof f=="string")return r+"://"+o+f}throw new Error("URL missing in request")}function y(n){const t=n.length;for(let e=0;e<t;e++){const i=n.charCodeAt(e);if(i===10||i===13)return!0}return!1}function c(n,t,e){if(y(e)&&(e=e.replace(/[\r\n]/g,"")),u[t]===1){n[t]=e;return}const i=n[t];if(i===void 0){n[t]=t==="set-cookie"?[e]:e;return}if(t==="set-cookie"){Array.isArray(i)?i.push(e):n[t]=[i,e];return}if(t==="cookie"||t==="cookie2"){n[t]=i+"; "+e;return}n[t]=i+", "+e}function d(n,t,e){if(e!=null){if(Array.isArray(e)){const i=e.length;for(let r=0;r<i;r++){const o=e[r];o!=null&&c(n,t,typeof o=="string"?o:String(o))}return}c(n,t,typeof e=="string"?e:String(e))}}export function normalizeHeaders(n,t={}){if(!n||typeof n!="object")return t;if(!Array.isArray(n)){for(const i in n)if(Object.prototype.hasOwnProperty.call(n,i)){const r=n[i];r!=null&&d(t,s(i),r)}return t}const e=n.length;if(e===0)return t;if(Array.isArray(n[0]))for(let i=0;i<e;i++){const r=n[i];if(!Array.isArray(r))continue;const o=r[0];if(typeof o!="string"||o.length===0)continue;const f=r[1];f!=null&&c(t,s(o),typeof f=="string"?f:String(f))}else for(let i=0;i<e;i+=2){const r=n[i];if(typeof r!="string"||r.length===0)continue;const o=n[i+1];o!=null&&c(t,s(r),typeof o=="string"?o:String(o))}return t}export function normalizeBody(n,t){return n==="GET"||n==="HEAD"?void 0:t}function g(n){const t=n["content-type"];if(typeof t=="string")return t;if(Array.isArray(t))return t[0]}export function normalizeBodyForTransport(n,t){return n==null?n:typeof URLSearchParams<"u"&&n instanceof URLSearchParams?(g(t)||(t["content-type"]="application/x-www-form-urlencoded"),n.toString()):typeof n=="object"&&n!==null&&!(n instanceof Uint8Array)&&!(n instanceof ArrayBuffer)&&!(typeof ArrayBuffer<"u"&&ArrayBuffer.isView?.(n))&&!(typeof URLSearchParams<"u"&&n instanceof URLSearchParams)&&!(typeof FormData<"u"&&n instanceof FormData)&&!(typeof Blob<"u"&&n instanceof Blob)&&!(typeof ReadableStream<"u"&&n instanceof ReadableStream)&&!("pipe"in n&&typeof n.pipe=="function")?(g(t)||(t["content-type"]="application/json"),JSON.stringify(n)):n}
2
- //# sourceMappingURL=normalize.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/normalize.ts"],
4
- "sourcesContent": ["import type { Method, RequestBodyData } from \"@hyperttp/types\";\n\ntype NormalizedHeaders = Record<string, string | string[]>;\n\nconst SINGLE_VALUE_HEADERS: Record<string, 1> = Object.create(null);\nconst singleHeaders = [\n \"content-type\",\n \"content-length\",\n \"content-encoding\",\n \"content-disposition\",\n \"host\",\n \"authorization\",\n \"proxy-authorization\",\n \"user-agent\",\n \"referer\",\n \"origin\",\n \"location\",\n \"etag\",\n \"last-modified\",\n] as const;\n\nfor (let i = 0; i < singleHeaders.length; i++) {\n SINGLE_VALUE_HEADERS[singleHeaders[i]!] = 1;\n}\n\nconst HEADER_KEY_CACHE: Record<string, string> = Object.create(null);\n\nconst COMMON_HEADERS = [\n \"accept\",\n \"accept-encoding\",\n \"accept-language\",\n \"authorization\",\n \"cache-control\",\n \"connection\",\n \"content-encoding\",\n \"content-length\",\n \"content-type\",\n \"cookie\",\n \"date\",\n \"etag\",\n \"host\",\n \"if-modified-since\",\n \"if-none-match\",\n \"keep-alive\",\n \"location\",\n \"origin\",\n \"pragma\",\n \"proxy-authorization\",\n \"referer\",\n \"sec-ch-ua\",\n \"server\",\n \"set-cookie\",\n \"transfer-encoding\",\n \"user-agent\",\n \"x-forwarded-for\",\n \"x-requested-with\",\n] as const;\n\nfor (let i = 0; i < COMMON_HEADERS.length; i++) {\n const lower = COMMON_HEADERS[i]!;\n HEADER_KEY_CACHE[lower] = lower;\n}\n\nfunction fastLowercaseKey(key: string): string {\n const cached = HEADER_KEY_CACHE[key];\n if (cached !== undefined) return cached;\n\n const lower = key.toLowerCase();\n HEADER_KEY_CACHE[key] = lower;\n return lower;\n}\n\n/**\n * @ru Извлекает URL из запроса (строка, объект с url/_url или схема+хост+путь).\n * @en Extracts the URL from a request (string, object with url/_url, or scheme+host+path).\n * @param req - URL string or request-like object.\n * @returns The extracted URL string.\n */\nexport function normalizeUrl(req: unknown): string {\n if (typeof req === \"string\") return req;\n\n if (req && typeof req === \"object\") {\n const r = req as Record<string, unknown>;\n\n const url = r.url;\n if (typeof url === \"string\") return url;\n if (url != null) return String(url);\n\n const u = r._url;\n if (typeof u === \"string\") return u;\n if (u != null) return String(u);\n\n const scheme = r.scheme;\n const host = r.host;\n const path = r.path;\n\n if (typeof scheme === \"string\" && typeof host === \"string\" && typeof path === \"string\") {\n return scheme + \"://\" + host + path;\n }\n }\n\n throw new Error(\"URL missing in request\");\n}\n\nfunction hasNewline(str: string): boolean {\n const len = str.length;\n for (let i = 0; i < len; i++) {\n const code = str.charCodeAt(i);\n if (code === 10 || code === 13) return true;\n }\n return false;\n}\n\nfunction appendHeader(out: NormalizedHeaders, lowerKey: string, value: string): void {\n if (hasNewline(value)) {\n value = value.replace(/[\\r\\n]/g, \"\");\n }\n\n if (SINGLE_VALUE_HEADERS[lowerKey] === 1) {\n out[lowerKey] = value;\n return;\n }\n\n const existing = out[lowerKey];\n\n if (existing === undefined) {\n out[lowerKey] = lowerKey === \"set-cookie\" ? [value] : value;\n return;\n }\n\n if (lowerKey === \"set-cookie\") {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n out[lowerKey] = [existing, value];\n }\n return;\n }\n\n if (lowerKey === \"cookie\" || lowerKey === \"cookie2\") {\n out[lowerKey] = existing + \"; \" + value;\n return;\n }\n\n out[lowerKey] = existing + \", \" + value;\n}\n\nfunction appendRawValue(out: NormalizedHeaders, lower: string, raw: unknown): void {\n if (raw === undefined || raw === null) return;\n\n if (Array.isArray(raw)) {\n const len = raw.length;\n for (let i = 0; i < len; i++) {\n const item = raw[i];\n if (item !== undefined && item !== null) {\n appendHeader(out, lower, typeof item === \"string\" ? item : String(item));\n }\n }\n return;\n }\n\n appendHeader(out, lower, typeof raw === \"string\" ? raw : String(raw));\n}\n\n/**\n * @ru Нормализует заголовки в плоский объект с нижним регистром ключей и обработкой массива/парных форматов.\n * @en Normalizes headers into a flat object with lowercased keys, handling array/pair formats.\n * @param headers - Headers in any supported format (object, array of pairs, flat array).\n * @param out - Optional output object (reused for pooling).\n * @returns Normalized headers object.\n */\nexport function normalizeHeaders(headers: unknown, out: NormalizedHeaders = {}): NormalizedHeaders {\n if (!headers || typeof headers !== \"object\") return out;\n\n if (!Array.isArray(headers)) {\n for (const key in headers) {\n if (Object.prototype.hasOwnProperty.call(headers, key)) {\n const val = (headers as Record<string, unknown>)[key];\n if (val !== undefined && val !== null) {\n appendRawValue(out, fastLowercaseKey(key), val);\n }\n }\n }\n return out;\n }\n\n const len = headers.length;\n if (len === 0) return out;\n\n if (Array.isArray(headers[0])) {\n for (let i = 0; i < len; i++) {\n const pair = headers[i];\n if (!Array.isArray(pair)) continue;\n\n const key = pair[0];\n if (typeof key !== \"string\" || key.length === 0) continue;\n\n const rawValue = pair[1];\n if (rawValue === undefined || rawValue === null) continue;\n\n appendHeader(\n out,\n fastLowercaseKey(key),\n typeof rawValue === \"string\" ? rawValue : String(rawValue),\n );\n }\n } else {\n for (let i = 0; i < len; i += 2) {\n const key = headers[i];\n if (typeof key !== \"string\" || key.length === 0) continue;\n\n const rawValue = headers[i + 1];\n if (rawValue === undefined || rawValue === null) continue;\n\n appendHeader(\n out,\n fastLowercaseKey(key),\n typeof rawValue === \"string\" ? rawValue : String(rawValue),\n );\n }\n }\n\n return out;\n}\n\n/**\n * @ru Возвращает undefined для GET/HEAD (тело запрещено), иначе тело как есть.\n * @en Returns undefined for GET/HEAD (body disallowed), otherwise the body as-is.\n * @param method - HTTP method.\n * @param body - Request body.\n * @returns Normalized body or undefined.\n */\nexport function normalizeBody(\n method: Method,\n body: RequestBodyData | undefined,\n): RequestBodyData | undefined {\n return method === \"GET\" || method === \"HEAD\" ? undefined : body;\n}\n\nfunction getContentType(headers: Record<string, string | string[]>): string | undefined {\n const ct = headers[\"content-type\"];\n if (typeof ct === \"string\") return ct;\n if (Array.isArray(ct)) return ct[0];\n return undefined;\n}\n\n/**\n * @ru Преобразует тело для транспорта: сериализует объекты в JSON, URLSearchParams в строку, проставляет Content-Type.\n * @en Transforms body for transport: serializes objects to JSON, URLSearchParams to string, sets Content-Type.\n * @param body - Request body.\n * @param headers - Headers object (may be mutated to add Content-Type).\n * @returns Body ready for transport.\n */\nexport function normalizeBodyForTransport(\n body: RequestBodyData,\n headers: Record<string, string | string[]>,\n): RequestBodyData {\n if (body == null) return body;\n\n if (typeof URLSearchParams !== \"undefined\" && body instanceof URLSearchParams) {\n if (!getContentType(headers)) {\n headers[\"content-type\"] = \"application/x-www-form-urlencoded\";\n }\n return body.toString();\n }\n\n const isSerializableObject =\n typeof body === \"object\" &&\n body !== null &&\n !(body instanceof Uint8Array) &&\n !(body instanceof ArrayBuffer) &&\n !(typeof ArrayBuffer !== \"undefined\" && ArrayBuffer.isView?.(body)) &&\n !(typeof URLSearchParams !== \"undefined\" && body instanceof URLSearchParams) &&\n !(typeof FormData !== \"undefined\" && body instanceof FormData) &&\n !(typeof Blob !== \"undefined\" && body instanceof Blob) &&\n !(typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream) &&\n !(\"pipe\" in body && typeof (body as any).pipe === \"function\");\n\n if (isSerializableObject) {\n if (!getContentType(headers)) {\n headers[\"content-type\"] = \"application/json\";\n }\n return JSON.stringify(body);\n }\n\n return body;\n}\n"],
5
- "mappings": "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",
6
- "names": ["SINGLE_VALUE_HEADERS", "singleHeaders", "i", "HEADER_KEY_CACHE", "COMMON_HEADERS", "lower", "fastLowercaseKey", "key", "cached", "req", "r", "url", "u", "scheme", "host", "path", "hasNewline", "str", "len", "code", "appendHeader", "out", "lowerKey", "value", "existing", "appendRawValue", "raw", "item", "headers", "val", "pair", "rawValue", "method", "body", "getContentType", "ct"]
7
- }
@@ -1,63 +0,0 @@
1
- import type { HyperPlugin, PluginContext, InternalRequest, HttpResponse, HyperttpError, HttpClientOptions, TransportResponse } from "@hyperttp/types";
2
- /**
3
- * @ru Структура записи хука с метаданными для оптимизации и сортировки.
4
- * @en Hook record structure with metadata for optimization and sorting.
5
- */
6
- export interface HookRecord<T> {
7
- /** @ru Уникальное имя хука. @en Unique hook name. */
8
- readonly name: string;
9
- /** @ru Приоритет выполнения (выше значение — раньше выполнение). @en Execution priority (higher value runs earlier). */
10
- readonly priority: number;
11
- /** @ru Функция-обработчик. @en Handler function. */
12
- readonly run: T;
13
- }
14
- /**
15
- * @ru Контейнер конвейеров для различных фаз обработки запроса/ответа.
16
- * @en Pipeline container for different request/response processing phases.
17
- */
18
- export interface PipelineContainer {
19
- /** @ru Хуки, выполняемые перед отправкой запроса. @en Hooks executed before sending the request. */
20
- readonly request: HookRecord<Required<HyperPlugin>["onRequest"]>[];
21
- /** @ru Хуки, обрабатывающие сырые данные транспорта. @en Hooks processing raw transport data. */
22
- readonly responseData: HookRecord<Required<HyperPlugin>["onResponseData"]>[];
23
- /** @ru Хуки, мутирующие ответ (последовательное выполнение). @en Hooks that mutate the response (sequential execution). */
24
- readonly responseMutators: HookRecord<Required<HyperPlugin>["onResponse"]>[];
25
- /** @ru Хуки с побочными эффектами (выполняются в фоне). @en Side-effect hooks (executed in the background). */
26
- readonly responseSideEffects: HookRecord<Required<HyperPlugin>["onResponse"]>[];
27
- /** @ru Хуки для перехвата ошибок. @en Error interception hooks. */
28
- readonly error: HookRecord<Required<HyperPlugin>["onError"]>[];
29
- }
30
- /**
31
- * @ru Создаёт пустой контейнер для конвейеров плагинов.
32
- * @en Creates an empty container for plugin pipelines.
33
- * @returns An empty pipeline container.
34
- */
35
- export declare function createPipelines(): PipelineContainer;
36
- /**
37
- * @ru Вставляет хук в массив с сохранением сортировки по убыванию приоритета (деревья поиска тут избыточны).
38
- * @en Inserts a hook into the array maintaining descending priority order.
39
- * @param list - Target array to insert into.
40
- * @param hook - Hook record to insert.
41
- */
42
- export declare function insertHookSorted<T>(list: HookRecord<T>[], hook: HookRecord<T>): void;
43
- /**
44
- * @ru Выполняет конвейер пред-запроса. Поддерживает short-circuit.
45
- * @en Executes the pre-request pipeline. Supports short-circuiting.
46
- */
47
- export declare function executeRequestPipeline(hooks: readonly HookRecord<Required<HyperPlugin>["onRequest"]>[], req: InternalRequest, ctx: PluginContext): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null;
48
- /**
49
- * @ru Выполняет низкоуровневый конвейер трансформации сырых данных транспорта (фаза DATA).
50
- * @en Executes low-level transport data transformation pipeline (DATA phase).
51
- */
52
- export declare function executeResponseDataPipeline(hooks: readonly HookRecord<Required<HyperPlugin>["onResponseData"]>[], res: TransportResponse, ctx: PluginContext): Promise<TransportResponse> | TransportResponse;
53
- /**
54
- * @ru Выполняет конвейер пост-ответа. Разделен на мутаторы и сайд-эффекты.
55
- * @en Executes the post-response pipeline. Split into mutators and side-effects.
56
- */
57
- export declare function executeResponsePipeline(mutators: readonly HookRecord<Required<HyperPlugin>["onResponse"]>[], sideEffects: readonly HookRecord<Required<HyperPlugin>["onResponse"]>[], res: HttpResponse<unknown>, req: InternalRequest, ctx: PluginContext, logger?: HttpClientOptions["logger"]): Promise<void> | void;
58
- /**
59
- * @ru Выполняет конвейер перехвата ошибок.
60
- * @en Executes the error interception pipeline.
61
- */
62
- export declare function executeErrorPipeline(hooks: readonly HookRecord<Required<HyperPlugin>["onError"]>[], error: HyperttpError, req: InternalRequest, ctx: PluginContext): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null;
63
- //# sourceMappingURL=pipeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/utils/pipeline.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";export function createPipelines(){return{request:[],responseData:[],responseMutators:[],responseSideEffects:[],error:[]}}export function insertHookSorted(e,r){const i=e.length;let n=0;for(;n<i&&e[n].priority>=r.priority;)n++;e.splice(n,0,r)}export function executeRequestPipeline(e,r,i){const n=e.length;if(n===0)return null;for(let c=0;c<n;c++){const t=e[c].run(r,i);if(t!=null)return t instanceof Promise?p(e,r,i,c,t):t}return null}export function executeResponseDataPipeline(e,r,i){const n=e.length;if(n===0)return r;let c=r;for(let s=0;s<n;s++){const t=e[s].run(c,i);if(t instanceof Promise)return y(e,i,s,t,c);t!=null&&(c=t)}return c}export function executeResponsePipeline(e,r,i,n,c,s){const t=r.length;if(t>0)for(let l=0;l<t;l++){const u=r[l];try{const f=u.run(i,n,c);f instanceof Promise&&w(f,u.name,s)}catch(f){a(f,u.name,s)}}const o=e.length;if(o>0)for(let l=0;l<o;l++){const u=e[l].run(i,n,c);if(u instanceof Promise)return P(e,i,n,c,l,u)}}export function executeErrorPipeline(e,r,i,n){const c=e.length;if(c===0)return null;for(let s=0;s<c;s++){const t=e[s].run(r,i,n);if(t instanceof Promise)return h(e,r,i,n,s,t);if(t!=null)return t}return null}async function p(e,r,i,n,c){const s=await c;if(s!=null)return s;const t=e.length;for(let o=n+1;o<t;o++){const l=e[o].run(r,i);if(l instanceof Promise){const u=await l;if(u!=null)return u}else if(l!=null)return l}return null}async function y(e,r,i,n,c){let s=c;const t=await n;t!=null&&(s=t);const o=e.length;for(let l=i+1;l<o;l++){const u=e[l].run(s,r);if(u instanceof Promise){const f=await u;f!=null&&(s=f)}else u!=null&&(s=u)}return s}async function P(e,r,i,n,c,s){await s;const t=e.length;for(let o=c+1;o<t;o++){const l=e[o].run(r,i,n);l instanceof Promise&&await l}}async function h(e,r,i,n,c,s){const t=await s;if(t!=null)return t;const o=e.length;for(let l=c+1;l<o;l++){const u=e[l].run(r,i,n);if(u instanceof Promise){const f=await u;if(f!=null)return f}else if(u!=null)return u}return null}function w(e,r,i){e.catch(n=>a(n,r,i))}function a(e,r,i){const n=e instanceof Error?e:new Error(String(e));i?i("warn",`Background hook "${r}" crashed: ${n.message}`,n):console.warn(`[Hyperttp] Background hook "${r}" crashed:`,n)}
2
- //# sourceMappingURL=pipeline.js.map
@@ -1,7 +0,0 @@
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 Структура записи хука с метаданными для оптимизации и сортировки.\n * @en Hook record structure with metadata for optimization and sorting.\n */\nexport interface HookRecord<T> {\n /** @ru Уникальное имя хука. @en Unique hook name. */\n readonly name: string;\n /** @ru Приоритет выполнения (выше значение — раньше выполнение). @en Execution priority (higher value runs earlier). */\n readonly priority: number;\n /** @ru Функция-обработчик. @en Handler function. */\n readonly run: T;\n}\n\n/**\n * @ru Контейнер конвейеров для различных фаз обработки запроса/ответа.\n * @en Pipeline container for different request/response processing phases.\n */\nexport interface PipelineContainer {\n /** @ru Хуки, выполняемые перед отправкой запроса. @en Hooks executed before sending the request. */\n readonly request: HookRecord<Required<HyperPlugin>[\"onRequest\"]>[];\n /** @ru Хуки, обрабатывающие сырые данные транспорта. @en Hooks processing raw transport data. */\n readonly responseData: HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[];\n /** @ru Хуки, мутирующие ответ (последовательное выполнение). @en Hooks that mutate the response (sequential execution). */\n readonly responseMutators: HookRecord<Required<HyperPlugin>[\"onResponse\"]>[];\n /** @ru Хуки с побочными эффектами (выполняются в фоне). @en Side-effect hooks (executed in the background). */\n readonly responseSideEffects: HookRecord<Required<HyperPlugin>[\"onResponse\"]>[];\n /** @ru Хуки для перехвата ошибок. @en Error interception hooks. */\n readonly error: HookRecord<Required<HyperPlugin>[\"onError\"]>[];\n}\n\n/**\n * @ru Создаёт пустой контейнер для конвейеров плагинов.\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 Вставляет хук в массив с сохранением сортировки по убыванию приоритета (деревья поиска тут избыточны).\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 Выполняет конвейер пред-запроса. Поддерживает 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 Выполняет низкоуровневый конвейер трансформации сырых данных транспорта (фаза 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 Выполняет конвейер пост-ответа. Разделен на мутаторы и сайд-эффекты.\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 Выполняет конвейер перехвата ошибок.\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,108 +0,0 @@
1
- import type { HttpResponse, HyperTransport, HyperBody } from "@hyperttp/types";
2
- type TransportResponse = Awaited<ReturnType<HyperTransport["execute"]>>;
3
- declare const RAW_CACHE: unique symbol;
4
- declare const TEXT_CACHE: unique symbol;
5
- declare const JSON_CACHE: unique symbol;
6
- type CacheHolder = {
7
- [RAW_CACHE]?: Uint8Array;
8
- [TEXT_CACHE]?: string;
9
- [JSON_CACHE]?: unknown;
10
- };
11
- /**
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.
16
- */
17
- export declare const cloneBodyFast: <T>(body: T) => T;
18
- /**
19
- * @ru Реализация HttpResponse с ленивым потреблением тела, кэшированием raw/text/json и поддержкой пулинга.
20
- * @en HttpResponse implementation with lazy body consumption, raw/text/json caching, and pooling support.
21
- */
22
- export declare class HyperHttpResponse<T = unknown> implements HttpResponse<T>, CacheHolder {
23
- status: number;
24
- headers: Record<string, string | string[]>;
25
- body: T | HyperBody | Uint8Array | null;
26
- url: string;
27
- data: T | null;
28
- [RAW_CACHE]: Uint8Array | undefined;
29
- [TEXT_CACHE]: string | undefined;
30
- [JSON_CACHE]: unknown | undefined;
31
- private _bodyConsumed;
32
- private _raw;
33
- constructor(rawResponse?: TransportResponse);
34
- /**
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.
39
- */
40
- init(rawResponse: TransportResponse): this;
41
- private _consumeBody;
42
- /**
43
- * @ru Возвращает тело ответа как ArrayBuffer, потребляя его при необходимости.
44
- * @en Returns the response body as ArrayBuffer, consuming it if necessary.
45
- * @returns Promise resolving to an ArrayBuffer.
46
- */
47
- arrayBuffer(): Promise<ArrayBuffer>;
48
- text(): Promise<string>;
49
- /**
50
- * @ru Возвращает тело ответа, разобранное как JSON. Для объектов возвращает их напрямую (без потребления).
51
- * @en Returns the response body parsed as JSON. Returns objects directly (no consumption).
52
- * @returns Promise resolving to the parsed JSON value.
53
- */
54
- json<TJson = T>(): Promise<TJson>;
55
- /**
56
- * @ru Полный сброс состояния для переиспользования в пуле. Очищает все кэши и приватные поля.
57
- * @en Full state reset for pool reuse. Clears all caches and private fields.
58
- */
59
- reset(): void;
60
- /**
61
- * @ru Сбрасывает тело ответа (для стримов — отменяет/cancel).
62
- * @en Discards the response body (cancels streams).
63
- * @returns Promise that resolves when the body is discarded.
64
- */
65
- dump(): Promise<void>;
66
- /**
67
- * @ru Клонирует ответ с разделением стримов через tee().
68
- * @en Clones the response, splitting streams via tee().
69
- * @returns A new HttpResponse instance.
70
- */
71
- clone(): HttpResponse<T>;
72
- }
73
- export declare const responsePool: HyperHttpResponse<any>[];
74
- /**
75
- * @ru Создаёт HttpResponse из транспортного ответа с переиспользованием пула.
76
- * @en Creates an HttpResponse from a transport response reusing the pool.
77
- * @param rawResponse - The raw transport response.
78
- * @returns An HttpResponse instance.
79
- */
80
- export declare const mapResponseFast: (rawResponse: TransportResponse) => HttpResponse<unknown>;
81
- /**
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.
90
- * @param rawResponse - The raw transport response.
91
- * @returns A StreamResponse-like object.
92
- */
93
- export declare const mapStreamFast: (rawResponse: TransportResponse) => {
94
- status: number;
95
- headers: Record<string, string | string[]>;
96
- body: import("@hyperttp/types").TransportResponsePayload;
97
- url: string;
98
- };
99
- /**
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.
105
- */
106
- export declare const mergeHeadersFast: (base: Record<string, string | string[]>, override?: Record<string, string | string[]>) => Record<string, string | string[]>;
107
- export {};
108
- //# sourceMappingURL=response.d.ts.map
@@ -1 +0,0 @@
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,CAU/C;IAEY,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAgBnC;IAED;;;;OAIG;IACU,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAsC7C;IAED;;;OAGG;IACI,KAAK,IAAI,IAAI,CAWnB;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,IAK5D,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,CASlC,CAAC"}
@@ -1,2 +0,0 @@
1
- "use strict";import{CURRENT_RUNTIME as y}from"../transports/manager.js";const s=Symbol("hyperttp.rawCache"),r=Symbol("hyperttp.textCache"),o=Symbol("hyperttp.jsonCache"),f=new TextDecoder,c=new TextEncoder,h=Object.freeze({});function u(e){return typeof e=="object"&&e!==null&&"getReader"in e&&typeof e.getReader=="function"}function d(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){const i=Object.create(n);for(const a in e)Object.prototype.hasOwnProperty.call(e,a)&&(i[a]=e[a]);return i}try{return structuredClone(e)}catch{try{return JSON.parse(JSON.stringify(e))}catch{const i=Object.create(n);for(const a in e)Object.prototype.hasOwnProperty.call(e,a)&&(i[a]=e[a]);return i}}};export class HyperHttpResponse{status;headers;body;url;data;[s];[r];[o];_bodyConsumed;_raw;constructor(t){this.status=0,this.headers=h,this.body=null,this.url="",this.data=null,this[s]=void 0,this[r]=void 0,this[o]=void 0,this._bodyConsumed=!1,this._raw=void 0,t&&this.init(t)}init(t){return this.status=t.status,this.headers=t.headers||h,this.body=t.body,this.url=t.url??"",this.data=null,this[s]=void 0,this[r]=void 0,this[o]=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]=c.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 n=await this._raw.arrayBuffer();this[s]=new Uint8Array(n),this.body=this[s],this._bodyConsumed=!0;return}if(y==="bun"&&t&&typeof t=="object"&&"arrayBuffer"in t){const n=t;if(typeof n.arrayBuffer=="function"){const i=await n.arrayBuffer();this[s]=new Uint8Array(i),this.body=this[s],this._bodyConsumed=!0;return}}if(u(t)||d(t)){if(u(t)&&t.locked)throw new Error("[Hyperttp] Stream is locked.");const i=await new Response(t).arrayBuffer();this[s]=new Uint8Array(i),this.body=this[s],this._bodyConsumed=!0}}}async arrayBuffer(){await this._consumeBody();const t=this[s];if(t===void 0)throw new Error("[Hyperttp] Response body is not available as ArrayBuffer");return t.byteOffset===0&&t.byteLength===t.buffer.byteLength?t.buffer:t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)}async text(){if(this[r]!==void 0)return this[r];if(this._raw&&typeof this._raw.text=="function"&&!this._bodyConsumed){this._bodyConsumed=!0;const t=await this._raw.text();return this[r]=t,t}if(await this._consumeBody(),this[s]===void 0)throw new Error("[Hyperttp] Response body is not available as text");return this[r]=f.decode(this[s]),this[r]}async json(){if(this[o]!==void 0)return this[o];const t=this.body;if(!this._bodyConsumed&&typeof t=="object"&&t!==null&&!u(t)&&!d(t)&&!(t instanceof Uint8Array)&&!(t instanceof ArrayBuffer)&&!("arrayBuffer"in t)&&!("text"in t)&&!("json"in t))return this._bodyConsumed=!0,this[o]=t,t;if(this._raw&&typeof this._raw.json=="function"&&!this._bodyConsumed){this._bodyConsumed=!0;const i=await this._raw.json();return this[o]=i,i}if(await this._consumeBody(),this[s]===void 0)throw new Error("[Hyperttp] Response body is not available as JSON");this[r]===void 0&&(this[r]=f.decode(this[s]));const n=JSON.parse(this[r]);return this[o]=n,n}reset(){this.status=0,this.headers=h,this.body=null,this.url="",this.data=null,this[s]=void 0,this[r]=void 0,this[o]=void 0,this._bodyConsumed=!1,this._raw=void 0}async dump(){if(this._bodyConsumed)return;this._bodyConsumed=!0;const t=this.body;u(t)?t.locked||await t.cancel().catch(()=>{}):d(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[r]=this[r],t[o]=this[o],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 responsePool=[];const b=64;export const mapResponseFast=e=>(responsePool.pop()??new HyperHttpResponse).init(e),recycleResponse=e=>{e instanceof HyperHttpResponse&&responsePool.length<b&&(e.reset(),responsePool.push(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)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e};
2
- //# sourceMappingURL=response.js.map