@push.rocks/smartproxy 11.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 (261) 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/smartproxy/forwarding/index.d.ts +1 -1
  152. package/dist_ts/smartproxy/forwarding/index.js +2 -2
  153. package/dist_ts/tls/alerts/index.d.ts +4 -0
  154. package/dist_ts/tls/alerts/index.js +5 -0
  155. package/dist_ts/tls/alerts/tls-alert.d.ts +150 -0
  156. package/dist_ts/tls/alerts/tls-alert.js +226 -0
  157. package/dist_ts/tls/index.d.ts +18 -0
  158. package/dist_ts/tls/index.js +27 -0
  159. package/dist_ts/tls/sni/client-hello-parser.d.ts +100 -0
  160. package/dist_ts/tls/sni/client-hello-parser.js +463 -0
  161. package/dist_ts/tls/sni/index.d.ts +4 -0
  162. package/dist_ts/tls/sni/index.js +5 -0
  163. package/dist_ts/tls/sni/sni-extraction.d.ts +58 -0
  164. package/dist_ts/tls/sni/sni-extraction.js +275 -0
  165. package/dist_ts/tls/sni/sni-handler.d.ts +154 -0
  166. package/dist_ts/tls/sni/sni-handler.js +191 -0
  167. package/dist_ts/tls/utils/index.d.ts +4 -0
  168. package/dist_ts/tls/utils/index.js +5 -0
  169. package/dist_ts/tls/utils/tls-utils.d.ts +158 -0
  170. package/dist_ts/tls/utils/tls-utils.js +187 -0
  171. package/package.json +1 -1
  172. package/readme.md +89 -21
  173. package/readme.plan.md +253 -469
  174. package/ts/00_commitinfo_data.ts +1 -1
  175. package/ts/certificate/acme/acme-factory.ts +48 -0
  176. package/ts/certificate/acme/challenge-handler.ts +110 -0
  177. package/ts/certificate/acme/index.ts +3 -0
  178. package/ts/certificate/events/certificate-events.ts +36 -0
  179. package/ts/certificate/index.ts +67 -0
  180. package/ts/certificate/models/certificate-types.ts +88 -0
  181. package/ts/certificate/providers/cert-provisioner.ts +326 -0
  182. package/ts/certificate/providers/index.ts +3 -0
  183. package/ts/certificate/storage/file-storage.ts +234 -0
  184. package/ts/certificate/storage/index.ts +3 -0
  185. package/ts/certificate/utils/certificate-helpers.ts +50 -0
  186. package/ts/common/eventUtils.ts +1 -1
  187. package/ts/common/port80-adapter.ts +1 -1
  188. package/ts/core/events/index.ts +3 -0
  189. package/ts/core/index.ts +8 -0
  190. package/ts/core/models/common-types.ts +91 -0
  191. package/ts/core/models/index.ts +5 -0
  192. package/ts/core/utils/event-utils.ts +34 -0
  193. package/ts/core/utils/index.ts +7 -0
  194. package/ts/core/utils/ip-utils.ts +175 -0
  195. package/ts/core/utils/validation-utils.ts +177 -0
  196. package/ts/{smartproxy/forwarding → forwarding/config}/domain-config.ts +1 -1
  197. package/ts/{smartproxy/forwarding → forwarding/config}/domain-manager.ts +8 -8
  198. package/ts/{smartproxy/types/forwarding.types.ts → forwarding/config/forwarding-types.ts} +6 -6
  199. package/ts/forwarding/config/index.ts +7 -0
  200. package/ts/{smartproxy/forwarding/forwarding.factory.ts → forwarding/factory/forwarding-factory.ts} +12 -11
  201. package/ts/forwarding/factory/index.ts +5 -0
  202. package/ts/{smartproxy/forwarding/forwarding.handler.ts → forwarding/handlers/base-handler.ts} +2 -2
  203. package/ts/{smartproxy/forwarding/http.handler.ts → forwarding/handlers/http-handler.ts} +13 -4
  204. package/ts/{smartproxy/forwarding/https-passthrough.handler.ts → forwarding/handlers/https-passthrough-handler.ts} +13 -4
  205. package/ts/{smartproxy/forwarding/https-terminate-to-http.handler.ts → forwarding/handlers/https-terminate-to-http-handler.ts} +3 -3
  206. package/ts/{smartproxy/forwarding/https-terminate-to-https.handler.ts → forwarding/handlers/https-terminate-to-https-handler.ts} +3 -3
  207. package/ts/forwarding/handlers/index.ts +9 -0
  208. package/ts/forwarding/index.ts +34 -0
  209. package/ts/http/index.ts +23 -0
  210. package/ts/http/models/http-types.ts +105 -0
  211. package/ts/http/port80/acme-interfaces.ts +85 -0
  212. package/ts/http/port80/challenge-responder.ts +246 -0
  213. package/ts/http/port80/index.ts +13 -0
  214. package/ts/{port80handler/classes.port80handler.ts → http/port80/port80-handler.ts} +164 -161
  215. package/ts/http/redirects/index.ts +3 -0
  216. package/ts/http/router/index.ts +5 -0
  217. package/ts/{classes.router.ts → http/router/proxy-router.ts} +27 -20
  218. package/ts/index.ts +32 -9
  219. package/ts/plugins.ts +2 -1
  220. package/ts/proxies/index.ts +8 -0
  221. package/ts/{networkproxy/classes.np.certificatemanager.ts → proxies/network-proxy/certificate-manager.ts} +17 -16
  222. package/ts/{networkproxy/classes.np.connectionpool.ts → proxies/network-proxy/connection-pool.ts} +3 -3
  223. package/ts/proxies/network-proxy/index.ts +13 -0
  224. package/ts/proxies/network-proxy/models/index.ts +4 -0
  225. package/ts/{networkproxy/classes.np.types.ts → proxies/network-proxy/models/types.ts} +7 -11
  226. package/ts/{networkproxy/classes.np.networkproxy.ts → proxies/network-proxy/network-proxy.ts} +31 -24
  227. package/ts/{networkproxy/classes.np.requesthandler.ts → proxies/network-proxy/request-handler.ts} +12 -7
  228. package/ts/{networkproxy/classes.np.websockethandler.ts → proxies/network-proxy/websocket-handler.ts} +6 -6
  229. package/ts/proxies/nftables-proxy/index.ts +5 -0
  230. package/ts/proxies/nftables-proxy/models/errors.ts +30 -0
  231. package/ts/proxies/nftables-proxy/models/index.ts +5 -0
  232. package/ts/proxies/nftables-proxy/models/interfaces.ts +94 -0
  233. package/ts/{nfttablesproxy/classes.nftablesproxy.ts → proxies/nftables-proxy/nftables-proxy.ts} +24 -126
  234. package/ts/{smartproxy/classes.pp.connectionhandler.ts → proxies/smart-proxy/connection-handler.ts} +12 -12
  235. package/ts/{smartproxy/classes.pp.connectionmanager.ts → proxies/smart-proxy/connection-manager.ts} +8 -8
  236. package/ts/{smartproxy/classes.pp.domainconfigmanager.ts → proxies/smart-proxy/domain-config-manager.ts} +15 -14
  237. package/ts/proxies/smart-proxy/index.ts +18 -0
  238. package/ts/proxies/smart-proxy/models/index.ts +4 -0
  239. package/ts/{smartproxy/classes.pp.interfaces.ts → proxies/smart-proxy/models/interfaces.ts} +12 -8
  240. package/ts/{smartproxy/classes.pp.networkproxybridge.ts → proxies/smart-proxy/network-proxy-bridge.ts} +14 -14
  241. package/ts/{smartproxy/classes.pp.portrangemanager.ts → proxies/smart-proxy/port-range-manager.ts} +1 -1
  242. package/ts/{smartproxy/classes.pp.securitymanager.ts → proxies/smart-proxy/security-manager.ts} +3 -3
  243. package/ts/{smartproxy/classes.smartproxy.ts → proxies/smart-proxy/smart-proxy.ts} +29 -24
  244. package/ts/{smartproxy/classes.pp.timeoutmanager.ts → proxies/smart-proxy/timeout-manager.ts} +3 -3
  245. package/ts/{smartproxy/classes.pp.tlsmanager.ts → proxies/smart-proxy/tls-manager.ts} +3 -3
  246. package/ts/tls/alerts/index.ts +3 -0
  247. package/ts/{smartproxy/classes.pp.tlsalert.ts → tls/alerts/tls-alert.ts} +44 -43
  248. package/ts/tls/index.ts +33 -0
  249. package/ts/tls/sni/client-hello-parser.ts +629 -0
  250. package/ts/tls/sni/index.ts +3 -0
  251. package/ts/tls/sni/sni-extraction.ts +353 -0
  252. package/ts/tls/sni/sni-handler.ts +264 -0
  253. package/ts/tls/utils/index.ts +3 -0
  254. package/ts/tls/utils/tls-utils.ts +201 -0
  255. package/ts/common/acmeFactory.ts +0 -23
  256. package/ts/examples/forwarding-example.ts +0 -128
  257. package/ts/helpers.certificates.ts +0 -30
  258. package/ts/networkproxy/index.ts +0 -7
  259. package/ts/smartproxy/classes.pp.certprovisioner.ts +0 -200
  260. package/ts/smartproxy/classes.pp.snihandler.ts +0 -1281
  261. package/ts/smartproxy/forwarding/index.ts +0 -52
@@ -0,0 +1,201 @@
1
+ import * as plugins from '../../plugins.js';
2
+
3
+ /**
4
+ * TLS record types as defined in various RFCs
5
+ */
6
+ export enum TlsRecordType {
7
+ CHANGE_CIPHER_SPEC = 20,
8
+ ALERT = 21,
9
+ HANDSHAKE = 22,
10
+ APPLICATION_DATA = 23,
11
+ HEARTBEAT = 24, // RFC 6520
12
+ }
13
+
14
+ /**
15
+ * TLS handshake message types
16
+ */
17
+ export enum TlsHandshakeType {
18
+ HELLO_REQUEST = 0,
19
+ CLIENT_HELLO = 1,
20
+ SERVER_HELLO = 2,
21
+ NEW_SESSION_TICKET = 4,
22
+ ENCRYPTED_EXTENSIONS = 8, // TLS 1.3
23
+ CERTIFICATE = 11,
24
+ SERVER_KEY_EXCHANGE = 12,
25
+ CERTIFICATE_REQUEST = 13,
26
+ SERVER_HELLO_DONE = 14,
27
+ CERTIFICATE_VERIFY = 15,
28
+ CLIENT_KEY_EXCHANGE = 16,
29
+ FINISHED = 20,
30
+ }
31
+
32
+ /**
33
+ * TLS extension types
34
+ */
35
+ export enum TlsExtensionType {
36
+ SERVER_NAME = 0, // SNI
37
+ MAX_FRAGMENT_LENGTH = 1,
38
+ CLIENT_CERTIFICATE_URL = 2,
39
+ TRUSTED_CA_KEYS = 3,
40
+ TRUNCATED_HMAC = 4,
41
+ STATUS_REQUEST = 5, // OCSP
42
+ SUPPORTED_GROUPS = 10, // Previously named "elliptic_curves"
43
+ EC_POINT_FORMATS = 11,
44
+ SIGNATURE_ALGORITHMS = 13,
45
+ APPLICATION_LAYER_PROTOCOL_NEGOTIATION = 16, // ALPN
46
+ SIGNED_CERTIFICATE_TIMESTAMP = 18, // Certificate Transparency
47
+ PADDING = 21,
48
+ SESSION_TICKET = 35,
49
+ PRE_SHARED_KEY = 41, // TLS 1.3
50
+ EARLY_DATA = 42, // TLS 1.3 0-RTT
51
+ SUPPORTED_VERSIONS = 43, // TLS 1.3
52
+ COOKIE = 44, // TLS 1.3
53
+ PSK_KEY_EXCHANGE_MODES = 45, // TLS 1.3
54
+ CERTIFICATE_AUTHORITIES = 47, // TLS 1.3
55
+ POST_HANDSHAKE_AUTH = 49, // TLS 1.3
56
+ SIGNATURE_ALGORITHMS_CERT = 50, // TLS 1.3
57
+ KEY_SHARE = 51, // TLS 1.3
58
+ }
59
+
60
+ /**
61
+ * TLS alert levels
62
+ */
63
+ export enum TlsAlertLevel {
64
+ WARNING = 1,
65
+ FATAL = 2,
66
+ }
67
+
68
+ /**
69
+ * TLS alert description codes
70
+ */
71
+ export enum TlsAlertDescription {
72
+ CLOSE_NOTIFY = 0,
73
+ UNEXPECTED_MESSAGE = 10,
74
+ BAD_RECORD_MAC = 20,
75
+ DECRYPTION_FAILED = 21, // TLS 1.0 only
76
+ RECORD_OVERFLOW = 22,
77
+ DECOMPRESSION_FAILURE = 30, // TLS 1.2 and below
78
+ HANDSHAKE_FAILURE = 40,
79
+ NO_CERTIFICATE = 41, // SSLv3 only
80
+ BAD_CERTIFICATE = 42,
81
+ UNSUPPORTED_CERTIFICATE = 43,
82
+ CERTIFICATE_REVOKED = 44,
83
+ CERTIFICATE_EXPIRED = 45,
84
+ CERTIFICATE_UNKNOWN = 46,
85
+ ILLEGAL_PARAMETER = 47,
86
+ UNKNOWN_CA = 48,
87
+ ACCESS_DENIED = 49,
88
+ DECODE_ERROR = 50,
89
+ DECRYPT_ERROR = 51,
90
+ EXPORT_RESTRICTION = 60, // TLS 1.0 only
91
+ PROTOCOL_VERSION = 70,
92
+ INSUFFICIENT_SECURITY = 71,
93
+ INTERNAL_ERROR = 80,
94
+ INAPPROPRIATE_FALLBACK = 86,
95
+ USER_CANCELED = 90,
96
+ NO_RENEGOTIATION = 100, // TLS 1.2 and below
97
+ MISSING_EXTENSION = 109, // TLS 1.3
98
+ UNSUPPORTED_EXTENSION = 110, // TLS 1.3
99
+ CERTIFICATE_REQUIRED = 111, // TLS 1.3
100
+ UNRECOGNIZED_NAME = 112,
101
+ BAD_CERTIFICATE_STATUS_RESPONSE = 113,
102
+ BAD_CERTIFICATE_HASH_VALUE = 114, // TLS 1.2 and below
103
+ UNKNOWN_PSK_IDENTITY = 115,
104
+ CERTIFICATE_REQUIRED_1_3 = 116, // TLS 1.3
105
+ NO_APPLICATION_PROTOCOL = 120,
106
+ }
107
+
108
+ /**
109
+ * TLS version codes (major.minor)
110
+ */
111
+ export const TlsVersion = {
112
+ SSL3: [0x03, 0x00],
113
+ TLS1_0: [0x03, 0x01],
114
+ TLS1_1: [0x03, 0x02],
115
+ TLS1_2: [0x03, 0x03],
116
+ TLS1_3: [0x03, 0x04],
117
+ };
118
+
119
+ /**
120
+ * Utility functions for TLS protocol operations
121
+ */
122
+ export class TlsUtils {
123
+ /**
124
+ * Checks if a buffer contains a TLS handshake record
125
+ * @param buffer The buffer to check
126
+ * @returns true if the buffer starts with a TLS handshake record
127
+ */
128
+ public static isTlsHandshake(buffer: Buffer): boolean {
129
+ return buffer.length > 0 && buffer[0] === TlsRecordType.HANDSHAKE;
130
+ }
131
+
132
+ /**
133
+ * Checks if a buffer contains TLS application data
134
+ * @param buffer The buffer to check
135
+ * @returns true if the buffer starts with a TLS application data record
136
+ */
137
+ public static isTlsApplicationData(buffer: Buffer): boolean {
138
+ return buffer.length > 0 && buffer[0] === TlsRecordType.APPLICATION_DATA;
139
+ }
140
+
141
+ /**
142
+ * Checks if a buffer contains a TLS alert record
143
+ * @param buffer The buffer to check
144
+ * @returns true if the buffer starts with a TLS alert record
145
+ */
146
+ public static isTlsAlert(buffer: Buffer): boolean {
147
+ return buffer.length > 0 && buffer[0] === TlsRecordType.ALERT;
148
+ }
149
+
150
+ /**
151
+ * Checks if a buffer contains a TLS ClientHello message
152
+ * @param buffer The buffer to check
153
+ * @returns true if the buffer appears to be a ClientHello message
154
+ */
155
+ public static isClientHello(buffer: Buffer): boolean {
156
+ // Minimum ClientHello size (TLS record header + handshake header)
157
+ if (buffer.length < 9) {
158
+ return false;
159
+ }
160
+
161
+ // Check record type (must be TLS_HANDSHAKE_RECORD_TYPE)
162
+ if (buffer[0] !== TlsRecordType.HANDSHAKE) {
163
+ return false;
164
+ }
165
+
166
+ // Skip version and length in TLS record header (5 bytes total)
167
+ // Check handshake type at byte 5 (must be CLIENT_HELLO)
168
+ return buffer[5] === TlsHandshakeType.CLIENT_HELLO;
169
+ }
170
+
171
+ /**
172
+ * Gets the record length from a TLS record header
173
+ * @param buffer Buffer containing a TLS record
174
+ * @returns The record length if the buffer is valid, -1 otherwise
175
+ */
176
+ public static getTlsRecordLength(buffer: Buffer): number {
177
+ if (buffer.length < 5) {
178
+ return -1;
179
+ }
180
+
181
+ // Bytes 3-4 contain the record length (big-endian)
182
+ return (buffer[3] << 8) + buffer[4];
183
+ }
184
+
185
+ /**
186
+ * Creates a connection ID based on source/destination information
187
+ * Used to track fragmented ClientHello messages across multiple packets
188
+ *
189
+ * @param connectionInfo Object containing connection identifiers
190
+ * @returns A string ID for the connection
191
+ */
192
+ public static createConnectionId(connectionInfo: {
193
+ sourceIp?: string;
194
+ sourcePort?: number;
195
+ destIp?: string;
196
+ destPort?: number;
197
+ }): string {
198
+ const { sourceIp, sourcePort, destIp, destPort } = connectionInfo;
199
+ return `${sourceIp}:${sourcePort}-${destIp}:${destPort}`;
200
+ }
201
+ }
@@ -1,23 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import type { IAcmeOptions } from './types.js';
4
- import { Port80Handler } from '../port80handler/classes.port80handler.js';
5
-
6
- /**
7
- * Factory to create a Port80Handler with common setup.
8
- * Ensures the certificate store directory exists and instantiates the handler.
9
- * @param options Port80Handler configuration options
10
- * @returns A new Port80Handler instance
11
- */
12
- export function buildPort80Handler(
13
- options: IAcmeOptions
14
- ): Port80Handler {
15
- if (options.certificateStore) {
16
- const certStorePath = path.resolve(options.certificateStore);
17
- if (!fs.existsSync(certStorePath)) {
18
- fs.mkdirSync(certStorePath, { recursive: true });
19
- console.log(`Created certificate store directory: ${certStorePath}`);
20
- }
21
- }
22
- return new Port80Handler(options);
23
- }
@@ -1,128 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import { createServer } from 'http';
3
- import { Socket } from 'net';
4
- import {
5
- DomainManager,
6
- DomainManagerEvents,
7
- createDomainConfig,
8
- helpers
9
- } from '../smartproxy/forwarding/index.js';
10
-
11
- /**
12
- * Example showing how to use the unified forwarding system
13
- */
14
- async function main() {
15
- console.log('Initializing forwarding example...');
16
-
17
- // Create the domain manager
18
- const domainManager = new DomainManager();
19
-
20
- // Set up event listeners
21
- domainManager.on(DomainManagerEvents.DOMAIN_ADDED, (data) => {
22
- console.log(`Domain added: ${data.domains.join(', ')} (${data.forwardingType})`);
23
- });
24
-
25
- domainManager.on(DomainManagerEvents.DOMAIN_MATCHED, (data) => {
26
- console.log(`Domain matched: ${data.domain} (${data.handlerType})`);
27
- });
28
-
29
- domainManager.on(DomainManagerEvents.DOMAIN_MATCH_FAILED, (data) => {
30
- console.log(`Domain match failed: ${data.domain}`);
31
- });
32
-
33
- domainManager.on(DomainManagerEvents.ERROR, (data) => {
34
- console.error(`Error:`, data);
35
- });
36
-
37
- // Add example domains with different forwarding types
38
-
39
- // Example 1: HTTP-only forwarding
40
- await domainManager.addDomainConfig(
41
- createDomainConfig('example.com', helpers.httpOnly({
42
- target: { host: 'localhost', port: 3000 }
43
- }))
44
- );
45
-
46
- // Example 2: HTTPS termination with HTTP backend
47
- await domainManager.addDomainConfig(
48
- createDomainConfig('secure.example.com', helpers.tlsTerminateToHttp({
49
- target: { host: 'localhost', port: 3000 }
50
- }))
51
- );
52
-
53
- // Example 3: HTTPS termination with HTTPS backend
54
- await domainManager.addDomainConfig(
55
- createDomainConfig('api.example.com', helpers.tlsTerminateToHttps({
56
- target: { host: 'localhost', port: 8443 }
57
- }))
58
- );
59
-
60
- // Example 4: SNI passthrough
61
- await domainManager.addDomainConfig(
62
- createDomainConfig('passthrough.example.com', helpers.sniPassthrough({
63
- target: { host: '10.0.0.5', port: 443 }
64
- }))
65
- );
66
-
67
- // Example 5: Custom configuration for a more complex setup
68
- await domainManager.addDomainConfig(
69
- createDomainConfig(['*.example.com', '*.example.org'], {
70
- type: 'https-terminate-to-http',
71
- target: {
72
- host: ['10.0.0.10', '10.0.0.11'], // Round-robin load balancing
73
- port: 8080
74
- },
75
- http: {
76
- enabled: true,
77
- redirectToHttps: false // Allow both HTTP and HTTPS
78
- },
79
- acme: {
80
- enabled: true,
81
- maintenance: true,
82
- production: false, // Use staging for testing
83
- forwardChallenges: {
84
- host: '192.168.1.100',
85
- port: 8080
86
- }
87
- },
88
- security: {
89
- allowedIps: ['10.0.0.*', '192.168.1.*'],
90
- maxConnections: 100
91
- },
92
- advanced: {
93
- headers: {
94
- 'X-Forwarded-For': '{clientIp}',
95
- 'X-Forwarded-Host': '{sni}'
96
- }
97
- }
98
- })
99
- );
100
-
101
- // Create a simple HTTP server to demonstrate HTTP handler
102
- const httpServer = createServer((req, res) => {
103
- // Extract the domain from the Host header
104
- const domain = req.headers.host?.split(':')[0] || 'unknown';
105
-
106
- // Forward the request to the appropriate handler
107
- if (!domainManager.handleHttpRequest(domain, req, res)) {
108
- // No handler found, send a default response
109
- res.statusCode = 404;
110
- res.end(`No handler found for domain: ${domain}`);
111
- }
112
- });
113
-
114
- // Listen on HTTP port
115
- httpServer.listen(80, () => {
116
- console.log('HTTP server listening on port 80');
117
- });
118
-
119
- // For HTTPS and SNI, we would need to set up a TLS server
120
- // This is a simplified example that just shows how the domain manager works
121
-
122
- console.log('Forwarding example initialized successfully');
123
- }
124
-
125
- // Run the example
126
- main().catch(error => {
127
- console.error('Error running example:', error);
128
- });
@@ -1,30 +0,0 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import { fileURLToPath } from 'url';
4
-
5
- const __dirname = path.dirname(fileURLToPath(import.meta.url));
6
-
7
- export interface ICertificates {
8
- privateKey: string;
9
- publicKey: string;
10
- }
11
-
12
- export function loadDefaultCertificates(): ICertificates {
13
- try {
14
- const certPath = path.join(__dirname, '..', 'assets', 'certs');
15
- const privateKey = fs.readFileSync(path.join(certPath, 'key.pem'), 'utf8');
16
- const publicKey = fs.readFileSync(path.join(certPath, 'cert.pem'), 'utf8');
17
-
18
- if (!privateKey || !publicKey) {
19
- throw new Error('Failed to load default certificates');
20
- }
21
-
22
- return {
23
- privateKey,
24
- publicKey
25
- };
26
- } catch (error) {
27
- console.error('Error loading default certificates:', error);
28
- throw error;
29
- }
30
- }
@@ -1,7 +0,0 @@
1
- // Re-export all components for easier imports
2
- export * from './classes.np.types.js';
3
- export * from './classes.np.certificatemanager.js';
4
- export * from './classes.np.connectionpool.js';
5
- export * from './classes.np.requesthandler.js';
6
- export * from './classes.np.websockethandler.js';
7
- export * from './classes.np.networkproxy.js';
@@ -1,200 +0,0 @@
1
- import * as plugins from '../plugins.js';
2
- import type { IDomainConfig, ISmartProxyCertProvisionObject } from './classes.pp.interfaces.js';
3
- import { Port80Handler } from '../port80handler/classes.port80handler.js';
4
- import { Port80HandlerEvents } from '../common/types.js';
5
- import { subscribeToPort80Handler } from '../common/eventUtils.js';
6
- import type { ICertificateData } from '../common/types.js';
7
- import type { NetworkProxyBridge } from './classes.pp.networkproxybridge.js';
8
-
9
- /**
10
- * CertProvisioner manages certificate provisioning and renewal workflows,
11
- * unifying static certificates and HTTP-01 challenges via Port80Handler.
12
- */
13
- export class CertProvisioner extends plugins.EventEmitter {
14
- private domainConfigs: IDomainConfig[];
15
- private port80Handler: Port80Handler;
16
- private networkProxyBridge: NetworkProxyBridge;
17
- private certProvisionFunction?: (domain: string) => Promise<ISmartProxyCertProvisionObject>;
18
- private forwardConfigs: Array<{ domain: string; forwardConfig?: { ip: string; port: number }; acmeForwardConfig?: { ip: string; port: number }; sslRedirect: boolean }>;
19
- private renewThresholdDays: number;
20
- private renewCheckIntervalHours: number;
21
- private autoRenew: boolean;
22
- private renewManager?: plugins.taskbuffer.TaskManager;
23
- // Track provisioning type per domain: 'http01' or 'static'
24
- private provisionMap: Map<string, 'http01' | 'static'>;
25
-
26
- /**
27
- * @param domainConfigs Array of domain configuration objects
28
- * @param port80Handler HTTP-01 challenge handler instance
29
- * @param networkProxyBridge Bridge for applying external certificates
30
- * @param certProvider Optional callback returning a static cert or 'http01'
31
- * @param renewThresholdDays Days before expiry to trigger renewals
32
- * @param renewCheckIntervalHours Interval in hours to check for renewals
33
- * @param autoRenew Whether to automatically schedule renewals
34
- */
35
- constructor(
36
- domainConfigs: IDomainConfig[],
37
- port80Handler: Port80Handler,
38
- networkProxyBridge: NetworkProxyBridge,
39
- certProvider?: (domain: string) => Promise<ISmartProxyCertProvisionObject>,
40
- renewThresholdDays: number = 30,
41
- renewCheckIntervalHours: number = 24,
42
- autoRenew: boolean = true,
43
- forwardConfigs: Array<{ domain: string; forwardConfig?: { ip: string; port: number }; acmeForwardConfig?: { ip: string; port: number }; sslRedirect: boolean }> = []
44
- ) {
45
- super();
46
- this.domainConfigs = domainConfigs;
47
- this.port80Handler = port80Handler;
48
- this.networkProxyBridge = networkProxyBridge;
49
- this.certProvisionFunction = certProvider;
50
- this.renewThresholdDays = renewThresholdDays;
51
- this.renewCheckIntervalHours = renewCheckIntervalHours;
52
- this.autoRenew = autoRenew;
53
- this.provisionMap = new Map();
54
- this.forwardConfigs = forwardConfigs;
55
- }
56
-
57
- /**
58
- * Start initial provisioning and schedule renewals.
59
- */
60
- public async start(): Promise<void> {
61
- // Subscribe to Port80Handler certificate events
62
- subscribeToPort80Handler(this.port80Handler, {
63
- onCertificateIssued: (data: ICertificateData) => {
64
- this.emit('certificate', { ...data, source: 'http01', isRenewal: false });
65
- },
66
- onCertificateRenewed: (data: ICertificateData) => {
67
- this.emit('certificate', { ...data, source: 'http01', isRenewal: true });
68
- }
69
- });
70
-
71
- // Apply external forwarding for ACME challenges (e.g. Synology)
72
- for (const f of this.forwardConfigs) {
73
- this.port80Handler.addDomain({
74
- domainName: f.domain,
75
- sslRedirect: f.sslRedirect,
76
- acmeMaintenance: false,
77
- forward: f.forwardConfig,
78
- acmeForward: f.acmeForwardConfig
79
- });
80
- }
81
- // Initial provisioning for all domains
82
- const domains = this.domainConfigs.flatMap(cfg => cfg.domains);
83
- for (const domain of domains) {
84
- const isWildcard = domain.includes('*');
85
- let provision: ISmartProxyCertProvisionObject | 'http01' = 'http01';
86
- if (this.certProvisionFunction) {
87
- try {
88
- provision = await this.certProvisionFunction(domain);
89
- } catch (err) {
90
- console.error(`certProvider error for ${domain}:`, err);
91
- }
92
- } else if (isWildcard) {
93
- // No certProvider: cannot handle wildcard without DNS-01 support
94
- console.warn(`Skipping wildcard domain without certProvisionFunction: ${domain}`);
95
- continue;
96
- }
97
- if (provision === 'http01') {
98
- if (isWildcard) {
99
- console.warn(`Skipping HTTP-01 for wildcard domain: ${domain}`);
100
- continue;
101
- }
102
- this.provisionMap.set(domain, 'http01');
103
- this.port80Handler.addDomain({ domainName: domain, sslRedirect: true, acmeMaintenance: true });
104
- } else {
105
- // Static certificate (e.g., DNS-01 provisioned or user-provided) supports wildcard domains
106
- this.provisionMap.set(domain, 'static');
107
- const certObj = provision as plugins.tsclass.network.ICert;
108
- const certData: ICertificateData = {
109
- domain: certObj.domainName,
110
- certificate: certObj.publicKey,
111
- privateKey: certObj.privateKey,
112
- expiryDate: new Date(certObj.validUntil)
113
- };
114
- this.networkProxyBridge.applyExternalCertificate(certData);
115
- this.emit('certificate', { ...certData, source: 'static', isRenewal: false });
116
- }
117
- }
118
-
119
- // Schedule renewals if enabled
120
- if (this.autoRenew) {
121
- this.renewManager = new plugins.taskbuffer.TaskManager();
122
- const renewTask = new plugins.taskbuffer.Task({
123
- name: 'CertificateRenewals',
124
- taskFunction: async () => {
125
- for (const [domain, type] of this.provisionMap.entries()) {
126
- // Skip wildcard domains
127
- if (domain.includes('*')) continue;
128
- try {
129
- if (type === 'http01') {
130
- await this.port80Handler.renewCertificate(domain);
131
- } else if (type === 'static' && this.certProvisionFunction) {
132
- const provision2 = await this.certProvisionFunction(domain);
133
- if (provision2 !== 'http01') {
134
- const certObj = provision2 as plugins.tsclass.network.ICert;
135
- const certData: ICertificateData = {
136
- domain: certObj.domainName,
137
- certificate: certObj.publicKey,
138
- privateKey: certObj.privateKey,
139
- expiryDate: new Date(certObj.validUntil)
140
- };
141
- this.networkProxyBridge.applyExternalCertificate(certData);
142
- this.emit('certificate', { ...certData, source: 'static', isRenewal: true });
143
- }
144
- }
145
- } catch (err) {
146
- console.error(`Renewal error for ${domain}:`, err);
147
- }
148
- }
149
- }
150
- });
151
- const hours = this.renewCheckIntervalHours;
152
- const cronExpr = `0 0 */${hours} * * *`;
153
- this.renewManager.addAndScheduleTask(renewTask, cronExpr);
154
- this.renewManager.start();
155
- }
156
- }
157
-
158
- /**
159
- * Stop all scheduled renewal tasks.
160
- */
161
- public async stop(): Promise<void> {
162
- // Stop scheduled renewals
163
- if (this.renewManager) {
164
- this.renewManager.stop();
165
- }
166
- }
167
-
168
- /**
169
- * Request a certificate on-demand for the given domain.
170
- * @param domain Domain name to provision
171
- */
172
- public async requestCertificate(domain: string): Promise<void> {
173
- const isWildcard = domain.includes('*');
174
- // Determine provisioning method
175
- let provision: ISmartProxyCertProvisionObject | 'http01' = 'http01';
176
- if (this.certProvisionFunction) {
177
- provision = await this.certProvisionFunction(domain);
178
- } else if (isWildcard) {
179
- // Cannot perform HTTP-01 on wildcard without certProvider
180
- throw new Error(`Cannot request certificate for wildcard domain without certProvisionFunction: ${domain}`);
181
- }
182
- if (provision === 'http01') {
183
- if (isWildcard) {
184
- throw new Error(`Cannot request HTTP-01 certificate for wildcard domain: ${domain}`);
185
- }
186
- await this.port80Handler.renewCertificate(domain);
187
- } else {
188
- // Static certificate (e.g., DNS-01 provisioned) supports wildcards
189
- const certObj = provision as plugins.tsclass.network.ICert;
190
- const certData: ICertificateData = {
191
- domain: certObj.domainName,
192
- certificate: certObj.publicKey,
193
- privateKey: certObj.privateKey,
194
- expiryDate: new Date(certObj.validUntil)
195
- };
196
- this.networkProxyBridge.applyExternalCertificate(certData);
197
- this.emit('certificate', { ...certData, source: 'static', isRenewal: false });
198
- }
199
- }
200
- }