@push.rocks/smartproxy 5.1.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 (75) hide show
  1. package/dist_ts/classes.pp.interfaces.d.ts +23 -0
  2. package/dist_ts/classes.pp.networkproxybridge.d.ts +15 -1
  3. package/dist_ts/classes.pp.networkproxybridge.js +116 -21
  4. package/dist_ts/classes.pp.portproxy.d.ts +20 -4
  5. package/dist_ts/classes.pp.portproxy.js +321 -22
  6. package/dist_ts/index.d.ts +6 -6
  7. package/dist_ts/index.js +7 -7
  8. package/dist_ts/networkproxy/classes.np.certificatemanager.d.ts +77 -0
  9. package/dist_ts/networkproxy/classes.np.certificatemanager.js +354 -0
  10. package/dist_ts/networkproxy/classes.np.connectionpool.d.ts +47 -0
  11. package/dist_ts/networkproxy/classes.np.connectionpool.js +210 -0
  12. package/dist_ts/networkproxy/classes.np.networkproxy.d.ts +117 -0
  13. package/dist_ts/networkproxy/classes.np.networkproxy.js +375 -0
  14. package/dist_ts/networkproxy/classes.np.requesthandler.d.ts +51 -0
  15. package/dist_ts/networkproxy/classes.np.requesthandler.js +210 -0
  16. package/dist_ts/networkproxy/classes.np.types.d.ts +82 -0
  17. package/dist_ts/networkproxy/classes.np.types.js +35 -0
  18. package/dist_ts/networkproxy/classes.np.websockethandler.d.ts +38 -0
  19. package/dist_ts/networkproxy/classes.np.websockethandler.js +188 -0
  20. package/dist_ts/networkproxy/index.d.ts +6 -0
  21. package/dist_ts/networkproxy/index.js +8 -0
  22. package/dist_ts/nfttablesproxy/classes.nftablesproxy.d.ts +219 -0
  23. package/dist_ts/nfttablesproxy/classes.nftablesproxy.js +1542 -0
  24. package/dist_ts/port80handler/classes.port80handler.d.ts +260 -0
  25. package/dist_ts/port80handler/classes.port80handler.js +928 -0
  26. package/dist_ts/smartproxy/classes.pp.connectionhandler.d.ts +39 -0
  27. package/dist_ts/smartproxy/classes.pp.connectionhandler.js +754 -0
  28. package/dist_ts/smartproxy/classes.pp.connectionmanager.d.ts +78 -0
  29. package/dist_ts/smartproxy/classes.pp.connectionmanager.js +378 -0
  30. package/dist_ts/smartproxy/classes.pp.domainconfigmanager.d.ts +55 -0
  31. package/dist_ts/smartproxy/classes.pp.domainconfigmanager.js +103 -0
  32. package/dist_ts/smartproxy/classes.pp.interfaces.d.ts +133 -0
  33. package/dist_ts/smartproxy/classes.pp.interfaces.js +2 -0
  34. package/dist_ts/smartproxy/classes.pp.networkproxybridge.d.ts +57 -0
  35. package/dist_ts/smartproxy/classes.pp.networkproxybridge.js +306 -0
  36. package/dist_ts/smartproxy/classes.pp.portrangemanager.d.ts +56 -0
  37. package/dist_ts/smartproxy/classes.pp.portrangemanager.js +179 -0
  38. package/dist_ts/smartproxy/classes.pp.securitymanager.d.ts +47 -0
  39. package/dist_ts/smartproxy/classes.pp.securitymanager.js +126 -0
  40. package/dist_ts/smartproxy/classes.pp.snihandler.d.ts +153 -0
  41. package/dist_ts/smartproxy/classes.pp.snihandler.js +1053 -0
  42. package/dist_ts/smartproxy/classes.pp.timeoutmanager.d.ts +47 -0
  43. package/dist_ts/smartproxy/classes.pp.timeoutmanager.js +154 -0
  44. package/dist_ts/smartproxy/classes.pp.tlsalert.d.ts +149 -0
  45. package/dist_ts/smartproxy/classes.pp.tlsalert.js +225 -0
  46. package/dist_ts/smartproxy/classes.pp.tlsmanager.d.ts +57 -0
  47. package/dist_ts/smartproxy/classes.pp.tlsmanager.js +132 -0
  48. package/dist_ts/smartproxy/classes.smartproxy.d.ts +64 -0
  49. package/dist_ts/smartproxy/classes.smartproxy.js +567 -0
  50. package/package.json +1 -1
  51. package/ts/index.ts +6 -6
  52. package/ts/networkproxy/classes.np.certificatemanager.ts +398 -0
  53. package/ts/networkproxy/classes.np.connectionpool.ts +241 -0
  54. package/ts/networkproxy/classes.np.networkproxy.ts +469 -0
  55. package/ts/networkproxy/classes.np.requesthandler.ts +278 -0
  56. package/ts/networkproxy/classes.np.types.ts +123 -0
  57. package/ts/networkproxy/classes.np.websockethandler.ts +226 -0
  58. package/ts/networkproxy/index.ts +7 -0
  59. package/ts/{classes.port80handler.ts → port80handler/classes.port80handler.ts} +249 -1
  60. package/ts/{classes.pp.connectionhandler.ts → smartproxy/classes.pp.connectionhandler.ts} +1 -1
  61. package/ts/{classes.pp.connectionmanager.ts → smartproxy/classes.pp.connectionmanager.ts} +1 -1
  62. package/ts/{classes.pp.domainconfigmanager.ts → smartproxy/classes.pp.domainconfigmanager.ts} +1 -1
  63. package/ts/{classes.pp.interfaces.ts → smartproxy/classes.pp.interfaces.ts} +31 -5
  64. package/ts/{classes.pp.networkproxybridge.ts → smartproxy/classes.pp.networkproxybridge.ts} +129 -28
  65. package/ts/{classes.pp.securitymanager.ts → smartproxy/classes.pp.securitymanager.ts} +1 -1
  66. package/ts/{classes.pp.tlsmanager.ts → smartproxy/classes.pp.tlsmanager.ts} +1 -1
  67. package/ts/smartproxy/classes.smartproxy.ts +679 -0
  68. package/ts/classes.networkproxy.ts +0 -1730
  69. package/ts/classes.pp.acmemanager.ts +0 -149
  70. package/ts/classes.pp.portproxy.ts +0 -344
  71. /package/ts/{classes.nftablesproxy.ts → nfttablesproxy/classes.nftablesproxy.ts} +0 -0
  72. /package/ts/{classes.pp.portrangemanager.ts → smartproxy/classes.pp.portrangemanager.ts} +0 -0
  73. /package/ts/{classes.pp.snihandler.ts → smartproxy/classes.pp.snihandler.ts} +0 -0
  74. /package/ts/{classes.pp.timeoutmanager.ts → smartproxy/classes.pp.timeoutmanager.ts} +0 -0
  75. /package/ts/{classes.pp.tlsalert.ts → smartproxy/classes.pp.tlsalert.ts} +0 -0
@@ -0,0 +1,133 @@
1
+ import * as plugins from '../plugins.js';
2
+ /** Domain configuration with per-domain allowed port ranges */
3
+ export interface IDomainConfig {
4
+ domains: string[];
5
+ allowedIPs: string[];
6
+ blockedIPs?: string[];
7
+ targetIPs?: string[];
8
+ portRanges?: Array<{
9
+ from: number;
10
+ to: number;
11
+ }>;
12
+ connectionTimeout?: number;
13
+ useNetworkProxy?: boolean;
14
+ networkProxyPort?: number;
15
+ }
16
+ /** Port proxy settings including global allowed port ranges */
17
+ export interface IPortProxySettings {
18
+ fromPort: number;
19
+ toPort: number;
20
+ targetIP?: string;
21
+ domainConfigs: IDomainConfig[];
22
+ sniEnabled?: boolean;
23
+ defaultAllowedIPs?: string[];
24
+ defaultBlockedIPs?: string[];
25
+ preserveSourceIP?: boolean;
26
+ pfx?: Buffer;
27
+ key?: string | Buffer | Array<Buffer | string>;
28
+ passphrase?: string;
29
+ cert?: string | Buffer | Array<string | Buffer>;
30
+ ca?: string | Buffer | Array<string | Buffer>;
31
+ ciphers?: string;
32
+ honorCipherOrder?: boolean;
33
+ rejectUnauthorized?: boolean;
34
+ secureProtocol?: string;
35
+ servername?: string;
36
+ minVersion?: string;
37
+ maxVersion?: string;
38
+ initialDataTimeout?: number;
39
+ socketTimeout?: number;
40
+ inactivityCheckInterval?: number;
41
+ maxConnectionLifetime?: number;
42
+ inactivityTimeout?: number;
43
+ gracefulShutdownTimeout?: number;
44
+ globalPortRanges: Array<{
45
+ from: number;
46
+ to: number;
47
+ }>;
48
+ forwardAllGlobalRanges?: boolean;
49
+ noDelay?: boolean;
50
+ keepAlive?: boolean;
51
+ keepAliveInitialDelay?: number;
52
+ maxPendingDataSize?: number;
53
+ disableInactivityCheck?: boolean;
54
+ enableKeepAliveProbes?: boolean;
55
+ enableDetailedLogging?: boolean;
56
+ enableTlsDebugLogging?: boolean;
57
+ enableRandomizedTimeouts?: boolean;
58
+ allowSessionTicket?: boolean;
59
+ maxConnectionsPerIP?: number;
60
+ connectionRateLimitPerMinute?: number;
61
+ keepAliveTreatment?: 'standard' | 'extended' | 'immortal';
62
+ keepAliveInactivityMultiplier?: number;
63
+ extendedKeepAliveLifetime?: number;
64
+ useNetworkProxy?: number[];
65
+ networkProxyPort?: number;
66
+ port80HandlerConfig?: {
67
+ enabled?: boolean;
68
+ port?: number;
69
+ contactEmail?: string;
70
+ useProduction?: boolean;
71
+ renewThresholdDays?: number;
72
+ autoRenew?: boolean;
73
+ certificateStore?: string;
74
+ skipConfiguredCerts?: boolean;
75
+ httpsRedirectPort?: number;
76
+ renewCheckIntervalHours?: number;
77
+ domainForwards?: Array<{
78
+ domain: string;
79
+ forwardConfig?: {
80
+ ip: string;
81
+ port: number;
82
+ };
83
+ acmeForwardConfig?: {
84
+ ip: string;
85
+ port: number;
86
+ };
87
+ }>;
88
+ };
89
+ acme?: {
90
+ enabled?: boolean;
91
+ port?: number;
92
+ contactEmail?: string;
93
+ useProduction?: boolean;
94
+ renewThresholdDays?: number;
95
+ autoRenew?: boolean;
96
+ certificateStore?: string;
97
+ skipConfiguredCerts?: boolean;
98
+ };
99
+ }
100
+ /**
101
+ * Enhanced connection record
102
+ */
103
+ export interface IConnectionRecord {
104
+ id: string;
105
+ incoming: plugins.net.Socket;
106
+ outgoing: plugins.net.Socket | null;
107
+ incomingStartTime: number;
108
+ outgoingStartTime?: number;
109
+ outgoingClosedTime?: number;
110
+ lockedDomain?: string;
111
+ connectionClosed: boolean;
112
+ cleanupTimer?: NodeJS.Timeout;
113
+ alertFallbackTimeout?: NodeJS.Timeout;
114
+ lastActivity: number;
115
+ pendingData: Buffer[];
116
+ pendingDataSize: number;
117
+ bytesReceived: number;
118
+ bytesSent: number;
119
+ remoteIP: string;
120
+ localPort: number;
121
+ isTLS: boolean;
122
+ tlsHandshakeComplete: boolean;
123
+ hasReceivedInitialData: boolean;
124
+ domainConfig?: IDomainConfig;
125
+ hasKeepAlive: boolean;
126
+ inactivityWarningIssued?: boolean;
127
+ incomingTerminationReason?: string | null;
128
+ outgoingTerminationReason?: string | null;
129
+ usingNetworkProxy?: boolean;
130
+ renegotiationHandler?: (chunk: Buffer) => void;
131
+ isBrowserConnection?: boolean;
132
+ domainSwitches?: number;
133
+ }
@@ -0,0 +1,2 @@
1
+ import * as plugins from '../plugins.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wcC5pbnRlcmZhY2VzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvc21hcnRwcm94eS9jbGFzc2VzLnBwLmludGVyZmFjZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUMifQ==
@@ -0,0 +1,57 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { NetworkProxy } from '../networkproxy/classes.np.networkproxy.js';
3
+ import { Port80Handler } from '../port80handler/classes.port80handler.js';
4
+ import type { IConnectionRecord, IPortProxySettings } from './classes.pp.interfaces.js';
5
+ /**
6
+ * Manages NetworkProxy integration for TLS termination
7
+ */
8
+ export declare class NetworkProxyBridge {
9
+ private settings;
10
+ private networkProxy;
11
+ private port80Handler;
12
+ constructor(settings: IPortProxySettings);
13
+ /**
14
+ * Set the Port80Handler to use for certificate management
15
+ */
16
+ setPort80Handler(handler: Port80Handler): void;
17
+ /**
18
+ * Initialize NetworkProxy instance
19
+ */
20
+ initialize(): Promise<void>;
21
+ /**
22
+ * Handle certificate issuance or renewal events
23
+ */
24
+ private handleCertificateEvent;
25
+ /**
26
+ * Get the NetworkProxy instance
27
+ */
28
+ getNetworkProxy(): NetworkProxy | null;
29
+ /**
30
+ * Get the NetworkProxy port
31
+ */
32
+ getNetworkProxyPort(): number;
33
+ /**
34
+ * Start NetworkProxy
35
+ */
36
+ start(): Promise<void>;
37
+ /**
38
+ * Stop NetworkProxy
39
+ */
40
+ stop(): Promise<void>;
41
+ /**
42
+ * Register domains with Port80Handler
43
+ */
44
+ registerDomainsWithPort80Handler(domains: string[]): void;
45
+ /**
46
+ * Forwards a TLS connection to a NetworkProxy for handling
47
+ */
48
+ forwardToNetworkProxy(connectionId: string, socket: plugins.net.Socket, record: IConnectionRecord, initialData: Buffer, customProxyPort?: number, onError?: (reason: string) => void): void;
49
+ /**
50
+ * Synchronizes domain configurations to NetworkProxy
51
+ */
52
+ syncDomainConfigsToNetworkProxy(): Promise<void>;
53
+ /**
54
+ * Request a certificate for a specific domain
55
+ */
56
+ requestCertificate(domain: string): Promise<boolean>;
57
+ }
@@ -0,0 +1,306 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { NetworkProxy } from '../networkproxy/classes.np.networkproxy.js';
3
+ import { Port80Handler, Port80HandlerEvents } from '../port80handler/classes.port80handler.js';
4
+ /**
5
+ * Manages NetworkProxy integration for TLS termination
6
+ */
7
+ export class NetworkProxyBridge {
8
+ constructor(settings) {
9
+ this.settings = settings;
10
+ this.networkProxy = null;
11
+ this.port80Handler = null;
12
+ }
13
+ /**
14
+ * Set the Port80Handler to use for certificate management
15
+ */
16
+ setPort80Handler(handler) {
17
+ this.port80Handler = handler;
18
+ // Register for certificate events
19
+ handler.on(Port80HandlerEvents.CERTIFICATE_ISSUED, this.handleCertificateEvent.bind(this));
20
+ handler.on(Port80HandlerEvents.CERTIFICATE_RENEWED, this.handleCertificateEvent.bind(this));
21
+ // If NetworkProxy is already initialized, connect it with Port80Handler
22
+ if (this.networkProxy) {
23
+ this.networkProxy.setExternalPort80Handler(handler);
24
+ }
25
+ console.log('Port80Handler connected to NetworkProxyBridge');
26
+ }
27
+ /**
28
+ * Initialize NetworkProxy instance
29
+ */
30
+ async initialize() {
31
+ if (!this.networkProxy && this.settings.useNetworkProxy && this.settings.useNetworkProxy.length > 0) {
32
+ // Configure NetworkProxy options based on PortProxy settings
33
+ const networkProxyOptions = {
34
+ port: this.settings.networkProxyPort,
35
+ portProxyIntegration: true,
36
+ logLevel: this.settings.enableDetailedLogging ? 'debug' : 'info',
37
+ useExternalPort80Handler: !!this.port80Handler // Use Port80Handler if available
38
+ };
39
+ // Copy ACME settings for backward compatibility (if port80HandlerConfig not set)
40
+ if (!this.settings.port80HandlerConfig && this.settings.acme) {
41
+ networkProxyOptions.acme = { ...this.settings.acme };
42
+ }
43
+ this.networkProxy = new NetworkProxy(networkProxyOptions);
44
+ console.log(`Initialized NetworkProxy on port ${this.settings.networkProxyPort}`);
45
+ // Connect Port80Handler if available
46
+ if (this.port80Handler) {
47
+ this.networkProxy.setExternalPort80Handler(this.port80Handler);
48
+ }
49
+ // Convert and apply domain configurations to NetworkProxy
50
+ await this.syncDomainConfigsToNetworkProxy();
51
+ }
52
+ }
53
+ /**
54
+ * Handle certificate issuance or renewal events
55
+ */
56
+ handleCertificateEvent(data) {
57
+ if (!this.networkProxy)
58
+ return;
59
+ console.log(`Received certificate for ${data.domain} from Port80Handler, updating NetworkProxy`);
60
+ try {
61
+ // Find existing config for this domain
62
+ const existingConfigs = this.networkProxy.getProxyConfigs()
63
+ .filter(config => config.hostName === data.domain);
64
+ if (existingConfigs.length > 0) {
65
+ // Update existing configs with new certificate
66
+ for (const config of existingConfigs) {
67
+ config.privateKey = data.privateKey;
68
+ config.publicKey = data.certificate;
69
+ }
70
+ // Apply updated configs
71
+ this.networkProxy.updateProxyConfigs(existingConfigs)
72
+ .then(() => console.log(`Updated certificate for ${data.domain} in NetworkProxy`))
73
+ .catch(err => console.log(`Error updating certificate in NetworkProxy: ${err}`));
74
+ }
75
+ else {
76
+ // Create a new config for this domain
77
+ console.log(`No existing config found for ${data.domain}, creating new config in NetworkProxy`);
78
+ }
79
+ }
80
+ catch (err) {
81
+ console.log(`Error handling certificate event: ${err}`);
82
+ }
83
+ }
84
+ /**
85
+ * Get the NetworkProxy instance
86
+ */
87
+ getNetworkProxy() {
88
+ return this.networkProxy;
89
+ }
90
+ /**
91
+ * Get the NetworkProxy port
92
+ */
93
+ getNetworkProxyPort() {
94
+ return this.networkProxy ? this.networkProxy.getListeningPort() : this.settings.networkProxyPort || 8443;
95
+ }
96
+ /**
97
+ * Start NetworkProxy
98
+ */
99
+ async start() {
100
+ if (this.networkProxy) {
101
+ await this.networkProxy.start();
102
+ console.log(`NetworkProxy started on port ${this.settings.networkProxyPort}`);
103
+ }
104
+ }
105
+ /**
106
+ * Stop NetworkProxy
107
+ */
108
+ async stop() {
109
+ if (this.networkProxy) {
110
+ try {
111
+ console.log('Stopping NetworkProxy...');
112
+ await this.networkProxy.stop();
113
+ console.log('NetworkProxy stopped successfully');
114
+ }
115
+ catch (err) {
116
+ console.log(`Error stopping NetworkProxy: ${err}`);
117
+ }
118
+ }
119
+ }
120
+ /**
121
+ * Register domains with Port80Handler
122
+ */
123
+ registerDomainsWithPort80Handler(domains) {
124
+ if (!this.port80Handler) {
125
+ console.log('Cannot register domains - Port80Handler not initialized');
126
+ return;
127
+ }
128
+ for (const domain of domains) {
129
+ // Skip wildcards
130
+ if (domain.includes('*')) {
131
+ console.log(`Skipping wildcard domain for ACME: ${domain}`);
132
+ continue;
133
+ }
134
+ // Register the domain
135
+ try {
136
+ this.port80Handler.addDomain({
137
+ domainName: domain,
138
+ sslRedirect: true,
139
+ acmeMaintenance: true
140
+ });
141
+ console.log(`Registered domain with Port80Handler: ${domain}`);
142
+ }
143
+ catch (err) {
144
+ console.log(`Error registering domain ${domain} with Port80Handler: ${err}`);
145
+ }
146
+ }
147
+ }
148
+ /**
149
+ * Forwards a TLS connection to a NetworkProxy for handling
150
+ */
151
+ forwardToNetworkProxy(connectionId, socket, record, initialData, customProxyPort, onError) {
152
+ // Ensure NetworkProxy is initialized
153
+ if (!this.networkProxy) {
154
+ console.log(`[${connectionId}] NetworkProxy not initialized. Cannot forward connection.`);
155
+ if (onError) {
156
+ onError('network_proxy_not_initialized');
157
+ }
158
+ return;
159
+ }
160
+ // Use the custom port if provided, otherwise use the default NetworkProxy port
161
+ const proxyPort = customProxyPort || this.networkProxy.getListeningPort();
162
+ const proxyHost = 'localhost'; // Assuming NetworkProxy runs locally
163
+ if (this.settings.enableDetailedLogging) {
164
+ console.log(`[${connectionId}] Forwarding TLS connection to NetworkProxy at ${proxyHost}:${proxyPort}`);
165
+ }
166
+ // Create a connection to the NetworkProxy
167
+ const proxySocket = plugins.net.connect({
168
+ host: proxyHost,
169
+ port: proxyPort,
170
+ });
171
+ // Store the outgoing socket in the record
172
+ record.outgoing = proxySocket;
173
+ record.outgoingStartTime = Date.now();
174
+ record.usingNetworkProxy = true;
175
+ // Set up error handlers
176
+ proxySocket.on('error', (err) => {
177
+ console.log(`[${connectionId}] Error connecting to NetworkProxy: ${err.message}`);
178
+ if (onError) {
179
+ onError('network_proxy_connect_error');
180
+ }
181
+ });
182
+ // Handle connection to NetworkProxy
183
+ proxySocket.on('connect', () => {
184
+ if (this.settings.enableDetailedLogging) {
185
+ console.log(`[${connectionId}] Connected to NetworkProxy at ${proxyHost}:${proxyPort}`);
186
+ }
187
+ // First send the initial data that contains the TLS ClientHello
188
+ proxySocket.write(initialData);
189
+ // Now set up bidirectional piping between client and NetworkProxy
190
+ socket.pipe(proxySocket);
191
+ proxySocket.pipe(socket);
192
+ // Update activity on data transfer (caller should handle this)
193
+ if (this.settings.enableDetailedLogging) {
194
+ console.log(`[${connectionId}] TLS connection successfully forwarded to NetworkProxy`);
195
+ }
196
+ });
197
+ }
198
+ /**
199
+ * Synchronizes domain configurations to NetworkProxy
200
+ */
201
+ async syncDomainConfigsToNetworkProxy() {
202
+ if (!this.networkProxy) {
203
+ console.log('Cannot sync configurations - NetworkProxy not initialized');
204
+ return;
205
+ }
206
+ try {
207
+ // Get SSL certificates from assets
208
+ // Import fs directly since it's not in plugins
209
+ const fs = await import('fs');
210
+ let certPair;
211
+ try {
212
+ certPair = {
213
+ key: fs.readFileSync('assets/certs/key.pem', 'utf8'),
214
+ cert: fs.readFileSync('assets/certs/cert.pem', 'utf8'),
215
+ };
216
+ }
217
+ catch (certError) {
218
+ console.log(`Warning: Could not read default certificates: ${certError}`);
219
+ console.log('Using empty certificate placeholders - ACME will generate proper certificates if enabled');
220
+ // Use empty placeholders - NetworkProxy will use its internal defaults
221
+ // or ACME will generate proper ones if enabled
222
+ certPair = {
223
+ key: '',
224
+ cert: '',
225
+ };
226
+ }
227
+ // Convert domain configs to NetworkProxy configs
228
+ const proxyConfigs = this.networkProxy.convertPortProxyConfigs(this.settings.domainConfigs, certPair);
229
+ // Log ACME-eligible domains
230
+ const acmeEnabled = this.settings.port80HandlerConfig?.enabled || this.settings.acme?.enabled;
231
+ if (acmeEnabled) {
232
+ const acmeEligibleDomains = proxyConfigs
233
+ .filter((config) => !config.hostName.includes('*')) // Exclude wildcards
234
+ .map((config) => config.hostName);
235
+ if (acmeEligibleDomains.length > 0) {
236
+ console.log(`Domains eligible for ACME certificates: ${acmeEligibleDomains.join(', ')}`);
237
+ // Register these domains with Port80Handler if available
238
+ if (this.port80Handler) {
239
+ this.registerDomainsWithPort80Handler(acmeEligibleDomains);
240
+ }
241
+ }
242
+ else {
243
+ console.log('No domains eligible for ACME certificates found in configuration');
244
+ }
245
+ }
246
+ // Update NetworkProxy with the converted configs
247
+ await this.networkProxy.updateProxyConfigs(proxyConfigs);
248
+ console.log(`Successfully synchronized ${proxyConfigs.length} domain configurations to NetworkProxy`);
249
+ }
250
+ catch (err) {
251
+ console.log(`Failed to sync configurations: ${err}`);
252
+ }
253
+ }
254
+ /**
255
+ * Request a certificate for a specific domain
256
+ */
257
+ async requestCertificate(domain) {
258
+ // Delegate to Port80Handler if available
259
+ if (this.port80Handler) {
260
+ try {
261
+ // Check if the domain is already registered
262
+ const cert = this.port80Handler.getCertificate(domain);
263
+ if (cert) {
264
+ console.log(`Certificate already exists for ${domain}`);
265
+ return true;
266
+ }
267
+ // Register the domain for certificate issuance
268
+ this.port80Handler.addDomain({
269
+ domainName: domain,
270
+ sslRedirect: true,
271
+ acmeMaintenance: true
272
+ });
273
+ console.log(`Domain ${domain} registered for certificate issuance`);
274
+ return true;
275
+ }
276
+ catch (err) {
277
+ console.log(`Error requesting certificate: ${err}`);
278
+ return false;
279
+ }
280
+ }
281
+ // Fall back to NetworkProxy if Port80Handler is not available
282
+ if (!this.networkProxy) {
283
+ console.log('Cannot request certificate - NetworkProxy not initialized');
284
+ return false;
285
+ }
286
+ if (!this.settings.port80HandlerConfig?.enabled && !this.settings.acme?.enabled) {
287
+ console.log('Cannot request certificate - ACME is not enabled');
288
+ return false;
289
+ }
290
+ try {
291
+ const result = await this.networkProxy.requestCertificate(domain);
292
+ if (result) {
293
+ console.log(`Certificate request for ${domain} submitted successfully`);
294
+ }
295
+ else {
296
+ console.log(`Certificate request for ${domain} failed`);
297
+ }
298
+ return result;
299
+ }
300
+ catch (err) {
301
+ console.log(`Error requesting certificate: ${err}`);
302
+ return false;
303
+ }
304
+ }
305
+ }
306
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wcC5uZXR3b3JrcHJveHlicmlkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9zbWFydHByb3h5L2NsYXNzZXMucHAubmV0d29ya3Byb3h5YnJpZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUMxRSxPQUFPLEVBQUUsYUFBYSxFQUFFLG1CQUFtQixFQUF5QixNQUFNLDJDQUEyQyxDQUFDO0FBR3RIOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGtCQUFrQjtJQUk3QixZQUFvQixRQUE0QjtRQUE1QixhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUh4QyxpQkFBWSxHQUF3QixJQUFJLENBQUM7UUFDekMsa0JBQWEsR0FBeUIsSUFBSSxDQUFDO0lBRUEsQ0FBQztJQUVwRDs7T0FFRztJQUNJLGdCQUFnQixDQUFDLE9BQXNCO1FBQzVDLElBQUksQ0FBQyxhQUFhLEdBQUcsT0FBTyxDQUFDO1FBRTdCLGtDQUFrQztRQUNsQyxPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLGtCQUFrQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUMzRixPQUFPLENBQUMsRUFBRSxDQUFDLG1CQUFtQixDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztRQUU1Rix3RUFBd0U7UUFDeEUsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFlBQVksQ0FBQyx3QkFBd0IsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0RCxDQUFDO1FBRUQsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0lBQy9ELENBQUM7SUFFRDs7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
@@ -0,0 +1,56 @@
1
+ import type { IPortProxySettings } from './classes.pp.interfaces.js';
2
+ /**
3
+ * Manages port ranges and port-based configuration
4
+ */
5
+ export declare class PortRangeManager {
6
+ private settings;
7
+ constructor(settings: IPortProxySettings);
8
+ /**
9
+ * Get all ports that should be listened on
10
+ */
11
+ getListeningPorts(): Set<number>;
12
+ /**
13
+ * Check if a port should use NetworkProxy for forwarding
14
+ */
15
+ shouldUseNetworkProxy(port: number): boolean;
16
+ /**
17
+ * Check if port should use global forwarding
18
+ */
19
+ shouldUseGlobalForwarding(port: number): boolean;
20
+ /**
21
+ * Check if a port is in global ranges
22
+ */
23
+ isPortInGlobalRanges(port: number): boolean;
24
+ /**
25
+ * Check if a port falls within the specified ranges
26
+ */
27
+ isPortInRanges(port: number, ranges: Array<{
28
+ from: number;
29
+ to: number;
30
+ }>): boolean;
31
+ /**
32
+ * Get forwarding port for a specific listening port
33
+ * This determines what port to connect to on the target
34
+ */
35
+ getForwardingPort(listeningPort: number): number;
36
+ /**
37
+ * Find domain-specific port ranges that include a given port
38
+ */
39
+ findDomainPortRange(port: number): {
40
+ domainIndex: number;
41
+ range: {
42
+ from: number;
43
+ to: number;
44
+ };
45
+ } | undefined;
46
+ /**
47
+ * Get a list of all configured ports
48
+ * This includes the fromPort, NetworkProxy ports, and ports from all ranges
49
+ */
50
+ getAllConfiguredPorts(): number[];
51
+ /**
52
+ * Validate port configuration
53
+ * Returns array of warning messages
54
+ */
55
+ validateConfiguration(): string[];
56
+ }