@push.rocks/smartproxy 19.5.4 → 19.5.6
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.
- package/dist_ts/core/utils/async-utils.d.ts +81 -0
- package/dist_ts/core/utils/async-utils.js +216 -0
- package/dist_ts/core/utils/binary-heap.d.ts +73 -0
- package/dist_ts/core/utils/binary-heap.js +193 -0
- package/dist_ts/core/utils/enhanced-connection-pool.d.ts +110 -0
- package/dist_ts/core/utils/enhanced-connection-pool.js +320 -0
- package/dist_ts/core/utils/fs-utils.d.ts +144 -0
- package/dist_ts/core/utils/fs-utils.js +252 -0
- package/dist_ts/core/utils/index.d.ts +6 -2
- package/dist_ts/core/utils/index.js +7 -3
- package/dist_ts/core/utils/lifecycle-component.d.ts +59 -0
- package/dist_ts/core/utils/lifecycle-component.js +195 -0
- package/dist_ts/core/utils/socket-utils.d.ts +28 -0
- package/dist_ts/core/utils/socket-utils.js +77 -0
- package/dist_ts/forwarding/handlers/http-handler.js +7 -4
- package/dist_ts/forwarding/handlers/https-passthrough-handler.js +14 -55
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +52 -40
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +31 -43
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/proxies/http-proxy/certificate-manager.d.ts +15 -0
- package/dist_ts/proxies/http-proxy/certificate-manager.js +49 -2
- package/dist_ts/proxies/http-proxy/connection-pool.js +4 -19
- package/dist_ts/proxies/http-proxy/http-proxy.js +3 -7
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +10 -0
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +53 -43
- package/dist_ts/proxies/smart-proxy/cert-store.js +22 -20
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +35 -9
- package/dist_ts/proxies/smart-proxy/connection-manager.js +243 -189
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +13 -2
- package/dist_ts/proxies/smart-proxy/port-manager.js +3 -3
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +35 -4
- package/package.json +2 -2
- package/readme.hints.md +96 -1
- package/readme.plan.md +1135 -221
- package/readme.problems.md +167 -83
- package/ts/core/utils/async-utils.ts +275 -0
- package/ts/core/utils/binary-heap.ts +225 -0
- package/ts/core/utils/enhanced-connection-pool.ts +420 -0
- package/ts/core/utils/fs-utils.ts +270 -0
- package/ts/core/utils/index.ts +6 -2
- package/ts/core/utils/lifecycle-component.ts +231 -0
- package/ts/core/utils/socket-utils.ts +96 -0
- package/ts/forwarding/handlers/http-handler.ts +7 -3
- package/ts/forwarding/handlers/https-passthrough-handler.ts +13 -62
- package/ts/forwarding/handlers/https-terminate-to-http-handler.ts +58 -46
- package/ts/forwarding/handlers/https-terminate-to-https-handler.ts +38 -53
- package/ts/plugins.ts +2 -1
- package/ts/proxies/http-proxy/certificate-manager.ts +52 -1
- package/ts/proxies/http-proxy/connection-pool.ts +3 -16
- package/ts/proxies/http-proxy/http-proxy.ts +2 -5
- package/ts/proxies/nftables-proxy/nftables-proxy.ts +64 -79
- package/ts/proxies/smart-proxy/cert-store.ts +26 -20
- package/ts/proxies/smart-proxy/connection-manager.ts +277 -197
- package/ts/proxies/smart-proxy/http-proxy-bridge.ts +15 -1
- package/ts/proxies/smart-proxy/port-manager.ts +2 -2
- package/ts/proxies/smart-proxy/route-connection-handler.ts +39 -4
- package/readme.plan2.md +0 -764
- package/ts/common/eventUtils.ts +0 -34
- package/ts/common/types.ts +0 -91
- package/ts/core/utils/event-system.ts +0 -376
- package/ts/core/utils/event-utils.ts +0 -25
|
@@ -128,10 +128,24 @@ export class HttpProxyBridge {
|
|
|
128
128
|
proxySocket.pipe(socket);
|
|
129
129
|
|
|
130
130
|
// Handle cleanup
|
|
131
|
+
let cleanedUp = false;
|
|
131
132
|
const cleanup = (reason: string) => {
|
|
133
|
+
if (cleanedUp) return;
|
|
134
|
+
cleanedUp = true;
|
|
135
|
+
|
|
136
|
+
// Remove all event listeners to prevent memory leaks
|
|
137
|
+
socket.removeAllListeners('end');
|
|
138
|
+
socket.removeAllListeners('error');
|
|
139
|
+
proxySocket.removeAllListeners('end');
|
|
140
|
+
proxySocket.removeAllListeners('error');
|
|
141
|
+
|
|
132
142
|
socket.unpipe(proxySocket);
|
|
133
143
|
proxySocket.unpipe(socket);
|
|
134
|
-
|
|
144
|
+
|
|
145
|
+
if (!proxySocket.destroyed) {
|
|
146
|
+
proxySocket.destroy();
|
|
147
|
+
}
|
|
148
|
+
|
|
135
149
|
cleanupCallback(reason);
|
|
136
150
|
};
|
|
137
151
|
|
|
@@ -2,6 +2,7 @@ import * as plugins from '../../plugins.js';
|
|
|
2
2
|
import type { ISmartProxyOptions } from './models/interfaces.js';
|
|
3
3
|
import { RouteConnectionHandler } from './route-connection-handler.js';
|
|
4
4
|
import { logger } from '../../core/utils/logger.js';
|
|
5
|
+
import { cleanupSocket } from '../../core/utils/socket-utils.js';
|
|
5
6
|
|
|
6
7
|
/**
|
|
7
8
|
* PortManager handles the dynamic creation and removal of port listeners
|
|
@@ -64,8 +65,7 @@ export class PortManager {
|
|
|
64
65
|
const server = plugins.net.createServer((socket) => {
|
|
65
66
|
// Check if shutting down
|
|
66
67
|
if (this.isShuttingDown) {
|
|
67
|
-
socket
|
|
68
|
-
socket.destroy();
|
|
68
|
+
cleanupSocket(socket, 'port-manager-shutdown');
|
|
69
69
|
return;
|
|
70
70
|
}
|
|
71
71
|
|
|
@@ -9,7 +9,7 @@ import { TlsManager } from './tls-manager.js';
|
|
|
9
9
|
import { HttpProxyBridge } from './http-proxy-bridge.js';
|
|
10
10
|
import { TimeoutManager } from './timeout-manager.js';
|
|
11
11
|
import { RouteManager } from './route-manager.js';
|
|
12
|
-
import
|
|
12
|
+
import { cleanupSocket } from '../../core/utils/socket-utils.js';
|
|
13
13
|
|
|
14
14
|
/**
|
|
15
15
|
* Handles new connection processing and setup logic with support for route-based configuration
|
|
@@ -84,8 +84,7 @@ export class RouteConnectionHandler {
|
|
|
84
84
|
const ipValidation = this.securityManager.validateIP(remoteIP);
|
|
85
85
|
if (!ipValidation.allowed) {
|
|
86
86
|
logger.log('warn', `Connection rejected`, { remoteIP, reason: ipValidation.reason, component: 'route-handler' });
|
|
87
|
-
socket.
|
|
88
|
-
socket.destroy();
|
|
87
|
+
cleanupSocket(socket, `rejected-${ipValidation.reason}`);
|
|
89
88
|
return;
|
|
90
89
|
}
|
|
91
90
|
|
|
@@ -822,6 +821,38 @@ export class RouteConnectionHandler {
|
|
|
822
821
|
return;
|
|
823
822
|
}
|
|
824
823
|
|
|
824
|
+
// Track event listeners added by the handler so we can clean them up
|
|
825
|
+
const originalOn = socket.on.bind(socket);
|
|
826
|
+
const originalOnce = socket.once.bind(socket);
|
|
827
|
+
const trackedListeners: Array<{event: string; listener: (...args: any[]) => void}> = [];
|
|
828
|
+
|
|
829
|
+
// Override socket.on to track listeners
|
|
830
|
+
socket.on = function(event: string, listener: (...args: any[]) => void) {
|
|
831
|
+
trackedListeners.push({event, listener});
|
|
832
|
+
return originalOn(event, listener);
|
|
833
|
+
} as any;
|
|
834
|
+
|
|
835
|
+
// Override socket.once to track listeners
|
|
836
|
+
socket.once = function(event: string, listener: (...args: any[]) => void) {
|
|
837
|
+
trackedListeners.push({event, listener});
|
|
838
|
+
return originalOnce(event, listener);
|
|
839
|
+
} as any;
|
|
840
|
+
|
|
841
|
+
// Set up automatic cleanup when socket closes
|
|
842
|
+
const cleanupHandler = () => {
|
|
843
|
+
// Remove all tracked listeners
|
|
844
|
+
for (const {event, listener} of trackedListeners) {
|
|
845
|
+
socket.removeListener(event, listener);
|
|
846
|
+
}
|
|
847
|
+
// Restore original methods
|
|
848
|
+
socket.on = originalOn;
|
|
849
|
+
socket.once = originalOnce;
|
|
850
|
+
};
|
|
851
|
+
|
|
852
|
+
// Listen for socket close to trigger cleanup
|
|
853
|
+
originalOnce('close', cleanupHandler);
|
|
854
|
+
originalOnce('error', cleanupHandler);
|
|
855
|
+
|
|
825
856
|
// Create route context for the handler
|
|
826
857
|
const routeContext = this.createRouteContext({
|
|
827
858
|
connectionId: record.id,
|
|
@@ -855,6 +886,8 @@ export class RouteConnectionHandler {
|
|
|
855
886
|
error: error.message,
|
|
856
887
|
component: 'route-handler'
|
|
857
888
|
});
|
|
889
|
+
// Remove all event listeners before destroying to prevent memory leaks
|
|
890
|
+
socket.removeAllListeners();
|
|
858
891
|
if (!socket.destroyed) {
|
|
859
892
|
socket.destroy();
|
|
860
893
|
}
|
|
@@ -875,6 +908,8 @@ export class RouteConnectionHandler {
|
|
|
875
908
|
error: error.message,
|
|
876
909
|
component: 'route-handler'
|
|
877
910
|
});
|
|
911
|
+
// Remove all event listeners before destroying to prevent memory leaks
|
|
912
|
+
socket.removeAllListeners();
|
|
878
913
|
if (!socket.destroyed) {
|
|
879
914
|
socket.destroy();
|
|
880
915
|
}
|
|
@@ -1229,7 +1264,7 @@ export class RouteConnectionHandler {
|
|
|
1229
1264
|
connectionId,
|
|
1230
1265
|
serverName,
|
|
1231
1266
|
connInfo,
|
|
1232
|
-
(
|
|
1267
|
+
(_connectionId, reason) => this.connectionManager.initiateCleanupOnce(record, reason)
|
|
1233
1268
|
);
|
|
1234
1269
|
|
|
1235
1270
|
// Store the handler in the connection record so we can remove it during cleanup
|