@push.rocks/smartproxy 15.0.2 → 16.0.3

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 (160) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/certificate/index.d.ts +10 -4
  3. package/dist_ts/certificate/index.js +5 -7
  4. package/dist_ts/certificate/models/certificate-types.d.ts +35 -15
  5. package/dist_ts/certificate/providers/cert-provisioner.d.ts +41 -15
  6. package/dist_ts/certificate/providers/cert-provisioner.js +201 -41
  7. package/dist_ts/core/models/index.d.ts +2 -0
  8. package/dist_ts/core/models/index.js +3 -1
  9. package/dist_ts/core/models/route-context.d.ts +62 -0
  10. package/dist_ts/core/models/route-context.js +43 -0
  11. package/dist_ts/core/models/socket-augmentation.d.ts +12 -0
  12. package/dist_ts/core/models/socket-augmentation.js +18 -0
  13. package/dist_ts/core/utils/event-system.d.ts +200 -0
  14. package/dist_ts/core/utils/event-system.js +224 -0
  15. package/dist_ts/core/utils/index.d.ts +7 -0
  16. package/dist_ts/core/utils/index.js +8 -1
  17. package/dist_ts/core/utils/route-manager.d.ts +118 -0
  18. package/dist_ts/core/utils/route-manager.js +383 -0
  19. package/dist_ts/core/utils/route-utils.d.ts +94 -0
  20. package/dist_ts/core/utils/route-utils.js +264 -0
  21. package/dist_ts/core/utils/security-utils.d.ts +111 -0
  22. package/dist_ts/core/utils/security-utils.js +212 -0
  23. package/dist_ts/core/utils/shared-security-manager.d.ts +110 -0
  24. package/dist_ts/core/utils/shared-security-manager.js +252 -0
  25. package/dist_ts/core/utils/template-utils.d.ts +37 -0
  26. package/dist_ts/core/utils/template-utils.js +104 -0
  27. package/dist_ts/core/utils/websocket-utils.d.ts +23 -0
  28. package/dist_ts/core/utils/websocket-utils.js +86 -0
  29. package/dist_ts/forwarding/config/forwarding-types.d.ts +40 -76
  30. package/dist_ts/forwarding/config/forwarding-types.js +19 -18
  31. package/dist_ts/forwarding/config/index.d.ts +4 -2
  32. package/dist_ts/forwarding/config/index.js +5 -3
  33. package/dist_ts/forwarding/handlers/base-handler.js +3 -1
  34. package/dist_ts/forwarding/index.d.ts +5 -6
  35. package/dist_ts/forwarding/index.js +3 -3
  36. package/dist_ts/http/models/http-types.js +1 -1
  37. package/dist_ts/http/port80/acme-interfaces.d.ts +30 -0
  38. package/dist_ts/http/port80/acme-interfaces.js +46 -1
  39. package/dist_ts/http/port80/port80-handler.d.ts +17 -2
  40. package/dist_ts/http/port80/port80-handler.js +49 -11
  41. package/dist_ts/http/router/index.d.ts +5 -1
  42. package/dist_ts/http/router/index.js +4 -2
  43. package/dist_ts/http/router/route-router.d.ts +108 -0
  44. package/dist_ts/http/router/route-router.js +393 -0
  45. package/dist_ts/index.d.ts +8 -2
  46. package/dist_ts/index.js +10 -3
  47. package/dist_ts/proxies/index.d.ts +7 -2
  48. package/dist_ts/proxies/index.js +10 -4
  49. package/dist_ts/proxies/network-proxy/certificate-manager.d.ts +21 -0
  50. package/dist_ts/proxies/network-proxy/certificate-manager.js +92 -1
  51. package/dist_ts/proxies/network-proxy/context-creator.d.ts +34 -0
  52. package/dist_ts/proxies/network-proxy/context-creator.js +108 -0
  53. package/dist_ts/proxies/network-proxy/function-cache.d.ts +90 -0
  54. package/dist_ts/proxies/network-proxy/function-cache.js +198 -0
  55. package/dist_ts/proxies/network-proxy/http-request-handler.d.ts +40 -0
  56. package/dist_ts/proxies/network-proxy/http-request-handler.js +256 -0
  57. package/dist_ts/proxies/network-proxy/http2-request-handler.d.ts +24 -0
  58. package/dist_ts/proxies/network-proxy/http2-request-handler.js +201 -0
  59. package/dist_ts/proxies/network-proxy/models/types.d.ts +73 -1
  60. package/dist_ts/proxies/network-proxy/models/types.js +242 -1
  61. package/dist_ts/proxies/network-proxy/network-proxy.d.ts +23 -20
  62. package/dist_ts/proxies/network-proxy/network-proxy.js +147 -60
  63. package/dist_ts/proxies/network-proxy/request-handler.d.ts +38 -5
  64. package/dist_ts/proxies/network-proxy/request-handler.js +584 -198
  65. package/dist_ts/proxies/network-proxy/security-manager.d.ts +65 -0
  66. package/dist_ts/proxies/network-proxy/security-manager.js +255 -0
  67. package/dist_ts/proxies/network-proxy/websocket-handler.d.ts +13 -2
  68. package/dist_ts/proxies/network-proxy/websocket-handler.js +238 -20
  69. package/dist_ts/proxies/smart-proxy/index.d.ts +1 -1
  70. package/dist_ts/proxies/smart-proxy/index.js +3 -3
  71. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +5 -66
  72. package/dist_ts/proxies/smart-proxy/models/interfaces.js +5 -4
  73. package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +173 -6
  74. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +20 -7
  75. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +49 -108
  76. package/dist_ts/proxies/smart-proxy/port-manager.d.ts +81 -0
  77. package/dist_ts/proxies/smart-proxy/port-manager.js +166 -0
  78. package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +7 -5
  79. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +155 -160
  80. package/dist_ts/proxies/smart-proxy/route-helpers/index.d.ts +9 -0
  81. package/dist_ts/proxies/smart-proxy/route-helpers/index.js +11 -0
  82. package/dist_ts/proxies/smart-proxy/route-helpers.d.ts +5 -125
  83. package/dist_ts/proxies/smart-proxy/route-helpers.js +8 -195
  84. package/dist_ts/proxies/smart-proxy/route-manager.d.ts +14 -11
  85. package/dist_ts/proxies/smart-proxy/route-manager.js +81 -124
  86. package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +101 -12
  87. package/dist_ts/proxies/smart-proxy/smart-proxy.js +178 -306
  88. package/dist_ts/proxies/smart-proxy/timeout-manager.js +3 -3
  89. package/dist_ts/proxies/smart-proxy/utils/index.d.ts +12 -0
  90. package/dist_ts/proxies/smart-proxy/utils/index.js +19 -0
  91. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +240 -0
  92. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +451 -0
  93. package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.d.ts +51 -0
  94. package/dist_ts/proxies/smart-proxy/utils/route-migration-utils.js +124 -0
  95. package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +131 -0
  96. package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +217 -0
  97. package/dist_ts/proxies/smart-proxy/utils/route-utils.d.ts +79 -0
  98. package/dist_ts/proxies/smart-proxy/utils/route-utils.js +266 -0
  99. package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +73 -0
  100. package/dist_ts/proxies/smart-proxy/utils/route-validators.js +264 -0
  101. package/package.json +1 -1
  102. package/readme.md +241 -125
  103. package/readme.plan.md +73 -286
  104. package/ts/00_commitinfo_data.ts +1 -1
  105. package/ts/certificate/index.ts +17 -9
  106. package/ts/certificate/models/certificate-types.ts +37 -16
  107. package/ts/certificate/providers/cert-provisioner.ts +247 -54
  108. package/ts/core/models/index.ts +2 -0
  109. package/ts/core/models/route-context.ts +113 -0
  110. package/ts/core/models/socket-augmentation.ts +33 -0
  111. package/ts/core/utils/event-system.ts +376 -0
  112. package/ts/core/utils/index.ts +7 -0
  113. package/ts/core/utils/route-manager.ts +489 -0
  114. package/ts/core/utils/route-utils.ts +312 -0
  115. package/ts/core/utils/security-utils.ts +309 -0
  116. package/ts/core/utils/shared-security-manager.ts +333 -0
  117. package/ts/core/utils/template-utils.ts +124 -0
  118. package/ts/core/utils/websocket-utils.ts +81 -0
  119. package/ts/forwarding/config/forwarding-types.ts +79 -107
  120. package/ts/forwarding/config/index.ts +4 -2
  121. package/ts/forwarding/handlers/base-handler.ts +4 -2
  122. package/ts/forwarding/index.ts +3 -2
  123. package/ts/http/models/http-types.ts +0 -1
  124. package/ts/http/port80/acme-interfaces.ts +84 -0
  125. package/ts/http/port80/port80-handler.ts +61 -15
  126. package/ts/http/router/index.ts +8 -1
  127. package/ts/http/router/route-router.ts +482 -0
  128. package/ts/index.ts +14 -2
  129. package/ts/proxies/index.ts +12 -3
  130. package/ts/proxies/network-proxy/certificate-manager.ts +114 -10
  131. package/ts/proxies/network-proxy/context-creator.ts +145 -0
  132. package/ts/proxies/network-proxy/function-cache.ts +259 -0
  133. package/ts/proxies/network-proxy/http-request-handler.ts +330 -0
  134. package/ts/proxies/network-proxy/http2-request-handler.ts +255 -0
  135. package/ts/proxies/network-proxy/models/types.ts +312 -1
  136. package/ts/proxies/network-proxy/network-proxy.ts +195 -86
  137. package/ts/proxies/network-proxy/request-handler.ts +698 -246
  138. package/ts/proxies/network-proxy/security-manager.ts +298 -0
  139. package/ts/proxies/network-proxy/websocket-handler.ts +276 -33
  140. package/ts/proxies/smart-proxy/index.ts +2 -12
  141. package/ts/proxies/smart-proxy/models/interfaces.ts +13 -67
  142. package/ts/proxies/smart-proxy/models/route-types.ts +223 -25
  143. package/ts/proxies/smart-proxy/network-proxy-bridge.ts +57 -123
  144. package/ts/proxies/smart-proxy/port-manager.ts +195 -0
  145. package/ts/proxies/smart-proxy/route-connection-handler.ts +191 -225
  146. package/ts/proxies/smart-proxy/route-manager.ts +101 -144
  147. package/ts/proxies/smart-proxy/smart-proxy.ts +206 -377
  148. package/ts/proxies/smart-proxy/timeout-manager.ts +2 -2
  149. package/ts/proxies/smart-proxy/utils/index.ts +40 -0
  150. package/ts/proxies/smart-proxy/utils/route-helpers.ts +621 -0
  151. package/ts/proxies/smart-proxy/utils/route-migration-utils.ts +165 -0
  152. package/ts/proxies/smart-proxy/utils/route-patterns.ts +309 -0
  153. package/ts/proxies/smart-proxy/utils/route-utils.ts +330 -0
  154. package/ts/proxies/smart-proxy/utils/route-validators.ts +288 -0
  155. package/ts/forwarding/config/domain-config.ts +0 -28
  156. package/ts/forwarding/config/domain-manager.ts +0 -283
  157. package/ts/proxies/smart-proxy/connection-handler.ts +0 -1240
  158. package/ts/proxies/smart-proxy/domain-config-manager.ts +0 -441
  159. package/ts/proxies/smart-proxy/port-range-manager.ts +0 -211
  160. package/ts/proxies/smart-proxy/route-helpers.ts +0 -344
@@ -4,21 +4,60 @@ import { Port80Handler } from '../../http/port80/port80-handler.js';
4
4
  /**
5
5
  * CertProvisioner manages certificate provisioning and renewal workflows,
6
6
  * unifying static certificates and HTTP-01 challenges via Port80Handler.
7
+ *
8
+ * This class directly works with route configurations instead of converting to domain configs.
7
9
  */
8
10
  export class CertProvisioner extends plugins.EventEmitter {
9
11
  /**
10
- * @param domainConfigs Array of domain configuration objects
12
+ * Extract routes that need certificates
13
+ * @param routes Route configurations
14
+ */
15
+ extractCertificateRoutesFromRoutes(routes) {
16
+ const certRoutes = [];
17
+ // Process all HTTPS routes that need certificates
18
+ for (const route of routes) {
19
+ // Only process routes with TLS termination that need certificates
20
+ if (route.action.type === 'forward' &&
21
+ route.action.tls &&
22
+ (route.action.tls.mode === 'terminate' || route.action.tls.mode === 'terminate-and-reencrypt') &&
23
+ route.match.domains) {
24
+ // Extract domains from the route
25
+ const domains = Array.isArray(route.match.domains)
26
+ ? route.match.domains
27
+ : [route.match.domains];
28
+ // For each domain in the route, create a certRoute entry
29
+ for (const domain of domains) {
30
+ // Skip wildcard domains that can't use ACME unless we have a certProvider
31
+ if (domain.includes('*') && (!this.certProvisionFunction || this.certProvisionFunction.length === 0)) {
32
+ console.warn(`Skipping wildcard domain that requires a certProvisionFunction: ${domain}`);
33
+ continue;
34
+ }
35
+ certRoutes.push({
36
+ domain,
37
+ route,
38
+ tlsMode: route.action.tls.mode
39
+ });
40
+ }
41
+ }
42
+ }
43
+ return certRoutes;
44
+ }
45
+ /**
46
+ * Constructor for CertProvisioner
47
+ *
48
+ * @param routeConfigs Array of route configurations
11
49
  * @param port80Handler HTTP-01 challenge handler instance
12
50
  * @param networkProxyBridge Bridge for applying external certificates
13
51
  * @param certProvider Optional callback returning a static cert or 'http01'
14
52
  * @param renewThresholdDays Days before expiry to trigger renewals
15
53
  * @param renewCheckIntervalHours Interval in hours to check for renewals
16
54
  * @param autoRenew Whether to automatically schedule renewals
17
- * @param forwardConfigs Domain forwarding configurations for ACME challenges
55
+ * @param routeForwards Route-specific forwarding configs for ACME challenges
18
56
  */
19
- constructor(domainConfigs, port80Handler, networkProxyBridge, certProvider, renewThresholdDays = 30, renewCheckIntervalHours = 24, autoRenew = true, forwardConfigs = []) {
57
+ constructor(routeConfigs, port80Handler, networkProxyBridge, certProvider, renewThresholdDays = 30, renewCheckIntervalHours = 24, autoRenew = true, routeForwards = []) {
20
58
  super();
21
- this.domainConfigs = domainConfigs;
59
+ this.certRoutes = [];
60
+ this.routeConfigs = routeConfigs;
22
61
  this.port80Handler = port80Handler;
23
62
  this.networkProxyBridge = networkProxyBridge;
24
63
  this.certProvisionFunction = certProvider;
@@ -26,7 +65,9 @@ export class CertProvisioner extends plugins.EventEmitter {
26
65
  this.renewCheckIntervalHours = renewCheckIntervalHours;
27
66
  this.autoRenew = autoRenew;
28
67
  this.provisionMap = new Map();
29
- this.forwardConfigs = forwardConfigs;
68
+ this.routeForwards = routeForwards;
69
+ // Extract certificate routes during instantiation
70
+ this.certRoutes = this.extractCertificateRoutesFromRoutes(routeConfigs);
30
71
  }
31
72
  /**
32
73
  * Start initial provisioning and schedule renewals.
@@ -34,10 +75,10 @@ export class CertProvisioner extends plugins.EventEmitter {
34
75
  async start() {
35
76
  // Subscribe to Port80Handler certificate events
36
77
  this.setupEventSubscriptions();
37
- // Apply external forwarding for ACME challenges
78
+ // Apply route forwarding for ACME challenges
38
79
  this.setupForwardingConfigs();
39
- // Initial provisioning for all domains
40
- await this.provisionAllDomains();
80
+ // Initial provisioning for all domains in routes
81
+ await this.provisionAllCertificates();
41
82
  // Schedule renewals if enabled
42
83
  if (this.autoRenew) {
43
84
  this.scheduleRenewals();
@@ -47,46 +88,74 @@ export class CertProvisioner extends plugins.EventEmitter {
47
88
  * Set up event subscriptions for certificate events
48
89
  */
49
90
  setupEventSubscriptions() {
50
- // We need to reimplement subscribeToPort80Handler here
51
91
  this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_ISSUED, (data) => {
52
- this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, { ...data, source: 'http01', isRenewal: false });
92
+ // Add route reference if we have it
93
+ const routeRef = this.findRouteForDomain(data.domain);
94
+ const enhancedData = {
95
+ ...data,
96
+ source: 'http01',
97
+ isRenewal: false,
98
+ routeReference: routeRef ? {
99
+ routeId: routeRef.route.name,
100
+ routeName: routeRef.route.name
101
+ } : undefined
102
+ };
103
+ this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, enhancedData);
53
104
  });
54
105
  this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_RENEWED, (data) => {
55
- this.emit(CertProvisionerEvents.CERTIFICATE_RENEWED, { ...data, source: 'http01', isRenewal: true });
106
+ // Add route reference if we have it
107
+ const routeRef = this.findRouteForDomain(data.domain);
108
+ const enhancedData = {
109
+ ...data,
110
+ source: 'http01',
111
+ isRenewal: true,
112
+ routeReference: routeRef ? {
113
+ routeId: routeRef.route.name,
114
+ routeName: routeRef.route.name
115
+ } : undefined
116
+ };
117
+ this.emit(CertProvisionerEvents.CERTIFICATE_RENEWED, enhancedData);
56
118
  });
57
119
  this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_FAILED, (error) => {
58
120
  this.emit(CertProvisionerEvents.CERTIFICATE_FAILED, error);
59
121
  });
60
122
  }
123
+ /**
124
+ * Find a route for a given domain
125
+ */
126
+ findRouteForDomain(domain) {
127
+ return this.certRoutes.find(certRoute => certRoute.domain === domain);
128
+ }
61
129
  /**
62
130
  * Set up forwarding configurations for the Port80Handler
63
131
  */
64
132
  setupForwardingConfigs() {
65
- for (const config of this.forwardConfigs) {
133
+ for (const config of this.routeForwards) {
66
134
  const domainOptions = {
67
135
  domainName: config.domain,
68
136
  sslRedirect: config.sslRedirect || false,
69
137
  acmeMaintenance: false,
70
- forward: config.forwardConfig,
71
- acmeForward: config.acmeForwardConfig
138
+ forward: config.target ? {
139
+ ip: config.target.host,
140
+ port: config.target.port
141
+ } : undefined
72
142
  };
73
143
  this.port80Handler.addDomain(domainOptions);
74
144
  }
75
145
  }
76
146
  /**
77
- * Provision certificates for all configured domains
147
+ * Provision certificates for all routes that need them
78
148
  */
79
- async provisionAllDomains() {
80
- const domains = this.domainConfigs.flatMap(cfg => cfg.domains);
81
- for (const domain of domains) {
82
- await this.provisionDomain(domain);
149
+ async provisionAllCertificates() {
150
+ for (const certRoute of this.certRoutes) {
151
+ await this.provisionCertificateForRoute(certRoute);
83
152
  }
84
153
  }
85
154
  /**
86
- * Provision a certificate for a single domain
87
- * @param domain Domain to provision
155
+ * Provision a certificate for a route
88
156
  */
89
- async provisionDomain(domain) {
157
+ async provisionCertificateForRoute(certRoute) {
158
+ const { domain, route } = certRoute;
90
159
  const isWildcard = domain.includes('*');
91
160
  let provision = 'http01';
92
161
  // Try to get a certificate from the provision function
@@ -95,7 +164,7 @@ export class CertProvisioner extends plugins.EventEmitter {
95
164
  provision = await this.certProvisionFunction(domain);
96
165
  }
97
166
  catch (err) {
98
- console.error(`certProvider error for ${domain}:`, err);
167
+ console.error(`certProvider error for ${domain} on route ${route.name || 'unnamed'}:`, err);
99
168
  }
100
169
  }
101
170
  else if (isWildcard) {
@@ -103,27 +172,34 @@ export class CertProvisioner extends plugins.EventEmitter {
103
172
  console.warn(`Skipping wildcard domain without certProvisionFunction: ${domain}`);
104
173
  return;
105
174
  }
175
+ // Store the route reference with the provision type
176
+ this.provisionMap.set(domain, {
177
+ type: provision === 'http01' || provision === 'dns01' ? provision : 'static',
178
+ routeRef: certRoute
179
+ });
106
180
  // Handle different provisioning methods
107
181
  if (provision === 'http01') {
108
182
  if (isWildcard) {
109
183
  console.warn(`Skipping HTTP-01 for wildcard domain: ${domain}`);
110
184
  return;
111
185
  }
112
- this.provisionMap.set(domain, 'http01');
113
186
  this.port80Handler.addDomain({
114
187
  domainName: domain,
115
188
  sslRedirect: true,
116
- acmeMaintenance: true
189
+ acmeMaintenance: true,
190
+ routeReference: {
191
+ routeId: route.name || domain,
192
+ routeName: route.name
193
+ }
117
194
  });
118
195
  }
119
196
  else if (provision === 'dns01') {
120
197
  // DNS-01 challenges would be handled by the certProvisionFunction
121
- this.provisionMap.set(domain, 'dns01');
122
198
  // DNS-01 handling would go here if implemented
199
+ console.log(`DNS-01 challenge type set for ${domain}`);
123
200
  }
124
201
  else {
125
202
  // Static certificate (e.g., DNS-01 provisioned or user-provided)
126
- this.provisionMap.set(domain, 'static');
127
203
  const certObj = provision;
128
204
  const certData = {
129
205
  domain: certObj.domainName,
@@ -131,7 +207,11 @@ export class CertProvisioner extends plugins.EventEmitter {
131
207
  privateKey: certObj.privateKey,
132
208
  expiryDate: new Date(certObj.validUntil),
133
209
  source: 'static',
134
- isRenewal: false
210
+ isRenewal: false,
211
+ routeReference: {
212
+ routeId: route.name || domain,
213
+ routeName: route.name
214
+ }
135
215
  };
136
216
  this.networkProxyBridge.applyExternalCertificate(certData);
137
217
  this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, certData);
@@ -155,12 +235,12 @@ export class CertProvisioner extends plugins.EventEmitter {
155
235
  * Perform renewals for all domains that need it
156
236
  */
157
237
  async performRenewals() {
158
- for (const [domain, type] of this.provisionMap.entries()) {
238
+ for (const [domain, info] of this.provisionMap.entries()) {
159
239
  // Skip wildcard domains for HTTP-01 challenges
160
- if (domain.includes('*') && type === 'http01')
240
+ if (domain.includes('*') && info.type === 'http01')
161
241
  continue;
162
242
  try {
163
- await this.renewDomain(domain, type);
243
+ await this.renewCertificateForDomain(domain, info.type, info.routeRef);
164
244
  }
165
245
  catch (err) {
166
246
  console.error(`Renewal error for ${domain}:`, err);
@@ -171,8 +251,9 @@ export class CertProvisioner extends plugins.EventEmitter {
171
251
  * Renew a certificate for a specific domain
172
252
  * @param domain Domain to renew
173
253
  * @param provisionType Type of provisioning for this domain
254
+ * @param certRoute The route reference for this domain
174
255
  */
175
- async renewDomain(domain, provisionType) {
256
+ async renewCertificateForDomain(domain, provisionType, certRoute) {
176
257
  if (provisionType === 'http01') {
177
258
  await this.port80Handler.renewCertificate(domain);
178
259
  }
@@ -180,13 +261,18 @@ export class CertProvisioner extends plugins.EventEmitter {
180
261
  const provision = await this.certProvisionFunction(domain);
181
262
  if (provision !== 'http01' && provision !== 'dns01') {
182
263
  const certObj = provision;
264
+ const routeRef = certRoute?.route;
183
265
  const certData = {
184
266
  domain: certObj.domainName,
185
267
  certificate: certObj.publicKey,
186
268
  privateKey: certObj.privateKey,
187
269
  expiryDate: new Date(certObj.validUntil),
188
270
  source: 'static',
189
- isRenewal: true
271
+ isRenewal: true,
272
+ routeReference: routeRef ? {
273
+ routeId: routeRef.name || domain,
274
+ routeName: routeRef.name
275
+ } : undefined
190
276
  };
191
277
  this.networkProxyBridge.applyExternalCertificate(certData);
192
278
  this.emit(CertProvisionerEvents.CERTIFICATE_RENEWED, certData);
@@ -203,10 +289,14 @@ export class CertProvisioner extends plugins.EventEmitter {
203
289
  }
204
290
  /**
205
291
  * Request a certificate on-demand for the given domain.
292
+ * This will look for a matching route configuration and provision accordingly.
293
+ *
206
294
  * @param domain Domain name to provision
207
295
  */
208
296
  async requestCertificate(domain) {
209
297
  const isWildcard = domain.includes('*');
298
+ // Find matching route
299
+ const certRoute = this.findRouteForDomain(domain);
210
300
  // Determine provisioning method
211
301
  let provision = 'http01';
212
302
  if (this.certProvisionFunction) {
@@ -224,7 +314,6 @@ export class CertProvisioner extends plugins.EventEmitter {
224
314
  }
225
315
  else if (provision === 'dns01') {
226
316
  // DNS-01 challenges would be handled by external mechanisms
227
- // This is a placeholder for future implementation
228
317
  console.log(`DNS-01 challenge requested for ${domain}`);
229
318
  }
230
319
  else {
@@ -236,7 +325,11 @@ export class CertProvisioner extends plugins.EventEmitter {
236
325
  privateKey: certObj.privateKey,
237
326
  expiryDate: new Date(certObj.validUntil),
238
327
  source: 'static',
239
- isRenewal: false
328
+ isRenewal: false,
329
+ routeReference: certRoute ? {
330
+ routeId: certRoute.route.name || domain,
331
+ routeName: certRoute.route.name
332
+ } : undefined
240
333
  };
241
334
  this.networkProxyBridge.applyExternalCertificate(certData);
242
335
  this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, certData);
@@ -244,19 +337,86 @@ export class CertProvisioner extends plugins.EventEmitter {
244
337
  }
245
338
  /**
246
339
  * Add a new domain for certificate provisioning
340
+ *
247
341
  * @param domain Domain to add
248
342
  * @param options Domain configuration options
249
343
  */
250
344
  async addDomain(domain, options) {
251
345
  const domainOptions = {
252
346
  domainName: domain,
253
- sslRedirect: options?.sslRedirect || true,
254
- acmeMaintenance: options?.acmeMaintenance || true
347
+ sslRedirect: options?.sslRedirect ?? true,
348
+ acmeMaintenance: options?.acmeMaintenance ?? true,
349
+ routeReference: {
350
+ routeId: options?.routeId,
351
+ routeName: options?.routeName
352
+ }
255
353
  };
256
354
  this.port80Handler.addDomain(domainOptions);
257
- await this.provisionDomain(domain);
355
+ // Find matching route or create a generic one
356
+ const existingRoute = this.findRouteForDomain(domain);
357
+ if (existingRoute) {
358
+ await this.provisionCertificateForRoute(existingRoute);
359
+ }
360
+ else {
361
+ // We don't have a route, just provision the domain
362
+ const isWildcard = domain.includes('*');
363
+ let provision = 'http01';
364
+ if (this.certProvisionFunction) {
365
+ provision = await this.certProvisionFunction(domain);
366
+ }
367
+ else if (isWildcard) {
368
+ throw new Error(`Cannot request certificate for wildcard domain without certProvisionFunction: ${domain}`);
369
+ }
370
+ this.provisionMap.set(domain, {
371
+ type: provision === 'http01' || provision === 'dns01' ? provision : 'static'
372
+ });
373
+ if (provision !== 'http01' && provision !== 'dns01') {
374
+ const certObj = provision;
375
+ const certData = {
376
+ domain: certObj.domainName,
377
+ certificate: certObj.publicKey,
378
+ privateKey: certObj.privateKey,
379
+ expiryDate: new Date(certObj.validUntil),
380
+ source: 'static',
381
+ isRenewal: false,
382
+ routeReference: {
383
+ routeId: options?.routeId,
384
+ routeName: options?.routeName
385
+ }
386
+ };
387
+ this.networkProxyBridge.applyExternalCertificate(certData);
388
+ this.emit(CertProvisionerEvents.CERTIFICATE_ISSUED, certData);
389
+ }
390
+ }
391
+ }
392
+ /**
393
+ * Update routes with new configurations
394
+ * This replaces all existing routes with new ones and re-provisions certificates as needed
395
+ *
396
+ * @param newRoutes New route configurations to use
397
+ */
398
+ async updateRoutes(newRoutes) {
399
+ // Store the new route configs
400
+ this.routeConfigs = newRoutes;
401
+ // Extract new certificate routes
402
+ const newCertRoutes = this.extractCertificateRoutesFromRoutes(newRoutes);
403
+ // Find domains that no longer need certificates
404
+ const oldDomains = new Set(this.certRoutes.map(r => r.domain));
405
+ const newDomains = new Set(newCertRoutes.map(r => r.domain));
406
+ // Domains to remove
407
+ const domainsToRemove = [...oldDomains].filter(d => !newDomains.has(d));
408
+ // Remove obsolete domains from provision map
409
+ for (const domain of domainsToRemove) {
410
+ this.provisionMap.delete(domain);
411
+ }
412
+ // Update the cert routes
413
+ this.certRoutes = newCertRoutes;
414
+ // Provision certificates for new routes
415
+ for (const certRoute of newCertRoutes) {
416
+ if (!oldDomains.has(certRoute.domain)) {
417
+ await this.provisionCertificateForRoute(certRoute);
418
+ }
419
+ }
258
420
  }
259
421
  }
260
- // For backward compatibility
261
- export { CertProvisioner as CertificateProvisioner };
262
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC1wcm92aXNpb25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NlcnRpZmljYXRlL3Byb3ZpZGVycy9jZXJ0LXByb3Zpc2lvbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFHNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBaUJwRTs7O0dBR0c7QUFDSCxNQUFNLE9BQU8sZUFBZ0IsU0FBUSxPQUFPLENBQUMsWUFBWTtJQWF2RDs7Ozs7Ozs7O09BU0c7SUFDSCxZQUNFLGFBQThCLEVBQzlCLGFBQTRCLEVBQzVCLGtCQUF1QyxFQUN2QyxZQUFnRSxFQUNoRSxxQkFBNkIsRUFBRSxFQUMvQiwwQkFBa0MsRUFBRSxFQUNwQyxZQUFxQixJQUFJLEVBQ3pCLGlCQUF5QyxFQUFFO1FBRTNDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7UUFDbkMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyxxQkFBcUIsR0FBRyxZQUFZLENBQUM7UUFDMUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDO1FBQzdDLElBQUksQ0FBQyx1QkFBdUIsR0FBRyx1QkFBdUIsQ0FBQztRQUN2RCxJQUFJLENBQUMsU0FBUyxHQUFHLFNBQVMsQ0FBQztRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDdkMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLEtBQUs7UUFDaEIs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
422
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC1wcm92aXNpb25lci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NlcnRpZmljYXRlL3Byb3ZpZGVycy9jZXJ0LXByb3Zpc2lvbmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFHNUMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLHFCQUFxQixFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0YsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBcUJwRTs7Ozs7R0FLRztBQUNILE1BQU0sT0FBTyxlQUFnQixTQUFRLE9BQU8sQ0FBQyxZQUFZO0lBY3ZEOzs7T0FHRztJQUNLLGtDQUFrQyxDQUFDLE1BQXNCO1FBQy9ELE1BQU0sVUFBVSxHQUFpQixFQUFFLENBQUM7UUFFcEMsa0RBQWtEO1FBQ2xELEtBQUssTUFBTSxLQUFLLElBQUksTUFBTSxFQUFFLENBQUM7WUFDM0Isa0VBQWtFO1lBQ2xFLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssU0FBUztnQkFDL0IsS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHO2dCQUNoQixDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksS0FBSyxXQUFXLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLHlCQUF5QixDQUFDO2dCQUM5RixLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUV4QixpQ0FBaUM7Z0JBQ2pDLE1BQU0sT0FBTyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7b0JBQ2hELENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU87b0JBQ3JCLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JB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
@@ -2,3 +2,5 @@
2
2
  * Core data models and interfaces
3
3
  */
4
4
  export * from './common-types.js';
5
+ export * from './socket-augmentation.js';
6
+ export * from './route-context.js';
@@ -2,4 +2,6 @@
2
2
  * Core data models and interfaces
3
3
  */
4
4
  export * from './common-types.js';
5
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsbUJBQW1CLENBQUMifQ==
5
+ export * from './socket-augmentation.js';
6
+ export * from './route-context.js';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jb3JlL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsbUJBQW1CLENBQUM7QUFDbEMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLG9CQUFvQixDQUFDIn0=
@@ -0,0 +1,62 @@
1
+ import * as plugins from '../../plugins.js';
2
+ /**
3
+ * Shared Route Context Interface
4
+ *
5
+ * This interface defines the route context object that is used by both
6
+ * SmartProxy and NetworkProxy, ensuring consistent context throughout the system.
7
+ */
8
+ /**
9
+ * Route context for route matching and function-based target resolution
10
+ */
11
+ export interface IRouteContext {
12
+ port: number;
13
+ domain?: string;
14
+ clientIp: string;
15
+ serverIp: string;
16
+ path?: string;
17
+ query?: string;
18
+ headers?: Record<string, string>;
19
+ isTls: boolean;
20
+ tlsVersion?: string;
21
+ routeName?: string;
22
+ routeId?: string;
23
+ targetHost?: string | string[];
24
+ targetPort?: number;
25
+ timestamp: number;
26
+ connectionId: string;
27
+ }
28
+ /**
29
+ * Extended context interface with HTTP-specific objects
30
+ * Used only in NetworkProxy for HTTP request handling
31
+ */
32
+ export interface IHttpRouteContext extends IRouteContext {
33
+ req?: plugins.http.IncomingMessage;
34
+ res?: plugins.http.ServerResponse;
35
+ method?: string;
36
+ }
37
+ /**
38
+ * Extended context interface with HTTP/2-specific objects
39
+ * Used only in NetworkProxy for HTTP/2 request handling
40
+ */
41
+ export interface IHttp2RouteContext extends IHttpRouteContext {
42
+ stream?: plugins.http2.ServerHttp2Stream;
43
+ headers?: Record<string, string>;
44
+ }
45
+ /**
46
+ * Create a basic route context from connection information
47
+ */
48
+ export declare function createBaseRouteContext(options: {
49
+ port: number;
50
+ clientIp: string;
51
+ serverIp: string;
52
+ domain?: string;
53
+ isTls: boolean;
54
+ tlsVersion?: string;
55
+ connectionId: string;
56
+ }): IRouteContext;
57
+ /**
58
+ * Convert IHttpRouteContext to IRouteContext
59
+ * This is used to ensure type compatibility when passing HTTP-specific context
60
+ * to methods that require the base IRouteContext type
61
+ */
62
+ export declare function toBaseContext(httpContext: IHttpRouteContext): IRouteContext;
@@ -0,0 +1,43 @@
1
+ import * as plugins from '../../plugins.js';
2
+ /**
3
+ * Create a basic route context from connection information
4
+ */
5
+ export function createBaseRouteContext(options) {
6
+ return {
7
+ ...options,
8
+ timestamp: Date.now(),
9
+ };
10
+ }
11
+ /**
12
+ * Convert IHttpRouteContext to IRouteContext
13
+ * This is used to ensure type compatibility when passing HTTP-specific context
14
+ * to methods that require the base IRouteContext type
15
+ */
16
+ export function toBaseContext(httpContext) {
17
+ // Create a new object with only the properties from IRouteContext
18
+ const baseContext = {
19
+ port: httpContext.port,
20
+ domain: httpContext.domain,
21
+ clientIp: httpContext.clientIp,
22
+ serverIp: httpContext.serverIp,
23
+ path: httpContext.path,
24
+ query: httpContext.query,
25
+ headers: httpContext.headers,
26
+ isTls: httpContext.isTls,
27
+ tlsVersion: httpContext.tlsVersion,
28
+ routeName: httpContext.routeName,
29
+ routeId: httpContext.routeId,
30
+ timestamp: httpContext.timestamp,
31
+ connectionId: httpContext.connectionId
32
+ };
33
+ // Only copy targetHost if it's a string
34
+ if (httpContext.targetHost) {
35
+ baseContext.targetHost = httpContext.targetHost;
36
+ }
37
+ // Copy targetPort if it exists
38
+ if (httpContext.targetPort) {
39
+ baseContext.targetPort = httpContext.targetPort;
40
+ }
41
+ return baseContext;
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvcmUvbW9kZWxzL3JvdXRlLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQTRENUM7O0dBRUc7QUFDSCxNQUFNLFVBQVUsc0JBQXNCLENBQUMsT0FRdEM7SUFDQyxPQUFPO1FBQ0wsR0FBRyxPQUFPO1FBQ1YsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7S0FDdEIsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsTUFBTSxVQUFVLGFBQWEsQ0FBQyxXQUE4QjtJQUMxRCxrRUFBa0U7SUFDbEUsTUFBTSxXQUFXLEdBQWtCO1FBQ2pDLElBQUksRUFBRSxXQUFXLENBQUMsSUFBSTtRQUN0QixNQUFNLEVBQUUsV0FBVyxDQUFDLE1BQU07UUFDMUIsUUFBUSxFQUFFLFdBQVcsQ0FBQyxRQUFRO1FBQzlCLFFBQVEsRUFBRSxXQUFXLENBQUMsUUFBUTtRQUM5QixJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUk7UUFDdEIsS0FBSyxFQUFFLFdBQVcsQ0FBQyxLQUFLO1FBQ3hCLE9BQU8sRUFBRSxXQUFXLENBQUMsT0FBTztRQUM1QixLQUFLLEVBQUUsV0FBVyxDQUFDLEtBQUs7UUFDeEIsVUFBVSxFQUFFLFdBQVcsQ0FBQyxVQUFVO1FBQ2xDLFNBQVMsRUFBRSxXQUFXLENBQUMsU0FBUztRQUNoQyxPQUFPLEVBQUUsV0FBVyxDQUFDLE9BQU87UUFDNUIsU0FBUyxFQUFFLFdBQVcsQ0FBQyxTQUFTO1FBQ2hDLFlBQVksRUFBRSxXQUFXLENBQUMsWUFBWTtLQUN2QyxDQUFDO0lBRUYsd0NBQXdDO0lBQ3hDLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNCLFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsK0JBQStCO0lBQy9CLElBQUksV0FBVyxDQUFDLFVBQVUsRUFBRSxDQUFDO1FBQzNCLFdBQVcsQ0FBQyxVQUFVLEdBQUcsV0FBVyxDQUFDLFVBQVUsQ0FBQztJQUNsRCxDQUFDO0lBRUQsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQyJ9
@@ -0,0 +1,12 @@
1
+ import * as plugins from '../../plugins.js';
2
+ declare module 'net' {
3
+ interface Socket {
4
+ encrypted?: boolean;
5
+ authorizationError?: Error;
6
+ getTLSVersion?(): string;
7
+ getPeerCertificate?(detailed?: boolean): any;
8
+ getSession?(): Buffer;
9
+ }
10
+ }
11
+ export declare function isTLSSocket(socket: plugins.net.Socket): boolean;
12
+ export declare function getTLSVersion(socket: plugins.net.Socket): string | null;
@@ -0,0 +1,18 @@
1
+ import * as plugins from '../../plugins.js';
2
+ // Export a utility function to check if a socket is a TLS socket
3
+ export function isTLSSocket(socket) {
4
+ return 'encrypted' in socket && !!socket.encrypted;
5
+ }
6
+ // Export a utility function to safely get the TLS version
7
+ export function getTLSVersion(socket) {
8
+ if (socket.getTLSVersion) {
9
+ try {
10
+ return socket.getTLSVersion();
11
+ }
12
+ catch (e) {
13
+ return null;
14
+ }
15
+ }
16
+ return null;
17
+ }
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic29ja2V0LWF1Z21lbnRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL2NvcmUvbW9kZWxzL3NvY2tldC1hdWdtZW50YXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxrQkFBa0IsQ0FBQztBQWlCNUMsaUVBQWlFO0FBQ2pFLE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBMEI7SUFDcEQsT0FBTyxXQUFXLElBQUksTUFBTSxJQUFJLENBQUMsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDO0FBQ3JELENBQUM7QUFFRCwwREFBMEQ7QUFDMUQsTUFBTSxVQUFVLGFBQWEsQ0FBQyxNQUEwQjtJQUN0RCxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN6QixJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUNoQyxDQUFDO1FBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztZQUNYLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztJQUNILENBQUM7SUFDRCxPQUFPLElBQUksQ0FBQztBQUNkLENBQUMifQ==