@hyperttp/core 1.5.5 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/Core/HyperCore.d.ts +176 -141
  2. package/Core/HyperCore.d.ts.map +1 -1
  3. package/Core/HyperCore.js +1 -1
  4. package/Core/HyperCore.js.map +3 -3
  5. package/README.md +260 -316
  6. package/defaultConfig.d.ts +9 -4
  7. package/defaultConfig.d.ts.map +1 -1
  8. package/defaultConfig.js +1 -1
  9. package/defaultConfig.js.map +2 -2
  10. package/index.d.ts +3 -0
  11. package/index.d.ts.map +1 -1
  12. package/index.js +1 -1
  13. package/index.js.map +2 -2
  14. package/package.json +39 -33
  15. package/protocols/manager.d.ts +31 -0
  16. package/protocols/manager.d.ts.map +1 -0
  17. package/protocols/manager.js +2 -0
  18. package/protocols/manager.js.map +7 -0
  19. package/protocols/rest/index.d.ts +9 -0
  20. package/protocols/rest/index.d.ts.map +1 -0
  21. package/protocols/rest/index.js +2 -0
  22. package/protocols/rest/index.js.map +7 -0
  23. package/protocols/rest/receiver.d.ts +31 -0
  24. package/protocols/rest/receiver.d.ts.map +1 -0
  25. package/protocols/rest/receiver.js +2 -0
  26. package/protocols/rest/receiver.js.map +7 -0
  27. package/protocols/rest/sender.d.ts +19 -0
  28. package/protocols/rest/sender.d.ts.map +1 -0
  29. package/protocols/rest/sender.js +2 -0
  30. package/protocols/rest/sender.js.map +7 -0
  31. package/protocols/rest/type.d.ts +71 -0
  32. package/protocols/rest/type.d.ts.map +1 -0
  33. package/protocols/rest/type.js +2 -0
  34. package/protocols/rest/type.js.map +7 -0
  35. package/rest.d.ts +2 -0
  36. package/rest.d.ts.map +1 -0
  37. package/rest.js +2 -0
  38. package/rest.js.map +7 -0
  39. package/transports/fetch.d.ts +24 -0
  40. package/transports/fetch.d.ts.map +1 -0
  41. package/transports/fetch.js +2 -0
  42. package/transports/fetch.js.map +7 -0
  43. package/transports/manager.d.ts +17 -80
  44. package/transports/manager.d.ts.map +1 -1
  45. package/transports/manager.js +1 -6
  46. package/transports/manager.js.map +3 -3
  47. package/utils/abort.d.ts +23 -0
  48. package/utils/abort.d.ts.map +1 -0
  49. package/utils/abort.js +2 -0
  50. package/utils/abort.js.map +7 -0
  51. package/utils/errors.d.ts +12 -2
  52. package/utils/errors.d.ts.map +1 -1
  53. package/utils/errors.js +1 -1
  54. package/utils/errors.js.map +3 -3
  55. package/utils/merge.d.ts.map +1 -1
  56. package/utils/merge.js +1 -1
  57. package/utils/merge.js.map +2 -2
  58. package/Core/RequestBuilder.d.ts +0 -32
  59. package/Core/RequestBuilder.d.ts.map +0 -1
  60. package/Core/RequestBuilder.js +0 -2
  61. package/Core/RequestBuilder.js.map +0 -7
  62. package/transports/browser.d.ts +0 -37
  63. package/transports/browser.d.ts.map +0 -1
  64. package/transports/browser.js +0 -2
  65. package/transports/browser.js.map +0 -7
  66. package/transports/node.d.ts +0 -33
  67. package/transports/node.d.ts.map +0 -1
  68. package/transports/node.js +0 -2
  69. package/transports/node.js.map +0 -7
  70. package/utils/normalize.d.ts +0 -35
  71. package/utils/normalize.d.ts.map +0 -1
  72. package/utils/normalize.js +0 -2
  73. package/utils/normalize.js.map +0 -7
  74. package/utils/pipeline.d.ts +0 -63
  75. package/utils/pipeline.d.ts.map +0 -1
  76. package/utils/pipeline.js +0 -2
  77. package/utils/pipeline.js.map +0 -7
  78. package/utils/response.d.ts +0 -113
  79. package/utils/response.d.ts.map +0 -1
  80. package/utils/response.js +0 -2
  81. package/utils/response.js.map +0 -7
  82. package/utils/retryUtils.d.ts +0 -17
  83. package/utils/retryUtils.d.ts.map +0 -1
  84. package/utils/retryUtils.js +0 -2
  85. package/utils/retryUtils.js.map +0 -7
@@ -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,33 +0,0 @@
1
- import type { HttpClientOptions, HyperTransport, StealthOptions, TransportRequest, TransportResponse } from "@hyperttp/types";
2
- /**
3
- * @ru Конфигурация транспорта для Node.js с использованием нативных http/https модулей.
4
- * @en Node.js transport configuration using native http/https modules.
5
- */
6
- export interface NodeTransportConfig extends HttpClientOptions {
7
- /**
8
- * @ru Базовый URL для относительных путей.
9
- * @en Base URL for relative paths.
10
- */
11
- baseUrl?: string;
12
- /**
13
- * @ru Настройки stealth-маскировки на уровне транспорта.
14
- * @en Stealth masking settings at the transport level.
15
- */
16
- stealth?: StealthOptions;
17
- }
18
- /**
19
- * @ru Реализация транспорта для Node.js с использованием нативных http/https модулей.
20
- * Поддерживает stealth-маскировку, фрагментацию TLS Client Hello и автоматическую декомпрессию.
21
- */
22
- export declare class NodeTransport implements HyperTransport {
23
- config: NodeTransportConfig;
24
- private readonly isProduction;
25
- private readonly cleanBaseUrl;
26
- private readonly agentCache;
27
- private readonly trackedAgents;
28
- constructor(config: NodeTransportConfig);
29
- execute(req: TransportRequest): Promise<TransportResponse>;
30
- close(): Promise<void>;
31
- destroy(): Promise<void>;
32
- }
33
- //# sourceMappingURL=node.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../src/transports/node.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,iBAAiB,EACjB,cAAc,EACd,cAAc,EACd,gBAAgB,EAChB,iBAAiB,EAElB,MAAM,iBAAiB,CAAC;AASzB;;;GAGG;AACH,MAAM,WAAW,mBAAoB,SAAQ,iBAAiB;IAC5D;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;OAGG;IACH,OAAO,CAAC,EAAE,cAAc,CAAC;CAC1B;AAqUD;;;GAGG;AACH,qBAAa,aAAc,YAAW,cAAc;IAC3C,MAAM,EAAE,mBAAmB,CAAC;IACnC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;IACtC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAGxB;IACH,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAuC;IAErE,YAAY,MAAM,EAAE,mBAAmB,EAMtC;IAEY,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CA2HtE;IAEY,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAMlC;IAEY,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAMpC;CACF"}
@@ -1,2 +0,0 @@
1
- "use strict";import{CacheManager as D}from"hcacher";import G from"node:http";import U from"node:https";import O from"node:net";import{Readable as R,Transform as W}from"node:stream";import B from"node:tls";import T from"node:zlib";const K={chrome:{"sec-ch-ua":'"Not/A)Brand";v="8", "Chromium";v="126", "Google Chrome";v="126"',"sec-ch-ua-mobile":"?0","sec-ch-ua-platform":'"Linux"',"sec-fetch-dest":"document","sec-fetch-mode":"navigate","sec-fetch-site":"none","sec-fetch-user":"?1","upgrade-insecure-requests":"1","accept-language":"en-US,en;q=0.9"},firefox:{"sec-fetch-dest":"document","sec-fetch-mode":"navigate","sec-fetch-site":"none","accept-language":"en-US,en;q=0.5","upgrade-insecure-requests":"1"}},N={chrome:"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36",firefox:"Mozilla/5.0 (X11; Linux; rv:126.0) Gecko/20100101 Firefox/126.0",safari:"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15",edge:"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0.0.0 Safari/537.36 Edg/126.0.0.0"};function j(t){if(!t)return"";switch(t){case"chrome":case"edge":return["TLS_AES_128_GCM_SHA256","TLS_AES_256_GCM_SHA384","TLS_CHACHA20_POLY1305_SHA256","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256"].join(":");case"firefox":return["TLS_AES_128_GCM_SHA256","TLS_CHACHA20_POLY1305_SHA256","TLS_AES_256_GCM_SHA384","ECDHE-ECDSA-AES128-GCM-SHA256","ECDHE-RSA-AES128-GCM-SHA256"].join(":");case"safari":return["TLS_AES_256_GCM_SHA384","TLS_CHACHA20_POLY1305_SHA256","TLS_AES_128_GCM_SHA256","ECDHE-ECDSA-AES256-GCM-SHA384","ECDHE-RSA-AES256-GCM-SHA384"].join(":");default:return""}}function $(t,e){if(!e||!e.fingerprint)return t;const r=e.fingerprint,o=K[r];if(o)for(const i in o)t[i]===void 0&&(t[i]=o[i]);const n=t["user-agent"];if(n===void 0||n==="hyperttp/2.0"||n==="Hyperttp/2.0"){const i=N[r];i&&(t["user-agent"]=i)}return t}function F(t,e,r,o,n){const i=e?.fingerprint??"none",_=e?.fragment??"none",m=e?.http2===!0,y=`${t?"https":"http"}:${i}:${_}:${m?"h2":"1.1"}`;let p=r.get(y);if(p)return p;const f={keepAlive:!0,maxSockets:256};if(n!==void 0&&(f.rejectUnauthorized=n),t){if(f.ciphers=j(e?.fingerprint),_==="split"||m){const h=m?["h2","http/1.1"]:void 0;f.createConnection=(u,a)=>{let l=!1;const d=(A,g)=>{const s=O.connect(u);if(_==="split"){const S=s.write;let k=!0;s.write=function(E,H,x){if(k&&E instanceof Uint8Array&&E.length>5){k=!1,this.write=S;let w,L;typeof H=="function"?L=H:(w=H,L=x);const z=E.subarray(0,3),P=E.subarray(3),v=M=>{L?.(M)};try{S.call(this,z,w)}catch(M){return v(M),!1}return S.call(this,P,w,L)}return this.write=S,S.call(this,E,H,x)}}const c={...u,socket:s,ciphers:f.ciphers};A&&(c.ALPNProtocols=A);const C=B.connect(c);C.once("secureConnect",()=>{if(A&&C.alpnProtocol==="h2"&&!l){l=!0,C.destroy(),d(["http/1.1"],g);return}g(null,C)}),C.once("error",S=>g(S))};return d(h,a)}}p=new U.Agent(f)}else p=new G.Agent(f);return r.set(y,p),o.add(p),p}function X(t){return t.startsWith("http://")||t.startsWith("https://")}function I(t,e){if(!e)throw new Error("URL is empty");return X(e)?e:e.charCodeAt(0)===47?t+e:t+"/"+e}function V(t){const e=t.indexOf("://");if(e===-1)return!1;const r=e+3;let o=t.indexOf("/",r);o===-1&&(o=t.length);const n=t.slice(r,o);return n==="localhost"||n.startsWith("localhost:")}function Y(t){const e=Object.create(null);if(!t)return e;if(t instanceof Headers)return t.forEach((o,n)=>{e[n.toLowerCase()]=o}),e;if(Array.isArray(t)){for(let o=0;o<t.length;o++){const n=t[o];!n||typeof n[0]!="string"||(e[n[0].toLowerCase()]=String(n[1]))}return e}const r=t;for(const o in r){const n=r[o];if(n==null)continue;const i=o.toLowerCase();if(Array.isArray(n)){e[i]=i==="cookie"?n.join("; "):n.join(", ");continue}e[i]=String(n)}return e}function q(t){let e=0;return new W({transform(r,o,n){if(e+=r.length,e>t){n(new Error(`[Hyperttp] Response size exceeded limit of ${t} bytes`));return}n(null,r)}})}export class NodeTransport{config;isProduction;cleanBaseUrl;agentCache=new D({maxSize:32,ttl:6e4});trackedAgents=new Set;constructor(e){this.config=e,this.isProduction=!0;const r=e.baseUrl??"http://localhost:3000";this.cleanBaseUrl=r.endsWith("/")?r.slice(0,-1):r}async execute(e){const r=I(this.cleanBaseUrl,e.url);if(this.isProduction&&V(r))throw new Error("Localhost URL detected in production environment");let o=Y(e.headers);o["accept-encoding"]===void 0&&(o["accept-encoding"]="gzip, deflate, br");const n=e.stealth??this.config.stealth??this.config.network?.stealth;n&&(o=$(o,n));const i=e.body,m=new URL(r).protocol==="https:",y=F(m,n,this.agentCache,this.trackedAgents,this.config.network?.rejectUnauthorized);return new Promise((p,f)=>{const b={method:e.method,headers:o,agent:y,signal:e.signal};let h=!1;const u=(m?U:G).request(r,b,a=>{const l=Object.create(null);for(const s in a.headers){const c=a.headers[s];c!==void 0&&(l[s]=Array.isArray(c)?c.join(", "):c)}let d=a;const A=l["content-encoding"]?.toLowerCase();if(A==="gzip"){const s=T.createGunzip();s.on("error",c=>{a.destroy(c),h||f(c)}),d=a.pipe(s),delete l["content-encoding"],delete l["content-length"]}else if(A==="deflate"){const s=T.createInflate();s.on("error",c=>{a.destroy(c),h||f(c)}),d=a.pipe(s),delete l["content-encoding"],delete l["content-length"]}else if(A==="br"){const s=T.createBrotliDecompress();s.on("error",c=>{a.destroy(c),h||f(c)}),d=a.pipe(s),delete l["content-encoding"],delete l["content-length"]}const g=this.config.network?.maxResponseBytes;if(g!=null&&g>0){const s=q(g);s.on("error",c=>{a.destroy(c),h||f(c)}),d=d.pipe(s)}d.on("error",s=>{h||f(s)}),h=!0,p({status:a.statusCode??200,headers:l,url:r,body:R.toWeb(d)})});u.on("error",a=>{h||f(a)}),i!=null?typeof i=="string"||i instanceof Uint8Array||ArrayBuffer.isView(i)?(u.write(i),u.end()):i instanceof ArrayBuffer?(u.write(Buffer.from(i)),u.end()):typeof ReadableStream<"u"&&i instanceof ReadableStream?R.fromWeb(i).pipe(u):u.end():u.end()})}async close(){for(const e of this.trackedAgents)e.destroy();this.trackedAgents.clear(),this.agentCache.clear()}async destroy(){for(const e of this.trackedAgents)e.destroy();this.trackedAgents.clear(),this.agentCache.clear()}}
2
- //# sourceMappingURL=node.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/transports/node.ts"],
4
- "sourcesContent": ["import type {\n Fingerprint,\n HttpClientOptions,\n HyperTransport,\n StealthOptions,\n TransportRequest,\n TransportResponse,\n TransportResponsePayload,\n} from \"@hyperttp/types\";\nimport { CacheManager } from \"hcacher\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport net from \"node:net\";\nimport { Readable, Transform } from \"node:stream\";\nimport tls from \"node:tls\";\nimport zlib from \"node:zlib\";\n\n/**\n * @ru \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
- }
@@ -1,35 +0,0 @@
1
- import type { Method, RequestBodyData } from "@hyperttp/types";
2
- type NormalizedHeaders = Record<string, string | string[]>;
3
- /**
4
- * @ru Извлекает URL из запроса (строка, объект с url/_url или схема+хост+путь).
5
- * @en Extracts the URL from a request (string, object with url/_url, or scheme+host+path).
6
- * @param req - URL string or request-like object.
7
- * @returns The extracted URL string.
8
- */
9
- export declare function normalizeUrl(req: unknown): string;
10
- /**
11
- * @ru Нормализует заголовки в плоский объект с нижним регистром ключей и обработкой массива/парных форматов.
12
- * @en Normalizes headers into a flat object with lowercased keys, handling array/pair formats.
13
- * @param headers - Headers in any supported format (object, array of pairs, flat array).
14
- * @param out - Optional output object (reused for pooling).
15
- * @returns Normalized headers object.
16
- */
17
- export declare function normalizeHeaders(headers: unknown, out?: NormalizedHeaders): NormalizedHeaders;
18
- /**
19
- * @ru Возвращает undefined для GET/HEAD (тело запрещено), иначе тело как есть.
20
- * @en Returns undefined for GET/HEAD (body disallowed), otherwise the body as-is.
21
- * @param method - HTTP method.
22
- * @param body - Request body.
23
- * @returns Normalized body or undefined.
24
- */
25
- export declare function normalizeBody(method: Method, body: RequestBodyData | undefined): RequestBodyData | undefined;
26
- /**
27
- * @ru Преобразует тело для транспорта: сериализует объекты в JSON, URLSearchParams в строку, проставляет Content-Type.
28
- * @en Transforms body for transport: serializes objects to JSON, URLSearchParams to string, sets Content-Type.
29
- * @param body - Request body.
30
- * @param headers - Headers object (may be mutated to add Content-Type).
31
- * @returns Body ready for transport.
32
- */
33
- export declare function normalizeBodyForTransport(body: RequestBodyData, headers: Record<string, string | string[]>): RequestBodyData;
34
- export {};
35
- //# sourceMappingURL=normalize.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"normalize.d.ts","sourceRoot":"","sources":["../../src/utils/normalize.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;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": "aACA,OAAS,gBAAAA,MAAoB,UAI7B,MAAMC,EAA0C,OAAO,OAAO,IAAI,EAC5DC,EAAgB,CACpB,eACA,iBACA,mBACA,sBACA,OACA,gBACA,sBACA,aACA,UACA,SACA,WACA,OACA,iBAGF,QAASC,EAAI,EAAGA,EAAID,EAAc,OAAQC,IACxCF,EAAqBC,EAAcC,CAAC,CAAE,EAAI,EAG5C,MAAMC,EAAmB,IAAIJ,EAAqB,CAAE,QAAS,KAAM,IAAK,GAAM,CAAE,EAE1EK,EAAiB,CACrB,SACA,kBACA,kBACA,gBACA,gBACA,aACA,mBACA,iBACA,eACA,SACA,OACA,OACA,OACA,oBACA,gBACA,aACA,WACA,SACA,SACA,sBACA,UACA,YACA,SACA,aACA,oBACA,aACA,kBACA,oBAGF,QAASF,EAAI,EAAGA,EAAIE,EAAe,OAAQF,IAAK,CAC9C,MAAMG,EAAQD,EAAeF,CAAC,EAC9BC,EAAiB,IAAIE,EAAOA,CAAK,CACnC,CAEA,SAASC,EAAiBC,EAAW,CACnC,MAAMC,EAASL,EAAiB,IAAII,CAAG,EACvC,GAAIC,IAAW,OAAW,OAAOA,EAEjC,MAAMH,EAAQE,EAAI,YAAW,EAC7B,OAAAJ,EAAiB,IAAII,EAAKF,CAAK,EACxBA,CACT,CAQM,gBAAU,aAAaI,EAAY,CACvC,GAAI,OAAOA,GAAQ,SAAU,OAAOA,EAEpC,GAAIA,GAAO,OAAOA,GAAQ,SAAU,CAClC,MAAMC,EAAID,EAEJE,EAAMD,EAAE,IACd,GAAI,OAAOC,GAAQ,SAAU,OAAOA,EACpC,GAAIA,GAAO,KAAM,OAAO,OAAOA,CAAG,EAElC,MAAMC,EAAIF,EAAE,KACZ,GAAI,OAAOE,GAAM,SAAU,OAAOA,EAClC,GAAIA,GAAK,KAAM,OAAO,OAAOA,CAAC,EAE9B,MAAMC,EAASH,EAAE,OACXI,EAAOJ,EAAE,KACTK,EAAOL,EAAE,KAEf,GAAI,OAAOG,GAAW,UAAY,OAAOC,GAAS,UAAY,OAAOC,GAAS,SAC5E,OAAOF,EAAS,MAAQC,EAAOC,CAEnC,CAEA,MAAM,IAAI,MAAM,wBAAwB,CAC1C,CAEA,SAASC,EAAWC,EAAW,CAC7B,MAAMC,EAAMD,EAAI,OAChB,QAASf,EAAI,EAAGA,EAAIgB,EAAKhB,IAAK,CAC5B,MAAMiB,EAAOF,EAAI,WAAWf,CAAC,EAC7B,GAAIiB,IAAS,IAAMA,IAAS,GAAI,MAAO,EACzC,CACA,MAAO,EACT,CAEA,SAASC,EAAaC,EAAwBC,EAAkBC,EAAa,CAK3E,GAJIP,EAAWO,CAAK,IAClBA,EAAQA,EAAM,QAAQ,UAAW,EAAE,GAGjCvB,EAAqBsB,CAAQ,IAAM,EAAG,CACxCD,EAAIC,CAAQ,EAAIC,EAChB,MACF,CAEA,MAAMC,EAAWH,EAAIC,CAAQ,EAE7B,GAAIE,IAAa,OAAW,CAC1BH,EAAIC,CAAQ,EAAIA,IAAa,aAAe,CAACC,CAAK,EAAIA,EACtD,MACF,CAEA,GAAID,IAAa,aAAc,CACzB,MAAM,QAAQE,CAAQ,EACxBA,EAAS,KAAKD,CAAK,EAEnBF,EAAIC,CAAQ,EAAI,CAACE,EAAUD,CAAK,EAElC,MACF,CAEA,GAAID,IAAa,UAAYA,IAAa,UAAW,CACnDD,EAAIC,CAAQ,EAAIE,EAAW,KAAOD,EAClC,MACF,CAEAF,EAAIC,CAAQ,EAAIE,EAAW,KAAOD,CACpC,CAEA,SAASE,EAAeJ,EAAwBhB,EAAeqB,EAAY,CACzE,GAAyBA,GAAQ,KAEjC,IAAI,MAAM,QAAQA,CAAG,EAAG,CACtB,MAAMR,EAAMQ,EAAI,OAChB,QAASxB,EAAI,EAAGA,EAAIgB,EAAKhB,IAAK,CAC5B,MAAMyB,EAAOD,EAAIxB,CAAC,EACQyB,GAAS,MACjCP,EAAaC,EAAKhB,EAAO,OAAOsB,GAAS,SAAWA,EAAO,OAAOA,CAAI,CAAC,CAE3E,CACA,MACF,CAEAP,EAAaC,EAAKhB,EAAO,OAAOqB,GAAQ,SAAWA,EAAM,OAAOA,CAAG,CAAC,EACtE,CASM,gBAAU,iBACdE,EACAP,EAAyB,OAAO,OAAO,IAAI,EAAC,CAE5C,GAAI,CAACO,GAAW,OAAOA,GAAY,SAAU,OAAOP,EAEpD,GAAI,CAAC,MAAM,QAAQO,CAAO,EAAG,CAC3B,UAAWrB,KAAOqB,EAChB,GAAI,OAAO,UAAU,eAAe,KAAKA,EAASrB,CAAG,EAAG,CACtD,MAAMsB,EAAOD,EAAoCrB,CAAG,EAC3BsB,GAAQ,MAC/BJ,EAAeJ,EAAKf,EAAiBC,CAAG,EAAGsB,CAAG,CAElD,CAEF,OAAOR,CACT,CAEA,MAAMH,EAAMU,EAAQ,OACpB,GAAIV,IAAQ,EAAG,OAAOG,EAEtB,GAAI,MAAM,QAAQO,EAAQ,CAAC,CAAC,EAC1B,QAAS,EAAI,EAAG,EAAIV,EAAK,IAAK,CAC5B,MAAMY,EAAOF,EAAQ,CAAC,EACtB,GAAI,CAAC,MAAM,QAAQE,CAAI,EAAG,SAE1B,MAAMvB,EAAMuB,EAAK,CAAC,EAClB,GAAI,OAAOvB,GAAQ,UAAYA,EAAI,SAAW,EAAG,SAEjD,MAAMwB,EAAWD,EAAK,CAAC,EACOC,GAAa,MAE3CX,EACEC,EACAf,EAAiBC,CAAG,EACpB,OAAOwB,GAAa,SAAWA,EAAW,OAAOA,CAAQ,CAAC,CAE9D,KAEA,SAAS,EAAI,EAAG,EAAIb,EAAK,GAAK,EAAG,CAC/B,MAAMX,EAAMqB,EAAQ,CAAC,EACrB,GAAI,OAAOrB,GAAQ,UAAYA,EAAI,SAAW,EAAG,SAEjD,MAAMwB,EAAWH,EAAQ,EAAI,CAAC,EACAG,GAAa,MAE3CX,EACEC,EACAf,EAAiBC,CAAG,EACpB,OAAOwB,GAAa,SAAWA,EAAW,OAAOA,CAAQ,CAAC,CAE9D,CAGF,OAAOV,CACT,CASM,gBAAU,cACdW,EACAC,EAAiC,CAEjC,OAAOD,IAAW,OAASA,IAAW,OAAS,OAAYC,CAC7D,CAEA,SAASC,EAAeN,EAA0C,CAChE,MAAMO,EAAKP,EAAQ,cAAc,EACjC,GAAI,OAAOO,GAAO,SAAU,OAAOA,EACnC,GAAI,MAAM,QAAQA,CAAE,EAAG,OAAOA,EAAG,CAAC,CAEpC,CASM,gBAAU,0BACdF,EACAL,EAA0C,CAE1C,OAAIK,GAAQ,KAAaA,EAErB,OAAO,gBAAoB,KAAeA,aAAgB,iBACvDC,EAAeN,CAAO,IACzBA,EAAQ,cAAc,EAAI,qCAErBK,EAAK,SAAQ,GAIpB,OAAOA,GAAS,UAChBA,IAAS,MACT,EAAEA,aAAgB,aAClB,EAAEA,aAAgB,cAClB,EAAE,OAAO,YAAgB,KAAe,YAAY,SAASA,CAAI,IACjE,EAAE,OAAO,gBAAoB,KAAeA,aAAgB,kBAC5D,EAAE,OAAO,SAAa,KAAeA,aAAgB,WACrD,EAAE,OAAO,KAAS,KAAeA,aAAgB,OACjD,EAAE,OAAO,eAAmB,KAAeA,aAAgB,iBAC3D,EAAE,SAAUA,GAAQ,OAAQA,EAAa,MAAS,aAG7CC,EAAeN,CAAO,IACzBA,EAAQ,cAAc,EAAI,oBAErB,KAAK,UAAUK,CAAI,GAGrBA,CACT",
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,63 +0,0 @@
1
- import type { HyperPlugin, PluginContext, InternalRequest, HttpResponse, HyperttpError, HttpClientOptions, TransportResponse } from "@hyperttp/types";
2
- /**
3
- * @ru Структура записи хука с метаданными для оптимизации и сортировки.
4
- * @en Hook record structure with metadata for optimization and sorting.
5
- */
6
- export interface HookRecord<T> {
7
- /** @ru Уникальное имя хука. @en Unique hook name. */
8
- readonly name: string;
9
- /** @ru Приоритет выполнения (выше значение — раньше выполнение). @en Execution priority (higher value runs earlier). */
10
- readonly priority: number;
11
- /** @ru Функция-обработчик. @en Handler function. */
12
- readonly run: T;
13
- }
14
- /**
15
- * @ru Контейнер конвейеров для различных фаз обработки запроса/ответа.
16
- * @en Pipeline container for different request/response processing phases.
17
- */
18
- export interface PipelineContainer {
19
- /** @ru Хуки, выполняемые перед отправкой запроса. @en Hooks executed before sending the request. */
20
- readonly request: HookRecord<Required<HyperPlugin>["onRequest"]>[];
21
- /** @ru Хуки, обрабатывающие сырые данные транспорта. @en Hooks processing raw transport data. */
22
- readonly responseData: HookRecord<Required<HyperPlugin>["onResponseData"]>[];
23
- /** @ru Хуки, мутирующие ответ (последовательное выполнение). @en Hooks that mutate the response (sequential execution). */
24
- readonly responseMutators: HookRecord<Required<HyperPlugin>["onResponse"]>[];
25
- /** @ru Хуки с побочными эффектами (выполняются в фоне). @en Side-effect hooks (executed in the background). */
26
- readonly responseSideEffects: HookRecord<Required<HyperPlugin>["onResponse"]>[];
27
- /** @ru Хуки для перехвата ошибок. @en Error interception hooks. */
28
- readonly error: HookRecord<Required<HyperPlugin>["onError"]>[];
29
- }
30
- /**
31
- * @ru Создаёт пустой контейнер для конвейеров плагинов.
32
- * @en Creates an empty container for plugin pipelines.
33
- * @returns An empty pipeline container.
34
- */
35
- export declare function createPipelines(): PipelineContainer;
36
- /**
37
- * @ru Вставляет хук в массив с сохранением сортировки по убыванию приоритета (деревья поиска тут избыточны).
38
- * @en Inserts a hook into the array maintaining descending priority order.
39
- * @param list - Target array to insert into.
40
- * @param hook - Hook record to insert.
41
- */
42
- export declare function insertHookSorted<T>(list: HookRecord<T>[], hook: HookRecord<T>): void;
43
- /**
44
- * @ru Выполняет конвейер пред-запроса. Поддерживает short-circuit.
45
- * @en Executes the pre-request pipeline. Supports short-circuiting.
46
- */
47
- export declare function executeRequestPipeline(hooks: readonly HookRecord<Required<HyperPlugin>["onRequest"]>[], req: InternalRequest, ctx: PluginContext): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null;
48
- /**
49
- * @ru Выполняет низкоуровневый конвейер трансформации сырых данных транспорта (фаза DATA).
50
- * @en Executes low-level transport data transformation pipeline (DATA phase).
51
- */
52
- export declare function executeResponseDataPipeline(hooks: readonly HookRecord<Required<HyperPlugin>["onResponseData"]>[], res: TransportResponse, ctx: PluginContext): Promise<TransportResponse> | TransportResponse;
53
- /**
54
- * @ru Выполняет конвейер пост-ответа. Разделен на мутаторы и сайд-эффекты.
55
- * @en Executes the post-response pipeline. Split into mutators and side-effects.
56
- */
57
- export declare function executeResponsePipeline(mutators: readonly HookRecord<Required<HyperPlugin>["onResponse"]>[], sideEffects: readonly HookRecord<Required<HyperPlugin>["onResponse"]>[], res: HttpResponse<unknown>, req: InternalRequest, ctx: PluginContext, logger?: HttpClientOptions["logger"]): Promise<void> | void;
58
- /**
59
- * @ru Выполняет конвейер перехвата ошибок.
60
- * @en Executes the error interception pipeline.
61
- */
62
- export declare function executeErrorPipeline(hooks: readonly HookRecord<Required<HyperPlugin>["onError"]>[], error: HyperttpError, req: InternalRequest, ctx: PluginContext): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null;
63
- //# sourceMappingURL=pipeline.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../src/utils/pipeline.ts"],"names":[],"mappings":"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"}
package/utils/pipeline.js DELETED
@@ -1,2 +0,0 @@
1
- "use strict";export function createPipelines(){return{request:[],responseData:[],responseMutators:[],responseSideEffects:[],error:[]}}export function insertHookSorted(e,r){const i=e.length;let n=0;for(;n<i&&e[n].priority>=r.priority;)n++;e.splice(n,0,r)}export function executeRequestPipeline(e,r,i){const n=e.length;if(n===0)return null;for(let c=0;c<n;c++){const t=e[c].run(r,i);if(t!=null)return t instanceof Promise?p(e,r,i,c,t):t}return null}export function executeResponseDataPipeline(e,r,i){const n=e.length;if(n===0)return r;let c=r;for(let s=0;s<n;s++){const t=e[s].run(c,i);if(t instanceof Promise)return y(e,i,s,t,c);t!=null&&(c=t)}return c}export function executeResponsePipeline(e,r,i,n,c,s){const t=r.length;if(t>0)for(let l=0;l<t;l++){const u=r[l];try{const f=u.run(i,n,c);f instanceof Promise&&w(f,u.name,s)}catch(f){a(f,u.name,s)}}const o=e.length;if(o>0)for(let l=0;l<o;l++){const u=e[l].run(i,n,c);if(u instanceof Promise)return P(e,i,n,c,l,u)}}export function executeErrorPipeline(e,r,i,n){const c=e.length;if(c===0)return null;for(let s=0;s<c;s++){const t=e[s].run(r,i,n);if(t instanceof Promise)return h(e,r,i,n,s,t);if(t!=null)return t}return null}async function p(e,r,i,n,c){const s=await c;if(s!=null)return s;const t=e.length;for(let o=n+1;o<t;o++){const l=e[o].run(r,i);if(l instanceof Promise){const u=await l;if(u!=null)return u}else if(l!=null)return l}return null}async function y(e,r,i,n,c){let s=c;const t=await n;t!=null&&(s=t);const o=e.length;for(let l=i+1;l<o;l++){const u=e[l].run(s,r);if(u instanceof Promise){const f=await u;f!=null&&(s=f)}else u!=null&&(s=u)}return s}async function P(e,r,i,n,c,s){await s;const t=e.length;for(let o=c+1;o<t;o++){const l=e[o].run(r,i,n);l instanceof Promise&&await l}}async function h(e,r,i,n,c,s){const t=await s;if(t!=null)return t;const o=e.length;for(let l=c+1;l<o;l++){const u=e[l].run(r,i,n);if(u instanceof Promise){const f=await u;if(f!=null)return f}else if(u!=null)return u}return null}function w(e,r,i){e.catch(n=>a(n,r,i))}function a(e,r,i){const n=e instanceof Error?e:new Error(String(e));i?i("warn",`Background hook "${r}" crashed: ${n.message}`,n):console.warn(`[Hyperttp] Background hook "${r}" crashed:`,n)}
2
- //# sourceMappingURL=pipeline.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/utils/pipeline.ts"],
4
- "sourcesContent": ["import type {\n HyperPlugin,\n PluginContext,\n InternalRequest,\n HttpResponse,\n HyperttpError,\n HttpClientOptions,\n TransportResponse,\n} from \"@hyperttp/types\";\n\n/**\n * @ru \u0421\u0442\u0440\u0443\u043A\u0442\u0443\u0440\u0430 \u0437\u0430\u043F\u0438\u0441\u0438 \u0445\u0443\u043A\u0430 \u0441 \u043C\u0435\u0442\u0430\u0434\u0430\u043D\u043D\u044B\u043C\u0438 \u0434\u043B\u044F \u043E\u043F\u0442\u0438\u043C\u0438\u0437\u0430\u0446\u0438\u0438 \u0438 \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0438.\n * @en Hook record structure with metadata for optimization and sorting.\n */\nexport interface HookRecord<T> {\n /** @ru \u0423\u043D\u0438\u043A\u0430\u043B\u044C\u043D\u043E\u0435 \u0438\u043C\u044F \u0445\u0443\u043A\u0430. @en Unique hook name. */\n readonly name: string;\n /** @ru \u041F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u044F (\u0432\u044B\u0448\u0435 \u0437\u043D\u0430\u0447\u0435\u043D\u0438\u0435 \u2014 \u0440\u0430\u043D\u044C\u0448\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435). @en Execution priority (higher value runs earlier). */\n readonly priority: number;\n /** @ru \u0424\u0443\u043D\u043A\u0446\u0438\u044F-\u043E\u0431\u0440\u0430\u0431\u043E\u0442\u0447\u0438\u043A. @en Handler function. */\n readonly run: T;\n}\n\n/**\n * @ru \u041A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440\u043E\u0432 \u0434\u043B\u044F \u0440\u0430\u0437\u043B\u0438\u0447\u043D\u044B\u0445 \u0444\u0430\u0437 \u043E\u0431\u0440\u0430\u0431\u043E\u0442\u043A\u0438 \u0437\u0430\u043F\u0440\u043E\u0441\u0430/\u043E\u0442\u0432\u0435\u0442\u0430.\n * @en Pipeline container for different request/response processing phases.\n */\nexport interface PipelineContainer {\n /** @ru \u0425\u0443\u043A\u0438, \u0432\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u043C\u044B\u0435 \u043F\u0435\u0440\u0435\u0434 \u043E\u0442\u043F\u0440\u0430\u0432\u043A\u043E\u0439 \u0437\u0430\u043F\u0440\u043E\u0441\u0430. @en Hooks executed before sending the request. */\n readonly request: HookRecord<Required<HyperPlugin>[\"onRequest\"]>[];\n /** @ru \u0425\u0443\u043A\u0438, \u043E\u0431\u0440\u0430\u0431\u0430\u0442\u044B\u0432\u0430\u044E\u0449\u0438\u0435 \u0441\u044B\u0440\u044B\u0435 \u0434\u0430\u043D\u043D\u044B\u0435 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430. @en Hooks processing raw transport data. */\n readonly responseData: HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[];\n /** @ru \u0425\u0443\u043A\u0438, \u043C\u0443\u0442\u0438\u0440\u0443\u044E\u0449\u0438\u0435 \u043E\u0442\u0432\u0435\u0442 (\u043F\u043E\u0441\u043B\u0435\u0434\u043E\u0432\u0430\u0442\u0435\u043B\u044C\u043D\u043E\u0435 \u0432\u044B\u043F\u043E\u043B\u043D\u0435\u043D\u0438\u0435). @en Hooks that mutate the response (sequential execution). */\n readonly responseMutators: HookRecord<Required<HyperPlugin>[\"onResponse\"]>[];\n /** @ru \u0425\u0443\u043A\u0438 \u0441 \u043F\u043E\u0431\u043E\u0447\u043D\u044B\u043C\u0438 \u044D\u0444\u0444\u0435\u043A\u0442\u0430\u043C\u0438 (\u0432\u044B\u043F\u043E\u043B\u043D\u044F\u044E\u0442\u0441\u044F \u0432 \u0444\u043E\u043D\u0435). @en Side-effect hooks (executed in the background). */\n readonly responseSideEffects: HookRecord<Required<HyperPlugin>[\"onResponse\"]>[];\n /** @ru \u0425\u0443\u043A\u0438 \u0434\u043B\u044F \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043E\u0448\u0438\u0431\u043E\u043A. @en Error interception hooks. */\n readonly error: HookRecord<Required<HyperPlugin>[\"onError\"]>[];\n}\n\n/**\n * @ru \u0421\u043E\u0437\u0434\u0430\u0451\u0442 \u043F\u0443\u0441\u0442\u043E\u0439 \u043A\u043E\u043D\u0442\u0435\u0439\u043D\u0435\u0440 \u0434\u043B\u044F \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440\u043E\u0432 \u043F\u043B\u0430\u0433\u0438\u043D\u043E\u0432.\n * @en Creates an empty container for plugin pipelines.\n * @returns An empty pipeline container.\n */\nexport function createPipelines(): PipelineContainer {\n return {\n request: [],\n responseData: [],\n responseMutators: [],\n responseSideEffects: [],\n error: [],\n };\n}\n\n/**\n * @ru \u0412\u0441\u0442\u0430\u0432\u043B\u044F\u0435\u0442 \u0445\u0443\u043A \u0432 \u043C\u0430\u0441\u0441\u0438\u0432 \u0441 \u0441\u043E\u0445\u0440\u0430\u043D\u0435\u043D\u0438\u0435\u043C \u0441\u043E\u0440\u0442\u0438\u0440\u043E\u0432\u043A\u0438 \u043F\u043E \u0443\u0431\u044B\u0432\u0430\u043D\u0438\u044E \u043F\u0440\u0438\u043E\u0440\u0438\u0442\u0435\u0442\u0430 (\u0434\u0435\u0440\u0435\u0432\u044C\u044F \u043F\u043E\u0438\u0441\u043A\u0430 \u0442\u0443\u0442 \u0438\u0437\u0431\u044B\u0442\u043E\u0447\u043D\u044B).\n * @en Inserts a hook into the array maintaining descending priority order.\n * @param list - Target array to insert into.\n * @param hook - Hook record to insert.\n */\nexport function insertHookSorted<T>(list: HookRecord<T>[], hook: HookRecord<T>): void {\n const len = list.length;\n let i = 0;\n while (i < len && list[i]!.priority >= hook.priority) {\n i++;\n }\n list.splice(i, 0, hook);\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u0440\u0435\u0434-\u0437\u0430\u043F\u0440\u043E\u0441\u0430. \u041F\u043E\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 short-circuit.\n * @en Executes the pre-request pipeline. Supports short-circuiting.\n */\nexport function executeRequestPipeline(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onRequest\"]>[],\n req: InternalRequest,\n ctx: PluginContext,\n): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null {\n const len = hooks.length;\n if (len === 0) return null;\n for (let i = 0; i < len; i++) {\n const hook = hooks[i]!;\n const res = hook.run(req, ctx);\n if (res !== null && res !== undefined) {\n if (res instanceof Promise) {\n return executeRequestPipelineAsync(hooks, req, ctx, i, res);\n }\n return res;\n }\n }\n return null;\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043D\u0438\u0437\u043A\u043E\u0443\u0440\u043E\u0432\u043D\u0435\u0432\u044B\u0439 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u0442\u0440\u0430\u043D\u0441\u0444\u043E\u0440\u043C\u0430\u0446\u0438\u0438 \u0441\u044B\u0440\u044B\u0445 \u0434\u0430\u043D\u043D\u044B\u0445 \u0442\u0440\u0430\u043D\u0441\u043F\u043E\u0440\u0442\u0430 (\u0444\u0430\u0437\u0430 DATA).\n * @en Executes low-level transport data transformation pipeline (DATA phase).\n */\nexport function executeResponseDataPipeline(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[],\n res: TransportResponse,\n ctx: PluginContext,\n): Promise<TransportResponse> | TransportResponse {\n const len = hooks.length;\n if (len === 0) return res;\n let currentRes = res;\n for (let i = 0; i < len; i++) {\n const result = hooks[i]!.run(currentRes, ctx);\n if (result instanceof Promise) {\n return executeResponseDataPipelineAsync(hooks, ctx, i, result, currentRes);\n }\n if (result != null) {\n currentRes = result;\n }\n }\n return currentRes;\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u043E\u0441\u0442-\u043E\u0442\u0432\u0435\u0442\u0430. \u0420\u0430\u0437\u0434\u0435\u043B\u0435\u043D \u043D\u0430 \u043C\u0443\u0442\u0430\u0442\u043E\u0440\u044B \u0438 \u0441\u0430\u0439\u0434-\u044D\u0444\u0444\u0435\u043A\u0442\u044B.\n * @en Executes the post-response pipeline. Split into mutators and side-effects.\n */\nexport function executeResponsePipeline(\n mutators: readonly HookRecord<Required<HyperPlugin>[\"onResponse\"]>[],\n sideEffects: readonly HookRecord<Required<HyperPlugin>[\"onResponse\"]>[],\n res: HttpResponse<unknown>,\n req: InternalRequest,\n ctx: PluginContext,\n logger?: HttpClientOptions[\"logger\"],\n): Promise<void> | void {\n const seLen = sideEffects.length;\n if (seLen > 0) {\n for (let i = 0; i < seLen; i++) {\n const effect = sideEffects[i]!;\n try {\n const promise = effect.run(res, req, ctx);\n if (promise instanceof Promise) {\n safelyAttachSideEffectCatch(promise, effect.name, logger);\n }\n } catch (err) {\n handleSideEffectError(err, effect.name, logger);\n }\n }\n }\n const mutLen = mutators.length;\n if (mutLen > 0) {\n for (let i = 0; i < mutLen; i++) {\n const result = mutators[i]!.run(res, req, ctx);\n if (result instanceof Promise) {\n return executeMutatorsAsync(mutators, res, req, ctx, i, result);\n }\n }\n }\n}\n\n/**\n * @ru \u0412\u044B\u043F\u043E\u043B\u043D\u044F\u0435\u0442 \u043A\u043E\u043D\u0432\u0435\u0439\u0435\u0440 \u043F\u0435\u0440\u0435\u0445\u0432\u0430\u0442\u0430 \u043E\u0448\u0438\u0431\u043E\u043A.\n * @en Executes the error interception pipeline.\n */\nexport function executeErrorPipeline(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onError\"]>[],\n error: HyperttpError,\n req: InternalRequest,\n ctx: PluginContext,\n): Promise<HttpResponse<unknown> | null> | HttpResponse<unknown> | null {\n const len = hooks.length;\n if (len === 0) return null;\n for (let i = 0; i < len; i++) {\n const res = hooks[i]!.run(error, req, ctx);\n if (res instanceof Promise) {\n return executeErrorPipelineAsync(hooks, error, req, ctx, i, res);\n }\n if (res != null) return res;\n }\n return null;\n}\n\nasync function executeRequestPipelineAsync(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onRequest\"]>[],\n req: InternalRequest,\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<HttpResponse<unknown> | void>,\n): Promise<HttpResponse<unknown> | null> {\n const shortCircuit = await initialPromise;\n if (shortCircuit != null) return shortCircuit;\n const len = hooks.length;\n for (let i = startIndex + 1; i < len; i++) {\n const res = hooks[i]!.run(req, ctx);\n if (res instanceof Promise) {\n const asyncRes = await res;\n if (asyncRes != null) return asyncRes;\n } else if (res != null) {\n return res;\n }\n }\n return null;\n}\n\nasync function executeResponseDataPipelineAsync(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onResponseData\"]>[],\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<TransportResponse | void>,\n lastRes: TransportResponse,\n): Promise<TransportResponse> {\n let currentRes = lastRes;\n const firstAsyncResult = await initialPromise;\n if (firstAsyncResult != null) {\n currentRes = firstAsyncResult;\n }\n const len = hooks.length;\n for (let i = startIndex + 1; i < len; i++) {\n const result = hooks[i]!.run(currentRes, ctx);\n if (result instanceof Promise) {\n const asyncResult = await result;\n if (asyncResult != null) {\n currentRes = asyncResult;\n }\n } else if (result != null) {\n currentRes = result;\n }\n }\n return currentRes;\n}\n\nasync function executeMutatorsAsync(\n mutators: readonly HookRecord<Required<HyperPlugin>[\"onResponse\"]>[],\n res: HttpResponse<unknown>,\n req: InternalRequest,\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<unknown>,\n): Promise<void> {\n await initialPromise;\n const len = mutators.length;\n for (let i = startIndex + 1; i < len; i++) {\n const result = mutators[i]!.run(res, req, ctx);\n if (result instanceof Promise) {\n await result;\n }\n }\n}\n\nasync function executeErrorPipelineAsync(\n hooks: readonly HookRecord<Required<HyperPlugin>[\"onError\"]>[],\n error: HyperttpError,\n req: InternalRequest,\n ctx: PluginContext,\n startIndex: number,\n initialPromise: Promise<HttpResponse<unknown> | void>,\n): Promise<HttpResponse<unknown> | null> {\n const recovered = await initialPromise;\n if (recovered != null) return recovered;\n const len = hooks.length;\n for (let i = startIndex + 1; i < len; i++) {\n const res = hooks[i]!.run(error, req, ctx);\n if (res instanceof Promise) {\n const asyncRes = await res;\n if (asyncRes != null) return asyncRes;\n } else if (res != null) {\n return res;\n }\n }\n return null;\n}\n\nfunction safelyAttachSideEffectCatch(\n promise: Promise<unknown>,\n hookName: string,\n logger?: HttpClientOptions[\"logger\"],\n): void {\n promise.catch((err) => handleSideEffectError(err, hookName, logger));\n}\n\nfunction handleSideEffectError(\n err: unknown,\n hookName: string,\n logger?: HttpClientOptions[\"logger\"],\n): void {\n const errorObject = err instanceof Error ? err : new Error(String(err));\n if (logger) {\n logger(\"warn\", `Background hook \"${hookName}\" crashed: ${errorObject.message}`, errorObject);\n } else {\n console.warn(`[Hyperttp] Background hook \"${hookName}\" crashed:`, errorObject);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["list", "hook", "len", "i", "hooks", "req", "ctx", "res", "executeRequestPipelineAsync", "currentRes", "result", "executeResponseDataPipelineAsync", "mutators", "sideEffects", "logger", "seLen", "effect", "promise", "safelyAttachSideEffectCatch", "err", "handleSideEffectError", "mutLen", "executeMutatorsAsync", "error", "executeErrorPipelineAsync", "startIndex", "initialPromise", "shortCircuit", "asyncRes", "lastRes", "firstAsyncResult", "asyncResult", "recovered", "hookName", "errorObject"]
7
- }
@@ -1,113 +0,0 @@
1
- import type { HttpResponse, HyperTransport, HyperBody } from "@hyperttp/types";
2
- type TransportResponse = Awaited<ReturnType<HyperTransport["execute"]>>;
3
- declare const RAW_CACHE: unique symbol;
4
- declare const TEXT_CACHE: unique symbol;
5
- declare const JSON_CACHE: unique symbol;
6
- type CacheHolder = {
7
- [RAW_CACHE]?: Uint8Array;
8
- [TEXT_CACHE]?: string;
9
- [JSON_CACHE]?: unknown;
10
- };
11
- /**
12
- * @ru Быстрое клонирование тела ответа с поддержкой structuredClone, JSON и ручного копирования.
13
- * @en Fast response body clone supporting structuredClone, JSON, and manual copy.
14
- * @param body - The body value to clone.
15
- * @returns Cloned body.
16
- */
17
- export declare const cloneBodyFast: <T>(body: T) => T;
18
- /**
19
- * @ru Реализация HttpResponse с ленивым потреблением тела, кэшированием raw/text/json и поддержкой пулинга.
20
- * @en HttpResponse implementation with lazy body consumption, raw/text/json caching, and pooling support.
21
- */
22
- export declare class HyperHttpResponse<T = unknown> implements HttpResponse<T>, CacheHolder {
23
- status: number;
24
- headers: Record<string, string | string[]>;
25
- body: T | HyperBody | Uint8Array | null;
26
- url: string;
27
- data: T | null;
28
- [RAW_CACHE]: Uint8Array | undefined;
29
- [TEXT_CACHE]: string | undefined;
30
- [JSON_CACHE]: unknown | undefined;
31
- private _bodyConsumed;
32
- private _raw;
33
- constructor(rawResponse?: TransportResponse);
34
- /**
35
- * @ru Инициализирует ответ из транспортного ответа. Сбрасывает все кэши.
36
- * @en Initializes the response from a transport response. Resets all caches.
37
- * @param rawResponse - The raw transport response.
38
- * @returns This instance for chaining.
39
- */
40
- init(rawResponse: TransportResponse): this;
41
- private _consumeBody;
42
- /**
43
- * @ru Возвращает тело ответа как ArrayBuffer, потребляя его при необходимости.
44
- * @en Returns the response body as ArrayBuffer, consuming it if necessary.
45
- * @returns Promise resolving to an ArrayBuffer.
46
- */
47
- arrayBuffer(): Promise<ArrayBuffer>;
48
- /**
49
- * @ru Возвращает тело ответа как строку с кэшированием.
50
- * @en Returns the response body as text with caching.
51
- * @returns Promise resolving to the decoded text.
52
- */
53
- text(): Promise<string>;
54
- /**
55
- * @ru Возвращает тело ответа, разобранное как JSON. Для объектов возвращает их напрямую (без потребления).
56
- * @en Returns the response body parsed as JSON. Returns objects directly (no consumption).
57
- * @returns Promise resolving to the parsed JSON value.
58
- */
59
- json<TJson = T>(): Promise<TJson>;
60
- /**
61
- * @ru Полный сброс состояния для переиспользования в пуле. Очищает все кэши и приватные поля.
62
- * @en Full state reset for pool reuse. Clears all caches and private fields.
63
- */
64
- reset(): void;
65
- /**
66
- * @ru Сбрасывает тело ответа (для стримов — отменяет/cancel).
67
- * @en Discards the response body (cancels streams).
68
- * @returns Promise that resolves when the body is discarded.
69
- */
70
- dump(): Promise<void>;
71
- /**
72
- * @ru Клонирует ответ с разделением стримов через tee().
73
- * @en Clones the response, splitting streams via tee().
74
- * @returns A new HttpResponse instance.
75
- */
76
- clone(): HttpResponse<T>;
77
- }
78
- export declare const responsePool: HyperHttpResponse<any>[];
79
- /**
80
- * @ru Создаёт HttpResponse из транспортного ответа с переиспользованием пула.
81
- * @en Creates an HttpResponse from a transport response reusing the pool.
82
- * @param rawResponse - The raw transport response.
83
- * @returns An HttpResponse instance.
84
- */
85
- export declare const mapResponseFast: (rawResponse: TransportResponse) => HttpResponse<unknown>;
86
- /**
87
- * @ru Возвращает HttpResponse в пул переиспользования.
88
- * @en Returns an HttpResponse to the reuse pool.
89
- * @param res - The response to recycle.
90
- */
91
- export declare const recycleResponse: (res: HttpResponse<unknown>) => void;
92
- /**
93
- * @ru Создаёт StreamResponse без потребления тела.
94
- * @en Creates a StreamResponse without consuming the body.
95
- * @param rawResponse - The raw transport response.
96
- * @returns A StreamResponse-like object.
97
- */
98
- export declare const mapStreamFast: (rawResponse: TransportResponse) => {
99
- status: number;
100
- headers: Record<string, string | string[]>;
101
- body: import("@hyperttp/types").TransportResponsePayload;
102
- url: string;
103
- };
104
- /**
105
- * @ru Быстрое слияние заголовков с мутацией базового объекта.
106
- * @en Fast header merge mutating the base object.
107
- * @param base - Base headers object (mutated).
108
- * @param override - Optional headers to overlay.
109
- * @returns The mutated base headers object.
110
- */
111
- export declare const mergeHeadersFast: (base: Record<string, string | string[]>, override?: Record<string, string | string[]>) => Record<string, string | string[]>;
112
- export {};
113
- //# sourceMappingURL=response.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"response.d.ts","sourceRoot":"","sources":["../../src/utils/response.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,cAAc,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG/E,KAAK,iBAAiB,GAAG,OAAO,CAAC,UAAU,CAAC,cAAc,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;AAaxE,QAAA,MAAM,SAAS,eAA8B,CAAC;AAC9C,QAAA,MAAM,UAAU,eAA+B,CAAC;AAChD,QAAA,MAAM,UAAU,eAA+B,CAAC;AAEhD,KAAK,WAAW,GAAG;IACjB,CAAC,SAAS,CAAC,CAAC,EAAE,UAAU,CAAC;IACzB,CAAC,UAAU,CAAC,CAAC,EAAE,MAAM,CAAC;IACtB,CAAC,UAAU,CAAC,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAmBF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,GAAI,CAAC,QAAQ,CAAC,KAAG,CAsC1C,CAAC;AAEF;;;GAGG;AACH,qBAAa,iBAAiB,CAAC,CAAC,GAAG,OAAO,CAAE,YAAW,YAAY,CAAC,CAAC,CAAC,EAAE,WAAW;IAC1E,MAAM,EAAG,MAAM,CAAC;IAChB,OAAO,EAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,CAAC;IAC5C,IAAI,EAAG,CAAC,GAAG,SAAS,GAAG,UAAU,GAAG,IAAI,CAAC;IACzC,GAAG,EAAG,MAAM,CAAC;IACb,IAAI,EAAG,CAAC,GAAG,IAAI,CAAC;IAEhB,CAAC,SAAS,CAAC,EAAG,UAAU,GAAG,SAAS,CAAC;IACrC,CAAC,UAAU,CAAC,EAAG,MAAM,GAAG,SAAS,CAAC;IAClC,CAAC,UAAU,CAAC,EAAG,OAAO,GAAG,SAAS,CAAC;IAE1C,OAAO,CAAC,aAAa,CAAW;IAChC,OAAO,CAAC,IAAI,CAAiC;IAE7C,YAAY,WAAW,CAAC,EAAE,iBAAiB,EAY1C;IAED;;;;;OAKG;IACI,IAAI,CAAC,WAAW,EAAE,iBAAiB,GAAG,IAAI,CAYhD;YAEa,YAAY;IAuD1B;;;;OAIG;IACU,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CAM/C;IAED;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAQnC;IAED;;;;OAIG;IACU,IAAI,CAAC,KAAK,GAAG,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,CAuB7C;IAED;;;OAGG;IACI,KAAK,IAAI,IAAI,CAWnB;IAED;;;;OAIG;IACU,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAUjC;IAED;;;;OAIG;IACI,KAAK,IAAI,YAAY,CAAC,CAAC,CAAC,CA0B9B;CACF;AAED,eAAO,MAAM,YAAY,EAAE,iBAAiB,CAAC,GAAG,CAAC,EAAO,CAAC;AAGzD;;;;;GAKG;AACH,eAAO,MAAM,eAAe,gBAAiB,iBAAiB,KAAG,YAAY,CAAC,OAAO,CAGpF,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,eAAe,QAAS,YAAY,CAAC,OAAO,CAAC,KAAG,IAK5D,CAAC;AAEF;;;;;GAKG;AACH,eAAO,MAAM,aAAa,gBAAiB,iBAAiB;IAC1D,MAAM;IACN,OAAO;IACP,IAAI;IACJ,GAAG;CACH,CAAC;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB,SACrB,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,aAC5B,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,KAC3C,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAgBlC,CAAC"}
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": "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",
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,17 +0,0 @@
1
- import type { RetryOptions } from "@hyperttp/types";
2
- /**
3
- * @ru Вычисляет задержку перед повторной попыткой с экспоненциальной задержкой и возможным джиттером.
4
- * @en Calculates the delay before a retry using exponential backoff and optional jitter.
5
- */
6
- export declare function calcDelay(attempt: number, retryOptions: RetryOptions): number;
7
- /**
8
- * @ru Пытается освободить ресурсы тела ответа, не дожидаясь полного потребления. Поддерживает методы dump, resume, destroy.
9
- * @en Attempts to release response body resources without fully consuming it. Supports dump, resume, destroy methods.
10
- */
11
- export declare function drainBody(body: unknown): Promise<void>;
12
- /**
13
- * @ru Определяет, следует ли выполнить повторную попытку для данного кода статуса на основе настроек.
14
- * @en Determines whether to retry for the given status code based on retry options.
15
- */
16
- export declare function shouldRetry(status: number, retryOptions: RetryOptions): boolean;
17
- //# sourceMappingURL=retryUtils.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"retryUtils.d.ts","sourceRoot":"","sources":["../../src/utils/retryUtils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAQpD;;;GAGG;AACH,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,MAAM,CAO7E;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAgC5D;AAED;;;GAGG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,YAAY,GAAG,OAAO,CAM/E"}