@push.rocks/smartproxy 12.0.0 → 13.1.2

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 (258) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/certificate/acme/acme-factory.d.ts +17 -0
  3. package/dist_ts/certificate/acme/acme-factory.js +40 -0
  4. package/dist_ts/certificate/acme/challenge-handler.d.ts +44 -0
  5. package/dist_ts/certificate/acme/challenge-handler.js +92 -0
  6. package/dist_ts/certificate/acme/index.d.ts +4 -0
  7. package/dist_ts/certificate/acme/index.js +5 -0
  8. package/dist_ts/certificate/events/certificate-events.d.ts +33 -0
  9. package/dist_ts/certificate/events/certificate-events.js +38 -0
  10. package/dist_ts/certificate/index.d.ts +24 -0
  11. package/dist_ts/certificate/index.js +39 -0
  12. package/dist_ts/certificate/models/certificate-types.d.ts +77 -0
  13. package/dist_ts/certificate/models/certificate-types.js +2 -0
  14. package/dist_ts/certificate/providers/cert-provisioner.d.ts +93 -0
  15. package/dist_ts/certificate/providers/cert-provisioner.js +262 -0
  16. package/dist_ts/certificate/providers/index.d.ts +4 -0
  17. package/dist_ts/certificate/providers/index.js +5 -0
  18. package/dist_ts/certificate/storage/file-storage.d.ts +66 -0
  19. package/dist_ts/certificate/storage/file-storage.js +194 -0
  20. package/dist_ts/certificate/storage/index.d.ts +4 -0
  21. package/dist_ts/certificate/storage/index.js +5 -0
  22. package/dist_ts/certificate/utils/certificate-helpers.d.ts +17 -0
  23. package/dist_ts/certificate/utils/certificate-helpers.js +45 -0
  24. package/dist_ts/common/eventUtils.d.ts +1 -1
  25. package/dist_ts/common/port80-adapter.d.ts +1 -1
  26. package/dist_ts/core/events/index.d.ts +4 -0
  27. package/dist_ts/core/events/index.js +5 -0
  28. package/dist_ts/core/index.d.ts +6 -0
  29. package/dist_ts/core/index.js +8 -0
  30. package/dist_ts/core/models/common-types.d.ts +82 -0
  31. package/dist_ts/core/models/common-types.js +15 -0
  32. package/dist_ts/core/models/index.d.ts +4 -0
  33. package/dist_ts/core/models/index.js +5 -0
  34. package/dist_ts/core/utils/event-utils.d.ts +15 -0
  35. package/dist_ts/core/utils/event-utils.js +19 -0
  36. package/dist_ts/core/utils/index.d.ts +6 -0
  37. package/dist_ts/core/utils/index.js +7 -0
  38. package/dist_ts/core/utils/ip-utils.d.ts +53 -0
  39. package/dist_ts/core/utils/ip-utils.js +153 -0
  40. package/dist_ts/core/utils/validation-utils.d.ts +61 -0
  41. package/dist_ts/core/utils/validation-utils.js +149 -0
  42. package/dist_ts/forwarding/config/domain-config.d.ts +12 -0
  43. package/dist_ts/forwarding/config/domain-config.js +12 -0
  44. package/dist_ts/forwarding/config/domain-manager.d.ts +86 -0
  45. package/dist_ts/forwarding/config/domain-manager.js +242 -0
  46. package/dist_ts/forwarding/config/forwarding-types.d.ts +104 -0
  47. package/dist_ts/forwarding/config/forwarding-types.js +50 -0
  48. package/dist_ts/forwarding/config/index.d.ts +6 -0
  49. package/dist_ts/forwarding/config/index.js +7 -0
  50. package/dist_ts/forwarding/factory/forwarding-factory.d.ts +25 -0
  51. package/dist_ts/forwarding/factory/forwarding-factory.js +138 -0
  52. package/dist_ts/forwarding/factory/index.d.ts +4 -0
  53. package/dist_ts/forwarding/factory/index.js +5 -0
  54. package/dist_ts/forwarding/handlers/base-handler.d.ts +55 -0
  55. package/dist_ts/forwarding/handlers/base-handler.js +94 -0
  56. package/dist_ts/forwarding/handlers/http-handler.d.ts +30 -0
  57. package/dist_ts/forwarding/handlers/http-handler.js +131 -0
  58. package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +29 -0
  59. package/dist_ts/forwarding/handlers/https-passthrough-handler.js +162 -0
  60. package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +36 -0
  61. package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +229 -0
  62. package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +35 -0
  63. package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +254 -0
  64. package/dist_ts/forwarding/handlers/index.d.ts +8 -0
  65. package/dist_ts/forwarding/handlers/index.js +9 -0
  66. package/dist_ts/forwarding/index.d.ts +19 -0
  67. package/dist_ts/forwarding/index.js +25 -0
  68. package/dist_ts/http/index.d.ts +15 -0
  69. package/dist_ts/http/index.js +20 -0
  70. package/dist_ts/http/models/http-types.d.ts +81 -0
  71. package/dist_ts/http/models/http-types.js +62 -0
  72. package/dist_ts/http/port80/acme-interfaces.d.ts +78 -0
  73. package/dist_ts/http/port80/acme-interfaces.js +6 -0
  74. package/dist_ts/http/port80/challenge-responder.d.ts +53 -0
  75. package/dist_ts/http/port80/challenge-responder.js +203 -0
  76. package/dist_ts/http/port80/index.d.ts +6 -0
  77. package/dist_ts/http/port80/index.js +9 -0
  78. package/dist_ts/http/port80/port80-handler.d.ts +121 -0
  79. package/dist_ts/http/port80/port80-handler.js +554 -0
  80. package/dist_ts/http/redirects/index.d.ts +4 -0
  81. package/dist_ts/http/redirects/index.js +5 -0
  82. package/dist_ts/http/router/index.d.ts +4 -0
  83. package/dist_ts/http/router/index.js +5 -0
  84. package/dist_ts/http/router/proxy-router.d.ts +115 -0
  85. package/dist_ts/http/router/proxy-router.js +325 -0
  86. package/dist_ts/index.d.ts +15 -8
  87. package/dist_ts/index.js +26 -10
  88. package/dist_ts/networkproxy/classes.np.certificatemanager.js +2 -2
  89. package/dist_ts/networkproxy/index.d.ts +1 -6
  90. package/dist_ts/networkproxy/index.js +4 -8
  91. package/dist_ts/plugins.d.ts +2 -1
  92. package/dist_ts/plugins.js +3 -2
  93. package/dist_ts/port80handler/classes.port80handler.d.ts +8 -136
  94. package/dist_ts/port80handler/classes.port80handler.js +14 -567
  95. package/dist_ts/proxies/index.d.ts +6 -0
  96. package/dist_ts/proxies/index.js +8 -0
  97. package/dist_ts/proxies/network-proxy/certificate-manager.d.ts +77 -0
  98. package/dist_ts/proxies/network-proxy/certificate-manager.js +373 -0
  99. package/dist_ts/proxies/network-proxy/connection-pool.d.ts +47 -0
  100. package/dist_ts/proxies/network-proxy/connection-pool.js +210 -0
  101. package/dist_ts/proxies/network-proxy/index.d.ts +10 -0
  102. package/dist_ts/proxies/network-proxy/index.js +12 -0
  103. package/dist_ts/proxies/network-proxy/models/index.d.ts +4 -0
  104. package/dist_ts/proxies/network-proxy/models/index.js +5 -0
  105. package/dist_ts/proxies/network-proxy/models/types.d.ts +80 -0
  106. package/dist_ts/proxies/network-proxy/models/types.js +35 -0
  107. package/dist_ts/proxies/network-proxy/network-proxy.d.ts +118 -0
  108. package/dist_ts/proxies/network-proxy/network-proxy.js +387 -0
  109. package/dist_ts/proxies/network-proxy/request-handler.d.ts +57 -0
  110. package/dist_ts/proxies/network-proxy/request-handler.js +394 -0
  111. package/dist_ts/proxies/network-proxy/websocket-handler.d.ts +38 -0
  112. package/dist_ts/proxies/network-proxy/websocket-handler.js +188 -0
  113. package/dist_ts/proxies/nftables-proxy/index.d.ts +5 -0
  114. package/dist_ts/proxies/nftables-proxy/index.js +6 -0
  115. package/dist_ts/proxies/nftables-proxy/models/errors.d.ts +15 -0
  116. package/dist_ts/proxies/nftables-proxy/models/errors.js +28 -0
  117. package/dist_ts/proxies/nftables-proxy/models/index.d.ts +5 -0
  118. package/dist_ts/proxies/nftables-proxy/models/index.js +6 -0
  119. package/dist_ts/proxies/nftables-proxy/models/interfaces.d.ts +75 -0
  120. package/dist_ts/proxies/nftables-proxy/models/interfaces.js +5 -0
  121. package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +136 -0
  122. package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +1516 -0
  123. package/dist_ts/proxies/smart-proxy/connection-handler.d.ts +39 -0
  124. package/dist_ts/proxies/smart-proxy/connection-handler.js +894 -0
  125. package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +78 -0
  126. package/dist_ts/proxies/smart-proxy/connection-manager.js +378 -0
  127. package/dist_ts/proxies/smart-proxy/domain-config-manager.d.ts +95 -0
  128. package/dist_ts/proxies/smart-proxy/domain-config-manager.js +255 -0
  129. package/dist_ts/proxies/smart-proxy/index.d.ts +13 -0
  130. package/dist_ts/proxies/smart-proxy/index.js +17 -0
  131. package/dist_ts/proxies/smart-proxy/models/index.d.ts +4 -0
  132. package/dist_ts/proxies/smart-proxy/models/index.js +5 -0
  133. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +107 -0
  134. package/dist_ts/proxies/smart-proxy/models/interfaces.js +2 -0
  135. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +62 -0
  136. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +316 -0
  137. package/dist_ts/proxies/smart-proxy/port-range-manager.d.ts +56 -0
  138. package/dist_ts/proxies/smart-proxy/port-range-manager.js +176 -0
  139. package/dist_ts/proxies/smart-proxy/security-manager.d.ts +64 -0
  140. package/dist_ts/proxies/smart-proxy/security-manager.js +149 -0
  141. package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +63 -0
  142. package/dist_ts/proxies/smart-proxy/smart-proxy.js +523 -0
  143. package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +47 -0
  144. package/dist_ts/proxies/smart-proxy/timeout-manager.js +154 -0
  145. package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +57 -0
  146. package/dist_ts/proxies/smart-proxy/tls-manager.js +132 -0
  147. package/dist_ts/smartproxy/classes.pp.networkproxybridge.d.ts +2 -2
  148. package/dist_ts/smartproxy/classes.pp.networkproxybridge.js +1 -1
  149. package/dist_ts/smartproxy/classes.pp.tlsmanager.js +2 -2
  150. package/dist_ts/smartproxy/classes.smartproxy.js +3 -3
  151. package/dist_ts/tls/alerts/index.d.ts +4 -0
  152. package/dist_ts/tls/alerts/index.js +5 -0
  153. package/dist_ts/tls/alerts/tls-alert.d.ts +150 -0
  154. package/dist_ts/tls/alerts/tls-alert.js +226 -0
  155. package/dist_ts/tls/index.d.ts +18 -0
  156. package/dist_ts/tls/index.js +27 -0
  157. package/dist_ts/tls/sni/client-hello-parser.d.ts +100 -0
  158. package/dist_ts/tls/sni/client-hello-parser.js +463 -0
  159. package/dist_ts/tls/sni/index.d.ts +4 -0
  160. package/dist_ts/tls/sni/index.js +5 -0
  161. package/dist_ts/tls/sni/sni-extraction.d.ts +58 -0
  162. package/dist_ts/tls/sni/sni-extraction.js +275 -0
  163. package/dist_ts/tls/sni/sni-handler.d.ts +154 -0
  164. package/dist_ts/tls/sni/sni-handler.js +191 -0
  165. package/dist_ts/tls/utils/index.d.ts +4 -0
  166. package/dist_ts/tls/utils/index.js +5 -0
  167. package/dist_ts/tls/utils/tls-utils.d.ts +158 -0
  168. package/dist_ts/tls/utils/tls-utils.js +187 -0
  169. package/package.json +1 -1
  170. package/readme.md +89 -21
  171. package/readme.plan.md +253 -469
  172. package/ts/00_commitinfo_data.ts +1 -1
  173. package/ts/certificate/acme/acme-factory.ts +48 -0
  174. package/ts/certificate/acme/challenge-handler.ts +110 -0
  175. package/ts/certificate/acme/index.ts +3 -0
  176. package/ts/certificate/events/certificate-events.ts +36 -0
  177. package/ts/certificate/index.ts +67 -0
  178. package/ts/certificate/models/certificate-types.ts +88 -0
  179. package/ts/certificate/providers/cert-provisioner.ts +326 -0
  180. package/ts/certificate/providers/index.ts +3 -0
  181. package/ts/certificate/storage/file-storage.ts +234 -0
  182. package/ts/certificate/storage/index.ts +3 -0
  183. package/ts/certificate/utils/certificate-helpers.ts +50 -0
  184. package/ts/common/eventUtils.ts +1 -1
  185. package/ts/common/port80-adapter.ts +1 -1
  186. package/ts/core/events/index.ts +3 -0
  187. package/ts/core/index.ts +8 -0
  188. package/ts/core/models/common-types.ts +91 -0
  189. package/ts/core/models/index.ts +5 -0
  190. package/ts/core/utils/event-utils.ts +34 -0
  191. package/ts/core/utils/index.ts +7 -0
  192. package/ts/core/utils/ip-utils.ts +175 -0
  193. package/ts/core/utils/validation-utils.ts +177 -0
  194. package/ts/{smartproxy/forwarding → forwarding/config}/domain-config.ts +1 -1
  195. package/ts/{smartproxy/forwarding → forwarding/config}/domain-manager.ts +8 -8
  196. package/ts/{smartproxy/types/forwarding.types.ts → forwarding/config/forwarding-types.ts} +6 -6
  197. package/ts/forwarding/config/index.ts +7 -0
  198. package/ts/{smartproxy/forwarding/forwarding.factory.ts → forwarding/factory/forwarding-factory.ts} +12 -11
  199. package/ts/forwarding/factory/index.ts +5 -0
  200. package/ts/{smartproxy/forwarding/forwarding.handler.ts → forwarding/handlers/base-handler.ts} +2 -2
  201. package/ts/{smartproxy/forwarding/http.handler.ts → forwarding/handlers/http-handler.ts} +13 -4
  202. package/ts/{smartproxy/forwarding/https-passthrough.handler.ts → forwarding/handlers/https-passthrough-handler.ts} +13 -4
  203. package/ts/{smartproxy/forwarding/https-terminate-to-http.handler.ts → forwarding/handlers/https-terminate-to-http-handler.ts} +3 -3
  204. package/ts/{smartproxy/forwarding/https-terminate-to-https.handler.ts → forwarding/handlers/https-terminate-to-https-handler.ts} +3 -3
  205. package/ts/forwarding/handlers/index.ts +9 -0
  206. package/ts/forwarding/index.ts +34 -0
  207. package/ts/http/index.ts +23 -0
  208. package/ts/http/models/http-types.ts +105 -0
  209. package/ts/http/port80/acme-interfaces.ts +85 -0
  210. package/ts/http/port80/challenge-responder.ts +246 -0
  211. package/ts/http/port80/index.ts +13 -0
  212. package/ts/{port80handler/classes.port80handler.ts → http/port80/port80-handler.ts} +164 -161
  213. package/ts/http/redirects/index.ts +3 -0
  214. package/ts/http/router/index.ts +5 -0
  215. package/ts/{classes.router.ts → http/router/proxy-router.ts} +27 -20
  216. package/ts/index.ts +32 -9
  217. package/ts/plugins.ts +2 -1
  218. package/ts/proxies/index.ts +8 -0
  219. package/ts/{networkproxy/classes.np.certificatemanager.ts → proxies/network-proxy/certificate-manager.ts} +17 -16
  220. package/ts/{networkproxy/classes.np.connectionpool.ts → proxies/network-proxy/connection-pool.ts} +3 -3
  221. package/ts/proxies/network-proxy/index.ts +13 -0
  222. package/ts/proxies/network-proxy/models/index.ts +4 -0
  223. package/ts/{networkproxy/classes.np.types.ts → proxies/network-proxy/models/types.ts} +7 -11
  224. package/ts/{networkproxy/classes.np.networkproxy.ts → proxies/network-proxy/network-proxy.ts} +31 -24
  225. package/ts/{networkproxy/classes.np.requesthandler.ts → proxies/network-proxy/request-handler.ts} +12 -7
  226. package/ts/{networkproxy/classes.np.websockethandler.ts → proxies/network-proxy/websocket-handler.ts} +6 -6
  227. package/ts/proxies/nftables-proxy/index.ts +5 -0
  228. package/ts/proxies/nftables-proxy/models/errors.ts +30 -0
  229. package/ts/proxies/nftables-proxy/models/index.ts +5 -0
  230. package/ts/proxies/nftables-proxy/models/interfaces.ts +94 -0
  231. package/ts/{nfttablesproxy/classes.nftablesproxy.ts → proxies/nftables-proxy/nftables-proxy.ts} +24 -126
  232. package/ts/{smartproxy/classes.pp.connectionhandler.ts → proxies/smart-proxy/connection-handler.ts} +12 -12
  233. package/ts/{smartproxy/classes.pp.connectionmanager.ts → proxies/smart-proxy/connection-manager.ts} +8 -8
  234. package/ts/{smartproxy/classes.pp.domainconfigmanager.ts → proxies/smart-proxy/domain-config-manager.ts} +15 -14
  235. package/ts/proxies/smart-proxy/index.ts +18 -0
  236. package/ts/proxies/smart-proxy/models/index.ts +4 -0
  237. package/ts/{smartproxy/classes.pp.interfaces.ts → proxies/smart-proxy/models/interfaces.ts} +12 -8
  238. package/ts/{smartproxy/classes.pp.networkproxybridge.ts → proxies/smart-proxy/network-proxy-bridge.ts} +14 -14
  239. package/ts/{smartproxy/classes.pp.portrangemanager.ts → proxies/smart-proxy/port-range-manager.ts} +1 -1
  240. package/ts/{smartproxy/classes.pp.securitymanager.ts → proxies/smart-proxy/security-manager.ts} +3 -3
  241. package/ts/{smartproxy/classes.smartproxy.ts → proxies/smart-proxy/smart-proxy.ts} +29 -24
  242. package/ts/{smartproxy/classes.pp.timeoutmanager.ts → proxies/smart-proxy/timeout-manager.ts} +3 -3
  243. package/ts/{smartproxy/classes.pp.tlsmanager.ts → proxies/smart-proxy/tls-manager.ts} +3 -3
  244. package/ts/tls/alerts/index.ts +3 -0
  245. package/ts/{smartproxy/classes.pp.tlsalert.ts → tls/alerts/tls-alert.ts} +44 -43
  246. package/ts/tls/index.ts +33 -0
  247. package/ts/tls/sni/client-hello-parser.ts +629 -0
  248. package/ts/tls/sni/index.ts +3 -0
  249. package/ts/tls/sni/sni-extraction.ts +353 -0
  250. package/ts/tls/sni/sni-handler.ts +264 -0
  251. package/ts/tls/utils/index.ts +3 -0
  252. package/ts/tls/utils/tls-utils.ts +201 -0
  253. package/ts/common/acmeFactory.ts +0 -23
  254. package/ts/helpers.certificates.ts +0 -30
  255. package/ts/networkproxy/index.ts +0 -7
  256. package/ts/smartproxy/classes.pp.certprovisioner.ts +0 -200
  257. package/ts/smartproxy/classes.pp.snihandler.ts +0 -1281
  258. package/ts/smartproxy/forwarding/index.ts +0 -52
@@ -0,0 +1,5 @@
1
+ export {};
2
+ /**
3
+ * Common event definitions
4
+ */
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL2V2ZW50cy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUE7O0dBRUcifQ==
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core functionality module
3
+ */
4
+ export * from './models/index.js';
5
+ export * from './utils/index.js';
6
+ export * from './events/index.js';
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Core functionality module
3
+ */
4
+ // Export submodules
5
+ export * from './models/index.js';
6
+ export * from './utils/index.js';
7
+ export * from './events/index.js';
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jb3JlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsb0JBQW9CO0FBQ3BCLGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLG1CQUFtQixDQUFDIn0=
@@ -0,0 +1,82 @@
1
+ /**
2
+ * Shared types for certificate management and domain options
3
+ */
4
+ /**
5
+ * Domain forwarding configuration
6
+ */
7
+ export interface IForwardConfig {
8
+ ip: string;
9
+ port: number;
10
+ }
11
+ /**
12
+ * Domain configuration options
13
+ */
14
+ export interface IDomainOptions {
15
+ domainName: string;
16
+ sslRedirect: boolean;
17
+ acmeMaintenance: boolean;
18
+ forward?: IForwardConfig;
19
+ acmeForward?: IForwardConfig;
20
+ }
21
+ /**
22
+ * Certificate data that can be emitted via events or set from outside
23
+ */
24
+ export interface ICertificateData {
25
+ domain: string;
26
+ certificate: string;
27
+ privateKey: string;
28
+ expiryDate: Date;
29
+ }
30
+ /**
31
+ * Events emitted by the Port80Handler
32
+ */
33
+ export declare enum Port80HandlerEvents {
34
+ CERTIFICATE_ISSUED = "certificate-issued",
35
+ CERTIFICATE_RENEWED = "certificate-renewed",
36
+ CERTIFICATE_FAILED = "certificate-failed",
37
+ CERTIFICATE_EXPIRING = "certificate-expiring",
38
+ MANAGER_STARTED = "manager-started",
39
+ MANAGER_STOPPED = "manager-stopped",
40
+ REQUEST_FORWARDED = "request-forwarded"
41
+ }
42
+ /**
43
+ * Certificate failure payload type
44
+ */
45
+ export interface ICertificateFailure {
46
+ domain: string;
47
+ error: string;
48
+ isRenewal: boolean;
49
+ }
50
+ /**
51
+ * Certificate expiry payload type
52
+ */
53
+ export interface ICertificateExpiring {
54
+ domain: string;
55
+ expiryDate: Date;
56
+ daysRemaining: number;
57
+ }
58
+ /**
59
+ * Forwarding configuration for specific domains in ACME setup
60
+ */
61
+ export interface IDomainForwardConfig {
62
+ domain: string;
63
+ forwardConfig?: IForwardConfig;
64
+ acmeForwardConfig?: IForwardConfig;
65
+ sslRedirect?: boolean;
66
+ }
67
+ /**
68
+ * Unified ACME configuration options used across proxies and handlers
69
+ */
70
+ export interface IAcmeOptions {
71
+ accountEmail?: string;
72
+ enabled?: boolean;
73
+ port?: number;
74
+ useProduction?: boolean;
75
+ httpsRedirectPort?: number;
76
+ renewThresholdDays?: number;
77
+ renewCheckIntervalHours?: number;
78
+ autoRenew?: boolean;
79
+ certificateStore?: string;
80
+ skipConfiguredCerts?: boolean;
81
+ domainForwards?: IDomainForwardConfig[];
82
+ }
@@ -0,0 +1,15 @@
1
+ import * as plugins from '../../plugins.js';
2
+ /**
3
+ * Events emitted by the Port80Handler
4
+ */
5
+ export var Port80HandlerEvents;
6
+ (function (Port80HandlerEvents) {
7
+ Port80HandlerEvents["CERTIFICATE_ISSUED"] = "certificate-issued";
8
+ Port80HandlerEvents["CERTIFICATE_RENEWED"] = "certificate-renewed";
9
+ Port80HandlerEvents["CERTIFICATE_FAILED"] = "certificate-failed";
10
+ Port80HandlerEvents["CERTIFICATE_EXPIRING"] = "certificate-expiring";
11
+ Port80HandlerEvents["MANAGER_STARTED"] = "manager-started";
12
+ Port80HandlerEvents["MANAGER_STOPPED"] = "manager-stopped";
13
+ Port80HandlerEvents["REQUEST_FORWARDED"] = "request-forwarded";
14
+ })(Port80HandlerEvents || (Port80HandlerEvents = {}));
15
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tbW9uLXR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvY29yZS9tb2RlbHMvY29tbW9uLXR5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFtQzVDOztHQUVHO0FBQ0gsTUFBTSxDQUFOLElBQVksbUJBUVg7QUFSRCxXQUFZLG1CQUFtQjtJQUM3QixnRUFBeUMsQ0FBQTtJQUN6QyxrRUFBMkMsQ0FBQTtJQUMzQyxnRUFBeUMsQ0FBQTtJQUN6QyxvRUFBNkMsQ0FBQTtJQUM3QywwREFBbUMsQ0FBQTtJQUNuQywwREFBbUMsQ0FBQTtJQUNuQyw4REFBdUMsQ0FBQTtBQUN6QyxDQUFDLEVBUlcsbUJBQW1CLEtBQW5CLG1CQUFtQixRQVE5QiJ9
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Core data models and interfaces
3
+ */
4
+ export * from './common-types.js';
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Core data models and interfaces
3
+ */
4
+ export * from './common-types.js';
5
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsbUJBQW1CLENBQUMifQ==
@@ -0,0 +1,15 @@
1
+ import type { Port80Handler } from '../../http/port80/port80-handler.js';
2
+ import type { ICertificateData, ICertificateFailure, ICertificateExpiring } from '../models/common-types.js';
3
+ /**
4
+ * Subscribers callback definitions for Port80Handler events
5
+ */
6
+ export interface IPort80HandlerSubscribers {
7
+ onCertificateIssued?: (data: ICertificateData) => void;
8
+ onCertificateRenewed?: (data: ICertificateData) => void;
9
+ onCertificateFailed?: (data: ICertificateFailure) => void;
10
+ onCertificateExpiring?: (data: ICertificateExpiring) => void;
11
+ }
12
+ /**
13
+ * Subscribes to Port80Handler events based on provided callbacks
14
+ */
15
+ export declare function subscribeToPort80Handler(handler: Port80Handler, subscribers: IPort80HandlerSubscribers): void;
@@ -0,0 +1,19 @@
1
+ import { Port80HandlerEvents } from '../models/common-types.js';
2
+ /**
3
+ * Subscribes to Port80Handler events based on provided callbacks
4
+ */
5
+ export function subscribeToPort80Handler(handler, subscribers) {
6
+ if (subscribers.onCertificateIssued) {
7
+ handler.on(Port80HandlerEvents.CERTIFICATE_ISSUED, subscribers.onCertificateIssued);
8
+ }
9
+ if (subscribers.onCertificateRenewed) {
10
+ handler.on(Port80HandlerEvents.CERTIFICATE_RENEWED, subscribers.onCertificateRenewed);
11
+ }
12
+ if (subscribers.onCertificateFailed) {
13
+ handler.on(Port80HandlerEvents.CERTIFICATE_FAILED, subscribers.onCertificateFailed);
14
+ }
15
+ if (subscribers.onCertificateExpiring) {
16
+ handler.on(Port80HandlerEvents.CERTIFICATE_EXPIRING, subscribers.onCertificateExpiring);
17
+ }
18
+ }
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXZlbnQtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL3V0aWxzL2V2ZW50LXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJCQUEyQixDQUFDO0FBYWhFOztHQUVHO0FBQ0gsTUFBTSxVQUFVLHdCQUF3QixDQUN0QyxPQUFzQixFQUN0QixXQUFzQztJQUV0QyxJQUFJLFdBQVcsQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO1FBQ3BDLE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsa0JBQWtCLEVBQUUsV0FBVyxDQUFDLG1CQUFtQixDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUNELElBQUksV0FBVyxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDckMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxtQkFBbUIsRUFBRSxXQUFXLENBQUMsb0JBQW9CLENBQUMsQ0FBQztJQUN4RixDQUFDO0lBQ0QsSUFBSSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNwQyxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLFdBQVcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3RGLENBQUM7SUFDRCxJQUFJLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQ3RDLE9BQU8sQ0FBQyxFQUFFLENBQUMsbUJBQW1CLENBQUMsb0JBQW9CLEVBQUUsV0FBVyxDQUFDLHFCQUFxQixDQUFDLENBQUM7SUFDMUYsQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Core utility functions
3
+ */
4
+ export * from './event-utils.js';
5
+ export * from './validation-utils.js';
6
+ export * from './ip-utils.js';
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Core utility functions
3
+ */
4
+ export * from './event-utils.js';
5
+ export * from './validation-utils.js';
6
+ export * from './ip-utils.js';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBRUgsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsZUFBZSxDQUFDIn0=
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Utility class for IP address operations
3
+ */
4
+ export declare class IpUtils {
5
+ /**
6
+ * Check if the IP matches any of the glob patterns
7
+ *
8
+ * This method checks IP addresses against glob patterns and handles IPv4/IPv6 normalization.
9
+ * It's used to implement IP filtering based on security configurations.
10
+ *
11
+ * @param ip - The IP address to check
12
+ * @param patterns - Array of glob patterns
13
+ * @returns true if IP matches any pattern, false otherwise
14
+ */
15
+ static isGlobIPMatch(ip: string, patterns: string[]): boolean;
16
+ /**
17
+ * Normalize IP addresses for consistent comparison
18
+ *
19
+ * @param ip The IP address to normalize
20
+ * @returns Array of normalized IP forms
21
+ */
22
+ static normalizeIP(ip: string): string[];
23
+ /**
24
+ * Check if an IP is authorized using security rules
25
+ *
26
+ * @param ip - The IP address to check
27
+ * @param allowedIPs - Array of allowed IP patterns
28
+ * @param blockedIPs - Array of blocked IP patterns
29
+ * @returns true if IP is authorized, false if blocked
30
+ */
31
+ static isIPAuthorized(ip: string, allowedIPs?: string[], blockedIPs?: string[]): boolean;
32
+ /**
33
+ * Check if an IP address is a private network address
34
+ *
35
+ * @param ip The IP address to check
36
+ * @returns true if the IP is a private network address, false otherwise
37
+ */
38
+ static isPrivateIP(ip: string): boolean;
39
+ /**
40
+ * Check if an IP address is a public network address
41
+ *
42
+ * @param ip The IP address to check
43
+ * @returns true if the IP is a public network address, false otherwise
44
+ */
45
+ static isPublicIP(ip: string): boolean;
46
+ /**
47
+ * Convert a subnet CIDR to an IP range for filtering
48
+ *
49
+ * @param cidr The CIDR notation (e.g., "192.168.1.0/24")
50
+ * @returns Array of glob patterns that match the CIDR range
51
+ */
52
+ static cidrToGlobPatterns(cidr: string): string[];
53
+ }
@@ -0,0 +1,153 @@
1
+ import * as plugins from '../../plugins.js';
2
+ /**
3
+ * Utility class for IP address operations
4
+ */
5
+ export class IpUtils {
6
+ /**
7
+ * Check if the IP matches any of the glob patterns
8
+ *
9
+ * This method checks IP addresses against glob patterns and handles IPv4/IPv6 normalization.
10
+ * It's used to implement IP filtering based on security configurations.
11
+ *
12
+ * @param ip - The IP address to check
13
+ * @param patterns - Array of glob patterns
14
+ * @returns true if IP matches any pattern, false otherwise
15
+ */
16
+ static isGlobIPMatch(ip, patterns) {
17
+ if (!ip || !patterns || patterns.length === 0)
18
+ return false;
19
+ // Normalize the IP being checked
20
+ const normalizedIPVariants = this.normalizeIP(ip);
21
+ if (normalizedIPVariants.length === 0)
22
+ return false;
23
+ // Normalize the pattern IPs for consistent comparison
24
+ const expandedPatterns = patterns.flatMap(pattern => this.normalizeIP(pattern));
25
+ // Check for any match between normalized IP variants and patterns
26
+ return normalizedIPVariants.some((ipVariant) => expandedPatterns.some((pattern) => plugins.minimatch(ipVariant, pattern)));
27
+ }
28
+ /**
29
+ * Normalize IP addresses for consistent comparison
30
+ *
31
+ * @param ip The IP address to normalize
32
+ * @returns Array of normalized IP forms
33
+ */
34
+ static normalizeIP(ip) {
35
+ if (!ip)
36
+ return [];
37
+ // Handle IPv4-mapped IPv6 addresses (::ffff:127.0.0.1)
38
+ if (ip.startsWith('::ffff:')) {
39
+ const ipv4 = ip.slice(7);
40
+ return [ip, ipv4];
41
+ }
42
+ // Handle IPv4 addresses by also checking IPv4-mapped form
43
+ if (/^\d{1,3}(\.\d{1,3}){3}$/.test(ip)) {
44
+ return [ip, `::ffff:${ip}`];
45
+ }
46
+ return [ip];
47
+ }
48
+ /**
49
+ * Check if an IP is authorized using security rules
50
+ *
51
+ * @param ip - The IP address to check
52
+ * @param allowedIPs - Array of allowed IP patterns
53
+ * @param blockedIPs - Array of blocked IP patterns
54
+ * @returns true if IP is authorized, false if blocked
55
+ */
56
+ static isIPAuthorized(ip, allowedIPs = [], blockedIPs = []) {
57
+ // Skip IP validation if no rules are defined
58
+ if (!ip || (allowedIPs.length === 0 && blockedIPs.length === 0)) {
59
+ return true;
60
+ }
61
+ // First check if IP is blocked - blocked IPs take precedence
62
+ if (blockedIPs.length > 0 && this.isGlobIPMatch(ip, blockedIPs)) {
63
+ return false;
64
+ }
65
+ // Then check if IP is allowed (if no allowed IPs are specified, all non-blocked IPs are allowed)
66
+ return allowedIPs.length === 0 || this.isGlobIPMatch(ip, allowedIPs);
67
+ }
68
+ /**
69
+ * Check if an IP address is a private network address
70
+ *
71
+ * @param ip The IP address to check
72
+ * @returns true if the IP is a private network address, false otherwise
73
+ */
74
+ static isPrivateIP(ip) {
75
+ if (!ip)
76
+ return false;
77
+ // Handle IPv4-mapped IPv6 addresses
78
+ if (ip.startsWith('::ffff:')) {
79
+ ip = ip.slice(7);
80
+ }
81
+ // Check IPv4 private ranges
82
+ if (/^\d{1,3}(\.\d{1,3}){3}$/.test(ip)) {
83
+ const parts = ip.split('.').map(Number);
84
+ // Check common private ranges
85
+ // 10.0.0.0/8
86
+ if (parts[0] === 10)
87
+ return true;
88
+ // 172.16.0.0/12
89
+ if (parts[0] === 172 && parts[1] >= 16 && parts[1] <= 31)
90
+ return true;
91
+ // 192.168.0.0/16
92
+ if (parts[0] === 192 && parts[1] === 168)
93
+ return true;
94
+ // 127.0.0.0/8 (localhost)
95
+ if (parts[0] === 127)
96
+ return true;
97
+ return false;
98
+ }
99
+ // IPv6 local addresses
100
+ return ip === '::1' || ip.startsWith('fc00:') || ip.startsWith('fd00:') || ip.startsWith('fe80:');
101
+ }
102
+ /**
103
+ * Check if an IP address is a public network address
104
+ *
105
+ * @param ip The IP address to check
106
+ * @returns true if the IP is a public network address, false otherwise
107
+ */
108
+ static isPublicIP(ip) {
109
+ return !this.isPrivateIP(ip);
110
+ }
111
+ /**
112
+ * Convert a subnet CIDR to an IP range for filtering
113
+ *
114
+ * @param cidr The CIDR notation (e.g., "192.168.1.0/24")
115
+ * @returns Array of glob patterns that match the CIDR range
116
+ */
117
+ static cidrToGlobPatterns(cidr) {
118
+ if (!cidr || !cidr.includes('/'))
119
+ return [];
120
+ const [ipPart, prefixPart] = cidr.split('/');
121
+ const prefix = parseInt(prefixPart, 10);
122
+ if (isNaN(prefix) || prefix < 0 || prefix > 32)
123
+ return [];
124
+ // For IPv4 only for now
125
+ if (!/^\d{1,3}(\.\d{1,3}){3}$/.test(ipPart))
126
+ return [];
127
+ const ipParts = ipPart.split('.').map(Number);
128
+ const fullMask = Math.pow(2, 32 - prefix) - 1;
129
+ // Convert IP to a numeric value
130
+ const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
131
+ // Calculate network address (IP & ~fullMask)
132
+ const networkNum = ipNum & ~fullMask;
133
+ // For large ranges, return wildcard patterns
134
+ if (prefix <= 8) {
135
+ return [`${(networkNum >>> 24) & 255}.*.*.*`];
136
+ }
137
+ else if (prefix <= 16) {
138
+ return [`${(networkNum >>> 24) & 255}.${(networkNum >>> 16) & 255}.*.*`];
139
+ }
140
+ else if (prefix <= 24) {
141
+ return [`${(networkNum >>> 24) & 255}.${(networkNum >>> 16) & 255}.${(networkNum >>> 8) & 255}.*`];
142
+ }
143
+ // For small ranges, create individual IP patterns
144
+ const patterns = [];
145
+ const maxAddresses = Math.min(256, Math.pow(2, 32 - prefix));
146
+ for (let i = 0; i < maxAddresses; i++) {
147
+ const currentIpNum = networkNum + i;
148
+ patterns.push(`${(currentIpNum >>> 24) & 255}.${(currentIpNum >>> 16) & 255}.${(currentIpNum >>> 8) & 255}.${currentIpNum & 255}`);
149
+ }
150
+ return patterns;
151
+ }
152
+ }
153
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXAtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL3V0aWxzL2lwLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUM7O0dBRUc7QUFDSCxNQUFNLE9BQU8sT0FBTztJQUNsQjs7Ozs7Ozs7O09BU0c7SUFDSSxNQUFNLENBQUMsYUFBYSxDQUFDLEVBQVUsRUFBRSxRQUFrQjtRQUN4RCxJQUFJLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTVELGlDQUFpQztRQUNqQyxNQUFNLG9CQUFvQixHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDbEQsSUFBSSxvQkFBb0IsQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRXBELHNEQUFzRDtRQUN0RCxNQUFNLGdCQUFnQixHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFaEYsa0VBQWtFO1FBQ2xFLE9BQU8sb0JBQW9CLENBQUMsSUFBSSxDQUFDLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FDN0MsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUMxRSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFdBQVcsQ0FBQyxFQUFVO1FBQ2xDLElBQUksQ0FBQyxFQUFFO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFbkIsdURBQXVEO1FBQ3ZELElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxTQUFT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
@@ -0,0 +1,61 @@
1
+ import type { IDomainOptions, IAcmeOptions } from '../models/common-types.js';
2
+ /**
3
+ * Collection of validation utilities for configuration and domain options
4
+ */
5
+ export declare class ValidationUtils {
6
+ /**
7
+ * Validates domain configuration options
8
+ *
9
+ * @param domainOptions The domain options to validate
10
+ * @returns An object with validation result and error message if invalid
11
+ */
12
+ static validateDomainOptions(domainOptions: IDomainOptions): {
13
+ isValid: boolean;
14
+ error?: string;
15
+ };
16
+ /**
17
+ * Validates ACME configuration options
18
+ *
19
+ * @param acmeOptions The ACME options to validate
20
+ * @returns An object with validation result and error message if invalid
21
+ */
22
+ static validateAcmeOptions(acmeOptions: IAcmeOptions): {
23
+ isValid: boolean;
24
+ error?: string;
25
+ };
26
+ /**
27
+ * Validates a port number
28
+ *
29
+ * @param port The port to validate
30
+ * @returns true if the port is valid, false otherwise
31
+ */
32
+ static isValidPort(port: number): boolean;
33
+ /**
34
+ * Validates a domain name
35
+ *
36
+ * @param domain The domain name to validate
37
+ * @returns true if the domain name is valid, false otherwise
38
+ */
39
+ static isValidDomainName(domain: string): boolean;
40
+ /**
41
+ * Validates an email address
42
+ *
43
+ * @param email The email to validate
44
+ * @returns true if the email is valid, false otherwise
45
+ */
46
+ static isValidEmail(email: string): boolean;
47
+ /**
48
+ * Validates a certificate format (PEM)
49
+ *
50
+ * @param cert The certificate content to validate
51
+ * @returns true if the certificate appears to be in PEM format, false otherwise
52
+ */
53
+ static isValidCertificate(cert: string): boolean;
54
+ /**
55
+ * Validates a private key format (PEM)
56
+ *
57
+ * @param key The private key content to validate
58
+ * @returns true if the key appears to be in PEM format, false otherwise
59
+ */
60
+ static isValidPrivateKey(key: string): boolean;
61
+ }
@@ -0,0 +1,149 @@
1
+ import * as plugins from '../../plugins.js';
2
+ /**
3
+ * Collection of validation utilities for configuration and domain options
4
+ */
5
+ export class ValidationUtils {
6
+ /**
7
+ * Validates domain configuration options
8
+ *
9
+ * @param domainOptions The domain options to validate
10
+ * @returns An object with validation result and error message if invalid
11
+ */
12
+ static validateDomainOptions(domainOptions) {
13
+ if (!domainOptions) {
14
+ return { isValid: false, error: 'Domain options cannot be null or undefined' };
15
+ }
16
+ if (!domainOptions.domainName) {
17
+ return { isValid: false, error: 'Domain name is required' };
18
+ }
19
+ // Check domain pattern
20
+ if (!this.isValidDomainName(domainOptions.domainName)) {
21
+ return { isValid: false, error: `Invalid domain name: ${domainOptions.domainName}` };
22
+ }
23
+ // Validate forward config if provided
24
+ if (domainOptions.forward) {
25
+ if (!domainOptions.forward.ip) {
26
+ return { isValid: false, error: 'Forward IP is required when forward is specified' };
27
+ }
28
+ if (!domainOptions.forward.port) {
29
+ return { isValid: false, error: 'Forward port is required when forward is specified' };
30
+ }
31
+ if (!this.isValidPort(domainOptions.forward.port)) {
32
+ return { isValid: false, error: `Invalid forward port: ${domainOptions.forward.port}` };
33
+ }
34
+ }
35
+ // Validate ACME forward config if provided
36
+ if (domainOptions.acmeForward) {
37
+ if (!domainOptions.acmeForward.ip) {
38
+ return { isValid: false, error: 'ACME forward IP is required when acmeForward is specified' };
39
+ }
40
+ if (!domainOptions.acmeForward.port) {
41
+ return { isValid: false, error: 'ACME forward port is required when acmeForward is specified' };
42
+ }
43
+ if (!this.isValidPort(domainOptions.acmeForward.port)) {
44
+ return { isValid: false, error: `Invalid ACME forward port: ${domainOptions.acmeForward.port}` };
45
+ }
46
+ }
47
+ return { isValid: true };
48
+ }
49
+ /**
50
+ * Validates ACME configuration options
51
+ *
52
+ * @param acmeOptions The ACME options to validate
53
+ * @returns An object with validation result and error message if invalid
54
+ */
55
+ static validateAcmeOptions(acmeOptions) {
56
+ if (!acmeOptions) {
57
+ return { isValid: false, error: 'ACME options cannot be null or undefined' };
58
+ }
59
+ if (acmeOptions.enabled) {
60
+ if (!acmeOptions.accountEmail) {
61
+ return { isValid: false, error: 'Account email is required when ACME is enabled' };
62
+ }
63
+ if (!this.isValidEmail(acmeOptions.accountEmail)) {
64
+ return { isValid: false, error: `Invalid email: ${acmeOptions.accountEmail}` };
65
+ }
66
+ if (acmeOptions.port && !this.isValidPort(acmeOptions.port)) {
67
+ return { isValid: false, error: `Invalid ACME port: ${acmeOptions.port}` };
68
+ }
69
+ if (acmeOptions.httpsRedirectPort && !this.isValidPort(acmeOptions.httpsRedirectPort)) {
70
+ return { isValid: false, error: `Invalid HTTPS redirect port: ${acmeOptions.httpsRedirectPort}` };
71
+ }
72
+ if (acmeOptions.renewThresholdDays && acmeOptions.renewThresholdDays < 1) {
73
+ return { isValid: false, error: 'Renew threshold days must be greater than 0' };
74
+ }
75
+ if (acmeOptions.renewCheckIntervalHours && acmeOptions.renewCheckIntervalHours < 1) {
76
+ return { isValid: false, error: 'Renew check interval hours must be greater than 0' };
77
+ }
78
+ }
79
+ return { isValid: true };
80
+ }
81
+ /**
82
+ * Validates a port number
83
+ *
84
+ * @param port The port to validate
85
+ * @returns true if the port is valid, false otherwise
86
+ */
87
+ static isValidPort(port) {
88
+ return typeof port === 'number' && port > 0 && port <= 65535 && Number.isInteger(port);
89
+ }
90
+ /**
91
+ * Validates a domain name
92
+ *
93
+ * @param domain The domain name to validate
94
+ * @returns true if the domain name is valid, false otherwise
95
+ */
96
+ static isValidDomainName(domain) {
97
+ if (!domain || typeof domain !== 'string') {
98
+ return false;
99
+ }
100
+ // Wildcard domain check (*.example.com)
101
+ if (domain.startsWith('*.')) {
102
+ domain = domain.substring(2);
103
+ }
104
+ // Simple domain validation pattern
105
+ const domainPattern = /^([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,}$/;
106
+ return domainPattern.test(domain);
107
+ }
108
+ /**
109
+ * Validates an email address
110
+ *
111
+ * @param email The email to validate
112
+ * @returns true if the email is valid, false otherwise
113
+ */
114
+ static isValidEmail(email) {
115
+ if (!email || typeof email !== 'string') {
116
+ return false;
117
+ }
118
+ // Basic email validation pattern
119
+ const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
120
+ return emailPattern.test(email);
121
+ }
122
+ /**
123
+ * Validates a certificate format (PEM)
124
+ *
125
+ * @param cert The certificate content to validate
126
+ * @returns true if the certificate appears to be in PEM format, false otherwise
127
+ */
128
+ static isValidCertificate(cert) {
129
+ if (!cert || typeof cert !== 'string') {
130
+ return false;
131
+ }
132
+ return cert.includes('-----BEGIN CERTIFICATE-----') &&
133
+ cert.includes('-----END CERTIFICATE-----');
134
+ }
135
+ /**
136
+ * Validates a private key format (PEM)
137
+ *
138
+ * @param key The private key content to validate
139
+ * @returns true if the key appears to be in PEM format, false otherwise
140
+ */
141
+ static isValidPrivateKey(key) {
142
+ if (!key || typeof key !== 'string') {
143
+ return false;
144
+ }
145
+ return key.includes('-----BEGIN PRIVATE KEY-----') &&
146
+ key.includes('-----END PRIVATE KEY-----');
147
+ }
148
+ }
149
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGlvbi11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvcmUvdXRpbHMvdmFsaWRhdGlvbi11dGlscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRzVDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFDMUI7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMscUJBQXFCLENBQUMsYUFBNkI7UUFDL0QsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ25CLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSw0Q0FBNEMsRUFBRSxDQUFDO1FBQ2pGLENBQUM7UUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQzlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSx5QkFBeUIsRUFBRSxDQUFDO1FBQzlELENBQUM7UUFFRCx1QkFBdUI7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsd0JBQXdCLGFBQWEsQ0FBQyxVQUFVLEVBQUUsRUFBRSxDQUFDO1FBQ3ZGLENBQUM7UUFFRCxzQ0FBc0M7UUFDdEMsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUM7Z0JBQzlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxrREFBa0QsRUFBRSxDQUFDO1lBQ3ZGLENBQUM7WUFFRCxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxJQUFJLEVBQUUsQ0FBQztnQkFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxL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
@@ -0,0 +1,12 @@
1
+ import type { IForwardConfig } from './forwarding-types.js';
2
+ /**
3
+ * Domain configuration with unified forwarding configuration
4
+ */
5
+ export interface IDomainConfig {
6
+ domains: string[];
7
+ forwarding: IForwardConfig;
8
+ }
9
+ /**
10
+ * Helper function to create a domain configuration
11
+ */
12
+ export declare function createDomainConfig(domains: string | string[], forwarding: IForwardConfig): IDomainConfig;
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Helper function to create a domain configuration
3
+ */
4
+ export function createDomainConfig(domains, forwarding) {
5
+ // Normalize domains to an array
6
+ const domainArray = Array.isArray(domains) ? domains : [domains];
7
+ return {
8
+ domains: domainArray,
9
+ forwarding
10
+ };
11
+ }
12
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG9tYWluLWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2ZvcndhcmRpbmcvY29uZmlnL2RvbWFpbi1jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBYUE7O0dBRUc7QUFDSCxNQUFNLFVBQVUsa0JBQWtCLENBQ2hDLE9BQTBCLEVBQzFCLFVBQTBCO0lBRTFCLGdDQUFnQztJQUNoQyxNQUFNLFdBQVcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLENBQUM7SUFFakUsT0FBTztRQUNMLE9BQU8sRUFBRSxXQUFXO1FBQ3BCLFVBQVU7S0FDWCxDQUFDO0FBQ0osQ0FBQyJ9