@hyperttp/core 1.5.6 → 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/Core/HyperCore.d.ts +208 -0
  2. package/Core/HyperCore.d.ts.map +1 -0
  3. package/Core/HyperCore.js +2 -0
  4. package/Core/HyperCore.js.map +7 -0
  5. package/README.md +259 -187
  6. package/defaultConfig.d.ts +12 -0
  7. package/defaultConfig.d.ts.map +1 -0
  8. package/defaultConfig.js +2 -0
  9. package/defaultConfig.js.map +7 -0
  10. package/index.d.ts +6 -0
  11. package/index.d.ts.map +1 -0
  12. package/index.js +2 -0
  13. package/index.js.map +7 -0
  14. package/package.json +40 -64
  15. package/protocols/manager.d.ts +37 -0
  16. package/protocols/manager.d.ts.map +1 -0
  17. package/protocols/manager.js +2 -0
  18. package/protocols/manager.js.map +7 -0
  19. package/protocols/rest/index.d.ts +9 -0
  20. package/protocols/rest/index.d.ts.map +1 -0
  21. package/protocols/rest/index.js +2 -0
  22. package/protocols/rest/index.js.map +7 -0
  23. package/protocols/rest/receiver.d.ts +36 -0
  24. package/protocols/rest/receiver.d.ts.map +1 -0
  25. package/protocols/rest/receiver.js +2 -0
  26. package/protocols/rest/receiver.js.map +7 -0
  27. package/protocols/rest/sender.d.ts +31 -0
  28. package/protocols/rest/sender.d.ts.map +1 -0
  29. package/protocols/rest/sender.js +2 -0
  30. package/protocols/rest/sender.js.map +7 -0
  31. package/protocols/rest/type.d.ts +111 -0
  32. package/protocols/rest/type.d.ts.map +1 -0
  33. package/protocols/rest/type.js +2 -0
  34. package/protocols/rest/type.js.map +7 -0
  35. package/rest.d.ts +2 -0
  36. package/rest.d.ts.map +1 -0
  37. package/rest.js +2 -0
  38. package/rest.js.map +7 -0
  39. package/transports/fetch.d.ts +35 -0
  40. package/transports/fetch.d.ts.map +1 -0
  41. package/transports/fetch.js +2 -0
  42. package/transports/fetch.js.map +7 -0
  43. package/transports/manager.d.ts +39 -0
  44. package/transports/manager.d.ts.map +1 -0
  45. package/transports/manager.js +2 -0
  46. package/transports/manager.js.map +7 -0
  47. package/utils/abort.d.ts +23 -0
  48. package/utils/abort.d.ts.map +1 -0
  49. package/utils/abort.js +2 -0
  50. package/utils/abort.js.map +7 -0
  51. package/utils/errors.d.ts +46 -0
  52. package/utils/errors.d.ts.map +1 -0
  53. package/utils/errors.js +2 -0
  54. package/utils/errors.js.map +7 -0
  55. package/dist/Core/HyperCore.d.ts +0 -171
  56. package/dist/Core/HyperCore.d.ts.map +0 -1
  57. package/dist/Core/HyperCore.js +0 -2
  58. package/dist/Core/HyperCore.js.map +0 -7
  59. package/dist/Core/RequestBuilder.d.ts +0 -8
  60. package/dist/Core/RequestBuilder.d.ts.map +0 -1
  61. package/dist/Core/RequestBuilder.js +0 -2
  62. package/dist/Core/RequestBuilder.js.map +0 -7
  63. package/dist/LICENSE +0 -21
  64. package/dist/README.md +0 -291
  65. package/dist/defaultConfig.d.ts +0 -7
  66. package/dist/defaultConfig.d.ts.map +0 -1
  67. package/dist/defaultConfig.js +0 -2
  68. package/dist/defaultConfig.js.map +0 -7
  69. package/dist/index.d.ts +0 -3
  70. package/dist/index.d.ts.map +0 -1
  71. package/dist/index.js +0 -2
  72. package/dist/index.js.map +0 -7
  73. package/dist/package.json +0 -50
  74. package/dist/transports/browser.d.ts +0 -37
  75. package/dist/transports/browser.d.ts.map +0 -1
  76. package/dist/transports/browser.js +0 -2
  77. package/dist/transports/browser.js.map +0 -7
  78. package/dist/transports/manager.d.ts +0 -89
  79. package/dist/transports/manager.d.ts.map +0 -1
  80. package/dist/transports/manager.js +0 -7
  81. package/dist/transports/manager.js.map +0 -7
  82. package/dist/transports/node.d.ts +0 -33
  83. package/dist/transports/node.d.ts.map +0 -1
  84. package/dist/transports/node.js +0 -2
  85. package/dist/transports/node.js.map +0 -7
  86. package/dist/utils/errors.d.ts +0 -38
  87. package/dist/utils/errors.d.ts.map +0 -1
  88. package/dist/utils/errors.js +0 -2
  89. package/dist/utils/errors.js.map +0 -7
  90. package/dist/utils/normalize.d.ts +0 -35
  91. package/dist/utils/normalize.d.ts.map +0 -1
  92. package/dist/utils/normalize.js +0 -2
  93. package/dist/utils/normalize.js.map +0 -7
  94. package/dist/utils/pipeline.d.ts +0 -63
  95. package/dist/utils/pipeline.d.ts.map +0 -1
  96. package/dist/utils/pipeline.js +0 -2
  97. package/dist/utils/pipeline.js.map +0 -7
  98. package/dist/utils/response.d.ts +0 -108
  99. package/dist/utils/response.d.ts.map +0 -1
  100. package/dist/utils/response.js +0 -2
  101. package/dist/utils/response.js.map +0 -7
  102. package/dist/utils/retryUtils.d.ts +0 -17
  103. package/dist/utils/retryUtils.d.ts.map +0 -1
  104. package/dist/utils/retryUtils.js +0 -2
  105. package/dist/utils/retryUtils.js.map +0 -7
  106. /package/{dist/Core → Core}/index.d.ts +0 -0
  107. /package/{dist/Core → Core}/index.d.ts.map +0 -0
  108. /package/{dist/Core → Core}/index.js +0 -0
  109. /package/{dist/Core → Core}/index.js.map +0 -0
  110. /package/{dist/utils → utils}/merge.d.ts +0 -0
  111. /package/{dist/utils → utils}/merge.d.ts.map +0 -0
  112. /package/{dist/utils → utils}/merge.js +0 -0
  113. /package/{dist/utils → utils}/merge.js.map +0 -0
@@ -0,0 +1,2 @@
1
+ "use strict";const H=10485760;async function O(){if(typeof process>"u"||!process.versions?.node)throw new Error("[FetchTransport] listen() is only available in Node.js.");return import("node:http")}export class FetchTransport{protocols;maxBodyBytes;constructor(n={}){this.protocols=Object.freeze(n.protocols??["rest"]),this.maxBodyBytes=n.maxBodyBytes??10485760}async execute(n){const u=n,p=n.method!=="GET"&&n.method!=="HEAD",t=await fetch(n.url,{method:n.method,headers:n.headers,body:p?n.body??null:null,signal:n.signal,redirect:u.followRedirects===!1?"manual":"follow"}),y=u.stream?t.body:new Uint8Array(await t.arrayBuffer()),s={};if(typeof t.headers.getSetCookie=="function"){const r=t.headers.getSetCookie();r.length>0&&(s["set-cookie"]=r)}return t.headers.forEach((r,h)=>{const c=h.toLowerCase();if(!(c==="set-cookie"&&s["set-cookie"]))if(s[c]){const d=s[c];s[c]=Array.isArray(d)?[...d,r]:[d,r]}else s[c]=r}),{status:t.status,statusText:t.statusText,headers:s,url:t.url,body:y}}async listen(n){const{host:u,port:p,signal:t,onRequest:y}=n;if(t?.aborted)throw t.reason??new DOMException("The operation was aborted","AbortError");const{createServer:s}=await O(),r=s(async(o,e)=>{const i=new AbortController,l=()=>{i.signal.aborted||i.abort(new DOMException("Client disconnected","AbortError"))},g=()=>{o.complete||l()},E=()=>{e.writableEnded||l()};o.once("aborted",l),o.once("close",g),e.once("close",E);try{const v=Number(o.headers["content-length"]??0);if(Number.isFinite(v)&&v>this.maxBodyBytes){e.writeHead(413),e.end("Payload Too Large");return}const m=[];let B=0;for await(const f of o){if(B+=f.byteLength,B>this.maxBodyBytes){e.writeHead(413),e.end("Payload Too Large");return}m.push(f)}const L=m.length>0?Buffer.concat(m):void 0,T={};for(const[f,b]of Object.entries(o.headers))b!==void 0&&(T[f]=b);const k={method:o.method??"GET",url:o.url??"/",headers:T,body:L,signal:i.signal,protocol:this.protocols[0]??"rest"};if(!y){e.writeHead(501),e.end("Not Implemented");return}const a=await y(k),x={};for(const[f,b]of Object.entries(a.headers))x[f]=b;e.writeHead(a.status,a.statusText??"",x),a.body!=null?a.body instanceof Uint8Array||typeof a.body=="string"?e.end(a.body):e.end(JSON.stringify(a.body)):e.end()}catch{e.headersSent?e.destroy():(e.writeHead(500),e.end("Internal Server Error"))}finally{o.removeListener("aborted",l),o.removeListener("close",g),e.removeListener("close",E)}});let h=!1;const c=()=>h||(h=!0,t?.removeEventListener("abort",d),r.removeListener("error",w),!r.listening)?Promise.resolve():new Promise((o,e)=>{r.close(i=>{i?e(i):o()})}),d=()=>{c()},w=o=>{console.error("[FetchTransport] HTTP server error:",o)};if(t?.aborted)throw t.reason??new DOMException("The operation was aborted","AbortError");return t?.addEventListener("abort",d,{once:!0}),new Promise((o,e)=>{const i=l=>{t?.removeEventListener("abort",d),e(l)};r.once("error",i),r.listen({host:u,port:p},()=>{r.removeListener("error",i),r.on("error",w),o({close:c})})})}async close(){}}
2
+ //# sourceMappingURL=fetch.js.map
@@ -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 /**\n * @ru Максимальный размер входящего серверного тела в байтах. Превышение\n * возвращает HTTP 413 до передачи тела обработчику.\n * @en Maximum incoming server request body size in bytes. Exceeding it returns\n * HTTP 413 before the body reaches the handler.\n */\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 /**\n * @ru Создаёт fallback-транспорт на базе глобального `fetch`.\n * @en Creates a fallback transport based on global `fetch`.\n * @param options - Поддерживаемые протоколы и серверный лимит тела. @en Supported protocols and server body limit.\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
+ }
@@ -0,0 +1,39 @@
1
+ import type { HyperTransport, SenderProtocol } from "@hyperttp/types";
2
+ export type Runtime = "bun" | "node" | "deno" | "browser";
3
+ /**
4
+ * @ru Опции разрешения транспорта. `customTransport` имеет приоритет над автовыбором.
5
+ * @en Transport resolution options. `customTransport` takes priority over auto-selection.
6
+ */
7
+ export interface ResolveTransportOptions {
8
+ customTransport?: HyperTransport;
9
+ [key: string]: unknown;
10
+ }
11
+ export declare const CURRENT_RUNTIME: Runtime;
12
+ /**
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.
17
+ */
18
+ export declare function resolveTransport(protocol?: SenderProtocol, config?: ResolveTransportOptions): Promise<HyperTransport>;
19
+ /**
20
+ * @ru Синхронно возвращает транспорт из кэша без создания Promise.
21
+ * @en Synchronously returns a cached transport without creating a Promise.
22
+ * @param protocol - Протокол, для которого запрашивается транспорт. @en Protocol whose transport is requested.
23
+ * @returns Кэшированный транспорт или `undefined`. @en Cached transport or `undefined`.
24
+ */
25
+ export declare function getCachedTransport(protocol?: SenderProtocol): HyperTransport | undefined;
26
+ /**
27
+ * @ru Удаляет все записи кэша, ссылающиеся на указанный транспорт.
28
+ * @en Removes every cache entry that references the given transport.
29
+ * @param transport - Экземпляр транспорта для удаления из кэша. @en Transport instance to evict from the cache.
30
+ */
31
+ export declare function evictCachedTransport(transport: HyperTransport): void;
32
+ /**
33
+ * @ru Очищает кэш транспортов и ожидающих их разрешений. Не закрывает уже
34
+ * созданные экземпляры транспорта.
35
+ * @en Clears cached transports and pending resolutions. It does not close
36
+ * already-created transport instances.
37
+ */
38
+ export declare function resetCachedTransport(): void;
39
+ //# sourceMappingURL=manager.d.ts.map
@@ -0,0 +1 @@
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;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,GAAE,cAAuB,GAAG,cAAc,GAAG,SAAS,CAEhG;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,cAAc,GAAG,IAAI,CAMpE;AAED;;;;;GAKG;AACH,wBAAgB,oBAAoB,IAAI,IAAI,CAG3C"}
@@ -0,0 +1,2 @@
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()}
2
+ //# sourceMappingURL=manager.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/transports/manager.ts"],
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 creating a Promise.\n * @param protocol - Протокол, для которого запрашивается транспорт. @en Protocol whose transport is requested.\n * @returns Кэшированный транспорт или `undefined`. @en Cached transport or `undefined`.\n */\nexport function getCachedTransport(protocol: SenderProtocol = \"rest\"): HyperTransport | undefined {\n return transportCache.get(protocol);\n}\n\n/**\n * @ru Удаляет все записи кэша, ссылающиеся на указанный транспорт.\n * @en Removes every cache entry that references the given transport.\n * @param transport - Экземпляр транспорта для удаления из кэша. @en Transport instance to evict from the cache.\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\n/**\n * @ru Очищает кэш транспортов и ожидающих их разрешений. Не закрывает уже\n * созданные экземпляры транспорта.\n * @en Clears cached transports and pending resolutions. It does not close\n * already-created transport instances.\n */\nexport function resetCachedTransport(): void {\n transportCache.clear();\n transportResolutions.clear();\n}\n"],
5
+ "mappings": "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",
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
+ }
@@ -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
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * @ru Базовый класс ошибок клиента Hyperttp, агрегирующий контекст неудачного сетевого запроса.
3
+ * @en Base error class for the Hyperttp client, providing explicit layout context for failed requests.
4
+ */
5
+ export declare class HyperClientError extends Error {
6
+ code: string;
7
+ statusCode?: number | undefined;
8
+ originalError?: Error | undefined;
9
+ url?: string | undefined;
10
+ method?: string | undefined;
11
+ /**
12
+ * @ru Создает ошибку Hyperttp с дополнительным сетевым контекстом.
13
+ * @en Creates a Hyperttp error with optional network context.
14
+ * @param message - Человекочитаемое описание ошибки. @en Human-readable error description.
15
+ * @param code - Машиночитаемый код ошибки. @en Machine-readable error code.
16
+ * @param statusCode - Связанный HTTP-статус, если есть. @en Associated HTTP status, when available.
17
+ * @param originalError - Исходная ошибка как `cause`. @en Original error exposed as `cause`.
18
+ * @param url - URL, связанный с ошибкой. @en URL associated with the error.
19
+ * @param method - HTTP-метод, связанный с ошибкой. @en HTTP method associated with the error.
20
+ */
21
+ constructor(message: string, code?: string, statusCode?: number | undefined, originalError?: Error | undefined, url?: string | undefined, method?: string | undefined);
22
+ /**
23
+ * @ru Проверяет, является ли ошибка экземпляром HttpClientError (безопасно для разрозненных бандлов).
24
+ * @en Checks if an error is an HttpClientError instance (bundle boundary safe).
25
+ */
26
+ static isHyperClientError(err: unknown): err is HyperClientError;
27
+ }
28
+ /**
29
+ * @ru Ошибка, возникающая при превышении лимита времени ожидания ответа от сервера.
30
+ * @en Error thrown when a network request exceeds its allocated execution timeout threshold.
31
+ */
32
+ export declare class TimeoutError extends HyperClientError {
33
+ /**
34
+ * @ru Создает ошибку таймаута для указанного URL.
35
+ * @en Creates a timeout error for the given URL.
36
+ * @param url - URL запроса с истекшим таймаутом. @en URL of the timed-out request.
37
+ * @param timeout - Лимит времени в миллисекундах. @en Time limit in milliseconds.
38
+ */
39
+ constructor(url: string, timeout: number);
40
+ /**
41
+ * @ru Проверяет, является ли ошибка экземпляром TimeoutError.
42
+ * @en Checks if an error is a TimeoutError instance.
43
+ */
44
+ static isTimeoutError(err: unknown): err is TimeoutError;
45
+ }
46
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/utils/errors.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,qBAAa,gBAAiB,SAAQ,KAAK;IAahC,IAAI,EAAE,MAAM;IACZ,UAAU,CAAC,EAAE,MAAM;IACnB,aAAa,CAAC,EAAE,KAAK;IACrB,GAAG,CAAC,EAAE,MAAM;IACZ,MAAM,CAAC,EAAE,MAAM;IAhBxB;;;;;;;;;OASG;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;;;;;OAKG;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"}
@@ -0,0 +1,2 @@
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
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/utils/errors.ts"],
4
+ "sourcesContent": ["/**\n * @ru Базовый класс ошибок клиента Hyperttp, агрегирующий контекст неудачного сетевого запроса.\n * @en Base error class for the Hyperttp client, providing explicit layout context for failed requests.\n */\nexport class HyperClientError extends Error {\n /**\n * @ru Создает ошибку Hyperttp с дополнительным сетевым контекстом.\n * @en Creates a Hyperttp error with optional network context.\n * @param message - Человекочитаемое описание ошибки. @en Human-readable error description.\n * @param code - Машиночитаемый код ошибки. @en Machine-readable error code.\n * @param statusCode - Связанный HTTP-статус, если есть. @en Associated HTTP status, when available.\n * @param originalError - Исходная ошибка как `cause`. @en Original error exposed as `cause`.\n * @param url - URL, связанный с ошибкой. @en URL associated with the error.\n * @param method - HTTP-метод, связанный с ошибкой. @en HTTP method associated with the error.\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 Создает ошибку таймаута для указанного URL.\n * @en Creates a timeout error for the given URL.\n * @param url - URL запроса с истекшим таймаутом. @en URL of the timed-out request.\n * @param timeout - Лимит времени в миллисекундах. @en Time limit in milliseconds.\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,CAahC,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,CAOhD,YAAYF,EAAaG,EAAe,CACtC,MAAM,iBAAiBA,CAAO,KAAM,UAAW,IAAK,OAAWH,CAAG,EAClE,KAAK,KAAO,eACZ,OAAO,eAAe,KAAM,WAAW,SAAS,CAClD,CAMO,OAAO,eAAeE,EAAY,CACvC,OAAOA,aAAe,cAAiBA,aAAe,OAAUA,EAAY,OAAS,SACvF",
6
+ "names": ["message", "code", "statusCode", "originalError", "url", "method", "err", "timeout"]
7
+ }
@@ -1,171 +0,0 @@
1
- import type { IHyperCore, HyperTransport, HttpClientOptions, HyperPlugin, InternalRequest, HttpResponse, RequestInterface, StreamResponse, RequestBodyData } from "@hyperttp/types";
2
- /**
3
- * @ru Основной класс HTTP-клиента Hyperttp. Управляет транспортом, плагинами, повторными попытками и пулом запросов.
4
- * @en Core Hyperttp HTTP client class. Manages transport, plugins, retries, and request pooling.
5
- */
6
- export declare class HyperCore implements IHyperCore {
7
- config: HttpClientOptions;
8
- private readonly transportManager;
9
- private readonly transportReady;
10
- private readonly defaultHeaders;
11
- private readonly pluginCtx;
12
- private readonly pipelines;
13
- private readonly requestBuilder;
14
- private readonly requestPool;
15
- private semaphore;
16
- private hasRequestPlugins;
17
- private hasResponseDataPlugins;
18
- private hasResponsePlugins;
19
- private hasErrorPlugins;
20
- private readonly _cachedMaxRetries;
21
- private readonly _cachedRetryOpts;
22
- constructor(config?: HttpClientOptions, transport?: HyperTransport);
23
- /**
24
- * @ru Возвращает имя текущего транспорта.
25
- * @en Returns the name of the current transport.
26
- * @returns Transport constructor name.
27
- */
28
- getTransportName(): Promise<string>;
29
- /**
30
- * @ru Основной метод отправки запроса через транспорт с поддержкой плагинов и повторных попыток.
31
- * @en Core request dispatch method through transport with plugin and retry support.
32
- * @param req - The internal request to dispatch.
33
- * @returns Promise resolving to the HTTP response.
34
- */
35
- dispatch<T = unknown>(req: InternalRequest): Promise<HttpResponse<T>>;
36
- /**
37
- * @ru Регистрирует плагин с сортировкой по приоритету. Пропускает отключённые плагины.
38
- * @en Registers a plugin sorted by priority. Skips disabled plugins.
39
- * @param plugin - The plugin instance to register.
40
- * @returns This instance for chaining.
41
- */
42
- use(plugin: HyperPlugin): this;
43
- /**
44
- * @ru Выполняет GET-запрос. Использует быстрый путь для простых строковых URL без плагинов/повторов.
45
- * @en Performs a GET request. Uses a fast path for bare string URLs without plugins/retries.
46
- * @param req - URL string or RequestInterface.
47
- * @param signal - Optional abort signal.
48
- * @returns Promise resolving to the HTTP response.
49
- */
50
- get<T = unknown>(req: RequestInterface | string, signal?: AbortSignal): Promise<HttpResponse<T>>;
51
- private fastGet;
52
- /**
53
- * @ru Выполняет POST-запрос.
54
- * @en Performs a POST request.
55
- * @param req - URL string or RequestInterface.
56
- * @param body - Optional request body.
57
- * @param signal - Optional abort signal.
58
- * @returns Promise resolving to the HTTP response.
59
- */
60
- post<T = unknown>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<HttpResponse<T>>;
61
- /**
62
- * @ru Выполняет PUT-запрос.
63
- * @en Performs a PUT request.
64
- * @param req - URL string or RequestInterface.
65
- * @param body - Optional request body.
66
- * @param signal - Optional abort signal.
67
- * @returns Promise resolving to the HTTP response.
68
- */
69
- put<T = unknown>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<HttpResponse<T>>;
70
- /**
71
- * @ru Выполняет PATCH-запрос.
72
- * @en Performs a PATCH request.
73
- * @param req - URL string or RequestInterface.
74
- * @param body - Optional request body.
75
- * @param signal - Optional abort signal.
76
- * @returns Promise resolving to the HTTP response.
77
- */
78
- patch<T = unknown>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<HttpResponse<T>>;
79
- /**
80
- * @ru Выполняет DELETE-запрос.
81
- * @en Performs a DELETE request.
82
- * @param req - URL string or RequestInterface.
83
- * @param signal - Optional abort signal.
84
- * @returns Promise resolving to the HTTP response.
85
- */
86
- delete<T = unknown>(req: RequestInterface | string, signal?: AbortSignal): Promise<HttpResponse<T>>;
87
- /**
88
- * @ru Выполняет OPTIONS-запрос.
89
- * @en Performs an OPTIONS request.
90
- * @param req - URL string or RequestInterface.
91
- * @param body - Optional request body.
92
- * @param signal - Optional abort signal.
93
- * @returns Promise resolving to the HTTP response.
94
- */
95
- options<T = unknown>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<HttpResponse<T>>;
96
- /**
97
- * @ru Выполняет HEAD-запрос.
98
- * @en Performs a HEAD request.
99
- * @param req - URL string or RequestInterface.
100
- * @param signal - Optional abort signal.
101
- * @returns Promise resolving to the HTTP response with null body.
102
- */
103
- head(req: RequestInterface | string, signal?: AbortSignal): Promise<HttpResponse<null>>;
104
- /**
105
- * @ru Выполняет GET-запрос и возвращает стриминг-ответ.
106
- * @en Performs a GET request and returns a streaming response.
107
- * @param req - URL string or RequestInterface.
108
- * @param signal - Optional abort signal.
109
- * @returns Promise resolving to a StreamResponse.
110
- */
111
- stream(req: RequestInterface | string, signal?: AbortSignal): Promise<StreamResponse<unknown>>;
112
- /**
113
- * @ru Выполняет POST-запрос и возвращает стриминг-ответ.
114
- * @en Performs a POST request and returns a streaming response.
115
- * @param req - URL string or RequestInterface.
116
- * @param body - Optional request body.
117
- * @param signal - Optional abort signal.
118
- * @returns Promise resolving to a StreamResponse.
119
- */
120
- postStream<T = unknown>(req: RequestInterface | string, body?: RequestBodyData, signal?: AbortSignal): Promise<StreamResponse<T>>;
121
- /**
122
- * @ru Создаёт новый экземпляр HyperCore с расширенной/переопределённой конфигурацией.
123
- * @en Creates a new HyperCore instance with extended/overridden configuration.
124
- * @param options - Partial configuration overrides.
125
- * @returns A new HyperCore instance.
126
- */
127
- extend(options: Partial<HttpClientOptions>): HyperCore;
128
- /**
129
- * @ru Алиас для extend().
130
- * @en Alias for extend().
131
- * @param options - Partial configuration overrides.
132
- * @returns A new HyperCore instance.
133
- */
134
- create(options: Partial<HttpClientOptions>): HyperCore;
135
- /**
136
- * @ru Завершает работу клиента и освобождает ресурсы транспорта.
137
- * @en Shuts down the client and releases transport resources.
138
- * @param graceful - If true, waits for active requests to complete.
139
- * @returns Promise that resolves when shutdown is complete.
140
- */
141
- destroy(graceful?: boolean): Promise<void>;
142
- /**
143
- * @ru Выполняет GET-запрос и возвращает тело ответа, разобранное как JSON.
144
- * @en Performs a GET request and returns the response body parsed as JSON.
145
- * @param req - URL string or RequestInterface.
146
- * @param signal - Optional abort signal.
147
- * @returns Promise resolving to the parsed JSON value.
148
- */
149
- json<T = unknown>(req: RequestInterface | string, signal?: AbortSignal): Promise<T>;
150
- /**
151
- * @ru Выполняет GET-запрос и возвращает тело ответа как строку.
152
- * @en Performs a GET request and returns the response body as text.
153
- * @param req - URL string or RequestInterface.
154
- * @param signal - Optional abort signal.
155
- * @returns Promise resolving to the response text.
156
- */
157
- text(req: RequestInterface | string, signal?: AbortSignal): Promise<string>;
158
- /**
159
- * @ru Выполняет GET-запрос и сбрасывает тело ответа (без сохранения).
160
- * @en Performs a GET request and discards the response body.
161
- * @param req - URL string or RequestInterface.
162
- * @param signal - Optional abort signal.
163
- * @returns Promise that resolves when the body is discarded.
164
- */
165
- dump(req: RequestInterface | string, signal?: AbortSignal): Promise<void>;
166
- private handleDispatchError;
167
- private acquireReq;
168
- private recycleRequest;
169
- private shortcut;
170
- }
171
- //# sourceMappingURL=HyperCore.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"HyperCore.d.ts","sourceRoot":"","sources":["../../src/Core/HyperCore.ts"],"names":[],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";import{defaultConfig as h}from"../defaultConfig.js";import{mapResponseFast as g,mapStreamFast as x,recycleResponse as p}from"../utils/response.js";import{TransportManager as E}from"../transports/manager.js";import{createPipelines as k,executeErrorPipeline as q,executeRequestPipeline as M,executeResponsePipeline as y,executeResponseDataPipeline as T,insertHookSorted as u}from"../utils/pipeline.js";import{normalizeHeaders as b,normalizeBodyForTransport as S}from"../utils/normalize.js";import{calcDelay as R,shouldRetry as D,drainBody as C}from"../utils/retryUtils.js";import{TimeoutError as O}from"../utils/errors.js";import{RequestBuilder as A}from"./RequestBuilder.js";const w=l=>new Promise(t=>setTimeout(t,l)),H=64;class z{current=0;max;queue;capacity;head=0;tail=0;size=0;constructor(t,e=1024){this.max=t,this.capacity=e;const s=[];s.length=e,this.queue=s}tryAcquire(){return this.current<this.max?(this.current++,!0):!1}acquire(){return this.current<this.max?(this.current++,Promise.resolve()):new Promise(t=>{this.size===this.capacity&&this.grow(),this.queue[this.tail]=t,this.tail=(this.tail+1)%this.capacity,this.size++})}release(){if(this.size>0){const t=this.queue[this.head];this.queue[this.head]=void 0,this.head=(this.head+1)%this.capacity,this.size--,t()}else this.current--}grow(){const t=this.capacity,e=t*2,s=[];s.length=e;for(let i=0;i<this.size;i++)s[i]=this.queue[(this.head+i)%t];this.queue=s,this.capacity=e,this.head=0,this.tail=this.size}}export class HyperCore{config;transportManager;transportReady;defaultHeaders;pluginCtx;pipelines=k();requestBuilder=new A;requestPool=[];semaphore=null;hasRequestPlugins=!1;hasResponseDataPlugins=!1;hasResponsePlugins=!1;hasErrorPlugins=!1;_cachedMaxRetries;_cachedRetryOpts;constructor(t=h,e){this.config={...h,...t,network:{...h.network,...t.network,stealth:t.network?.stealth||h.network?.stealth?Object.assign({},h.network?.stealth,t.network?.stealth):void 0}},this.transportManager=new E(this.config,e),this.transportReady=this.transportManager.getSync()?Promise.resolve(this.transportManager.getSync()):this.transportManager.ensure(),this.defaultHeaders=b({Accept:"application/json, text/plain, */*","Accept-Encoding":"gzip, deflate, br","User-Agent":this.config.network?.userAgent??"Hyperttp/2.0",...this.config.network?.headers});const s=this.config.network?.maxConcurrent;this.semaphore=s!=null&&s>0?new z(s):null,this._cachedRetryOpts=this.config.retry??{},this._cachedMaxRetries=this._cachedRetryOpts.maxRetries??0,this.pluginCtx={config:this.config,core:this}}async getTransportName(){return(this.transportManager.transport??await this.transportManager.get()).constructor.name}async dispatch(t){const e=this._cachedRetryOpts,s=this._cachedMaxRetries;for(let i=0;;i++)try{if(this.hasRequestPlugins){const n=M(this.pipelines.request,t,this.pluginCtx),m=n instanceof Promise?await n:n;if(m!=null)return this.recycleRequest(t),m}t.body!=null&&(t.body=S(t.body,t.headers));const r=this.transportManager.transport??this.transportManager.getSync()??await this.transportReady;let a=!1;if(this.semaphore&&(a=this.semaphore.tryAcquire(),a||await this.semaphore.acquire(),a=!0),t.signal?.aborted)throw t.signal.reason??new DOMException("Aborted","AbortError");let o;const c=t.meta,d=!!c.timings,P=d?performance.now():0;try{o=await r.execute(t)}finally{a&&this.semaphore?.release()}if(d&&(c.timings.networkMs=performance.now()-P),i<s&&D(o.status,e)){await C(o.body),await w(R(i,e));continue}if(this.hasResponseDataPlugins){const n=T(this.pipelines.responseData,o,this.pluginCtx);o=n instanceof Promise?await n:n}const f=c.responseType==="stream"?x(o):g(o);if(this.hasResponsePlugins){const n=y(this.pipelines.responseMutators,this.pipelines.responseSideEffects,f,t,this.pluginCtx,this.config.logger);n instanceof Promise&&await n}return this.recycleRequest(t),f}catch(r){if(r instanceof Error&&(r.name==="AbortError"||r.name==="TimeoutError")){if(t.signal&&t.signal.isTimeout){const a=this.config.network?.timeout??0;return this.handleDispatchError(new O(t.url,a),t)}return this.handleDispatchError(r,t)}if(i<s&&!t.signal?.aborted){await w(R(i,e));continue}return this.handleDispatchError(r,t)}}use(t){if(!(t.enabled?t.enabled(this.config):!0))return this;t.setup?.(this.pluginCtx);const s=t.priority??0,i={name:t.name,priority:s,run:null};if(t.onRequest&&(u(this.pipelines.request,{name:i.name,priority:i.priority,run:t.onRequest}),this.hasRequestPlugins=!0),t.onResponse){const r=t.mode==="background"?this.pipelines.responseSideEffects:this.pipelines.responseMutators;u(r,{name:i.name,priority:i.priority,run:t.onResponse}),this.hasResponsePlugins=!0}return t.onResponseData&&(u(this.pipelines.responseData,{name:i.name,priority:i.priority,run:t.onResponseData}),this.hasResponseDataPlugins=!0),t.onError&&(u(this.pipelines.error,{name:i.name,priority:i.priority,run:t.onError}),this.hasErrorPlugins=!0),this}get(t,e){return typeof t=="string"&&t!==""&&!e&&!this.hasRequestPlugins&&!this.hasResponsePlugins&&!this.hasResponseDataPlugins&&!this.hasErrorPlugins&&this._cachedMaxRetries===0?this.fastGet(t):this.dispatch(this.acquireReq("GET",t,void 0,e))}async fastGet(t){const e=this.requestBuilder.resolveUrl(t,this.config.baseURL);let s=!1;this.semaphore&&(s=this.semaphore.tryAcquire(),s||(await this.semaphore.acquire(),s=!0));const i=this.transportManager.transport??this.transportManager.getSync()??await this.transportReady;try{if(typeof i.fastRequest=="function")return await i.fastRequest(e,"GET",this.defaultHeaders);const r=await i.execute({method:"GET",url:e,headers:this.defaultHeaders,body:void 0,signal:void 0,stealth:this.config.network?.stealth});return g(r)}finally{s&&this.semaphore?.release()}}post(t,e,s){return this.dispatch(this.acquireReq("POST",t,e,s))}put(t,e,s){return this.dispatch(this.acquireReq("PUT",t,e,s))}patch(t,e,s){return this.dispatch(this.acquireReq("PATCH",t,e,s))}delete(t,e){return this.dispatch(this.acquireReq("DELETE",t,void 0,e))}options(t,e,s){return this.dispatch(this.acquireReq("OPTIONS",t,e,s))}head(t,e){return this.dispatch(this.acquireReq("HEAD",t,void 0,e))}stream(t,e){return this.dispatch(this.acquireReq("GET",t,void 0,e))}postStream(t,e,s){return this.dispatch(this.acquireReq("POST",t,e,s))}extend(t){const e={...this.config};for(const s in t)Object.prototype.hasOwnProperty.call(t,s)&&(s==="network"&&t.network?e.network={...this.config.network,...t.network,stealth:t.network.stealth||this.config.network?.stealth?{...this.config.network?.stealth,...t.network.stealth}:void 0}:e[s]=t[s]);return new HyperCore(e,this.transportManager.transport??void 0)}create(t){return this.extend(t)}destroy(t=!0){return this.transportManager.destroy(t)}json(t,e){return this.shortcut(t,e).then(s=>{const i=s.json?s.json():Promise.reject(new Error("json() not supported"));return p(s),i})}text(t,e){return this.shortcut(t,e).then(s=>{const i=s.text?s.text():Promise.reject(new Error("text() not supported"));return p(s),i})}dump(t,e){return this.shortcut(t,e).then(s=>{const i=s.dump?s.dump():Promise.resolve();return p(s),i})}async handleDispatchError(t,e){try{if(this.hasErrorPlugins){const s=await q(this.pipelines.error,t,e,this.pluginCtx);if(s!=null){if(this.hasResponsePlugins){const i=y(this.pipelines.responseMutators,this.pipelines.responseSideEffects,s,e,this.pluginCtx,this.config.logger);i instanceof Promise&&await i}return s}}throw t}finally{this.recycleRequest(e)}}acquireReq(t,e,s,i,r){const a=this.requestPool.pop();return this.requestBuilder.build(t,e,s,i,r,this.defaultHeaders,this.config,a)}recycleRequest(t){if(this.requestPool.length<H){t.method="GET",t.url="",t.headers=this.defaultHeaders,t.body=void 0,t.signal=void 0,t.stealth=void 0;const e=t.meta;e&&(e.responseType=void 0,typeof e.cleanupSignal=="function"&&(e.cleanupSignal(),e.cleanupSignal=void 0),e.timings&&(e.timings.networkMs=void 0)),this.requestPool.push(t)}}shortcut(t,e){const s=typeof t=="string"?"GET":t.method??"GET";return this.dispatch(this.acquireReq(s,t,void 0,e))}}
2
- //# sourceMappingURL=HyperCore.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/Core/HyperCore.ts"],
4
- "sourcesContent": ["import type {\n IHyperCore,\n HyperTransport,\n HttpClientOptions,\n PluginContext,\n HyperPlugin,\n InternalRequest,\n HttpResponse,\n HyperttpError,\n RequestInterface,\n StreamResponse,\n RequestBodyData,\n Method,\n ResponseType,\n TransportResponse,\n} from \"@hyperttp/types\";\nimport { defaultConfig } from \"../defaultConfig.js\";\nimport { mapResponseFast, mapStreamFast, recycleResponse } from \"../utils/response.js\";\nimport { TransportManager } from \"../transports/manager.js\";\nimport {\n createPipelines,\n executeErrorPipeline,\n executeRequestPipeline,\n executeResponsePipeline,\n executeResponseDataPipeline,\n insertHookSorted,\n} from \"../utils/pipeline.js\";\nimport { normalizeHeaders, normalizeBodyForTransport } from \"../utils/normalize.js\";\nimport { calcDelay, shouldRetry, drainBody } from \"../utils/retryUtils.js\";\nimport { TimeoutError } from \"../utils/errors.js\";\nimport { RequestBuilder } from \"./RequestBuilder.js\";\n\ntype TransportArgs = Parameters<HyperTransport[\"execute\"]>[0];\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\nconst MAX_POOL_SIZE = 64;\n\n/**\n * @ru Высокопроизводительный семафор на базе кольцевого буфера.\n * Гарантирует отсутствие аллокаций массивов в steady-state режиме.\n * @en High-performance semaphore backed by a ring buffer.\n * Guarantees zero array allocations in steady state.\n */\nclass Semaphore {\n private current = 0;\n private readonly max: number;\n\n private queue: Array<(() => void) | undefined>;\n private capacity: number;\n private head = 0;\n private tail = 0;\n private size = 0;\n\n constructor(max: number, initialCapacity = 1024) {\n this.max = max;\n this.capacity = initialCapacity;\n const arr: Array<(() => void) | undefined> = [];\n arr.length = initialCapacity;\n this.queue = arr;\n }\n\n /**\n * @ru Пытается захватить слот без ожидания.\n * @en Attempts to acquire a slot without waiting.\n * @returns true if the slot was acquired.\n */\n tryAcquire(): boolean {\n if (this.current < this.max) {\n this.current++;\n return true;\n }\n return false;\n }\n\n /**\n * @ru Захватывает слот, ожидая при необходимости.\n * @en Acquires a slot, waiting if necessary.\n * @returns Promise that resolves when the slot is acquired.\n */\n acquire(): Promise<void> {\n if (this.current < this.max) {\n this.current++;\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n if (this.size === this.capacity) {\n this.grow();\n }\n\n this.queue[this.tail] = resolve;\n this.tail = (this.tail + 1) % this.capacity;\n this.size++;\n });\n }\n\n /**\n * @ru Освобождает слот и запускает ожидающий из очереди.\n * @en Releases a slot and wakes the next waiter in the queue.\n */\n release(): void {\n if (this.size > 0) {\n const next = this.queue[this.head]!;\n this.queue[this.head] = undefined;\n this.head = (this.head + 1) % this.capacity;\n this.size--;\n next();\n } else {\n this.current--;\n }\n }\n\n /**\n * @ru Удваивает емкость буфера при переполнении.\n * @en Doubles buffer capacity on overflow.\n */\n private grow(): void {\n const oldCapacity = this.capacity;\n const newCapacity = oldCapacity * 2;\n\n const newQueue: Array<(() => void) | undefined> = [];\n newQueue.length = newCapacity;\n\n for (let i = 0; i < this.size; i++) {\n newQueue[i] = this.queue[(this.head + i) % oldCapacity];\n }\n\n this.queue = newQueue;\n this.capacity = newCapacity;\n this.head = 0;\n this.tail = this.size;\n }\n}\n\n/**\n * @ru Основной класс HTTP-клиента Hyperttp. Управляет транспортом, плагинами, повторными попытками и пулом запросов.\n * @en Core Hyperttp HTTP client class. Manages transport, plugins, retries, and request pooling.\n */\nexport class HyperCore implements IHyperCore {\n public config: HttpClientOptions;\n private readonly transportManager: TransportManager;\n private readonly transportReady: Promise<HyperTransport>;\n private readonly defaultHeaders: Record<string, string | string[]>;\n private readonly pluginCtx: PluginContext;\n private readonly pipelines = createPipelines();\n private readonly requestBuilder = new RequestBuilder();\n private readonly requestPool: InternalRequest[] = [];\n\n private semaphore: Semaphore | null = null;\n private hasRequestPlugins = false;\n private hasResponseDataPlugins = false;\n private hasResponsePlugins = false;\n private hasErrorPlugins = false;\n\n private readonly _cachedMaxRetries: number;\n private readonly _cachedRetryOpts: {\n maxRetries?: number;\n [k: string]: unknown;\n };\n\n constructor(config: HttpClientOptions = defaultConfig, transport?: HyperTransport) {\n this.config = {\n ...defaultConfig,\n ...config,\n network: {\n ...defaultConfig.network,\n ...config.network,\n stealth:\n config.network?.stealth || defaultConfig.network?.stealth\n ? Object.assign({}, defaultConfig.network?.stealth, config.network?.stealth)\n : undefined,\n },\n };\n this.transportManager = new TransportManager(this.config, transport);\n this.transportReady = this.transportManager.getSync()\n ? Promise.resolve(this.transportManager.getSync()!)\n : this.transportManager.ensure();\n\n this.defaultHeaders = normalizeHeaders({\n Accept: \"application/json, text/plain, */*\",\n \"Accept-Encoding\": \"gzip, deflate, br\",\n \"User-Agent\": this.config.network?.userAgent ?? \"Hyperttp/2.0\",\n ...this.config.network?.headers,\n });\n\n const maxConcurrent = this.config.network?.maxConcurrent;\n this.semaphore =\n maxConcurrent != null && maxConcurrent > 0 ? new Semaphore(maxConcurrent) : null;\n\n this._cachedRetryOpts = this.config.retry ?? {};\n this._cachedMaxRetries = this._cachedRetryOpts.maxRetries ?? 0;\n\n this.pluginCtx = { config: this.config, core: this };\n }\n\n /**\n * @ru Возвращает имя текущего транспорта.\n * @en Returns the name of the current transport.\n * @returns Transport constructor name.\n */\n public async getTransportName(): Promise<string> {\n const t = this.transportManager.transport ?? (await this.transportManager.get());\n return t.constructor.name;\n }\n\n /**\n * @ru Основной метод отправки запроса через транспорт с поддержкой плагинов и повторных попыток.\n * @en Core request dispatch method through transport with plugin and retry support.\n * @param req - The internal request to dispatch.\n * @returns Promise resolving to the HTTP response.\n */\n public async dispatch<T = unknown>(req: InternalRequest): Promise<HttpResponse<T>> {\n const retryOpts = this._cachedRetryOpts;\n const maxRetries = this._cachedMaxRetries;\n\n for (let attempt = 0; ; attempt++) {\n try {\n if (this.hasRequestPlugins) {\n const syncResult = executeRequestPipeline(this.pipelines.request, req, this.pluginCtx);\n const shortCircuit = syncResult instanceof Promise ? await syncResult : syncResult;\n\n if (shortCircuit != null) {\n this.recycleRequest(req);\n return shortCircuit as HttpResponse<T>;\n }\n }\n\n if (req.body != null) {\n req.body = normalizeBodyForTransport(req.body, req.headers);\n }\n\n const transport =\n this.transportManager.transport ??\n this.transportManager.getSync() ??\n (await this.transportReady);\n\n let acquired = false;\n if (this.semaphore) {\n acquired = this.semaphore.tryAcquire();\n if (!acquired) await this.semaphore.acquire();\n acquired = true;\n }\n\n if (req.signal?.aborted) {\n throw req.signal.reason ?? new DOMException(\"Aborted\", \"AbortError\");\n }\n\n let rawResponse: TransportResponse;\n const meta = req.meta as {\n responseType?: ResponseType;\n timings?: { networkMs?: number };\n };\n const shouldTrackTimings = !!meta.timings;\n const networkStart = shouldTrackTimings ? performance.now() : 0;\n try {\n rawResponse = await transport.execute(req as TransportArgs);\n } finally {\n if (acquired) this.semaphore?.release();\n }\n if (shouldTrackTimings) {\n meta.timings!.networkMs = performance.now() - networkStart;\n }\n\n if (attempt < maxRetries && shouldRetry(rawResponse.status, retryOpts)) {\n await drainBody(rawResponse.body);\n await sleep(calcDelay(attempt, retryOpts));\n continue;\n }\n\n if (this.hasResponseDataPlugins) {\n const syncResult = executeResponseDataPipeline(\n this.pipelines.responseData,\n rawResponse,\n this.pluginCtx,\n );\n rawResponse = syncResult instanceof Promise ? await syncResult : syncResult;\n }\n\n const response =\n meta.responseType === \"stream\"\n ? mapStreamFast(rawResponse)\n : mapResponseFast(rawResponse);\n\n if (this.hasResponsePlugins) {\n const syncResult = executeResponsePipeline(\n this.pipelines.responseMutators,\n this.pipelines.responseSideEffects,\n response as HttpResponse,\n req,\n this.pluginCtx,\n this.config.logger,\n );\n if (syncResult instanceof Promise) {\n await syncResult;\n }\n }\n\n this.recycleRequest(req);\n return response as HttpResponse<T>;\n } catch (error) {\n if (\n error instanceof Error &&\n (error.name === \"AbortError\" || error.name === \"TimeoutError\")\n ) {\n if (req.signal && (req.signal as any).isTimeout) {\n const timeout = this.config.network?.timeout ?? 0;\n return this.handleDispatchError(new TimeoutError(req.url, timeout), req);\n }\n return this.handleDispatchError(error, req);\n }\n\n if (attempt < maxRetries && !req.signal?.aborted) {\n await sleep(calcDelay(attempt, retryOpts));\n continue;\n }\n\n return this.handleDispatchError(error as Error, req);\n }\n }\n }\n\n /**\n * @ru Регистрирует плагин с сортировкой по приоритету. Пропускает отключённые плагины.\n * @en Registers a plugin sorted by priority. Skips disabled plugins.\n * @param plugin - The plugin instance to register.\n * @returns This instance for chaining.\n */\n public use(plugin: HyperPlugin): this {\n const isEnabled = plugin.enabled ? plugin.enabled(this.config) : true;\n if (!isEnabled) return this;\n\n plugin.setup?.(this.pluginCtx);\n const priority = (plugin as { priority?: number }).priority ?? 0;\n\n const hook = { name: plugin.name, priority, run: null as any };\n\n if (plugin.onRequest) {\n insertHookSorted(this.pipelines.request, {\n name: hook.name,\n priority: hook.priority,\n run: plugin.onRequest,\n });\n this.hasRequestPlugins = true;\n }\n if (plugin.onResponse) {\n const target =\n plugin.mode === \"background\"\n ? this.pipelines.responseSideEffects\n : this.pipelines.responseMutators;\n insertHookSorted(target, {\n name: hook.name,\n priority: hook.priority,\n run: plugin.onResponse,\n });\n this.hasResponsePlugins = true;\n }\n if (plugin.onResponseData) {\n insertHookSorted(this.pipelines.responseData, {\n name: hook.name,\n priority: hook.priority,\n run: plugin.onResponseData,\n });\n this.hasResponseDataPlugins = true;\n }\n if (plugin.onError) {\n insertHookSorted(this.pipelines.error, {\n name: hook.name,\n priority: hook.priority,\n run: plugin.onError,\n });\n this.hasErrorPlugins = true;\n }\n return this;\n }\n\n /**\n * @ru Выполняет GET-запрос. Использует быстрый путь для простых строковых URL без плагинов/повторов.\n * @en Performs a GET request. Uses a fast path for bare string URLs without plugins/retries.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public get<T = unknown>(req: RequestInterface | string, signal?: AbortSignal) {\n if (\n typeof req === \"string\" &&\n req !== \"\" &&\n !signal &&\n !this.hasRequestPlugins &&\n !this.hasResponsePlugins &&\n !this.hasResponseDataPlugins &&\n !this.hasErrorPlugins &&\n this._cachedMaxRetries === 0\n ) {\n return this.fastGet<T>(req);\n }\n return this.dispatch<T>(this.acquireReq(\"GET\", req, undefined, signal));\n }\n\n private async fastGet<T>(url: string): Promise<HttpResponse<T>> {\n const resolvedUrl = this.requestBuilder.resolveUrl(url, this.config.baseURL);\n\n let acquired = false;\n if (this.semaphore) {\n acquired = this.semaphore.tryAcquire();\n if (!acquired) {\n await this.semaphore.acquire();\n acquired = true;\n }\n }\n\n const transport =\n this.transportManager.transport ??\n this.transportManager.getSync() ??\n (await this.transportReady);\n\n try {\n if (typeof (transport as any).fastRequest === \"function\") {\n return (await (transport as any).fastRequest(\n resolvedUrl,\n \"GET\",\n this.defaultHeaders,\n )) as HttpResponse<T>;\n }\n\n const raw = await transport.execute({\n method: \"GET\",\n url: resolvedUrl,\n headers: this.defaultHeaders as Record<string, string>,\n body: undefined,\n signal: undefined,\n stealth: this.config.network?.stealth,\n } as TransportArgs);\n\n return mapResponseFast(raw) as HttpResponse<T>;\n } finally {\n if (acquired) this.semaphore?.release();\n }\n }\n\n /**\n * @ru Выполняет POST-запрос.\n * @en Performs a POST request.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public post<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"POST\", req, body, signal));\n }\n\n /**\n * @ru Выполняет PUT-запрос.\n * @en Performs a PUT request.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public put<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"PUT\", req, body, signal));\n }\n\n /**\n * @ru Выполняет PATCH-запрос.\n * @en Performs a PATCH request.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public patch<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"PATCH\", req, body, signal));\n }\n\n /**\n * @ru Выполняет DELETE-запрос.\n * @en Performs a DELETE request.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public delete<T = unknown>(req: RequestInterface | string, signal?: AbortSignal) {\n return this.dispatch<T>(this.acquireReq(\"DELETE\", req, undefined, signal));\n }\n\n /**\n * @ru Выполняет OPTIONS-запрос.\n * @en Performs an OPTIONS request.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response.\n */\n public options<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ) {\n return this.dispatch<T>(this.acquireReq(\"OPTIONS\", req, body, signal));\n }\n\n /**\n * @ru Выполняет HEAD-запрос.\n * @en Performs a HEAD request.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the HTTP response with null body.\n */\n public head(req: RequestInterface | string, signal?: AbortSignal) {\n return this.dispatch<null>(this.acquireReq(\"HEAD\", req, undefined, signal));\n }\n\n /**\n * @ru Выполняет GET-запрос и возвращает стриминг-ответ.\n * @en Performs a GET request and returns a streaming response.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to a StreamResponse.\n */\n public stream(\n req: RequestInterface | string,\n signal?: AbortSignal,\n ): Promise<StreamResponse<unknown>> {\n return this.dispatch(this.acquireReq(\"GET\", req, undefined, signal)) as Promise<\n StreamResponse<unknown>\n >;\n }\n\n /**\n * @ru Выполняет POST-запрос и возвращает стриминг-ответ.\n * @en Performs a POST request and returns a streaming response.\n * @param req - URL string or RequestInterface.\n * @param body - Optional request body.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to a StreamResponse.\n */\n public postStream<T = unknown>(\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n ): Promise<StreamResponse<T>> {\n return this.dispatch(this.acquireReq(\"POST\", req, body, signal)) as Promise<StreamResponse<T>>;\n }\n\n /**\n * @ru Создаёт новый экземпляр HyperCore с расширенной/переопределённой конфигурацией.\n * @en Creates a new HyperCore instance with extended/overridden configuration.\n * @param options - Partial configuration overrides.\n * @returns A new HyperCore instance.\n */\n public extend(options: Partial<HttpClientOptions>): HyperCore {\n const nextConfig = { ...this.config };\n for (const key in options) {\n if (Object.prototype.hasOwnProperty.call(options, key)) {\n if (key === \"network\" && options.network) {\n nextConfig.network = {\n ...this.config.network,\n ...options.network,\n stealth:\n options.network.stealth || this.config.network?.stealth\n ? {\n ...this.config.network?.stealth,\n ...options.network.stealth,\n }\n : undefined,\n };\n } else {\n (nextConfig as any)[key] = (options as any)[key];\n }\n }\n }\n return new HyperCore(nextConfig, this.transportManager.transport ?? undefined);\n }\n\n /**\n * @ru Алиас для extend().\n * @en Alias for extend().\n * @param options - Partial configuration overrides.\n * @returns A new HyperCore instance.\n */\n public create(options: Partial<HttpClientOptions>): HyperCore {\n return this.extend(options);\n }\n\n /**\n * @ru Завершает работу клиента и освобождает ресурсы транспорта.\n * @en Shuts down the client and releases transport resources.\n * @param graceful - If true, waits for active requests to complete.\n * @returns Promise that resolves when shutdown is complete.\n */\n public destroy(graceful = true): Promise<void> {\n return this.transportManager.destroy(graceful);\n }\n\n /**\n * @ru Выполняет GET-запрос и возвращает тело ответа, разобранное как JSON.\n * @en Performs a GET request and returns the response body parsed as JSON.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the parsed JSON value.\n */\n public json<T = unknown>(req: RequestInterface | string, signal?: AbortSignal): Promise<T> {\n return this.shortcut(req, signal).then((res) => {\n const out = res.json ? res.json<T>() : Promise.reject(new Error(\"json() not supported\"));\n recycleResponse(res);\n return out;\n });\n }\n\n /**\n * @ru Выполняет GET-запрос и возвращает тело ответа как строку.\n * @en Performs a GET request and returns the response body as text.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise resolving to the response text.\n */\n public text(req: RequestInterface | string, signal?: AbortSignal): Promise<string> {\n return this.shortcut(req, signal).then((res) => {\n const out = res.text ? res.text() : Promise.reject(new Error(\"text() not supported\"));\n recycleResponse(res);\n return out;\n });\n }\n\n /**\n * @ru Выполняет GET-запрос и сбрасывает тело ответа (без сохранения).\n * @en Performs a GET request and discards the response body.\n * @param req - URL string or RequestInterface.\n * @param signal - Optional abort signal.\n * @returns Promise that resolves when the body is discarded.\n */\n public dump(req: RequestInterface | string, signal?: AbortSignal): Promise<void> {\n return this.shortcut(req, signal).then((res) => {\n const out = res.dump ? res.dump() : Promise.resolve();\n recycleResponse(res);\n return out;\n });\n }\n\n private async handleDispatchError<T>(\n error: Error,\n req: InternalRequest,\n ): Promise<HttpResponse<T>> {\n try {\n if (this.hasErrorPlugins) {\n const recovered = await executeErrorPipeline(\n this.pipelines.error,\n error as HyperttpError,\n req,\n this.pluginCtx,\n );\n if (recovered != null) {\n if (this.hasResponsePlugins) {\n const syncResult = executeResponsePipeline(\n this.pipelines.responseMutators,\n this.pipelines.responseSideEffects,\n recovered as HttpResponse,\n req,\n this.pluginCtx,\n this.config.logger,\n );\n if (syncResult instanceof Promise) {\n await syncResult;\n }\n }\n return recovered as HttpResponse<T>;\n }\n }\n throw error;\n } finally {\n this.recycleRequest(req);\n }\n }\n\n private acquireReq(\n method: Method,\n req: RequestInterface | string,\n body?: RequestBodyData,\n signal?: AbortSignal,\n responseType?: \"stream\",\n ): InternalRequest {\n const pooled = this.requestPool.pop();\n return this.requestBuilder.build(\n method,\n req,\n body,\n signal,\n responseType,\n this.defaultHeaders,\n this.config,\n pooled,\n );\n }\n\n private recycleRequest(req: InternalRequest): void {\n if (this.requestPool.length < MAX_POOL_SIZE) {\n req.method = \"GET\";\n req.url = \"\";\n req.headers = this.defaultHeaders;\n req.body = undefined;\n req.signal = undefined;\n req.stealth = undefined;\n\n const m = req.meta as any;\n if (m) {\n m.responseType = undefined;\n\n if (typeof m.cleanupSignal === \"function\") {\n m.cleanupSignal();\n m.cleanupSignal = undefined;\n }\n\n if (m.timings) {\n m.timings.networkMs = undefined;\n }\n }\n this.requestPool.push(req);\n }\n }\n\n private shortcut(\n req: RequestInterface | string,\n signal?: AbortSignal,\n ): Promise<HttpResponse<unknown>> {\n const method = typeof req === \"string\" ? \"GET\" : (req.method ?? \"GET\");\n return this.dispatch(this.acquireReq(method, req, undefined, signal));\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["defaultConfig", "mapResponseFast", "mapStreamFast", "recycleResponse", "TransportManager", "createPipelines", "executeErrorPipeline", "executeRequestPipeline", "executeResponsePipeline", "executeResponseDataPipeline", "insertHookSorted", "normalizeHeaders", "normalizeBodyForTransport", "calcDelay", "shouldRetry", "drainBody", "TimeoutError", "RequestBuilder", "sleep", "ms", "resolve", "MAX_POOL_SIZE", "Semaphore", "max", "initialCapacity", "arr", "next", "oldCapacity", "newCapacity", "newQueue", "config", "transport", "maxConcurrent", "req", "retryOpts", "maxRetries", "attempt", "syncResult", "shortCircuit", "acquired", "rawResponse", "meta", "shouldTrackTimings", "networkStart", "response", "error", "timeout", "plugin", "priority", "hook", "target", "signal", "url", "resolvedUrl", "raw", "body", "options", "nextConfig", "key", "graceful", "res", "out", "recovered", "method", "responseType", "pooled", "m"]
7
- }
@@ -1,8 +0,0 @@
1
- import type { HttpClientOptions, InternalRequest, RequestInterface, RequestBodyData, Method } from "@hyperttp/types";
2
- export declare class RequestBuilder {
3
- private readonly urlCache;
4
- 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;
5
- resolveUrl(url: string, baseURL?: string): string;
6
- private appendQueryString;
7
- }
8
- //# 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;AAwEzB,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA2D;IAEpF,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,CAiGjB;IAEM,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,CAevD;IAED,OAAO,CAAC,iBAAiB;CAmB1B"}
@@ -1,2 +0,0 @@
1
- "use strict";import{CacheManager as b}from"hcacher";import{normalizeBody as m,normalizeUrl as R}from"../utils/normalize.js";import{mergeHeadersFast as y}from"../utils/response.js";function C(h,e,t){const n=new AbortController;let a=!1;const o=()=>{a||(a=!0,h&&h.removeEventListener("abort",s),clearTimeout(l))},l=setTimeout(()=>{n.signal.isTimeout=!0,n.abort(new DOMException("Timeout","TimeoutError")),o()},e),s=()=>{n.abort(h?.reason),o()};return h&&(h.aborted?s():h.addEventListener("abort",s)),t.cleanupSignal=o,n.signal}function U(h,e,t){return e==null||e<=0?h:C(h,e,t)}export class RequestBuilder{urlCache=new b({maxSize:512,ttl:6e4});build(e,t,n,a,o,l,s,w){const r=w??{method:"GET",url:"",headers:l,body:void 0,signal:void 0,meta:{responseType:void 0,timings:{networkMs:void 0}},stealth:void 0},u=r.meta;if(typeof t=="string")return r.method=e,r.url=this.resolveUrl(t,s.baseURL),n!==void 0?r.headers=Object.assign({},l):r.headers=l,r.body=n!==void 0?m(e,n):void 0,r.signal=U(a,s.network?.timeout,u),u.responseType=o,r.stealth=s.network?.stealth,r;const d=R(t);if(!d)throw new Error(`[HyperCore] URL is undefined for ${e}`);let f;if(t.query){const i=d+"_base";let c=this.urlCache.get(i);c||(c=s.baseURL?new URL(d,s.baseURL).href:new URL(d).href,this.urlCache.set(i,c)),f=this.appendQueryString(c,t.query)}else{let i=this.urlCache.get(d);i||(i=s.baseURL?new URL(d,s.baseURL).href:new URL(d).href,this.urlCache.set(d,i)),f=i}r.method=e,r.url=f;const p=t.body??n;if(t.headers||p!==void 0){const i=Object.assign({},l);r.headers=t.headers?y(i,t.headers):i}else r.headers=l;if(r.body=m(e,p),r.signal=U(t.signal??a,s.network?.timeout,u),u.responseType=o??t.meta?.responseType,t.stealth)if(s.network?.stealth){const i=Object.assign({},s.network.stealth,t.stealth);r.stealth=i}else r.stealth=t.stealth;else r.stealth=s.network?.stealth;return r}resolveUrl(e,t){if(!e)throw new Error("[HyperCore] URL is undefined");let n=this.urlCache.get(e);return n||((e.startsWith("http://")||e.startsWith("https://"))&&!e.includes("?")?n=e:n=t?new URL(e,t).href:new URL(e).href,this.urlCache.set(e,n),n)}appendQueryString(e,t){let n="";for(const a in t){if(!Object.prototype.hasOwnProperty.call(t,a))continue;const o=t[a];if(o!=null)if(Array.isArray(o))for(let l=0;l<o.length;l++)n&&(n+="&"),n+=encodeURIComponent(a)+"="+encodeURIComponent(String(o[l]));else n&&(n+="&"),n+=encodeURIComponent(a)+"="+encodeURIComponent(String(o))}return n?e+(e.includes("?")?"&":"?")+n:e}}
2
- //# sourceMappingURL=RequestBuilder.js.map