@push.rocks/smartproxy 5.0.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (78) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/classes.pp.interfaces.d.ts +23 -0
  3. package/dist_ts/classes.pp.networkproxybridge.d.ts +15 -1
  4. package/dist_ts/classes.pp.networkproxybridge.js +116 -21
  5. package/dist_ts/classes.pp.portproxy.d.ts +20 -4
  6. package/dist_ts/classes.pp.portproxy.js +321 -22
  7. package/dist_ts/index.d.ts +6 -6
  8. package/dist_ts/index.js +7 -7
  9. package/dist_ts/networkproxy/classes.np.certificatemanager.d.ts +77 -0
  10. package/dist_ts/networkproxy/classes.np.certificatemanager.js +354 -0
  11. package/dist_ts/networkproxy/classes.np.connectionpool.d.ts +47 -0
  12. package/dist_ts/networkproxy/classes.np.connectionpool.js +210 -0
  13. package/dist_ts/networkproxy/classes.np.networkproxy.d.ts +117 -0
  14. package/dist_ts/networkproxy/classes.np.networkproxy.js +375 -0
  15. package/dist_ts/networkproxy/classes.np.requesthandler.d.ts +51 -0
  16. package/dist_ts/networkproxy/classes.np.requesthandler.js +210 -0
  17. package/dist_ts/networkproxy/classes.np.types.d.ts +82 -0
  18. package/dist_ts/networkproxy/classes.np.types.js +35 -0
  19. package/dist_ts/networkproxy/classes.np.websockethandler.d.ts +38 -0
  20. package/dist_ts/networkproxy/classes.np.websockethandler.js +188 -0
  21. package/dist_ts/networkproxy/index.d.ts +6 -0
  22. package/dist_ts/networkproxy/index.js +8 -0
  23. package/dist_ts/nfttablesproxy/classes.nftablesproxy.d.ts +219 -0
  24. package/dist_ts/nfttablesproxy/classes.nftablesproxy.js +1542 -0
  25. package/dist_ts/port80handler/classes.port80handler.d.ts +260 -0
  26. package/dist_ts/port80handler/classes.port80handler.js +928 -0
  27. package/dist_ts/smartproxy/classes.pp.connectionhandler.d.ts +39 -0
  28. package/dist_ts/smartproxy/classes.pp.connectionhandler.js +754 -0
  29. package/dist_ts/smartproxy/classes.pp.connectionmanager.d.ts +78 -0
  30. package/dist_ts/smartproxy/classes.pp.connectionmanager.js +378 -0
  31. package/dist_ts/smartproxy/classes.pp.domainconfigmanager.d.ts +55 -0
  32. package/dist_ts/smartproxy/classes.pp.domainconfigmanager.js +103 -0
  33. package/dist_ts/smartproxy/classes.pp.interfaces.d.ts +133 -0
  34. package/dist_ts/smartproxy/classes.pp.interfaces.js +2 -0
  35. package/dist_ts/smartproxy/classes.pp.networkproxybridge.d.ts +57 -0
  36. package/dist_ts/smartproxy/classes.pp.networkproxybridge.js +306 -0
  37. package/dist_ts/smartproxy/classes.pp.portrangemanager.d.ts +56 -0
  38. package/dist_ts/smartproxy/classes.pp.portrangemanager.js +179 -0
  39. package/dist_ts/smartproxy/classes.pp.securitymanager.d.ts +47 -0
  40. package/dist_ts/smartproxy/classes.pp.securitymanager.js +126 -0
  41. package/dist_ts/smartproxy/classes.pp.snihandler.d.ts +153 -0
  42. package/dist_ts/smartproxy/classes.pp.snihandler.js +1053 -0
  43. package/dist_ts/smartproxy/classes.pp.timeoutmanager.d.ts +47 -0
  44. package/dist_ts/smartproxy/classes.pp.timeoutmanager.js +154 -0
  45. package/dist_ts/smartproxy/classes.pp.tlsalert.d.ts +149 -0
  46. package/dist_ts/smartproxy/classes.pp.tlsalert.js +225 -0
  47. package/dist_ts/smartproxy/classes.pp.tlsmanager.d.ts +57 -0
  48. package/dist_ts/smartproxy/classes.pp.tlsmanager.js +132 -0
  49. package/dist_ts/smartproxy/classes.smartproxy.d.ts +64 -0
  50. package/dist_ts/smartproxy/classes.smartproxy.js +567 -0
  51. package/package.json +1 -1
  52. package/readme.md +77 -27
  53. package/ts/00_commitinfo_data.ts +1 -1
  54. package/ts/index.ts +6 -6
  55. package/ts/networkproxy/classes.np.certificatemanager.ts +398 -0
  56. package/ts/networkproxy/classes.np.connectionpool.ts +241 -0
  57. package/ts/networkproxy/classes.np.networkproxy.ts +469 -0
  58. package/ts/networkproxy/classes.np.requesthandler.ts +278 -0
  59. package/ts/networkproxy/classes.np.types.ts +123 -0
  60. package/ts/networkproxy/classes.np.websockethandler.ts +226 -0
  61. package/ts/networkproxy/index.ts +7 -0
  62. package/ts/{classes.port80handler.ts → port80handler/classes.port80handler.ts} +249 -1
  63. package/ts/{classes.pp.connectionhandler.ts → smartproxy/classes.pp.connectionhandler.ts} +1 -1
  64. package/ts/{classes.pp.connectionmanager.ts → smartproxy/classes.pp.connectionmanager.ts} +1 -1
  65. package/ts/{classes.pp.domainconfigmanager.ts → smartproxy/classes.pp.domainconfigmanager.ts} +1 -1
  66. package/ts/{classes.pp.interfaces.ts → smartproxy/classes.pp.interfaces.ts} +31 -5
  67. package/ts/{classes.pp.networkproxybridge.ts → smartproxy/classes.pp.networkproxybridge.ts} +129 -28
  68. package/ts/{classes.pp.securitymanager.ts → smartproxy/classes.pp.securitymanager.ts} +1 -1
  69. package/ts/{classes.pp.tlsmanager.ts → smartproxy/classes.pp.tlsmanager.ts} +1 -1
  70. package/ts/smartproxy/classes.smartproxy.ts +679 -0
  71. package/ts/classes.networkproxy.ts +0 -1730
  72. package/ts/classes.pp.acmemanager.ts +0 -149
  73. package/ts/classes.pp.portproxy.ts +0 -344
  74. /package/ts/{classes.nftablesproxy.ts → nfttablesproxy/classes.nftablesproxy.ts} +0 -0
  75. /package/ts/{classes.pp.portrangemanager.ts → smartproxy/classes.pp.portrangemanager.ts} +0 -0
  76. /package/ts/{classes.pp.snihandler.ts → smartproxy/classes.pp.snihandler.ts} +0 -0
  77. /package/ts/{classes.pp.timeoutmanager.ts → smartproxy/classes.pp.timeoutmanager.ts} +0 -0
  78. /package/ts/{classes.pp.tlsalert.ts → smartproxy/classes.pp.tlsalert.ts} +0 -0
@@ -0,0 +1,567 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { ConnectionManager } from './classes.pp.connectionmanager.js';
3
+ import { SecurityManager } from './classes.pp.securitymanager.js';
4
+ import { DomainConfigManager } from './classes.pp.domainconfigmanager.js';
5
+ import { TlsManager } from './classes.pp.tlsmanager.js';
6
+ import { NetworkProxyBridge } from './classes.pp.networkproxybridge.js';
7
+ import { TimeoutManager } from './classes.pp.timeoutmanager.js';
8
+ import { PortRangeManager } from './classes.pp.portrangemanager.js';
9
+ import { ConnectionHandler } from './classes.pp.connectionhandler.js';
10
+ import { Port80Handler, Port80HandlerEvents } from '../port80handler/classes.port80handler.js';
11
+ import * as path from 'path';
12
+ import * as fs from 'fs';
13
+ /**
14
+ * SmartProxy - Main class that coordinates all components
15
+ */
16
+ export class SmartProxy {
17
+ constructor(settingsArg) {
18
+ this.netServers = [];
19
+ this.connectionLogger = null;
20
+ this.isShuttingDown = false;
21
+ // Port80Handler for ACME certificate management
22
+ this.port80Handler = null;
23
+ // Set reasonable defaults for all settings
24
+ this.settings = {
25
+ ...settingsArg,
26
+ targetIP: settingsArg.targetIP || 'localhost',
27
+ initialDataTimeout: settingsArg.initialDataTimeout || 120000,
28
+ socketTimeout: settingsArg.socketTimeout || 3600000,
29
+ inactivityCheckInterval: settingsArg.inactivityCheckInterval || 60000,
30
+ maxConnectionLifetime: settingsArg.maxConnectionLifetime || 86400000,
31
+ inactivityTimeout: settingsArg.inactivityTimeout || 14400000,
32
+ gracefulShutdownTimeout: settingsArg.gracefulShutdownTimeout || 30000,
33
+ noDelay: settingsArg.noDelay !== undefined ? settingsArg.noDelay : true,
34
+ keepAlive: settingsArg.keepAlive !== undefined ? settingsArg.keepAlive : true,
35
+ keepAliveInitialDelay: settingsArg.keepAliveInitialDelay || 10000,
36
+ maxPendingDataSize: settingsArg.maxPendingDataSize || 10 * 1024 * 1024,
37
+ disableInactivityCheck: settingsArg.disableInactivityCheck || false,
38
+ enableKeepAliveProbes: settingsArg.enableKeepAliveProbes !== undefined ? settingsArg.enableKeepAliveProbes : true,
39
+ enableDetailedLogging: settingsArg.enableDetailedLogging || false,
40
+ enableTlsDebugLogging: settingsArg.enableTlsDebugLogging || false,
41
+ enableRandomizedTimeouts: settingsArg.enableRandomizedTimeouts || false,
42
+ allowSessionTicket: settingsArg.allowSessionTicket !== undefined ? settingsArg.allowSessionTicket : true,
43
+ maxConnectionsPerIP: settingsArg.maxConnectionsPerIP || 100,
44
+ connectionRateLimitPerMinute: settingsArg.connectionRateLimitPerMinute || 300,
45
+ keepAliveTreatment: settingsArg.keepAliveTreatment || 'extended',
46
+ keepAliveInactivityMultiplier: settingsArg.keepAliveInactivityMultiplier || 6,
47
+ extendedKeepAliveLifetime: settingsArg.extendedKeepAliveLifetime || 7 * 24 * 60 * 60 * 1000,
48
+ networkProxyPort: settingsArg.networkProxyPort || 8443,
49
+ port80HandlerConfig: settingsArg.port80HandlerConfig || {},
50
+ globalPortRanges: settingsArg.globalPortRanges || [],
51
+ };
52
+ // Set port80HandlerConfig defaults, using legacy acme config if available
53
+ if (!this.settings.port80HandlerConfig || Object.keys(this.settings.port80HandlerConfig).length === 0) {
54
+ if (this.settings.acme) {
55
+ // Migrate from legacy acme config
56
+ this.settings.port80HandlerConfig = {
57
+ enabled: this.settings.acme.enabled,
58
+ port: this.settings.acme.port || 80,
59
+ contactEmail: this.settings.acme.contactEmail || 'admin@example.com',
60
+ useProduction: this.settings.acme.useProduction || false,
61
+ renewThresholdDays: this.settings.acme.renewThresholdDays || 30,
62
+ autoRenew: this.settings.acme.autoRenew !== false, // Default to true
63
+ certificateStore: this.settings.acme.certificateStore || './certs',
64
+ skipConfiguredCerts: this.settings.acme.skipConfiguredCerts || false,
65
+ httpsRedirectPort: this.settings.fromPort,
66
+ renewCheckIntervalHours: 24
67
+ };
68
+ }
69
+ else {
70
+ // Set defaults if no config provided
71
+ this.settings.port80HandlerConfig = {
72
+ enabled: false,
73
+ port: 80,
74
+ contactEmail: 'admin@example.com',
75
+ useProduction: false,
76
+ renewThresholdDays: 30,
77
+ autoRenew: true,
78
+ certificateStore: './certs',
79
+ skipConfiguredCerts: false,
80
+ httpsRedirectPort: this.settings.fromPort,
81
+ renewCheckIntervalHours: 24
82
+ };
83
+ }
84
+ }
85
+ // Initialize component managers
86
+ this.timeoutManager = new TimeoutManager(this.settings);
87
+ this.securityManager = new SecurityManager(this.settings);
88
+ this.connectionManager = new ConnectionManager(this.settings, this.securityManager, this.timeoutManager);
89
+ this.domainConfigManager = new DomainConfigManager(this.settings);
90
+ this.tlsManager = new TlsManager(this.settings);
91
+ this.networkProxyBridge = new NetworkProxyBridge(this.settings);
92
+ this.portRangeManager = new PortRangeManager(this.settings);
93
+ // Initialize connection handler
94
+ this.connectionHandler = new ConnectionHandler(this.settings, this.connectionManager, this.securityManager, this.domainConfigManager, this.tlsManager, this.networkProxyBridge, this.timeoutManager, this.portRangeManager);
95
+ }
96
+ /**
97
+ * Initialize the Port80Handler for ACME certificate management
98
+ */
99
+ async initializePort80Handler() {
100
+ const config = this.settings.port80HandlerConfig;
101
+ if (!config || !config.enabled) {
102
+ console.log('Port80Handler is disabled in configuration');
103
+ return;
104
+ }
105
+ try {
106
+ // Ensure the certificate store directory exists
107
+ if (config.certificateStore) {
108
+ const certStorePath = path.resolve(config.certificateStore);
109
+ if (!fs.existsSync(certStorePath)) {
110
+ fs.mkdirSync(certStorePath, { recursive: true });
111
+ console.log(`Created certificate store directory: ${certStorePath}`);
112
+ }
113
+ }
114
+ // Create Port80Handler with options from config
115
+ this.port80Handler = new Port80Handler({
116
+ port: config.port,
117
+ contactEmail: config.contactEmail,
118
+ useProduction: config.useProduction,
119
+ renewThresholdDays: config.renewThresholdDays,
120
+ httpsRedirectPort: config.httpsRedirectPort || this.settings.fromPort,
121
+ renewCheckIntervalHours: config.renewCheckIntervalHours,
122
+ enabled: config.enabled,
123
+ autoRenew: config.autoRenew,
124
+ certificateStore: config.certificateStore,
125
+ skipConfiguredCerts: config.skipConfiguredCerts
126
+ });
127
+ // Register domain forwarding configurations
128
+ if (config.domainForwards) {
129
+ for (const forward of config.domainForwards) {
130
+ this.port80Handler.addDomain({
131
+ domainName: forward.domain,
132
+ sslRedirect: true,
133
+ acmeMaintenance: true,
134
+ forward: forward.forwardConfig,
135
+ acmeForward: forward.acmeForwardConfig
136
+ });
137
+ console.log(`Registered domain forwarding for ${forward.domain}`);
138
+ }
139
+ }
140
+ // Register all non-wildcard domains from domain configs
141
+ for (const domainConfig of this.settings.domainConfigs) {
142
+ for (const domain of domainConfig.domains) {
143
+ // Skip wildcards
144
+ if (domain.includes('*'))
145
+ continue;
146
+ this.port80Handler.addDomain({
147
+ domainName: domain,
148
+ sslRedirect: true,
149
+ acmeMaintenance: true
150
+ });
151
+ console.log(`Registered domain ${domain} with Port80Handler`);
152
+ }
153
+ }
154
+ // Set up event listeners
155
+ this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_ISSUED, (certData) => {
156
+ console.log(`Certificate issued for ${certData.domain}, valid until ${certData.expiryDate.toISOString()}`);
157
+ });
158
+ this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_RENEWED, (certData) => {
159
+ console.log(`Certificate renewed for ${certData.domain}, valid until ${certData.expiryDate.toISOString()}`);
160
+ });
161
+ this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_FAILED, (failureData) => {
162
+ console.log(`Certificate ${failureData.isRenewal ? 'renewal' : 'issuance'} failed for ${failureData.domain}: ${failureData.error}`);
163
+ });
164
+ this.port80Handler.on(Port80HandlerEvents.CERTIFICATE_EXPIRING, (expiryData) => {
165
+ console.log(`Certificate for ${expiryData.domain} is expiring in ${expiryData.daysRemaining} days`);
166
+ });
167
+ // Share Port80Handler with NetworkProxyBridge
168
+ this.networkProxyBridge.setPort80Handler(this.port80Handler);
169
+ // Start Port80Handler
170
+ await this.port80Handler.start();
171
+ console.log(`Port80Handler started on port ${config.port}`);
172
+ }
173
+ catch (err) {
174
+ console.log(`Error initializing Port80Handler: ${err}`);
175
+ }
176
+ }
177
+ /**
178
+ * Start the proxy server
179
+ */
180
+ async start() {
181
+ // Don't start if already shutting down
182
+ if (this.isShuttingDown) {
183
+ console.log("Cannot start PortProxy while it's shutting down");
184
+ return;
185
+ }
186
+ // Initialize Port80Handler if enabled
187
+ await this.initializePort80Handler();
188
+ // Initialize and start NetworkProxy if needed
189
+ if (this.settings.useNetworkProxy &&
190
+ this.settings.useNetworkProxy.length > 0) {
191
+ await this.networkProxyBridge.initialize();
192
+ await this.networkProxyBridge.start();
193
+ }
194
+ // Validate port configuration
195
+ const configWarnings = this.portRangeManager.validateConfiguration();
196
+ if (configWarnings.length > 0) {
197
+ console.log("Port configuration warnings:");
198
+ for (const warning of configWarnings) {
199
+ console.log(` - ${warning}`);
200
+ }
201
+ }
202
+ // Get listening ports from PortRangeManager
203
+ const listeningPorts = this.portRangeManager.getListeningPorts();
204
+ // Create servers for each port
205
+ for (const port of listeningPorts) {
206
+ const server = plugins.net.createServer((socket) => {
207
+ // Check if shutting down
208
+ if (this.isShuttingDown) {
209
+ socket.end();
210
+ socket.destroy();
211
+ return;
212
+ }
213
+ // Delegate to connection handler
214
+ this.connectionHandler.handleConnection(socket);
215
+ }).on('error', (err) => {
216
+ console.log(`Server Error on port ${port}: ${err.message}`);
217
+ });
218
+ server.listen(port, () => {
219
+ const isNetworkProxyPort = this.settings.useNetworkProxy?.includes(port);
220
+ console.log(`PortProxy -> OK: Now listening on port ${port}${this.settings.sniEnabled && !isNetworkProxyPort ? ' (SNI passthrough enabled)' : ''}${isNetworkProxyPort ? ' (NetworkProxy forwarding enabled)' : ''}`);
221
+ });
222
+ this.netServers.push(server);
223
+ }
224
+ // Set up periodic connection logging and inactivity checks
225
+ this.connectionLogger = setInterval(() => {
226
+ // Immediately return if shutting down
227
+ if (this.isShuttingDown)
228
+ return;
229
+ // Perform inactivity check
230
+ this.connectionManager.performInactivityCheck();
231
+ // Log connection statistics
232
+ const now = Date.now();
233
+ let maxIncoming = 0;
234
+ let maxOutgoing = 0;
235
+ let tlsConnections = 0;
236
+ let nonTlsConnections = 0;
237
+ let completedTlsHandshakes = 0;
238
+ let pendingTlsHandshakes = 0;
239
+ let keepAliveConnections = 0;
240
+ let networkProxyConnections = 0;
241
+ // Get connection records for analysis
242
+ const connectionRecords = this.connectionManager.getConnections();
243
+ // Analyze active connections
244
+ for (const record of connectionRecords.values()) {
245
+ // Track connection stats
246
+ if (record.isTLS) {
247
+ tlsConnections++;
248
+ if (record.tlsHandshakeComplete) {
249
+ completedTlsHandshakes++;
250
+ }
251
+ else {
252
+ pendingTlsHandshakes++;
253
+ }
254
+ }
255
+ else {
256
+ nonTlsConnections++;
257
+ }
258
+ if (record.hasKeepAlive) {
259
+ keepAliveConnections++;
260
+ }
261
+ if (record.usingNetworkProxy) {
262
+ networkProxyConnections++;
263
+ }
264
+ maxIncoming = Math.max(maxIncoming, now - record.incomingStartTime);
265
+ if (record.outgoingStartTime) {
266
+ maxOutgoing = Math.max(maxOutgoing, now - record.outgoingStartTime);
267
+ }
268
+ }
269
+ // Get termination stats
270
+ const terminationStats = this.connectionManager.getTerminationStats();
271
+ // Log detailed stats
272
+ console.log(`Active connections: ${connectionRecords.size}. ` +
273
+ `Types: TLS=${tlsConnections} (Completed=${completedTlsHandshakes}, Pending=${pendingTlsHandshakes}), ` +
274
+ `Non-TLS=${nonTlsConnections}, KeepAlive=${keepAliveConnections}, NetworkProxy=${networkProxyConnections}. ` +
275
+ `Longest running: IN=${plugins.prettyMs(maxIncoming)}, OUT=${plugins.prettyMs(maxOutgoing)}. ` +
276
+ `Termination stats: ${JSON.stringify({
277
+ IN: terminationStats.incoming,
278
+ OUT: terminationStats.outgoing,
279
+ })}`);
280
+ }, this.settings.inactivityCheckInterval || 60000);
281
+ // Make sure the interval doesn't keep the process alive
282
+ if (this.connectionLogger.unref) {
283
+ this.connectionLogger.unref();
284
+ }
285
+ }
286
+ /**
287
+ * Stop the proxy server
288
+ */
289
+ async stop() {
290
+ console.log('PortProxy shutting down...');
291
+ this.isShuttingDown = true;
292
+ // Stop the Port80Handler if running
293
+ if (this.port80Handler) {
294
+ try {
295
+ await this.port80Handler.stop();
296
+ console.log('Port80Handler stopped');
297
+ this.port80Handler = null;
298
+ }
299
+ catch (err) {
300
+ console.log(`Error stopping Port80Handler: ${err}`);
301
+ }
302
+ }
303
+ // Stop accepting new connections
304
+ const closeServerPromises = this.netServers.map((server) => new Promise((resolve) => {
305
+ if (!server.listening) {
306
+ resolve();
307
+ return;
308
+ }
309
+ server.close((err) => {
310
+ if (err) {
311
+ console.log(`Error closing server: ${err.message}`);
312
+ }
313
+ resolve();
314
+ });
315
+ }));
316
+ // Stop the connection logger
317
+ if (this.connectionLogger) {
318
+ clearInterval(this.connectionLogger);
319
+ this.connectionLogger = null;
320
+ }
321
+ // Wait for servers to close
322
+ await Promise.all(closeServerPromises);
323
+ console.log('All servers closed. Cleaning up active connections...');
324
+ // Clean up all active connections
325
+ this.connectionManager.clearConnections();
326
+ // Stop NetworkProxy
327
+ await this.networkProxyBridge.stop();
328
+ // Clear all servers
329
+ this.netServers = [];
330
+ console.log('PortProxy shutdown complete.');
331
+ }
332
+ /**
333
+ * Updates the domain configurations for the proxy
334
+ */
335
+ async updateDomainConfigs(newDomainConfigs) {
336
+ console.log(`Updating domain configurations (${newDomainConfigs.length} configs)`);
337
+ // Update domain configs in DomainConfigManager
338
+ this.domainConfigManager.updateDomainConfigs(newDomainConfigs);
339
+ // If NetworkProxy is initialized, resync the configurations
340
+ if (this.networkProxyBridge.getNetworkProxy()) {
341
+ await this.networkProxyBridge.syncDomainConfigsToNetworkProxy();
342
+ }
343
+ // If Port80Handler is running, register non-wildcard domains
344
+ if (this.port80Handler && this.settings.port80HandlerConfig?.enabled) {
345
+ for (const domainConfig of newDomainConfigs) {
346
+ for (const domain of domainConfig.domains) {
347
+ // Skip wildcards
348
+ if (domain.includes('*'))
349
+ continue;
350
+ this.port80Handler.addDomain({
351
+ domainName: domain,
352
+ sslRedirect: true,
353
+ acmeMaintenance: true
354
+ });
355
+ }
356
+ }
357
+ console.log('Registered non-wildcard domains with Port80Handler');
358
+ }
359
+ }
360
+ /**
361
+ * Updates the Port80Handler configuration
362
+ */
363
+ async updatePort80HandlerConfig(config) {
364
+ if (!config)
365
+ return;
366
+ console.log('Updating Port80Handler configuration');
367
+ // Update the settings
368
+ this.settings.port80HandlerConfig = {
369
+ ...this.settings.port80HandlerConfig,
370
+ ...config
371
+ };
372
+ // Check if we need to restart Port80Handler
373
+ let needsRestart = false;
374
+ // Restart if enabled state changed
375
+ if (this.port80Handler && config.enabled === false) {
376
+ needsRestart = true;
377
+ }
378
+ else if (!this.port80Handler && config.enabled === true) {
379
+ needsRestart = true;
380
+ }
381
+ else if (this.port80Handler && (config.port !== undefined ||
382
+ config.contactEmail !== undefined ||
383
+ config.useProduction !== undefined ||
384
+ config.renewThresholdDays !== undefined ||
385
+ config.renewCheckIntervalHours !== undefined)) {
386
+ // Restart if critical settings changed
387
+ needsRestart = true;
388
+ }
389
+ if (needsRestart) {
390
+ // Stop if running
391
+ if (this.port80Handler) {
392
+ try {
393
+ await this.port80Handler.stop();
394
+ this.port80Handler = null;
395
+ console.log('Stopped Port80Handler for configuration update');
396
+ }
397
+ catch (err) {
398
+ console.log(`Error stopping Port80Handler: ${err}`);
399
+ }
400
+ }
401
+ // Start with new config if enabled
402
+ if (this.settings.port80HandlerConfig.enabled) {
403
+ await this.initializePort80Handler();
404
+ console.log('Restarted Port80Handler with new configuration');
405
+ }
406
+ }
407
+ else if (this.port80Handler) {
408
+ // Just update domain forwards if they changed
409
+ if (config.domainForwards) {
410
+ for (const forward of config.domainForwards) {
411
+ this.port80Handler.addDomain({
412
+ domainName: forward.domain,
413
+ sslRedirect: true,
414
+ acmeMaintenance: true,
415
+ forward: forward.forwardConfig,
416
+ acmeForward: forward.acmeForwardConfig
417
+ });
418
+ }
419
+ console.log('Updated domain forwards in Port80Handler');
420
+ }
421
+ }
422
+ }
423
+ /**
424
+ * Request a certificate for a specific domain
425
+ */
426
+ async requestCertificate(domain) {
427
+ // Validate domain format
428
+ if (!this.isValidDomain(domain)) {
429
+ console.log(`Invalid domain format: ${domain}`);
430
+ return false;
431
+ }
432
+ // Use Port80Handler if available
433
+ if (this.port80Handler) {
434
+ try {
435
+ // Check if we already have a certificate
436
+ const cert = this.port80Handler.getCertificate(domain);
437
+ if (cert) {
438
+ console.log(`Certificate already exists for ${domain}, valid until ${cert.expiryDate.toISOString()}`);
439
+ return true;
440
+ }
441
+ // Register domain for certificate issuance
442
+ this.port80Handler.addDomain({
443
+ domainName: domain,
444
+ sslRedirect: true,
445
+ acmeMaintenance: true
446
+ });
447
+ console.log(`Domain ${domain} registered for certificate issuance`);
448
+ return true;
449
+ }
450
+ catch (err) {
451
+ console.log(`Error registering domain with Port80Handler: ${err}`);
452
+ return false;
453
+ }
454
+ }
455
+ // Fall back to NetworkProxyBridge
456
+ return this.networkProxyBridge.requestCertificate(domain);
457
+ }
458
+ /**
459
+ * Validates if a domain name is valid for certificate issuance
460
+ */
461
+ isValidDomain(domain) {
462
+ // Very basic domain validation
463
+ if (!domain || domain.length === 0) {
464
+ return false;
465
+ }
466
+ // Check for wildcard domains (they can't get ACME certs)
467
+ if (domain.includes('*')) {
468
+ console.log(`Wildcard domains like "${domain}" are not supported for ACME certificates`);
469
+ return false;
470
+ }
471
+ // Check if domain has at least one dot and no invalid characters
472
+ const validDomainRegex = /^[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(\.[a-zA-Z0-9]([a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/;
473
+ if (!validDomainRegex.test(domain)) {
474
+ console.log(`Domain "${domain}" has invalid format`);
475
+ return false;
476
+ }
477
+ return true;
478
+ }
479
+ /**
480
+ * Get statistics about current connections
481
+ */
482
+ getStatistics() {
483
+ const connectionRecords = this.connectionManager.getConnections();
484
+ const terminationStats = this.connectionManager.getTerminationStats();
485
+ let tlsConnections = 0;
486
+ let nonTlsConnections = 0;
487
+ let keepAliveConnections = 0;
488
+ let networkProxyConnections = 0;
489
+ // Analyze active connections
490
+ for (const record of connectionRecords.values()) {
491
+ if (record.isTLS)
492
+ tlsConnections++;
493
+ else
494
+ nonTlsConnections++;
495
+ if (record.hasKeepAlive)
496
+ keepAliveConnections++;
497
+ if (record.usingNetworkProxy)
498
+ networkProxyConnections++;
499
+ }
500
+ return {
501
+ activeConnections: connectionRecords.size,
502
+ tlsConnections,
503
+ nonTlsConnections,
504
+ keepAliveConnections,
505
+ networkProxyConnections,
506
+ terminationStats,
507
+ acmeEnabled: !!this.port80Handler,
508
+ port80HandlerPort: this.port80Handler ? this.settings.port80HandlerConfig?.port : null
509
+ };
510
+ }
511
+ /**
512
+ * Get a list of eligible domains for ACME certificates
513
+ */
514
+ getEligibleDomainsForCertificates() {
515
+ // Collect all non-wildcard domains from domain configs
516
+ const domains = [];
517
+ for (const config of this.settings.domainConfigs) {
518
+ // Skip domains that can't be used with ACME
519
+ const eligibleDomains = config.domains.filter(domain => !domain.includes('*') && this.isValidDomain(domain));
520
+ domains.push(...eligibleDomains);
521
+ }
522
+ return domains;
523
+ }
524
+ /**
525
+ * Get status of certificates managed by Port80Handler
526
+ */
527
+ getCertificateStatus() {
528
+ if (!this.port80Handler) {
529
+ return {
530
+ enabled: false,
531
+ message: 'Port80Handler is not enabled'
532
+ };
533
+ }
534
+ // Get eligible domains
535
+ const eligibleDomains = this.getEligibleDomainsForCertificates();
536
+ const certificateStatus = {};
537
+ // Check each domain
538
+ for (const domain of eligibleDomains) {
539
+ const cert = this.port80Handler.getCertificate(domain);
540
+ if (cert) {
541
+ const now = new Date();
542
+ const expiryDate = cert.expiryDate;
543
+ const daysRemaining = Math.floor((expiryDate.getTime() - now.getTime()) / (24 * 60 * 60 * 1000));
544
+ certificateStatus[domain] = {
545
+ status: 'valid',
546
+ expiryDate: expiryDate.toISOString(),
547
+ daysRemaining,
548
+ renewalNeeded: daysRemaining <= this.settings.port80HandlerConfig.renewThresholdDays
549
+ };
550
+ }
551
+ else {
552
+ certificateStatus[domain] = {
553
+ status: 'missing',
554
+ message: 'No certificate found'
555
+ };
556
+ }
557
+ }
558
+ return {
559
+ enabled: true,
560
+ port: this.settings.port80HandlerConfig.port,
561
+ useProduction: this.settings.port80HandlerConfig.useProduction,
562
+ autoRenew: this.settings.port80HandlerConfig.autoRenew,
563
+ certificates: certificateStatus
564
+ };
565
+ }
566
+ }
567
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydHByb3h5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvc21hcnRwcm94eS9jbGFzc2VzLnNtYXJ0cHJveHkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHFDQUFxQyxDQUFDO0FBQzFFLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxvQ0FBb0MsQ0FBQztBQUN4RSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZ0NBQWdDLENBQUM7QUFDaEUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDcEUsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFDdEUsT0FBTyxFQUFFLGFBQWEsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLDJDQUEyQyxDQUFDO0FBQy9GLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFDO0FBQzdCLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFDO0FBRXpCOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFrQnJCLFlBQVksV0FBK0I7UUFqQm5DLGVBQVUsR0FBeUIsRUFBRSxDQUFDO1FBQ3RDLHFCQUFnQixHQUEwQixJQUFJLENBQUM7UUFDL0MsbUJBQWMsR0FBWSxLQUFLLENBQUM7UUFZeEMsZ0RBQWdEO1FBQ3hDLGtCQUFhLEdBQXlCLElBQUksQ0FBQztRQUdqRCwyQ0FBMkM7UUFDM0MsSUFBSSxDQUFDLFFBQVEsR0FBRztZQUNkLEdBQUcsV0FBVztZQUNkLFFBQVEsRUFBRSxX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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartproxy",
3
- "version": "5.0.0",
3
+ "version": "6.0.0",
4
4
  "private": false,
5
5
  "description": "A powerful proxy package that effectively handles high traffic, with features such as SSL/TLS support, port proxying, WebSocket handling, dynamic routing with authentication options, and automatic ACME certificate management.",
6
6
  "main": "dist_ts/index.js",