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,107 @@
1
+ import { compileIpv4Ranges, compileIpv6Ranges, } from '../utils/ip.range';
2
+ /**
3
+ * 私有 IP 地址范围(RFC 1918)
4
+ */
5
+ const PRIVATE_IPV4_RANGES = [
6
+ '10.0.0.0/8', // 10.0.0.0 - 10.255.255.255
7
+ '172.16.0.0/12', // 172.16.0.0 - 172.31.255.255
8
+ '192.168.0.0/16', // 192.168.0.0 - 192.168.255.255
9
+ '100.64.0.0/10' // 100.64.0.0 - 100.127.255.255 (Shared Address Space, RFC 6598)
10
+ ];
11
+ /**
12
+ * 私有 IPv6 地址范围
13
+ */
14
+ const PRIVATE_IPV6_RANGES = [
15
+ 'fc00::/7', // Unique Local Address (ULA)
16
+ 'fd00::/8' // Unique Local Address (ULA)
17
+ ];
18
+ /**
19
+ * 本地回环地址范围
20
+ */
21
+ const LOOPBACK_IPV4_RANGES = [
22
+ '127.0.0.0/8' // 127.0.0.0 - 127.255.255.255
23
+ ];
24
+ const LOOPBACK_IPV6_RANGES = [
25
+ '::1/128' // ::1
26
+ ];
27
+ /**
28
+ * Link-Local 地址范围
29
+ */
30
+ const LINK_LOCAL_IPV4_RANGES = [
31
+ '169.254.0.0/16' // 169.254.0.0 - 169.254.255.255
32
+ ];
33
+ const LINK_LOCAL_IPV6_RANGES = [
34
+ 'fe80::/10' // fe80:: - febf::
35
+ ];
36
+ /**
37
+ * 组播地址范围
38
+ */
39
+ const MULTICAST_IPV4_RANGES = [
40
+ '224.0.0.0/4' // 224.0.0.0 - 239.255.255.255
41
+ ];
42
+ const MULTICAST_IPV6_RANGES = [
43
+ 'ff00::/8' // ff00:: - ffff::
44
+ ];
45
+ /**
46
+ * 其他保留地址范围
47
+ */
48
+ const RESERVED_IPV4_RANGES = [
49
+ '0.0.0.0/8', // Current network (RFC 1122)
50
+ '192.0.0.0/24', // IETF Protocol Assignments (RFC 6890)
51
+ '192.0.2.0/24', // TEST-NET-1 (RFC 5737)
52
+ '198.18.0.0/15', // Benchmarking (RFC 2544)
53
+ '198.51.100.0/24', // TEST-NET-2 (RFC 5737)
54
+ '203.0.113.0/24', // TEST-NET-3 (RFC 5737)
55
+ '240.0.0.0/4', // Reserved (RFC 1112)
56
+ '255.255.255.255/32' // Broadcast
57
+ ];
58
+ const RESERVED_IPV6_RANGES = [
59
+ '::/128', // Unspecified
60
+ '::ffff:0:0/96', // IPv4-mapped IPv6
61
+ '64:ff9b::/96', // IPv4/IPv6 translation (RFC 6052)
62
+ '100::/64', // Discard prefix (RFC 6666)
63
+ '2001::/32', // TEREDO (RFC 4380)
64
+ '2001:10::/28', // Deprecated (RFC 4843)
65
+ '2001:db8::/32' // Documentation (RFC 3849)
66
+ ];
67
+ /**
68
+ * IPV4 校验地址范围(原始 CIDR 字符串)
69
+ */
70
+ export const IPV4_RANGES = {
71
+ private: PRIVATE_IPV4_RANGES,
72
+ loopback: LOOPBACK_IPV4_RANGES,
73
+ linkLocal: LINK_LOCAL_IPV4_RANGES,
74
+ multicast: MULTICAST_IPV4_RANGES,
75
+ reserved: RESERVED_IPV4_RANGES
76
+ };
77
+ /**
78
+ * IPV6 校验地址范围(原始 CIDR 字符串)
79
+ */
80
+ export const IPV6_RANGES = {
81
+ private: PRIVATE_IPV6_RANGES,
82
+ loopback: LOOPBACK_IPV6_RANGES,
83
+ linkLocal: LINK_LOCAL_IPV6_RANGES,
84
+ multicast: MULTICAST_IPV6_RANGES,
85
+ reserved: RESERVED_IPV6_RANGES
86
+ };
87
+ /**
88
+ * 预编译的 IPV4 校验地址范围(高性能版本)
89
+ */
90
+ export const COMPILED_IPV4_RANGES = {
91
+ private: compileIpv4Ranges(PRIVATE_IPV4_RANGES),
92
+ loopback: compileIpv4Ranges(LOOPBACK_IPV4_RANGES),
93
+ linkLocal: compileIpv4Ranges(LINK_LOCAL_IPV4_RANGES),
94
+ multicast: compileIpv4Ranges(MULTICAST_IPV4_RANGES),
95
+ reserved: compileIpv4Ranges(RESERVED_IPV4_RANGES)
96
+ };
97
+ /**
98
+ * 预编译的 IPV6 校验地址范围(高性能版本)
99
+ */
100
+ export const COMPILED_IPV6_RANGES = {
101
+ private: compileIpv6Ranges(PRIVATE_IPV6_RANGES),
102
+ loopback: compileIpv6Ranges(LOOPBACK_IPV6_RANGES),
103
+ linkLocal: compileIpv6Ranges(LINK_LOCAL_IPV6_RANGES),
104
+ multicast: compileIpv6Ranges(MULTICAST_IPV6_RANGES),
105
+ reserved: compileIpv6Ranges(RESERVED_IPV6_RANGES)
106
+ };
107
+ //# sourceMappingURL=ip.const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ip.const.js","sourceRoot":"","sources":["../../../src/const/ip.const.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,iBAAiB,EACjB,iBAAiB,GACpB,MAAM,mBAAmB,CAAC;AAM3B;;GAEG;AACH,MAAM,mBAAmB,GAAG;IACxB,YAAY,EAAQ,4BAA4B;IAChD,eAAe,EAAK,8BAA8B;IAClD,gBAAgB,EAAI,gCAAgC;IACpD,eAAe,CAAK,gEAAgE;CACvF,CAAC;AAEF;;GAEG;AACH,MAAM,mBAAmB,GAAG;IACxB,UAAU,EAAU,6BAA6B;IACjD,UAAU,CAAU,6BAA6B;CACpD,CAAC;AAEF;;GAEG;AACH,MAAM,oBAAoB,GAAG;IACzB,aAAa,CAAO,8BAA8B;CACrD,CAAC;AAEF,MAAM,oBAAoB,GAAG;IACzB,SAAS,CAAW,MAAM;CAC7B,CAAC;AAEF;;GAEG;AACH,MAAM,sBAAsB,GAAG;IAC3B,gBAAgB,CAAI,gCAAgC;CACvD,CAAC;AAEF,MAAM,sBAAsB,GAAG;IAC3B,WAAW,CAAS,kBAAkB;CACzC,CAAC;AAEF;;GAEG;AACH,MAAM,qBAAqB,GAAG;IAC1B,aAAa,CAAO,8BAA8B;CACrD,CAAC;AAEF,MAAM,qBAAqB,GAAG;IAC1B,UAAU,CAAU,kBAAkB;CACzC,CAAC;AAEF;;GAEG;AACH,MAAM,oBAAoB,GAAG;IACzB,WAAW,EAAS,6BAA6B;IACjD,cAAc,EAAM,uCAAuC;IAC3D,cAAc,EAAM,wBAAwB;IAC5C,eAAe,EAAK,0BAA0B;IAC9C,iBAAiB,EAAG,wBAAwB;IAC5C,gBAAgB,EAAI,wBAAwB;IAC5C,aAAa,EAAO,sBAAsB;IAC1C,oBAAoB,CAAC,YAAY;CACpC,CAAC;AAEF,MAAM,oBAAoB,GAAG;IACzB,QAAQ,EAAY,cAAc;IAClC,eAAe,EAAK,mBAAmB;IACvC,cAAc,EAAM,mCAAmC;IACvD,UAAU,EAAU,4BAA4B;IAChD,WAAW,EAAS,oBAAoB;IACxC,cAAc,EAAM,wBAAwB;IAC5C,eAAe,CAAK,2BAA2B;CAClD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,OAAO,EAAE,mBAAmB;IAC5B,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,sBAAsB;IACjC,SAAS,EAAE,qBAAqB;IAChC,QAAQ,EAAE,oBAAoB;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,WAAW,GAAG;IACvB,OAAO,EAAE,mBAAmB;IAC5B,QAAQ,EAAE,oBAAoB;IAC9B,SAAS,EAAE,sBAAsB;IACjC,SAAS,EAAE,qBAAqB;IAChC,QAAQ,EAAE,oBAAoB;CACjC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAM7B;IACA,OAAO,EAAE,iBAAiB,CAAC,mBAAmB,CAAC;IAC/C,QAAQ,EAAE,iBAAiB,CAAC,oBAAoB,CAAC;IACjD,SAAS,EAAE,iBAAiB,CAAC,sBAAsB,CAAC;IACpD,SAAS,EAAE,iBAAiB,CAAC,qBAAqB,CAAC;IACnD,QAAQ,EAAE,iBAAiB,CAAC,oBAAoB,CAAC;CACpD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAM7B;IACA,OAAO,EAAE,iBAAiB,CAAC,mBAAmB,CAAC;IAC/C,QAAQ,EAAE,iBAAiB,CAAC,oBAAoB,CAAC;IACjD,SAAS,EAAE,iBAAiB,CAAC,sBAAsB,CAAC;IACpD,SAAS,EAAE,iBAAiB,CAAC,qBAAqB,CAAC;IACnD,QAAQ,EAAE,iBAAiB,CAAC,oBAAoB,CAAC;CACpD,CAAC"}
@@ -0,0 +1,9 @@
1
+ export * from './adapter';
2
+ export * from './client';
3
+ export * from './config';
4
+ export * from './logger';
5
+ export * from './security';
6
+ export * from './types';
7
+ export * from './utils';
8
+ export * from './const';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,UAAU,CAAC;AACzB,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * 日志记录器基础接口和实现
3
+ */
4
+ import { ELogLevel } from '../const';
5
+ /**
6
+ * 抽象日志记录器基类
7
+ */
8
+ export class BaseLogger {
9
+ constructor(minLevel = ELogLevel.INFO) {
10
+ this.minLevel = minLevel;
11
+ }
12
+ /**
13
+ * 检查日志级别是否应该记录
14
+ * @param level 日志级别
15
+ * @returns 是否应该记录
16
+ */
17
+ shouldLog(level) {
18
+ const levels = [ELogLevel.DEBUG, ELogLevel.INFO, ELogLevel.WARN, ELogLevel.ERROR];
19
+ const minLevelIndex = levels.indexOf(this.minLevel);
20
+ const currentLevelIndex = levels.indexOf(level);
21
+ return currentLevelIndex >= minLevelIndex;
22
+ }
23
+ /**
24
+ * 设置最小日志级别
25
+ * @param level 最小日志级别
26
+ */
27
+ setMinLevel(level) {
28
+ this.minLevel = level;
29
+ }
30
+ /**
31
+ * 获取当前最小日志级别
32
+ * @returns 最小日志级别
33
+ */
34
+ getMinLevel() {
35
+ return this.minLevel;
36
+ }
37
+ }
38
+ /**
39
+ * 空日志记录器(不记录任何日志)
40
+ */
41
+ export class NullLogger {
42
+ debug() {
43
+ // 不做任何事
44
+ }
45
+ info() {
46
+ // 不做任何事
47
+ }
48
+ warn() {
49
+ // 不做任何事
50
+ }
51
+ error() {
52
+ // 不做任何事
53
+ }
54
+ }
55
+ //# sourceMappingURL=base.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base.js","sourceRoot":"","sources":["../../../src/logger/base.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC;;GAEG;AACH,MAAM,OAAgB,UAAU;IAG5B,YAAY,WAAsB,SAAS,CAAC,IAAI;QAC5C,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC7B,CAAC;IAED;;;;OAIG;IACO,SAAS,CAAC,KAAgB;QAChC,MAAM,MAAM,GAAG,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;QAClF,MAAM,aAAa,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACpD,MAAM,iBAAiB,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAChD,OAAO,iBAAiB,IAAI,aAAa,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACI,WAAW,CAAC,KAAgB;QAC/B,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED;;;OAGG;IACI,WAAW;QACd,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;CASJ;AAED;;GAEG;AACH,MAAM,OAAO,UAAU;IACZ,KAAK;QACR,QAAQ;IACZ,CAAC;IAEM,IAAI;QACP,QAAQ;IACZ,CAAC;IAEM,IAAI;QACP,QAAQ;IACZ,CAAC;IAEM,KAAK;QACR,QAAQ;IACZ,CAAC;CACJ"}
@@ -0,0 +1,205 @@
1
+ /**
2
+ * HTTP 客户端日志记录器实现
3
+ */
4
+ import { LogFilter } from './log.filter';
5
+ /**
6
+ * HTTP 客户端日志记录器
7
+ * 将通用 ILogger 包装成专门的 IHttpClientLogger
8
+ */
9
+ export class NsHttpClientLogger {
10
+ constructor(config) {
11
+ this.logger = config.logger;
12
+ this.filter = config.filter;
13
+ this.logRequestBody = config.logRequestBody ?? false;
14
+ this.logResponseBody = config.logResponseBody ?? false;
15
+ this.bodyMaxLength = config.bodyMaxLength ?? 1024;
16
+ }
17
+ /**
18
+ * 记录失败的请求
19
+ */
20
+ logFailed(resOptions) {
21
+ const fullOptions = {
22
+ ...resOptions,
23
+ isSuccess: false,
24
+ timestamp: Date.now()
25
+ };
26
+ // 应用过滤器
27
+ if (this.filter && !this.filter.shouldLog(fullOptions)) {
28
+ return;
29
+ }
30
+ const meta = this.buildLogMeta(fullOptions);
31
+ this.logger.error(`HTTP request failed: ${fullOptions.request.method} ${fullOptions.request.url}`, meta);
32
+ }
33
+ /**
34
+ * 记录成功的请求
35
+ */
36
+ logSuccess(resOptions) {
37
+ const fullOptions = {
38
+ ...resOptions,
39
+ isSuccess: true,
40
+ timestamp: Date.now()
41
+ };
42
+ // 应用过滤器
43
+ if (this.filter && !this.filter.shouldLog(fullOptions)) {
44
+ return;
45
+ }
46
+ const meta = this.buildLogMeta(fullOptions);
47
+ this.logger.info(`HTTP request succeeded: ${fullOptions.request.method} ${fullOptions.request.url}`, meta);
48
+ }
49
+ /**
50
+ * 构建日志元数据
51
+ */
52
+ buildLogMeta(options) {
53
+ const meta = {
54
+ method: options.request.method,
55
+ url: options.request.url,
56
+ duration: options.duration,
57
+ timestamp: options.timestamp,
58
+ retryCount: options.retryCount
59
+ };
60
+ // 添加场景信息
61
+ if (options.request.scenario) {
62
+ meta.scenario = options.request.scenario;
63
+ }
64
+ // 添加请求元数据
65
+ if (options.request.meta) {
66
+ meta.requestMeta = options.request.meta;
67
+ }
68
+ if (options.isSuccess) {
69
+ // 成功的请求
70
+ meta.status = options.response.status;
71
+ meta.statusText = options.response.statusText;
72
+ // 记录流式响应指标
73
+ if (options.streamMetrics) {
74
+ meta.streamMetrics = {
75
+ ttfb: options.streamMetrics.ttfb,
76
+ completed: options.streamMetrics.completed
77
+ };
78
+ if (options.streamMetrics.completed) {
79
+ meta.streamMetrics.totalDuration = options.streamMetrics.totalDuration;
80
+ meta.streamMetrics.streamDuration =
81
+ (options.streamMetrics.totalDuration ?? 0) - options.streamMetrics.ttfb;
82
+ if (options.streamMetrics.bytesTransferred !== undefined) {
83
+ meta.streamMetrics.bytesTransferred = options.streamMetrics.bytesTransferred;
84
+ meta.streamMetrics.bytesTransferredHuman =
85
+ this.formatBytes(options.streamMetrics.bytesTransferred);
86
+ // 计算吞吐量
87
+ const streamDuration = meta.streamMetrics.streamDuration;
88
+ if (streamDuration > 0) {
89
+ const throughputBps = options.streamMetrics.bytesTransferred / (streamDuration / 1000);
90
+ meta.streamMetrics.throughput = `${(throughputBps / 1024).toFixed(2)} KB/s`;
91
+ }
92
+ }
93
+ }
94
+ }
95
+ // 记录响应体(如果启用,且不是流式响应)
96
+ if (this.logResponseBody && !options.streamMetrics) {
97
+ meta.responseBody = this.truncateBody(options.response.data);
98
+ }
99
+ else if (options.streamMetrics && !options.streamMetrics.completed) {
100
+ // 流式响应但未完成,标记为流
101
+ meta.responseBody = '# --- stream (in progress) --- #';
102
+ }
103
+ else if (options.streamMetrics && options.streamMetrics.completed) {
104
+ // 流式响应已完成
105
+ meta.responseBody = '# --- stream (completed) --- #';
106
+ }
107
+ }
108
+ else {
109
+ // 失败的请求
110
+ meta.error = options.error.message;
111
+ meta.errorCode = options.errorCode;
112
+ if (options.status !== undefined) {
113
+ meta.status = options.status;
114
+ }
115
+ if (options.response) {
116
+ meta.responseBody = this.truncateBody(options.response.data);
117
+ }
118
+ }
119
+ // 记录请求体(如果启用)
120
+ if (this.logRequestBody) {
121
+ meta.requestBody = this.truncateBody(options.request.body);
122
+ }
123
+ return meta;
124
+ }
125
+ /**
126
+ * 格式化字节数为人类可读格式
127
+ */
128
+ formatBytes(bytes) {
129
+ if (bytes === 0) {
130
+ return '0 Bytes';
131
+ }
132
+ const k = 1024;
133
+ const sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];
134
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
135
+ return `${parseFloat((bytes / Math.pow(k, i)).toFixed(2))} ${sizes[i]}`;
136
+ }
137
+ /**
138
+ * 截断请求/响应体到指定长度
139
+ * 对于特殊类型(Stream、Buffer等)返回标记文本
140
+ */
141
+ truncateBody(body) {
142
+ // 处理 null 和 undefined
143
+ if (body === null) {
144
+ return '# --- null --- #';
145
+ }
146
+ if (body === undefined) {
147
+ return '# --- undefined --- #';
148
+ }
149
+ // 处理基本类型
150
+ if (typeof body === 'number' || typeof body === 'boolean') {
151
+ return body;
152
+ }
153
+ // 处理字符串
154
+ if (typeof body === 'string') {
155
+ if (body.length <= this.bodyMaxLength) {
156
+ return body;
157
+ }
158
+ return body.substring(0, this.bodyMaxLength) + '... (truncated)';
159
+ }
160
+ // 处理 Buffer
161
+ if (Buffer.isBuffer(body)) {
162
+ return `# --- buffer (${body.length} bytes) --- #`;
163
+ }
164
+ // 处理 Stream
165
+ if (typeof body === 'object' && typeof body.pipe === 'function') {
166
+ return '# --- stream --- #';
167
+ }
168
+ // 处理 ArrayBuffer
169
+ if (body instanceof ArrayBuffer ||
170
+ (typeof body === 'object' && body.constructor?.name === 'ArrayBuffer')) {
171
+ return `# --- arraybuffer (${body.byteLength} bytes) --- #`;
172
+ }
173
+ // 处理 Blob (浏览器环境)
174
+ if (typeof body === 'object' && body.constructor?.name === 'Blob') {
175
+ return `# --- blob (${body.size} bytes) --- #`;
176
+ }
177
+ // 处理普通对象和数组
178
+ try {
179
+ const bodyStr = JSON.stringify(body);
180
+ if (bodyStr.length <= this.bodyMaxLength) {
181
+ return body;
182
+ }
183
+ return bodyStr.substring(0, this.bodyMaxLength) + '... (truncated)';
184
+ }
185
+ catch {
186
+ return '[unable to serialize body]';
187
+ }
188
+ }
189
+ /**
190
+ * 创建 HTTP 客户端日志记录器
191
+ * @param logger 底层日志记录器
192
+ * @param filterConfig 过滤器配置
193
+ * @param options 其他选项
194
+ */
195
+ static create(logger, filterConfig, options) {
196
+ return new NsHttpClientLogger({
197
+ logger,
198
+ filter: filterConfig ? new LogFilter(filterConfig) : undefined,
199
+ logRequestBody: options?.logRequestBody,
200
+ logResponseBody: options?.logResponseBody,
201
+ bodyMaxLength: options?.bodyMaxLength
202
+ });
203
+ }
204
+ }
205
+ //# sourceMappingURL=http_client.logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http_client.logger.js","sourceRoot":"","sources":["../../../src/logger/http_client.logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './base';
2
+ export * from './http_client.logger';
3
+ export * from './log.filter';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/logger/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,sBAAsB,CAAC;AACrC,cAAc,cAAc,CAAC"}
@@ -0,0 +1,122 @@
1
+ /**
2
+ * 日志过滤器实现
3
+ */
4
+ /**
5
+ * 默认日志过滤器
6
+ */
7
+ export class LogFilter {
8
+ constructor(config = {}) {
9
+ this.config = config;
10
+ }
11
+ /**
12
+ * 判断是否应该记录此日志
13
+ * @param options 日志选项(成功或失败)
14
+ * @returns 是否应该记录
15
+ */
16
+ shouldLog(options) {
17
+ return (this.checkSuccessOrFailedFilter(options) &&
18
+ this.checkMethodFilter(options) &&
19
+ this.checkUrlPatternFilter(options) &&
20
+ this.checkScenarioFilter(options) &&
21
+ this.checkStatusCodeFilter(options) &&
22
+ this.checkDurationFilter(options) &&
23
+ this.checkCustomFilter(options));
24
+ }
25
+ /**
26
+ * 检查成功/失败过滤
27
+ */
28
+ checkSuccessOrFailedFilter(options) {
29
+ if (this.config.onlyFailed && options.isSuccess) {
30
+ return false;
31
+ }
32
+ if (this.config.onlySuccess && !options.isSuccess) {
33
+ return false;
34
+ }
35
+ return true;
36
+ }
37
+ /**
38
+ * 检查 HTTP 方法过滤
39
+ */
40
+ checkMethodFilter(options) {
41
+ if (this.config.methods && this.config.methods.length > 0) {
42
+ return this.config.methods.includes(options.request.method);
43
+ }
44
+ return true;
45
+ }
46
+ /**
47
+ * 检查 URL 模式过滤
48
+ */
49
+ checkUrlPatternFilter(options) {
50
+ if (this.config.urlPatterns && this.config.urlPatterns.length > 0) {
51
+ return this.config.urlPatterns.some(pattern => {
52
+ if (typeof pattern === 'string') {
53
+ return options.request.url.includes(pattern);
54
+ }
55
+ return pattern.test(options.request.url);
56
+ });
57
+ }
58
+ return true;
59
+ }
60
+ /**
61
+ * 检查场景过滤
62
+ */
63
+ checkScenarioFilter(options) {
64
+ if (this.config.scenarios && this.config.scenarios.length > 0) {
65
+ return !!options.request.scenario && this.config.scenarios.includes(options.request.scenario);
66
+ }
67
+ return true;
68
+ }
69
+ /**
70
+ * 检查状态码过滤
71
+ */
72
+ checkStatusCodeFilter(options) {
73
+ const status = options.isSuccess ? options.response.status : options.status;
74
+ if (status === undefined) {
75
+ return true;
76
+ }
77
+ // 检查特定状态码
78
+ if (this.config.statusCodes && this.config.statusCodes.length > 0) {
79
+ if (!this.config.statusCodes.includes(status)) {
80
+ return false;
81
+ }
82
+ }
83
+ // 检查状态码范围
84
+ if (this.config.statusCodeRanges && this.config.statusCodeRanges.length > 0) {
85
+ return this.config.statusCodeRanges.some(range => status >= range.min && status <= range.max);
86
+ }
87
+ return true;
88
+ }
89
+ /**
90
+ * 检查请求耗时过滤
91
+ */
92
+ checkDurationFilter(options) {
93
+ if (this.config.minDuration !== undefined && options.duration !== undefined) {
94
+ return options.duration >= this.config.minDuration;
95
+ }
96
+ return true;
97
+ }
98
+ /**
99
+ * 检查自定义过滤函数
100
+ */
101
+ checkCustomFilter(options) {
102
+ if (this.config.customFilter) {
103
+ return this.config.customFilter(options);
104
+ }
105
+ return true;
106
+ }
107
+ /**
108
+ * 更新过滤器配置
109
+ * @param config 新的配置
110
+ */
111
+ updateConfig(config) {
112
+ this.config = { ...this.config, ...config };
113
+ }
114
+ /**
115
+ * 获取当前配置
116
+ * @returns 当前配置
117
+ */
118
+ getConfig() {
119
+ return { ...this.config };
120
+ }
121
+ }
122
+ //# sourceMappingURL=log.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"log.filter.js","sourceRoot":"","sources":["../../../src/logger/log.filter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,133 @@
1
+ /**
2
+ * DNS 验证器
3
+ */
4
+ import { promises as dns } from 'node:dns';
5
+ import { LRUCache } from 'lru-cache';
6
+ import { CommonUtils } from '../utils';
7
+ import { DEFAULT_DNS_CACHE_TTL, DEFAULT_DNS_RESOLVE_TIMEOUT, DEFAULT_DNS_CACHE_MAX_SIZE } from '../const';
8
+ import { IpValidator } from './ip.validator';
9
+ /**
10
+ * DNS 验证器类
11
+ */
12
+ export class DnsValidator {
13
+ constructor(cacheTtl = DEFAULT_DNS_CACHE_TTL, resolveTimeout = DEFAULT_DNS_RESOLVE_TIMEOUT, maxCacheSize = DEFAULT_DNS_CACHE_MAX_SIZE) {
14
+ this.cacheTtl = cacheTtl;
15
+ this.resolveTimeout = resolveTimeout;
16
+ this.cache = new LRUCache({
17
+ max: maxCacheSize,
18
+ ttl: cacheTtl,
19
+ // 启用 TTL 自动清理
20
+ ttlAutopurge: true,
21
+ // 更新访问时间,实现真正的 LRU
22
+ updateAgeOnGet: true,
23
+ // 更新访问时间时也更新 has() 调用
24
+ updateAgeOnHas: true,
25
+ });
26
+ }
27
+ /**
28
+ * 解析域名
29
+ * @param hostname 域名
30
+ * @returns DNS 解析结果
31
+ */
32
+ async resolve(hostname) {
33
+ // 检查缓存
34
+ const cached = this.cache.get(hostname);
35
+ if (cached) {
36
+ return cached;
37
+ }
38
+ try {
39
+ // 尝试解析 IPv4 和 IPv6
40
+ const addresses = [];
41
+ try {
42
+ const ipv4Addresses = await CommonUtils.withTimeout(dns.resolve4(hostname), this.resolveTimeout, 'DNS resolution timed out');
43
+ addresses.push(...ipv4Addresses);
44
+ }
45
+ catch {
46
+ // IPv4 解析失败,继续尝试 IPv6
47
+ }
48
+ try {
49
+ const ipv6Addresses = await CommonUtils.withTimeout(dns.resolve6(hostname), this.resolveTimeout, 'DNS resolution timed out');
50
+ addresses.push(...ipv6Addresses);
51
+ }
52
+ catch {
53
+ // IPv6 解析失败
54
+ }
55
+ if (addresses.length === 0) {
56
+ throw new Error(`Unable to resolve hostname: ${hostname}`);
57
+ }
58
+ const result = {
59
+ hostname,
60
+ addresses,
61
+ timestamp: Date.now(),
62
+ ttl: this.cacheTtl
63
+ };
64
+ // 存入缓存,LRUCache 会自动处理 TTL 和容量限制
65
+ this.cache.set(hostname, result);
66
+ return result;
67
+ }
68
+ catch (error) {
69
+ throw new Error(`DNS resolution failed for ${hostname}: ${error instanceof Error ? error.message : String(error)}`);
70
+ }
71
+ }
72
+ /**
73
+ * 解析并验证域名(包括 IP 安全检查)
74
+ * @param hostname 域名
75
+ * @param allowPrivateIp 是否允许私有 IP
76
+ * @returns DNS 解析结果和验证结果
77
+ */
78
+ async resolveAndValidate(hostname, allowPrivateIp = false) {
79
+ const dnsResult = await this.resolve(hostname);
80
+ const validationResults = IpValidator.validateMany(dnsResult.addresses, allowPrivateIp);
81
+ const invalidIps = validationResults
82
+ .filter(result => !result.valid)
83
+ .map(result => result.ip);
84
+ return {
85
+ dnsResult,
86
+ allValid: invalidIps.length === 0,
87
+ invalidIps
88
+ };
89
+ }
90
+ /**
91
+ * 清空缓存
92
+ */
93
+ clearCache() {
94
+ this.cache.clear();
95
+ }
96
+ /**
97
+ * 清除指定域名的缓存
98
+ * @param hostname 域名
99
+ */
100
+ clearCacheFor(hostname) {
101
+ this.cache.delete(hostname);
102
+ }
103
+ /**
104
+ * 获取缓存大小
105
+ * @returns 缓存条目数量
106
+ */
107
+ getCacheSize() {
108
+ return this.cache.size;
109
+ }
110
+ /**
111
+ * 清理过期的缓存条目
112
+ * LRUCache 会自动清理过期条目(ttlAutopurge: true),此方法主动触发清理
113
+ */
114
+ cleanExpiredCache() {
115
+ this.cache.purgeStale();
116
+ }
117
+ /**
118
+ * 获取缓存的最大容量
119
+ * @returns 最大缓存条目数量
120
+ */
121
+ getMaxCacheSize() {
122
+ return this.cache.max;
123
+ }
124
+ /**
125
+ * 检查缓存中是否存在指定域名
126
+ * @param hostname 域名
127
+ * @returns 是否存在
128
+ */
129
+ hasCache(hostname) {
130
+ return this.cache.has(hostname);
131
+ }
132
+ }
133
+ //# sourceMappingURL=dns.validator.js.map