@hyperttp/core 1.5.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/Core/HyperCore.d.ts +176 -141
  2. package/Core/HyperCore.d.ts.map +1 -1
  3. package/Core/HyperCore.js +1 -1
  4. package/Core/HyperCore.js.map +3 -3
  5. package/README.md +260 -316
  6. package/defaultConfig.d.ts +9 -4
  7. package/defaultConfig.d.ts.map +1 -1
  8. package/defaultConfig.js +1 -1
  9. package/defaultConfig.js.map +2 -2
  10. package/index.d.ts +3 -0
  11. package/index.d.ts.map +1 -1
  12. package/index.js +1 -1
  13. package/index.js.map +2 -2
  14. package/package.json +39 -33
  15. package/protocols/manager.d.ts +31 -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 +31 -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 +19 -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 +71 -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 +24 -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 +17 -80
  44. package/transports/manager.d.ts.map +1 -1
  45. package/transports/manager.js +1 -6
  46. package/transports/manager.js.map +3 -3
  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 +12 -2
  52. package/utils/errors.d.ts.map +1 -1
  53. package/utils/errors.js +1 -1
  54. package/utils/errors.js.map +3 -3
  55. package/utils/merge.d.ts.map +1 -1
  56. package/utils/merge.js +1 -1
  57. package/utils/merge.js.map +2 -2
  58. package/Core/RequestBuilder.d.ts +0 -32
  59. package/Core/RequestBuilder.d.ts.map +0 -1
  60. package/Core/RequestBuilder.js +0 -2
  61. package/Core/RequestBuilder.js.map +0 -7
  62. package/transports/browser.d.ts +0 -37
  63. package/transports/browser.d.ts.map +0 -1
  64. package/transports/browser.js +0 -2
  65. package/transports/browser.js.map +0 -7
  66. package/transports/node.d.ts +0 -33
  67. package/transports/node.d.ts.map +0 -1
  68. package/transports/node.js +0 -2
  69. package/transports/node.js.map +0 -7
  70. package/utils/normalize.d.ts +0 -35
  71. package/utils/normalize.d.ts.map +0 -1
  72. package/utils/normalize.js +0 -2
  73. package/utils/normalize.js.map +0 -7
  74. package/utils/pipeline.d.ts +0 -63
  75. package/utils/pipeline.d.ts.map +0 -1
  76. package/utils/pipeline.js +0 -2
  77. package/utils/pipeline.js.map +0 -7
  78. package/utils/response.d.ts +0 -113
  79. package/utils/response.d.ts.map +0 -1
  80. package/utils/response.js +0 -2
  81. package/utils/response.js.map +0 -7
  82. package/utils/retryUtils.d.ts +0 -17
  83. package/utils/retryUtils.d.ts.map +0 -1
  84. package/utils/retryUtils.js +0 -2
  85. package/utils/retryUtils.js.map +0 -7
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/transports/fetch.ts"],
4
+ "sourcesContent": ["import type { IncomingMessage, OutgoingHttpHeaders, ServerResponse } from \"node:http\";\nimport type {\n HyperTransport,\n SenderProtocol,\n TransportListenOptions,\n TransportRequest,\n TransportResponse,\n TransportServer,\n} from \"@hyperttp/types\";\n\nconst DEFAULT_MAX_BODY_BYTES = 10 * 1024 * 1024;\n\nexport interface FetchTransportOptions {\n /**\n * @ru Кастомный список поддерживаемых протоколов.\n * @en Custom list of supported protocols.\n */\n protocols?: SenderProtocol[];\n maxBodyBytes?: number;\n}\n\ntype ExtendedTransportRequest = TransportRequest & {\n stream?: boolean;\n followRedirects?: boolean;\n};\n\nasync function loadNodeHttp(): Promise<typeof import(\"node:http\")> {\n if (typeof process === \"undefined\" || !process.versions?.node) {\n throw new Error(\"[FetchTransport] listen() is only available in Node.js.\");\n }\n\n const specifier = \"node:http\";\n return import(/* @vite-ignore */ specifier);\n}\n\n/**\n * @ru Минимальный транспорт на базе нативного fetch. Гарантированный fallback,\n * когда ни один пакетный транспорт (@hyperttp/transport-undici/bun) не установлен.\n * @en Minimal native fetch-based transport. A guaranteed fallback used when no\n * packaged transport (@hyperttp/transport-undici/bun) is installed.\n */\nexport class FetchTransport implements HyperTransport {\n public readonly protocols: readonly SenderProtocol[];\n private readonly maxBodyBytes: number;\n\n constructor(options: FetchTransportOptions = {}) {\n this.protocols = Object.freeze(options.protocols ?? [\"rest\"]);\n this.maxBodyBytes = options.maxBodyBytes ?? DEFAULT_MAX_BODY_BYTES;\n }\n\n public async execute(req: TransportRequest): Promise<TransportResponse> {\n const extendedRequest = req as ExtendedTransportRequest;\n const isBodyAllowed = req.method !== \"GET\" && req.method !== \"HEAD\";\n\n const res = await fetch(req.url, {\n method: req.method,\n headers: req.headers as Record<string, string>,\n body: isBodyAllowed ? ((req.body ?? null) as BodyInit | null) : null,\n signal: req.signal,\n redirect: extendedRequest.followRedirects === false ? \"manual\" : \"follow\",\n });\n\n const body = extendedRequest.stream ? res.body : new Uint8Array(await res.arrayBuffer());\n const headers: Record<string, string | string[]> = {};\n\n if (typeof res.headers.getSetCookie === \"function\") {\n const cookies = res.headers.getSetCookie();\n if (cookies.length > 0) {\n headers[\"set-cookie\"] = cookies;\n }\n }\n\n res.headers.forEach((value, key) => {\n const lowerKey = key.toLowerCase();\n\n if (lowerKey === \"set-cookie\" && headers[\"set-cookie\"]) {\n return;\n }\n\n if (headers[lowerKey]) {\n const existing = headers[lowerKey];\n headers[lowerKey] = Array.isArray(existing) ? [...existing, value] : [existing, value];\n } else {\n headers[lowerKey] = value;\n }\n });\n\n return {\n status: res.status,\n statusText: res.statusText,\n headers,\n url: res.url,\n body,\n };\n }\n\n public async listen(options: TransportListenOptions): Promise<TransportServer> {\n const { host, port, signal, onRequest } = options;\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"The operation was aborted\", \"AbortError\");\n }\n\n const { createServer } = await loadNodeHttp();\n\n const server = createServer(async (req: IncomingMessage, res: ServerResponse) => {\n const requestController = new AbortController();\n const abortRequest = () => {\n if (!requestController.signal.aborted) {\n requestController.abort(new DOMException(\"Client disconnected\", \"AbortError\"));\n }\n };\n const abortIncompleteRequest = () => {\n if (!req.complete) abortRequest();\n };\n const abortIncompleteResponse = () => {\n if (!res.writableEnded) abortRequest();\n };\n\n req.once(\"aborted\", abortRequest);\n req.once(\"close\", abortIncompleteRequest);\n res.once(\"close\", abortIncompleteResponse);\n\n try {\n const contentLength = Number(req.headers[\"content-length\"] ?? 0);\n if (Number.isFinite(contentLength) && contentLength > this.maxBodyBytes) {\n res.writeHead(413);\n res.end(\"Payload Too Large\");\n return;\n }\n\n const chunks: Uint8Array[] = [];\n let receivedBytes = 0;\n\n for await (const chunk of req) {\n receivedBytes += chunk.byteLength;\n if (receivedBytes > this.maxBodyBytes) {\n res.writeHead(413);\n res.end(\"Payload Too Large\");\n return;\n }\n chunks.push(chunk);\n }\n\n const body = chunks.length > 0 ? Buffer.concat(chunks) : undefined;\n const headers: Record<string, string | string[]> = {};\n\n for (const [key, value] of Object.entries(req.headers)) {\n if (value !== undefined) {\n headers[key] = value;\n }\n }\n\n const transportRequest: TransportRequest = {\n method: req.method ?? \"GET\",\n url: req.url ?? \"/\",\n headers,\n body,\n signal: requestController.signal,\n protocol: this.protocols[0] ?? \"rest\",\n };\n\n if (!onRequest) {\n res.writeHead(501);\n res.end(\"Not Implemented\");\n return;\n }\n\n const response = await onRequest(transportRequest);\n const outgoingHeaders: OutgoingHttpHeaders = {};\n\n for (const [key, value] of Object.entries(response.headers)) {\n outgoingHeaders[key] = value;\n }\n\n res.writeHead(response.status, response.statusText ?? \"\", outgoingHeaders);\n\n if (response.body != null) {\n if (response.body instanceof Uint8Array) {\n res.end(response.body);\n } else if (typeof response.body === \"string\") {\n res.end(response.body);\n } else {\n res.end(JSON.stringify(response.body));\n }\n } else {\n res.end();\n }\n } catch {\n if (!res.headersSent) {\n res.writeHead(500);\n res.end(\"Internal Server Error\");\n } else {\n res.destroy();\n }\n } finally {\n req.removeListener(\"aborted\", abortRequest);\n req.removeListener(\"close\", abortIncompleteRequest);\n res.removeListener(\"close\", abortIncompleteResponse);\n }\n });\n\n let closed = false;\n const close = (): Promise<void> => {\n if (closed) return Promise.resolve();\n closed = true;\n signal?.removeEventListener(\"abort\", closeOnAbort);\n server.removeListener(\"error\", reportRuntimeError);\n\n if (!server.listening) return Promise.resolve();\n return new Promise<void>((resolveClose, rejectClose) => {\n server.close((error) => {\n if (error) rejectClose(error);\n else resolveClose();\n });\n });\n };\n const closeOnAbort = () => {\n void close();\n };\n const reportRuntimeError = (error: Error) => {\n console.error(\"[FetchTransport] HTTP server error:\", error);\n };\n\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"The operation was aborted\", \"AbortError\");\n }\n signal?.addEventListener(\"abort\", closeOnAbort, { once: true });\n\n return new Promise<TransportServer>((resolve, reject) => {\n const rejectStartup = (error: Error) => {\n signal?.removeEventListener(\"abort\", closeOnAbort);\n reject(error);\n };\n\n server.once(\"error\", rejectStartup);\n server.listen({ host, port }, () => {\n server.removeListener(\"error\", rejectStartup);\n server.on(\"error\", reportRuntimeError);\n resolve({ close });\n });\n });\n }\n\n public async close(): Promise<void> {}\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["DEFAULT_MAX_BODY_BYTES", "loadNodeHttp", "options", "req", "extendedRequest", "isBodyAllowed", "res", "body", "headers", "cookies", "value", "key", "lowerKey", "existing", "host", "port", "signal", "onRequest", "createServer", "server", "requestController", "abortRequest", "abortIncompleteRequest", "abortIncompleteResponse", "contentLength", "chunks", "receivedBytes", "chunk", "transportRequest", "response", "outgoingHeaders", "closed", "close", "closeOnAbort", "reportRuntimeError", "resolveClose", "rejectClose", "error", "resolve", "reject", "rejectStartup"]
7
+ }
@@ -1,89 +1,26 @@
1
- import type { HttpClientOptions, HyperTransport } from "@hyperttp/types";
2
- /**
3
- * @ru Поддерживаемые среды выполнения для автоматического выбора транспорта.
4
- * @en Supported runtime environments for automatic transport selection.
5
- */
1
+ import type { HyperTransport, SenderProtocol } from "@hyperttp/types";
6
2
  export type Runtime = "bun" | "node" | "deno" | "browser";
7
3
  /**
8
- * @ru Определяет текущую среду выполнения при загрузке модуля.
9
- * Порядок проверки: Bun → Deno → Node.js → Browser.
10
- * @en Detects the current runtime at module load time.
11
- * Detection order: Bun → Deno → Node.js → Browser.
4
+ * @ru Опции разрешения транспорта. `customTransport` имеет приоритет над автовыбором.
5
+ * @en Transport resolution options. `customTransport` takes priority over auto-selection.
12
6
  */
7
+ export interface ResolveTransportOptions {
8
+ customTransport?: HyperTransport;
9
+ [key: string]: unknown;
10
+ }
13
11
  export declare const CURRENT_RUNTIME: Runtime;
14
12
  /**
15
- * @ru Разрешает и создаёт оптимальный транспорт для текущей среды.
16
- * Перебирает кандидатов по приоритету, кэширует первый успешный результат.
17
- * @en Resolves and creates the optimal transport for the current runtime.
18
- * Iterates candidates by priority, caches the first successful result.
19
- * @param config - Client configuration options.
20
- * @returns Promise resolving to the instantiated transport.
21
- * @throws Error if no compatible transport is found.
13
+ * @ru Разрешает оптимальный транспорт для указанного протокола и текущей среды.
14
+ * Кастомный транспорт из конфигурации имеет приоритет над автовыбором.
15
+ * @en Resolves optimal transport for the given protocol and current runtime.
16
+ * A custom transport from the config takes priority over auto-selection.
22
17
  */
23
- export declare function resolveTransport(config: HttpClientOptions): Promise<HyperTransport>;
18
+ export declare function resolveTransport(protocol?: SenderProtocol, config?: ResolveTransportOptions): Promise<HyperTransport>;
24
19
  /**
25
- * @ru Менеджер транспорта с ленивой инициализацией и кэшированием.
26
- * Поддерживает синхронный доступ, отложенную инициализацию и корректное завершение.
27
- * @en Transport manager with lazy initialization and caching.
28
- * Supports synchronous access, deferred initialization, and graceful shutdown.
20
+ * @ru Синхронно возвращает транспорт из кэша без обёртывания в Promise.
21
+ * @en Synchronously returns a cached transport without Promise overhead.
29
22
  */
30
- export declare class TransportManager {
31
- /**
32
- * @ru Текущий экземпляр транспорта (null до инициализации).
33
- * @en Current transport instance (null before initialization).
34
- */
35
- transport: HyperTransport | null;
36
- /**
37
- * @ru Промис отложенной инициализации транспорта.
38
- * @en Deferred transport initialization promise.
39
- */
40
- private promise;
41
- /**
42
- * @ru Конфигурация клиента для создания транспорта.
43
- * @en Client configuration for transport creation.
44
- */
45
- private config;
46
- /**
47
- * @ru Создаёт менеджер транспорта с опциональным пользовательским транспортом.
48
- * @en Creates a transport manager with an optional custom transport.
49
- * @param config - Client configuration options.
50
- * @param custom - Optional custom transport instance.
51
- */
52
- constructor(config: HttpClientOptions, custom?: HyperTransport);
53
- /**
54
- * @ru Синхронно возвращает текущий транспорт или null, если не инициализирован.
55
- * @en Synchronously returns the current transport or null if not initialized.
56
- * @returns The transport instance or null.
57
- */
58
- getSync(): HyperTransport | null;
59
- /**
60
- * @ru Гарантирует наличие транспорта, инициализируя его при необходимости.
61
- * Повторные вызовы возвращают один и тот же промис.
62
- * @en Ensures a transport exists, initializing it if necessary.
63
- * Repeated calls return the same promise.
64
- * @returns Promise resolving to the transport instance.
65
- */
66
- ensure(): Promise<HyperTransport>;
67
- /**
68
- * @ru Возвращает транспорт синхронно или промис, если требуется инициализация.
69
- * @en Returns the transport synchronously or a promise if initialization is needed.
70
- * @returns The transport instance or a promise resolving to it.
71
- */
72
- get(): HyperTransport | Promise<HyperTransport>;
73
- /**
74
- * @ru Обновляет конфигурацию транспорта, если он поддерживает setConfig.
75
- * @en Updates the transport configuration if it supports setConfig.
76
- * @param config - New client configuration options.
77
- */
78
- setConfig(config: HttpClientOptions): void;
79
- /**
80
- * @ru Завершает работу транспорта и освобождает ресурсы.
81
- * В graceful-режиме вызывает close(), иначе — destroy().
82
- * @en Shuts down the transport and releases resources.
83
- * In graceful mode calls close(), otherwise calls destroy().
84
- * @param graceful - If true, waits for active requests to complete.
85
- * @returns Promise that resolves when shutdown is complete.
86
- */
87
- destroy(graceful?: boolean): Promise<void>;
88
- }
23
+ export declare function getCachedTransport(protocol?: SenderProtocol): HyperTransport | undefined;
24
+ export declare function evictCachedTransport(transport: HyperTransport): void;
25
+ export declare function resetCachedTransport(): void;
89
26
  //# sourceMappingURL=manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/transports/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAEzE;;;GAGG;AACH,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAyB1D;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,OAK1B,CAAC;AAiLL;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,CAAC,CA+BzF;AAED;;;;;GAKG;AACH,qBAAa,gBAAgB;IAC3B;;;OAGG;IACI,SAAS,EAAE,cAAc,GAAG,IAAI,CAAQ;IAE/C;;;OAGG;IACH,OAAO,CAAC,OAAO,CAAwC;IAEvD;;;OAGG;IACH,OAAO,CAAC,MAAM,CAAoB;IAElC;;;;;OAKG;IACH,YAAY,MAAM,EAAE,iBAAiB,EAAE,MAAM,CAAC,EAAE,cAAc,EAU7D;IAED;;;;OAIG;IACI,OAAO,IAAI,cAAc,GAAG,IAAI,CAEtC;IAED;;;;;;OAMG;IACI,MAAM,IAAI,OAAO,CAAC,cAAc,CAAC,CAUvC;IAED;;;;OAIG;IACI,GAAG,IAAI,cAAc,GAAG,OAAO,CAAC,cAAc,CAAC,CAErD;IAED;;;;OAIG;IACI,SAAS,CAAC,MAAM,EAAE,iBAAiB,GAAG,IAAI,CAWhD;IAED;;;;;;;OAOG;IACU,OAAO,CAAC,QAAQ,UAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAsBnD;CACF"}
1
+ {"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/transports/manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAMtE,MAAM,MAAM,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;AAE1D;;;GAGG;AACH,MAAM,WAAW,uBAAuB;IACtC,eAAe,CAAC,EAAE,cAAc,CAAC;IACjC,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED,eAAO,MAAM,eAAe,EAAE,OAK1B,CAAC;AA4FL;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,GAAE,cAAuB,EACjC,MAAM,CAAC,EAAE,uBAAuB,GAC/B,OAAO,CAAC,cAAc,CAAC,CAyBzB;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,cAAuB,GAAG,cAAc,GAAG,SAAS,CAEhG;AAED,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAMpE;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
@@ -1,7 +1,2 @@
1
- "use strict";export const CURRENT_RUNTIME=typeof Bun<"u"?"bun":typeof Deno<"u"?"deno":typeof process<"u"&&process.versions?.node?"node":"browser";const a=[{name:"Bun",runtime:["bun"],pkg:"@hyperttp/transport-bun",export:"BunTransport",priority:100},{name:"Deno",runtime:["deno"],pkg:"@hyperttp/transport-deno",export:"DenoTransport",priority:95},{name:"Undici",runtime:["node"],pkg:"@hyperttp/transport-undici",export:"UndiciTransport",priority:90},{name:"Browser",runtime:["browser"],pkg:"./browser.js",export:"BrowserTransport",priority:80},{name:"Node",runtime:["node","bun","deno"],pkg:"./node.js",export:"NodeTransport",priority:10}];a.forEach(Object.freeze),Object.freeze(a);const d=new Set(a.map(t=>t.pkg)),c=a.filter(t=>t.runtime.includes(CURRENT_RUNTIME)).sort((t,r)=>r.priority-t.priority);let i=null;function p(t){if(!t||typeof t!="object")return!1;const r=t,e=r.code;if(e==="ERR_MODULE_NOT_FOUND"||e==="MODULE_NOT_FOUND")return!0;const o=t instanceof Error?t.message:String(r.message??"");return o.includes("Cannot find module")||o.includes("Failed to resolve")||o.includes("Failed to load")}function f(t,r,e){const o=typeof process<"u"&&!1,n=typeof process<"u"&&process.env?.DEBUG==="1",s=t.includes(CURRENT_RUNTIME);if(n||o&&s){const u=`Failed to load preferred transport "${t}"`,l="Falling back to alternative transport...";e?.logger?(e.logger("warn",`[Hyperttp Debug] ${u}`,r),e.logger("warn",`[Hyperttp Debug] ${l}`)):(console.warn(`
2
- \u26A0\uFE0F [Hyperttp Debug] ${u}:`),console.error(r),console.warn(`${l}
3
- `))}}async function m(t,r,e){if(!d.has(t))throw new Error(`[Hyperttp Security] Blocked untrusted transport import attempt: ${t}`);if(CURRENT_RUNTIME==="browser"){if(t!=="./browser.js")return null;const n=await import("./browser.js"),s=n[r]??n.default;return typeof s=="function"?s:null}let o=t;try{typeof import.meta.resolve=="function"&&(o=import.meta.resolve(t,import.meta.url))}catch(n){if(p(n))return f(t,n,e),null}try{const n=await import(o),s=n[r]??n.default;return typeof s=="function"?s:null}catch(n){if(p(n))return f(t,n,e),null;throw n}}export async function resolveTransport(t){if(t.customTransport)return t.customTransport;if(i)return new i(t);const r=[];for(let e=0;e<c.length;e++){const o=c[e];try{const n=await m(o.pkg,o.export,t);if(!n){r.push(`${o.pkg} (missing export or not installed)`);continue}return i=n,new n(t)}catch(n){if(p(n)){r.push(`${o.pkg} (not installed)`);continue}throw new Error(`[Hyperttp] transport crash in ${o.pkg}: ${n?.message}`,{cause:n})}}throw new Error(`No compatible transport for runtime="${CURRENT_RUNTIME}".
4
- Failures:
5
- - ${r.join(`
6
- - `)}`)}export class TransportManager{transport=null;promise=null;config;constructor(r,e){this.config=r,e?this.transport=e:r.customTransport?this.transport=r.customTransport:i&&(this.transport=new i(r))}getSync(){return this.transport}ensure(){return this.transport!==null?this.promise||(this.promise=Promise.resolve(this.transport)):this.promise!==null?this.promise:this.promise=resolveTransport(this.config).then(r=>(this.transport=r,r))}get(){return this.transport??this.ensure()}setConfig(r){if(this.config=r,this.transport&&"setConfig"in this.transport){const e=this.transport;typeof e.setConfig=="function"&&e.setConfig(r)}}async destroy(r=!0){const e=this.transport;if(e)try{if(r&&"close"in e){const o=e;if(typeof o.close=="function"){await o.close();return}}if("destroy"in e){const o=e;typeof o.destroy=="function"&&await o.destroy()}}finally{this.transport=null,this.promise=null}}}
1
+ "use strict";import{FetchTransport as l}from"./fetch.js";export const CURRENT_RUNTIME=typeof Bun<"u"?"bun":typeof Deno<"u"?"deno":typeof process<"u"&&process.versions?.node?"node":"browser";const y=[{runtime:["bun"],pkg:"@hyperttp/transport-bun",export:"BunTransport",priority:100},{runtime:["node"],pkg:"@hyperttp/transport-undici",export:"UndiciTransport",priority:90},{runtime:["deno"],pkg:"@hyperttp/transport-deno",export:"DenoTransport",priority:85}],f=y.filter(t=>t.runtime.includes(CURRENT_RUNTIME)).sort((t,e)=>e.priority-t.priority),s=new Map,u=new Map;function T(t){if(!t||typeof t!="object")return!1;const e=t;if(e.code==="ERR_MODULE_NOT_FOUND"||e.code==="MODULE_NOT_FOUND")return!0;const n=t instanceof Error?t.message:String(e.message??"");return n.includes("Cannot find module")||n.includes("Failed to resolve")||n.includes("Failed to load")}async function m(t){return import(t)}function c(t,e){return typeof t.supports=="function"?t.supports(e):t.protocols?.includes(e)??!0}async function d(t){typeof t.destroy=="function"?await t.destroy():typeof t.close=="function"&&await t.close()}async function h(t,e){for(let o=0;o<f.length;o++){const i=f[o];try{const r=await m(i.pkg),p=r[i.export]??r.default;if(typeof p!="function")continue;const a=new p(e??{});if(!c(a,t)){await d(a);continue}return a}catch(r){if(!T(r))throw r}}console.warn(`[HyperCore] Fast transport (e.g. @hyperttp/transport-undici) unavailable for runtime "${CURRENT_RUNTIME}". Falling back to slow FetchTransport.`);const n=new l(e);if(c(n,t))return n;throw await d(n),new Error(`[HyperCore] No transport available for protocol "${t}" in runtime "${CURRENT_RUNTIME}".`)}export async function resolveTransport(t="rest",e){if(e?.customTransport){if(!c(e.customTransport,t))throw new Error(`[HyperCore] Custom transport does not support protocol "${t}".`);return e.customTransport}const n=s.get(t);if(n)return n;const o=u.get(t);if(o)return o;const i=h(t,e).then(r=>(s.set(t,r),r)).finally(()=>{u.delete(t)});return u.set(t,i),i}export function getCachedTransport(t="rest"){return s.get(t)}export function evictCachedTransport(t){for(const[e,n]of s)n===t&&s.delete(e)}export function resetCachedTransport(){s.clear(),u.clear()}
7
2
  //# sourceMappingURL=manager.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/transports/manager.ts"],
4
- "sourcesContent": ["import type { HttpClientOptions, HyperTransport } from \"@hyperttp/types\";\n\n/**\n * @ru \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0435 \u0441\u0440\u0435\u0434\u044B \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u0434\u043B\u044F \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u043E\u0433\u043E \u0432\u044B\u0431\u043E\u0440\u0430 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Supported runtime environments for automatic transport selection.\n */\nexport type Runtime = \"bun\" | \"node\" | \"deno\" | \"browser\";\n\n/**\n * @ru \u041A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430, \u043F\u0440\u0438\u043D\u0438\u043C\u0430\u044E\u0449\u0438\u0439 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044E \u043A\u043B\u0438\u0435\u043D\u0442\u0430.\n * @en Transport constructor accepting client configuration.\n */\ntype TransportCtor = new (config: HttpClientOptions) => HyperTransport;\n\n/**\n * @ru \u041E\u043F\u0438\u0441\u0430\u043D\u0438\u0435 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430: \u0438\u043C\u044F, \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043C\u044B\u0435 \u0441\u0440\u0435\u0434\u044B, \u043F\u0430\u043A\u0435\u0442, \u044D\u043A\u0441\u043F\u043E\u0440\u0442 \u0438 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442.\n * @en Transport descriptor: name, supported runtimes, package, export, and priority.\n */\ntype TransportDef = {\n /** @ru \u0418\u043C\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F \u043B\u043E\u0433\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F. @en Transport name for logging. */\n readonly name: string;\n /** @ru \u0421\u043F\u0438\u0441\u043E\u043A \u0441\u0440\u0435\u0434, \u0432 \u043A\u043E\u0442\u043E\u0440\u044B\u0445 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u043C\u043E\u0436\u0435\u0442 \u0440\u0430\u0431\u043E\u0442\u0430\u0442\u044C. @en List of runtimes where the transport can operate. */\n readonly runtime: readonly Runtime[];\n /** @ru \u0418\u043C\u044F \u043F\u0430\u043A\u0435\u0442\u0430 npm \u0438\u043B\u0438 \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0439 \u043F\u0443\u0442\u044C \u0434\u043B\u044F \u0432\u0441\u0442\u0440\u043E\u0435\u043D\u043D\u044B\u0445 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u043E\u0432. @en npm package name or relative path for built-in transports. */\n readonly pkg: string;\n /** @ru \u0418\u043C\u044F \u044D\u043A\u0441\u043F\u043E\u0440\u0442\u0438\u0440\u0443\u0435\u043C\u043E\u0433\u043E \u043A\u043B\u0430\u0441\u0441\u0430 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430. @en Exported transport class name. */\n readonly export: string;\n /** @ru \u041F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0432\u044B\u0431\u043E\u0440\u0430 (\u0432\u044B\u0448\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 = \u0440\u0430\u043D\u044C\u0448\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0430 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438). @en Selection priority (higher value = earlier load attempt). */\n readonly priority: number;\n};\n\n/**\n * @ru \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442 \u0442\u0435\u043A\u0443\u0449\u0443\u044E \u0441\u0440\u0435\u0434\u0443 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u044F.\n * \u041F\u043E\u0440\u044F\u0434\u043E\u043A \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0438: Bun \u2192 Deno \u2192 Node.js \u2192 Browser.\n * @en Detects the current runtime at module load time.\n * Detection order: Bun \u2192 Deno \u2192 Node.js \u2192 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 \u0412\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0439 \u0440\u0435\u0435\u0441\u0442\u0440 \u0432\u0441\u0435\u0445 \u0434\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0445 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u043E\u0432 \u0441 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u0430\u043C\u0438.\n * \u0417\u0430\u043C\u043E\u0440\u043E\u0436\u0435\u043D \u0434\u043B\u044F \u043F\u0440\u0435\u0434\u043E\u0442\u0432\u0440\u0430\u0449\u0435\u043D\u0438\u044F \u043C\u043E\u0434\u0438\u0444\u0438\u043A\u0430\u0446\u0438\u0439 \u0432 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 \u0411\u0435\u043B\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u044B\u0445 \u043F\u0430\u043A\u0435\u0442\u043E\u0432 \u0434\u043B\u044F \u0437\u0430\u0449\u0438\u0442\u044B \u043E\u0442 \u043D\u0435\u0441\u0430\u043D\u043A\u0446\u0438\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u043E\u0433\u043E \u0438\u043C\u043F\u043E\u0440\u0442\u0430.\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 \u041E\u0442\u0444\u0438\u043B\u044C\u0442\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0438 \u043E\u0442\u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u0441\u043F\u0438\u0441\u043E\u043A \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u043E\u0432 \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u044B.\n * \u0412\u044B\u0447\u0438\u0441\u043B\u044F\u0435\u0442\u0441\u044F \u043E\u0434\u0438\u043D \u0440\u0430\u0437 \u043F\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0435 \u043C\u043E\u0434\u0443\u043B\u044F.\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 \u041A\u044D\u0448 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440\u0430 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F \u0438\u0437\u0431\u0435\u0436\u0430\u043D\u0438\u044F \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0433\u043E \u0440\u0430\u0437\u0440\u0435\u0448\u0435\u043D\u0438\u044F.\n * @en Cached resolved transport constructor to avoid repeated resolution.\n */\nlet RESOLVED_RUNTIME_CTOR: TransportCtor | null = null;\n\n/**\n * @ru \u041F\u0440\u043E\u0432\u0435\u0440\u044F\u0435\u0442, \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043E\u0448\u0438\u0431\u043A\u043E\u0439 \u043E\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044F \u043C\u043E\u0434\u0443\u043B\u044F.\n * \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043A\u043E\u0434\u044B ERR_MODULE_NOT_FOUND \u0438 MODULE_NOT_FOUND,\n * \u0430 \u0442\u0430\u043A\u0436\u0435 \u0441\u043E\u043E\u0431\u0449\u0435\u043D\u0438\u044F \u043E\u0431 \u043E\u0448\u0438\u0431\u043A\u0430\u0445 (\u0434\u043B\u044F \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438 \u0441 Bun \u0438 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 \u041B\u043E\u0433\u0438\u0440\u0443\u0435\u0442 \u0438\u043D\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u044E \u043E \u043D\u0435\u0443\u0434\u0430\u0447\u043D\u043E\u0439 \u043F\u043E\u043F\u044B\u0442\u043A\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u043A\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * \u0410\u043A\u0442\u0438\u0432\u0438\u0440\u0443\u0435\u0442\u0441\u044F \u0432 \u0440\u0435\u0436\u0438\u043C\u0435 DEBUG=1 \u0438\u043B\u0438 \u043F\u0440\u0438 \u043E\u0448\u0438\u0431\u043A\u0435 \u043D\u0430\u0442\u0438\u0432\u043D\u043E\u0433\u043E \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0432 dev-\u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u0438.\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\u26A0\uFE0F [Hyperttp Debug] ${primaryMessage}:`);\n console.error(err);\n console.warn(`${fallbackMessage}\\n`);\n }\n }\n}\n\n/**\n * @ru \u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u0442 \u043A\u043E\u043D\u0441\u0442\u0440\u0443\u043A\u0442\u043E\u0440 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0438\u0437 \u043F\u0430\u043A\u0435\u0442\u0430 \u0438\u043B\u0438 \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u043E\u0433\u043E \u043F\u0443\u0442\u0438.\n * \u0414\u043B\u044F \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043D\u043E\u0439 \u0441\u0440\u0435\u0434\u044B \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u0435\u0442 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0439 \u0438\u043C\u043F\u043E\u0440\u0442 \u0434\u043B\u044F \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438 \u0441 \u0431\u0430\u043D\u0434\u043B\u0435\u0440\u0430\u043C\u0438.\n * @en Loads a transport constructor from a package or relative path.\n * For browser runtime, uses static import for bundler compatibility.\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 if (CURRENT_RUNTIME === \"browser\") {\n if (pkg !== \"./browser.js\") return null;\n const mod = (await import(\"./browser.js\")) as Record<string, unknown>;\n const candidate = mod[exportName] ?? mod.default;\n return typeof candidate === \"function\" ? (candidate as TransportCtor) : null;\n }\n\n let specifier = pkg;\n try {\n if (typeof import.meta.resolve === \"function\") {\n specifier = import.meta.resolve(pkg, import.meta.url);\n }\n } catch (err) {\n if (isModuleNotFoundError(err)) {\n logDebugFallback(pkg, err, config);\n return null;\n }\n }\n\n try {\n const mod = (await import(specifier)) 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 \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0438 \u0441\u043E\u0437\u0434\u0430\u0451\u0442 \u043E\u043F\u0442\u0438\u043C\u0430\u043B\u044C\u043D\u044B\u0439 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u0434\u043B\u044F \u0442\u0435\u043A\u0443\u0449\u0435\u0439 \u0441\u0440\u0435\u0434\u044B.\n * \u041F\u0435\u0440\u0435\u0431\u0438\u0440\u0430\u0435\u0442 \u043A\u0430\u043D\u0434\u0438\u0434\u0430\u0442\u043E\u0432 \u043F\u043E \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u0443, \u043A\u044D\u0448\u0438\u0440\u0443\u0435\u0442 \u043F\u0435\u0440\u0432\u044B\u0439 \u0443\u0441\u043F\u0435\u0448\u043D\u044B\u0439 \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442.\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 \u041C\u0435\u043D\u0435\u0434\u0436\u0435\u0440 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0441 \u043B\u0435\u043D\u0438\u0432\u043E\u0439 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0435\u0439 \u0438 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C.\n * \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u043D\u044B\u0439 \u0434\u043E\u0441\u0442\u0443\u043F, \u043E\u0442\u043B\u043E\u0436\u0435\u043D\u043D\u0443\u044E \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044E \u0438 \u043A\u043E\u0440\u0440\u0435\u043A\u0442\u043D\u043E\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043D\u0438\u0435.\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 \u0422\u0435\u043A\u0443\u0449\u0438\u0439 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 (null \u0434\u043E \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438).\n * @en Current transport instance (null before initialization).\n */\n public transport: HyperTransport | null = null;\n\n /**\n * @ru \u041F\u0440\u043E\u043C\u0438\u0441 \u043E\u0442\u043B\u043E\u0436\u0435\u043D\u043D\u043E\u0439 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Deferred transport initialization promise.\n */\n private promise: Promise<HyperTransport> | null = null;\n\n /**\n * @ru \u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u043A\u043B\u0438\u0435\u043D\u0442\u0430 \u0434\u043B\u044F \u0441\u043E\u0437\u0434\u0430\u043D\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Client configuration for transport creation.\n */\n private config: HttpClientOptions;\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043C\u0435\u043D\u0435\u0434\u0436\u0435\u0440 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0441 \u043E\u043F\u0446\u0438\u043E\u043D\u0430\u043B\u044C\u043D\u044B\u043C \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u0438\u043C \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u043E\u043C.\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 \u0421\u0438\u043D\u0445\u0440\u043E\u043D\u043D\u043E \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043A\u0443\u0449\u0438\u0439 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u0438\u043B\u0438 null, \u0435\u0441\u043B\u0438 \u043D\u0435 \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D.\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 \u0413\u0430\u0440\u0430\u043D\u0442\u0438\u0440\u0443\u0435\u0442 \u043D\u0430\u043B\u0438\u0447\u0438\u0435 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430, \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u0443\u044F \u0435\u0433\u043E \u043F\u0440\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438.\n * \u041F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u0435 \u0432\u044B\u0437\u043E\u0432\u044B \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u044E\u0442 \u043E\u0434\u0438\u043D \u0438 \u0442\u043E\u0442 \u0436\u0435 \u043F\u0440\u043E\u043C\u0438\u0441.\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 \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442 \u0441\u0438\u043D\u0445\u0440\u043E\u043D\u043D\u043E \u0438\u043B\u0438 \u043F\u0440\u043E\u043C\u0438\u0441, \u0435\u0441\u043B\u0438 \u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044F \u0438\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F.\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 \u041E\u0431\u043D\u043E\u0432\u043B\u044F\u0435\u0442 \u043A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044E \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430, \u0435\u0441\u043B\u0438 \u043E\u043D \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 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 if (this.transport && \"setConfig\" in this.transport) {\n const dynamicTarget = this.transport as {\n setConfig: (config: HttpClientOptions) => void;\n };\n if (typeof dynamicTarget.setConfig === \"function\") {\n dynamicTarget.setConfig(config);\n }\n }\n }\n\n /**\n * @ru \u0417\u0430\u0432\u0435\u0440\u0448\u0430\u0435\u0442 \u0440\u0430\u0431\u043E\u0442\u0443 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0438 \u043E\u0441\u0432\u043E\u0431\u043E\u0436\u0434\u0430\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u044B.\n * \u0412 graceful-\u0440\u0435\u0436\u0438\u043C\u0435 \u0432\u044B\u0437\u044B\u0432\u0430\u0435\u0442 close(), \u0438\u043D\u0430\u0447\u0435 \u2014 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;\n if (!t) return;\n\n try {\n if (graceful && \"close\" in t) {\n const closable = t as { close: () => Promise<void> | void };\n if (typeof closable.close === \"function\") {\n await closable.close();\n return;\n }\n }\n if (\"destroy\" in t) {\n const destroyable = t as { destroy: () => Promise<void> | void };\n if (typeof destroyable.destroy === \"function\") {\n await destroyable.destroy();\n }\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", "specifier", "failures", "i", "t", "ctor", "custom", "dynamicTarget", "graceful", "closable", "destroyable"]
4
+ "sourcesContent": ["import type { HyperTransport, SenderProtocol } from \"@hyperttp/types\";\nimport { FetchTransport, type FetchTransportOptions } from \"./fetch.js\";\n\ndeclare const Bun: unknown;\ndeclare const Deno: unknown;\n\nexport type Runtime = \"bun\" | \"node\" | \"deno\" | \"browser\";\n\n/**\n * @ru Опции разрешения транспорта. `customTransport` имеет приоритет над автовыбором.\n * @en Transport resolution options. `customTransport` takes priority over auto-selection.\n */\nexport interface ResolveTransportOptions {\n customTransport?: HyperTransport;\n [key: string]: unknown;\n}\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\ntype TransportDef = {\n readonly runtime: readonly Runtime[];\n readonly pkg: string;\n readonly export: string;\n readonly priority: number;\n};\n\nconst TRANSPORT_DEFS: readonly TransportDef[] = [\n { runtime: [\"bun\"], pkg: \"@hyperttp/transport-bun\", export: \"BunTransport\", priority: 100 },\n { runtime: [\"node\"], pkg: \"@hyperttp/transport-undici\", export: \"UndiciTransport\", priority: 90 },\n { runtime: [\"deno\"], pkg: \"@hyperttp/transport-deno\", export: \"DenoTransport\", priority: 85 },\n];\n\nconst CANDIDATES: readonly TransportDef[] = TRANSPORT_DEFS.filter((t) =>\n t.runtime.includes(CURRENT_RUNTIME),\n).sort((a, b) => b.priority - a.priority);\n\nconst transportCache = new Map<string, HyperTransport>();\nconst transportResolutions = new Map<string, Promise<HyperTransport>>();\n\nfunction isModuleNotFoundError(err: unknown): boolean {\n if (!err || typeof err !== \"object\") return false;\n const e = err as Record<string, unknown>;\n if (e.code === \"ERR_MODULE_NOT_FOUND\" || e.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\nasync function dynamicImport(pkg: string): Promise<Record<string, unknown>> {\n /* @vite-ignore */\n return import(/* webpackIgnore: true */ pkg);\n}\n\nfunction supportsProtocol(transport: HyperTransport, protocol: SenderProtocol): boolean {\n return typeof transport.supports === \"function\"\n ? transport.supports(protocol)\n : (transport.protocols?.includes(protocol) ?? true);\n}\n\nasync function disposeUnusedTransport(transport: HyperTransport): Promise<void> {\n if (typeof transport.destroy === \"function\") {\n await transport.destroy();\n } else if (typeof transport.close === \"function\") {\n await transport.close();\n }\n}\n\nasync function createTransport(\n protocol: SenderProtocol,\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n for (let i = 0; i < CANDIDATES.length; i++) {\n const t = CANDIDATES[i]!;\n try {\n const mod = await dynamicImport(t.pkg);\n const candidate = (mod[t.export] ?? mod.default) as\n | { new (opts?: unknown): HyperTransport }\n | undefined;\n if (typeof candidate !== \"function\") continue;\n\n const instance = new candidate(config ?? {});\n if (!supportsProtocol(instance, protocol)) {\n await disposeUnusedTransport(instance);\n continue;\n }\n\n return instance;\n } catch (err) {\n if (!isModuleNotFoundError(err)) throw err;\n }\n }\n\n console.warn(\n `[HyperCore] Fast transport (e.g. @hyperttp/transport-undici) unavailable for runtime \"${CURRENT_RUNTIME}\". Falling back to slow FetchTransport.`,\n );\n\n const fetchTransport = new FetchTransport(config as unknown as FetchTransportOptions);\n if (supportsProtocol(fetchTransport, protocol)) return fetchTransport;\n\n await disposeUnusedTransport(fetchTransport);\n throw new Error(\n `[HyperCore] No transport available for protocol \"${protocol}\" in runtime \"${CURRENT_RUNTIME}\".`,\n );\n}\n\n/**\n * @ru Разрешает оптимальный транспорт для указанного протокола и текущей среды.\n * Кастомный транспорт из конфигурации имеет приоритет над автовыбором.\n * @en Resolves optimal transport for the given protocol and current runtime.\n * A custom transport from the config takes priority over auto-selection.\n */\nexport async function resolveTransport(\n protocol: SenderProtocol = \"rest\",\n config?: ResolveTransportOptions,\n): Promise<HyperTransport> {\n if (config?.customTransport) {\n if (!supportsProtocol(config.customTransport, protocol)) {\n throw new Error(`[HyperCore] Custom transport does not support protocol \"${protocol}\".`);\n }\n return config.customTransport;\n }\n\n const cached = transportCache.get(protocol);\n if (cached) return cached;\n\n const pending = transportResolutions.get(protocol);\n if (pending) return pending;\n\n const resolution = createTransport(protocol, config)\n .then((transport) => {\n transportCache.set(protocol, transport);\n return transport;\n })\n .finally(() => {\n transportResolutions.delete(protocol);\n });\n\n transportResolutions.set(protocol, resolution);\n return resolution;\n}\n\n/**\n * @ru Синхронно возвращает транспорт из кэша без обёртывания в Promise.\n * @en Synchronously returns a cached transport without Promise overhead.\n */\nexport function getCachedTransport(protocol: SenderProtocol = \"rest\"): HyperTransport | undefined {\n return transportCache.get(protocol);\n}\n\nexport function evictCachedTransport(transport: HyperTransport): void {\n for (const [protocol, cached] of transportCache) {\n if (cached === transport) {\n transportCache.delete(protocol);\n }\n }\n}\n\nexport function resetCachedTransport(): void {\n transportCache.clear();\n transportResolutions.clear();\n}\n"],
5
+ "mappings": "aACA,OAAS,kBAAAA,MAAkD,aAgBpD,aAAM,gBACP,OAAO,IAAQ,IAAoB,MACnC,OAAO,KAAS,IAAoB,OACpC,OAAO,QAAY,KAAe,QAAQ,UAAU,KAAa,OAC9D,UAUT,MAAMC,EAA0C,CAC9C,CAAE,QAAS,CAAC,KAAK,EAAG,IAAK,0BAA2B,OAAQ,eAAgB,SAAU,GAAG,EACzF,CAAE,QAAS,CAAC,MAAM,EAAG,IAAK,6BAA8B,OAAQ,kBAAmB,SAAU,EAAE,EAC/F,CAAE,QAAS,CAAC,MAAM,EAAG,IAAK,2BAA4B,OAAQ,gBAAiB,SAAU,EAAE,GAGvFC,EAAsCD,EAAe,OAAQ,GACjE,EAAE,QAAQ,SAAS,eAAe,CAAC,EACnC,KAAK,CAACE,EAAGC,IAAMA,EAAE,SAAWD,EAAE,QAAQ,EAElCE,EAAiB,IAAI,IACrBC,EAAuB,IAAI,IAEjC,SAASC,EAAsBC,EAAY,CACzC,GAAI,CAACA,GAAO,OAAOA,GAAQ,SAAU,MAAO,GAC5C,MAAM,EAAIA,EACV,GAAI,EAAE,OAAS,wBAA0B,EAAE,OAAS,mBAAoB,MAAO,GAE/E,MAAMC,EAAMD,aAAe,MAAQA,EAAI,QAAU,OAAO,EAAE,SAAW,EAAE,EACvE,OACEC,EAAI,SAAS,oBAAoB,GACjCA,EAAI,SAAS,mBAAmB,GAChCA,EAAI,SAAS,gBAAgB,CAEjC,CAEA,eAAeC,EAAcC,EAAW,CAEtC,OAAO,OAAiCA,EAC1C,CAEA,SAASC,EAAiBC,EAA2BC,EAAwB,CAC3E,OAAO,OAAOD,EAAU,UAAa,WACjCA,EAAU,SAASC,CAAQ,EAC1BD,EAAU,WAAW,SAASC,CAAQ,GAAK,EAClD,CAEA,eAAeC,EAAuBF,EAAyB,CACzD,OAAOA,EAAU,SAAY,WAC/B,MAAMA,EAAU,QAAO,EACd,OAAOA,EAAU,OAAU,YACpC,MAAMA,EAAU,MAAK,CAEzB,CAEA,eAAeG,EACbF,EACAG,EAAgC,CAEhC,QAASC,EAAI,EAAGA,EAAIhB,EAAW,OAAQgB,IAAK,CAC1C,MAAMC,EAAIjB,EAAWgB,CAAC,EACtB,GAAI,CACF,MAAME,EAAM,MAAMV,EAAcS,EAAE,GAAG,EAC/BE,EAAaD,EAAID,EAAE,MAAM,GAAKC,EAAI,QAGxC,GAAI,OAAOC,GAAc,WAAY,SAErC,MAAMC,EAAW,IAAID,EAAUJ,GAAU,CAAA,CAAE,EAC3C,GAAI,CAACL,EAAiBU,EAAUR,CAAQ,EAAG,CACzC,MAAMC,EAAuBO,CAAQ,EACrC,QACF,CAEA,OAAOA,CACT,OAASd,EAAK,CACZ,GAAI,CAACD,EAAsBC,CAAG,EAAG,MAAMA,CACzC,CACF,CAEA,QAAQ,KACN,yFAAyF,eAAe,yCAAyC,EAGnJ,MAAMe,EAAiB,IAAIvB,EAAeiB,CAA0C,EACpF,GAAIL,EAAiBW,EAAgBT,CAAQ,EAAG,OAAOS,EAEvD,YAAMR,EAAuBQ,CAAc,EACrC,IAAI,MACR,oDAAoDT,CAAQ,iBAAiB,eAAe,IAAI,CAEpG,CAQA,sBAAsB,iBACpBA,EAA2B,OAC3BG,EAAgC,CAEhC,GAAIA,GAAQ,gBAAiB,CAC3B,GAAI,CAACL,EAAiBK,EAAO,gBAAiBH,CAAQ,EACpD,MAAM,IAAI,MAAM,2DAA2DA,CAAQ,IAAI,EAEzF,OAAOG,EAAO,eAChB,CAEA,MAAMO,EAASnB,EAAe,IAAIS,CAAQ,EAC1C,GAAIU,EAAQ,OAAOA,EAEnB,MAAMC,EAAUnB,EAAqB,IAAIQ,CAAQ,EACjD,GAAIW,EAAS,OAAOA,EAEpB,MAAMC,EAAaV,EAAgBF,EAAUG,CAAM,EAChD,KAAMJ,IACLR,EAAe,IAAIS,EAAUD,CAAS,EAC/BA,EACR,EACA,QAAQ,IAAK,CACZP,EAAqB,OAAOQ,CAAQ,CACtC,CAAC,EAEH,OAAAR,EAAqB,IAAIQ,EAAUY,CAAU,EACtCA,CACT,CAMM,gBAAU,mBAAmBZ,EAA2B,OAAM,CAClE,OAAOT,EAAe,IAAIS,CAAQ,CACpC,CAEM,gBAAU,qBAAqBD,EAAyB,CAC5D,SAAW,CAACC,EAAUU,CAAM,IAAKnB,EAC3BmB,IAAWX,GACbR,EAAe,OAAOS,CAAQ,CAGpC,CAEM,gBAAU,sBAAoB,CAClCT,EAAe,MAAK,EACpBC,EAAqB,MAAK,CAC5B",
6
+ "names": ["FetchTransport", "TRANSPORT_DEFS", "CANDIDATES", "a", "b", "transportCache", "transportResolutions", "isModuleNotFoundError", "err", "msg", "dynamicImport", "pkg", "supportsProtocol", "transport", "protocol", "disposeUnusedTransport", "createTransport", "config", "i", "t", "mod", "candidate", "instance", "fetchTransport", "cached", "pending", "resolution"]
7
7
  }
@@ -0,0 +1,23 @@
1
+ /**
2
+ * @ru Создаёт AbortSignal с тайм-аутом и привязкой к пользовательскому сигналу отмены.
3
+ * @en Creates an AbortSignal with timeout and user abort signal binding.
4
+ * @param userSignal - Optional external abort signal.
5
+ * @param timeoutMs - Timeout in milliseconds.
6
+ * @param meta - Metadata object receiving the cleanup function.
7
+ * @returns AbortSignal bound to the timeout and user signal.
8
+ */
9
+ export declare function createTimeoutSignal(userSignal: AbortSignal | undefined, timeoutMs: number, meta: {
10
+ cleanupSignal?: () => void;
11
+ }, timeoutReason?: unknown | (() => unknown)): AbortSignal;
12
+ /**
13
+ * @ru Применяет тайм-аут к сигналу отмены.
14
+ * @en Applies a timeout to the abort signal.
15
+ * @param signal - Optional external abort signal.
16
+ * @param timeout - Timeout in milliseconds (skip if null/<=0).
17
+ * @param meta - Metadata object receiving the cleanup function.
18
+ * @returns New abort signal with timeout, or the original signal.
19
+ */
20
+ export declare function applyTimeout(signal: AbortSignal | undefined, timeout: number | undefined, meta: {
21
+ cleanupSignal?: () => void;
22
+ }, timeoutReason?: unknown | (() => unknown)): AbortSignal | undefined;
23
+ //# sourceMappingURL=abort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../../src/utils/abort.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,WAAW,GAAG,SAAS,EACnC,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,EACpC,aAAa,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GACxC,WAAW,CAsCb;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,EAC3B,IAAI,EAAE;IAAE,aAAa,CAAC,EAAE,MAAM,IAAI,CAAA;CAAE,EACpC,aAAa,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,GACxC,WAAW,GAAG,SAAS,CAGzB"}
package/utils/abort.js ADDED
@@ -0,0 +1,2 @@
1
+ "use strict";export function createTimeoutSignal(e,t,n,o){const r=new AbortController;let l=!1;const c=()=>{l||(l=!0,e&&e.removeEventListener("abort",i),clearTimeout(a))},a=setTimeout(()=>{r.signal.isTimeout=!0;const u=typeof o=="function"?o():o;r.abort(u??new DOMException("Timeout","TimeoutError")),c()},t),i=()=>{r.abort(e?.reason),c()};return e&&(e.aborted?i():e.addEventListener("abort",i)),n.cleanupSignal=c,r.signal}export function applyTimeout(e,t,n,o){return t==null||t<=0?e:createTimeoutSignal(e,t,n,o)}
2
+ //# sourceMappingURL=abort.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/abort.ts"],
4
+ "sourcesContent": ["/**\n * @ru Создаёт AbortSignal с тайм-аутом и привязкой к пользовательскому сигналу отмены.\n * @en Creates an AbortSignal with timeout and user abort signal binding.\n * @param userSignal - Optional external abort signal.\n * @param timeoutMs - Timeout in milliseconds.\n * @param meta - Metadata object receiving the cleanup function.\n * @returns AbortSignal bound to the timeout and user signal.\n */\nexport function createTimeoutSignal(\n userSignal: AbortSignal | undefined,\n timeoutMs: number,\n meta: { cleanupSignal?: () => void },\n timeoutReason?: unknown | (() => unknown),\n): AbortSignal {\n const controller = new AbortController();\n\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n\n if (userSignal) {\n userSignal.removeEventListener(\"abort\", onUserAbort);\n }\n clearTimeout(timeoutId);\n };\n\n const timeoutId = setTimeout(() => {\n (controller.signal as { isTimeout?: boolean }).isTimeout = true;\n const reason =\n typeof timeoutReason === \"function\" ? (timeoutReason as () => unknown)() : timeoutReason;\n controller.abort(reason ?? new DOMException(\"Timeout\", \"TimeoutError\"));\n cleanup();\n }, timeoutMs);\n\n const onUserAbort = () => {\n controller.abort(userSignal?.reason);\n cleanup();\n };\n\n if (userSignal) {\n if (userSignal.aborted) {\n onUserAbort();\n } else {\n userSignal.addEventListener(\"abort\", onUserAbort);\n }\n }\n\n meta.cleanupSignal = cleanup;\n\n return controller.signal;\n}\n\n/**\n * @ru Применяет тайм-аут к сигналу отмены.\n * @en Applies a timeout to the abort signal.\n * @param signal - Optional external abort signal.\n * @param timeout - Timeout in milliseconds (skip if null/<=0).\n * @param meta - Metadata object receiving the cleanup function.\n * @returns New abort signal with timeout, or the original signal.\n */\nexport function applyTimeout(\n signal: AbortSignal | undefined,\n timeout: number | undefined,\n meta: { cleanupSignal?: () => void },\n timeoutReason?: unknown | (() => unknown),\n): AbortSignal | undefined {\n if (timeout == null || timeout <= 0) return signal;\n return createTimeoutSignal(signal, timeout, meta, timeoutReason);\n}\n"],
5
+ "mappings": "aAQM,gBAAU,oBACdA,EACAC,EACAC,EACAC,EAAyC,CAEzC,MAAMC,EAAa,IAAI,gBAEvB,IAAIC,EAAU,GACd,MAAMC,EAAU,IAAK,CACfD,IACJA,EAAU,GAENL,GACFA,EAAW,oBAAoB,QAASO,CAAW,EAErD,aAAaC,CAAS,EACxB,EAEMA,EAAY,WAAW,IAAK,CAC/BJ,EAAW,OAAmC,UAAY,GAC3D,MAAMK,EACJ,OAAON,GAAkB,WAAcA,EAA+B,EAAKA,EAC7EC,EAAW,MAAMK,GAAU,IAAI,aAAa,UAAW,cAAc,CAAC,EACtEH,EAAO,CACT,EAAGL,CAAS,EAENM,EAAc,IAAK,CACvBH,EAAW,MAAMJ,GAAY,MAAM,EACnCM,EAAO,CACT,EAEA,OAAIN,IACEA,EAAW,QACbO,EAAW,EAEXP,EAAW,iBAAiB,QAASO,CAAW,GAIpDL,EAAK,cAAgBI,EAEdF,EAAW,MACpB,CAUM,gBAAU,aACdM,EACAC,EACAT,EACAC,EAAyC,CAEzC,OAAIQ,GAAW,MAAQA,GAAW,EAAUD,EACrC,oBAAoBA,EAAQC,EAAST,EAAMC,CAAa,CACjE",
6
+ "names": ["userSignal", "timeoutMs", "meta", "timeoutReason", "controller", "cleaned", "cleanup", "onUserAbort", "timeoutId", "reason", "signal", "timeout"]
7
+ }
package/utils/errors.d.ts CHANGED
@@ -2,7 +2,7 @@
2
2
  * @ru Базовый класс ошибок клиента Hyperttp, агрегирующий контекст неудачного сетевого запроса.
3
3
  * @en Base error class for the Hyperttp client, providing explicit layout context for failed requests.
4
4
  */
5
- export declare class HttpClientError extends Error {
5
+ export declare class HyperClientError extends Error {
6
6
  code: string;
7
7
  statusCode?: number | undefined;
8
8
  originalError?: Error | undefined;
@@ -13,16 +13,26 @@ export declare class HttpClientError extends Error {
13
13
  * @en Creates a new HttpClientError instance.
14
14
  */
15
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 isHyperClientError(err: unknown): err is HyperClientError;
16
21
  }
17
22
  /**
18
23
  * @ru Ошибка, возникающая при превышении лимита времени ожидания ответа от сервера.
19
24
  * @en Error thrown when a network request exceeds its allocated execution timeout threshold.
20
25
  */
21
- export declare class TimeoutError extends HttpClientError {
26
+ export declare class TimeoutError extends HyperClientError {
22
27
  /**
23
28
  * @ru Создает новый экземпляр TimeoutError.
24
29
  * @en Creates a new TimeoutError instance.
25
30
  */
26
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;
27
37
  }
28
38
  //# sourceMappingURL=errors.d.ts.map
@@ -1 +1 @@
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,EAIvB;CACF;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC/C;;;OAGG;IACH,YAAY,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAGvC;CACF"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAOhC,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,MAAsB,EAC5B,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,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,gBAAgB,CAKtE;CACF;AAED;;;GAGG;AACH,qBAAa,YAAa,SAAQ,gBAAgB;IAChD;;;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"}
package/utils/errors.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";export class HttpClientError extends Error{code;statusCode;originalError;url;method;constructor(t,e="HTTP_ERROR",o,r,i,u){super(t,r?{cause:r}:void 0),this.code=e,this.statusCode=o,this.originalError=r,this.url=i,this.method=u,this.name="HttpClientError"}}export class TimeoutError extends HttpClientError{constructor(t,e){super(`Timeout after ${e}ms`,"TIMEOUT",408,void 0,t),this.name="TimeoutError"}}
1
+ "use strict";export class HyperClientError extends Error{code;statusCode;originalError;url;method;constructor(t,e="HYPER_ERROR",r,o,s,i){super(t,o?{cause:o}:void 0),this.code=e,this.statusCode=r,this.originalError=o,this.url=s,this.method=i,this.name="HyperClientError",Object.setPrototypeOf(this,new.target.prototype)}static isHyperClientError(t){return t instanceof HyperClientError||t instanceof Error&&t.code==="HYPER_ERROR"}}export class TimeoutError extends HyperClientError{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
2
  //# sourceMappingURL=errors.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/errors.ts"],
4
- "sourcesContent": ["/**\n * @ru \u0411\u0430\u0437\u043E\u0432\u044B\u0439 \u043A\u043B\u0430\u0441\u0441 \u043E\u0448\u0438\u0431\u043E\u043A \u043A\u043B\u0438\u0435\u043D\u0442\u0430 Hyperttp, \u0430\u0433\u0440\u0435\u0433\u0438\u0440\u0443\u044E\u0449\u0438\u0439 \u043A\u043E\u043D\u0442\u0435\u043A\u0441\u0442 \u043D\u0435\u0443\u0434\u0430\u0447\u043D\u043E\u0433\u043E \u0441\u0435\u0442\u0435\u0432\u043E\u0433\u043E \u0437\u0430\u043F\u0440\u043E\u0441\u0430.\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 \u0421\u043E\u0437\u0434\u0430\u0435\u0442 \u043D\u043E\u0432\u044B\u0439 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 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 }\n}\n\n/**\n * @ru \u041E\u0448\u0438\u0431\u043A\u0430, \u0432\u043E\u0437\u043D\u0438\u043A\u0430\u044E\u0449\u0430\u044F \u043F\u0440\u0438 \u043F\u0440\u0435\u0432\u044B\u0448\u0435\u043D\u0438\u0438 \u043B\u0438\u043C\u0438\u0442\u0430 \u0432\u0440\u0435\u043C\u0435\u043D\u0438 \u043E\u0436\u0438\u0434\u0430\u043D\u0438\u044F \u043E\u0442\u0432\u0435\u0442\u0430 \u043E\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430.\n * @en Error thrown when a network request exceeds its allocated execution timeout threshold.\n */\nexport class TimeoutError extends HttpClientError {\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0435\u0442 \u043D\u043E\u0432\u044B\u0439 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 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 }\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,iBACd,EAOI,aAAO,qBAAqB,eAAe,CAK/C,YAAYD,EAAaE,EAAe,CACtC,MAAM,iBAAiBA,CAAO,KAAM,UAAW,IAAK,OAAWF,CAAG,EAClE,KAAK,KAAO,cACd",
6
- "names": ["message", "code", "statusCode", "originalError", "url", "method", "timeout"]
4
+ "sourcesContent": ["/**\n * @ru Базовый класс ошибок клиента Hyperttp, агрегирующий контекст неудачного сетевого запроса.\n * @en Base error class for the Hyperttp client, providing explicit layout context for failed requests.\n */\nexport class HyperClientError extends Error {\n /**\n * @ru Создает новый экземпляр HttpClientError.\n * @en Creates a new HttpClientError instance.\n */\n constructor(\n message: string,\n public code: string = \"HYPER_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 = \"HyperClientError\";\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 isHyperClientError(err: unknown): err is HyperClientError {\n return (\n err instanceof HyperClientError ||\n (err instanceof Error && (err as any).code === \"HYPER_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 HyperClientError {\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,yBAAyB,KAAK,CAOhC,KACA,WACA,cACA,IACA,OANT,YACEA,EACOC,EAAe,cACfC,EACAC,EACAC,EACAC,EAAe,CAEtB,MAAML,EAASG,EAAgB,CAAE,MAAOA,CAAa,EAAK,MAAS,YAN5DF,kBACAC,qBACAC,WACAC,cACAC,EAGP,KAAK,KAAO,mBACZ,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CAMO,OAAO,mBAAmBC,EAAY,CAC3C,OACEA,aAAe,kBACdA,aAAe,OAAUA,EAAY,OAAS,aAEnD,EAOI,aAAO,qBAAqB,gBAAgB,CAKhD,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
7
  }
@@ -1 +1 @@
1
- {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/utils/merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5F,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,CAAC,GACR,CAAC,GAAG,CAAC,CAoBP"}
1
+ {"version":3,"file":"merge.d.ts","sourceRoot":"","sources":["../../src/utils/merge.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC5F,MAAM,EAAE,CAAC,EACT,MAAM,EAAE,CAAC,GACR,CAAC,GAAG,CAAC,CA6BP"}
package/utils/merge.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";export function deepMerge(o,r){const e={...o};for(const n of Object.keys(r)){const t=r[n],u=e[n];if(c(t)&&c(u)){e[n]=deepMerge(u,t);continue}t!==void 0&&(e[n]=c(t)?deepMerge({},t):t)}return e}function c(o){return Object.prototype.toString.call(o)==="[object Object]"}
1
+ "use strict";export function deepMerge(n,c){const e={...n};for(const t in c){if(!Object.prototype.hasOwnProperty.call(c,t)||t==="__proto__"||t==="constructor"||t==="prototype")continue;const o=c[t],u=e[t];if(r(o)&&r(u)){e[t]=deepMerge(u,o);continue}o!==void 0&&(e[t]=r(o)?deepMerge({},o):o)}return e}function r(n){return typeof n=="object"&&n!==null&&(n.constructor===Object||n.constructor===void 0)}
2
2
  //# sourceMappingURL=merge.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../src/utils/merge.ts"],
4
- "sourcesContent": ["/**\n * @ru \u0420\u0435\u043A\u0443\u0440\u0441\u0438\u0432\u043D\u043E \u043E\u0431\u044A\u0435\u0434\u0438\u043D\u044F\u0435\u0442 \u0434\u0432\u0430 \u043E\u0431\u044A\u0435\u043A\u0442\u0430. \u0418\u0437\u0431\u0435\u0433\u0430\u0435\u0442 \u043B\u0438\u0448\u043D\u0438\u0445 \u0430\u043B\u043B\u043E\u043A\u0430\u0446\u0438\u0439 \u043F\u0430\u043C\u044F\u0442\u0438 \u0438 \u0437\u0430\u0449\u0438\u0449\u0430\u0435\u0442 \u043E\u0442 \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u044F \u0441\u0441\u044B\u043B\u043E\u043A nested-\u0441\u0442\u0440\u0443\u043A\u0442\u0443\u0440.\n * @en Recursively merges two objects. Avoids redundant memory allocations and prevents shared reference leakage for nested structures.\n */\nexport function deepMerge<T extends Record<string, unknown>, S extends Record<string, unknown>>(\n target: T,\n source: S,\n): T & S {\n const output: Record<string, unknown> = { ...target };\n for (const key of Object.keys(source)) {\n const sourceValue = source[key];\n const targetValue = output[key];\n if (isObject(sourceValue) && isObject(targetValue)) {\n output[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n );\n continue;\n }\n\n if (sourceValue !== undefined) {\n output[key] = isObject(sourceValue)\n ? deepMerge({}, sourceValue as Record<string, unknown>)\n : sourceValue;\n }\n }\n return output as T & S;\n}\n\n/**\n * @ru \u0411\u044B\u0441\u0442\u0440\u0430\u044F \u043F\u0440\u043E\u0432\u0435\u0440\u043A\u0430, \u044F\u0432\u043B\u044F\u0435\u0442\u0441\u044F \u043B\u0438 \u043F\u0435\u0440\u0435\u0434\u0430\u043D\u043D\u044B\u0439 \u044D\u043B\u0435\u043C\u0435\u043D\u0442 \u0447\u0438\u0441\u0442\u044B\u043C \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u043C (\u0438\u0441\u043A\u043B\u044E\u0447\u0430\u044F \u043C\u0430\u0441\u0441\u0438\u0432\u044B \u0438 null).\n * @en Fast check verifying if the provided item is a plain object layout (excluding arrays and null).\n */\nfunction isObject(item: unknown): boolean {\n return Object.prototype.toString.call(item) === \"[object Object]\";\n}\n"],
5
- "mappings": "aAIM,gBAAU,UACdA,EACAC,EAAS,CAET,MAAMC,EAAkC,CAAE,GAAGF,CAAM,EACnD,UAAWG,KAAO,OAAO,KAAKF,CAAM,EAAG,CACrC,MAAMG,EAAcH,EAAOE,CAAG,EACxBE,EAAcH,EAAOC,CAAG,EAC9B,GAAIG,EAASF,CAAW,GAAKE,EAASD,CAAW,EAAG,CAClDH,EAAOC,CAAG,EAAI,UACZE,EACAD,CAAsC,EAExC,QACF,CAEIA,IAAgB,SAClBF,EAAOC,CAAG,EAAIG,EAASF,CAAW,EAC9B,UAAU,CAAA,EAAIA,CAAsC,EACpDA,EAER,CACA,OAAOF,CACT,CAMA,SAASI,EAASC,EAAa,CAC7B,OAAO,OAAO,UAAU,SAAS,KAAKA,CAAI,IAAM,iBAClD",
4
+ "sourcesContent": ["/**\n * @ru Рекурсивно объединяет два объекта. Избегает лишних аллокаций памяти и защищает от разделения ссылок nested-структур.\n * @en Recursively merges two objects. Avoids redundant memory allocations and prevents shared reference leakage for nested structures.\n */\nexport function deepMerge<T extends Record<string, unknown>, S extends Record<string, unknown>>(\n target: T,\n source: S,\n): T & S {\n const output: Record<string, unknown> = { ...target };\n\n for (const key in source) {\n if (!Object.prototype.hasOwnProperty.call(source, key)) continue;\n\n if (key === \"__proto__\" || key === \"constructor\" || key === \"prototype\") {\n continue;\n }\n\n const sourceValue = source[key];\n const targetValue = output[key];\n\n if (isObject(sourceValue) && isObject(targetValue)) {\n output[key] = deepMerge(\n targetValue as Record<string, unknown>,\n sourceValue as Record<string, unknown>,\n );\n continue;\n }\n\n if (sourceValue !== undefined) {\n output[key] = isObject(sourceValue)\n ? deepMerge({}, sourceValue as Record<string, unknown>)\n : sourceValue;\n }\n }\n\n return output as T & S;\n}\n\n/**\n * @ru Быстрая проверка, является ли переданный элемент чистым объектом (исключая массивы и null).\n * @en Fast check verifying if the provided item is a plain object layout (excluding arrays and null).\n */\nfunction isObject(item: unknown): item is Record<string, unknown> {\n return (\n typeof item === \"object\" &&\n item !== null &&\n (item.constructor === Object || item.constructor === undefined)\n );\n}\n"],
5
+ "mappings": "aAIM,gBAAU,UACdA,EACAC,EAAS,CAET,MAAMC,EAAkC,CAAE,GAAGF,CAAM,EAEnD,UAAWG,KAAOF,EAAQ,CAGxB,GAFI,CAAC,OAAO,UAAU,eAAe,KAAKA,EAAQE,CAAG,GAEjDA,IAAQ,aAAeA,IAAQ,eAAiBA,IAAQ,YAC1D,SAGF,MAAMC,EAAcH,EAAOE,CAAG,EACxBE,EAAcH,EAAOC,CAAG,EAE9B,GAAIG,EAASF,CAAW,GAAKE,EAASD,CAAW,EAAG,CAClDH,EAAOC,CAAG,EAAI,UACZE,EACAD,CAAsC,EAExC,QACF,CAEIA,IAAgB,SAClBF,EAAOC,CAAG,EAAIG,EAASF,CAAW,EAC9B,UAAU,CAAA,EAAIA,CAAsC,EACpDA,EAER,CAEA,OAAOF,CACT,CAMA,SAASI,EAASC,EAAa,CAC7B,OACE,OAAOA,GAAS,UAChBA,IAAS,OACRA,EAAK,cAAgB,QAAUA,EAAK,cAAgB,OAEzD",
6
6
  "names": ["target", "source", "output", "key", "sourceValue", "targetValue", "isObject", "item"]
7
7
  }
@@ -1,32 +0,0 @@
1
- import type { HttpClientOptions, InternalRequest, RequestInterface, RequestBodyData, Method } from "@hyperttp/types";
2
- /**
3
- * @ru Строитель внутренних запросов с кэшированием URL и пулом объектов.
4
- * @en Internal request builder with URL caching and object pooling.
5
- */
6
- export declare class RequestBuilder {
7
- private readonly urlCache;
8
- /**
9
- * @ru Собирает InternalRequest из публичного API-вызова, переиспользуя пулированный объект.
10
- * @en Builds an InternalRequest from a public API call, reusing a pooled object.
11
- * @param method - HTTP method.
12
- * @param req - URL string or RequestInterface object.
13
- * @param body - Optional request body.
14
- * @param signal - Optional abort signal.
15
- * @param responseType - Response type hint ("stream" or undefined).
16
- * @param defaultHeaders - Default headers to apply.
17
- * @param config - Client configuration.
18
- * @param pooled - Optional pre-allocated InternalRequest to reuse.
19
- * @returns The built InternalRequest.
20
- */
21
- build(method: Method, req: RequestInterface | string, body: RequestBodyData | undefined, signal: AbortSignal | undefined, responseType: "stream" | undefined, defaultHeaders: Record<string, string | string[]>, config: HttpClientOptions, pooled?: InternalRequest): InternalRequest;
22
- /**
23
- * @ru Разрешает URL относительно baseURL с кэшированием результата.
24
- * @en Resolves a URL against baseURL with result caching.
25
- * @param url - URL to resolve (absolute or relative).
26
- * @param baseURL - Optional base URL.
27
- * @returns The resolved absolute URL.
28
- */
29
- resolveUrl(url: string, baseURL?: string): string;
30
- private appendQueryParams;
31
- }
32
- //# sourceMappingURL=RequestBuilder.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"RequestBuilder.d.ts","sourceRoot":"","sources":["../../src/Core/RequestBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,MAAM,EAEP,MAAM,iBAAiB,CAAC;AAmEzB;;;GAGG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2D;IAEpF;;;;;;;;;;;;OAYG;IACH,KAAK,CACH,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,gBAAgB,GAAG,MAAM,EAC9B,IAAI,EAAE,eAAe,GAAG,SAAS,EACjC,MAAM,EAAE,WAAW,GAAG,SAAS,EAC/B,YAAY,EAAE,QAAQ,GAAG,SAAS,EAClC,cAAc,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EACjD,MAAM,EAAE,iBAAiB,EACzB,MAAM,CAAC,EAAE,eAAe,GACvB,eAAe,CA2GjB;IAED;;;;;;OAMG;IACI,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAevD;IAED,OAAO,CAAC,iBAAiB;CAa1B"}
@@ -1,2 +0,0 @@
1
- "use strict";import{CacheManager as U}from"hcacher";import{normalizeBody as m,normalizeUrl as y}from"../utils/normalize.js";import{mergeHeadersFast as L}from"../utils/response.js";function R(h,t,e){const r=new AbortController;let l=!1;const i=()=>{l||(l=!0,h&&h.removeEventListener("abort",a),clearTimeout(c))},c=setTimeout(()=>{r.abort(new DOMException("Timeout","TimeoutError")),i()},t),a=()=>{r.abort(h?.reason),i()};return h&&h.addEventListener("abort",a),e.cleanupSignal=i,r.signal}function w(h,t,e){return t==null||t<=0?h:R(h,t,e)}export class RequestBuilder{urlCache=new U({maxSize:512,ttl:6e4});build(t,e,r,l,i,c,a,b){const n=b??{method:"GET",url:"",headers:c,body:void 0,signal:void 0,meta:{responseType:void 0,timings:{networkMs:void 0}},stealth:void 0},f=n.meta;if(typeof e=="string"){if(n.method=t,n.url=this.resolveUrl(e,a.baseURL),r!==void 0){n.headers=Object.create(null);for(const s in c)n.headers[s]=c[s]}else n.headers=c;return n.body=r!==void 0?m(t,r):void 0,n.signal=w(l,a.network?.timeout,f),f.responseType=i,n.stealth=a.network?.stealth,n}const u=y(e);if(!u)throw new Error(`[HyperCore] URL is undefined for ${t}`);let d;if(e.query){const s=u+"_base";let o=this.urlCache.get(s);o||(o=a.baseURL?new URL(u,a.baseURL).href:new URL(u).href,this.urlCache.set(s,o));const p=new URL(o);this.appendQueryParams(p,e.query),d=p.href}else{let s=this.urlCache.get(u);s||(s=a.baseURL?new URL(u,a.baseURL).href:new URL(u).href,this.urlCache.set(u,s)),d=s}if(n.method=t,n.url=d,e.headers){const s=Object.create(null);for(const o in c)s[o]=c[o];n.headers=L(s,e.headers)}else n.headers=c;if(n.body=m(t,e.body??r),n.signal=w(e.signal??l,a.network?.timeout,f),f.responseType=i??e.meta?.responseType,e.stealth)if(a.network?.stealth){const s=Object.create(null);for(const o in a.network.stealth)s[o]=a.network.stealth[o];for(const o in e.stealth)s[o]=e.stealth[o];n.stealth=s}else n.stealth=e.stealth;else n.stealth=a.network?.stealth;return n}resolveUrl(t,e){if(!t)throw new Error("[HyperCore] URL is undefined");let r=this.urlCache.get(t);return r||((t.startsWith("http://")||t.startsWith("https://"))&&!t.includes("?")?r=t:r=e?new URL(t,e).href:new URL(t).href,this.urlCache.set(t,r),r)}appendQueryParams(t,e){for(const r in e)if(Object.prototype.hasOwnProperty.call(e,r)){const l=e[r];if(l==null)continue;if(Array.isArray(l))for(let i=0;i<l.length;i++)t.searchParams.append(r,String(l[i]));else t.searchParams.set(r,String(l))}}}
2
- //# sourceMappingURL=RequestBuilder.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/Core/RequestBuilder.ts"],
4
- "sourcesContent": ["import type {\n HttpClientOptions,\n InternalRequest,\n RequestInterface,\n RequestBodyData,\n Method,\n ResponseType,\n} from \"@hyperttp/types\";\nimport { CacheManager } from \"hcacher\";\nimport { normalizeBody, normalizeUrl } from \"../utils/normalize.js\";\nimport { mergeHeadersFast } from \"../utils/response.js\";\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 AbortSignal \u0441 \u0442\u0430\u0439\u043C-\u0430\u0443\u0442\u043E\u043C \u0438 \u043F\u0440\u0438\u0432\u044F\u0437\u043A\u043E\u0439 \u043A \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u0441\u043A\u043E\u043C\u0443 \u0441\u0438\u0433\u043D\u0430\u043B\u0443 \u043E\u0442\u043C\u0435\u043D\u044B.\n * @en Creates an AbortSignal with timeout and user abort signal binding.\n * @param userSignal - Optional external abort signal.\n * @param timeoutMs - Timeout in milliseconds.\n * @param meta - Metadata object receiving cleanup function.\n * @returns AbortSignal bound to the timeout and user signal.\n */\nfunction createTimeoutSignal(\n userSignal: AbortSignal | undefined,\n timeoutMs: number,\n meta: any,\n): AbortSignal {\n const controller = new AbortController();\n\n let cleaned = false;\n const cleanup = () => {\n if (cleaned) return;\n cleaned = true;\n\n if (userSignal) {\n userSignal.removeEventListener(\"abort\", onUserAbort);\n }\n clearTimeout(timeoutId);\n };\n\n const timeoutId = setTimeout(() => {\n controller.abort(new DOMException(\"Timeout\", \"TimeoutError\"));\n cleanup();\n }, timeoutMs);\n\n const onUserAbort = () => {\n controller.abort(userSignal?.reason);\n cleanup();\n };\n\n if (userSignal) {\n userSignal.addEventListener(\"abort\", onUserAbort);\n }\n\n meta.cleanupSignal = cleanup;\n\n return controller.signal;\n}\n\n/**\n * @ru \u041F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442 \u0442\u0430\u0439\u043C-\u0430\u0443\u0442 \u043A \u0441\u0438\u0433\u043D\u0430\u043B\u0443 \u043E\u0442\u043C\u0435\u043D\u044B.\n * @en Applies a timeout to the abort signal.\n * @param signal - Optional external abort signal.\n * @param timeout - Timeout in milliseconds (skip if null/<=0).\n * @param meta - Metadata object receiving cleanup function.\n * @returns New abort signal with timeout, or the original signal.\n */\nfunction applyTimeout(\n signal: AbortSignal | undefined,\n timeout: number | undefined,\n meta: any,\n): AbortSignal | undefined {\n if (timeout == null || timeout <= 0) return signal;\n return createTimeoutSignal(signal, timeout, meta);\n}\n\n/**\n * @ru \u0421\u0442\u0440\u043E\u0438\u0442\u0435\u043B\u044C \u0432\u043D\u0443\u0442\u0440\u0435\u043D\u043D\u0438\u0445 \u0437\u0430\u043F\u0440\u043E\u0441\u043E\u0432 \u0441 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C URL \u0438 \u043F\u0443\u043B\u043E\u043C \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432.\n * @en Internal request builder with URL caching and object pooling.\n */\nexport class RequestBuilder {\n private readonly urlCache = new CacheManager<string>({ maxSize: 512, ttl: 60_000 });\n\n /**\n * @ru \u0421\u043E\u0431\u0438\u0440\u0430\u0435\u0442 InternalRequest \u0438\u0437 \u043F\u0443\u0431\u043B\u0438\u0447\u043D\u043E\u0433\u043E API-\u0432\u044B\u0437\u043E\u0432\u0430, \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044F \u043F\u0443\u043B\u0438\u0440\u043E\u0432\u0430\u043D\u043D\u044B\u0439 \u043E\u0431\u044A\u0435\u043A\u0442.\n * @en Builds an InternalRequest from a public API call, reusing a pooled object.\n * @param method - HTTP method.\n * @param req - URL string or RequestInterface object.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @param responseType - Response type hint (\"stream\" or undefined).\n * @param defaultHeaders - Default headers to apply.\n * @param config - Client configuration.\n * @param pooled - Optional pre-allocated InternalRequest to reuse.\n * @returns The built InternalRequest.\n */\n build(\n method: Method,\n req: RequestInterface | string,\n body: RequestBodyData | undefined,\n signal: AbortSignal | undefined,\n responseType: \"stream\" | undefined,\n defaultHeaders: Record<string, string | string[]>,\n config: HttpClientOptions,\n pooled?: InternalRequest,\n ): InternalRequest {\n const internalReq = pooled ?? {\n method: \"GET\" as Method,\n url: \"\",\n headers: defaultHeaders,\n body: undefined,\n signal: undefined,\n meta: {\n responseType: undefined as ResponseType | undefined,\n timings: {\n networkMs: undefined as number | undefined,\n },\n },\n stealth: undefined,\n };\n\n const metaObj = internalReq.meta as {\n responseType: ResponseType | undefined;\n timings: {\n networkMs: number | undefined;\n };\n cleanupSignal?: () => void;\n };\n\n if (typeof req === \"string\") {\n internalReq.method = method;\n internalReq.url = this.resolveUrl(req, config.baseURL);\n\n if (body !== undefined) {\n internalReq.headers = Object.create(null);\n for (const k in defaultHeaders) {\n internalReq.headers[k] = defaultHeaders[k]!;\n }\n } else {\n internalReq.headers = defaultHeaders;\n }\n\n internalReq.body = body !== undefined ? normalizeBody(method, body) : undefined;\n internalReq.signal = applyTimeout(signal, config.network?.timeout, metaObj);\n metaObj.responseType = responseType;\n internalReq.stealth = config.network?.stealth;\n return internalReq;\n }\n\n const rawUrl = normalizeUrl(req);\n if (!rawUrl) throw new Error(`[HyperCore] URL is undefined for ${method}`);\n\n let finalUrl: string;\n\n if (req.query) {\n const cacheKey = rawUrl + \"_base\";\n let baseUrl = this.urlCache.get(cacheKey);\n\n if (!baseUrl) {\n baseUrl = config.baseURL ? new URL(rawUrl, config.baseURL).href : new URL(rawUrl).href;\n this.urlCache.set(cacheKey, baseUrl);\n }\n\n const urlObj = new URL(baseUrl);\n this.appendQueryParams(urlObj, req.query);\n finalUrl = urlObj.href;\n } else {\n let cachedUrl = this.urlCache.get(rawUrl);\n if (!cachedUrl) {\n cachedUrl = config.baseURL ? new URL(rawUrl, config.baseURL).href : new URL(rawUrl).href;\n this.urlCache.set(rawUrl, cachedUrl);\n }\n finalUrl = cachedUrl;\n }\n\n internalReq.method = method;\n internalReq.url = finalUrl;\n\n if (req.headers) {\n const targetHeaders = Object.create(null);\n for (const k in defaultHeaders) {\n targetHeaders[k] = defaultHeaders[k]!;\n }\n internalReq.headers = mergeHeadersFast(targetHeaders, req.headers);\n } else {\n internalReq.headers = defaultHeaders;\n }\n\n internalReq.body = normalizeBody(method, req.body ?? body);\n internalReq.signal = applyTimeout(req.signal ?? signal, config.network?.timeout, metaObj);\n\n metaObj.responseType =\n responseType ?? (req.meta as { responseType?: ResponseType })?.responseType;\n\n if (req.stealth) {\n if (config.network?.stealth) {\n const nextStealth = Object.create(null);\n for (const k in config.network.stealth) {\n nextStealth[k] = (config.network.stealth as any)[k];\n }\n for (const k in req.stealth) {\n nextStealth[k] = (req.stealth as any)[k];\n }\n internalReq.stealth = nextStealth;\n } else {\n internalReq.stealth = req.stealth;\n }\n } else {\n internalReq.stealth = config.network?.stealth;\n }\n\n return internalReq;\n }\n\n /**\n * @ru \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 URL \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u043E baseURL \u0441 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0440\u0435\u0437\u0443\u043B\u044C\u0442\u0430\u0442\u0430.\n * @en Resolves a URL against baseURL with result caching.\n * @param url - URL to resolve (absolute or relative).\n * @param baseURL - Optional base URL.\n * @returns The resolved absolute URL.\n */\n public resolveUrl(url: string, baseURL?: string): string {\n if (!url) throw new Error(\"[HyperCore] URL is undefined\");\n\n let finalUrl = this.urlCache.get(url);\n if (finalUrl) return finalUrl;\n\n const isAbsolute = url.startsWith(\"http://\") || url.startsWith(\"https://\");\n if (isAbsolute && !url.includes(\"?\")) {\n finalUrl = url;\n } else {\n finalUrl = baseURL ? new URL(url, baseURL).href : new URL(url).href;\n }\n\n this.urlCache.set(url, finalUrl);\n return finalUrl;\n }\n\n private appendQueryParams(url: URL, query: Record<string, unknown>): void {\n for (const k in query) {\n if (Object.prototype.hasOwnProperty.call(query, k)) {\n const v = query[k];\n if (v == null) continue;\n if (Array.isArray(v)) {\n for (let j = 0; j < v.length; j++) url.searchParams.append(k, String(v[j]));\n } else {\n url.searchParams.set(k, String(v));\n }\n }\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["CacheManager", "normalizeBody", "normalizeUrl", "mergeHeadersFast", "createTimeoutSignal", "userSignal", "timeoutMs", "meta", "controller", "cleaned", "cleanup", "onUserAbort", "timeoutId", "applyTimeout", "signal", "timeout", "method", "req", "body", "responseType", "defaultHeaders", "config", "pooled", "internalReq", "metaObj", "k", "rawUrl", "finalUrl", "cacheKey", "baseUrl", "urlObj", "cachedUrl", "targetHeaders", "nextStealth", "url", "baseURL", "query", "v", "j"]
7
- }
@@ -1,37 +0,0 @@
1
- import type { HttpClientOptions, HyperTransport, TransportRequest, TransportResponse } from "@hyperttp/types";
2
- /**
3
- * @ru Конфигурация транспорта для браузера.
4
- * @en Browser transport configuration.
5
- */
6
- export interface BrowserTransportConfig extends HttpClientOptions {
7
- /**
8
- * @ru Базовый URL для относительных путей. По умолчанию — window.location.origin.
9
- * @en Base URL for relative paths. Defaults to window.location.origin.
10
- */
11
- baseUrl?: string;
12
- }
13
- /**
14
- * @ru Реализация транспорта для браузера с использованием глобального fetch API.
15
- * Оптимизирован для минимального размера и максимальной совместимости.
16
- * @en Browser transport implementation using the global fetch API.
17
- * Optimized for minimal size and maximum compatibility.
18
- */
19
- export declare class BrowserTransport implements HyperTransport {
20
- config: BrowserTransportConfig;
21
- private readonly isProduction;
22
- private readonly cleanBaseUrl;
23
- /**
24
- * @ru Создаёт экземпляр BrowserTransport.
25
- * @en Creates a BrowserTransport instance.
26
- * @param config - Transport configuration.
27
- */
28
- constructor(config: BrowserTransportConfig);
29
- /**
30
- * @ru Выполняет HTTP-запрос через глобальный fetch.
31
- * @en Executes an HTTP request via the global fetch.
32
- * @param req - The normalized transport request.
33
- * @returns Promise resolving to the transport response.
34
- */
35
- execute(req: TransportRequest): Promise<TransportResponse>;
36
- }
37
- //# sourceMappingURL=browser.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../src/transports/browser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AAEzB;;;GAGG;AACH,MAAM,WAAW,sBAAuB,SAAQ,iBAAiB;IAC/D;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAaD;;;;;GAKG;AACH,qBAAa,gBAAiB,YAAW,cAAc;IASlC,MAAM,EAAE,sBAAsB;IARjD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IAEtC;;;;OAIG;IACH,YAAmB,MAAM,EAAE,sBAAsB,EAehD;IAED;;;;;OAKG;IACU,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA6DtE;CACF"}
@@ -1,2 +0,0 @@
1
- "use strict";export class BrowserTransport{config;isProduction;cleanBaseUrl;constructor(s){this.config=s;const o=typeof window<"u"&&["localhost","127.0.0.1","::1"].includes(window.location.hostname),c=typeof process<"u"&&process.env,a=typeof import.meta<"u";this.isProduction=!o&&(c&&!0||a&&import.meta.env?.PROD===!0);const r=s.baseUrl??(typeof window<"u"?window.location.origin:"");this.cleanBaseUrl=r.endsWith("/")?r.slice(0,-1):r}async execute(s){const o=s.url,a=o.startsWith("http://")||o.startsWith("https://")||o.startsWith("//")?o:o.charCodeAt(0)===47?this.cleanBaseUrl+o:this.cleanBaseUrl+"/"+o;if(this.isProduction&&a.includes("//localhost"))throw new Error("Localhost URL detected in production environment");const r=Object.create(null);if(s.headers)if(s.headers instanceof Headers)s.headers.forEach((t,e)=>{r[e.toLowerCase()]=t});else if(Array.isArray(s.headers))for(let t=0;t<s.headers.length;t++){const e=s.headers[t];e&&typeof e[0]=="string"&&(r[e[0].toLowerCase()]=String(e[1]))}else{const t=s.headers;for(const e in t){const i=t[e];i!=null&&(r[e.toLowerCase()]=Array.isArray(i)?i.join(", "):String(i))}}const n=await globalThis.fetch(a,{method:s.method,headers:r,body:s.body,signal:s.signal}),l=Object.create(null);return n.headers.forEach((t,e)=>{l[e]=t}),{status:n.status,url:n.url,body:n.body,headers:l,_raw:n}}}
2
- //# sourceMappingURL=browser.js.map