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,200 @@
1
+ "use strict";
2
+ /**
3
+ * IP 地址范围工具
4
+ */
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ipv4ToNumber = ipv4ToNumber;
7
+ exports.compileIpv4Range = compileIpv4Range;
8
+ exports.isIpv4InCompiledRange = isIpv4InCompiledRange;
9
+ exports.ipv6ToBigInt = ipv6ToBigInt;
10
+ exports.normalizeIpv6 = normalizeIpv6;
11
+ exports.compileIpv6Range = compileIpv6Range;
12
+ exports.isIpv6InCompiledRange = isIpv6InCompiledRange;
13
+ exports.compileIpv4Ranges = compileIpv4Ranges;
14
+ exports.compileIpv6Ranges = compileIpv6Ranges;
15
+ exports.isIpv4InAnyCompiledRange = isIpv4InAnyCompiledRange;
16
+ exports.isIpv6InAnyCompiledRange = isIpv6InAnyCompiledRange;
17
+ /**
18
+ * 将 IPv4 地址转换为数字
19
+ */
20
+ function ipv4ToNumber(ip) {
21
+ const parts = ip.split('.');
22
+ return ((parseInt(parts[0], 10) << 24) +
23
+ (parseInt(parts[1], 10) << 16) +
24
+ (parseInt(parts[2], 10) << 8) +
25
+ parseInt(parts[3], 10)) >>> 0; // 无符号右移确保为正数
26
+ }
27
+ /**
28
+ * 预编译 IPv4 CIDR 范围
29
+ * @param cidr CIDR 表示法,如 "192.168.0.0/16"
30
+ */
31
+ function compileIpv4Range(cidr) {
32
+ const [network, prefixStr] = cidr.split('/');
33
+ const prefix = parseInt(prefixStr, 10);
34
+ if (prefix < 0 || prefix > 32) {
35
+ throw new Error(`Invalid CIDR prefix: ${prefix}`);
36
+ }
37
+ const networkNum = ipv4ToNumber(network);
38
+ const mask = (0xffffffff << (32 - prefix)) >>> 0;
39
+ return {
40
+ network: networkNum & mask,
41
+ mask,
42
+ cidr
43
+ };
44
+ }
45
+ /**
46
+ * 检查 IPv4 地址是否在预编译的范围内(高性能版本)
47
+ * @param ip IP 地址
48
+ * @param compiledRange 预编译的范围
49
+ */
50
+ function isIpv4InCompiledRange(ip, compiledRange) {
51
+ const ipNum = ipv4ToNumber(ip);
52
+ return (ipNum & compiledRange.mask) === compiledRange.network;
53
+ }
54
+ /**
55
+ * 将 IPv6 地址转换为 BigInt 数组(高 64 位和低 64 位)
56
+ */
57
+ function ipv6ToBigInt(ip) {
58
+ // 标准化 IPv6 地址
59
+ const normalized = normalizeIpv6(ip);
60
+ const parts = normalized.split(':');
61
+ let high = BigInt(0);
62
+ let low = BigInt(0);
63
+ for (let i = 0; i < 4; i++) {
64
+ high = (high << BigInt(16)) | BigInt(parseInt(parts[i], 16));
65
+ }
66
+ for (let i = 4; i < 8; i++) {
67
+ low = (low << BigInt(16)) | BigInt(parseInt(parts[i], 16));
68
+ }
69
+ return [high, low];
70
+ }
71
+ /**
72
+ * 标准化 IPv6 地址(展开缩写)
73
+ */
74
+ function normalizeIpv6(ip) {
75
+ // 移除区域 ID(如 fe80::1%eth0 中的 %eth0)
76
+ const cleaned = ip.split('%')[0];
77
+ // 处理 :: 缩写
78
+ const parts = cleaned.split(':');
79
+ const filled = [];
80
+ let doubleColonIndex = -1;
81
+ for (let i = 0; i < parts.length; i++) {
82
+ if (parts[i] === '') {
83
+ if (doubleColonIndex === -1) {
84
+ doubleColonIndex = i;
85
+ }
86
+ }
87
+ else {
88
+ filled.push(parts[i].padStart(4, '0'));
89
+ }
90
+ }
91
+ // 填充 :: 省略的部分
92
+ if (doubleColonIndex !== -1) {
93
+ const missing = 8 - filled.length;
94
+ const before = filled.slice(0, doubleColonIndex === 0 ? 0 : doubleColonIndex);
95
+ const after = filled.slice(doubleColonIndex === 0 ? 0 : doubleColonIndex);
96
+ const zeros = Array(missing).fill('0000');
97
+ return [...before, ...zeros, ...after].join(':');
98
+ }
99
+ return filled.join(':');
100
+ }
101
+ /**
102
+ * 预编译 IPv6 CIDR 范围
103
+ * @param cidr CIDR 表示法,如 "fe80::/10"
104
+ */
105
+ function compileIpv6Range(cidr) {
106
+ const [network, prefixStr] = cidr.split('/');
107
+ const prefix = parseInt(prefixStr, 10);
108
+ if (prefix < 0 || prefix > 128) {
109
+ throw new Error(`Invalid IPv6 CIDR prefix: ${prefix}`);
110
+ }
111
+ const [netHigh, netLow] = ipv6ToBigInt(network);
112
+ let maskHigh;
113
+ let maskLow;
114
+ if (prefix <= 64) {
115
+ // 只需要掩码高 64 位
116
+ maskHigh = (BigInt(0xffffffffffffffffn) << BigInt(64 - prefix)) & BigInt(0xffffffffffffffffn);
117
+ maskLow = BigInt(0);
118
+ }
119
+ else {
120
+ // 高 64 位全部掩码,低 64 位部分掩码
121
+ maskHigh = BigInt(0xffffffffffffffffn);
122
+ maskLow = (BigInt(0xffffffffffffffffn) << BigInt(128 - prefix)) & BigInt(0xffffffffffffffffn);
123
+ }
124
+ return {
125
+ networkHigh: netHigh & maskHigh,
126
+ networkLow: netLow & maskLow,
127
+ maskHigh,
128
+ maskLow,
129
+ prefix,
130
+ cidr
131
+ };
132
+ }
133
+ /**
134
+ * 检查 IPv6 地址是否在预编译的范围内(高性能版本)
135
+ * @param ip IPv6 地址
136
+ * @param compiledRange 预编译的范围
137
+ */
138
+ function isIpv6InCompiledRange(ip, compiledRange) {
139
+ const [ipHigh, ipLow] = ipv6ToBigInt(ip);
140
+ if (compiledRange.prefix <= 64) {
141
+ // 只需要比较高 64 位
142
+ return (ipHigh & compiledRange.maskHigh) === compiledRange.networkHigh;
143
+ }
144
+ else {
145
+ // 高 64 位必须完全匹配,低 64 位部分匹配
146
+ return (ipHigh & compiledRange.maskHigh) === compiledRange.networkHigh &&
147
+ (ipLow & compiledRange.maskLow) === compiledRange.networkLow;
148
+ }
149
+ }
150
+ /**
151
+ * 批量预编译 IPv4 CIDR 范围列表
152
+ * @param cidrs CIDR 范围列表
153
+ */
154
+ function compileIpv4Ranges(cidrs) {
155
+ return cidrs.map(cidr => compileIpv4Range(cidr));
156
+ }
157
+ /**
158
+ * 批量预编译 IPv6 CIDR 范围列表
159
+ * @param cidrs CIDR 范围列表
160
+ */
161
+ function compileIpv6Ranges(cidrs) {
162
+ return cidrs.map(cidr => compileIpv6Range(cidr));
163
+ }
164
+ /**
165
+ * 检查 IPv4 地址是否匹配任一预编译范围(高性能版本)
166
+ * @param ip IPv4 地址
167
+ * @param compiledRanges 预编译的范围列表
168
+ */
169
+ function isIpv4InAnyCompiledRange(ip, compiledRanges) {
170
+ const ipNum = ipv4ToNumber(ip);
171
+ for (const range of compiledRanges) {
172
+ if ((ipNum & range.mask) === range.network) {
173
+ return true;
174
+ }
175
+ }
176
+ return false;
177
+ }
178
+ /**
179
+ * 检查 IPv6 地址是否匹配任一预编译范围(高性能版本)
180
+ * @param ip IPv6 地址
181
+ * @param compiledRanges 预编译的范围列表
182
+ */
183
+ function isIpv6InAnyCompiledRange(ip, compiledRanges) {
184
+ const [ipHigh, ipLow] = ipv6ToBigInt(ip);
185
+ for (const range of compiledRanges) {
186
+ if (range.prefix <= 64) {
187
+ if ((ipHigh & range.maskHigh) === range.networkHigh) {
188
+ return true;
189
+ }
190
+ }
191
+ else {
192
+ if ((ipHigh & range.maskHigh) === range.networkHigh &&
193
+ (ipLow & range.maskLow) === range.networkLow) {
194
+ return true;
195
+ }
196
+ }
197
+ }
198
+ return false;
199
+ }
200
+ //# 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,213 @@
1
+ "use strict";
2
+ /**
3
+ * W3C Trace Context 工具
4
+ * 实现 W3C Trace Context 规范:https://www.w3.org/TR/trace-context/
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.TraceContext = void 0;
8
+ exports.generateTraceId = generateTraceId;
9
+ exports.generateSpanId = generateSpanId;
10
+ exports.isValidTraceId = isValidTraceId;
11
+ exports.isValidSpanId = isValidSpanId;
12
+ exports.isValidTraceFlags = isValidTraceFlags;
13
+ exports.generateTraceParent = generateTraceParent;
14
+ exports.parseTraceParent = parseTraceParent;
15
+ exports.isValidTraceParent = isValidTraceParent;
16
+ exports.createChildSpan = createChildSpan;
17
+ exports.isSampled = isSampled;
18
+ const types_1 = require("../types");
19
+ /**
20
+ * 生成随机十六进制字符串
21
+ * @param length 字符串长度
22
+ * @returns 十六进制字符串
23
+ */
24
+ function generateRandomHex(length) {
25
+ const bytes = Math.ceil(length / 2);
26
+ const buffer = new Uint8Array(bytes);
27
+ if (typeof crypto !== 'undefined' && crypto.getRandomValues) {
28
+ crypto.getRandomValues(buffer);
29
+ }
30
+ else {
31
+ // Fallback for Node.js environment
32
+ for (let i = 0; i < bytes; i++) {
33
+ buffer[i] = Math.floor(Math.random() * 256);
34
+ }
35
+ }
36
+ return Array.from(buffer)
37
+ .map(b => b.toString(16).padStart(2, '0'))
38
+ .join('')
39
+ .slice(0, length);
40
+ }
41
+ /**
42
+ * 生成符合 W3C 规范的 Trace ID(32位十六进制)
43
+ * @returns Trace ID
44
+ */
45
+ function generateTraceId() {
46
+ return generateRandomHex(32);
47
+ }
48
+ /**
49
+ * 生成符合 W3C 规范的 Span ID(16位十六进制)
50
+ * @returns Span ID
51
+ */
52
+ function generateSpanId() {
53
+ return generateRandomHex(16);
54
+ }
55
+ /**
56
+ * 验证 Trace ID 格式
57
+ * @param traceId Trace ID
58
+ * @returns 是否有效
59
+ */
60
+ function isValidTraceId(traceId) {
61
+ // Trace ID 必须是32位十六进制字符串,且不能全为0
62
+ return /^[0-9a-f]{32}$/i.test(traceId) && traceId !== '00000000000000000000000000000000';
63
+ }
64
+ /**
65
+ * 验证 Span ID 格式
66
+ * @param spanId Span ID
67
+ * @returns 是否有效
68
+ */
69
+ function isValidSpanId(spanId) {
70
+ // Span ID 必须是16位十六进制字符串,且不能全为0
71
+ return /^[0-9a-f]{16}$/i.test(spanId) && spanId !== '0000000000000000';
72
+ }
73
+ /**
74
+ * 验证 Trace Flags 格式
75
+ * @param flags Trace Flags
76
+ * @returns 是否有效
77
+ */
78
+ function isValidTraceFlags(flags) {
79
+ // Trace Flags 必须是2位十六进制字符串
80
+ return /^[0-9a-f]{2}$/i.test(flags);
81
+ }
82
+ /**
83
+ * 生成 traceparent 头值
84
+ * @param options 生成选项
85
+ * @returns traceparent 字符串
86
+ */
87
+ function generateTraceParent(options = {}) {
88
+ const traceId = options.traceId || generateTraceId();
89
+ const parentId = options.parentId || generateSpanId();
90
+ const sampled = options.sampled !== false;
91
+ const traceFlags = sampled ? '01' : '00';
92
+ // 验证参数
93
+ if (!isValidTraceId(traceId)) {
94
+ throw new Error(`Invalid trace ID: ${traceId}. Must be 32 hex characters and not all zeros.`);
95
+ }
96
+ if (!isValidSpanId(parentId)) {
97
+ throw new Error(`Invalid span ID: ${parentId}. Must be 16 hex characters and not all zeros.`);
98
+ }
99
+ return `00-${traceId}-${parentId}-${traceFlags}`;
100
+ }
101
+ /**
102
+ * 解析 traceparent 头值
103
+ * @param traceparent traceparent 字符串
104
+ * @returns 解析后的对象,解析失败返回 null
105
+ */
106
+ function parseTraceParent(traceparent) {
107
+ if (!traceparent || typeof traceparent !== 'string') {
108
+ return null;
109
+ }
110
+ // 规范格式:version-trace-id-parent-id-trace-flags
111
+ const parts = traceparent.trim().split('-');
112
+ if (parts.length !== 4) {
113
+ return null;
114
+ }
115
+ const [version, traceId, parentId, traceFlags] = parts;
116
+ // 验证版本号(当前只支持 00)
117
+ if (version !== '00') {
118
+ return null;
119
+ }
120
+ // 验证各部分格式
121
+ if (!isValidTraceId(traceId) || !isValidSpanId(parentId) || !isValidTraceFlags(traceFlags)) {
122
+ return null;
123
+ }
124
+ return {
125
+ version,
126
+ traceId: traceId.toLowerCase(),
127
+ parentId: parentId.toLowerCase(),
128
+ traceFlags: traceFlags.toLowerCase()
129
+ };
130
+ }
131
+ /**
132
+ * 验证 traceparent 头值是否符合规范
133
+ * @param traceparent traceparent 字符串
134
+ * @returns 是否有效
135
+ */
136
+ function isValidTraceParent(traceparent) {
137
+ return parseTraceParent(traceparent) !== null;
138
+ }
139
+ /**
140
+ * 从现有 traceparent 创建子 span
141
+ * @param parentTraceParent 父级 traceparent 字符串
142
+ * @param sampled 是否采样(不提供则继承父级)
143
+ * @returns 新的 traceparent 字符串
144
+ */
145
+ function createChildSpan(parentTraceParent, sampled) {
146
+ const parsed = parseTraceParent(parentTraceParent);
147
+ if (!parsed) {
148
+ throw new Error(`Invalid parent traceparent: ${parentTraceParent}`);
149
+ }
150
+ // 继承 trace ID,生成新的 span ID
151
+ const newSpanId = generateSpanId();
152
+ // 继承或指定采样标志
153
+ const parentSampled = parseInt(parsed.traceFlags, 16) & types_1.TraceFlags.SAMPLED;
154
+ const newSampled = sampled !== undefined ? sampled : !!parentSampled;
155
+ const newFlags = newSampled ? '01' : '00';
156
+ return `00-${parsed.traceId}-${newSpanId}-${newFlags}`;
157
+ }
158
+ /**
159
+ * 检查 traceparent 是否已采样
160
+ * @param traceparent traceparent 字符串
161
+ * @returns 是否采样
162
+ */
163
+ function isSampled(traceparent) {
164
+ const parsed = parseTraceParent(traceparent);
165
+ if (!parsed) {
166
+ return false;
167
+ }
168
+ const flags = parseInt(parsed.traceFlags, 16);
169
+ return !!(flags & types_1.TraceFlags.SAMPLED);
170
+ }
171
+ /**
172
+ * Trace Context 工具类
173
+ */
174
+ class TraceContext {
175
+ /**
176
+ * 生成 traceparent
177
+ */
178
+ static { this.generate = generateTraceParent; }
179
+ /**
180
+ * 解析 traceparent
181
+ */
182
+ static { this.parse = parseTraceParent; }
183
+ /**
184
+ * 验证 traceparent
185
+ */
186
+ static { this.isValid = isValidTraceParent; }
187
+ /**
188
+ * 创建子 span
189
+ */
190
+ static { this.createChild = createChildSpan; }
191
+ /**
192
+ * 检查是否采样
193
+ */
194
+ static { this.isSampled = isSampled; }
195
+ /**
196
+ * 生成 Trace ID
197
+ */
198
+ static { this.generateTraceId = generateTraceId; }
199
+ /**
200
+ * 生成 Span ID
201
+ */
202
+ static { this.generateSpanId = generateSpanId; }
203
+ /**
204
+ * 验证 Trace ID
205
+ */
206
+ static { this.isValidTraceId = isValidTraceId; }
207
+ /**
208
+ * 验证 Span ID
209
+ */
210
+ static { this.isValidSpanId = isValidSpanId; }
211
+ }
212
+ exports.TraceContext = TraceContext;
213
+ //# sourceMappingURL=trace.context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trace.context.js","sourceRoot":"","sources":["../../../src/utils/trace.context.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Axios 适配器实现
3
+ */
4
+ import { HttpError } from '../types';
5
+ import { BaseHttpAdapter } from './base';
6
+ import axios from 'axios';
7
+ import { HttpsProxyAgent } from 'https-proxy-agent';
8
+ import * as https from 'https';
9
+ import { EClientAdapter } from '../const';
10
+ /**
11
+ * Axios 适配器
12
+ */
13
+ export class AxiosAdapter extends BaseHttpAdapter {
14
+ constructor() {
15
+ super(...arguments);
16
+ this.name = EClientAdapter.axios;
17
+ }
18
+ /**
19
+ * 检查 Axios 是否可用
20
+ */
21
+ isAvailable() {
22
+ return !!axios;
23
+ }
24
+ /**
25
+ * 发送请求
26
+ * @param options 请求选项
27
+ */
28
+ async sendRequest(options) {
29
+ if (!this.isAvailable()) {
30
+ throw new Error('Axios is not available. Please install it: npm install axios');
31
+ }
32
+ const url = this.buildUrl(options.url, options.params);
33
+ const axiosConfig = this.buildAxiosConfig(options, url);
34
+ try {
35
+ const startTime = Date.now();
36
+ const axiosResponse = await axios(axiosConfig);
37
+ const duration = Date.now() - startTime;
38
+ this.logger?.debug('HTTP request completed', {
39
+ method: options.method,
40
+ url,
41
+ status: axiosResponse.status,
42
+ duration
43
+ });
44
+ // 转换为标准响应格式
45
+ const response = {
46
+ status: axiosResponse.status,
47
+ statusText: axiosResponse.statusText,
48
+ headers: this.normalizeHeaders(axiosResponse.headers),
49
+ data: axiosResponse.data,
50
+ config: options
51
+ };
52
+ return response;
53
+ }
54
+ catch (error) {
55
+ throw this.handleAxiosError(error, options);
56
+ }
57
+ }
58
+ /**
59
+ * 构建 Axios 配置
60
+ * @param options 请求选项
61
+ * @param url 完整 URL
62
+ */
63
+ buildAxiosConfig(options, url) {
64
+ const axiosConfig = {
65
+ method: options.method.toLowerCase(),
66
+ url,
67
+ headers: options.headers || {},
68
+ timeout: options.timeout ?? this.requestConfig.timeout,
69
+ maxRedirects: this.requestConfig.maxRedirects,
70
+ maxContentLength: this.requestConfig.maxResponseBodySize,
71
+ maxBodyLength: this.requestConfig.maxRequestBodySize,
72
+ validateStatus: () => true,
73
+ httpsAgent: new https.Agent({
74
+ rejectUnauthorized: this.securityConfig.rejectUnauthorized
75
+ })
76
+ };
77
+ // 设置请求体
78
+ if (options.body !== undefined) {
79
+ axiosConfig.data = options.body;
80
+ }
81
+ // 设置响应类型
82
+ if (options.responseType) {
83
+ axiosConfig.responseType = options.responseType;
84
+ }
85
+ // 配置代理
86
+ this.configureAxiosProxy(axiosConfig, options);
87
+ return axiosConfig;
88
+ }
89
+ /**
90
+ * 配置 Axios 代理
91
+ * @param axiosConfig Axios 配置对象
92
+ * @param options 请求选项
93
+ */
94
+ configureAxiosProxy(axiosConfig, options) {
95
+ // 设置代理(全局配置)
96
+ if (this.requestConfig.proxy) {
97
+ axiosConfig.proxy = this.buildProxyConfig(this.requestConfig.proxy);
98
+ }
99
+ else {
100
+ // 显式的禁用代理, 防止axios默认从环境变量中 HTTP_PROXY、HTTPS_PROXY 读取代理配置.
101
+ axiosConfig.proxy = false;
102
+ }
103
+ // 设置正向代理(如果请求元数据中包含代理信息)
104
+ const forwardProxyMeta = options.meta?.__forwardProxy;
105
+ if (forwardProxyMeta) {
106
+ this.applyForwardProxy(axiosConfig, forwardProxyMeta);
107
+ }
108
+ }
109
+ /**
110
+ * 应用正向代理配置
111
+ * @param axiosConfig Axios 配置对象
112
+ * @param forwardProxyMeta 正向代理元数据
113
+ */
114
+ applyForwardProxy(axiosConfig, forwardProxyMeta) {
115
+ const { proxyUrl, isHttps } = forwardProxyMeta;
116
+ if (isHttps) {
117
+ // HTTPS 请求使用 HttpsProxyAgent,并应用证书校验配置
118
+ axiosConfig.httpsAgent = new HttpsProxyAgent(proxyUrl, {
119
+ rejectUnauthorized: this.securityConfig.rejectUnauthorized
120
+ });
121
+ axiosConfig.proxy = false;
122
+ this.logger?.debug('Using HttpsProxyAgent for HTTPS request', {
123
+ proxyUrl,
124
+ rejectUnauthorized: this.securityConfig.rejectUnauthorized
125
+ });
126
+ }
127
+ else {
128
+ // HTTP 请求直接设置 proxy
129
+ const parsedProxyUrl = new URL(proxyUrl);
130
+ axiosConfig.proxy = {
131
+ host: parsedProxyUrl.hostname,
132
+ port: Number(parsedProxyUrl.port),
133
+ protocol: 'http'
134
+ };
135
+ // 处理代理认证
136
+ if (parsedProxyUrl.username && parsedProxyUrl.password) {
137
+ axiosConfig.proxy.auth = {
138
+ username: decodeURIComponent(parsedProxyUrl.username),
139
+ password: decodeURIComponent(parsedProxyUrl.password)
140
+ };
141
+ }
142
+ this.logger?.debug('Using proxy for HTTP request', {
143
+ host: axiosConfig.proxy.host,
144
+ port: axiosConfig.proxy.port
145
+ });
146
+ }
147
+ }
148
+ /**
149
+ * 处理 Axios 错误
150
+ * @param error 错误对象
151
+ * @param options 请求选项
152
+ */
153
+ handleAxiosError(error, options) {
154
+ if (error.isAxiosError) {
155
+ return new HttpError(error.message, error.code || 'AXIOS_ERROR', error.response?.status, error.response ? {
156
+ status: error.response.status,
157
+ statusText: error.response.statusText,
158
+ headers: this.normalizeHeaders(error.response.headers),
159
+ data: error.response.data,
160
+ config: options
161
+ } : undefined, options);
162
+ }
163
+ return new HttpError(error.message || 'Unknown error', 'UNKNOWN_ERROR', undefined, undefined, options);
164
+ }
165
+ /**
166
+ * 构建代理配置
167
+ * @param proxy 代理配置
168
+ */
169
+ buildProxyConfig(proxy) {
170
+ const config = {
171
+ host: proxy.host,
172
+ port: proxy.port,
173
+ protocol: proxy.protocol
174
+ };
175
+ if (proxy.auth) {
176
+ config.auth = {
177
+ username: proxy.auth.username,
178
+ password: proxy.auth.password
179
+ };
180
+ }
181
+ return config;
182
+ }
183
+ }
184
+ //# sourceMappingURL=axios.adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"axios.adapter.js","sourceRoot":"","sources":["../../../src/adapter/axios.adapter.ts"],"names":[],"mappings":"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"}