nstarter-http-request 0.1.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 (263) hide show
  1. package/CHANGELOG.md +5 -0
  2. package/README.md +160 -0
  3. package/dist/cjs/adapter/axios.adapter.js +224 -0
  4. package/dist/cjs/adapter/axios.adapter.js.map +1 -0
  5. package/dist/cjs/adapter/base.js +134 -0
  6. package/dist/cjs/adapter/base.js.map +1 -0
  7. package/dist/cjs/adapter/index.js +20 -0
  8. package/dist/cjs/adapter/index.js.map +1 -0
  9. package/dist/cjs/adapter/undici.adapter.js +272 -0
  10. package/dist/cjs/adapter/undici.adapter.js.map +1 -0
  11. package/dist/cjs/client.js +409 -0
  12. package/dist/cjs/client.js.map +1 -0
  13. package/dist/cjs/config.js +69 -0
  14. package/dist/cjs/config.js.map +1 -0
  15. package/dist/cjs/const/config.const.js +53 -0
  16. package/dist/cjs/const/config.const.js.map +1 -0
  17. package/dist/cjs/const/dns.const.js +16 -0
  18. package/dist/cjs/const/dns.const.js.map +1 -0
  19. package/dist/cjs/const/enum.const.js +22 -0
  20. package/dist/cjs/const/enum.const.js.map +1 -0
  21. package/dist/cjs/const/index.js +21 -0
  22. package/dist/cjs/const/index.js.map +1 -0
  23. package/dist/cjs/const/ip.const.js +110 -0
  24. package/dist/cjs/const/ip.const.js.map +1 -0
  25. package/dist/cjs/index.js +25 -0
  26. package/dist/cjs/index.js.map +1 -0
  27. package/dist/cjs/logger/base.js +60 -0
  28. package/dist/cjs/logger/base.js.map +1 -0
  29. package/dist/cjs/logger/http_client.logger.js +209 -0
  30. package/dist/cjs/logger/http_client.logger.js.map +1 -0
  31. package/dist/cjs/logger/index.js +20 -0
  32. package/dist/cjs/logger/index.js.map +1 -0
  33. package/dist/cjs/logger/log.filter.js +126 -0
  34. package/dist/cjs/logger/log.filter.js.map +1 -0
  35. package/dist/cjs/security/dns.validator.js +137 -0
  36. package/dist/cjs/security/dns.validator.js.map +1 -0
  37. package/dist/cjs/security/index.js +21 -0
  38. package/dist/cjs/security/index.js.map +1 -0
  39. package/dist/cjs/security/ip.validator.js +107 -0
  40. package/dist/cjs/security/ip.validator.js.map +1 -0
  41. package/dist/cjs/security/ssrf.guard.js +180 -0
  42. package/dist/cjs/security/ssrf.guard.js.map +1 -0
  43. package/dist/cjs/security/url.validator.js +170 -0
  44. package/dist/cjs/security/url.validator.js.map +1 -0
  45. package/dist/cjs/tsconfig.tsbuildinfo +1 -0
  46. package/dist/cjs/types/adapter.js +6 -0
  47. package/dist/cjs/types/adapter.js.map +1 -0
  48. package/dist/cjs/types/client.js +6 -0
  49. package/dist/cjs/types/client.js.map +1 -0
  50. package/dist/cjs/types/config.js +6 -0
  51. package/dist/cjs/types/config.js.map +1 -0
  52. package/dist/cjs/types/errors.js +35 -0
  53. package/dist/cjs/types/errors.js.map +1 -0
  54. package/dist/cjs/types/index.js +35 -0
  55. package/dist/cjs/types/index.js.map +1 -0
  56. package/dist/cjs/types/ip.js +6 -0
  57. package/dist/cjs/types/ip.js.map +1 -0
  58. package/dist/cjs/types/logger.js +6 -0
  59. package/dist/cjs/types/logger.js.map +1 -0
  60. package/dist/cjs/types/request_response.js +6 -0
  61. package/dist/cjs/types/request_response.js.map +1 -0
  62. package/dist/cjs/types/security.js +6 -0
  63. package/dist/cjs/types/security.js.map +1 -0
  64. package/dist/cjs/types/trace.js +14 -0
  65. package/dist/cjs/types/trace.js.map +1 -0
  66. package/dist/cjs/utils/common.js +31 -0
  67. package/dist/cjs/utils/common.js.map +1 -0
  68. package/dist/cjs/utils/domain.js +79 -0
  69. package/dist/cjs/utils/domain.js.map +1 -0
  70. package/dist/cjs/utils/index.js +44 -0
  71. package/dist/cjs/utils/index.js.map +1 -0
  72. package/dist/cjs/utils/ip.range.js +200 -0
  73. package/dist/cjs/utils/ip.range.js.map +1 -0
  74. package/dist/cjs/utils/trace.context.js +213 -0
  75. package/dist/cjs/utils/trace.context.js.map +1 -0
  76. package/dist/esm/adapter/axios.adapter.js +184 -0
  77. package/dist/esm/adapter/axios.adapter.js.map +1 -0
  78. package/dist/esm/adapter/base.js +130 -0
  79. package/dist/esm/adapter/base.js.map +1 -0
  80. package/dist/esm/adapter/index.js +4 -0
  81. package/dist/esm/adapter/index.js.map +1 -0
  82. package/dist/esm/adapter/undici.adapter.js +235 -0
  83. package/dist/esm/adapter/undici.adapter.js.map +1 -0
  84. package/dist/esm/client.js +405 -0
  85. package/dist/esm/client.js.map +1 -0
  86. package/dist/esm/config.js +65 -0
  87. package/dist/esm/config.js.map +1 -0
  88. package/dist/esm/const/config.const.js +50 -0
  89. package/dist/esm/const/config.const.js.map +1 -0
  90. package/dist/esm/const/dns.const.js +13 -0
  91. package/dist/esm/const/dns.const.js.map +1 -0
  92. package/dist/esm/const/enum.const.js +19 -0
  93. package/dist/esm/const/enum.const.js.map +1 -0
  94. package/dist/esm/const/index.js +5 -0
  95. package/dist/esm/const/index.js.map +1 -0
  96. package/dist/esm/const/ip.const.js +107 -0
  97. package/dist/esm/const/ip.const.js.map +1 -0
  98. package/dist/esm/index.js +9 -0
  99. package/dist/esm/index.js.map +1 -0
  100. package/dist/esm/logger/base.js +55 -0
  101. package/dist/esm/logger/base.js.map +1 -0
  102. package/dist/esm/logger/http_client.logger.js +205 -0
  103. package/dist/esm/logger/http_client.logger.js.map +1 -0
  104. package/dist/esm/logger/index.js +4 -0
  105. package/dist/esm/logger/index.js.map +1 -0
  106. package/dist/esm/logger/log.filter.js +122 -0
  107. package/dist/esm/logger/log.filter.js.map +1 -0
  108. package/dist/esm/security/dns.validator.js +133 -0
  109. package/dist/esm/security/dns.validator.js.map +1 -0
  110. package/dist/esm/security/index.js +5 -0
  111. package/dist/esm/security/index.js.map +1 -0
  112. package/dist/esm/security/ip.validator.js +103 -0
  113. package/dist/esm/security/ip.validator.js.map +1 -0
  114. package/dist/esm/security/ssrf.guard.js +176 -0
  115. package/dist/esm/security/ssrf.guard.js.map +1 -0
  116. package/dist/esm/security/url.validator.js +166 -0
  117. package/dist/esm/security/url.validator.js.map +1 -0
  118. package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
  119. package/dist/esm/types/adapter.js +5 -0
  120. package/dist/esm/types/adapter.js.map +1 -0
  121. package/dist/esm/types/client.js +5 -0
  122. package/dist/esm/types/client.js.map +1 -0
  123. package/dist/esm/types/config.js +5 -0
  124. package/dist/esm/types/config.js.map +1 -0
  125. package/dist/esm/types/errors.js +30 -0
  126. package/dist/esm/types/errors.js.map +1 -0
  127. package/dist/esm/types/index.js +19 -0
  128. package/dist/esm/types/index.js.map +1 -0
  129. package/dist/esm/types/ip.js +5 -0
  130. package/dist/esm/types/ip.js.map +1 -0
  131. package/dist/esm/types/logger.js +5 -0
  132. package/dist/esm/types/logger.js.map +1 -0
  133. package/dist/esm/types/request_response.js +5 -0
  134. package/dist/esm/types/request_response.js.map +1 -0
  135. package/dist/esm/types/security.js +5 -0
  136. package/dist/esm/types/security.js.map +1 -0
  137. package/dist/esm/types/trace.js +11 -0
  138. package/dist/esm/types/trace.js.map +1 -0
  139. package/dist/esm/utils/common.js +27 -0
  140. package/dist/esm/utils/common.js.map +1 -0
  141. package/dist/esm/utils/domain.js +71 -0
  142. package/dist/esm/utils/domain.js.map +1 -0
  143. package/dist/esm/utils/index.js +7 -0
  144. package/dist/esm/utils/index.js.map +1 -0
  145. package/dist/esm/utils/ip.range.js +187 -0
  146. package/dist/esm/utils/ip.range.js.map +1 -0
  147. package/dist/esm/utils/trace.context.js +199 -0
  148. package/dist/esm/utils/trace.context.js.map +1 -0
  149. package/dist/types/adapter/axios.adapter.d.ts +51 -0
  150. package/dist/types/adapter/axios.adapter.d.ts.map +1 -0
  151. package/dist/types/adapter/base.d.ts +56 -0
  152. package/dist/types/adapter/base.d.ts.map +1 -0
  153. package/dist/types/adapter/index.d.ts +4 -0
  154. package/dist/types/adapter/index.d.ts.map +1 -0
  155. package/dist/types/adapter/undici.adapter.d.ts +68 -0
  156. package/dist/types/adapter/undici.adapter.d.ts.map +1 -0
  157. package/dist/types/client.d.ts +105 -0
  158. package/dist/types/client.d.ts.map +1 -0
  159. package/dist/types/config.d.ts +14 -0
  160. package/dist/types/config.d.ts.map +1 -0
  161. package/dist/types/const/config.const.d.ts +23 -0
  162. package/dist/types/const/config.const.d.ts.map +1 -0
  163. package/dist/types/const/dns.const.d.ts +13 -0
  164. package/dist/types/const/dns.const.d.ts.map +1 -0
  165. package/dist/types/const/enum.const.d.ts +17 -0
  166. package/dist/types/const/enum.const.d.ts.map +1 -0
  167. package/dist/types/const/index.d.ts +5 -0
  168. package/dist/types/const/index.d.ts.map +1 -0
  169. package/dist/types/const/ip.const.d.ts +42 -0
  170. package/dist/types/const/ip.const.d.ts.map +1 -0
  171. package/dist/types/index.d.ts +9 -0
  172. package/dist/types/index.d.ts.map +1 -0
  173. package/dist/types/logger/base.d.ts +42 -0
  174. package/dist/types/logger/base.d.ts.map +1 -0
  175. package/dist/types/logger/http_client.logger.d.ts +49 -0
  176. package/dist/types/logger/http_client.logger.d.ts.map +1 -0
  177. package/dist/types/logger/index.d.ts +4 -0
  178. package/dist/types/logger/index.d.ts.map +1 -0
  179. package/dist/types/logger/log.filter.d.ts +56 -0
  180. package/dist/types/logger/log.filter.d.ts.map +1 -0
  181. package/dist/types/security/dns.validator.d.ts +61 -0
  182. package/dist/types/security/dns.validator.d.ts.map +1 -0
  183. package/dist/types/security/index.d.ts +5 -0
  184. package/dist/types/security/index.d.ts.map +1 -0
  185. package/dist/types/security/ip.validator.d.ts +31 -0
  186. package/dist/types/security/ip.validator.d.ts.map +1 -0
  187. package/dist/types/security/ssrf.guard.d.ts +54 -0
  188. package/dist/types/security/ssrf.guard.d.ts.map +1 -0
  189. package/dist/types/security/url.validator.d.ts +76 -0
  190. package/dist/types/security/url.validator.d.ts.map +1 -0
  191. package/dist/types/types/adapter.d.ts +30 -0
  192. package/dist/types/types/adapter.d.ts.map +1 -0
  193. package/dist/types/types/client.d.ts +85 -0
  194. package/dist/types/types/client.d.ts.map +1 -0
  195. package/dist/types/types/config.d.ts +99 -0
  196. package/dist/types/types/config.d.ts.map +1 -0
  197. package/dist/types/types/errors.d.ts +23 -0
  198. package/dist/types/types/errors.d.ts.map +1 -0
  199. package/dist/types/types/index.d.ts +10 -0
  200. package/dist/types/types/index.d.ts.map +1 -0
  201. package/dist/types/types/ip.d.ts +32 -0
  202. package/dist/types/types/ip.d.ts.map +1 -0
  203. package/dist/types/types/logger.d.ts +136 -0
  204. package/dist/types/types/logger.d.ts.map +1 -0
  205. package/dist/types/types/request_response.d.ts +54 -0
  206. package/dist/types/types/request_response.d.ts.map +1 -0
  207. package/dist/types/types/security.d.ts +115 -0
  208. package/dist/types/types/security.d.ts.map +1 -0
  209. package/dist/types/types/trace.d.ts +34 -0
  210. package/dist/types/types/trace.d.ts.map +1 -0
  211. package/dist/types/utils/common.d.ts +14 -0
  212. package/dist/types/utils/common.d.ts.map +1 -0
  213. package/dist/types/utils/domain.d.ts +39 -0
  214. package/dist/types/utils/domain.d.ts.map +1 -0
  215. package/dist/types/utils/index.d.ts +6 -0
  216. package/dist/types/utils/index.d.ts.map +1 -0
  217. package/dist/types/utils/ip.range.d.ts +61 -0
  218. package/dist/types/utils/ip.range.d.ts.map +1 -0
  219. package/dist/types/utils/trace.context.d.ts +106 -0
  220. package/dist/types/utils/trace.context.d.ts.map +1 -0
  221. package/docs/adapters.md +53 -0
  222. package/docs/configuration.md +149 -0
  223. package/docs/logging.md +70 -0
  224. package/docs/proxy.md +44 -0
  225. package/docs/security.md +56 -0
  226. package/docs/trace-context.md +436 -0
  227. package/package.json +50 -0
  228. package/src/adapter/axios.adapter.ts +228 -0
  229. package/src/adapter/base.ts +180 -0
  230. package/src/adapter/index.ts +3 -0
  231. package/src/adapter/undici.adapter.ts +282 -0
  232. package/src/client.ts +552 -0
  233. package/src/config.ts +86 -0
  234. package/src/const/config.const.ts +60 -0
  235. package/src/const/dns.const.ts +15 -0
  236. package/src/const/enum.const.ts +17 -0
  237. package/src/const/index.ts +4 -0
  238. package/src/const/ip.const.ts +139 -0
  239. package/src/index.ts +8 -0
  240. package/src/logger/base.ts +75 -0
  241. package/src/logger/http_client.logger.ts +272 -0
  242. package/src/logger/index.ts +3 -0
  243. package/src/logger/log.filter.ts +149 -0
  244. package/src/security/dns.validator.ts +170 -0
  245. package/src/security/index.ts +4 -0
  246. package/src/security/ip.validator.ts +124 -0
  247. package/src/security/ssrf.guard.ts +224 -0
  248. package/src/security/url.validator.ts +192 -0
  249. package/src/types/adapter.ts +38 -0
  250. package/src/types/client.ts +119 -0
  251. package/src/types/config.ts +110 -0
  252. package/src/types/errors.ts +38 -0
  253. package/src/types/index.ts +27 -0
  254. package/src/types/ip.ts +34 -0
  255. package/src/types/logger.ts +150 -0
  256. package/src/types/request_response.ts +65 -0
  257. package/src/types/security.ts +126 -0
  258. package/src/types/trace.ts +35 -0
  259. package/src/utils/common.ts +28 -0
  260. package/src/utils/domain.ts +78 -0
  261. package/src/utils/index.ts +7 -0
  262. package/src/utils/ip.range.ts +218 -0
  263. package/src/utils/trace.context.ts +240 -0
@@ -0,0 +1,27 @@
1
+ /**
2
+ * 延迟函数
3
+ * @param ms 延迟毫秒数
4
+ */
5
+ export function delay(ms) {
6
+ return new Promise(resolve => {
7
+ setTimeout(resolve, ms);
8
+ });
9
+ }
10
+ /**
11
+ * 超时函数
12
+ * @param promise 原始 Promise
13
+ * @param ms 超时毫秒数
14
+ * @param message 超时错误消息
15
+ * @returns 超时后的 Promise
16
+ */
17
+ export function withTimeout(promise, ms, message = 'Operation timed out') {
18
+ return new Promise((resolve, reject) => {
19
+ const timer = setTimeout(() => {
20
+ reject(new Error(message));
21
+ }, ms);
22
+ promise
23
+ .then(resolve, reject)
24
+ .finally(() => clearTimeout(timer));
25
+ });
26
+ }
27
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,KAAK,CAAC,EAAU;IAC5B,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACzB,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC5B,CAAC,CAAC,CAAC;AACP,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,WAAW,CAAI,OAAmB,EAAE,EAAU,EAAE,OAAO,GAAG,qBAAqB;IAC3F,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACtC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC/B,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO;aACF,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC;aACrB,OAAO,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5C,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,71 @@
1
+ import escapeRegexp from 'escape-string-regexp';
2
+ /**
3
+ * 根据域名模式列表生成正则表达式数组(通配符模式)
4
+ * 支持规则:
5
+ * 1. 通配符匹配 eg `*.example.com`(只匹配一级子域名,不包括根域名和多级子域名)
6
+ * 2. 精确匹配 eg `example.com`(仅匹配指定域名)
7
+ *
8
+ * @param patterns 域名模式列表
9
+ * @returns 正则表达式数组
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * const regexps = createDomainMatchers(['example.com', '*.example.com']);
14
+ * regexps[0].test('example.com'); // true - 精确匹配
15
+ * regexps[1].test('api.example.com'); // true - 通配符匹配一级子域名
16
+ * regexps[1].test('test.api.example.com'); // false - 不匹配多级子域名
17
+ * regexps[1].test('example.com'); // false - 不匹配根域名
18
+ * ```
19
+ */
20
+ export const createDomainMatchers = (patterns) => {
21
+ return patterns.map((pattern) => {
22
+ const trimmedPattern = pattern.trim();
23
+ // 通配符模式:*.example.com
24
+ // 只匹配一级子域名(如 api.example.com, www.example.com)
25
+ // 不匹配根域名(example.com)和多级子域名(test.api.example.com)
26
+ if (trimmedPattern.startsWith('*.')) {
27
+ const domain = trimmedPattern.slice(2); // 移除 *. 前缀
28
+ const escapedDomain = escapeRegexp(domain);
29
+ // 匹配:一个或多个非点字符(一级子域名)+ 点 + 域名
30
+ return new RegExp(`^[^.]+\\.${escapedDomain}$`, 'i');
31
+ }
32
+ // 精确匹配:example.com
33
+ // 仅匹配指定的域名
34
+ const escapedPattern = escapeRegexp(trimmedPattern);
35
+ return new RegExp(`^${escapedPattern}$`, 'i');
36
+ });
37
+ };
38
+ /**
39
+ * 根据域名模式列表生成正则表达式数组(传统模式,用于正向代理等场景)
40
+ * @TODO 需要存量用户跑完正向代理兼容后切换到通配符模式.
41
+ * 支持规则:
42
+ * 1. 完全匹配 eg `www.example.com`
43
+ * 2. 后缀匹配 eg `.example.com`(匹配所有子域名)
44
+ * 3. 前缀匹配 eg `172.168.0.`(主要用于 IP 地址匹配)
45
+ *
46
+ * @param patterns 域名模式列表
47
+ * @returns 正则表达式数组
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * const regexps = createLegacyDomainMatchers(['example.com', '.example.com']);
52
+ * regexps[0].test('example.com'); // true - 完全匹配
53
+ * regexps[1].test('api.example.com'); // true - 后缀匹配
54
+ * ```
55
+ */
56
+ export const createLegacyDomainMatchers = (patterns) => {
57
+ return patterns.map((pattern) => {
58
+ const lowerPattern = pattern.toLowerCase();
59
+ // 以 . 开头,生成后缀匹配正则(如 .example.com 匹配所有子域名)
60
+ if (lowerPattern.startsWith('.')) {
61
+ return new RegExp(`${escapeRegexp(pattern)}$`, 'i');
62
+ }
63
+ // 以 . 结尾,生成前缀匹配正则(如 172.168.0. 匹配 172.168.0.x)
64
+ if (lowerPattern.endsWith('.')) {
65
+ return new RegExp(`^${escapeRegexp(pattern)}`, 'i');
66
+ }
67
+ // 字符串完全匹配
68
+ return new RegExp(`^${escapeRegexp(pattern)}$`, 'i');
69
+ });
70
+ };
71
+ //# sourceMappingURL=domain.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../../src/utils/domain.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,sBAAsB,CAAC;AAEhD;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,QAAkB,EAAY,EAAE;IACjE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC5B,MAAM,cAAc,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAEtC,sBAAsB;QACtB,+CAA+C;QAC/C,kDAAkD;QAClD,IAAI,cAAc,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;YAClC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW;YACnD,MAAM,aAAa,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC3C,8BAA8B;YAC9B,OAAO,IAAI,MAAM,CAAC,YAAa,aAAc,GAAG,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;QAED,mBAAmB;QACnB,WAAW;QACX,MAAM,cAAc,GAAG,YAAY,CAAC,cAAc,CAAC,CAAC;QACpD,OAAO,IAAI,MAAM,CAAC,IAAK,cAAe,GAAG,EAAE,GAAG,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;AACP,CAAC,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,QAAkB,EAAY,EAAE;IACvE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC5B,MAAM,YAAY,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC;QAE3C,0CAA0C;QAC1C,IAAI,YAAY,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,MAAM,CAAC,GAAI,YAAY,CAAC,OAAO,CAAE,GAAG,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;QAED,+CAA+C;QAC/C,IAAI,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,MAAM,CAAC,IAAK,YAAY,CAAC,OAAO,CAAE,EAAE,EAAE,GAAG,CAAC,CAAC;QAC1D,CAAC;QAED,UAAU;QACV,OAAO,IAAI,MAAM,CAAC,IAAK,YAAY,CAAC,OAAO,CAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IAC3D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC"}
@@ -0,0 +1,7 @@
1
+ export * as IpRangeUtils from './ip.range';
2
+ export * as CommonUtils from './common';
3
+ export * as DomainUtils from './domain';
4
+ export * as TraceContextUtils from './trace.context';
5
+ // 导出 TraceContext 类供外部直接使用
6
+ export { TraceContext } from './trace.context';
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,WAAW,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,iBAAiB,MAAM,iBAAiB,CAAC;AAErD,2BAA2B;AAC3B,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
@@ -0,0 +1,187 @@
1
+ /**
2
+ * IP 地址范围工具
3
+ */
4
+ /**
5
+ * 将 IPv4 地址转换为数字
6
+ */
7
+ export function ipv4ToNumber(ip) {
8
+ const parts = ip.split('.');
9
+ return ((parseInt(parts[0], 10) << 24) +
10
+ (parseInt(parts[1], 10) << 16) +
11
+ (parseInt(parts[2], 10) << 8) +
12
+ parseInt(parts[3], 10)) >>> 0; // 无符号右移确保为正数
13
+ }
14
+ /**
15
+ * 预编译 IPv4 CIDR 范围
16
+ * @param cidr CIDR 表示法,如 "192.168.0.0/16"
17
+ */
18
+ export function compileIpv4Range(cidr) {
19
+ const [network, prefixStr] = cidr.split('/');
20
+ const prefix = parseInt(prefixStr, 10);
21
+ if (prefix < 0 || prefix > 32) {
22
+ throw new Error(`Invalid CIDR prefix: ${prefix}`);
23
+ }
24
+ const networkNum = ipv4ToNumber(network);
25
+ const mask = (0xffffffff << (32 - prefix)) >>> 0;
26
+ return {
27
+ network: networkNum & mask,
28
+ mask,
29
+ cidr
30
+ };
31
+ }
32
+ /**
33
+ * 检查 IPv4 地址是否在预编译的范围内(高性能版本)
34
+ * @param ip IP 地址
35
+ * @param compiledRange 预编译的范围
36
+ */
37
+ export function isIpv4InCompiledRange(ip, compiledRange) {
38
+ const ipNum = ipv4ToNumber(ip);
39
+ return (ipNum & compiledRange.mask) === compiledRange.network;
40
+ }
41
+ /**
42
+ * 将 IPv6 地址转换为 BigInt 数组(高 64 位和低 64 位)
43
+ */
44
+ export function ipv6ToBigInt(ip) {
45
+ // 标准化 IPv6 地址
46
+ const normalized = normalizeIpv6(ip);
47
+ const parts = normalized.split(':');
48
+ let high = BigInt(0);
49
+ let low = BigInt(0);
50
+ for (let i = 0; i < 4; i++) {
51
+ high = (high << BigInt(16)) | BigInt(parseInt(parts[i], 16));
52
+ }
53
+ for (let i = 4; i < 8; i++) {
54
+ low = (low << BigInt(16)) | BigInt(parseInt(parts[i], 16));
55
+ }
56
+ return [high, low];
57
+ }
58
+ /**
59
+ * 标准化 IPv6 地址(展开缩写)
60
+ */
61
+ export function normalizeIpv6(ip) {
62
+ // 移除区域 ID(如 fe80::1%eth0 中的 %eth0)
63
+ const cleaned = ip.split('%')[0];
64
+ // 处理 :: 缩写
65
+ const parts = cleaned.split(':');
66
+ const filled = [];
67
+ let doubleColonIndex = -1;
68
+ for (let i = 0; i < parts.length; i++) {
69
+ if (parts[i] === '') {
70
+ if (doubleColonIndex === -1) {
71
+ doubleColonIndex = i;
72
+ }
73
+ }
74
+ else {
75
+ filled.push(parts[i].padStart(4, '0'));
76
+ }
77
+ }
78
+ // 填充 :: 省略的部分
79
+ if (doubleColonIndex !== -1) {
80
+ const missing = 8 - filled.length;
81
+ const before = filled.slice(0, doubleColonIndex === 0 ? 0 : doubleColonIndex);
82
+ const after = filled.slice(doubleColonIndex === 0 ? 0 : doubleColonIndex);
83
+ const zeros = Array(missing).fill('0000');
84
+ return [...before, ...zeros, ...after].join(':');
85
+ }
86
+ return filled.join(':');
87
+ }
88
+ /**
89
+ * 预编译 IPv6 CIDR 范围
90
+ * @param cidr CIDR 表示法,如 "fe80::/10"
91
+ */
92
+ export function compileIpv6Range(cidr) {
93
+ const [network, prefixStr] = cidr.split('/');
94
+ const prefix = parseInt(prefixStr, 10);
95
+ if (prefix < 0 || prefix > 128) {
96
+ throw new Error(`Invalid IPv6 CIDR prefix: ${prefix}`);
97
+ }
98
+ const [netHigh, netLow] = ipv6ToBigInt(network);
99
+ let maskHigh;
100
+ let maskLow;
101
+ if (prefix <= 64) {
102
+ // 只需要掩码高 64 位
103
+ maskHigh = (BigInt(0xffffffffffffffffn) << BigInt(64 - prefix)) & BigInt(0xffffffffffffffffn);
104
+ maskLow = BigInt(0);
105
+ }
106
+ else {
107
+ // 高 64 位全部掩码,低 64 位部分掩码
108
+ maskHigh = BigInt(0xffffffffffffffffn);
109
+ maskLow = (BigInt(0xffffffffffffffffn) << BigInt(128 - prefix)) & BigInt(0xffffffffffffffffn);
110
+ }
111
+ return {
112
+ networkHigh: netHigh & maskHigh,
113
+ networkLow: netLow & maskLow,
114
+ maskHigh,
115
+ maskLow,
116
+ prefix,
117
+ cidr
118
+ };
119
+ }
120
+ /**
121
+ * 检查 IPv6 地址是否在预编译的范围内(高性能版本)
122
+ * @param ip IPv6 地址
123
+ * @param compiledRange 预编译的范围
124
+ */
125
+ export function isIpv6InCompiledRange(ip, compiledRange) {
126
+ const [ipHigh, ipLow] = ipv6ToBigInt(ip);
127
+ if (compiledRange.prefix <= 64) {
128
+ // 只需要比较高 64 位
129
+ return (ipHigh & compiledRange.maskHigh) === compiledRange.networkHigh;
130
+ }
131
+ else {
132
+ // 高 64 位必须完全匹配,低 64 位部分匹配
133
+ return (ipHigh & compiledRange.maskHigh) === compiledRange.networkHigh &&
134
+ (ipLow & compiledRange.maskLow) === compiledRange.networkLow;
135
+ }
136
+ }
137
+ /**
138
+ * 批量预编译 IPv4 CIDR 范围列表
139
+ * @param cidrs CIDR 范围列表
140
+ */
141
+ export function compileIpv4Ranges(cidrs) {
142
+ return cidrs.map(cidr => compileIpv4Range(cidr));
143
+ }
144
+ /**
145
+ * 批量预编译 IPv6 CIDR 范围列表
146
+ * @param cidrs CIDR 范围列表
147
+ */
148
+ export function compileIpv6Ranges(cidrs) {
149
+ return cidrs.map(cidr => compileIpv6Range(cidr));
150
+ }
151
+ /**
152
+ * 检查 IPv4 地址是否匹配任一预编译范围(高性能版本)
153
+ * @param ip IPv4 地址
154
+ * @param compiledRanges 预编译的范围列表
155
+ */
156
+ export function isIpv4InAnyCompiledRange(ip, compiledRanges) {
157
+ const ipNum = ipv4ToNumber(ip);
158
+ for (const range of compiledRanges) {
159
+ if ((ipNum & range.mask) === range.network) {
160
+ return true;
161
+ }
162
+ }
163
+ return false;
164
+ }
165
+ /**
166
+ * 检查 IPv6 地址是否匹配任一预编译范围(高性能版本)
167
+ * @param ip IPv6 地址
168
+ * @param compiledRanges 预编译的范围列表
169
+ */
170
+ export function isIpv6InAnyCompiledRange(ip, compiledRanges) {
171
+ const [ipHigh, ipLow] = ipv6ToBigInt(ip);
172
+ for (const range of compiledRanges) {
173
+ if (range.prefix <= 64) {
174
+ if ((ipHigh & range.maskHigh) === range.networkHigh) {
175
+ return true;
176
+ }
177
+ }
178
+ else {
179
+ if ((ipHigh & range.maskHigh) === range.networkHigh &&
180
+ (ipLow & range.maskLow) === range.networkLow) {
181
+ return true;
182
+ }
183
+ }
184
+ }
185
+ return false;
186
+ }
187
+ //# sourceMappingURL=ip.range.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip.range.js","sourceRoot":"","sources":["../../../src/utils/ip.range.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,199 @@
1
+ /**
2
+ * W3C Trace Context 工具
3
+ * 实现 W3C Trace Context 规范:https://www.w3.org/TR/trace-context/
4
+ */
5
+ import { TraceFlags } from '../types';
6
+ /**
7
+ * 生成随机十六进制字符串
8
+ * @param length 字符串长度
9
+ * @returns 十六进制字符串
10
+ */
11
+ function generateRandomHex(length) {
12
+ const bytes = Math.ceil(length / 2);
13
+ const buffer = new Uint8Array(bytes);
14
+ if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
15
+ crypto.getRandomValues(buffer);
16
+ }
17
+ else {
18
+ // Fallback for Node.js environment
19
+ for (let i = 0; i < bytes; i++) {
20
+ buffer[i] = Math.floor(Math.random() * 256);
21
+ }
22
+ }
23
+ return Array.from(buffer)
24
+ .map(b => b.toString(16).padStart(2, '0'))
25
+ .join('')
26
+ .slice(0, length);
27
+ }
28
+ /**
29
+ * 生成符合 W3C 规范的 Trace ID(32位十六进制)
30
+ * @returns Trace ID
31
+ */
32
+ export function generateTraceId() {
33
+ return generateRandomHex(32);
34
+ }
35
+ /**
36
+ * 生成符合 W3C 规范的 Span ID(16位十六进制)
37
+ * @returns Span ID
38
+ */
39
+ export function generateSpanId() {
40
+ return generateRandomHex(16);
41
+ }
42
+ /**
43
+ * 验证 Trace ID 格式
44
+ * @param traceId Trace ID
45
+ * @returns 是否有效
46
+ */
47
+ export function isValidTraceId(traceId) {
48
+ // Trace ID 必须是32位十六进制字符串,且不能全为0
49
+ return /^[0-9a-f]{32}$/i.test(traceId) && traceId !== '00000000000000000000000000000000';
50
+ }
51
+ /**
52
+ * 验证 Span ID 格式
53
+ * @param spanId Span ID
54
+ * @returns 是否有效
55
+ */
56
+ export function isValidSpanId(spanId) {
57
+ // Span ID 必须是16位十六进制字符串,且不能全为0
58
+ return /^[0-9a-f]{16}$/i.test(spanId) && spanId !== '0000000000000000';
59
+ }
60
+ /**
61
+ * 验证 Trace Flags 格式
62
+ * @param flags Trace Flags
63
+ * @returns 是否有效
64
+ */
65
+ export function isValidTraceFlags(flags) {
66
+ // Trace Flags 必须是2位十六进制字符串
67
+ return /^[0-9a-f]{2}$/i.test(flags);
68
+ }
69
+ /**
70
+ * 生成 traceparent 头值
71
+ * @param options 生成选项
72
+ * @returns traceparent 字符串
73
+ */
74
+ export function generateTraceParent(options = {}) {
75
+ const traceId = options.traceId || generateTraceId();
76
+ const parentId = options.parentId || generateSpanId();
77
+ const sampled = options.sampled !== false;
78
+ const traceFlags = sampled ? '01' : '00';
79
+ // 验证参数
80
+ if (!isValidTraceId(traceId)) {
81
+ throw new Error(`Invalid trace ID: ${traceId}. Must be 32 hex characters and not all zeros.`);
82
+ }
83
+ if (!isValidSpanId(parentId)) {
84
+ throw new Error(`Invalid span ID: ${parentId}. Must be 16 hex characters and not all zeros.`);
85
+ }
86
+ return `00-${traceId}-${parentId}-${traceFlags}`;
87
+ }
88
+ /**
89
+ * 解析 traceparent 头值
90
+ * @param traceparent traceparent 字符串
91
+ * @returns 解析后的对象,解析失败返回 null
92
+ */
93
+ export function parseTraceParent(traceparent) {
94
+ if (!traceparent || typeof traceparent !== 'string') {
95
+ return null;
96
+ }
97
+ // 规范格式:version-trace-id-parent-id-trace-flags
98
+ const parts = traceparent.trim().split('-');
99
+ if (parts.length !== 4) {
100
+ return null;
101
+ }
102
+ const [version, traceId, parentId, traceFlags] = parts;
103
+ // 验证版本号(当前只支持 00)
104
+ if (version !== '00') {
105
+ return null;
106
+ }
107
+ // 验证各部分格式
108
+ if (!isValidTraceId(traceId) || !isValidSpanId(parentId) || !isValidTraceFlags(traceFlags)) {
109
+ return null;
110
+ }
111
+ return {
112
+ version,
113
+ traceId: traceId.toLowerCase(),
114
+ parentId: parentId.toLowerCase(),
115
+ traceFlags: traceFlags.toLowerCase()
116
+ };
117
+ }
118
+ /**
119
+ * 验证 traceparent 头值是否符合规范
120
+ * @param traceparent traceparent 字符串
121
+ * @returns 是否有效
122
+ */
123
+ export function isValidTraceParent(traceparent) {
124
+ return parseTraceParent(traceparent) !== null;
125
+ }
126
+ /**
127
+ * 从现有 traceparent 创建子 span
128
+ * @param parentTraceParent 父级 traceparent 字符串
129
+ * @param sampled 是否采样(不提供则继承父级)
130
+ * @returns 新的 traceparent 字符串
131
+ */
132
+ export function createChildSpan(parentTraceParent, sampled) {
133
+ const parsed = parseTraceParent(parentTraceParent);
134
+ if (!parsed) {
135
+ throw new Error(`Invalid parent traceparent: ${parentTraceParent}`);
136
+ }
137
+ // 继承 trace ID,生成新的 span ID
138
+ const newSpanId = generateSpanId();
139
+ // 继承或指定采样标志
140
+ const parentSampled = parseInt(parsed.traceFlags, 16) & TraceFlags.SAMPLED;
141
+ const newSampled = sampled !== undefined ? sampled : !!parentSampled;
142
+ const newFlags = newSampled ? '01' : '00';
143
+ return `00-${parsed.traceId}-${newSpanId}-${newFlags}`;
144
+ }
145
+ /**
146
+ * 检查 traceparent 是否已采样
147
+ * @param traceparent traceparent 字符串
148
+ * @returns 是否采样
149
+ */
150
+ export function isSampled(traceparent) {
151
+ const parsed = parseTraceParent(traceparent);
152
+ if (!parsed) {
153
+ return false;
154
+ }
155
+ const flags = parseInt(parsed.traceFlags, 16);
156
+ return !!(flags & TraceFlags.SAMPLED);
157
+ }
158
+ /**
159
+ * Trace Context 工具类
160
+ */
161
+ export class TraceContext {
162
+ /**
163
+ * 生成 traceparent
164
+ */
165
+ static { this.generate = generateTraceParent; }
166
+ /**
167
+ * 解析 traceparent
168
+ */
169
+ static { this.parse = parseTraceParent; }
170
+ /**
171
+ * 验证 traceparent
172
+ */
173
+ static { this.isValid = isValidTraceParent; }
174
+ /**
175
+ * 创建子 span
176
+ */
177
+ static { this.createChild = createChildSpan; }
178
+ /**
179
+ * 检查是否采样
180
+ */
181
+ static { this.isSampled = isSampled; }
182
+ /**
183
+ * 生成 Trace ID
184
+ */
185
+ static { this.generateTraceId = generateTraceId; }
186
+ /**
187
+ * 生成 Span ID
188
+ */
189
+ static { this.generateSpanId = generateSpanId; }
190
+ /**
191
+ * 验证 Trace ID
192
+ */
193
+ static { this.isValidTraceId = isValidTraceId; }
194
+ /**
195
+ * 验证 Span ID
196
+ */
197
+ static { this.isValidSpanId = isValidSpanId; }
198
+ }
199
+ //# sourceMappingURL=trace.context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.context.js","sourceRoot":"","sources":["../../../src/utils/trace.context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAMH,OAAO,EACH,UAAU,EACb,MAAM,UAAU,CAAC;AAElB;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,MAAc;IACrC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACpC,MAAM,MAAM,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,CAAC;IAErC,IAAI,OAAO,MAAM,KAAK,WAAW,IAAI,MAAM,CAAC,eAAe,EAAE,CAAC;QAC1D,MAAM,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;SAAM,CAAC;QACJ,mCAAmC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC7B,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,CAAC,CAAC;QAChD,CAAC;IACL,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC;SACpB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;SACzC,IAAI,CAAC,EAAE,CAAC;SACR,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAC1B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,eAAe;IAC3B,OAAO,iBAAiB,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc;IAC1B,OAAO,iBAAiB,CAAC,EAAE,CAAC,CAAC;AACjC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe;IAC1C,gCAAgC;IAChC,OAAO,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,kCAAkC,CAAC;AAC7F,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc;IACxC,+BAA+B;IAC/B,OAAO,iBAAiB,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,MAAM,KAAK,kBAAkB,CAAC;AAC3E,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAa;IAC3C,2BAA2B;IAC3B,OAAO,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CAAC,UAA8B,EAAE;IAChE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,eAAe,EAAE,CAAC;IACrD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,cAAc,EAAE,CAAC;IACtD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,KAAK,KAAK,CAAC;IAC1C,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAEzC,OAAO;IACP,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,qBAAsB,OAAQ,gDAAgD,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,KAAK,CAAC,oBAAqB,QAAS,gDAAgD,CAAC,CAAC;IACpG,CAAC;IAED,OAAO,MAAO,OAAQ,IAAK,QAAS,IAAK,UAAW,EAAE,CAAC;AAC3D,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,gBAAgB,CAAC,WAAmB;IAChD,IAAI,CAAC,WAAW,IAAI,OAAO,WAAW,KAAK,QAAQ,EAAE,CAAC;QAClD,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,8CAA8C;IAC9C,MAAM,KAAK,GAAG,WAAW,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAE5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,CAAC,GAAG,KAAK,CAAC;IAEvD,kBAAkB;IAClB,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,UAAU;IACV,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,EAAE,CAAC;QACzF,OAAO,IAAI,CAAC;IAChB,CAAC;IAED,OAAO;QACH,OAAO;QACP,OAAO,EAAE,OAAO,CAAC,WAAW,EAAE;QAC9B,QAAQ,EAAE,QAAQ,CAAC,WAAW,EAAE;QAChC,UAAU,EAAE,UAAU,CAAC,WAAW,EAAE;KACvC,CAAC;AACN,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,kBAAkB,CAAC,WAAmB;IAClD,OAAO,gBAAgB,CAAC,WAAW,CAAC,KAAK,IAAI,CAAC;AAClD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,iBAAyB,EAAE,OAAiB;IACxE,MAAM,MAAM,GAAG,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;IAEnD,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,MAAM,IAAI,KAAK,CAAC,+BAAgC,iBAAkB,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,2BAA2B;IAC3B,MAAM,SAAS,GAAG,cAAc,EAAE,CAAC;IAEnC,YAAY;IACZ,MAAM,aAAa,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,GAAG,UAAU,CAAC,OAAO,CAAC;IAC3E,MAAM,UAAU,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC;IACrE,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1C,OAAO,MAAO,MAAM,CAAC,OAAQ,IAAK,SAAU,IAAK,QAAS,EAAE,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,WAAmB;IACzC,MAAM,MAAM,GAAG,gBAAgB,CAAC,WAAW,CAAC,CAAC;IAC7C,IAAI,CAAC,MAAM,EAAE,CAAC;QACV,OAAO,KAAK,CAAC;IACjB,CAAC;IAED,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC9C,OAAO,CAAC,CAAC,CAAC,KAAK,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC;AAC1C,CAAC;AAED;;GAEG;AACH,MAAM,OAAO,YAAY;IACrB;;OAEG;aACW,aAAQ,GAAG,mBAAmB,CAAC;IAE7C;;OAEG;aACW,UAAK,GAAG,gBAAgB,CAAC;IAEvC;;OAEG;aACW,YAAO,GAAG,kBAAkB,CAAC;IAE3C;;OAEG;aACW,gBAAW,GAAG,eAAe,CAAC;IAE5C;;OAEG;aACW,cAAS,GAAG,SAAS,CAAC;IAEpC;;OAEG;aACW,oBAAe,GAAG,eAAe,CAAC;IAEhD;;OAEG;aACW,mBAAc,GAAG,cAAc,CAAC;IAE9C;;OAEG;aACW,mBAAc,GAAG,cAAc,CAAC;IAE9C;;OAEG;aACW,kBAAa,GAAG,aAAa,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Axios 适配器实现
3
+ */
4
+ import type { HttpRequestOptions, HttpResponse } from '../types';
5
+ import { BaseHttpAdapter } from './base';
6
+ import { EClientAdapter } from '../const';
7
+ /**
8
+ * Axios 适配器
9
+ */
10
+ export declare class AxiosAdapter extends BaseHttpAdapter {
11
+ readonly name: EClientAdapter.axios;
12
+ /**
13
+ * 检查 Axios 是否可用
14
+ */
15
+ isAvailable(): boolean;
16
+ /**
17
+ * 发送请求
18
+ * @param options 请求选项
19
+ */
20
+ protected sendRequest<T>(options: HttpRequestOptions): Promise<HttpResponse<T>>;
21
+ /**
22
+ * 构建 Axios 配置
23
+ * @param options 请求选项
24
+ * @param url 完整 URL
25
+ */
26
+ private buildAxiosConfig;
27
+ /**
28
+ * 配置 Axios 代理
29
+ * @param axiosConfig Axios 配置对象
30
+ * @param options 请求选项
31
+ */
32
+ private configureAxiosProxy;
33
+ /**
34
+ * 应用正向代理配置
35
+ * @param axiosConfig Axios 配置对象
36
+ * @param forwardProxyMeta 正向代理元数据
37
+ */
38
+ private applyForwardProxy;
39
+ /**
40
+ * 处理 Axios 错误
41
+ * @param error 错误对象
42
+ * @param options 请求选项
43
+ */
44
+ private handleAxiosError;
45
+ /**
46
+ * 构建代理配置
47
+ * @param proxy 代理配置
48
+ */
49
+ private buildProxyConfig;
50
+ }
51
+ //# sourceMappingURL=axios.adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axios.adapter.d.ts","sourceRoot":"","sources":["../../../src/adapter/axios.adapter.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,kBAAkB,EAClB,YAAY,EAEf,MAAM,UAAU,CAAC;AAElB,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAC;AAQzC,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAG1C;;GAEG;AACH,qBAAa,YAAa,SAAQ,eAAe;IAC7C,SAAgB,IAAI,uBAAiC;IAErD;;OAEG;IACI,WAAW,IAAI,OAAO;IAI7B;;;OAGG;cACa,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAmCrF;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA+BxB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAgB3B;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAwCzB;;;;OAIG;IACH,OAAO,CAAC,gBAAgB;IA0BxB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;CAgB3B"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * HTTP 适配器基础实现
3
+ */
4
+ import type { IHttpAdapter, HttpRequestOptions, HttpResponse, RequestConfig, SecurityConfig, ILogger } from '../types';
5
+ import type { EClientAdapter } from '../const';
6
+ /**
7
+ * HTTP 适配器抽象基类
8
+ */
9
+ export declare abstract class BaseHttpAdapter implements IHttpAdapter {
10
+ protected requestConfig: RequestConfig;
11
+ protected securityConfig: SecurityConfig;
12
+ protected logger?: ILogger;
13
+ constructor(requestConfig: RequestConfig, securityConfig: SecurityConfig, logger?: ILogger);
14
+ abstract readonly name: EClientAdapter;
15
+ /**
16
+ * 发送 HTTP 请求(由子类实现)
17
+ * @param options 请求选项
18
+ */
19
+ protected abstract sendRequest<T>(options: HttpRequestOptions): Promise<HttpResponse<T>>;
20
+ /**
21
+ * 检查适配器是否可用
22
+ */
23
+ abstract isAvailable(): boolean;
24
+ /**
25
+ * 发送请求(带重试机制)
26
+ * @param options 请求选项
27
+ */
28
+ request<T = any>(options: HttpRequestOptions): Promise<HttpResponse<T>>;
29
+ /**
30
+ * 更新请求配置
31
+ * @param config 新的请求配置
32
+ */
33
+ updateConfig(config: Partial<RequestConfig>): void;
34
+ /**
35
+ * 设置日志记录器
36
+ * @param logger 日志记录器
37
+ */
38
+ setLogger(logger: ILogger): void;
39
+ /**
40
+ * 构建查询字符串
41
+ * @param params 查询参数
42
+ */
43
+ protected buildQueryString(params?: Record<string, string | number | boolean>): string;
44
+ /**
45
+ * 构建完整 URL
46
+ * @param url 基础 URL
47
+ * @param params 查询参数
48
+ */
49
+ protected buildUrl(url: string, params?: Record<string, string | number | boolean>): string;
50
+ /**
51
+ * 标准化响应头
52
+ * @param headers 原始响应头
53
+ */
54
+ protected normalizeHeaders(headers: any): Record<string, string>;
55
+ }
56
+ //# sourceMappingURL=base.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.d.ts","sourceRoot":"","sources":["../../../src/adapter/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,YAAY,EACZ,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,cAAc,EACd,OAAO,EACV,MAAM,UAAU,CAAC;AAElB,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;GAEG;AACH,8BAAsB,eAAgB,YAAW,YAAY;IACzD,SAAS,CAAC,aAAa,EAAE,aAAa,CAAC;IACvC,SAAS,CAAC,cAAc,EAAE,cAAc,CAAC;IACzC,SAAS,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC;gBAEf,aAAa,EAAE,aAAa,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,CAAC,EAAE,OAAO;IAM1F,kBAAyB,IAAI,EAAE,cAAc,CAAC;IAE9C;;;OAGG;IACH,SAAS,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IAExF;;OAEG;aACa,WAAW,IAAI,OAAO;IAEtC;;;OAGG;IACU,OAAO,CAAC,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;IA8DpF;;;OAGG;IACI,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAIzD;;;OAGG;IACI,SAAS,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI;IAIvC;;;OAGG;IACH,SAAS,CAAC,gBAAgB,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM;IAatF;;;;OAIG;IACH,SAAS,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,GAAG,MAAM;IAU3F;;;OAGG;IACH,SAAS,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAkBnE"}
@@ -0,0 +1,4 @@
1
+ export * from './base';
2
+ export * from './axios.adapter';
3
+ export * from './undici.adapter';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/adapter/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,iBAAiB,CAAC;AAChC,cAAc,kBAAkB,CAAC"}