@hyperttp/core 1.5.4 → 1.5.6

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 (84) hide show
  1. package/README.md +177 -305
  2. package/{Core → dist/Core}/HyperCore.d.ts.map +1 -1
  3. package/dist/Core/HyperCore.js +2 -0
  4. package/dist/Core/HyperCore.js.map +7 -0
  5. package/dist/Core/RequestBuilder.d.ts +8 -0
  6. package/dist/Core/RequestBuilder.d.ts.map +1 -0
  7. package/dist/Core/RequestBuilder.js +2 -0
  8. package/dist/Core/RequestBuilder.js.map +7 -0
  9. package/dist/LICENSE +21 -0
  10. package/dist/README.md +291 -0
  11. package/dist/defaultConfig.js.map +7 -0
  12. package/dist/package.json +50 -0
  13. package/dist/transports/browser.js.map +7 -0
  14. package/{transports → dist/transports}/manager.d.ts.map +1 -1
  15. package/dist/transports/manager.js +7 -0
  16. package/dist/transports/manager.js.map +7 -0
  17. package/dist/transports/node.js.map +7 -0
  18. package/{utils → dist/utils}/errors.d.ts +10 -0
  19. package/{utils → dist/utils}/errors.d.ts.map +1 -1
  20. package/dist/utils/errors.js +2 -0
  21. package/dist/utils/errors.js.map +7 -0
  22. package/{utils → dist/utils}/merge.d.ts.map +1 -1
  23. package/dist/utils/merge.js +2 -0
  24. package/dist/utils/merge.js.map +7 -0
  25. package/dist/utils/normalize.d.ts.map +1 -0
  26. package/dist/utils/normalize.js +2 -0
  27. package/dist/utils/normalize.js.map +7 -0
  28. package/dist/utils/pipeline.js.map +7 -0
  29. package/{utils → dist/utils}/response.d.ts +0 -5
  30. package/{utils → dist/utils}/response.d.ts.map +1 -1
  31. package/dist/utils/response.js +2 -0
  32. package/dist/utils/response.js.map +7 -0
  33. package/{utils → dist/utils}/retryUtils.d.ts.map +1 -1
  34. package/dist/utils/retryUtils.js +2 -0
  35. package/dist/utils/retryUtils.js.map +7 -0
  36. package/package.json +38 -8
  37. package/Core/HyperCore.js +0 -2
  38. package/Core/HyperCore.js.map +0 -7
  39. package/Core/RequestBuilder.d.ts +0 -32
  40. package/Core/RequestBuilder.d.ts.map +0 -1
  41. package/Core/RequestBuilder.js +0 -2
  42. package/Core/RequestBuilder.js.map +0 -7
  43. package/defaultConfig.js.map +0 -7
  44. package/transports/browser.js.map +0 -7
  45. package/transports/manager.js +0 -7
  46. package/transports/manager.js.map +0 -7
  47. package/transports/node.js.map +0 -7
  48. package/utils/errors.js +0 -2
  49. package/utils/errors.js.map +0 -7
  50. package/utils/merge.js +0 -2
  51. package/utils/merge.js.map +0 -7
  52. package/utils/normalize.d.ts.map +0 -1
  53. package/utils/normalize.js +0 -2
  54. package/utils/normalize.js.map +0 -7
  55. package/utils/pipeline.js.map +0 -7
  56. package/utils/response.js +0 -2
  57. package/utils/response.js.map +0 -7
  58. package/utils/retryUtils.js +0 -2
  59. package/utils/retryUtils.js.map +0 -7
  60. /package/{Core → dist/Core}/HyperCore.d.ts +0 -0
  61. /package/{Core → dist/Core}/index.d.ts +0 -0
  62. /package/{Core → dist/Core}/index.d.ts.map +0 -0
  63. /package/{Core → dist/Core}/index.js +0 -0
  64. /package/{Core → dist/Core}/index.js.map +0 -0
  65. /package/{defaultConfig.d.ts → dist/defaultConfig.d.ts} +0 -0
  66. /package/{defaultConfig.d.ts.map → dist/defaultConfig.d.ts.map} +0 -0
  67. /package/{defaultConfig.js → dist/defaultConfig.js} +0 -0
  68. /package/{index.d.ts → dist/index.d.ts} +0 -0
  69. /package/{index.d.ts.map → dist/index.d.ts.map} +0 -0
  70. /package/{index.js → dist/index.js} +0 -0
  71. /package/{index.js.map → dist/index.js.map} +0 -0
  72. /package/{transports → dist/transports}/browser.d.ts +0 -0
  73. /package/{transports → dist/transports}/browser.d.ts.map +0 -0
  74. /package/{transports → dist/transports}/browser.js +0 -0
  75. /package/{transports → dist/transports}/manager.d.ts +0 -0
  76. /package/{transports → dist/transports}/node.d.ts +0 -0
  77. /package/{transports → dist/transports}/node.d.ts.map +0 -0
  78. /package/{transports → dist/transports}/node.js +0 -0
  79. /package/{utils → dist/utils}/merge.d.ts +0 -0
  80. /package/{utils → dist/utils}/normalize.d.ts +0 -0
  81. /package/{utils → dist/utils}/pipeline.d.ts +0 -0
  82. /package/{utils → dist/utils}/pipeline.d.ts.map +0 -0
  83. /package/{utils → dist/utils}/pipeline.js +0 -0
  84. /package/{utils → dist/utils}/retryUtils.d.ts +0 -0
@@ -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": "aAQA,OAAS,gBAAAA,MAAoB,UAC7B,OAAS,iBAAAC,EAAe,gBAAAC,MAAoB,wBAC5C,OAAS,oBAAAC,MAAwB,uBAUjC,SAASC,EACPC,EACAC,EACAC,EAAS,CAET,MAAMC,EAAa,IAAI,gBAEvB,IAAIC,EAAU,GACd,MAAMC,EAAU,IAAK,CACfD,IACJA,EAAU,GAENJ,GACFA,EAAW,oBAAoB,QAASM,CAAW,EAErD,aAAaC,CAAS,EACxB,EAEMA,EAAY,WAAW,IAAK,CAChCJ,EAAW,MAAM,IAAI,aAAa,UAAW,cAAc,CAAC,EAC5DE,EAAO,CACT,EAAGJ,CAAS,EAENK,EAAc,IAAK,CACvBH,EAAW,MAAMH,GAAY,MAAM,EACnCK,EAAO,CACT,EAEA,OAAIL,GACFA,EAAW,iBAAiB,QAASM,CAAW,EAGlDJ,EAAK,cAAgBG,EAEdF,EAAW,MACpB,CAUA,SAASK,EACPC,EACAC,EACAR,EAAS,CAET,OAAIQ,GAAW,MAAQA,GAAW,EAAUD,EACrCV,EAAoBU,EAAQC,EAASR,CAAI,CAClD,CAMM,aAAO,cAAc,CACR,SAAW,IAAIP,EAAqB,CAAE,QAAS,IAAK,IAAK,GAAM,CAAE,EAelF,MACEgB,EACAC,EACAC,EACAJ,EACAK,EACAC,EACAC,EACAC,EAAwB,CAExB,MAAMC,EAAcD,GAAU,CAC5B,OAAQ,MACR,IAAK,GACL,QAASF,EACT,KAAM,OACN,OAAQ,OACR,KAAM,CACJ,aAAc,OACd,QAAS,CACP,UAAW,SAGf,QAAS,QAGLI,EAAUD,EAAY,KAQ5B,GAAI,OAAON,GAAQ,SAAU,CAI3B,GAHAM,EAAY,OAASP,EACrBO,EAAY,IAAM,KAAK,WAAWN,EAAKI,EAAO,OAAO,EAEjDH,IAAS,OAAW,CACtBK,EAAY,QAAU,OAAO,OAAO,IAAI,EACxC,UAAWE,KAAKL,EACdG,EAAY,QAAQE,CAAC,EAAIL,EAAeK,CAAC,CAE7C,MACEF,EAAY,QAAUH,EAGxB,OAAAG,EAAY,KAAOL,IAAS,OAAYjB,EAAce,EAAQE,CAAI,EAAI,OACtEK,EAAY,OAASV,EAAaC,EAAQO,EAAO,SAAS,QAASG,CAAO,EAC1EA,EAAQ,aAAeL,EACvBI,EAAY,QAAUF,EAAO,SAAS,QAC/BE,CACT,CAEA,MAAMG,EAASxB,EAAae,CAAG,EAC/B,GAAI,CAACS,EAAQ,MAAM,IAAI,MAAM,oCAAoCV,CAAM,EAAE,EAEzE,IAAIW,EAEJ,GAAIV,EAAI,MAAO,CACb,MAAMW,EAAWF,EAAS,QAC1B,IAAIG,EAAU,KAAK,SAAS,IAAID,CAAQ,EAEnCC,IACHA,EAAUR,EAAO,QAAU,IAAI,IAAIK,EAAQL,EAAO,OAAO,EAAE,KAAO,IAAI,IAAIK,CAAM,EAAE,KAClF,KAAK,SAAS,IAAIE,EAAUC,CAAO,GAGrC,MAAMC,EAAS,IAAI,IAAID,CAAO,EAC9B,KAAK,kBAAkBC,EAAQb,EAAI,KAAK,EACxCU,EAAWG,EAAO,IACpB,KAAO,CACL,IAAIC,EAAY,KAAK,SAAS,IAAIL,CAAM,EACnCK,IACHA,EAAYV,EAAO,QAAU,IAAI,IAAIK,EAAQL,EAAO,OAAO,EAAE,KAAO,IAAI,IAAIK,CAAM,EAAE,KACpF,KAAK,SAAS,IAAIA,EAAQK,CAAS,GAErCJ,EAAWI,CACb,CAKA,GAHAR,EAAY,OAASP,EACrBO,EAAY,IAAMI,EAEdV,EAAI,QAAS,CACf,MAAMe,EAAgB,OAAO,OAAO,IAAI,EACxC,UAAWP,KAAKL,EACdY,EAAcP,CAAC,EAAIL,EAAeK,CAAC,EAErCF,EAAY,QAAUpB,EAAiB6B,EAAef,EAAI,OAAO,CACnE,MACEM,EAAY,QAAUH,EASxB,GANAG,EAAY,KAAOtB,EAAce,EAAQC,EAAI,MAAQC,CAAI,EACzDK,EAAY,OAASV,EAAaI,EAAI,QAAUH,EAAQO,EAAO,SAAS,QAASG,CAAO,EAExFA,EAAQ,aACNL,GAAiBF,EAAI,MAA0C,aAE7DA,EAAI,QACN,GAAII,EAAO,SAAS,QAAS,CAC3B,MAAMY,EAAc,OAAO,OAAO,IAAI,EACtC,UAAWR,KAAKJ,EAAO,QAAQ,QAC7BY,EAAYR,CAAC,EAAKJ,EAAO,QAAQ,QAAgBI,CAAC,EAEpD,UAAWA,KAAKR,EAAI,QAClBgB,EAAYR,CAAC,EAAKR,EAAI,QAAgBQ,CAAC,EAEzCF,EAAY,QAAUU,CACxB,MACEV,EAAY,QAAUN,EAAI,aAG5BM,EAAY,QAAUF,EAAO,SAAS,QAGxC,OAAOE,CACT,CASO,WAAWW,EAAaC,EAAgB,CAC7C,GAAI,CAACD,EAAK,MAAM,IAAI,MAAM,8BAA8B,EAExD,IAAIP,EAAW,KAAK,SAAS,IAAIO,CAAG,EACpC,OAAIP,KAEeO,EAAI,WAAW,SAAS,GAAKA,EAAI,WAAW,UAAU,IACvD,CAACA,EAAI,SAAS,GAAG,EACjCP,EAAWO,EAEXP,EAAWQ,EAAU,IAAI,IAAID,EAAKC,CAAO,EAAE,KAAO,IAAI,IAAID,CAAG,EAAE,KAGjE,KAAK,SAAS,IAAIA,EAAKP,CAAQ,EACxBA,EACT,CAEQ,kBAAkBO,EAAUE,EAA8B,CAChE,UAAWX,KAAKW,EACd,GAAI,OAAO,UAAU,eAAe,KAAKA,EAAOX,CAAC,EAAG,CAClD,MAAMY,EAAID,EAAMX,CAAC,EACjB,GAAIY,GAAK,KAAM,SACf,GAAI,MAAM,QAAQA,CAAC,EACjB,QAASC,EAAI,EAAGA,EAAID,EAAE,OAAQC,IAAKJ,EAAI,aAAa,OAAOT,EAAG,OAAOY,EAAEC,CAAC,CAAC,CAAC,OAE1EJ,EAAI,aAAa,IAAIT,EAAG,OAAOY,CAAC,CAAC,CAErC,CAEJ",
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,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../src/defaultConfig.ts"],
4
- "sourcesContent": ["import type { HttpClientOptions } from \"@hyperttp/types\";\n\n/**\n * @ru \u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u0434\u043B\u044F HTTP-\u043A\u043B\u0438\u0435\u043D\u0442\u0430 Hyperttp.\n * @en Default configuration for the Hyperttp HTTP client.\n */\nexport const defaultConfig: HttpClientOptions = {\n network: {\n timeout: 30000,\n maxConcurrent: 128,\n pipelining: 0,\n keepAliveTimeout: 5000,\n followRedirects: true,\n maxRedirects: 5,\n rejectUnauthorized: true,\n },\n retry: {\n maxRetries: 0,\n baseDelay: 100,\n maxDelay: 5000,\n jitter: true,\n },\n verbose: false,\n};\n"],
5
- "mappings": "aAMO,aAAM,cAAmC,CAC9C,QAAS,CACP,QAAS,IACT,cAAe,IACf,WAAY,EACZ,iBAAkB,IAClB,gBAAiB,GACjB,aAAc,EACd,mBAAoB,IAEtB,MAAO,CACL,WAAY,EACZ,UAAW,IACX,SAAU,IACV,OAAQ,IAEV,QAAS",
6
- "names": []
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/transports/browser.ts"],
4
- "sourcesContent": ["import type {\n HttpClientOptions,\n HyperTransport,\n TransportRequest,\n TransportResponse,\n TransportResponsePayload,\n} from \"@hyperttp/types\";\n\n/**\n * @ru \u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n * @en Browser transport configuration.\n */\nexport interface BrowserTransportConfig extends HttpClientOptions {\n /**\n * @ru \u0411\u0430\u0437\u043E\u0432\u044B\u0439 URL \u0434\u043B\u044F \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0443\u0442\u0435\u0439. \u041F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E \u2014 window.location.origin.\n * @en Base URL for relative paths. Defaults to window.location.origin.\n */\n baseUrl?: string;\n}\n\n/**\n * @ru \u0418\u043D\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0434\u043B\u044F \u0431\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E\u0433\u043E \u0434\u043E\u0441\u0442\u0443\u043F\u0430 \u043A \u043C\u0435\u0442\u0430-\u043E\u043A\u0440\u0443\u0436\u0435\u043D\u0438\u044E \u0441\u0431\u043E\u0440\u0449\u0438\u043A\u043E\u0432 (Vite, Webpack \u0438 \u0434\u0440.).\n * @en Interface for safe access to bundler meta-environment (Vite, Webpack, etc.).\n */\ninterface ImportMetaEnv {\n env?: {\n PROD?: boolean;\n [key: string]: unknown;\n };\n}\n\n/**\n * @ru \u0420\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430 \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u043E\u0433\u043E fetch API.\n * \u041E\u043F\u0442\u0438\u043C\u0438\u0437\u0438\u0440\u043E\u0432\u0430\u043D \u0434\u043B\u044F \u043C\u0438\u043D\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0433\u043E \u0440\u0430\u0437\u043C\u0435\u0440\u0430 \u0438 \u043C\u0430\u043A\u0441\u0438\u043C\u0430\u043B\u044C\u043D\u043E\u0439 \u0441\u043E\u0432\u043C\u0435\u0441\u0442\u0438\u043C\u043E\u0441\u0442\u0438.\n * @en Browser transport implementation using the global fetch API.\n * Optimized for minimal size and maximum compatibility.\n */\nexport class BrowserTransport implements HyperTransport {\n private readonly isProduction: boolean;\n private readonly cleanBaseUrl: string;\n\n /**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u044D\u043A\u0437\u0435\u043C\u043F\u043B\u044F\u0440 BrowserTransport.\n * @en Creates a BrowserTransport instance.\n * @param config - Transport configuration.\n */\n constructor(public config: BrowserTransportConfig) {\n const isLocalhost =\n typeof window !== \"undefined\" &&\n [\"localhost\", \"127.0.0.1\", \"::1\"].includes(window.location.hostname);\n\n const hasProcess = typeof process !== \"undefined\" && process.env;\n const hasMeta = typeof import.meta !== \"undefined\";\n\n this.isProduction =\n !isLocalhost &&\n ((hasProcess && process.env.NODE_ENV === \"production\") ||\n (hasMeta && (import.meta as unknown as ImportMetaEnv).env?.PROD === true));\n\n const base = config.baseUrl ?? (typeof window !== \"undefined\" ? window.location.origin : \"\");\n this.cleanBaseUrl = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n }\n\n /**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 HTTP-\u0437\u0430\u043F\u0440\u043E\u0441 \u0447\u0435\u0440\u0435\u0437 \u0433\u043B\u043E\u0431\u0430\u043B\u044C\u043D\u044B\u0439 fetch.\n * @en Executes an HTTP request via the global fetch.\n * @param req - The normalized transport request.\n * @returns Promise resolving to the transport response.\n */\n public async execute(req: TransportRequest): Promise<TransportResponse> {\n const urlStr = req.url;\n\n const isAbsolute =\n urlStr.startsWith(\"http://\") || urlStr.startsWith(\"https://\") || urlStr.startsWith(\"//\");\n\n const fullUrl = isAbsolute\n ? urlStr\n : urlStr.charCodeAt(0) === 47\n ? this.cleanBaseUrl + urlStr\n : this.cleanBaseUrl + \"/\" + urlStr;\n\n if (this.isProduction && fullUrl.includes(\"//localhost\")) {\n throw new Error(\"Localhost URL detected in production environment\");\n }\n\n const finalHeaders: Record<string, string> = Object.create(null);\n if (req.headers) {\n if (req.headers instanceof Headers) {\n req.headers.forEach((value, key) => {\n finalHeaders[key.toLowerCase()] = value;\n });\n } else if (Array.isArray(req.headers)) {\n for (let i = 0; i < req.headers.length; i++) {\n const pair = req.headers[i] as unknown as [string, string] | undefined;\n if (pair && typeof pair[0] === \"string\") {\n finalHeaders[pair[0].toLowerCase()] = String(pair[1]);\n }\n }\n } else {\n const src = req.headers as Record<string, unknown>;\n for (const key in src) {\n const value = src[key];\n if (value != null) {\n finalHeaders[key.toLowerCase()] = Array.isArray(value)\n ? value.join(\", \")\n : String(value);\n }\n }\n }\n }\n\n const res = await globalThis.fetch(fullUrl, {\n method: req.method,\n headers: finalHeaders as HeadersInit,\n body: req.body as BodyInit | null,\n signal: req.signal,\n });\n\n const resHeaders: Record<string, string> = Object.create(null);\n res.headers.forEach((value, key) => {\n resHeaders[key] = value;\n });\n\n return {\n status: res.status,\n url: res.url,\n body: res.body as unknown as TransportResponsePayload,\n headers: resHeaders,\n _raw: res,\n } as TransportResponse;\n }\n}\n"],
5
- "mappings": "aAqCM,aAAO,gBAAgB,CASR,OARF,aACA,aAOjB,YAAmBA,EAA8B,aAA9BA,EACjB,MAAMC,EACJ,OAAO,OAAW,KAClB,CAAC,YAAa,YAAa,KAAK,EAAE,SAAS,OAAO,SAAS,QAAQ,EAE/DC,EAAa,OAAO,QAAY,KAAe,QAAQ,IACvDC,EAAU,OAAO,YAAgB,IAEvC,KAAK,aACH,CAACF,IACCC,GAAc,IACbC,GAAY,YAAyC,KAAK,OAAS,IAExE,MAAMC,EAAOJ,EAAO,UAAY,OAAO,OAAW,IAAc,OAAO,SAAS,OAAS,IACzF,KAAK,aAAeI,EAAK,SAAS,GAAG,EAAIA,EAAK,MAAM,EAAG,EAAE,EAAIA,CAC/D,CAQO,MAAM,QAAQC,EAAqB,CACxC,MAAMC,EAASD,EAAI,IAKbE,EAFJD,EAAO,WAAW,SAAS,GAAKA,EAAO,WAAW,UAAU,GAAKA,EAAO,WAAW,IAAI,EAGrFA,EACAA,EAAO,WAAW,CAAC,IAAM,GACvB,KAAK,aAAeA,EACpB,KAAK,aAAe,IAAMA,EAEhC,GAAI,KAAK,cAAgBC,EAAQ,SAAS,aAAa,EACrD,MAAM,IAAI,MAAM,kDAAkD,EAGpE,MAAMC,EAAuC,OAAO,OAAO,IAAI,EAC/D,GAAIH,EAAI,QACN,GAAIA,EAAI,mBAAmB,QACzBA,EAAI,QAAQ,QAAQ,CAACI,EAAOC,IAAO,CACjCF,EAAaE,EAAI,YAAW,CAAE,EAAID,CACpC,CAAC,UACQ,MAAM,QAAQJ,EAAI,OAAO,EAClC,QAASM,EAAI,EAAGA,EAAIN,EAAI,QAAQ,OAAQM,IAAK,CAC3C,MAAMC,EAAOP,EAAI,QAAQM,CAAC,EACtBC,GAAQ,OAAOA,EAAK,CAAC,GAAM,WAC7BJ,EAAaI,EAAK,CAAC,EAAE,YAAW,CAAE,EAAI,OAAOA,EAAK,CAAC,CAAC,EAExD,KACK,CACL,MAAMC,EAAMR,EAAI,QAChB,UAAWK,KAAOG,EAAK,CACrB,MAAMJ,EAAQI,EAAIH,CAAG,EACjBD,GAAS,OACXD,EAAaE,EAAI,YAAW,CAAE,EAAI,MAAM,QAAQD,CAAK,EACjDA,EAAM,KAAK,IAAI,EACf,OAAOA,CAAK,EAEpB,CACF,CAGF,MAAMK,EAAM,MAAM,WAAW,MAAMP,EAAS,CAC1C,OAAQF,EAAI,OACZ,QAASG,EACT,KAAMH,EAAI,KACV,OAAQA,EAAI,OACb,EAEKU,EAAqC,OAAO,OAAO,IAAI,EAC7D,OAAAD,EAAI,QAAQ,QAAQ,CAACL,EAAOC,IAAO,CACjCK,EAAWL,CAAG,EAAID,CACpB,CAAC,EAEM,CACL,OAAQK,EAAI,OACZ,IAAKA,EAAI,IACT,KAAMA,EAAI,KACV,QAASC,EACT,KAAMD,EAEV",
6
- "names": ["config", "isLocalhost", "hasProcess", "hasMeta", "base", "req", "urlStr", "fullUrl", "finalHeaders", "value", "key", "i", "pair", "src", "res", "resHeaders"]
7
- }
@@ -1,7 +0,0 @@
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}}}
7
- //# sourceMappingURL=manager.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/transports/manager.ts"],
4
- "sourcesContent": ["import type { HttpClientOptions, HyperTransport } from \"@hyperttp/types\";\n\n/**\n * @ru \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"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/transports/node.ts"],
4
- "sourcesContent": ["import type {\n Fingerprint,\n HttpClientOptions,\n HyperTransport,\n StealthOptions,\n TransportRequest,\n TransportResponse,\n TransportResponsePayload,\n} from \"@hyperttp/types\";\nimport { CacheManager } from \"hcacher\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport net from \"node:net\";\nimport { Readable, Transform } from \"node:stream\";\nimport tls from \"node:tls\";\nimport zlib from \"node:zlib\";\n\n/**\n * @ru \u041A\u043E\u043D\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F Node.js \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 http/https \u043C\u043E\u0434\u0443\u043B\u0435\u0439.\n * @en Node.js transport configuration using native http/https modules.\n */\nexport interface NodeTransportConfig extends HttpClientOptions {\n /**\n * @ru \u0411\u0430\u0437\u043E\u0432\u044B\u0439 URL \u0434\u043B\u044F \u043E\u0442\u043D\u043E\u0441\u0438\u0442\u0435\u043B\u044C\u043D\u044B\u0445 \u043F\u0443\u0442\u0435\u0439.\n * @en Base URL for relative paths.\n */\n baseUrl?: string;\n /**\n * @ru \u041D\u0430\u0441\u0442\u0440\u043E\u0439\u043A\u0438 stealth-\u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043D\u0430 \u0443\u0440\u043E\u0432\u043D\u0435 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430.\n * @en Stealth masking settings at the transport level.\n */\n stealth?: StealthOptions;\n}\n\n/**\n * @ru \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0438\u0435 \u043F\u0440\u0435\u0441\u0435\u0442\u044B \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043D\u044B\u0445 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0434\u043B\u044F \u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0438 \u043F\u043E\u0434 \u0440\u0435\u0430\u043B\u044C\u043D\u044B\u0445 \u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0435\u0439.\n * \u0418\u0441\u043F\u043E\u043B\u044C\u0437\u0443\u044E\u0442\u0441\u044F stealth-\u0440\u0435\u0436\u0438\u043C\u043E\u043C \u0434\u043B\u044F \u043E\u0431\u0445\u043E\u0434\u0430 fingerprint-\u0437\u0430\u0449\u0438\u0442.\n * @en Static presets of browser headers for masking as real users.\n * Used by stealth mode to bypass fingerprint protections.\n */\nconst STEALTH_HEADER_PRESETS: Record<string, Record<string, string>> = {\n chrome: {\n \"sec-ch-ua\": '\"Not/A)Brand\";v=\"8\", \"Chromium\";v=\"126\", \"Google Chrome\";v=\"126\"',\n \"sec-ch-ua-mobile\": \"?0\",\n \"sec-ch-ua-platform\": '\"Linux\"',\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"sec-fetch-user\": \"?1\",\n \"upgrade-insecure-requests\": \"1\",\n \"accept-language\": \"en-US,en;q=0.9\",\n },\n firefox: {\n \"sec-fetch-dest\": \"document\",\n \"sec-fetch-mode\": \"navigate\",\n \"sec-fetch-site\": \"none\",\n \"accept-language\": \"en-US,en;q=0.5\",\n \"upgrade-insecure-requests\": \"1\",\n },\n};\n\n/**\n * @ru \u041F\u0440\u0435\u0441\u0435\u0442\u044B User-Agent, \u0441\u043E\u043E\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044E\u0449\u0438\u0435 TLS-\u043E\u0442\u043F\u0435\u0447\u0430\u0442\u043A\u0430\u043C (JA3/JA4).\n * @en User-Agent presets matching the TLS fingerprints (JA3/JA4).\n */\nconst STEALTH_UA_PRESETS: Record<string, string> = {\n chrome:\n \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36\",\n firefox: \"Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0\",\n safari:\n \"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15\",\n edge: \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0\",\n};\n\n/**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0441\u0442\u0440\u043E\u043A\u0443 \u0448\u0438\u0444\u0440\u043E\u0432 TLS \u0434\u043B\u044F \u0443\u043A\u0430\u0437\u0430\u043D\u043D\u043E\u0433\u043E \u043F\u0440\u043E\u0444\u0438\u043B\u044F \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0430.\n * @en Returns the TLS cipher suite string for the specified browser profile.\n * @param fingerprint - Browser fingerprint profile.\n * @returns Colon-separated cipher suite string, or empty string if not found.\n */\nfunction getCiphersForProfile(fingerprint: Fingerprint | undefined): string {\n if (!fingerprint) return \"\";\n\n switch (fingerprint) {\n case \"chrome\":\n case \"edge\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"firefox\":\n return [\n \"TLS_AES_128_GCM_SHA256\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_256_GCM_SHA384\",\n \"ECDHE-ECDSA-AES128-GCM-SHA256\",\n \"ECDHE-RSA-AES128-GCM-SHA256\",\n ].join(\":\");\n\n case \"safari\":\n return [\n \"TLS_AES_256_GCM_SHA384\",\n \"TLS_CHACHA20_POLY1305_SHA256\",\n \"TLS_AES_128_GCM_SHA256\",\n \"ECDHE-ECDSA-AES256-GCM-SHA384\",\n \"ECDHE-RSA-AES256-GCM-SHA384\",\n ].join(\":\");\n\n default:\n return \"\";\n }\n}\n\n/**\n * @ru \u0411\u0435\u0437\u043E\u043F\u0430\u0441\u043D\u043E \u043F\u0440\u0438\u043C\u0435\u043D\u044F\u0435\u0442 \u0441\u0442\u0435\u043B\u0441-\u043F\u0440\u0435\u0441\u0435\u0442\u044B, \u043E\u0442\u0434\u0430\u0432\u0430\u044F \u0430\u0431\u0441\u043E\u043B\u044E\u0442\u043D\u044B\u0439 \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0440\u0443\u0447\u043D\u044B\u043C \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0430\u043C.\n * @en Safely applies stealth presets, giving absolute priority to manual headers.\n * @param headers - The headers object to modify.\n * @param stealth - Stealth configuration options.\n * @returns The modified headers object.\n */\nfunction applyStealthHeaders(\n headers: Record<string, string>,\n stealth: StealthOptions,\n): Record<string, string> {\n if (!stealth || !stealth.fingerprint) return headers;\n\n const presetName = stealth.fingerprint;\n const presetHeaders = STEALTH_HEADER_PRESETS[presetName];\n\n if (presetHeaders) {\n for (const key in presetHeaders) {\n if (headers[key] === undefined) {\n headers[key] = presetHeaders[key]!;\n }\n }\n }\n\n const currentUA = headers[\"user-agent\"];\n if (currentUA === undefined || currentUA === \"hyperttp/2.0\" || currentUA === \"Hyperttp/2.0\") {\n const browserUA = STEALTH_UA_PRESETS[presetName];\n if (browserUA) {\n headers[\"user-agent\"] = browserUA;\n }\n }\n\n return headers;\n}\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0439 HTTP/HTTPS \u0430\u0433\u0435\u043D\u0442 \u0441 \u0443\u0447\u0451\u0442\u043E\u043C stealth-\u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A.\n * @en Creates a native HTTP/HTTPS agent considering stealth settings.\n * @param isHttps - Whether the connection is HTTPS.\n * @param stealth - Optional stealth configuration.\n * @param cache - The agent cache map to use (per-instance).\n * @returns The HTTP or HTTPS agent.\n */\nfunction getNativeAgent(\n isHttps: boolean,\n stealth: StealthOptions | undefined,\n cache: CacheManager<http.Agent | https.Agent>,\n trackedAgents: Set<http.Agent | https.Agent>,\n rejectUnauthorized?: boolean,\n): http.Agent | https.Agent {\n const fingerprint = stealth?.fingerprint ?? \"none\";\n const fragment = stealth?.fragment ?? \"none\";\n const needHttp2 = stealth?.http2 === true;\n const cacheKey = `${isHttps ? \"https\" : \"http\"}:${fingerprint}:${fragment}:${needHttp2 ? \"h2\" : \"1.1\"}`;\n\n let agent = cache.get(cacheKey);\n if (agent) return agent;\n\n const agentOpts: any = {\n keepAlive: true,\n maxSockets: 256,\n };\n\n if (rejectUnauthorized !== undefined) {\n agentOpts.rejectUnauthorized = rejectUnauthorized;\n }\n\n if (isHttps) {\n agentOpts.ciphers = getCiphersForProfile(stealth?.fingerprint);\n\n const needCustomConnect = fragment === \"split\" || needHttp2;\n\n if (needCustomConnect) {\n const alpnProtocols: string[] | undefined = needHttp2 ? [\"h2\", \"http/1.1\"] : undefined;\n\n agentOpts.createConnection = (\n options: any,\n callback: (err: Error | null, socket?: any) => void,\n ) => {\n let alpnFallback = false;\n\n const createTlsConnection = (\n alpn: string[] | undefined,\n cb: (err: Error | null, socket?: any) => void,\n ) => {\n const socket = net.connect(options);\n\n if (fragment === \"split\") {\n const originalWrite = socket.write;\n let isFirstWrite = true;\n\n socket.write = function (\n this: net.Socket,\n chunk: Uint8Array | string,\n encodingOrCb?: BufferEncoding | ((err?: Error | null) => void),\n cb?: (err?: Error | null) => void,\n ): boolean {\n if (isFirstWrite && chunk instanceof Uint8Array && chunk.length > 5) {\n isFirstWrite = false;\n this.write = originalWrite;\n\n let encoding: BufferEncoding | undefined;\n let callbackRef: ((err?: Error | null) => void) | undefined;\n\n if (typeof encodingOrCb === \"function\") {\n callbackRef = encodingOrCb;\n } else {\n encoding = encodingOrCb;\n callbackRef = cb;\n }\n\n const part1 = chunk.subarray(0, 3);\n const part2 = chunk.subarray(3);\n\n const onError = (err: Error) => {\n callbackRef?.(err);\n };\n\n try {\n originalWrite.call(this, part1, encoding);\n } catch (err) {\n onError(err as Error);\n return false;\n }\n return originalWrite.call(this, part2, encoding, callbackRef);\n }\n\n this.write = originalWrite;\n return originalWrite.call(this, chunk, encodingOrCb as any, cb as any);\n } as any;\n }\n\n const tlsOpts: any = {\n ...options,\n socket,\n ciphers: agentOpts.ciphers,\n };\n if (alpn) tlsOpts.ALPNProtocols = alpn;\n\n const tlsSocket = tls.connect(tlsOpts);\n\n tlsSocket.once(\"secureConnect\", () => {\n if (alpn && tlsSocket.alpnProtocol === \"h2\" && !alpnFallback) {\n alpnFallback = true;\n tlsSocket.destroy();\n createTlsConnection([\"http/1.1\"], cb);\n return;\n }\n cb(null, tlsSocket);\n });\n tlsSocket.once(\"error\", (err) => cb(err));\n };\n\n return createTlsConnection(alpnProtocols, callback);\n };\n }\n\n agent = new https.Agent(agentOpts);\n } else {\n agent = new http.Agent(agentOpts);\n }\n\n cache.set(cacheKey, agent);\n trackedAgents.add(agent);\n return agent;\n}\n\nfunction isAbsoluteHttpUrl(url: string): boolean {\n return url.startsWith(\"http://\") || url.startsWith(\"https://\");\n}\n\nfunction resolveUrl(baseUrl: string, url: string): string {\n if (!url) throw new Error(\"URL is empty\");\n if (isAbsoluteHttpUrl(url)) return url;\n return url.charCodeAt(0) === 47 ? baseUrl + url : baseUrl + \"/\" + url;\n}\n\nfunction isLocalhostUrl(url: string): boolean {\n const schemeIdx = url.indexOf(\"://\");\n if (schemeIdx === -1) return false;\n\n const hostStart = schemeIdx + 3;\n let hostEnd = url.indexOf(\"/\", hostStart);\n if (hostEnd === -1) hostEnd = url.length;\n\n const host = url.slice(hostStart, hostEnd);\n return host === \"localhost\" || host.startsWith(\"localhost:\");\n}\n\nfunction normalizeHeaders(headers: TransportRequest[\"headers\"]): Record<string, string> {\n const out: Record<string, string> = Object.create(null);\n if (!headers) return out;\n\n if (headers instanceof Headers) {\n headers.forEach((value, key) => {\n out[key.toLowerCase()] = value;\n });\n return out;\n }\n\n if (Array.isArray(headers)) {\n for (let i = 0; i < headers.length; i++) {\n const pair = headers[i] as unknown as [string, string] | undefined;\n if (!pair || typeof pair[0] !== \"string\") continue;\n out[pair[0].toLowerCase()] = String(pair[1]);\n }\n return out;\n }\n\n const src = headers as Record<string, unknown>;\n for (const key in src) {\n const value = src[key];\n if (value == null) continue;\n\n const lKey = key.toLowerCase();\n if (Array.isArray(value)) {\n out[lKey] = lKey === \"cookie\" ? value.join(\"; \") : value.join(\", \");\n continue;\n }\n\n out[lKey] = String(value);\n }\n\n return out;\n}\n\nfunction createSizeLimitTransform(maxBytes: number): Transform {\n let total = 0;\n return new Transform({\n transform(chunk: Buffer, _encoding, callback) {\n total += chunk.length;\n if (total > maxBytes) {\n callback(new Error(`[Hyperttp] Response size exceeded limit of ${maxBytes} bytes`));\n return;\n }\n callback(null, chunk);\n },\n });\n}\n\n/**\n * @ru \u0420\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 \u0434\u043B\u044F Node.js \u0441 \u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043D\u0430\u0442\u0438\u0432\u043D\u044B\u0445 http/https \u043C\u043E\u0434\u0443\u043B\u0435\u0439.\n * \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 stealth-\u043C\u0430\u0441\u043A\u0438\u0440\u043E\u0432\u043A\u0443, \u0444\u0440\u0430\u0433\u043C\u0435\u043D\u0442\u0430\u0446\u0438\u044E TLS Client Hello \u0438 \u0430\u0432\u0442\u043E\u043C\u0430\u0442\u0438\u0447\u0435\u0441\u043A\u0443\u044E \u0434\u0435\u043A\u043E\u043C\u043F\u0440\u0435\u0441\u0441\u0438\u044E.\n */\nexport class NodeTransport implements HyperTransport {\n public config: NodeTransportConfig;\n private readonly isProduction: boolean;\n private readonly cleanBaseUrl: string;\n private readonly agentCache = new CacheManager<http.Agent | https.Agent>({\n maxSize: 32,\n ttl: 60_000,\n });\n private readonly trackedAgents = new Set<http.Agent | https.Agent>();\n\n constructor(config: NodeTransportConfig) {\n this.config = config;\n this.isProduction = process.env.NODE_ENV === \"production\";\n\n const base = config.baseUrl ?? \"http://localhost:3000\";\n this.cleanBaseUrl = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n }\n\n public async execute(req: TransportRequest): Promise<TransportResponse> {\n const fullUrl = resolveUrl(this.cleanBaseUrl, req.url);\n\n if (this.isProduction && isLocalhostUrl(fullUrl)) {\n throw new Error(\"Localhost URL detected in production environment\");\n }\n\n let headers = normalizeHeaders(req.headers);\n\n if (headers[\"accept-encoding\"] === undefined) {\n headers[\"accept-encoding\"] = \"gzip, deflate, br\";\n }\n\n const stealthOpts = req.stealth ?? this.config.stealth ?? this.config.network?.stealth;\n if (stealthOpts) {\n headers = applyStealthHeaders(headers, stealthOpts);\n }\n\n const body = req.body;\n const urlObj = new URL(fullUrl);\n const isHttps = urlObj.protocol === \"https:\";\n const agent = getNativeAgent(\n isHttps,\n stealthOpts,\n this.agentCache,\n this.trackedAgents,\n this.config.network?.rejectUnauthorized,\n );\n\n return new Promise((resolve, reject) => {\n const reqOpts: http.RequestOptions | https.RequestOptions = {\n method: req.method,\n headers,\n agent,\n signal: req.signal,\n };\n\n let settled = false;\n\n const clientReq = (isHttps ? https : http).request(fullUrl, reqOpts, (res) => {\n const resHeaders: Record<string, string> = Object.create(null);\n for (const key in res.headers) {\n const val = res.headers[key];\n if (val !== undefined) {\n resHeaders[key] = Array.isArray(val) ? val.join(\", \") : val;\n }\n }\n\n let responseStream: Readable = res;\n const encoding = resHeaders[\"content-encoding\"]?.toLowerCase();\n\n if (encoding === \"gzip\") {\n const gunzip = zlib.createGunzip();\n gunzip.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(gunzip);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"deflate\") {\n const inflate = zlib.createInflate();\n inflate.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(inflate);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n } else if (encoding === \"br\") {\n const brotli = zlib.createBrotliDecompress();\n brotli.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = res.pipe(brotli);\n delete resHeaders[\"content-encoding\"];\n delete resHeaders[\"content-length\"];\n }\n\n const maxBytes = this.config.network?.maxResponseBytes;\n if (maxBytes != null && maxBytes > 0) {\n const limiter = createSizeLimitTransform(maxBytes);\n limiter.on(\"error\", (err) => {\n res.destroy(err);\n if (!settled) reject(err);\n });\n responseStream = responseStream.pipe(limiter);\n }\n\n responseStream.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n settled = true;\n resolve({\n status: res.statusCode ?? 200,\n headers: resHeaders,\n url: fullUrl,\n body: Readable.toWeb(responseStream) as unknown as TransportResponsePayload,\n });\n });\n\n clientReq.on(\"error\", (err) => {\n if (!settled) reject(err);\n });\n\n if (body !== undefined && body !== null) {\n if (typeof body === \"string\" || body instanceof Uint8Array || ArrayBuffer.isView(body)) {\n clientReq.write(body);\n clientReq.end();\n } else if (body instanceof ArrayBuffer) {\n clientReq.write(Buffer.from(body));\n clientReq.end();\n } else if (typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream) {\n Readable.fromWeb(body as any).pipe(clientReq);\n } else {\n clientReq.end();\n }\n } else {\n clientReq.end();\n }\n });\n }\n\n public async close(): Promise<void> {\n for (const agent of this.trackedAgents) {\n agent.destroy();\n }\n this.trackedAgents.clear();\n this.agentCache.clear();\n }\n\n public async destroy(): Promise<void> {\n for (const agent of this.trackedAgents) {\n agent.destroy();\n }\n this.trackedAgents.clear();\n this.agentCache.clear();\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["CacheManager", "http", "https", "net", "Readable", "Transform", "tls", "zlib", "STEALTH_HEADER_PRESETS", "STEALTH_UA_PRESETS", "getCiphersForProfile", "fingerprint", "applyStealthHeaders", "headers", "stealth", "presetName", "presetHeaders", "key", "currentUA", "browserUA", "getNativeAgent", "isHttps", "cache", "trackedAgents", "rejectUnauthorized", "fragment", "needHttp2", "cacheKey", "agent", "agentOpts", "alpnProtocols", "options", "callback", "alpnFallback", "createTlsConnection", "alpn", "cb", "socket", "originalWrite", "isFirstWrite", "chunk", "encodingOrCb", "encoding", "callbackRef", "part1", "part2", "onError", "err", "tlsOpts", "tlsSocket", "isAbsoluteHttpUrl", "url", "resolveUrl", "baseUrl", "isLocalhostUrl", "schemeIdx", "hostStart", "hostEnd", "host", "normalizeHeaders", "out", "value", "i", "pair", "src", "lKey", "createSizeLimitTransform", "maxBytes", "total", "_encoding", "config", "base", "req", "fullUrl", "stealthOpts", "body", "resolve", "reject", "reqOpts", "settled", "clientReq", "res", "resHeaders", "val", "responseStream", "gunzip", "inflate", "brotli", "limiter"]
7
- }
package/utils/errors.js DELETED
@@ -1,2 +0,0 @@
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"}}
2
- //# sourceMappingURL=errors.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 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"]
7
- }
package/utils/merge.js DELETED
@@ -1,2 +0,0 @@
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]"}
2
- //# sourceMappingURL=merge.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 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",
6
- "names": ["target", "source", "output", "key", "sourceValue", "targetValue", "isObject", "item"]
7
- }
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG/D,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;AAsE3D;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,CAwBjD;AA8DD;;;;;;GAMG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,OAAO,EAChB,GAAG,GAAE,iBAAuC,GAC3C,iBAAiB,CAoDnB;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,eAAe,GAAG,SAAS,GAChC,eAAe,GAAG,SAAS,CAE7B;AASD;;;;;;GAMG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,eAAe,EACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,GACzC,eAAe,CA8BjB"}
@@ -1,2 +0,0 @@
1
- "use strict";import{CacheManager as y}from"hcacher";const u=Object.create(null),p=["content-type","content-length","content-encoding","content-disposition","host","authorization","proxy-authorization","user-agent","referer","origin","location","etag","last-modified"];for(let n=0;n<p.length;n++)u[p[n]]=1;const a=new y({maxSize:2048,ttl:6e4}),l=["accept","accept-encoding","accept-language","authorization","cache-control","connection","content-encoding","content-length","content-type","cookie","date","etag","host","if-modified-since","if-none-match","keep-alive","location","origin","pragma","proxy-authorization","referer","sec-ch-ua","server","set-cookie","transfer-encoding","user-agent","x-forwarded-for","x-requested-with"];for(let n=0;n<l.length;n++){const t=l[n];a.set(t,t)}function s(n){const t=a.get(n);if(t!==void 0)return t;const e=n.toLowerCase();return a.set(n,e),e}export function normalizeUrl(n){if(typeof n=="string")return n;if(n&&typeof n=="object"){const t=n,e=t.url;if(typeof e=="string")return e;if(e!=null)return String(e);const i=t._url;if(typeof i=="string")return i;if(i!=null)return String(i);const r=t.scheme,o=t.host,f=t.path;if(typeof r=="string"&&typeof o=="string"&&typeof f=="string")return r+"://"+o+f}throw new Error("URL missing in request")}function d(n){const t=n.length;for(let e=0;e<t;e++){const i=n.charCodeAt(e);if(i===10||i===13)return!0}return!1}function c(n,t,e){if(d(e)&&(e=e.replace(/[\r\n]/g,"")),u[t]===1){n[t]=e;return}const i=n[t];if(i===void 0){n[t]=t==="set-cookie"?[e]:e;return}if(t==="set-cookie"){Array.isArray(i)?i.push(e):n[t]=[i,e];return}if(t==="cookie"||t==="cookie2"){n[t]=i+"; "+e;return}n[t]=i+", "+e}function m(n,t,e){if(e!=null){if(Array.isArray(e)){const i=e.length;for(let r=0;r<i;r++){const o=e[r];o!=null&&c(n,t,typeof o=="string"?o:String(o))}return}c(n,t,typeof e=="string"?e:String(e))}}export function normalizeHeaders(n,t=Object.create(null)){if(!n||typeof n!="object")return t;if(!Array.isArray(n)){for(const i in n)if(Object.prototype.hasOwnProperty.call(n,i)){const r=n[i];r!=null&&m(t,s(i),r)}return t}const e=n.length;if(e===0)return t;if(Array.isArray(n[0]))for(let i=0;i<e;i++){const r=n[i];if(!Array.isArray(r))continue;const o=r[0];if(typeof o!="string"||o.length===0)continue;const f=r[1];f!=null&&c(t,s(o),typeof f=="string"?f:String(f))}else for(let i=0;i<e;i+=2){const r=n[i];if(typeof r!="string"||r.length===0)continue;const o=n[i+1];o!=null&&c(t,s(r),typeof o=="string"?o:String(o))}return t}export function normalizeBody(n,t){return n==="GET"||n==="HEAD"?void 0:t}function g(n){const t=n["content-type"];if(typeof t=="string")return t;if(Array.isArray(t))return t[0]}export function normalizeBodyForTransport(n,t){return n==null?n:typeof URLSearchParams<"u"&&n instanceof URLSearchParams?(g(t)||(t["content-type"]="application/x-www-form-urlencoded"),n.toString()):typeof n=="object"&&n!==null&&!(n instanceof Uint8Array)&&!(n instanceof ArrayBuffer)&&!(typeof ArrayBuffer<"u"&&ArrayBuffer.isView?.(n))&&!(typeof URLSearchParams<"u"&&n instanceof URLSearchParams)&&!(typeof FormData<"u"&&n instanceof FormData)&&!(typeof Blob<"u"&&n instanceof Blob)&&!(typeof ReadableStream<"u"&&n instanceof ReadableStream)&&!("pipe"in n&&typeof n.pipe=="function")?(g(t)||(t["content-type"]="application/json"),JSON.stringify(n)):n}
2
- //# sourceMappingURL=normalize.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/normalize.ts"],
4
- "sourcesContent": ["import type { Method, RequestBodyData } from \"@hyperttp/types\";\nimport { CacheManager } from \"hcacher\";\n\ntype NormalizedHeaders = Record<string, string | string[]>;\n\nconst SINGLE_VALUE_HEADERS: Record<string, 1> = Object.create(null);\nconst singleHeaders = [\n \"content-type\",\n \"content-length\",\n \"content-encoding\",\n \"content-disposition\",\n \"host\",\n \"authorization\",\n \"proxy-authorization\",\n \"user-agent\",\n \"referer\",\n \"origin\",\n \"location\",\n \"etag\",\n \"last-modified\",\n] as const;\n\nfor (let i = 0; i < singleHeaders.length; i++) {\n SINGLE_VALUE_HEADERS[singleHeaders[i]!] = 1;\n}\n\nconst HEADER_KEY_CACHE = new CacheManager<string>({ maxSize: 2048, ttl: 60_000 });\n\nconst COMMON_HEADERS = [\n \"accept\",\n \"accept-encoding\",\n \"accept-language\",\n \"authorization\",\n \"cache-control\",\n \"connection\",\n \"content-encoding\",\n \"content-length\",\n \"content-type\",\n \"cookie\",\n \"date\",\n \"etag\",\n \"host\",\n \"if-modified-since\",\n \"if-none-match\",\n \"keep-alive\",\n \"location\",\n \"origin\",\n \"pragma\",\n \"proxy-authorization\",\n \"referer\",\n \"sec-ch-ua\",\n \"server\",\n \"set-cookie\",\n \"transfer-encoding\",\n \"user-agent\",\n \"x-forwarded-for\",\n \"x-requested-with\",\n] as const;\n\nfor (let i = 0; i < COMMON_HEADERS.length; i++) {\n const lower = COMMON_HEADERS[i]!;\n HEADER_KEY_CACHE.set(lower, lower);\n}\n\nfunction fastLowercaseKey(key: string): string {\n const cached = HEADER_KEY_CACHE.get(key);\n if (cached !== undefined) return cached;\n\n const lower = key.toLowerCase();\n HEADER_KEY_CACHE.set(key, lower);\n return lower;\n}\n\n/**\n * @ru \u0418\u0437\u0432\u043B\u0435\u043A\u0430\u0435\u0442 URL \u0438\u0437 \u0437\u0430\u043F\u0440\u043E\u0441\u0430 (\u0441\u0442\u0440\u043E\u043A\u0430, \u043E\u0431\u044A\u0435\u043A\u0442 \u0441 url/_url \u0438\u043B\u0438 \u0441\u0445\u0435\u043C\u0430+\u0445\u043E\u0441\u0442+\u043F\u0443\u0442\u044C).\n * @en Extracts the URL from a request (string, object with url/_url, or scheme+host+path).\n * @param req - URL string or request-like object.\n * @returns The extracted URL string.\n */\nexport function normalizeUrl(req: unknown): string {\n if (typeof req === \"string\") return req;\n\n if (req && typeof req === \"object\") {\n const r = req as Record<string, unknown>;\n\n const url = r.url;\n if (typeof url === \"string\") return url;\n if (url != null) return String(url);\n\n const u = r._url;\n if (typeof u === \"string\") return u;\n if (u != null) return String(u);\n\n const scheme = r.scheme;\n const host = r.host;\n const path = r.path;\n\n if (typeof scheme === \"string\" && typeof host === \"string\" && typeof path === \"string\") {\n return scheme + \"://\" + host + path;\n }\n }\n\n throw new Error(\"URL missing in request\");\n}\n\nfunction hasNewline(str: string): boolean {\n const len = str.length;\n for (let i = 0; i < len; i++) {\n const code = str.charCodeAt(i);\n if (code === 10 || code === 13) return true;\n }\n return false;\n}\n\nfunction appendHeader(out: NormalizedHeaders, lowerKey: string, value: string): void {\n if (hasNewline(value)) {\n value = value.replace(/[\\r\\n]/g, \"\");\n }\n\n if (SINGLE_VALUE_HEADERS[lowerKey] === 1) {\n out[lowerKey] = value;\n return;\n }\n\n const existing = out[lowerKey];\n\n if (existing === undefined) {\n out[lowerKey] = lowerKey === \"set-cookie\" ? [value] : value;\n return;\n }\n\n if (lowerKey === \"set-cookie\") {\n if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n out[lowerKey] = [existing, value];\n }\n return;\n }\n\n if (lowerKey === \"cookie\" || lowerKey === \"cookie2\") {\n out[lowerKey] = existing + \"; \" + value;\n return;\n }\n\n out[lowerKey] = existing + \", \" + value;\n}\n\nfunction appendRawValue(out: NormalizedHeaders, lower: string, raw: unknown): void {\n if (raw === undefined || raw === null) return;\n\n if (Array.isArray(raw)) {\n const len = raw.length;\n for (let i = 0; i < len; i++) {\n const item = raw[i];\n if (item !== undefined && item !== null) {\n appendHeader(out, lower, typeof item === \"string\" ? item : String(item));\n }\n }\n return;\n }\n\n appendHeader(out, lower, typeof raw === \"string\" ? raw : String(raw));\n}\n\n/**\n * @ru \u041D\u043E\u0440\u043C\u0430\u043B\u0438\u0437\u0443\u0435\u0442 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u0438 \u0432 \u043F\u043B\u043E\u0441\u043A\u0438\u0439 \u043E\u0431\u044A\u0435\u043A\u0442 \u0441 \u043D\u0438\u0436\u043D\u0438\u043C \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u043E\u043C \u043A\u043B\u044E\u0447\u0435\u0439 \u0438 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u043E\u0439 \u043C\u0430\u0441\u0441\u0438\u0432\u0430/\u043F\u0430\u0440\u043D\u044B\u0445 \u0444\u043E\u0440\u043C\u0430\u0442\u043E\u0432.\n * @en Normalizes headers into a flat object with lowercased keys, handling array/pair formats.\n * @param headers - Headers in any supported format (object, array of pairs, flat array).\n * @param out - Optional output object (reused for pooling).\n * @returns Normalized headers object.\n */\nexport function normalizeHeaders(\n headers: unknown,\n out: NormalizedHeaders = Object.create(null),\n): NormalizedHeaders {\n if (!headers || typeof headers !== \"object\") return out;\n\n if (!Array.isArray(headers)) {\n for (const key in headers) {\n if (Object.prototype.hasOwnProperty.call(headers, key)) {\n const val = (headers as Record<string, unknown>)[key];\n if (val !== undefined && val !== null) {\n appendRawValue(out, fastLowercaseKey(key), val);\n }\n }\n }\n return out;\n }\n\n const len = headers.length;\n if (len === 0) return out;\n\n if (Array.isArray(headers[0])) {\n for (let i = 0; i < len; i++) {\n const pair = headers[i];\n if (!Array.isArray(pair)) continue;\n\n const key = pair[0];\n if (typeof key !== \"string\" || key.length === 0) continue;\n\n const rawValue = pair[1];\n if (rawValue === undefined || rawValue === null) continue;\n\n appendHeader(\n out,\n fastLowercaseKey(key),\n typeof rawValue === \"string\" ? rawValue : String(rawValue),\n );\n }\n } else {\n for (let i = 0; i < len; i += 2) {\n const key = headers[i];\n if (typeof key !== \"string\" || key.length === 0) continue;\n\n const rawValue = headers[i + 1];\n if (rawValue === undefined || rawValue === null) continue;\n\n appendHeader(\n out,\n fastLowercaseKey(key),\n typeof rawValue === \"string\" ? rawValue : String(rawValue),\n );\n }\n }\n\n return out;\n}\n\n/**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 undefined \u0434\u043B\u044F GET/HEAD (\u0442\u0435\u043B\u043E \u0437\u0430\u043F\u0440\u0435\u0449\u0435\u043D\u043E), \u0438\u043D\u0430\u0447\u0435 \u0442\u0435\u043B\u043E \u043A\u0430\u043A \u0435\u0441\u0442\u044C.\n * @en Returns undefined for GET/HEAD (body disallowed), otherwise the body as-is.\n * @param method - HTTP method.\n * @param body - Request body.\n * @returns Normalized body or undefined.\n */\nexport function normalizeBody(\n method: Method,\n body: RequestBodyData | undefined,\n): RequestBodyData | undefined {\n return method === \"GET\" || method === \"HEAD\" ? undefined : body;\n}\n\nfunction getContentType(headers: Record<string, string | string[]>): string | undefined {\n const ct = headers[\"content-type\"];\n if (typeof ct === \"string\") return ct;\n if (Array.isArray(ct)) return ct[0];\n return undefined;\n}\n\n/**\n * @ru \u041F\u0440\u0435\u043E\u0431\u0440\u0430\u0437\u0443\u0435\u0442 \u0442\u0435\u043B\u043E \u0434\u043B\u044F \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430: \u0441\u0435\u0440\u0438\u0430\u043B\u0438\u0437\u0443\u0435\u0442 \u043E\u0431\u044A\u0435\u043A\u0442\u044B \u0432 JSON, URLSearchParams \u0432 \u0441\u0442\u0440\u043E\u043A\u0443, \u043F\u0440\u043E\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 Content-Type.\n * @en Transforms body for transport: serializes objects to JSON, URLSearchParams to string, sets Content-Type.\n * @param body - Request body.\n * @param headers - Headers object (may be mutated to add Content-Type).\n * @returns Body ready for transport.\n */\nexport function normalizeBodyForTransport(\n body: RequestBodyData,\n headers: Record<string, string | string[]>,\n): RequestBodyData {\n if (body == null) return body;\n\n if (typeof URLSearchParams !== \"undefined\" && body instanceof URLSearchParams) {\n if (!getContentType(headers)) {\n headers[\"content-type\"] = \"application/x-www-form-urlencoded\";\n }\n return body.toString();\n }\n\n const isSerializableObject =\n typeof body === \"object\" &&\n body !== null &&\n !(body instanceof Uint8Array) &&\n !(body instanceof ArrayBuffer) &&\n !(typeof ArrayBuffer !== \"undefined\" && ArrayBuffer.isView?.(body)) &&\n !(typeof URLSearchParams !== \"undefined\" && body instanceof URLSearchParams) &&\n !(typeof FormData !== \"undefined\" && body instanceof FormData) &&\n !(typeof Blob !== \"undefined\" && body instanceof Blob) &&\n !(typeof ReadableStream !== \"undefined\" && body instanceof ReadableStream) &&\n !(\"pipe\" in body && typeof (body as any).pipe === \"function\");\n\n if (isSerializableObject) {\n if (!getContentType(headers)) {\n headers[\"content-type\"] = \"application/json\";\n }\n return JSON.stringify(body);\n }\n\n return body;\n}\n"],
5
- "mappings": "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",
6
- "names": ["CacheManager", "SINGLE_VALUE_HEADERS", "singleHeaders", "i", "HEADER_KEY_CACHE", "COMMON_HEADERS", "lower", "fastLowercaseKey", "key", "cached", "req", "r", "url", "u", "scheme", "host", "path", "hasNewline", "str", "len", "code", "appendHeader", "out", "lowerKey", "value", "existing", "appendRawValue", "raw", "item", "headers", "val", "pair", "rawValue", "method", "body", "getContentType", "ct"]
7
- }
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/pipeline.ts"],
4
- "sourcesContent": ["import type {\n HyperPlugin,\n PluginContext,\n InternalRequest,\n HttpResponse,\n HyperttpError,\n HttpClientOptions,\n TransportResponse,\n} from \"@hyperttp/types\";\n\n/**\n * @ru \u0421\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430 \u0437\u0430\u043F\u0438\u0441\u0438 \u0445\u0443\u043A\u0430 \u0441 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u043C\u0438 \u0434\u043B\u044F \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0438.\n * @en Hook record structure with metadata for optimization and sorting.\n */\nexport interface HookRecord<T> {\n /** @ru \u0423\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0438\u043C\u044F \u0445\u0443\u043A\u0430. @en Unique hook name. */\n readonly name: string;\n /** @ru \u041F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F (\u0432\u044B\u0448\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u2014 \u0440\u0430\u043D\u044C\u0448\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435). @en Execution priority (higher value runs earlier). */\n readonly priority: number;\n /** @ru \u0424\u0443\u043D\u043A\u0446\u0438\u044F-\u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A. @en Handler function. */\n readonly run: T;\n}\n\n/**\n * @ru \u041A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440\u043E\u0432 \u0434\u043B\u044F \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0445 \u0444\u0430\u0437 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u0437\u0430\u043F\u0440\u043E\u0441\u0430/\u043E\u0442\u0432\u0435\u0442\u0430.\n * @en Pipeline container for different request/response processing phases.\n */\nexport interface PipelineContainer {\n /** @ru \u0425\u0443\u043A\u0438, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u043E\u0439 \u0437\u0430\u043F\u0440\u043E\u0441\u0430. @en Hooks executed before sending the request. */\n readonly request: HookRecord<Required<HyperPlugin>[\"onRequest\"]>[];\n /** @ru \u0425\u0443\u043A\u0438, \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u0441\u044B\u0440\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430. @en Hooks processing raw transport data. */\n readonly responseData: HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[];\n /** @ru \u0425\u0443\u043A\u0438, \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u043E\u0442\u0432\u0435\u0442 (\u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435). @en Hooks that mutate the response (sequential execution). */\n readonly responseMutators: HookRecord<Required<HyperPlugin>[\"onResponse\"]>[];\n /** @ru \u0425\u0443\u043A\u0438 \u0441 \u043F\u043E\u0431\u043E\u0447\u043D\u044B\u043C\u0438 \u044D\u0444\u0444\u0435\u043A\u0442\u0430\u043C\u0438 (\u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u0432 \u0444\u043E\u043D\u0435). @en Side-effect hooks (executed in the background). */\n readonly responseSideEffects: HookRecord<Required<HyperPlugin>[\"onResponse\"]>[];\n /** @ru \u0425\u0443\u043A\u0438 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043E\u0448\u0438\u0431\u043E\u043A. @en Error interception hooks. */\n readonly error: HookRecord<Required<HyperPlugin>[\"onError\"]>[];\n}\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043F\u0443\u0441\u0442\u043E\u0439 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u0434\u043B\u044F \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440\u043E\u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432.\n * @en Creates an empty container for plugin pipelines.\n * @returns An empty pipeline container.\n */\nexport function createPipelines(): PipelineContainer {\n return {\n request: [],\n responseData: [],\n responseMutators: [],\n responseSideEffects: [],\n error: [],\n };\n}\n\n/**\n * @ru \u0412\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0445\u0443\u043A \u0432 \u043C\u0430\u0441\u0441\u0438\u0432 \u0441 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435\u043C \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0438 \u043F\u043E \u0443\u0431\u044B\u0432\u0430\u043D\u0438\u044E \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u0430 (\u0434\u0435\u0440\u0435\u0432\u044C\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0442\u0443\u0442 \u0438\u0437\u0431\u044B\u0442\u043E\u0447\u043D\u044B).\n * @en Inserts a hook into the array maintaining descending priority order.\n * @param list - Target array to insert into.\n * @param hook - Hook record to insert.\n */\nexport function insertHookSorted<T>(list: HookRecord<T>[], hook: HookRecord<T>): void {\n const len = list.length;\n let i = 0;\n while (i < len && list[i]!.priority >= hook.priority) {\n i++;\n }\n list.splice(i, 0, hook);\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u0440\u0435\u0434-\u0437\u0430\u043F\u0440\u043E\u0441\u0430. \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 short-circuit.\n * @en Executes the pre-request pipeline. Supports short-circuiting.\n */\nexport function executeRequestPipeline(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onRequest\"]>[],\n req: InternalRequest,\n ctx: PluginContext,\n): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null {\n const len = hooks.length;\n if (len === 0) return null;\n for (let i = 0; i < len; i++) {\n const hook = hooks[i]!;\n const res = hook.run(req, ctx);\n if (res !== null && res !== undefined) {\n if (res instanceof Promise) {\n return executeRequestPipelineAsync(hooks, req, ctx, i, res);\n }\n return res;\n }\n }\n return null;\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043D\u0438\u0437\u043A\u043E\u0443\u0440\u043E\u0432\u043D\u0435\u0432\u044B\u0439 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u0441\u044B\u0440\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 (\u0444\u0430\u0437\u0430 DATA).\n * @en Executes low-level transport data transformation pipeline (DATA phase).\n */\nexport function executeResponseDataPipeline(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[],\n res: TransportResponse,\n ctx: PluginContext,\n): Promise<TransportResponse> | TransportResponse {\n const len = hooks.length;\n if (len === 0) return res;\n let currentRes = res;\n for (let i = 0; i < len; i++) {\n const result = hooks[i]!.run(currentRes, ctx);\n if (result instanceof Promise) {\n return executeResponseDataPipelineAsync(hooks, ctx, i, result, currentRes);\n }\n if (result != null) {\n currentRes = result;\n }\n }\n return currentRes;\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u043E\u0441\u0442-\u043E\u0442\u0432\u0435\u0442\u0430. \u0420\u0430\u0437\u0434\u0435\u043B\u0435\u043D \u043D\u0430 \u043C\u0443\u0442\u0430\u0442\u043E\u0440\u044B \u0438 \u0441\u0430\u0439\u0434-\u044D\u0444\u0444\u0435\u043A\u0442\u044B.\n * @en Executes the post-response pipeline. Split into mutators and side-effects.\n */\nexport function executeResponsePipeline(\n mutators: readonly HookRecord<Required<HyperPlugin>[\"onResponse\"]>[],\n sideEffects: readonly HookRecord<Required<HyperPlugin>[\"onResponse\"]>[],\n res: HttpResponse<unknown>,\n req: InternalRequest,\n ctx: PluginContext,\n logger?: HttpClientOptions[\"logger\"],\n): Promise<void> | void {\n const seLen = sideEffects.length;\n if (seLen > 0) {\n for (let i = 0; i < seLen; i++) {\n const effect = sideEffects[i]!;\n try {\n const promise = effect.run(res, req, ctx);\n if (promise instanceof Promise) {\n safelyAttachSideEffectCatch(promise, effect.name, logger);\n }\n } catch (err) {\n handleSideEffectError(err, effect.name, logger);\n }\n }\n }\n const mutLen = mutators.length;\n if (mutLen > 0) {\n for (let i = 0; i < mutLen; i++) {\n const result = mutators[i]!.run(res, req, ctx);\n if (result instanceof Promise) {\n return executeMutatorsAsync(mutators, res, req, ctx, i, result);\n }\n }\n }\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043E\u0448\u0438\u0431\u043E\u043A.\n * @en Executes the error interception pipeline.\n */\nexport function executeErrorPipeline(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onError\"]>[],\n error: HyperttpError,\n req: InternalRequest,\n ctx: PluginContext,\n): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null {\n const len = hooks.length;\n if (len === 0) return null;\n for (let i = 0; i < len; i++) {\n const res = hooks[i]!.run(error, req, ctx);\n if (res instanceof Promise) {\n return executeErrorPipelineAsync(hooks, error, req, ctx, i, res);\n }\n if (res != null) return res;\n }\n return null;\n}\n\nasync function executeRequestPipelineAsync(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onRequest\"]>[],\n req: InternalRequest,\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<HttpResponse<unknown> | void>,\n): Promise<HttpResponse<unknown> | null> {\n const shortCircuit = await initialPromise;\n if (shortCircuit != null) return shortCircuit;\n const len = hooks.length;\n for (let i = startIndex + 1; i < len; i++) {\n const res = hooks[i]!.run(req, ctx);\n if (res instanceof Promise) {\n const asyncRes = await res;\n if (asyncRes != null) return asyncRes;\n } else if (res != null) {\n return res;\n }\n }\n return null;\n}\n\nasync function executeResponseDataPipelineAsync(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[],\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<TransportResponse | void>,\n lastRes: TransportResponse,\n): Promise<TransportResponse> {\n let currentRes = lastRes;\n const firstAsyncResult = await initialPromise;\n if (firstAsyncResult != null) {\n currentRes = firstAsyncResult;\n }\n const len = hooks.length;\n for (let i = startIndex + 1; i < len; i++) {\n const result = hooks[i]!.run(currentRes, ctx);\n if (result instanceof Promise) {\n const asyncResult = await result;\n if (asyncResult != null) {\n currentRes = asyncResult;\n }\n } else if (result != null) {\n currentRes = result;\n }\n }\n return currentRes;\n}\n\nasync function executeMutatorsAsync(\n mutators: readonly HookRecord<Required<HyperPlugin>[\"onResponse\"]>[],\n res: HttpResponse<unknown>,\n req: InternalRequest,\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<unknown>,\n): Promise<void> {\n await initialPromise;\n const len = mutators.length;\n for (let i = startIndex + 1; i < len; i++) {\n const result = mutators[i]!.run(res, req, ctx);\n if (result instanceof Promise) {\n await result;\n }\n }\n}\n\nasync function executeErrorPipelineAsync(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onError\"]>[],\n error: HyperttpError,\n req: InternalRequest,\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<HttpResponse<unknown> | void>,\n): Promise<HttpResponse<unknown> | null> {\n const recovered = await initialPromise;\n if (recovered != null) return recovered;\n const len = hooks.length;\n for (let i = startIndex + 1; i < len; i++) {\n const res = hooks[i]!.run(error, req, ctx);\n if (res instanceof Promise) {\n const asyncRes = await res;\n if (asyncRes != null) return asyncRes;\n } else if (res != null) {\n return res;\n }\n }\n return null;\n}\n\nfunction safelyAttachSideEffectCatch(\n promise: Promise<unknown>,\n hookName: string,\n logger?: HttpClientOptions[\"logger\"],\n): void {\n promise.catch((err) => handleSideEffectError(err, hookName, logger));\n}\n\nfunction handleSideEffectError(\n err: unknown,\n hookName: string,\n logger?: HttpClientOptions[\"logger\"],\n): void {\n const errorObject = err instanceof Error ? err : new Error(String(err));\n if (logger) {\n logger(\"warn\", `Background hook \"${hookName}\" crashed: ${errorObject.message}`, errorObject);\n } else {\n console.warn(`[Hyperttp] Background hook \"${hookName}\" crashed:`, errorObject);\n }\n}\n"],
5
- "mappings": "aA6CM,gBAAU,iBAAe,CAC7B,MAAO,CACL,QAAS,CAAA,EACT,aAAc,CAAA,EACd,iBAAkB,CAAA,EAClB,oBAAqB,CAAA,EACrB,MAAO,CAAA,EAEX,CAQM,gBAAU,iBAAoBA,EAAuBC,EAAmB,CAC5E,MAAMC,EAAMF,EAAK,OACjB,IAAIG,EAAI,EACR,KAAOA,EAAID,GAAOF,EAAKG,CAAC,EAAG,UAAYF,EAAK,UAC1CE,IAEFH,EAAK,OAAOG,EAAG,EAAGF,CAAI,CACxB,CAMM,gBAAU,uBACdG,EACAC,EACAC,EAAkB,CAElB,MAAMJ,EAAME,EAAM,OAClB,GAAIF,IAAQ,EAAG,OAAO,KACtB,QAASC,EAAI,EAAGA,EAAID,EAAKC,IAAK,CAE5B,MAAMI,EADOH,EAAMD,CAAC,EACH,IAAIE,EAAKC,CAAG,EAC7B,GAAIC,GAAQ,KACV,OAAIA,aAAe,QACVC,EAA4BJ,EAAOC,EAAKC,EAAKH,EAAGI,CAAG,EAErDA,CAEX,CACA,OAAO,IACT,CAMM,gBAAU,4BACdH,EACAG,EACAD,EAAkB,CAElB,MAAMJ,EAAME,EAAM,OAClB,GAAIF,IAAQ,EAAG,OAAOK,EACtB,IAAIE,EAAaF,EACjB,QAASJ,EAAI,EAAGA,EAAID,EAAKC,IAAK,CAC5B,MAAMO,EAASN,EAAMD,CAAC,EAAG,IAAIM,EAAYH,CAAG,EAC5C,GAAII,aAAkB,QACpB,OAAOC,EAAiCP,EAAOE,EAAKH,EAAGO,EAAQD,CAAU,EAEvEC,GAAU,OACZD,EAAaC,EAEjB,CACA,OAAOD,CACT,CAMM,gBAAU,wBACdG,EACAC,EACAN,EACAF,EACAC,EACAQ,EAAoC,CAEpC,MAAMC,EAAQF,EAAY,OAC1B,GAAIE,EAAQ,EACV,QAASZ,EAAI,EAAGA,EAAIY,EAAOZ,IAAK,CAC9B,MAAMa,EAASH,EAAYV,CAAC,EAC5B,GAAI,CACF,MAAMc,EAAUD,EAAO,IAAIT,EAAKF,EAAKC,CAAG,EACpCW,aAAmB,SACrBC,EAA4BD,EAASD,EAAO,KAAMF,CAAM,CAE5D,OAASK,EAAK,CACZC,EAAsBD,EAAKH,EAAO,KAAMF,CAAM,CAChD,CACF,CAEF,MAAMO,EAAST,EAAS,OACxB,GAAIS,EAAS,EACX,QAASlB,EAAI,EAAGA,EAAIkB,EAAQlB,IAAK,CAC/B,MAAMO,EAASE,EAAST,CAAC,EAAG,IAAII,EAAKF,EAAKC,CAAG,EAC7C,GAAII,aAAkB,QACpB,OAAOY,EAAqBV,EAAUL,EAAKF,EAAKC,EAAKH,EAAGO,CAAM,CAElE,CAEJ,CAMM,gBAAU,qBACdN,EACAmB,EACAlB,EACAC,EAAkB,CAElB,MAAMJ,EAAME,EAAM,OAClB,GAAIF,IAAQ,EAAG,OAAO,KACtB,QAASC,EAAI,EAAGA,EAAID,EAAKC,IAAK,CAC5B,MAAMI,EAAMH,EAAMD,CAAC,EAAG,IAAIoB,EAAOlB,EAAKC,CAAG,EACzC,GAAIC,aAAe,QACjB,OAAOiB,EAA0BpB,EAAOmB,EAAOlB,EAAKC,EAAKH,EAAGI,CAAG,EAEjE,GAAIA,GAAO,KAAM,OAAOA,CAC1B,CACA,OAAO,IACT,CAEA,eAAeC,EACbJ,EACAC,EACAC,EACAmB,EACAC,EAAqD,CAErD,MAAMC,EAAe,MAAMD,EAC3B,GAAIC,GAAgB,KAAM,OAAOA,EACjC,MAAMzB,EAAME,EAAM,OAClB,QAASD,EAAIsB,EAAa,EAAGtB,EAAID,EAAKC,IAAK,CACzC,MAAMI,EAAMH,EAAMD,CAAC,EAAG,IAAIE,EAAKC,CAAG,EAClC,GAAIC,aAAe,QAAS,CAC1B,MAAMqB,EAAW,MAAMrB,EACvB,GAAIqB,GAAY,KAAM,OAAOA,CAC/B,SAAWrB,GAAO,KAChB,OAAOA,CAEX,CACA,OAAO,IACT,CAEA,eAAeI,EACbP,EACAE,EACAmB,EACAC,EACAG,EAA0B,CAE1B,IAAIpB,EAAaoB,EACjB,MAAMC,EAAmB,MAAMJ,EAC3BI,GAAoB,OACtBrB,EAAaqB,GAEf,MAAM5B,EAAME,EAAM,OAClB,QAASD,EAAIsB,EAAa,EAAGtB,EAAID,EAAKC,IAAK,CACzC,MAAMO,EAASN,EAAMD,CAAC,EAAG,IAAIM,EAAYH,CAAG,EAC5C,GAAII,aAAkB,QAAS,CAC7B,MAAMqB,EAAc,MAAMrB,EACtBqB,GAAe,OACjBtB,EAAasB,EAEjB,MAAWrB,GAAU,OACnBD,EAAaC,EAEjB,CACA,OAAOD,CACT,CAEA,eAAea,EACbV,EACAL,EACAF,EACAC,EACAmB,EACAC,EAAgC,CAEhC,MAAMA,EACN,MAAMxB,EAAMU,EAAS,OACrB,QAAST,EAAIsB,EAAa,EAAGtB,EAAID,EAAKC,IAAK,CACzC,MAAMO,EAASE,EAAST,CAAC,EAAG,IAAII,EAAKF,EAAKC,CAAG,EACzCI,aAAkB,SACpB,MAAMA,CAEV,CACF,CAEA,eAAec,EACbpB,EACAmB,EACAlB,EACAC,EACAmB,EACAC,EAAqD,CAErD,MAAMM,EAAY,MAAMN,EACxB,GAAIM,GAAa,KAAM,OAAOA,EAC9B,MAAM9B,EAAME,EAAM,OAClB,QAASD,EAAIsB,EAAa,EAAGtB,EAAID,EAAKC,IAAK,CACzC,MAAMI,EAAMH,EAAMD,CAAC,EAAG,IAAIoB,EAAOlB,EAAKC,CAAG,EACzC,GAAIC,aAAe,QAAS,CAC1B,MAAMqB,EAAW,MAAMrB,EACvB,GAAIqB,GAAY,KAAM,OAAOA,CAC/B,SAAWrB,GAAO,KAChB,OAAOA,CAEX,CACA,OAAO,IACT,CAEA,SAASW,EACPD,EACAgB,EACAnB,EAAoC,CAEpCG,EAAQ,MAAOE,GAAQC,EAAsBD,EAAKc,EAAUnB,CAAM,CAAC,CACrE,CAEA,SAASM,EACPD,EACAc,EACAnB,EAAoC,CAEpC,MAAMoB,EAAcf,aAAe,MAAQA,EAAM,IAAI,MAAM,OAAOA,CAAG,CAAC,EAClEL,EACFA,EAAO,OAAQ,oBAAoBmB,CAAQ,cAAcC,EAAY,OAAO,GAAIA,CAAW,EAE3F,QAAQ,KAAK,+BAA+BD,CAAQ,aAAcC,CAAW,CAEjF",
6
- "names": ["list", "hook", "len", "i", "hooks", "req", "ctx", "res", "executeRequestPipelineAsync", "currentRes", "result", "executeResponseDataPipelineAsync", "mutators", "sideEffects", "logger", "seLen", "effect", "promise", "safelyAttachSideEffectCatch", "err", "handleSideEffectError", "mutLen", "executeMutatorsAsync", "error", "executeErrorPipelineAsync", "startIndex", "initialPromise", "shortCircuit", "asyncRes", "lastRes", "firstAsyncResult", "asyncResult", "recovered", "hookName", "errorObject"]
7
- }
package/utils/response.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";import{CURRENT_RUNTIME as c}from"../transports/manager.js";const s=Symbol("hyperttp.rawCache"),i=Symbol("hyperttp.textCache"),a=Symbol("hyperttp.jsonCache"),f=new TextDecoder,y=new TextEncoder,d=Object.freeze({});function u(e){return typeof e=="object"&&e!==null&&"getReader"in e&&typeof e.getReader=="function"}function h(e){return typeof Blob<"u"&&e instanceof Blob}export const cloneBodyFast=e=>{if(typeof e!="object"||e===null)return e;const t=e;if(e instanceof Uint8Array||typeof t.pipe=="function"||typeof t.getReader=="function")return e;const r=Object.getPrototypeOf(e);if(r===Object.prototype||r===null){const n=Object.create(r);for(const o in e)Object.prototype.hasOwnProperty.call(e,o)&&(n[o]=e[o]);return n}try{return structuredClone(e)}catch{try{return JSON.parse(JSON.stringify(e))}catch{const n=Object.create(r);for(const o in e)Object.prototype.hasOwnProperty.call(e,o)&&(n[o]=e[o]);return n}}};export class HyperHttpResponse{status;headers;body;url;data;[s];[i];[a];_bodyConsumed;_raw;constructor(t){this.status=0,this.headers=d,this.body=null,this.url="",this.data=null,this[s]=void 0,this[i]=void 0,this[a]=void 0,this._bodyConsumed=!1,this._raw=void 0,t&&this.init(t)}init(t){return this.status=t.status,this.headers=t.headers||d,this.body=t.body,this.url=t.url??"",this.data=null,this[s]=void 0,this[i]=void 0,this[a]=void 0,this._bodyConsumed=!1,this._raw=t._raw,this}async _consumeBody(){if(this[s]!==void 0)return;const t=this.body;if(t){if(t instanceof Uint8Array){this[s]=t,this._bodyConsumed=!0;return}if(typeof t=="string"){this[s]=y.encode(t),this._bodyConsumed=!0;return}if(t instanceof ArrayBuffer){this[s]=new Uint8Array(t),this._bodyConsumed=!0;return}if(this._raw&&t===this._raw.body&&typeof this._raw.arrayBuffer=="function"){const r=await this._raw.arrayBuffer();this[s]=new Uint8Array(r),this.body=this[s],this._bodyConsumed=!0;return}if(c==="bun"&&t&&typeof t=="object"&&"arrayBuffer"in t){const r=t;if(typeof r.arrayBuffer=="function"){const n=await r.arrayBuffer();this[s]=new Uint8Array(n),this.body=this[s],this._bodyConsumed=!0;return}}if(u(t)||h(t)){if(u(t)&&t.locked)throw new Error("[Hyperttp] Stream is locked.");const n=await new Response(t).arrayBuffer();this[s]=new Uint8Array(n),this.body=this[s],this._bodyConsumed=!0}}}async arrayBuffer(){if(await this._consumeBody(),this[s]===void 0)throw new Error("[Hyperttp] Response body is not available as ArrayBuffer");return this[s].buffer}async text(){if(this[i]!==void 0)return this[i];if(await this._consumeBody(),this[s]===void 0)throw new Error("[Hyperttp] Response body is not available as text");return this[i]=f.decode(this[s]),this[i]}async json(){const t=this.body;if(!this._bodyConsumed&&typeof t=="object"&&t!==null&&!u(t)&&!h(t)&&!(t instanceof Uint8Array)&&!(t instanceof ArrayBuffer))return this._bodyConsumed=!0,t;if(await this._consumeBody(),this[s]===void 0)throw new Error("[Hyperttp] Response body is not available as JSON");return this[i]===void 0&&(this[i]=f.decode(this[s])),JSON.parse(this[i])}reset(){this.status=0,this.headers=d,this.body=null,this.url="",this.data=null,this[s]=void 0,this[i]=void 0,this[a]=void 0,this._bodyConsumed=!1,this._raw=void 0}async dump(){if(this._bodyConsumed)return;this._bodyConsumed=!0;const t=this.body;u(t)?t.locked||await t.cancel().catch(()=>{}):h(t)&&await t.arrayBuffer()}clone(){const t=new HyperHttpResponse;if(t.status=this.status,t.headers=this.headers,t.url=this.url,t.data=this.data?cloneBodyFast(this.data):null,t._bodyConsumed=this._bodyConsumed,t._raw=this._bodyConsumed?void 0:this._raw,t[s]=this[s],t[i]=this[i],t[a]=this[a],u(this.body)&&!this._bodyConsumed)if(this.body.locked)t.body=this.body;else{const[r,n]=this.body.tee();this.body=r,t.body=n}else t.body=this.body;return t}}export const responsePool=[];const l=64;export const mapResponseFast=e=>(responsePool.pop()??new HyperHttpResponse).init(e),recycleResponse=e=>{e instanceof HyperHttpResponse&&responsePool.length<l&&(e.reset(),responsePool.push(e))},mapStreamFast=e=>({status:e.status,headers:e.headers,body:e.body,url:e.url??""}),mergeHeadersFast=(e,t)=>{if(!t)return e;let r=!1;for(const n in t){r=!0;break}if(!r)return e;for(const n in t)Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e};
2
- //# sourceMappingURL=response.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/response.ts"],
4
- "sourcesContent": ["import type { HttpResponse, HyperTransport, HyperBody } from \"@hyperttp/types\";\nimport { CURRENT_RUNTIME } from \"../transports/manager.js\";\n\ntype TransportResponse = Awaited<ReturnType<HyperTransport[\"execute\"]>>;\n\ninterface InternalTransportResponse extends TransportResponse {\n _raw?: FetchResponseLike;\n}\n\ninterface FetchResponseLike {\n body: unknown;\n arrayBuffer(): Promise<ArrayBuffer>;\n text(): Promise<string>;\n json(): Promise<unknown>;\n}\n\nconst RAW_CACHE = Symbol(\"hyperttp.rawCache\");\nconst TEXT_CACHE = Symbol(\"hyperttp.textCache\");\nconst JSON_CACHE = Symbol(\"hyperttp.jsonCache\");\n\ntype CacheHolder = {\n [RAW_CACHE]?: Uint8Array;\n [TEXT_CACHE]?: string;\n [JSON_CACHE]?: unknown;\n};\n\nconst STATIC_DECODER = new TextDecoder();\nconst STATIC_ENCODER = new TextEncoder();\nconst EMPTY_HEADERS: Readonly<Record<string, never>> = Object.freeze({});\n\nfunction isReadableStream(value: unknown): value is ReadableStream<Uint8Array> {\n return (\n typeof value === \"object\" &&\n value !== null &&\n \"getReader\" in value &&\n typeof (value as Record<string, unknown>).getReader === \"function\"\n );\n}\n\nfunction isBlob(value: unknown): value is Blob {\n return typeof Blob !== \"undefined\" && value instanceof Blob;\n}\n\n/**\n * @ru \u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u043A\u043B\u043E\u043D\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435 \u0442\u0435\u043B\u0430 \u043E\u0442\u0432\u0435\u0442\u0430 \u0441 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 structuredClone, JSON \u0438 \u0440\u0443\u0447\u043D\u043E\u0433\u043E \u043A\u043E\u043F\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u044F.\n * @en Fast response body clone supporting structuredClone, JSON, and manual copy.\n * @param body - The body value to clone.\n * @returns Cloned body.\n */\nexport const cloneBodyFast = <T>(body: T): T => {\n if (typeof body !== \"object\" || body === null) return body;\n const obj = body as Record<string, unknown>;\n\n if (\n body instanceof Uint8Array ||\n typeof obj.pipe === \"function\" ||\n typeof obj.getReader === \"function\"\n ) {\n return body;\n }\n\n const proto = Object.getPrototypeOf(body);\n if (proto === Object.prototype || proto === null) {\n const target = Object.create(proto);\n for (const key in body) {\n if (Object.prototype.hasOwnProperty.call(body, key)) {\n target[key] = body[key];\n }\n }\n return target as T;\n }\n\n try {\n return structuredClone(body);\n } catch {\n try {\n return JSON.parse(JSON.stringify(body)) as T;\n } catch {\n const target = Object.create(proto);\n for (const key in body) {\n if (Object.prototype.hasOwnProperty.call(body, key)) {\n target[key] = body[key];\n }\n }\n return target as T;\n }\n }\n};\n\n/**\n * @ru \u0420\u0435\u0430\u043B\u0438\u0437\u0430\u0446\u0438\u044F HttpResponse \u0441 \u043B\u0435\u043D\u0438\u0432\u044B\u043C \u043F\u043E\u0442\u0440\u0435\u0431\u043B\u0435\u043D\u0438\u0435\u043C \u0442\u0435\u043B\u0430, \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C raw/text/json \u0438 \u043F\u043E\u0434\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u043F\u0443\u043B\u0438\u043D\u0433\u0430.\n * @en HttpResponse implementation with lazy body consumption, raw/text/json caching, and pooling support.\n */\nexport class HyperHttpResponse<T = unknown> implements HttpResponse<T>, CacheHolder {\n public status!: number;\n public headers!: Record<string, string | string[]>;\n public body!: T | HyperBody | Uint8Array | null;\n public url!: string;\n public data!: T | null;\n\n public [RAW_CACHE]!: Uint8Array | undefined;\n public [TEXT_CACHE]!: string | undefined;\n public [JSON_CACHE]!: unknown | undefined;\n\n private _bodyConsumed!: boolean;\n private _raw!: FetchResponseLike | undefined;\n\n constructor(rawResponse?: TransportResponse) {\n this.status = 0;\n this.headers = EMPTY_HEADERS;\n this.body = null;\n this.url = \"\";\n this.data = null;\n this[RAW_CACHE] = undefined;\n this[TEXT_CACHE] = undefined;\n this[JSON_CACHE] = undefined;\n this._bodyConsumed = false;\n this._raw = undefined;\n if (rawResponse) this.init(rawResponse);\n }\n\n /**\n * @ru \u0418\u043D\u0438\u0446\u0438\u0430\u043B\u0438\u0437\u0438\u0440\u0443\u0435\u0442 \u043E\u0442\u0432\u0435\u0442 \u0438\u0437 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u043D\u043E\u0433\u043E \u043E\u0442\u0432\u0435\u0442\u0430. \u0421\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u0435\u0442 \u0432\u0441\u0435 \u043A\u044D\u0448\u0438.\n * @en Initializes the response from a transport response. Resets all caches.\n * @param rawResponse - The raw transport response.\n * @returns This instance for chaining.\n */\n public init(rawResponse: TransportResponse): this {\n this.status = rawResponse.status;\n this.headers = rawResponse.headers || EMPTY_HEADERS;\n this.body = rawResponse.body as T | HyperBody | Uint8Array | null;\n this.url = rawResponse.url ?? \"\";\n this.data = null;\n this[RAW_CACHE] = undefined;\n this[TEXT_CACHE] = undefined;\n this[JSON_CACHE] = undefined;\n this._bodyConsumed = false;\n this._raw = (rawResponse as InternalTransportResponse)._raw;\n return this;\n }\n\n private async _consumeBody(): Promise<void> {\n if (this[RAW_CACHE] !== undefined) return;\n\n const body = this.body;\n if (!body) return;\n\n if (body instanceof Uint8Array) {\n this[RAW_CACHE] = body;\n this._bodyConsumed = true;\n return;\n }\n\n if (typeof body === \"string\") {\n this[RAW_CACHE] = STATIC_ENCODER.encode(body);\n this._bodyConsumed = true;\n return;\n }\n\n if (body instanceof ArrayBuffer) {\n this[RAW_CACHE] = new Uint8Array(body);\n this._bodyConsumed = true;\n return;\n }\n\n if (this._raw && body === this._raw.body && typeof this._raw.arrayBuffer === \"function\") {\n const buf = await this._raw.arrayBuffer();\n this[RAW_CACHE] = new Uint8Array(buf);\n this.body = this[RAW_CACHE] as T | HyperBody | Uint8Array | null;\n this._bodyConsumed = true;\n return;\n }\n\n if (CURRENT_RUNTIME === \"bun\" && body && typeof body === \"object\" && \"arrayBuffer\" in body) {\n const bunBody = body as { arrayBuffer: () => Promise<ArrayBuffer> };\n if (typeof bunBody.arrayBuffer === \"function\") {\n const buf = await bunBody.arrayBuffer();\n this[RAW_CACHE] = new Uint8Array(buf);\n this.body = this[RAW_CACHE] as T | HyperBody | Uint8Array | null;\n this._bodyConsumed = true;\n return;\n }\n }\n\n if (isReadableStream(body) || isBlob(body)) {\n if (isReadableStream(body) && body.locked) {\n throw new Error(\"[Hyperttp] Stream is locked.\");\n }\n const response = new Response(body as unknown as BodyInit);\n const buf = await response.arrayBuffer();\n this[RAW_CACHE] = new Uint8Array(buf);\n this.body = this[RAW_CACHE] as T | HyperBody | Uint8Array | null;\n this._bodyConsumed = true;\n }\n }\n\n /**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u043A\u0430\u043A ArrayBuffer, \u043F\u043E\u0442\u0440\u0435\u0431\u043B\u044F\u044F \u0435\u0433\u043E \u043F\u0440\u0438 \u043D\u0435\u043E\u0431\u0445\u043E\u0434\u0438\u043C\u043E\u0441\u0442\u0438.\n * @en Returns the response body as ArrayBuffer, consuming it if necessary.\n * @returns Promise resolving to an ArrayBuffer.\n */\n public async arrayBuffer(): Promise<ArrayBuffer> {\n await this._consumeBody();\n if (this[RAW_CACHE] === undefined) {\n throw new Error(\"[Hyperttp] Response body is not available as ArrayBuffer\");\n }\n return this[RAW_CACHE].buffer as ArrayBuffer;\n }\n\n /**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u043A\u0430\u043A \u0441\u0442\u0440\u043E\u043A\u0443 \u0441 \u043A\u044D\u0448\u0438\u0440\u043E\u0432\u0430\u043D\u0438\u0435\u043C.\n * @en Returns the response body as text with caching.\n * @returns Promise resolving to the decoded text.\n */\n public async text(): Promise<string> {\n if (this[TEXT_CACHE] !== undefined) return this[TEXT_CACHE]!;\n await this._consumeBody();\n if (this[RAW_CACHE] === undefined) {\n throw new Error(\"[Hyperttp] Response body is not available as text\");\n }\n this[TEXT_CACHE] = STATIC_DECODER.decode(this[RAW_CACHE]!);\n return this[TEXT_CACHE]!;\n }\n\n /**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430, \u0440\u0430\u0437\u043E\u0431\u0440\u0430\u043D\u043D\u043E\u0435 \u043A\u0430\u043A JSON. \u0414\u043B\u044F \u043E\u0431\u044A\u0435\u043A\u0442\u043E\u0432 \u0432\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0438\u0445 \u043D\u0430\u043F\u0440\u044F\u043C\u0443\u044E (\u0431\u0435\u0437 \u043F\u043E\u0442\u0440\u0435\u0431\u043B\u0435\u043D\u0438\u044F).\n * @en Returns the response body parsed as JSON. Returns objects directly (no consumption).\n * @returns Promise resolving to the parsed JSON value.\n */\n public async json<TJson = T>(): Promise<TJson> {\n const body = this.body;\n if (\n !this._bodyConsumed &&\n typeof body === \"object\" &&\n body !== null &&\n !isReadableStream(body) &&\n !isBlob(body) &&\n !(body instanceof Uint8Array) &&\n !(body instanceof ArrayBuffer)\n ) {\n this._bodyConsumed = true;\n return body as TJson;\n }\n\n await this._consumeBody();\n if (this[RAW_CACHE] === undefined) {\n throw new Error(\"[Hyperttp] Response body is not available as JSON\");\n }\n if (this[TEXT_CACHE] === undefined) {\n this[TEXT_CACHE] = STATIC_DECODER.decode(this[RAW_CACHE]!);\n }\n return JSON.parse(this[TEXT_CACHE]!) as TJson;\n }\n\n /**\n * @ru \u041F\u043E\u043B\u043D\u044B\u0439 \u0441\u0431\u0440\u043E\u0441 \u0441\u043E\u0441\u0442\u043E\u044F\u043D\u0438\u044F \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F \u0432 \u043F\u0443\u043B\u0435. \u041E\u0447\u0438\u0449\u0430\u0435\u0442 \u0432\u0441\u0435 \u043A\u044D\u0448\u0438 \u0438 \u043F\u0440\u0438\u0432\u0430\u0442\u043D\u044B\u0435 \u043F\u043E\u043B\u044F.\n * @en Full state reset for pool reuse. Clears all caches and private fields.\n */\n public reset(): void {\n this.status = 0;\n this.headers = EMPTY_HEADERS;\n this.body = null;\n this.url = \"\";\n this.data = null;\n this[RAW_CACHE] = undefined;\n this[TEXT_CACHE] = undefined;\n this[JSON_CACHE] = undefined;\n this._bodyConsumed = false;\n this._raw = undefined;\n }\n\n /**\n * @ru \u0421\u0431\u0440\u0430\u0441\u044B\u0432\u0430\u0435\u0442 \u0442\u0435\u043B\u043E \u043E\u0442\u0432\u0435\u0442\u0430 (\u0434\u043B\u044F \u0441\u0442\u0440\u0438\u043C\u043E\u0432 \u2014 \u043E\u0442\u043C\u0435\u043D\u044F\u0435\u0442/cancel).\n * @en Discards the response body (cancels streams).\n * @returns Promise that resolves when the body is discarded.\n */\n public async dump(): Promise<void> {\n if (this._bodyConsumed) return;\n this._bodyConsumed = true;\n\n const body = this.body;\n if (isReadableStream(body)) {\n if (!body.locked) await body.cancel().catch(() => {});\n } else if (isBlob(body)) {\n await body.arrayBuffer();\n }\n }\n\n /**\n * @ru \u041A\u043B\u043E\u043D\u0438\u0440\u0443\u0435\u0442 \u043E\u0442\u0432\u0435\u0442 \u0441 \u0440\u0430\u0437\u0434\u0435\u043B\u0435\u043D\u0438\u0435\u043C \u0441\u0442\u0440\u0438\u043C\u043E\u0432 \u0447\u0435\u0440\u0435\u0437 tee().\n * @en Clones the response, splitting streams via tee().\n * @returns A new HttpResponse instance.\n */\n public clone(): HttpResponse<T> {\n const cloned = new HyperHttpResponse<T>();\n cloned.status = this.status;\n cloned.headers = this.headers;\n cloned.url = this.url;\n cloned.data = this.data ? cloneBodyFast(this.data) : null;\n cloned._bodyConsumed = this._bodyConsumed;\n cloned._raw = this._bodyConsumed ? undefined : this._raw;\n\n cloned[RAW_CACHE] = this[RAW_CACHE];\n cloned[TEXT_CACHE] = this[TEXT_CACHE];\n cloned[JSON_CACHE] = this[JSON_CACHE];\n\n if (isReadableStream(this.body) && !this._bodyConsumed) {\n if (this.body.locked) {\n cloned.body = this.body;\n } else {\n const [b1, b2] = this.body.tee();\n this.body = b1 as T | HyperBody | Uint8Array | null;\n cloned.body = b2 as T | HyperBody | Uint8Array | null;\n }\n } else {\n cloned.body = this.body;\n }\n\n return cloned;\n }\n}\n\nexport const responsePool: HyperHttpResponse<any>[] = [];\nconst RESPONSE_POOL_MAX = 64;\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 HttpResponse \u0438\u0437 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u043D\u043E\u0433\u043E \u043E\u0442\u0432\u0435\u0442\u0430 \u0441 \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u0435\u043C \u043F\u0443\u043B\u0430.\n * @en Creates an HttpResponse from a transport response reusing the pool.\n * @param rawResponse - The raw transport response.\n * @returns An HttpResponse instance.\n */\nexport const mapResponseFast = (rawResponse: TransportResponse): HttpResponse<unknown> => {\n const instance = responsePool.pop() ?? new HyperHttpResponse();\n return instance.init(rawResponse);\n};\n\n/**\n * @ru \u0412\u043E\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 HttpResponse \u0432 \u043F\u0443\u043B \u043F\u0435\u0440\u0435\u0438\u0441\u043F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u043D\u0438\u044F.\n * @en Returns an HttpResponse to the reuse pool.\n * @param res - The response to recycle.\n */\nexport const recycleResponse = (res: HttpResponse<unknown>): void => {\n if (res instanceof HyperHttpResponse && responsePool.length < RESPONSE_POOL_MAX) {\n res.reset();\n responsePool.push(res);\n }\n};\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 StreamResponse \u0431\u0435\u0437 \u043F\u043E\u0442\u0440\u0435\u0431\u043B\u0435\u043D\u0438\u044F \u0442\u0435\u043B\u0430.\n * @en Creates a StreamResponse without consuming the body.\n * @param rawResponse - The raw transport response.\n * @returns A StreamResponse-like object.\n */\nexport const mapStreamFast = (rawResponse: TransportResponse) => ({\n status: rawResponse.status,\n headers: rawResponse.headers,\n body: rawResponse.body,\n url: rawResponse.url ?? \"\",\n});\n\n/**\n * @ru \u0411\u044B\u0441\u0442\u0440\u043E\u0435 \u0441\u043B\u0438\u044F\u043D\u0438\u0435 \u0437\u0430\u0433\u043E\u043B\u043E\u0432\u043A\u043E\u0432 \u0441 \u043C\u0443\u0442\u0430\u0446\u0438\u0435\u0439 \u0431\u0430\u0437\u043E\u0432\u043E\u0433\u043E \u043E\u0431\u044A\u0435\u043A\u0442\u0430.\n * @en Fast header merge mutating the base object.\n * @param base - Base headers object (mutated).\n * @param override - Optional headers to overlay.\n * @returns The mutated base headers object.\n */\nexport const mergeHeadersFast = (\n base: Record<string, string | string[]>,\n override?: Record<string, string | string[]>,\n): Record<string, string | string[]> => {\n if (!override) return base;\n\n let hasOverride = false;\n for (const _ in override) {\n hasOverride = true;\n break;\n }\n if (!hasOverride) return base;\n\n for (const key in override) {\n if (Object.prototype.hasOwnProperty.call(override, key)) {\n base[key] = override[key]!;\n }\n }\n return base;\n};\n"],
5
- "mappings": "aACA,OAAS,mBAAAA,MAAuB,2BAehC,MAAMC,EAAY,OAAO,mBAAmB,EACtCC,EAAa,OAAO,oBAAoB,EACxCC,EAAa,OAAO,oBAAoB,EAQxCC,EAAiB,IAAI,YACrBC,EAAiB,IAAI,YACrBC,EAAiD,OAAO,OAAO,CAAA,CAAE,EAEvE,SAASC,EAAiBC,EAAc,CACtC,OACE,OAAOA,GAAU,UACjBA,IAAU,MACV,cAAeA,GACf,OAAQA,EAAkC,WAAc,UAE5D,CAEA,SAASC,EAAOD,EAAc,CAC5B,OAAO,OAAO,KAAS,KAAeA,aAAiB,IACzD,CAQO,aAAM,cAAoBE,GAAc,CAC7C,GAAI,OAAOA,GAAS,UAAYA,IAAS,KAAM,OAAOA,EACtD,MAAMC,EAAMD,EAEZ,GACEA,aAAgB,YAChB,OAAOC,EAAI,MAAS,YACpB,OAAOA,EAAI,WAAc,WAEzB,OAAOD,EAGT,MAAME,EAAQ,OAAO,eAAeF,CAAI,EACxC,GAAIE,IAAU,OAAO,WAAaA,IAAU,KAAM,CAChD,MAAMC,EAAS,OAAO,OAAOD,CAAK,EAClC,UAAWE,KAAOJ,EACZ,OAAO,UAAU,eAAe,KAAKA,EAAMI,CAAG,IAChDD,EAAOC,CAAG,EAAIJ,EAAKI,CAAG,GAG1B,OAAOD,CACT,CAEA,GAAI,CACF,OAAO,gBAAgBH,CAAI,CAC7B,MAAQ,CACN,GAAI,CACF,OAAO,KAAK,MAAM,KAAK,UAAUA,CAAI,CAAC,CACxC,MAAQ,CACN,MAAMG,EAAS,OAAO,OAAOD,CAAK,EAClC,UAAWE,KAAOJ,EACZ,OAAO,UAAU,eAAe,KAAKA,EAAMI,CAAG,IAChDD,EAAOC,CAAG,EAAIJ,EAAKI,CAAG,GAG1B,OAAOD,CACT,CACF,CACF,EAMM,aAAO,iBAAiB,CACrB,OACA,QACA,KACA,IACA,KAEA,CAACZ,CAAS,EACV,CAACC,CAAU,EACX,CAACC,CAAU,EAEV,cACA,KAER,YAAYY,EAA+B,CACzC,KAAK,OAAS,EACd,KAAK,QAAUT,EACf,KAAK,KAAO,KACZ,KAAK,IAAM,GACX,KAAK,KAAO,KACZ,KAAKL,CAAS,EAAI,OAClB,KAAKC,CAAU,EAAI,OACnB,KAAKC,CAAU,EAAI,OACnB,KAAK,cAAgB,GACrB,KAAK,KAAO,OACRY,GAAa,KAAK,KAAKA,CAAW,CACxC,CAQO,KAAKA,EAA8B,CACxC,YAAK,OAASA,EAAY,OAC1B,KAAK,QAAUA,EAAY,SAAWT,EACtC,KAAK,KAAOS,EAAY,KACxB,KAAK,IAAMA,EAAY,KAAO,GAC9B,KAAK,KAAO,KACZ,KAAKd,CAAS,EAAI,OAClB,KAAKC,CAAU,EAAI,OACnB,KAAKC,CAAU,EAAI,OACnB,KAAK,cAAgB,GACrB,KAAK,KAAQY,EAA0C,KAChD,IACT,CAEQ,MAAM,cAAY,CACxB,GAAI,KAAKd,CAAS,IAAM,OAAW,OAEnC,MAAMS,EAAO,KAAK,KAClB,GAAKA,EAEL,IAAIA,aAAgB,WAAY,CAC9B,KAAKT,CAAS,EAAIS,EAClB,KAAK,cAAgB,GACrB,MACF,CAEA,GAAI,OAAOA,GAAS,SAAU,CAC5B,KAAKT,CAAS,EAAII,EAAe,OAAOK,CAAI,EAC5C,KAAK,cAAgB,GACrB,MACF,CAEA,GAAIA,aAAgB,YAAa,CAC/B,KAAKT,CAAS,EAAI,IAAI,WAAWS,CAAI,EACrC,KAAK,cAAgB,GACrB,MACF,CAEA,GAAI,KAAK,MAAQA,IAAS,KAAK,KAAK,MAAQ,OAAO,KAAK,KAAK,aAAgB,WAAY,CACvF,MAAMM,EAAM,MAAM,KAAK,KAAK,YAAW,EACvC,KAAKf,CAAS,EAAI,IAAI,WAAWe,CAAG,EACpC,KAAK,KAAO,KAAKf,CAAS,EAC1B,KAAK,cAAgB,GACrB,MACF,CAEA,GAAID,IAAoB,OAASU,GAAQ,OAAOA,GAAS,UAAY,gBAAiBA,EAAM,CAC1F,MAAMO,EAAUP,EAChB,GAAI,OAAOO,EAAQ,aAAgB,WAAY,CAC7C,MAAMD,EAAM,MAAMC,EAAQ,YAAW,EACrC,KAAKhB,CAAS,EAAI,IAAI,WAAWe,CAAG,EACpC,KAAK,KAAO,KAAKf,CAAS,EAC1B,KAAK,cAAgB,GACrB,MACF,CACF,CAEA,GAAIM,EAAiBG,CAAI,GAAKD,EAAOC,CAAI,EAAG,CAC1C,GAAIH,EAAiBG,CAAI,GAAKA,EAAK,OACjC,MAAM,IAAI,MAAM,8BAA8B,EAGhD,MAAMM,EAAM,MADK,IAAI,SAASN,CAA2B,EAC9B,YAAW,EACtC,KAAKT,CAAS,EAAI,IAAI,WAAWe,CAAG,EACpC,KAAK,KAAO,KAAKf,CAAS,EAC1B,KAAK,cAAgB,EACvB,EACF,CAOO,MAAM,aAAW,CAEtB,GADA,MAAM,KAAK,aAAY,EACnB,KAAKA,CAAS,IAAM,OACtB,MAAM,IAAI,MAAM,0DAA0D,EAE5E,OAAO,KAAKA,CAAS,EAAE,MACzB,CAOO,MAAM,MAAI,CACf,GAAI,KAAKC,CAAU,IAAM,OAAW,OAAO,KAAKA,CAAU,EAE1D,GADA,MAAM,KAAK,aAAY,EACnB,KAAKD,CAAS,IAAM,OACtB,MAAM,IAAI,MAAM,mDAAmD,EAErE,YAAKC,CAAU,EAAIE,EAAe,OAAO,KAAKH,CAAS,CAAE,EAClD,KAAKC,CAAU,CACxB,CAOO,MAAM,MAAI,CACf,MAAMQ,EAAO,KAAK,KAClB,GACE,CAAC,KAAK,eACN,OAAOA,GAAS,UAChBA,IAAS,MACT,CAACH,EAAiBG,CAAI,GACtB,CAACD,EAAOC,CAAI,GACZ,EAAEA,aAAgB,aAClB,EAAEA,aAAgB,aAElB,YAAK,cAAgB,GACdA,EAIT,GADA,MAAM,KAAK,aAAY,EACnB,KAAKT,CAAS,IAAM,OACtB,MAAM,IAAI,MAAM,mDAAmD,EAErE,OAAI,KAAKC,CAAU,IAAM,SACvB,KAAKA,CAAU,EAAIE,EAAe,OAAO,KAAKH,CAAS,CAAE,GAEpD,KAAK,MAAM,KAAKC,CAAU,CAAE,CACrC,CAMO,OAAK,CACV,KAAK,OAAS,EACd,KAAK,QAAUI,EACf,KAAK,KAAO,KACZ,KAAK,IAAM,GACX,KAAK,KAAO,KACZ,KAAKL,CAAS,EAAI,OAClB,KAAKC,CAAU,EAAI,OACnB,KAAKC,CAAU,EAAI,OACnB,KAAK,cAAgB,GACrB,KAAK,KAAO,MACd,CAOO,MAAM,MAAI,CACf,GAAI,KAAK,cAAe,OACxB,KAAK,cAAgB,GAErB,MAAMO,EAAO,KAAK,KACdH,EAAiBG,CAAI,EAClBA,EAAK,QAAQ,MAAMA,EAAK,OAAM,EAAG,MAAM,IAAK,CAAE,CAAC,EAC3CD,EAAOC,CAAI,GACpB,MAAMA,EAAK,YAAW,CAE1B,CAOO,OAAK,CACV,MAAMQ,EAAS,IAAI,kBAYnB,GAXAA,EAAO,OAAS,KAAK,OACrBA,EAAO,QAAU,KAAK,QACtBA,EAAO,IAAM,KAAK,IAClBA,EAAO,KAAO,KAAK,KAAO,cAAc,KAAK,IAAI,EAAI,KACrDA,EAAO,cAAgB,KAAK,cAC5BA,EAAO,KAAO,KAAK,cAAgB,OAAY,KAAK,KAEpDA,EAAOjB,CAAS,EAAI,KAAKA,CAAS,EAClCiB,EAAOhB,CAAU,EAAI,KAAKA,CAAU,EACpCgB,EAAOf,CAAU,EAAI,KAAKA,CAAU,EAEhCI,EAAiB,KAAK,IAAI,GAAK,CAAC,KAAK,cACvC,GAAI,KAAK,KAAK,OACZW,EAAO,KAAO,KAAK,SACd,CACL,KAAM,CAACC,EAAIC,CAAE,EAAI,KAAK,KAAK,IAAG,EAC9B,KAAK,KAAOD,EACZD,EAAO,KAAOE,CAChB,MAEAF,EAAO,KAAO,KAAK,KAGrB,OAAOA,CACT,EAGK,aAAM,aAAyC,CAAA,EACtD,MAAMG,EAAoB,GAQnB,aAAM,gBAAmBN,IACb,aAAa,IAAG,GAAM,IAAI,mBAC3B,KAAKA,CAAW,EAQrB,gBAAmBO,GAAoC,CAC9DA,aAAe,mBAAqB,aAAa,OAASD,IAC5DC,EAAI,MAAK,EACT,aAAa,KAAKA,CAAG,EAEzB,EAQa,cAAiBP,IAAoC,CAChE,OAAQA,EAAY,OACpB,QAASA,EAAY,QACrB,KAAMA,EAAY,KAClB,IAAKA,EAAY,KAAO,KAUb,iBAAmB,CAC9BQ,EACAC,IACqC,CACrC,GAAI,CAACA,EAAU,OAAOD,EAEtB,IAAIE,EAAc,GAClB,UAAWC,KAAKF,EAAU,CACxBC,EAAc,GACd,KACF,CACA,GAAI,CAACA,EAAa,OAAOF,EAEzB,UAAWT,KAAOU,EACZ,OAAO,UAAU,eAAe,KAAKA,EAAUV,CAAG,IACpDS,EAAKT,CAAG,EAAIU,EAASV,CAAG,GAG5B,OAAOS,CACT",
6
- "names": ["CURRENT_RUNTIME", "RAW_CACHE", "TEXT_CACHE", "JSON_CACHE", "STATIC_DECODER", "STATIC_ENCODER", "EMPTY_HEADERS", "isReadableStream", "value", "isBlob", "body", "obj", "proto", "target", "key", "rawResponse", "buf", "bunBody", "cloned", "b1", "b2", "RESPONSE_POOL_MAX", "res", "base", "override", "hasOverride", "_"]
7
- }
@@ -1,2 +0,0 @@
1
- "use strict";const u=new Set([502,503,504]);export function calcDelay(e,t){const{baseDelay:n=1e3,maxDelay:r=1e4,jitter:o=!0}=t,c=Math.min(e,31),a=Math.min(n*Math.pow(2,c),r);if(!o)return a;const i=a*(.75+Math.random()*.5);return Math.min(Math.max(0,i),r)}export async function drainBody(e){if(!(!e||typeof e!="object"))try{const t=e;if(typeof t.dump=="function"){await t.dump();return}if(typeof t.destroy=="function"){t.destroy();return}if(typeof t.resume=="function"){t.resume();return}if(typeof t.cancel=="function"){await t.cancel();return}typeof t.getReader=="function"&&t.getReader().cancel()}catch{}}export function shouldRetry(e,t){const n=t.retryStatusCodes;return n!==void 0?n.length>0&&n.includes(e):u.has(e)}
2
- //# sourceMappingURL=retryUtils.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/retryUtils.ts"],
4
- "sourcesContent": ["import type { RetryOptions } from \"@hyperttp/types\";\n\n/**\n * @ru \u041A\u043E\u0434\u044B \u0441\u0442\u0430\u0442\u0443\u0441\u0430 HTTP, \u043F\u043E \u043A\u043E\u0442\u043E\u0440\u044B\u043C \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u044B\u0435 \u043F\u043E\u043F\u044B\u0442\u043A\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u043F\u043E \u0443\u043C\u043E\u043B\u0447\u0430\u043D\u0438\u044E.\n * @en Default HTTP status codes that trigger retries when no explicit codes are provided.\n */\nconst DEFAULT_RETRY_STATUS_CODES = new Set<number>([502, 503, 504]);\n\n/**\n * @ru \u0412\u044B\u0447\u0438\u0441\u043B\u044F\u0435\u0442 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u0443 \u043F\u0435\u0440\u0435\u0434 \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u043E\u0439 \u043F\u043E\u043F\u044B\u0442\u043A\u043E\u0439 \u0441 \u044D\u043A\u0441\u043F\u043E\u043D\u0435\u043D\u0446\u0438\u0430\u043B\u044C\u043D\u043E\u0439 \u0437\u0430\u0434\u0435\u0440\u0436\u043A\u043E\u0439 \u0438 \u0432\u043E\u0437\u043C\u043E\u0436\u043D\u044B\u043C \u0434\u0436\u0438\u0442\u0442\u0435\u0440\u043E\u043C.\n * @en Calculates the delay before a retry using exponential backoff and optional jitter.\n */\nexport function calcDelay(attempt: number, retryOptions: RetryOptions): number {\n const { baseDelay = 1000, maxDelay = 10000, jitter = true } = retryOptions;\n const safeAttempt = Math.min(attempt, 31);\n const base = Math.min(baseDelay * Math.pow(2, safeAttempt), maxDelay);\n if (!jitter) return base;\n const jittered = base * (0.75 + Math.random() * 0.5);\n return Math.min(Math.max(0, jittered), maxDelay);\n}\n\n/**\n * @ru \u041F\u044B\u0442\u0430\u0435\u0442\u0441\u044F \u043E\u0441\u0432\u043E\u0431\u043E\u0434\u0438\u0442\u044C \u0440\u0435\u0441\u0443\u0440\u0441\u044B \u0442\u0435\u043B\u0430 \u043E\u0442\u0432\u0435\u0442\u0430, \u043D\u0435 \u0434\u043E\u0436\u0438\u0434\u0430\u044F\u0441\u044C \u043F\u043E\u043B\u043D\u043E\u0433\u043E \u043F\u043E\u0442\u0440\u0435\u0431\u043B\u0435\u043D\u0438\u044F. \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043C\u0435\u0442\u043E\u0434\u044B dump, resume, destroy.\n * @en Attempts to release response body resources without fully consuming it. Supports dump, resume, destroy methods.\n */\nexport async function drainBody(body: unknown): Promise<void> {\n if (!body || typeof body !== \"object\") return;\n try {\n const stream = body as Record<string, unknown>;\n\n if (typeof stream.dump === \"function\") {\n await (stream.dump as () => Promise<void>)();\n return;\n }\n\n if (typeof stream.destroy === \"function\") {\n (stream.destroy as () => void)();\n return;\n }\n\n if (typeof stream.resume === \"function\") {\n (stream.resume as () => void)();\n return;\n }\n\n if (typeof stream.cancel === \"function\") {\n await (stream.cancel as () => Promise<void>)();\n return;\n }\n\n if (typeof stream.getReader === \"function\") {\n const reader = (stream as unknown as ReadableStream).getReader();\n reader.cancel();\n }\n } catch {\n //\n }\n}\n\n/**\n * @ru \u041E\u043F\u0440\u0435\u0434\u0435\u043B\u044F\u0435\u0442, \u0441\u043B\u0435\u0434\u0443\u0435\u0442 \u043B\u0438 \u0432\u044B\u043F\u043E\u043B\u043D\u0438\u0442\u044C \u043F\u043E\u0432\u0442\u043E\u0440\u043D\u0443\u044E \u043F\u043E\u043F\u044B\u0442\u043A\u0443 \u0434\u043B\u044F \u0434\u0430\u043D\u043D\u043E\u0433\u043E \u043A\u043E\u0434\u0430 \u0441\u0442\u0430\u0442\u0443\u0441\u0430 \u043D\u0430 \u043E\u0441\u043D\u043E\u0432\u0435 \u043D\u0430\u0441\u0442\u0440\u043E\u0435\u043A.\n * @en Determines whether to retry for the given status code based on retry options.\n */\nexport function shouldRetry(status: number, retryOptions: RetryOptions): boolean {\n const codes = retryOptions.retryStatusCodes;\n if (codes !== undefined) {\n return codes.length > 0 && codes.includes(status);\n }\n return DEFAULT_RETRY_STATUS_CODES.has(status);\n}\n"],
5
- "mappings": "aAMA,MAAMA,EAA6B,IAAI,IAAY,CAAC,IAAK,IAAK,GAAG,CAAC,EAM5D,gBAAU,UAAUC,EAAiBC,EAA0B,CACnE,KAAM,CAAE,UAAAC,EAAY,IAAM,SAAAC,EAAW,IAAO,OAAAC,EAAS,EAAI,EAAKH,EACxDI,EAAc,KAAK,IAAIL,EAAS,EAAE,EAClCM,EAAO,KAAK,IAAIJ,EAAY,KAAK,IAAI,EAAGG,CAAW,EAAGF,CAAQ,EACpE,GAAI,CAACC,EAAQ,OAAOE,EACpB,MAAMC,EAAWD,GAAQ,IAAO,KAAK,OAAM,EAAK,IAChD,OAAO,KAAK,IAAI,KAAK,IAAI,EAAGC,CAAQ,EAAGJ,CAAQ,CACjD,CAMA,sBAAsB,UAAUK,EAAa,CAC3C,GAAI,GAACA,GAAQ,OAAOA,GAAS,UAC7B,GAAI,CACF,MAAMC,EAASD,EAEf,GAAI,OAAOC,EAAO,MAAS,WAAY,CACrC,MAAOA,EAAO,KAA4B,EAC1C,MACF,CAEA,GAAI,OAAOA,EAAO,SAAY,WAAY,CACvCA,EAAO,QAAsB,EAC9B,MACF,CAEA,GAAI,OAAOA,EAAO,QAAW,WAAY,CACtCA,EAAO,OAAqB,EAC7B,MACF,CAEA,GAAI,OAAOA,EAAO,QAAW,WAAY,CACvC,MAAOA,EAAO,OAA8B,EAC5C,MACF,CAEI,OAAOA,EAAO,WAAc,YACdA,EAAqC,UAAS,EACvD,OAAM,CAEjB,MAAQ,CAER,CACF,CAMM,gBAAU,YAAYC,EAAgBT,EAA0B,CACpE,MAAMU,EAAQV,EAAa,iBAC3B,OAAIU,IAAU,OACLA,EAAM,OAAS,GAAKA,EAAM,SAASD,CAAM,EAE3CX,EAA2B,IAAIW,CAAM,CAC9C",
6
- "names": ["DEFAULT_RETRY_STATUS_CODES", "attempt", "retryOptions", "baseDelay", "maxDelay", "jitter", "safeAttempt", "base", "jittered", "body", "stream", "status", "codes"]
7
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes