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.
- package/CHANGELOG.md +5 -0
- package/README.md +160 -0
- package/dist/cjs/adapter/axios.adapter.js +224 -0
- package/dist/cjs/adapter/axios.adapter.js.map +1 -0
- package/dist/cjs/adapter/base.js +134 -0
- package/dist/cjs/adapter/base.js.map +1 -0
- package/dist/cjs/adapter/index.js +20 -0
- package/dist/cjs/adapter/index.js.map +1 -0
- package/dist/cjs/adapter/undici.adapter.js +272 -0
- package/dist/cjs/adapter/undici.adapter.js.map +1 -0
- package/dist/cjs/client.js +409 -0
- package/dist/cjs/client.js.map +1 -0
- package/dist/cjs/config.js +69 -0
- package/dist/cjs/config.js.map +1 -0
- package/dist/cjs/const/config.const.js +53 -0
- package/dist/cjs/const/config.const.js.map +1 -0
- package/dist/cjs/const/dns.const.js +16 -0
- package/dist/cjs/const/dns.const.js.map +1 -0
- package/dist/cjs/const/enum.const.js +22 -0
- package/dist/cjs/const/enum.const.js.map +1 -0
- package/dist/cjs/const/index.js +21 -0
- package/dist/cjs/const/index.js.map +1 -0
- package/dist/cjs/const/ip.const.js +110 -0
- package/dist/cjs/const/ip.const.js.map +1 -0
- package/dist/cjs/index.js +25 -0
- package/dist/cjs/index.js.map +1 -0
- package/dist/cjs/logger/base.js +60 -0
- package/dist/cjs/logger/base.js.map +1 -0
- package/dist/cjs/logger/http_client.logger.js +209 -0
- package/dist/cjs/logger/http_client.logger.js.map +1 -0
- package/dist/cjs/logger/index.js +20 -0
- package/dist/cjs/logger/index.js.map +1 -0
- package/dist/cjs/logger/log.filter.js +126 -0
- package/dist/cjs/logger/log.filter.js.map +1 -0
- package/dist/cjs/security/dns.validator.js +137 -0
- package/dist/cjs/security/dns.validator.js.map +1 -0
- package/dist/cjs/security/index.js +21 -0
- package/dist/cjs/security/index.js.map +1 -0
- package/dist/cjs/security/ip.validator.js +107 -0
- package/dist/cjs/security/ip.validator.js.map +1 -0
- package/dist/cjs/security/ssrf.guard.js +180 -0
- package/dist/cjs/security/ssrf.guard.js.map +1 -0
- package/dist/cjs/security/url.validator.js +170 -0
- package/dist/cjs/security/url.validator.js.map +1 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/cjs/types/adapter.js +6 -0
- package/dist/cjs/types/adapter.js.map +1 -0
- package/dist/cjs/types/client.js +6 -0
- package/dist/cjs/types/client.js.map +1 -0
- package/dist/cjs/types/config.js +6 -0
- package/dist/cjs/types/config.js.map +1 -0
- package/dist/cjs/types/errors.js +35 -0
- package/dist/cjs/types/errors.js.map +1 -0
- package/dist/cjs/types/index.js +35 -0
- package/dist/cjs/types/index.js.map +1 -0
- package/dist/cjs/types/ip.js +6 -0
- package/dist/cjs/types/ip.js.map +1 -0
- package/dist/cjs/types/logger.js +6 -0
- package/dist/cjs/types/logger.js.map +1 -0
- package/dist/cjs/types/request_response.js +6 -0
- package/dist/cjs/types/request_response.js.map +1 -0
- package/dist/cjs/types/security.js +6 -0
- package/dist/cjs/types/security.js.map +1 -0
- package/dist/cjs/types/trace.js +14 -0
- package/dist/cjs/types/trace.js.map +1 -0
- package/dist/cjs/utils/common.js +31 -0
- package/dist/cjs/utils/common.js.map +1 -0
- package/dist/cjs/utils/domain.js +79 -0
- package/dist/cjs/utils/domain.js.map +1 -0
- package/dist/cjs/utils/index.js +44 -0
- package/dist/cjs/utils/index.js.map +1 -0
- package/dist/cjs/utils/ip.range.js +200 -0
- package/dist/cjs/utils/ip.range.js.map +1 -0
- package/dist/cjs/utils/trace.context.js +213 -0
- package/dist/cjs/utils/trace.context.js.map +1 -0
- package/dist/esm/adapter/axios.adapter.js +184 -0
- package/dist/esm/adapter/axios.adapter.js.map +1 -0
- package/dist/esm/adapter/base.js +130 -0
- package/dist/esm/adapter/base.js.map +1 -0
- package/dist/esm/adapter/index.js +4 -0
- package/dist/esm/adapter/index.js.map +1 -0
- package/dist/esm/adapter/undici.adapter.js +235 -0
- package/dist/esm/adapter/undici.adapter.js.map +1 -0
- package/dist/esm/client.js +405 -0
- package/dist/esm/client.js.map +1 -0
- package/dist/esm/config.js +65 -0
- package/dist/esm/config.js.map +1 -0
- package/dist/esm/const/config.const.js +50 -0
- package/dist/esm/const/config.const.js.map +1 -0
- package/dist/esm/const/dns.const.js +13 -0
- package/dist/esm/const/dns.const.js.map +1 -0
- package/dist/esm/const/enum.const.js +19 -0
- package/dist/esm/const/enum.const.js.map +1 -0
- package/dist/esm/const/index.js +5 -0
- package/dist/esm/const/index.js.map +1 -0
- package/dist/esm/const/ip.const.js +107 -0
- package/dist/esm/const/ip.const.js.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/logger/base.js +55 -0
- package/dist/esm/logger/base.js.map +1 -0
- package/dist/esm/logger/http_client.logger.js +205 -0
- package/dist/esm/logger/http_client.logger.js.map +1 -0
- package/dist/esm/logger/index.js +4 -0
- package/dist/esm/logger/index.js.map +1 -0
- package/dist/esm/logger/log.filter.js +122 -0
- package/dist/esm/logger/log.filter.js.map +1 -0
- package/dist/esm/security/dns.validator.js +133 -0
- package/dist/esm/security/dns.validator.js.map +1 -0
- package/dist/esm/security/index.js +5 -0
- package/dist/esm/security/index.js.map +1 -0
- package/dist/esm/security/ip.validator.js +103 -0
- package/dist/esm/security/ip.validator.js.map +1 -0
- package/dist/esm/security/ssrf.guard.js +176 -0
- package/dist/esm/security/ssrf.guard.js.map +1 -0
- package/dist/esm/security/url.validator.js +166 -0
- package/dist/esm/security/url.validator.js.map +1 -0
- package/dist/esm/tsconfig.esm.tsbuildinfo +1 -0
- package/dist/esm/types/adapter.js +5 -0
- package/dist/esm/types/adapter.js.map +1 -0
- package/dist/esm/types/client.js +5 -0
- package/dist/esm/types/client.js.map +1 -0
- package/dist/esm/types/config.js +5 -0
- package/dist/esm/types/config.js.map +1 -0
- package/dist/esm/types/errors.js +30 -0
- package/dist/esm/types/errors.js.map +1 -0
- package/dist/esm/types/index.js +19 -0
- package/dist/esm/types/index.js.map +1 -0
- package/dist/esm/types/ip.js +5 -0
- package/dist/esm/types/ip.js.map +1 -0
- package/dist/esm/types/logger.js +5 -0
- package/dist/esm/types/logger.js.map +1 -0
- package/dist/esm/types/request_response.js +5 -0
- package/dist/esm/types/request_response.js.map +1 -0
- package/dist/esm/types/security.js +5 -0
- package/dist/esm/types/security.js.map +1 -0
- package/dist/esm/types/trace.js +11 -0
- package/dist/esm/types/trace.js.map +1 -0
- package/dist/esm/utils/common.js +27 -0
- package/dist/esm/utils/common.js.map +1 -0
- package/dist/esm/utils/domain.js +71 -0
- package/dist/esm/utils/domain.js.map +1 -0
- package/dist/esm/utils/index.js +7 -0
- package/dist/esm/utils/index.js.map +1 -0
- package/dist/esm/utils/ip.range.js +187 -0
- package/dist/esm/utils/ip.range.js.map +1 -0
- package/dist/esm/utils/trace.context.js +199 -0
- package/dist/esm/utils/trace.context.js.map +1 -0
- package/dist/types/adapter/axios.adapter.d.ts +51 -0
- package/dist/types/adapter/axios.adapter.d.ts.map +1 -0
- package/dist/types/adapter/base.d.ts +56 -0
- package/dist/types/adapter/base.d.ts.map +1 -0
- package/dist/types/adapter/index.d.ts +4 -0
- package/dist/types/adapter/index.d.ts.map +1 -0
- package/dist/types/adapter/undici.adapter.d.ts +68 -0
- package/dist/types/adapter/undici.adapter.d.ts.map +1 -0
- package/dist/types/client.d.ts +105 -0
- package/dist/types/client.d.ts.map +1 -0
- package/dist/types/config.d.ts +14 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/const/config.const.d.ts +23 -0
- package/dist/types/const/config.const.d.ts.map +1 -0
- package/dist/types/const/dns.const.d.ts +13 -0
- package/dist/types/const/dns.const.d.ts.map +1 -0
- package/dist/types/const/enum.const.d.ts +17 -0
- package/dist/types/const/enum.const.d.ts.map +1 -0
- package/dist/types/const/index.d.ts +5 -0
- package/dist/types/const/index.d.ts.map +1 -0
- package/dist/types/const/ip.const.d.ts +42 -0
- package/dist/types/const/ip.const.d.ts.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/logger/base.d.ts +42 -0
- package/dist/types/logger/base.d.ts.map +1 -0
- package/dist/types/logger/http_client.logger.d.ts +49 -0
- package/dist/types/logger/http_client.logger.d.ts.map +1 -0
- package/dist/types/logger/index.d.ts +4 -0
- package/dist/types/logger/index.d.ts.map +1 -0
- package/dist/types/logger/log.filter.d.ts +56 -0
- package/dist/types/logger/log.filter.d.ts.map +1 -0
- package/dist/types/security/dns.validator.d.ts +61 -0
- package/dist/types/security/dns.validator.d.ts.map +1 -0
- package/dist/types/security/index.d.ts +5 -0
- package/dist/types/security/index.d.ts.map +1 -0
- package/dist/types/security/ip.validator.d.ts +31 -0
- package/dist/types/security/ip.validator.d.ts.map +1 -0
- package/dist/types/security/ssrf.guard.d.ts +54 -0
- package/dist/types/security/ssrf.guard.d.ts.map +1 -0
- package/dist/types/security/url.validator.d.ts +76 -0
- package/dist/types/security/url.validator.d.ts.map +1 -0
- package/dist/types/types/adapter.d.ts +30 -0
- package/dist/types/types/adapter.d.ts.map +1 -0
- package/dist/types/types/client.d.ts +85 -0
- package/dist/types/types/client.d.ts.map +1 -0
- package/dist/types/types/config.d.ts +99 -0
- package/dist/types/types/config.d.ts.map +1 -0
- package/dist/types/types/errors.d.ts +23 -0
- package/dist/types/types/errors.d.ts.map +1 -0
- package/dist/types/types/index.d.ts +10 -0
- package/dist/types/types/index.d.ts.map +1 -0
- package/dist/types/types/ip.d.ts +32 -0
- package/dist/types/types/ip.d.ts.map +1 -0
- package/dist/types/types/logger.d.ts +136 -0
- package/dist/types/types/logger.d.ts.map +1 -0
- package/dist/types/types/request_response.d.ts +54 -0
- package/dist/types/types/request_response.d.ts.map +1 -0
- package/dist/types/types/security.d.ts +115 -0
- package/dist/types/types/security.d.ts.map +1 -0
- package/dist/types/types/trace.d.ts +34 -0
- package/dist/types/types/trace.d.ts.map +1 -0
- package/dist/types/utils/common.d.ts +14 -0
- package/dist/types/utils/common.d.ts.map +1 -0
- package/dist/types/utils/domain.d.ts +39 -0
- package/dist/types/utils/domain.d.ts.map +1 -0
- package/dist/types/utils/index.d.ts +6 -0
- package/dist/types/utils/index.d.ts.map +1 -0
- package/dist/types/utils/ip.range.d.ts +61 -0
- package/dist/types/utils/ip.range.d.ts.map +1 -0
- package/dist/types/utils/trace.context.d.ts +106 -0
- package/dist/types/utils/trace.context.d.ts.map +1 -0
- package/docs/adapters.md +53 -0
- package/docs/configuration.md +149 -0
- package/docs/logging.md +70 -0
- package/docs/proxy.md +44 -0
- package/docs/security.md +56 -0
- package/docs/trace-context.md +436 -0
- package/package.json +50 -0
- package/src/adapter/axios.adapter.ts +228 -0
- package/src/adapter/base.ts +180 -0
- package/src/adapter/index.ts +3 -0
- package/src/adapter/undici.adapter.ts +282 -0
- package/src/client.ts +552 -0
- package/src/config.ts +86 -0
- package/src/const/config.const.ts +60 -0
- package/src/const/dns.const.ts +15 -0
- package/src/const/enum.const.ts +17 -0
- package/src/const/index.ts +4 -0
- package/src/const/ip.const.ts +139 -0
- package/src/index.ts +8 -0
- package/src/logger/base.ts +75 -0
- package/src/logger/http_client.logger.ts +272 -0
- package/src/logger/index.ts +3 -0
- package/src/logger/log.filter.ts +149 -0
- package/src/security/dns.validator.ts +170 -0
- package/src/security/index.ts +4 -0
- package/src/security/ip.validator.ts +124 -0
- package/src/security/ssrf.guard.ts +224 -0
- package/src/security/url.validator.ts +192 -0
- package/src/types/adapter.ts +38 -0
- package/src/types/client.ts +119 -0
- package/src/types/config.ts +110 -0
- package/src/types/errors.ts +38 -0
- package/src/types/index.ts +27 -0
- package/src/types/ip.ts +34 -0
- package/src/types/logger.ts +150 -0
- package/src/types/request_response.ts +65 -0
- package/src/types/security.ts +126 -0
- package/src/types/trace.ts +35 -0
- package/src/utils/common.ts +28 -0
- package/src/utils/domain.ts +78 -0
- package/src/utils/index.ts +7 -0
- package/src/utils/ip.range.ts +218 -0
- 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
|
+
|
package/src/types/ip.ts
ADDED
|
@@ -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
|
+
|