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,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 安全和验证相关类型定义
|
|
3
|
+
*/
|
|
4
|
+
import type { SecurityConfig } from './config';
|
|
5
|
+
/**
|
|
6
|
+
* DNS 解析结果
|
|
7
|
+
*/
|
|
8
|
+
export interface DnsResult {
|
|
9
|
+
/** 域名 */
|
|
10
|
+
hostname: string;
|
|
11
|
+
/** 解析到的 IP 地址列表 */
|
|
12
|
+
addresses: string[];
|
|
13
|
+
/** 解析时间戳 */
|
|
14
|
+
timestamp: number;
|
|
15
|
+
/** TTL */
|
|
16
|
+
ttl: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* IP 验证结果
|
|
20
|
+
*/
|
|
21
|
+
export interface IpValidationResult {
|
|
22
|
+
/** 是否有效 */
|
|
23
|
+
valid: boolean;
|
|
24
|
+
/** IP 地址 */
|
|
25
|
+
ip: string;
|
|
26
|
+
/** 是否为私有 IP */
|
|
27
|
+
isPrivate: boolean;
|
|
28
|
+
/** 是否为回环地址 */
|
|
29
|
+
isLoopback: boolean;
|
|
30
|
+
/** 是否为 Link-Local */
|
|
31
|
+
isLinkLocal: boolean;
|
|
32
|
+
/** 是否为组播地址 */
|
|
33
|
+
isMulticast: boolean;
|
|
34
|
+
/** 是否为保留地址 */
|
|
35
|
+
isReserved: boolean;
|
|
36
|
+
/** 原因(当 valid 为 false 时) */
|
|
37
|
+
reason?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* URL 验证结果
|
|
41
|
+
*/
|
|
42
|
+
export interface UrlValidationResult {
|
|
43
|
+
/** 是否有效 */
|
|
44
|
+
valid: boolean;
|
|
45
|
+
/** URL */
|
|
46
|
+
url: string;
|
|
47
|
+
/** 是否在白名单中 */
|
|
48
|
+
inWhitelist: boolean;
|
|
49
|
+
/** 是否在黑名单中 */
|
|
50
|
+
inBlacklist: boolean;
|
|
51
|
+
/** 原因(当 valid 为 false 时) */
|
|
52
|
+
reason?: string;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* SSRF 防护结果
|
|
56
|
+
*/
|
|
57
|
+
export interface SsrfGuardResult {
|
|
58
|
+
/** 是否通过验证 */
|
|
59
|
+
passed: boolean;
|
|
60
|
+
/** 原始 URL */
|
|
61
|
+
originalUrl: string;
|
|
62
|
+
/** 解析后的主机名 */
|
|
63
|
+
hostname: string;
|
|
64
|
+
/** 解析后的 IP 地址列表(如果进行了 DNS 解析) */
|
|
65
|
+
resolvedIps?: string[];
|
|
66
|
+
/** 安全的 IP 地址(如果进行了 DNS 解析且通过验证) */
|
|
67
|
+
safeIp?: string;
|
|
68
|
+
/** 失败原因 */
|
|
69
|
+
reason?: string;
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* SSRF 防护接口
|
|
73
|
+
*/
|
|
74
|
+
export interface ISsrfGuard {
|
|
75
|
+
/**
|
|
76
|
+
* 验证 URL 是否安全
|
|
77
|
+
* @param url 要验证的 URL
|
|
78
|
+
* @returns 验证结果
|
|
79
|
+
*/
|
|
80
|
+
validate: (url: string) => Promise<SsrfGuardResult>;
|
|
81
|
+
/**
|
|
82
|
+
* 验证并返回安全的 URL
|
|
83
|
+
* @param url 要验证的 URL
|
|
84
|
+
* @returns 安全的 URL 和验证结果
|
|
85
|
+
* @throws {SecurityError} 验证失败时抛出错误
|
|
86
|
+
*/
|
|
87
|
+
validateAndGetSafeUrl: (url: string) => Promise<{
|
|
88
|
+
safeUrl: string;
|
|
89
|
+
result: SsrfGuardResult;
|
|
90
|
+
}>;
|
|
91
|
+
/**
|
|
92
|
+
* 更新配置
|
|
93
|
+
* @param config 新的安全配置
|
|
94
|
+
*/
|
|
95
|
+
updateConfig: (config: Partial<SecurityConfig>) => void;
|
|
96
|
+
/**
|
|
97
|
+
* 清空 DNS 缓存
|
|
98
|
+
*/
|
|
99
|
+
clearDnsCache: () => void;
|
|
100
|
+
/**
|
|
101
|
+
* 获取 DNS 缓存大小
|
|
102
|
+
* @returns 缓存条目数量
|
|
103
|
+
*/
|
|
104
|
+
getDnsCacheSize: () => number;
|
|
105
|
+
/**
|
|
106
|
+
* 清理过期的 DNS 缓存
|
|
107
|
+
*/
|
|
108
|
+
cleanExpiredDnsCache: () => void;
|
|
109
|
+
/**
|
|
110
|
+
* 获取当前配置
|
|
111
|
+
* @returns 安全配置副本
|
|
112
|
+
*/
|
|
113
|
+
getConfig: () => SecurityConfig;
|
|
114
|
+
}
|
|
115
|
+
//# sourceMappingURL=security.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"security.d.ts","sourceRoot":"","sources":["../../../src/types/security.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAE/C;;GAEG;AACH,MAAM,WAAW,SAAS;IACtB,SAAS;IACT,QAAQ,EAAE,MAAM,CAAC;IACjB,mBAAmB;IACnB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,YAAY;IACZ,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU;IACV,GAAG,EAAE,MAAM,CAAC;CACf;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,WAAW;IACX,KAAK,EAAE,OAAO,CAAC;IACf,YAAY;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,eAAe;IACf,SAAS,EAAE,OAAO,CAAC;IACnB,cAAc;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,qBAAqB;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc;IACd,UAAU,EAAE,OAAO,CAAC;IACpB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAChC,WAAW;IACX,KAAK,EAAE,OAAO,CAAC;IACf,UAAU;IACV,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,cAAc;IACd,WAAW,EAAE,OAAO,CAAC;IACrB,4BAA4B;IAC5B,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAGD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC5B,aAAa;IACb,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,iCAAiC;IACjC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,mCAAmC;IACnC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW;IACX,MAAM,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,UAAU;IACvB;;;;OAIG;IACH,QAAQ,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpD;;;;;OAKG;IACH,qBAAqB,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,eAAe,CAAA;KAAE,CAAC,CAAC;IAE9F;;;OAGG;IACH,YAAY,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;IAExD;;OAEG;IACH,aAAa,EAAE,MAAM,IAAI,CAAC;IAE1B;;;OAGG;IACH,eAAe,EAAE,MAAM,MAAM,CAAC;IAE9B;;OAEG;IACH,oBAAoB,EAAE,MAAM,IAAI,CAAC;IAEjC;;;OAGG;IACH,SAAS,EAAE,MAAM,cAAc,CAAC;CACnC"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Trace 标志位
|
|
3
|
+
*/
|
|
4
|
+
export declare enum TraceFlags {
|
|
5
|
+
/** 未采样 */
|
|
6
|
+
NONE = 0,
|
|
7
|
+
/** 已采样 */
|
|
8
|
+
SAMPLED = 1
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Traceparent 接口
|
|
12
|
+
*/
|
|
13
|
+
export interface TraceParent {
|
|
14
|
+
/** 版本号(当前固定为 00) */
|
|
15
|
+
version: string;
|
|
16
|
+
/** Trace ID(32位十六进制字符串) */
|
|
17
|
+
traceId: string;
|
|
18
|
+
/** Parent ID/Span ID(16位十六进制字符串) */
|
|
19
|
+
parentId: string;
|
|
20
|
+
/** Trace 标志位(2位十六进制字符串) */
|
|
21
|
+
traceFlags: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Traceparent 生成选项
|
|
25
|
+
*/
|
|
26
|
+
export interface TraceParentOptions {
|
|
27
|
+
/** 自定义 Trace ID(不提供则自动生成) */
|
|
28
|
+
traceId?: string;
|
|
29
|
+
/** 自定义 Parent ID(不提供则自动生成) */
|
|
30
|
+
parentId?: string;
|
|
31
|
+
/** 是否采样(默认 true) */
|
|
32
|
+
sampled?: boolean;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=trace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../../../src/types/trace.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,oBAAY,UAAU;IAClB,UAAU;IACV,IAAI,IAAO;IACX,UAAU;IACV,OAAO,IAAO;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IACxB,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,2BAA2B;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,QAAQ,EAAE,MAAM,CAAC;IACjB,2BAA2B;IAC3B,UAAU,EAAE,MAAM,CAAC;CACtB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAC/B,6BAA6B;IAC7B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,oBAAoB;IACpB,OAAO,CAAC,EAAE,OAAO,CAAC;CACrB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 延迟函数
|
|
3
|
+
* @param ms 延迟毫秒数
|
|
4
|
+
*/
|
|
5
|
+
export declare function delay(ms: number): Promise<void>;
|
|
6
|
+
/**
|
|
7
|
+
* 超时函数
|
|
8
|
+
* @param promise 原始 Promise
|
|
9
|
+
* @param ms 超时毫秒数
|
|
10
|
+
* @param message 超时错误消息
|
|
11
|
+
* @returns 超时后的 Promise
|
|
12
|
+
*/
|
|
13
|
+
export declare function withTimeout<T>(promise: Promise<T>, ms: number, message?: string): Promise<T>;
|
|
14
|
+
//# sourceMappingURL=common.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"common.d.ts","sourceRoot":"","sources":["../../../src/utils/common.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAI/C;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,SAAwB,GAAG,OAAO,CAAC,CAAC,CAAC,CAU3G"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 根据域名模式列表生成正则表达式数组(通配符模式)
|
|
3
|
+
* 支持规则:
|
|
4
|
+
* 1. 通配符匹配 eg `*.example.com`(只匹配一级子域名,不包括根域名和多级子域名)
|
|
5
|
+
* 2. 精确匹配 eg `example.com`(仅匹配指定域名)
|
|
6
|
+
*
|
|
7
|
+
* @param patterns 域名模式列表
|
|
8
|
+
* @returns 正则表达式数组
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* const regexps = createDomainMatchers(['example.com', '*.example.com']);
|
|
13
|
+
* regexps[0].test('example.com'); // true - 精确匹配
|
|
14
|
+
* regexps[1].test('api.example.com'); // true - 通配符匹配一级子域名
|
|
15
|
+
* regexps[1].test('test.api.example.com'); // false - 不匹配多级子域名
|
|
16
|
+
* regexps[1].test('example.com'); // false - 不匹配根域名
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
19
|
+
export declare const createDomainMatchers: (patterns: string[]) => RegExp[];
|
|
20
|
+
/**
|
|
21
|
+
* 根据域名模式列表生成正则表达式数组(传统模式,用于正向代理等场景)
|
|
22
|
+
* @TODO 需要存量用户跑完正向代理兼容后切换到通配符模式.
|
|
23
|
+
* 支持规则:
|
|
24
|
+
* 1. 完全匹配 eg `www.example.com`
|
|
25
|
+
* 2. 后缀匹配 eg `.example.com`(匹配所有子域名)
|
|
26
|
+
* 3. 前缀匹配 eg `172.168.0.`(主要用于 IP 地址匹配)
|
|
27
|
+
*
|
|
28
|
+
* @param patterns 域名模式列表
|
|
29
|
+
* @returns 正则表达式数组
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* const regexps = createLegacyDomainMatchers(['example.com', '.example.com']);
|
|
34
|
+
* regexps[0].test('example.com'); // true - 完全匹配
|
|
35
|
+
* regexps[1].test('api.example.com'); // true - 后缀匹配
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
export declare const createLegacyDomainMatchers: (patterns: string[]) => RegExp[];
|
|
39
|
+
//# sourceMappingURL=domain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domain.d.ts","sourceRoot":"","sources":["../../../src/utils/domain.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,oBAAoB,GAAI,UAAU,MAAM,EAAE,KAAG,MAAM,EAmB/D,CAAC;AAEF;;;;;;;;;;;;;;;;;GAiBG;AACH,eAAO,MAAM,0BAA0B,GAAI,UAAU,MAAM,EAAE,KAAG,MAAM,EAiBrE,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * as IpRangeUtils from './ip.range';
|
|
2
|
+
export * as CommonUtils from './common';
|
|
3
|
+
export * as DomainUtils from './domain';
|
|
4
|
+
export * as TraceContextUtils from './trace.context';
|
|
5
|
+
export { TraceContext } from './trace.context';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,YAAY,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,WAAW,MAAM,UAAU,CAAC;AACxC,OAAO,KAAK,iBAAiB,MAAM,iBAAiB,CAAC;AAGrD,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* IP 地址范围工具
|
|
3
|
+
*/
|
|
4
|
+
import type { CompiledIpv4Range, CompiledIpv6Range } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* 将 IPv4 地址转换为数字
|
|
7
|
+
*/
|
|
8
|
+
export declare function ipv4ToNumber(ip: string): number;
|
|
9
|
+
/**
|
|
10
|
+
* 预编译 IPv4 CIDR 范围
|
|
11
|
+
* @param cidr CIDR 表示法,如 "192.168.0.0/16"
|
|
12
|
+
*/
|
|
13
|
+
export declare function compileIpv4Range(cidr: string): CompiledIpv4Range;
|
|
14
|
+
/**
|
|
15
|
+
* 检查 IPv4 地址是否在预编译的范围内(高性能版本)
|
|
16
|
+
* @param ip IP 地址
|
|
17
|
+
* @param compiledRange 预编译的范围
|
|
18
|
+
*/
|
|
19
|
+
export declare function isIpv4InCompiledRange(ip: string, compiledRange: CompiledIpv4Range): boolean;
|
|
20
|
+
/**
|
|
21
|
+
* 将 IPv6 地址转换为 BigInt 数组(高 64 位和低 64 位)
|
|
22
|
+
*/
|
|
23
|
+
export declare function ipv6ToBigInt(ip: string): [bigint, bigint];
|
|
24
|
+
/**
|
|
25
|
+
* 标准化 IPv6 地址(展开缩写)
|
|
26
|
+
*/
|
|
27
|
+
export declare function normalizeIpv6(ip: string): string;
|
|
28
|
+
/**
|
|
29
|
+
* 预编译 IPv6 CIDR 范围
|
|
30
|
+
* @param cidr CIDR 表示法,如 "fe80::/10"
|
|
31
|
+
*/
|
|
32
|
+
export declare function compileIpv6Range(cidr: string): CompiledIpv6Range;
|
|
33
|
+
/**
|
|
34
|
+
* 检查 IPv6 地址是否在预编译的范围内(高性能版本)
|
|
35
|
+
* @param ip IPv6 地址
|
|
36
|
+
* @param compiledRange 预编译的范围
|
|
37
|
+
*/
|
|
38
|
+
export declare function isIpv6InCompiledRange(ip: string, compiledRange: CompiledIpv6Range): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* 批量预编译 IPv4 CIDR 范围列表
|
|
41
|
+
* @param cidrs CIDR 范围列表
|
|
42
|
+
*/
|
|
43
|
+
export declare function compileIpv4Ranges(cidrs: string[]): CompiledIpv4Range[];
|
|
44
|
+
/**
|
|
45
|
+
* 批量预编译 IPv6 CIDR 范围列表
|
|
46
|
+
* @param cidrs CIDR 范围列表
|
|
47
|
+
*/
|
|
48
|
+
export declare function compileIpv6Ranges(cidrs: string[]): CompiledIpv6Range[];
|
|
49
|
+
/**
|
|
50
|
+
* 检查 IPv4 地址是否匹配任一预编译范围(高性能版本)
|
|
51
|
+
* @param ip IPv4 地址
|
|
52
|
+
* @param compiledRanges 预编译的范围列表
|
|
53
|
+
*/
|
|
54
|
+
export declare function isIpv4InAnyCompiledRange(ip: string, compiledRanges: CompiledIpv4Range[]): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* 检查 IPv6 地址是否匹配任一预编译范围(高性能版本)
|
|
57
|
+
* @param ip IPv6 地址
|
|
58
|
+
* @param compiledRanges 预编译的范围列表
|
|
59
|
+
*/
|
|
60
|
+
export declare function isIpv6InAnyCompiledRange(ip: string, compiledRanges: CompiledIpv6Range[]): boolean;
|
|
61
|
+
//# sourceMappingURL=ip.range.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ip.range.d.ts","sourceRoot":"","sources":["../../../src/utils/ip.range.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACR,iBAAiB,EACjB,iBAAiB,EACpB,MAAM,UAAU,CAAC;AAElB;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQ/C;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CAgBhE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,GAAG,OAAO,CAG3F;AAED;;GAEG;AACH,wBAAgB,YAAY,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAiBzD;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CA6BhD;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,CA+BhE;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,GAAG,OAAO,CAW3F;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAEtE;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,iBAAiB,EAAE,CAEtE;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAQjG;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EAAE,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE,GAAG,OAAO,CAejG"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* W3C Trace Context 工具
|
|
3
|
+
* 实现 W3C Trace Context 规范:https://www.w3.org/TR/trace-context/
|
|
4
|
+
*/
|
|
5
|
+
import type { TraceParent, TraceParentOptions } from '../types';
|
|
6
|
+
/**
|
|
7
|
+
* 生成符合 W3C 规范的 Trace ID(32位十六进制)
|
|
8
|
+
* @returns Trace ID
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateTraceId(): string;
|
|
11
|
+
/**
|
|
12
|
+
* 生成符合 W3C 规范的 Span ID(16位十六进制)
|
|
13
|
+
* @returns Span ID
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateSpanId(): string;
|
|
16
|
+
/**
|
|
17
|
+
* 验证 Trace ID 格式
|
|
18
|
+
* @param traceId Trace ID
|
|
19
|
+
* @returns 是否有效
|
|
20
|
+
*/
|
|
21
|
+
export declare function isValidTraceId(traceId: string): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* 验证 Span ID 格式
|
|
24
|
+
* @param spanId Span ID
|
|
25
|
+
* @returns 是否有效
|
|
26
|
+
*/
|
|
27
|
+
export declare function isValidSpanId(spanId: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* 验证 Trace Flags 格式
|
|
30
|
+
* @param flags Trace Flags
|
|
31
|
+
* @returns 是否有效
|
|
32
|
+
*/
|
|
33
|
+
export declare function isValidTraceFlags(flags: string): boolean;
|
|
34
|
+
/**
|
|
35
|
+
* 生成 traceparent 头值
|
|
36
|
+
* @param options 生成选项
|
|
37
|
+
* @returns traceparent 字符串
|
|
38
|
+
*/
|
|
39
|
+
export declare function generateTraceParent(options?: TraceParentOptions): string;
|
|
40
|
+
/**
|
|
41
|
+
* 解析 traceparent 头值
|
|
42
|
+
* @param traceparent traceparent 字符串
|
|
43
|
+
* @returns 解析后的对象,解析失败返回 null
|
|
44
|
+
*/
|
|
45
|
+
export declare function parseTraceParent(traceparent: string): TraceParent | null;
|
|
46
|
+
/**
|
|
47
|
+
* 验证 traceparent 头值是否符合规范
|
|
48
|
+
* @param traceparent traceparent 字符串
|
|
49
|
+
* @returns 是否有效
|
|
50
|
+
*/
|
|
51
|
+
export declare function isValidTraceParent(traceparent: string): boolean;
|
|
52
|
+
/**
|
|
53
|
+
* 从现有 traceparent 创建子 span
|
|
54
|
+
* @param parentTraceParent 父级 traceparent 字符串
|
|
55
|
+
* @param sampled 是否采样(不提供则继承父级)
|
|
56
|
+
* @returns 新的 traceparent 字符串
|
|
57
|
+
*/
|
|
58
|
+
export declare function createChildSpan(parentTraceParent: string, sampled?: boolean): string;
|
|
59
|
+
/**
|
|
60
|
+
* 检查 traceparent 是否已采样
|
|
61
|
+
* @param traceparent traceparent 字符串
|
|
62
|
+
* @returns 是否采样
|
|
63
|
+
*/
|
|
64
|
+
export declare function isSampled(traceparent: string): boolean;
|
|
65
|
+
/**
|
|
66
|
+
* Trace Context 工具类
|
|
67
|
+
*/
|
|
68
|
+
export declare class TraceContext {
|
|
69
|
+
/**
|
|
70
|
+
* 生成 traceparent
|
|
71
|
+
*/
|
|
72
|
+
static generate: typeof generateTraceParent;
|
|
73
|
+
/**
|
|
74
|
+
* 解析 traceparent
|
|
75
|
+
*/
|
|
76
|
+
static parse: typeof parseTraceParent;
|
|
77
|
+
/**
|
|
78
|
+
* 验证 traceparent
|
|
79
|
+
*/
|
|
80
|
+
static isValid: typeof isValidTraceParent;
|
|
81
|
+
/**
|
|
82
|
+
* 创建子 span
|
|
83
|
+
*/
|
|
84
|
+
static createChild: typeof createChildSpan;
|
|
85
|
+
/**
|
|
86
|
+
* 检查是否采样
|
|
87
|
+
*/
|
|
88
|
+
static isSampled: typeof isSampled;
|
|
89
|
+
/**
|
|
90
|
+
* 生成 Trace ID
|
|
91
|
+
*/
|
|
92
|
+
static generateTraceId: typeof generateTraceId;
|
|
93
|
+
/**
|
|
94
|
+
* 生成 Span ID
|
|
95
|
+
*/
|
|
96
|
+
static generateSpanId: typeof generateSpanId;
|
|
97
|
+
/**
|
|
98
|
+
* 验证 Trace ID
|
|
99
|
+
*/
|
|
100
|
+
static isValidTraceId: typeof isValidTraceId;
|
|
101
|
+
/**
|
|
102
|
+
* 验证 Span ID
|
|
103
|
+
*/
|
|
104
|
+
static isValidSpanId: typeof isValidSpanId;
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=trace.context.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"trace.context.d.ts","sourceRoot":"","sources":["../../../src/utils/trace.context.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EACR,WAAW,EACX,kBAAkB,EACrB,MAAM,UAAU,CAAC;AA6BlB;;;GAGG;AACH,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;GAGG;AACH,wBAAgB,cAAc,IAAI,MAAM,CAEvC;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGvD;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAGxD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,GAAE,kBAAuB,GAAG,MAAM,CAe5E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI,CA8BxE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,OAAO,GAAG,MAAM,CAgBpF;AAED;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAQtD;AAED;;GAEG;AACH,qBAAa,YAAY;IACrB;;OAEG;IACH,OAAc,QAAQ,6BAAuB;IAE7C;;OAEG;IACH,OAAc,KAAK,0BAAoB;IAEvC;;OAEG;IACH,OAAc,OAAO,4BAAsB;IAE3C;;OAEG;IACH,OAAc,WAAW,yBAAmB;IAE5C;;OAEG;IACH,OAAc,SAAS,mBAAa;IAEpC;;OAEG;IACH,OAAc,eAAe,yBAAmB;IAEhD;;OAEG;IACH,OAAc,cAAc,wBAAkB;IAE9C;;OAEG;IACH,OAAc,cAAc,wBAAkB;IAE9C;;OAEG;IACH,OAAc,aAAa,uBAAiB;CAC/C"}
|
package/docs/adapters.md
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# 适配器切换
|
|
2
|
+
|
|
3
|
+
## 支持的适配器
|
|
4
|
+
|
|
5
|
+
本库支持多种 HTTP 客户端适配器,你可以根据场景选择最适合的:
|
|
6
|
+
|
|
7
|
+
- **Axios** - 适合通用场景,功能丰富,生态完善
|
|
8
|
+
- **Undici** - Node.js 原生高性能 HTTP 客户端,适合高并发场景
|
|
9
|
+
|
|
10
|
+
## 切换适配器
|
|
11
|
+
|
|
12
|
+
```typescript
|
|
13
|
+
import { EClientAdapter } from 'nstarter-http-request';
|
|
14
|
+
|
|
15
|
+
// 使用 Axios 适配器(适合通用场景)
|
|
16
|
+
const axiosClient = new NsHttpClient().withAdapter(EClientAdapter.axios);
|
|
17
|
+
|
|
18
|
+
// 使用 Undici 适配器(高性能,Node.js 原生)
|
|
19
|
+
const undiciClient = new NsHttpClient().withAdapter(EClientAdapter.undici);
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## 在初始化时指定适配器
|
|
23
|
+
|
|
24
|
+
```typescript
|
|
25
|
+
import { NsHttpClient, EClientAdapter } from 'nstarter-http-request';
|
|
26
|
+
|
|
27
|
+
// 创建客户端实例时指定适配器
|
|
28
|
+
const client = new NsHttpClient({
|
|
29
|
+
adapter: EClientAdapter.axios,
|
|
30
|
+
security: {
|
|
31
|
+
enableDnsValidation: true,
|
|
32
|
+
enableIpValidation: true,
|
|
33
|
+
allowPrivateIp: false
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## 适配器选择建议
|
|
39
|
+
|
|
40
|
+
### 使用 Axios 的场景
|
|
41
|
+
|
|
42
|
+
- 需要丰富的配置选项
|
|
43
|
+
- 需要拦截器功能
|
|
44
|
+
- 需要广泛的浏览器兼容性(通过 polyfill)
|
|
45
|
+
- 团队熟悉 Axios API
|
|
46
|
+
|
|
47
|
+
### 使用 Undici 的场景
|
|
48
|
+
|
|
49
|
+
- 需要极致性能
|
|
50
|
+
- 高并发场景
|
|
51
|
+
- 纯 Node.js 环境
|
|
52
|
+
- 希望减少依赖体积
|
|
53
|
+
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
# 完整配置示例
|
|
2
|
+
|
|
3
|
+
以下是一个包含所有配置选项的完整示例:
|
|
4
|
+
|
|
5
|
+
```typescript
|
|
6
|
+
import { NsHttpClient, EClientAdapter } from 'nstarter-http-request';
|
|
7
|
+
|
|
8
|
+
const client = new NsHttpClient({
|
|
9
|
+
// 适配器配置
|
|
10
|
+
adapter: EClientAdapter.axios,
|
|
11
|
+
|
|
12
|
+
// 安全配置
|
|
13
|
+
security: {
|
|
14
|
+
rejectUnauthorized: true, // 是否验证 SSL 证书(生产环境建议 true)
|
|
15
|
+
enableDnsValidation: true, // 开启 DNS 验证
|
|
16
|
+
enableIpValidation: true, // 开启 IP 验证
|
|
17
|
+
allowPrivateIp: false, // 是否允许访问私有 IP(内网地址)
|
|
18
|
+
whitelist: [ // 域名白名单
|
|
19
|
+
'trusted.com', '*.trusted.com', // 匹配根域名和一级子域名
|
|
20
|
+
'api.example.com' // 仅匹配该域名
|
|
21
|
+
],
|
|
22
|
+
blacklist: [ // 域名黑名单
|
|
23
|
+
'malicious.com', '*.malicious.com', // 根域名和一级子域名
|
|
24
|
+
'unsafe.net'
|
|
25
|
+
],
|
|
26
|
+
dnsCacheTtl: 60000, // DNS 缓存 TTL(毫秒,默认 60 秒)
|
|
27
|
+
dnsCacheMaxSize: 500 // DNS 缓存最大条目数(默认 500,使用 LRU 淘汰策略)
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
// 日志配置
|
|
31
|
+
logging: {
|
|
32
|
+
enabled: true, // 是否启用日志
|
|
33
|
+
logRequestBody: true, // 是否记录请求体
|
|
34
|
+
logResponseBody: true, // 是否记录响应体
|
|
35
|
+
bodyMaxLength: 1024 * 1024, // 请求/响应体最大记录长度(字节,默认 1MB)
|
|
36
|
+
logger: customLogger, // 自定义日志记录器(可选,实现 ILogger 接口)
|
|
37
|
+
httpLogger: customHttpLogger, // 自定义 HTTP 日志记录器(可选,实现 IHttpClientLogger 接口)
|
|
38
|
+
filter: { // 日志过滤配置
|
|
39
|
+
methods: ['POST', 'PUT'], // 只记录指定 HTTP 方法
|
|
40
|
+
urlPatterns: [ // 只记录匹配的 URL(支持正则)
|
|
41
|
+
/\/api\//,
|
|
42
|
+
'https://api.example.com'
|
|
43
|
+
],
|
|
44
|
+
scenarios: ['payment'], // 只记录指定业务场景
|
|
45
|
+
statusCodes: [404, 500], // 只记录指定状态码
|
|
46
|
+
statusCodeRanges: [ // 只记录指定状态码范围
|
|
47
|
+
{ min: 400, max: 499 }, // 客户端错误
|
|
48
|
+
{ min: 500, max: 599 } // 服务端错误
|
|
49
|
+
],
|
|
50
|
+
onlyFailed: false, // 是否只记录失败请求
|
|
51
|
+
onlySuccess: false, // 是否只记录成功请求
|
|
52
|
+
minDuration: 100, // 只记录耗时超过指定毫秒的请求
|
|
53
|
+
customFilter: (options) => { // 自定义过滤函数
|
|
54
|
+
return options.request.method === 'POST';
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
// 请求配置
|
|
60
|
+
request: {
|
|
61
|
+
timeout: 30000, // 请求超时(毫秒,默认 30 秒)
|
|
62
|
+
retries: 3, // 重试次数(默认 0)
|
|
63
|
+
retryDelay: 1000, // 重试延迟(毫秒,默认 1 秒)
|
|
64
|
+
maxRedirects: 5, // 最大重定向次数(默认 5)
|
|
65
|
+
maxRequestBodySize: 10 * 1024 * 1024, // 最大请求体大小(字节,默认 10MB)
|
|
66
|
+
maxResponseBodySize: 50 * 1024 * 1024, // 最大响应体大小(字节,默认 50MB)
|
|
67
|
+
proxy: { // HTTP 代理配置(可选,不同于正向代理)
|
|
68
|
+
host: 'proxy.example.com',
|
|
69
|
+
port: 8080,
|
|
70
|
+
protocol: 'http', // 'http' | 'https'
|
|
71
|
+
auth: { // 代理认证(可选)
|
|
72
|
+
username: 'user',
|
|
73
|
+
password: 'pass'
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## 配置说明
|
|
81
|
+
|
|
82
|
+
### 适配器配置
|
|
83
|
+
|
|
84
|
+
- `adapter`: 指定使用的 HTTP 客户端适配器,可选值:`EClientAdapter.axios` 或 `EClientAdapter.undici`
|
|
85
|
+
|
|
86
|
+
### 安全配置
|
|
87
|
+
|
|
88
|
+
详细说明请参考 [安全配置文档](./security.md)
|
|
89
|
+
|
|
90
|
+
### 日志配置
|
|
91
|
+
|
|
92
|
+
详细说明请参考 [日志配置文档](./logging.md)
|
|
93
|
+
|
|
94
|
+
### 请求配置
|
|
95
|
+
|
|
96
|
+
- `timeout`: 请求超时时间(毫秒)
|
|
97
|
+
- `retries`: 请求失败时的重试次数
|
|
98
|
+
- `retryDelay`: 重试延迟时间(毫秒)
|
|
99
|
+
- `maxRedirects`: 最大重定向次数
|
|
100
|
+
- `maxRequestBodySize`: 最大请求体大小限制(字节)
|
|
101
|
+
- `maxResponseBodySize`: 最大响应体大小限制(字节)
|
|
102
|
+
- `proxy`: HTTP 代理配置(注意:这与正向代理不同,详见 [代理配置文档](./proxy.md))
|
|
103
|
+
|
|
104
|
+
## 默认配置值
|
|
105
|
+
|
|
106
|
+
以下是所有配置项的默认值,如果你不指定某个配置项,将使用以下默认值:
|
|
107
|
+
|
|
108
|
+
### 适配器配置
|
|
109
|
+
|
|
110
|
+
| 配置项 | 默认值 | 说明 |
|
|
111
|
+
|--------|--------|------|
|
|
112
|
+
| `adapter` | `EClientAdapter.axios` | 默认使用 Axios 适配器 |
|
|
113
|
+
|
|
114
|
+
### 安全配置
|
|
115
|
+
|
|
116
|
+
| 配置项 | 默认值 | 说明 |
|
|
117
|
+
|--------|--------|------|
|
|
118
|
+
| `rejectUnauthorized` | `true` | 默认验证 SSL 证书(生产环境建议保持为 true) |
|
|
119
|
+
| `enableDnsValidation` | `true` | 默认启用 DNS 验证 |
|
|
120
|
+
| `enableIpValidation` | `true` | 默认启用 IP 验证 |
|
|
121
|
+
| `allowPrivateIp` | `false` | 默认禁止访问私有 IP(内网地址) |
|
|
122
|
+
| `whitelist` | `[]` | 默认无白名单 |
|
|
123
|
+
| `blacklist` | `[]` | 默认无黑名单 |
|
|
124
|
+
| `dnsCacheTtl` | `60000` | DNS 缓存 TTL,默认 60 秒(60000 毫秒) |
|
|
125
|
+
| `dnsCacheMaxSize` | `500` | DNS 缓存最大条目数,默认 500,使用 LRU 淘汰策略 |
|
|
126
|
+
|
|
127
|
+
> **注意**:DNS 缓存最大 TTL 限制为 5 分钟(300000 毫秒),即使设置更大的值也会被限制为 5 分钟,避免过长的缓存时间导致内存积压。
|
|
128
|
+
|
|
129
|
+
### 日志配置
|
|
130
|
+
|
|
131
|
+
| 配置项 | 默认值 | 说明 |
|
|
132
|
+
|--------|--------|------|
|
|
133
|
+
| `enabled` | `true` | 默认启用日志 |
|
|
134
|
+
| `logRequestBody` | `true` | 默认记录请求体 |
|
|
135
|
+
| `logResponseBody` | `true` | 默认记录响应体 |
|
|
136
|
+
| `bodyMaxLength` | `1048576` | 请求/响应体最大记录长度,默认 1MB(1024 * 1024 字节) |
|
|
137
|
+
|
|
138
|
+
### 请求配置
|
|
139
|
+
|
|
140
|
+
| 配置项 | 默认值 | 说明 |
|
|
141
|
+
|--------|--------|------|
|
|
142
|
+
| `timeout` | `30000` | 请求超时时间,默认 30 秒(30000 毫秒) |
|
|
143
|
+
| `retries` | `0` | 默认不重试 |
|
|
144
|
+
| `retryDelay` | `1000` | 重试延迟时间,默认 1 秒(1000 毫秒) |
|
|
145
|
+
| `maxRedirects` | `5` | 最大重定向次数,默认 5 次 |
|
|
146
|
+
| `maxRequestBodySize` | `10485760` | 最大请求体大小,默认 10MB(10 * 1024 * 1024 字节) |
|
|
147
|
+
| `maxResponseBodySize` | `52428800` | 最大响应体大小,默认 50MB(50 * 1024 * 1024 字节) |
|
|
148
|
+
| `proxy` | `undefined` | 默认不使用 HTTP 代理 |
|
|
149
|
+
|