@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,47 @@
1
+ import type { IConnectionRecord, IPortProxySettings } from './classes.pp.interfaces.js';
2
+ /**
3
+ * Manages timeouts and inactivity tracking for connections
4
+ */
5
+ export declare class TimeoutManager {
6
+ private settings;
7
+ constructor(settings: IPortProxySettings);
8
+ /**
9
+ * Ensure timeout values don't exceed Node.js max safe integer
10
+ */
11
+ ensureSafeTimeout(timeout: number): number;
12
+ /**
13
+ * Generate a slightly randomized timeout to prevent thundering herd
14
+ */
15
+ randomizeTimeout(baseTimeout: number, variationPercent?: number): number;
16
+ /**
17
+ * Update connection activity timestamp
18
+ */
19
+ updateActivity(record: IConnectionRecord): void;
20
+ /**
21
+ * Calculate effective inactivity timeout based on connection type
22
+ */
23
+ getEffectiveInactivityTimeout(record: IConnectionRecord): number;
24
+ /**
25
+ * Calculate effective max lifetime based on connection type
26
+ */
27
+ getEffectiveMaxLifetime(record: IConnectionRecord): number;
28
+ /**
29
+ * Setup connection timeout
30
+ * @returns The cleanup timer
31
+ */
32
+ setupConnectionTimeout(record: IConnectionRecord, onTimeout: (record: IConnectionRecord, reason: string) => void): NodeJS.Timeout;
33
+ /**
34
+ * Check for inactivity on a connection
35
+ * @returns Object with check results
36
+ */
37
+ checkInactivity(record: IConnectionRecord): {
38
+ isInactive: boolean;
39
+ shouldWarn: boolean;
40
+ inactivityTime: number;
41
+ effectiveTimeout: number;
42
+ };
43
+ /**
44
+ * Apply socket timeout settings
45
+ */
46
+ applySocketTimeouts(record: IConnectionRecord): void;
47
+ }
@@ -0,0 +1,154 @@
1
+ /**
2
+ * Manages timeouts and inactivity tracking for connections
3
+ */
4
+ export class TimeoutManager {
5
+ constructor(settings) {
6
+ this.settings = settings;
7
+ }
8
+ /**
9
+ * Ensure timeout values don't exceed Node.js max safe integer
10
+ */
11
+ ensureSafeTimeout(timeout) {
12
+ const MAX_SAFE_TIMEOUT = 2147483647; // Maximum safe value (2^31 - 1)
13
+ return Math.min(Math.floor(timeout), MAX_SAFE_TIMEOUT);
14
+ }
15
+ /**
16
+ * Generate a slightly randomized timeout to prevent thundering herd
17
+ */
18
+ randomizeTimeout(baseTimeout, variationPercent = 5) {
19
+ const safeBaseTimeout = this.ensureSafeTimeout(baseTimeout);
20
+ const variation = safeBaseTimeout * (variationPercent / 100);
21
+ return this.ensureSafeTimeout(safeBaseTimeout + Math.floor(Math.random() * variation * 2) - variation);
22
+ }
23
+ /**
24
+ * Update connection activity timestamp
25
+ */
26
+ updateActivity(record) {
27
+ record.lastActivity = Date.now();
28
+ // Clear any inactivity warning
29
+ if (record.inactivityWarningIssued) {
30
+ record.inactivityWarningIssued = false;
31
+ }
32
+ }
33
+ /**
34
+ * Calculate effective inactivity timeout based on connection type
35
+ */
36
+ getEffectiveInactivityTimeout(record) {
37
+ let effectiveTimeout = this.settings.inactivityTimeout || 14400000; // 4 hours default
38
+ // For immortal keep-alive connections, use an extremely long timeout
39
+ if (record.hasKeepAlive && this.settings.keepAliveTreatment === 'immortal') {
40
+ return Number.MAX_SAFE_INTEGER;
41
+ }
42
+ // For extended keep-alive connections, apply multiplier
43
+ if (record.hasKeepAlive && this.settings.keepAliveTreatment === 'extended') {
44
+ const multiplier = this.settings.keepAliveInactivityMultiplier || 6;
45
+ effectiveTimeout = effectiveTimeout * multiplier;
46
+ }
47
+ return this.ensureSafeTimeout(effectiveTimeout);
48
+ }
49
+ /**
50
+ * Calculate effective max lifetime based on connection type
51
+ */
52
+ getEffectiveMaxLifetime(record) {
53
+ // Use domain-specific timeout if available
54
+ const baseTimeout = record.domainConfig?.connectionTimeout ||
55
+ this.settings.maxConnectionLifetime ||
56
+ 86400000; // 24 hours default
57
+ // For immortal keep-alive connections, use an extremely long lifetime
58
+ if (record.hasKeepAlive && this.settings.keepAliveTreatment === 'immortal') {
59
+ return Number.MAX_SAFE_INTEGER;
60
+ }
61
+ // For extended keep-alive connections, use the extended lifetime setting
62
+ if (record.hasKeepAlive && this.settings.keepAliveTreatment === 'extended') {
63
+ return this.ensureSafeTimeout(this.settings.extendedKeepAliveLifetime || 7 * 24 * 60 * 60 * 1000 // 7 days default
64
+ );
65
+ }
66
+ // Apply randomization if enabled
67
+ if (this.settings.enableRandomizedTimeouts) {
68
+ return this.randomizeTimeout(baseTimeout);
69
+ }
70
+ return this.ensureSafeTimeout(baseTimeout);
71
+ }
72
+ /**
73
+ * Setup connection timeout
74
+ * @returns The cleanup timer
75
+ */
76
+ setupConnectionTimeout(record, onTimeout) {
77
+ // Clear any existing timer
78
+ if (record.cleanupTimer) {
79
+ clearTimeout(record.cleanupTimer);
80
+ }
81
+ // Calculate effective timeout
82
+ const effectiveLifetime = this.getEffectiveMaxLifetime(record);
83
+ // Set up the timeout
84
+ const timer = setTimeout(() => {
85
+ // Call the provided callback
86
+ onTimeout(record, 'connection_timeout');
87
+ }, effectiveLifetime);
88
+ // Make sure timeout doesn't keep the process alive
89
+ if (timer.unref) {
90
+ timer.unref();
91
+ }
92
+ return timer;
93
+ }
94
+ /**
95
+ * Check for inactivity on a connection
96
+ * @returns Object with check results
97
+ */
98
+ checkInactivity(record) {
99
+ // Skip for connections with inactivity check disabled
100
+ if (this.settings.disableInactivityCheck) {
101
+ return {
102
+ isInactive: false,
103
+ shouldWarn: false,
104
+ inactivityTime: 0,
105
+ effectiveTimeout: 0
106
+ };
107
+ }
108
+ // Skip for immortal keep-alive connections
109
+ if (record.hasKeepAlive && this.settings.keepAliveTreatment === 'immortal') {
110
+ return {
111
+ isInactive: false,
112
+ shouldWarn: false,
113
+ inactivityTime: 0,
114
+ effectiveTimeout: 0
115
+ };
116
+ }
117
+ const now = Date.now();
118
+ const inactivityTime = now - record.lastActivity;
119
+ const effectiveTimeout = this.getEffectiveInactivityTimeout(record);
120
+ // Check if inactive
121
+ const isInactive = inactivityTime > effectiveTimeout;
122
+ // For keep-alive connections, we should warn first
123
+ const shouldWarn = record.hasKeepAlive &&
124
+ isInactive &&
125
+ !record.inactivityWarningIssued;
126
+ return {
127
+ isInactive,
128
+ shouldWarn,
129
+ inactivityTime,
130
+ effectiveTimeout
131
+ };
132
+ }
133
+ /**
134
+ * Apply socket timeout settings
135
+ */
136
+ applySocketTimeouts(record) {
137
+ // Skip for immortal keep-alive connections
138
+ if (record.hasKeepAlive && this.settings.keepAliveTreatment === 'immortal') {
139
+ // Disable timeouts completely for immortal connections
140
+ record.incoming.setTimeout(0);
141
+ if (record.outgoing) {
142
+ record.outgoing.setTimeout(0);
143
+ }
144
+ return;
145
+ }
146
+ // Apply normal timeouts
147
+ const timeout = this.ensureSafeTimeout(this.settings.socketTimeout || 3600000); // 1 hour default
148
+ record.incoming.setTimeout(timeout);
149
+ if (record.outgoing) {
150
+ record.outgoing.setTimeout(timeout);
151
+ }
152
+ }
153
+ }
154
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wcC50aW1lb3V0bWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3NtYXJ0cHJveHkvY2xhc3Nlcy5wcC50aW1lb3V0bWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQTs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ3pCLFlBQW9CLFFBQTRCO1FBQTVCLGFBQVEsR0FBUixRQUFRLENBQW9CO0lBQUcsQ0FBQztJQUVwRDs7T0FFRztJQUNJLGlCQUFpQixDQUFDLE9BQWU7UUFDdEMsTUFBTSxnQkFBZ0IsR0FBRyxVQUFVLENBQUMsQ0FBQyxnQ0FBZ0M7UUFDckUsT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUN6RCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxnQkFBZ0IsQ0FBQyxXQUFtQixFQUFFLG1CQUEyQixDQUFDO1FBQ3ZFLE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUM1RCxNQUFNLFNBQVMsR0FBRyxlQUFlLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxHQUFHLENBQUMsQ0FBQztRQUM3RCxPQUFPLElBQUksQ0FBQyxpQkFBaUIsQ0FDM0IsZUFBZSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxHQUFHLFNBQVMsR0FBRyxDQUFDLENBQUMsR0FBRyxTQUFTLENBQ3hFLENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSSxjQUFjLENBQUMsTUFBeUI7UUFDN0MsTUFBTSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFakMsK0JBQStCO1FBQy9CLElBQUksTUFBTSxDQUFDLHVCQUF1QixFQUFFLENBQUM7WUFDbkMsTUFBTSxDQUFDLHVCQUF1QixHQUFHLEtBQUssQ0FBQztRQUN6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
@@ -0,0 +1,149 @@
1
+ import * as net from 'net';
2
+ /**
3
+ * TlsAlert class for managing TLS alert messages
4
+ */
5
+ export declare class TlsAlert {
6
+ static readonly LEVEL_WARNING = 1;
7
+ static readonly LEVEL_FATAL = 2;
8
+ static readonly CLOSE_NOTIFY = 0;
9
+ static readonly UNEXPECTED_MESSAGE = 10;
10
+ static readonly BAD_RECORD_MAC = 20;
11
+ static readonly DECRYPTION_FAILED = 21;
12
+ static readonly RECORD_OVERFLOW = 22;
13
+ static readonly DECOMPRESSION_FAILURE = 30;
14
+ static readonly HANDSHAKE_FAILURE = 40;
15
+ static readonly NO_CERTIFICATE = 41;
16
+ static readonly BAD_CERTIFICATE = 42;
17
+ static readonly UNSUPPORTED_CERTIFICATE = 43;
18
+ static readonly CERTIFICATE_REVOKED = 44;
19
+ static readonly CERTIFICATE_EXPIRED = 47;
20
+ static readonly CERTIFICATE_UNKNOWN = 48;
21
+ static readonly ILLEGAL_PARAMETER = 47;
22
+ static readonly UNKNOWN_CA = 48;
23
+ static readonly ACCESS_DENIED = 49;
24
+ static readonly DECODE_ERROR = 50;
25
+ static readonly DECRYPT_ERROR = 51;
26
+ static readonly EXPORT_RESTRICTION = 60;
27
+ static readonly PROTOCOL_VERSION = 70;
28
+ static readonly INSUFFICIENT_SECURITY = 71;
29
+ static readonly INTERNAL_ERROR = 80;
30
+ static readonly INAPPROPRIATE_FALLBACK = 86;
31
+ static readonly USER_CANCELED = 90;
32
+ static readonly NO_RENEGOTIATION = 100;
33
+ static readonly MISSING_EXTENSION = 109;
34
+ static readonly UNSUPPORTED_EXTENSION = 110;
35
+ static readonly CERTIFICATE_REQUIRED = 111;
36
+ static readonly UNRECOGNIZED_NAME = 112;
37
+ static readonly BAD_CERTIFICATE_STATUS_RESPONSE = 113;
38
+ static readonly BAD_CERTIFICATE_HASH_VALUE = 114;
39
+ static readonly UNKNOWN_PSK_IDENTITY = 115;
40
+ static readonly CERTIFICATE_REQUIRED_1_3 = 116;
41
+ static readonly NO_APPLICATION_PROTOCOL = 120;
42
+ /**
43
+ * Create a TLS alert buffer with the specified level and description code
44
+ *
45
+ * @param level Alert level (warning or fatal)
46
+ * @param description Alert description code
47
+ * @param tlsVersion TLS version bytes (default is TLS 1.2: 0x0303)
48
+ * @returns Buffer containing the TLS alert message
49
+ */
50
+ static create(level: number, description: number, tlsVersion?: [number, number]): Buffer;
51
+ /**
52
+ * Create a warning-level TLS alert
53
+ *
54
+ * @param description Alert description code
55
+ * @returns Buffer containing the warning-level TLS alert message
56
+ */
57
+ static createWarning(description: number): Buffer;
58
+ /**
59
+ * Create a fatal-level TLS alert
60
+ *
61
+ * @param description Alert description code
62
+ * @returns Buffer containing the fatal-level TLS alert message
63
+ */
64
+ static createFatal(description: number): Buffer;
65
+ /**
66
+ * Send a TLS alert to a socket and optionally close the connection
67
+ *
68
+ * @param socket The socket to send the alert to
69
+ * @param level Alert level (warning or fatal)
70
+ * @param description Alert description code
71
+ * @param closeAfterSend Whether to close the connection after sending the alert
72
+ * @param closeDelay Milliseconds to wait before closing the connection (default: 200ms)
73
+ * @returns Promise that resolves when the alert has been sent
74
+ */
75
+ static send(socket: net.Socket, level: number, description: number, closeAfterSend?: boolean, closeDelay?: number): Promise<void>;
76
+ /**
77
+ * Pre-defined TLS alert messages
78
+ */
79
+ static readonly alerts: {
80
+ closeNotify: Buffer<ArrayBufferLike>;
81
+ unsupportedExtension: Buffer<ArrayBufferLike>;
82
+ certificateRequired: Buffer<ArrayBufferLike>;
83
+ unrecognizedName: Buffer<ArrayBufferLike>;
84
+ noRenegotiation: Buffer<ArrayBufferLike>;
85
+ userCanceled: Buffer<ArrayBufferLike>;
86
+ certificateExpiredWarning: Buffer<ArrayBufferLike>;
87
+ handshakeFailureWarning: Buffer<ArrayBufferLike>;
88
+ insufficientSecurityWarning: Buffer<ArrayBufferLike>;
89
+ unexpectedMessage: Buffer<ArrayBufferLike>;
90
+ badRecordMac: Buffer<ArrayBufferLike>;
91
+ recordOverflow: Buffer<ArrayBufferLike>;
92
+ handshakeFailure: Buffer<ArrayBufferLike>;
93
+ badCertificate: Buffer<ArrayBufferLike>;
94
+ certificateExpired: Buffer<ArrayBufferLike>;
95
+ certificateUnknown: Buffer<ArrayBufferLike>;
96
+ illegalParameter: Buffer<ArrayBufferLike>;
97
+ unknownCA: Buffer<ArrayBufferLike>;
98
+ accessDenied: Buffer<ArrayBufferLike>;
99
+ decodeError: Buffer<ArrayBufferLike>;
100
+ decryptError: Buffer<ArrayBufferLike>;
101
+ protocolVersion: Buffer<ArrayBufferLike>;
102
+ insufficientSecurity: Buffer<ArrayBufferLike>;
103
+ internalError: Buffer<ArrayBufferLike>;
104
+ unrecognizedNameFatal: Buffer<ArrayBufferLike>;
105
+ };
106
+ /**
107
+ * Utility method to send a warning-level unrecognized_name alert
108
+ * Specifically designed for SNI issues to encourage the client to retry with SNI
109
+ *
110
+ * @param socket The socket to send the alert to
111
+ * @returns Promise that resolves when the alert has been sent
112
+ */
113
+ static sendSniRequired(socket: net.Socket): Promise<void>;
114
+ /**
115
+ * Utility method to send a close_notify alert and close the connection
116
+ *
117
+ * @param socket The socket to send the alert to
118
+ * @param closeDelay Milliseconds to wait before closing the connection (default: 200ms)
119
+ * @returns Promise that resolves when the alert has been sent and the connection closed
120
+ */
121
+ static sendCloseNotify(socket: net.Socket, closeDelay?: number): Promise<void>;
122
+ /**
123
+ * Utility method to send a certificate_expired alert to force new TLS session
124
+ *
125
+ * @param socket The socket to send the alert to
126
+ * @param fatal Whether to send as a fatal alert (default: false)
127
+ * @param closeAfterSend Whether to close the connection after sending the alert (default: true)
128
+ * @param closeDelay Milliseconds to wait before closing the connection (default: 200ms)
129
+ * @returns Promise that resolves when the alert has been sent
130
+ */
131
+ static sendCertificateExpired(socket: net.Socket, fatal?: boolean, closeAfterSend?: boolean, closeDelay?: number): Promise<void>;
132
+ /**
133
+ * Send a sequence of alerts to force SNI from clients
134
+ * This combines multiple alerts to ensure maximum browser compatibility
135
+ *
136
+ * @param socket The socket to send the alerts to
137
+ * @returns Promise that resolves when all alerts have been sent
138
+ */
139
+ static sendForceSniSequence(socket: net.Socket): Promise<void>;
140
+ /**
141
+ * Send a fatal level alert that immediately terminates the connection
142
+ *
143
+ * @param socket The socket to send the alert to
144
+ * @param description Alert description code
145
+ * @param closeDelay Milliseconds to wait before closing the connection (default: 100ms)
146
+ * @returns Promise that resolves when the alert has been sent and the connection closed
147
+ */
148
+ static sendFatalAndClose(socket: net.Socket, description: number, closeDelay?: number): Promise<void>;
149
+ }
@@ -0,0 +1,225 @@
1
+ import * as net from 'net';
2
+ /**
3
+ * TlsAlert class for managing TLS alert messages
4
+ */
5
+ export class TlsAlert {
6
+ // TLS Alert Levels
7
+ static { this.LEVEL_WARNING = 0x01; }
8
+ static { this.LEVEL_FATAL = 0x02; }
9
+ // TLS Alert Description Codes - RFC 8446 (TLS 1.3) / RFC 5246 (TLS 1.2)
10
+ static { this.CLOSE_NOTIFY = 0x00; }
11
+ static { this.UNEXPECTED_MESSAGE = 0x0A; }
12
+ static { this.BAD_RECORD_MAC = 0x14; }
13
+ static { this.DECRYPTION_FAILED = 0x15; } // TLS 1.0 only
14
+ static { this.RECORD_OVERFLOW = 0x16; }
15
+ static { this.DECOMPRESSION_FAILURE = 0x1E; } // TLS 1.2 and below
16
+ static { this.HANDSHAKE_FAILURE = 0x28; }
17
+ static { this.NO_CERTIFICATE = 0x29; } // SSLv3 only
18
+ static { this.BAD_CERTIFICATE = 0x2A; }
19
+ static { this.UNSUPPORTED_CERTIFICATE = 0x2B; }
20
+ static { this.CERTIFICATE_REVOKED = 0x2C; }
21
+ static { this.CERTIFICATE_EXPIRED = 0x2F; }
22
+ static { this.CERTIFICATE_UNKNOWN = 0x30; }
23
+ static { this.ILLEGAL_PARAMETER = 0x2F; }
24
+ static { this.UNKNOWN_CA = 0x30; }
25
+ static { this.ACCESS_DENIED = 0x31; }
26
+ static { this.DECODE_ERROR = 0x32; }
27
+ static { this.DECRYPT_ERROR = 0x33; }
28
+ static { this.EXPORT_RESTRICTION = 0x3C; } // TLS 1.0 only
29
+ static { this.PROTOCOL_VERSION = 0x46; }
30
+ static { this.INSUFFICIENT_SECURITY = 0x47; }
31
+ static { this.INTERNAL_ERROR = 0x50; }
32
+ static { this.INAPPROPRIATE_FALLBACK = 0x56; }
33
+ static { this.USER_CANCELED = 0x5A; }
34
+ static { this.NO_RENEGOTIATION = 0x64; } // TLS 1.2 and below
35
+ static { this.MISSING_EXTENSION = 0x6D; } // TLS 1.3
36
+ static { this.UNSUPPORTED_EXTENSION = 0x6E; } // TLS 1.3
37
+ static { this.CERTIFICATE_REQUIRED = 0x6F; } // TLS 1.3
38
+ static { this.UNRECOGNIZED_NAME = 0x70; }
39
+ static { this.BAD_CERTIFICATE_STATUS_RESPONSE = 0x71; }
40
+ static { this.BAD_CERTIFICATE_HASH_VALUE = 0x72; } // TLS 1.2 and below
41
+ static { this.UNKNOWN_PSK_IDENTITY = 0x73; }
42
+ static { this.CERTIFICATE_REQUIRED_1_3 = 0x74; } // TLS 1.3
43
+ static { this.NO_APPLICATION_PROTOCOL = 0x78; }
44
+ /**
45
+ * Create a TLS alert buffer with the specified level and description code
46
+ *
47
+ * @param level Alert level (warning or fatal)
48
+ * @param description Alert description code
49
+ * @param tlsVersion TLS version bytes (default is TLS 1.2: 0x0303)
50
+ * @returns Buffer containing the TLS alert message
51
+ */
52
+ static create(level, description, tlsVersion = [0x03, 0x03]) {
53
+ return Buffer.from([
54
+ 0x15, // Alert record type
55
+ tlsVersion[0],
56
+ tlsVersion[1], // TLS version (default to TLS 1.2: 0x0303)
57
+ 0x00,
58
+ 0x02, // Length
59
+ level, // Alert level
60
+ description, // Alert description
61
+ ]);
62
+ }
63
+ /**
64
+ * Create a warning-level TLS alert
65
+ *
66
+ * @param description Alert description code
67
+ * @returns Buffer containing the warning-level TLS alert message
68
+ */
69
+ static createWarning(description) {
70
+ return this.create(this.LEVEL_WARNING, description);
71
+ }
72
+ /**
73
+ * Create a fatal-level TLS alert
74
+ *
75
+ * @param description Alert description code
76
+ * @returns Buffer containing the fatal-level TLS alert message
77
+ */
78
+ static createFatal(description) {
79
+ return this.create(this.LEVEL_FATAL, description);
80
+ }
81
+ /**
82
+ * Send a TLS alert to a socket and optionally close the connection
83
+ *
84
+ * @param socket The socket to send the alert to
85
+ * @param level Alert level (warning or fatal)
86
+ * @param description Alert description code
87
+ * @param closeAfterSend Whether to close the connection after sending the alert
88
+ * @param closeDelay Milliseconds to wait before closing the connection (default: 200ms)
89
+ * @returns Promise that resolves when the alert has been sent
90
+ */
91
+ static async send(socket, level, description, closeAfterSend = false, closeDelay = 200) {
92
+ const alert = this.create(level, description);
93
+ return new Promise((resolve, reject) => {
94
+ try {
95
+ // Ensure the alert is written as a single packet
96
+ socket.cork();
97
+ const writeSuccessful = socket.write(alert, (err) => {
98
+ if (err) {
99
+ reject(err);
100
+ return;
101
+ }
102
+ if (closeAfterSend) {
103
+ setTimeout(() => {
104
+ socket.end();
105
+ resolve();
106
+ }, closeDelay);
107
+ }
108
+ else {
109
+ resolve();
110
+ }
111
+ });
112
+ socket.uncork();
113
+ // If write wasn't successful immediately, wait for drain
114
+ if (!writeSuccessful && !closeAfterSend) {
115
+ socket.once('drain', () => {
116
+ resolve();
117
+ });
118
+ }
119
+ }
120
+ catch (err) {
121
+ reject(err);
122
+ }
123
+ });
124
+ }
125
+ /**
126
+ * Pre-defined TLS alert messages
127
+ */
128
+ static { this.alerts = {
129
+ // Warning level alerts
130
+ closeNotify: TlsAlert.createWarning(TlsAlert.CLOSE_NOTIFY),
131
+ unsupportedExtension: TlsAlert.createWarning(TlsAlert.UNSUPPORTED_EXTENSION),
132
+ certificateRequired: TlsAlert.createWarning(TlsAlert.CERTIFICATE_REQUIRED),
133
+ unrecognizedName: TlsAlert.createWarning(TlsAlert.UNRECOGNIZED_NAME),
134
+ noRenegotiation: TlsAlert.createWarning(TlsAlert.NO_RENEGOTIATION),
135
+ userCanceled: TlsAlert.createWarning(TlsAlert.USER_CANCELED),
136
+ // Warning level alerts for session resumption
137
+ certificateExpiredWarning: TlsAlert.createWarning(TlsAlert.CERTIFICATE_EXPIRED),
138
+ handshakeFailureWarning: TlsAlert.createWarning(TlsAlert.HANDSHAKE_FAILURE),
139
+ insufficientSecurityWarning: TlsAlert.createWarning(TlsAlert.INSUFFICIENT_SECURITY),
140
+ // Fatal level alerts
141
+ unexpectedMessage: TlsAlert.createFatal(TlsAlert.UNEXPECTED_MESSAGE),
142
+ badRecordMac: TlsAlert.createFatal(TlsAlert.BAD_RECORD_MAC),
143
+ recordOverflow: TlsAlert.createFatal(TlsAlert.RECORD_OVERFLOW),
144
+ handshakeFailure: TlsAlert.createFatal(TlsAlert.HANDSHAKE_FAILURE),
145
+ badCertificate: TlsAlert.createFatal(TlsAlert.BAD_CERTIFICATE),
146
+ certificateExpired: TlsAlert.createFatal(TlsAlert.CERTIFICATE_EXPIRED),
147
+ certificateUnknown: TlsAlert.createFatal(TlsAlert.CERTIFICATE_UNKNOWN),
148
+ illegalParameter: TlsAlert.createFatal(TlsAlert.ILLEGAL_PARAMETER),
149
+ unknownCA: TlsAlert.createFatal(TlsAlert.UNKNOWN_CA),
150
+ accessDenied: TlsAlert.createFatal(TlsAlert.ACCESS_DENIED),
151
+ decodeError: TlsAlert.createFatal(TlsAlert.DECODE_ERROR),
152
+ decryptError: TlsAlert.createFatal(TlsAlert.DECRYPT_ERROR),
153
+ protocolVersion: TlsAlert.createFatal(TlsAlert.PROTOCOL_VERSION),
154
+ insufficientSecurity: TlsAlert.createFatal(TlsAlert.INSUFFICIENT_SECURITY),
155
+ internalError: TlsAlert.createFatal(TlsAlert.INTERNAL_ERROR),
156
+ unrecognizedNameFatal: TlsAlert.createFatal(TlsAlert.UNRECOGNIZED_NAME),
157
+ }; }
158
+ /**
159
+ * Utility method to send a warning-level unrecognized_name alert
160
+ * Specifically designed for SNI issues to encourage the client to retry with SNI
161
+ *
162
+ * @param socket The socket to send the alert to
163
+ * @returns Promise that resolves when the alert has been sent
164
+ */
165
+ static async sendSniRequired(socket) {
166
+ return this.send(socket, this.LEVEL_WARNING, this.UNRECOGNIZED_NAME);
167
+ }
168
+ /**
169
+ * Utility method to send a close_notify alert and close the connection
170
+ *
171
+ * @param socket The socket to send the alert to
172
+ * @param closeDelay Milliseconds to wait before closing the connection (default: 200ms)
173
+ * @returns Promise that resolves when the alert has been sent and the connection closed
174
+ */
175
+ static async sendCloseNotify(socket, closeDelay = 200) {
176
+ return this.send(socket, this.LEVEL_WARNING, this.CLOSE_NOTIFY, true, closeDelay);
177
+ }
178
+ /**
179
+ * Utility method to send a certificate_expired alert to force new TLS session
180
+ *
181
+ * @param socket The socket to send the alert to
182
+ * @param fatal Whether to send as a fatal alert (default: false)
183
+ * @param closeAfterSend Whether to close the connection after sending the alert (default: true)
184
+ * @param closeDelay Milliseconds to wait before closing the connection (default: 200ms)
185
+ * @returns Promise that resolves when the alert has been sent
186
+ */
187
+ static async sendCertificateExpired(socket, fatal = false, closeAfterSend = true, closeDelay = 200) {
188
+ const level = fatal ? this.LEVEL_FATAL : this.LEVEL_WARNING;
189
+ return this.send(socket, level, this.CERTIFICATE_EXPIRED, closeAfterSend, closeDelay);
190
+ }
191
+ /**
192
+ * Send a sequence of alerts to force SNI from clients
193
+ * This combines multiple alerts to ensure maximum browser compatibility
194
+ *
195
+ * @param socket The socket to send the alerts to
196
+ * @returns Promise that resolves when all alerts have been sent
197
+ */
198
+ static async sendForceSniSequence(socket) {
199
+ try {
200
+ // Send unrecognized_name (warning)
201
+ socket.cork();
202
+ socket.write(this.alerts.unrecognizedName);
203
+ socket.uncork();
204
+ // Give the socket time to send the alert
205
+ return new Promise((resolve) => {
206
+ setTimeout(resolve, 50);
207
+ });
208
+ }
209
+ catch (err) {
210
+ return Promise.reject(err);
211
+ }
212
+ }
213
+ /**
214
+ * Send a fatal level alert that immediately terminates the connection
215
+ *
216
+ * @param socket The socket to send the alert to
217
+ * @param description Alert description code
218
+ * @param closeDelay Milliseconds to wait before closing the connection (default: 100ms)
219
+ * @returns Promise that resolves when the alert has been sent and the connection closed
220
+ */
221
+ static async sendFatalAndClose(socket, description, closeDelay = 100) {
222
+ return this.send(socket, this.LEVEL_FATAL, description, true, closeDelay);
223
+ }
224
+ }
225
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5wcC50bHNhbGVydC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzL3NtYXJ0cHJveHkvY2xhc3Nlcy5wcC50bHNhbGVydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssR0FBRyxNQUFNLEtBQUssQ0FBQztBQUUzQjs7R0FFRztBQUNILE1BQU0sT0FBTyxRQUFRO0lBQ25CLG1CQUFtQjthQUNILGtCQUFhLEdBQUcsSUFBSSxDQUFDO2FBQ3JCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO0lBRW5DLHdFQUF3RTthQUN4RCxpQkFBWSxHQUFHLElBQUksQ0FBQzthQUNwQix1QkFBa0IsR0FBRyxJQUFJLENBQUM7YUFDMUIsbUJBQWMsR0FBRyxJQUFJLENBQUM7YUFDdEIsc0JBQWlCLEdBQUcsSUFBSSxDQUFDLEdBQUMsZUFBZTthQUN6QyxvQkFBZSxHQUFHLElBQUksQ0FBQzthQUN2QiwwQkFBcUIsR0FBRyxJQUFJLENBQUMsR0FBQyxvQkFBb0I7YUFDbEQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO2FBQ3pCLG1CQUFjLEdBQUcsSUFBSSxDQUFDLEdBQUMsYUFBYTthQUNwQyxvQkFBZSxHQUFHLElBQUksQ0FBQzthQUN2Qiw0QkFBdUIsR0FBRyxJQUFJLENBQUM7YUFDL0Isd0JBQW1CLEdBQUcsSUFBSSxDQUFDO2FBQzNCLHdCQUFtQixHQUFHLElBQUksQ0FBQzthQUMzQix3QkFBbUIsR0FBRyxJQUFJLENBQUM7YUFDM0Isc0JBQWlCLEdBQUcsSUFBSSxDQUFDO2FBQ3pCLGVBQVUsR0FBRyxJQUFJLENBQUM7YUFDbEIsa0JBQWEsR0FBRyxJQUFJLENBQUM7YUFDckIsaUJBQVksR0FBRyxJQUFJLENBQUM7YUFDcEIsa0JBQWEsR0FBRyxJQUFJLENBQUM7YUFDckIsdUJBQWtCLEdBQUcsSUFBSSxDQUFDLEdBQUMsZUFBZTthQUMxQyxxQkFBZ0IsR0FBRyxJQUFJLENBQUM7YUFDeEIsMEJBQXFCLEdBQUcsSUFB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
@@ -0,0 +1,57 @@
1
+ import type { IPortProxySettings } from './classes.pp.interfaces.js';
2
+ /**
3
+ * Interface for connection information used for SNI extraction
4
+ */
5
+ interface IConnectionInfo {
6
+ sourceIp: string;
7
+ sourcePort: number;
8
+ destIp: string;
9
+ destPort: number;
10
+ }
11
+ /**
12
+ * Manages TLS-related operations including SNI extraction and validation
13
+ */
14
+ export declare class TlsManager {
15
+ private settings;
16
+ constructor(settings: IPortProxySettings);
17
+ /**
18
+ * Check if a data chunk appears to be a TLS handshake
19
+ */
20
+ isTlsHandshake(chunk: Buffer): boolean;
21
+ /**
22
+ * Check if a data chunk appears to be a TLS ClientHello
23
+ */
24
+ isClientHello(chunk: Buffer): boolean;
25
+ /**
26
+ * Extract Server Name Indication (SNI) from TLS handshake
27
+ */
28
+ extractSNI(chunk: Buffer, connInfo: IConnectionInfo, previousDomain?: string): string | undefined;
29
+ /**
30
+ * Handle session resumption attempts
31
+ */
32
+ handleSessionResumption(chunk: Buffer, connectionId: string, hasSNI: boolean): {
33
+ shouldBlock: boolean;
34
+ reason?: string;
35
+ };
36
+ /**
37
+ * Check for SNI mismatch during renegotiation
38
+ */
39
+ checkRenegotiationSNI(chunk: Buffer, connInfo: IConnectionInfo, expectedDomain: string, connectionId: string): {
40
+ hasMismatch: boolean;
41
+ extractedSNI?: string;
42
+ };
43
+ /**
44
+ * Create a renegotiation handler function for a connection
45
+ */
46
+ createRenegotiationHandler(connectionId: string, lockedDomain: string, connInfo: IConnectionInfo, onMismatch: (connectionId: string, reason: string) => void): (chunk: Buffer) => void;
47
+ /**
48
+ * Analyze TLS connection for browser fingerprinting
49
+ * This helps identify browser vs non-browser connections
50
+ */
51
+ analyzeClientHello(chunk: Buffer): {
52
+ isBrowserConnection: boolean;
53
+ isRenewal: boolean;
54
+ hasSNI: boolean;
55
+ };
56
+ }
57
+ export {};