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,38 @@
1
+ /**
2
+ * 适配器相关类型定义
3
+ */
4
+
5
+ import type {
6
+ HttpRequestOptions,
7
+ HttpResponse
8
+ } from './request_response';
9
+ import type { RequestConfig } from './config';
10
+ import type { EClientAdapter } from '../const';
11
+
12
+ /**
13
+ * HTTP 适配器接口
14
+ */
15
+ export interface IHttpAdapter {
16
+ /** 适配器名称 */
17
+ readonly name: EClientAdapter;
18
+
19
+ /**
20
+ * 发送 HTTP 请求
21
+ * @param options 请求选项
22
+ * @returns 响应结果
23
+ */
24
+ request: <T = any>(options: HttpRequestOptions) => Promise<HttpResponse<T>>;
25
+
26
+ /**
27
+ * 检查适配器是否可用
28
+ * @returns 是否可用
29
+ */
30
+ isAvailable: () => boolean;
31
+
32
+ /**
33
+ * 更新适配器配置
34
+ * @param config 请求配置
35
+ */
36
+ updateConfig: (config: Partial<RequestConfig>) => void;
37
+ }
38
+
@@ -0,0 +1,119 @@
1
+ /**
2
+ * 客户端相关类型定义
3
+ */
4
+
5
+ import type {
6
+ HttpRequestOptions,
7
+ HttpResponse
8
+ } from './request_response';
9
+ import type { EClientAdapter } from '../const';
10
+
11
+ /**
12
+ * 正向代理配置
13
+ */
14
+ export interface IForwardProxy {
15
+ enabled: boolean;
16
+ https_proxy: string;
17
+ http_proxy: string;
18
+ no_proxy: string[];
19
+ }
20
+
21
+ /**
22
+ * HTTP 客户端接口
23
+ */
24
+ export interface IHttpClient {
25
+ /**
26
+ * 挂载适配器.
27
+ * @param adapter
28
+ * @returns this
29
+ */
30
+ withAdapter: (adapter: EClientAdapter) => this;
31
+
32
+ /**
33
+ * 挂载正向代理.
34
+ * @param proxy
35
+ * @returns this
36
+ */
37
+ withForwardProxy: (proxy: IForwardProxy) => this;
38
+
39
+ /**
40
+ * 发送 HTTP 请求
41
+ * @param options 请求选项
42
+ * @returns 响应结果
43
+ */
44
+ request: <T = any>(options: HttpRequestOptions) => Promise<HttpResponse<T>>;
45
+
46
+ /**
47
+ * GET 请求
48
+ * @param url 请求 URL
49
+ * @param options 其他请求选项
50
+ * @returns 响应结果
51
+ */
52
+ get: <T = any>(
53
+ url: string,
54
+ options?: Partial<Omit<HttpRequestOptions, 'method' | 'url'>>
55
+ ) => Promise<HttpResponse<T>>;
56
+
57
+ /**
58
+ * POST 请求
59
+ * @param url 请求 URL
60
+ * @param body 请求体
61
+ * @param options 其他请求选项
62
+ * @returns 响应结果
63
+ */
64
+ post: <T = any>(
65
+ url: string,
66
+ body?: any,
67
+ options?: Partial<Omit<HttpRequestOptions, 'method' | 'url' | 'body'>>
68
+ ) => Promise<HttpResponse<T>>;
69
+
70
+ /**
71
+ * PUT 请求
72
+ * @param url 请求 URL
73
+ * @param body 请求体
74
+ * @param options 其他请求选项
75
+ * @returns 响应结果
76
+ */
77
+ put: <T = any>(
78
+ url: string,
79
+ body?: any,
80
+ options?: Partial<Omit<HttpRequestOptions, 'method' | 'url' | 'body'>>
81
+ ) => Promise<HttpResponse<T>>;
82
+
83
+ /**
84
+ * DELETE 请求
85
+ * @param url 请求 URL
86
+ * @param options 其他请求选项
87
+ * @returns 响应结果
88
+ */
89
+ delete: <T = any>(
90
+ url: string,
91
+ options?: Partial<Omit<HttpRequestOptions, 'method' | 'url'>>
92
+ ) => Promise<HttpResponse<T>>;
93
+
94
+ /**
95
+ * PATCH 请求
96
+ * @param url 请求 URL
97
+ * @param body 请求体
98
+ * @param options 其他请求选项
99
+ * @returns 响应结果
100
+ */
101
+ patch: <T = any>(
102
+ url: string,
103
+ body?: any,
104
+ options?: Partial<Omit<HttpRequestOptions, 'method' | 'url' | 'body'>>
105
+ ) => Promise<HttpResponse<T>>;
106
+
107
+
108
+ /**
109
+ * 清空 DNS 缓存
110
+ */
111
+ clearDnsCache: () => void;
112
+
113
+ /**
114
+ * 获取 DNS 缓存大小
115
+ * @returns 缓存条目数量
116
+ */
117
+ getDnsCacheSize: () => number;
118
+ }
119
+
@@ -0,0 +1,110 @@
1
+ /**
2
+ * 配置相关类型定义
3
+ */
4
+
5
+ import type {
6
+ ILogger,
7
+ IHttpClientLogger,
8
+ LogFilterConfig,
9
+ } from './logger';
10
+ import type { EClientAdapter } from '../const';
11
+
12
+ /**
13
+ * 代理配置
14
+ */
15
+ export interface ProxyConfig {
16
+ host: string;
17
+ port: number;
18
+ protocol: 'http' | 'https';
19
+ auth?: {
20
+ username: string,
21
+ password: string
22
+ };
23
+ }
24
+
25
+ /**
26
+ * 安全配置
27
+ */
28
+ export interface SecurityConfig {
29
+ /** 证书校验 **/
30
+ rejectUnauthorized: boolean;
31
+ /** 启用 DNS 验证 */
32
+ enableDnsValidation: boolean;
33
+ /** 启用 IP 地址验证 */
34
+ enableIpValidation: boolean;
35
+ /** 允许访问私有 IP */
36
+ allowPrivateIp: boolean;
37
+ /** 域名白名单(支持通配符,如 *.example.com 匹配一级子域名) */
38
+ whitelist: string[];
39
+ /** 域名黑名单(支持通配符,如 *.example.com 匹配一级子域名) */
40
+ blacklist: string[];
41
+ /** DNS 缓存 TTL(毫秒) */
42
+ dnsCacheTtl: number;
43
+ /** DNS 缓存最大条目数 */
44
+ dnsCacheMaxSize: number;
45
+ }
46
+
47
+ /**
48
+ * 日志配置
49
+ */
50
+ export interface LoggingConfig {
51
+ /** 启用日志 */
52
+ enabled: boolean;
53
+ /** 自定义日志记录器(通用) */
54
+ logger?: ILogger;
55
+ /** 自定义 HTTP 客户端日志记录器 */
56
+ httpLogger?: IHttpClientLogger;
57
+ /** 记录请求体 */
58
+ logRequestBody: boolean;
59
+ /** 记录响应体 */
60
+ logResponseBody: boolean;
61
+ /** 响应体最大记录长度(字节) */
62
+ bodyMaxLength: number;
63
+ /** 日志过滤器配置 */
64
+ filter?: LogFilterConfig;
65
+ }
66
+
67
+ /**
68
+ * 请求配置
69
+ */
70
+ export interface RequestConfig {
71
+ /** 超时时间(毫秒) */
72
+ timeout: number;
73
+ /** 重试次数 */
74
+ retries: number;
75
+ /** 重试延迟(毫秒) */
76
+ retryDelay: number;
77
+ /** 代理配置 */
78
+ proxy?: ProxyConfig;
79
+ /** 最大重定向次数 */
80
+ maxRedirects: number;
81
+ /** 最大请求体大小(字节) */
82
+ maxRequestBodySize: number;
83
+ /** 最大响应体大小(字节) */
84
+ maxResponseBodySize: number;
85
+ }
86
+
87
+ /**
88
+ * HTTP 客户端配置
89
+ */
90
+ export interface HttpClientConfig {
91
+ /** 适配器类型 */
92
+ adapter: EClientAdapter;
93
+ /** 安全配置 */
94
+ security: SecurityConfig;
95
+ /** 日志配置 */
96
+ logging: LoggingConfig;
97
+ /** 请求配置 */
98
+ request: RequestConfig;
99
+ }
100
+
101
+ /**
102
+ * 部分 HTTP 客户端配置(用于创建实例时)
103
+ */
104
+ export interface PartialHttpClientConfig {
105
+ adapter?: EClientAdapter;
106
+ security?: Partial<SecurityConfig>;
107
+ logging?: Partial<LoggingConfig>;
108
+ request?: Partial<RequestConfig>;
109
+ }
110
+
@@ -0,0 +1,38 @@
1
+ /**
2
+ * 错误类型定义
3
+ */
4
+
5
+ import type { HttpRequestOptions, HttpResponse } from './request_response';
6
+
7
+ /**
8
+ * HTTP 错误
9
+ */
10
+ export class HttpError extends Error {
11
+ constructor(
12
+ message: string,
13
+ public readonly code: string,
14
+ public readonly status?: number,
15
+ public readonly response?: HttpResponse,
16
+ public readonly request?: HttpRequestOptions
17
+ ) {
18
+ super(message);
19
+ this.name = 'HttpError';
20
+ Error.captureStackTrace(this, this.constructor);
21
+ }
22
+ }
23
+
24
+ /**
25
+ * 安全验证错误
26
+ */
27
+ export class SecurityError extends Error {
28
+ constructor(
29
+ message: string,
30
+ public readonly code: string,
31
+ public readonly url?: string
32
+ ) {
33
+ super(message);
34
+ this.name = 'SecurityError';
35
+ Error.captureStackTrace(this, this.constructor);
36
+ }
37
+ }
38
+
@@ -0,0 +1,27 @@
1
+ // 请求和响应
2
+ export * from './request_response';
3
+
4
+ // 配置相关
5
+ export * from './config';
6
+
7
+ // 错误类
8
+ export * from './errors';
9
+
10
+ // 安全和验证
11
+ export * from './security';
12
+
13
+ // IP 相关
14
+ export * from './ip';
15
+
16
+ // 日志相关
17
+ export * from './logger';
18
+
19
+ // 适配器相关
20
+ export * from './adapter';
21
+
22
+ // 客户端相关
23
+ export * from './client';
24
+
25
+ // trace 相关
26
+ export * from './trace';
27
+
@@ -0,0 +1,34 @@
1
+ /**
2
+ * IP 相关类型定义
3
+ */
4
+
5
+ /**
6
+ * 预编译的 IPv4 CIDR 范围
7
+ */
8
+ export interface CompiledIpv4Range {
9
+ /** 网络地址(数字形式) */
10
+ network: number;
11
+ /** 子网掩码(数字形式) */
12
+ mask: number;
13
+ /** 原始 CIDR 字符串 */
14
+ cidr: string;
15
+ }
16
+
17
+ /**
18
+ * 预编译的 IPv6 CIDR 范围
19
+ */
20
+ export interface CompiledIpv6Range {
21
+ /** 网络地址高 64 位 */
22
+ networkHigh: bigint;
23
+ /** 网络地址低 64 位 */
24
+ networkLow: bigint;
25
+ /** 子网掩码高 64 位 */
26
+ maskHigh: bigint;
27
+ /** 子网掩码低 64 位 */
28
+ maskLow: bigint;
29
+ /** CIDR 前缀长度 */
30
+ prefix: number;
31
+ /** 原始 CIDR 字符串 */
32
+ cidr: string;
33
+ }
34
+
@@ -0,0 +1,150 @@
1
+ /**
2
+ * 日志相关类型定义
3
+ */
4
+
5
+ import type {
6
+ HttpRequestOptions,
7
+ HttpResponse
8
+ } from './request_response';
9
+
10
+ /**
11
+ * 日志记录器接口
12
+ */
13
+ export interface ILogger {
14
+ debug: (message: string, meta?: Record<string, any>) => void;
15
+ info: (message: string, meta?: Record<string, any>) => void;
16
+ warn: (message: string, meta?: Record<string, any>) => void;
17
+ error: (message: string, meta?: Record<string, any>) => void;
18
+ }
19
+
20
+ /**
21
+ * 请求失败选项
22
+ */
23
+ export interface IResFailedOptions {
24
+ /** 是否成功 */
25
+ isSuccess: false;
26
+ /** 时间戳 */
27
+ timestamp: number;
28
+ /** 请求选项 */
29
+ request: HttpRequestOptions;
30
+ /** 错误信息 */
31
+ error: Error;
32
+ /** 错误码 */
33
+ errorCode?: string;
34
+ /** HTTP 状态码(如果有响应) */
35
+ status?: number;
36
+ /** 响应对象(如果有) */
37
+ response?: HttpResponse;
38
+ /** 请求耗时(毫秒) */
39
+ duration?: number;
40
+ /** 重试次数 */
41
+ retryCount?: number;
42
+ }
43
+
44
+ /**
45
+ * 流式响应相关指标.
46
+ */
47
+ export interface IStreamMetrics {
48
+ /** 首次响应时间(TTFB - Time To First Byte,毫秒) */
49
+ ttfb: number;
50
+ /** 流是否已完成 */
51
+ completed: boolean;
52
+ /** 流完成总耗时(毫秒,仅在流完成时有值) */
53
+ totalDuration?: number;
54
+ /** 流传输的字节数(如果可统计) */
55
+ bytesTransferred?: number;
56
+ }
57
+
58
+ /**
59
+ * 请求成功选项
60
+ */
61
+ export interface IResSuccessOptions {
62
+ /** 是否成功 */
63
+ isSuccess: true;
64
+ /** 时间戳 */
65
+ timestamp: number;
66
+ /** 请求选项 */
67
+ request: HttpRequestOptions;
68
+ /** 响应对象 */
69
+ response: HttpResponse;
70
+ /** 请求耗时(毫秒) */
71
+ duration: number;
72
+ /** 重试次数 */
73
+ retryCount?: number;
74
+ /** 流式响应相关指标(仅当 responseType 为 stream 时) */
75
+ streamMetrics?: IStreamMetrics;
76
+ }
77
+
78
+ /**
79
+ * 日志过滤器接口
80
+ */
81
+ export interface ILogFilter {
82
+ /**
83
+ * 判断是否应该记录此日志
84
+ * @param options 日志选项(成功或失败)
85
+ * @returns 是否应该记录
86
+ */
87
+ shouldLog: (options: IResSuccessOptions | IResFailedOptions) => boolean;
88
+ }
89
+
90
+ /**
91
+ * 日志过滤器配置
92
+ */
93
+ export interface LogFilterConfig {
94
+ /** 只记录特定 HTTP 方法 */
95
+ methods?: string[];
96
+ /** 只记录特定 URL 模式(支持正则表达式) */
97
+ urlPatterns?: (string | RegExp)[];
98
+ /** 只记录特定场景 */
99
+ scenarios?: string[];
100
+ /** 只记录特定状态码 */
101
+ statusCodes?: number[];
102
+ /** 只记录特定状态码范围 */
103
+ statusCodeRanges?: Array<{ min: number, max: number }>;
104
+ /** 只记录失败的请求 */
105
+ onlyFailed?: boolean;
106
+ /** 只记录成功的请求 */
107
+ onlySuccess?: boolean;
108
+ /** 只记录耗时超过指定毫秒数的请求 */
109
+ minDuration?: number;
110
+ /** 自定义过滤函数 */
111
+ customFilter?: (options: IResSuccessOptions | IResFailedOptions) => boolean;
112
+ }
113
+
114
+ /**
115
+ * HTTP 客户端日志记录器
116
+ */
117
+ export interface IHttpClientLogger {
118
+ /**
119
+ * 记录失败的请求
120
+ * @param resOptions 请求失败选项
121
+ */
122
+ logFailed: (
123
+ resOptions: Omit<IResFailedOptions, 'isSuccess' | 'timestamp'>
124
+ ) => void;
125
+
126
+ /**
127
+ * 记录成功的请求
128
+ * @param resOptions 请求成功选项
129
+ */
130
+ logSuccess: (
131
+ resOptions: Omit<IResSuccessOptions, 'isSuccess' | 'timestamp'>
132
+ ) => void;
133
+ }
134
+
135
+
136
+ /**
137
+ * HTTP 客户端日志记录器配置
138
+ */
139
+ export interface HttpClientLoggerConfig {
140
+ /** 底层日志记录器 */
141
+ logger: ILogger;
142
+ /** 日志过滤器(可选) */
143
+ filter?: ILogFilter;
144
+ /** 是否记录请求体 */
145
+ logRequestBody?: boolean;
146
+ /** 是否记录响应体 */
147
+ logResponseBody?: boolean;
148
+ /** 响应体最大记录长度(字节) */
149
+ bodyMaxLength?: number;
150
+ }
@@ -0,0 +1,65 @@
1
+ /**
2
+ * 请求和响应类型定义
3
+ */
4
+
5
+ /**
6
+ * HTTP 方法
7
+ */
8
+ export type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' | 'PATCH' | 'HEAD' | 'OPTIONS';
9
+
10
+ /**
11
+ * 响应类型.
12
+ */
13
+ export type ResponseType =
14
+ | 'arraybuffer'
15
+ | 'blob'
16
+ | 'document'
17
+ | 'json'
18
+ | 'text'
19
+ | 'stream'
20
+ | 'formdata';
21
+
22
+ /**
23
+ * HTTP 请求选项
24
+ */
25
+ export interface HttpRequestOptions {
26
+ /** HTTP 方法 */
27
+ method: HttpMethod;
28
+ /** 请求 URL */
29
+ url: string;
30
+ /** 请求头 */
31
+ headers?: Record<string, string | number>;
32
+ /** URL 查询参数 */
33
+ params?: Record<string, string | number | boolean>;
34
+ /** 请求体 */
35
+ body?: any;
36
+ /** 请求超时(毫秒,覆盖全局配置) */
37
+ timeout?: number;
38
+ /** 重试次数(覆盖全局配置) */
39
+ retries?: number;
40
+ /** 业务场景标识 */
41
+ scenario?: string;
42
+ /** 业务元数据 */
43
+ meta?: Record<string, any>;
44
+ /** 响应类型 */
45
+ responseType?: ResponseType;
46
+ /** W3C Trace Context traceparent 头(用于分布式链路追踪) */
47
+ traceparent?: string;
48
+ }
49
+
50
+ /**
51
+ * HTTP 响应
52
+ */
53
+ export interface HttpResponse<T = any> {
54
+ /** 响应状态码 */
55
+ status: number;
56
+ /** 响应状态文本 */
57
+ statusText: string;
58
+ /** 响应头 */
59
+ headers: Record<string, string>;
60
+ /** 响应体 */
61
+ data: T;
62
+ /** 请求配置 */
63
+ config: HttpRequestOptions;
64
+ }
65
+
@@ -0,0 +1,126 @@
1
+ /**
2
+ * 安全和验证相关类型定义
3
+ */
4
+
5
+ import type { SecurityConfig } from './config';
6
+
7
+ /**
8
+ * DNS 解析结果
9
+ */
10
+ export interface DnsResult {
11
+ /** 域名 */
12
+ hostname: string;
13
+ /** 解析到的 IP 地址列表 */
14
+ addresses: string[];
15
+ /** 解析时间戳 */
16
+ timestamp: number;
17
+ /** TTL */
18
+ ttl: number;
19
+ }
20
+
21
+ /**
22
+ * IP 验证结果
23
+ */
24
+ export interface IpValidationResult {
25
+ /** 是否有效 */
26
+ valid: boolean;
27
+ /** IP 地址 */
28
+ ip: string;
29
+ /** 是否为私有 IP */
30
+ isPrivate: boolean;
31
+ /** 是否为回环地址 */
32
+ isLoopback: boolean;
33
+ /** 是否为 Link-Local */
34
+ isLinkLocal: boolean;
35
+ /** 是否为组播地址 */
36
+ isMulticast: boolean;
37
+ /** 是否为保留地址 */
38
+ isReserved: boolean;
39
+ /** 原因(当 valid 为 false 时) */
40
+ reason?: string;
41
+ }
42
+
43
+ /**
44
+ * URL 验证结果
45
+ */
46
+ export interface UrlValidationResult {
47
+ /** 是否有效 */
48
+ valid: boolean;
49
+ /** URL */
50
+ url: string;
51
+ /** 是否在白名单中 */
52
+ inWhitelist: boolean;
53
+ /** 是否在黑名单中 */
54
+ inBlacklist: boolean;
55
+ /** 原因(当 valid 为 false 时) */
56
+ reason?: string;
57
+ }
58
+
59
+
60
+ /**
61
+ * SSRF 防护结果
62
+ */
63
+ export interface SsrfGuardResult {
64
+ /** 是否通过验证 */
65
+ passed: boolean;
66
+ /** 原始 URL */
67
+ originalUrl: string;
68
+ /** 解析后的主机名 */
69
+ hostname: string;
70
+ /** 解析后的 IP 地址列表(如果进行了 DNS 解析) */
71
+ resolvedIps?: string[];
72
+ /** 安全的 IP 地址(如果进行了 DNS 解析且通过验证) */
73
+ safeIp?: string;
74
+ /** 失败原因 */
75
+ reason?: string;
76
+ }
77
+
78
+ /**
79
+ * SSRF 防护接口
80
+ */
81
+ export interface ISsrfGuard {
82
+ /**
83
+ * 验证 URL 是否安全
84
+ * @param url 要验证的 URL
85
+ * @returns 验证结果
86
+ */
87
+ validate: (url: string) => Promise<SsrfGuardResult>;
88
+
89
+ /**
90
+ * 验证并返回安全的 URL
91
+ * @param url 要验证的 URL
92
+ * @returns 安全的 URL 和验证结果
93
+ * @throws {SecurityError} 验证失败时抛出错误
94
+ */
95
+ validateAndGetSafeUrl: (url: string) => Promise<{ safeUrl: string, result: SsrfGuardResult }>;
96
+
97
+ /**
98
+ * 更新配置
99
+ * @param config 新的安全配置
100
+ */
101
+ updateConfig: (config: Partial<SecurityConfig>) => void;
102
+
103
+ /**
104
+ * 清空 DNS 缓存
105
+ */
106
+ clearDnsCache: () => void;
107
+
108
+ /**
109
+ * 获取 DNS 缓存大小
110
+ * @returns 缓存条目数量
111
+ */
112
+ getDnsCacheSize: () => number;
113
+
114
+ /**
115
+ * 清理过期的 DNS 缓存
116
+ */
117
+ cleanExpiredDnsCache: () => void;
118
+
119
+ /**
120
+ * 获取当前配置
121
+ * @returns 安全配置副本
122
+ */
123
+ getConfig: () => SecurityConfig;
124
+ }
125
+
126
+