@push.rocks/smartproxy 19.5.4 → 19.5.5
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 +5 -2
- package/dist_ts/core/utils/index.js +6 -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/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/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 +37 -7
- package/dist_ts/proxies/smart-proxy/connection-manager.js +257 -180
- 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 +5 -2
- package/ts/core/utils/lifecycle-component.ts +231 -0
- package/ts/plugins.ts +2 -1
- package/ts/proxies/http-proxy/certificate-manager.ts +52 -1
- 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 +291 -189
- 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
|
@@ -1,29 +1,28 @@
|
|
|
1
1
|
import * as plugins from '../../plugins.js';
|
|
2
|
+
import { AsyncFileSystem } from '../../core/utils/fs-utils.js';
|
|
2
3
|
export class CertStore {
|
|
3
4
|
constructor(certDir) {
|
|
4
5
|
this.certDir = certDir;
|
|
5
6
|
}
|
|
6
7
|
async initialize() {
|
|
7
|
-
await
|
|
8
|
+
await AsyncFileSystem.ensureDir(this.certDir);
|
|
8
9
|
}
|
|
9
10
|
async getCertificate(routeName) {
|
|
10
11
|
const certPath = this.getCertPath(routeName);
|
|
11
12
|
const metaPath = `${certPath}/meta.json`;
|
|
12
|
-
if (!await
|
|
13
|
+
if (!await AsyncFileSystem.exists(metaPath)) {
|
|
13
14
|
return null;
|
|
14
15
|
}
|
|
15
16
|
try {
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
const key = keyFile.contents.toString();
|
|
17
|
+
const meta = await AsyncFileSystem.readJSON(metaPath);
|
|
18
|
+
const [cert, key] = await Promise.all([
|
|
19
|
+
AsyncFileSystem.readFile(`${certPath}/cert.pem`),
|
|
20
|
+
AsyncFileSystem.readFile(`${certPath}/key.pem`)
|
|
21
|
+
]);
|
|
22
22
|
let ca;
|
|
23
23
|
const caPath = `${certPath}/ca.pem`;
|
|
24
|
-
if (await
|
|
25
|
-
|
|
26
|
-
ca = caFile.contents.toString();
|
|
24
|
+
if (await AsyncFileSystem.exists(caPath)) {
|
|
25
|
+
ca = await AsyncFileSystem.readFile(caPath);
|
|
27
26
|
}
|
|
28
27
|
return {
|
|
29
28
|
cert,
|
|
@@ -40,12 +39,14 @@ export class CertStore {
|
|
|
40
39
|
}
|
|
41
40
|
async saveCertificate(routeName, certData) {
|
|
42
41
|
const certPath = this.getCertPath(routeName);
|
|
43
|
-
await
|
|
44
|
-
// Save certificate files
|
|
45
|
-
|
|
46
|
-
|
|
42
|
+
await AsyncFileSystem.ensureDir(certPath);
|
|
43
|
+
// Save certificate files in parallel
|
|
44
|
+
const savePromises = [
|
|
45
|
+
AsyncFileSystem.writeFile(`${certPath}/cert.pem`, certData.cert),
|
|
46
|
+
AsyncFileSystem.writeFile(`${certPath}/key.pem`, certData.key)
|
|
47
|
+
];
|
|
47
48
|
if (certData.ca) {
|
|
48
|
-
|
|
49
|
+
savePromises.push(AsyncFileSystem.writeFile(`${certPath}/ca.pem`, certData.ca));
|
|
49
50
|
}
|
|
50
51
|
// Save metadata
|
|
51
52
|
const meta = {
|
|
@@ -53,12 +54,13 @@ export class CertStore {
|
|
|
53
54
|
issueDate: certData.issueDate.toISOString(),
|
|
54
55
|
savedAt: new Date().toISOString()
|
|
55
56
|
};
|
|
56
|
-
|
|
57
|
+
savePromises.push(AsyncFileSystem.writeJSON(`${certPath}/meta.json`, meta));
|
|
58
|
+
await Promise.all(savePromises);
|
|
57
59
|
}
|
|
58
60
|
async deleteCertificate(routeName) {
|
|
59
61
|
const certPath = this.getCertPath(routeName);
|
|
60
|
-
if (await
|
|
61
|
-
await
|
|
62
|
+
if (await AsyncFileSystem.isDirectory(certPath)) {
|
|
63
|
+
await AsyncFileSystem.removeDir(certPath);
|
|
62
64
|
}
|
|
63
65
|
}
|
|
64
66
|
getCertPath(routeName) {
|
|
@@ -67,4 +69,4 @@ export class CertStore {
|
|
|
67
69
|
return `${this.certDir}/${safeName}`;
|
|
68
70
|
}
|
|
69
71
|
}
|
|
70
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VydC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Byb3hpZXMvc21hcnQtcHJveHkvY2VydC1zdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUcvRCxNQUFNLE9BQU8sU0FBUztJQUNwQixZQUFvQixPQUFlO1FBQWYsWUFBTyxHQUFQLE9BQU8sQ0FBUTtJQUFHLENBQUM7SUFFaEMsS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxlQUFlLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDO0lBRU0sS0FBSyxDQUFDLGNBQWMsQ0FBQyxTQUFpQjtRQUMzQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzdDLE1BQU0sUUFBUSxHQUFHLEdBQUcsUUFBUSxZQUFZLENBQUM7UUFFekMsSUFBSSxDQUFDLE1BQU0sZUFBZSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVDLE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLE1BQU0sZUFBZSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUV0RCxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxHQUFHLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQztnQkFDcEMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxHQUFHLFFBQVEsV0FBVyxDQUFDO2dCQUNoRCxlQUFlLENBQUMsUUFBUSxDQUFDLEdBQUcsUUFBUSxVQUFVLENBQUM7YUFDaEQsQ0FBQyxDQUFDO1lBRUgsSUFBSSxFQUFzQixDQUFDO1lBQzNCLE1BQU0sTUFBTSxHQUFHLEdBQUcsUUFBUSxT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
|
|
@@ -2,15 +2,21 @@ import * as plugins from '../../plugins.js';
|
|
|
2
2
|
import type { IConnectionRecord, ISmartProxyOptions } from './models/interfaces.js';
|
|
3
3
|
import { SecurityManager } from './security-manager.js';
|
|
4
4
|
import { TimeoutManager } from './timeout-manager.js';
|
|
5
|
+
import { LifecycleComponent } from '../../core/utils/lifecycle-component.js';
|
|
5
6
|
/**
|
|
6
|
-
* Manages connection lifecycle, tracking, and cleanup
|
|
7
|
+
* Manages connection lifecycle, tracking, and cleanup with performance optimizations
|
|
7
8
|
*/
|
|
8
|
-
export declare class ConnectionManager {
|
|
9
|
+
export declare class ConnectionManager extends LifecycleComponent {
|
|
9
10
|
private settings;
|
|
10
11
|
private securityManager;
|
|
11
12
|
private timeoutManager;
|
|
12
13
|
private connectionRecords;
|
|
13
14
|
private terminationStats;
|
|
15
|
+
private nextInactivityCheck;
|
|
16
|
+
private readonly maxConnections;
|
|
17
|
+
private readonly cleanupBatchSize;
|
|
18
|
+
private cleanupQueue;
|
|
19
|
+
private cleanupTimer;
|
|
14
20
|
constructor(settings: ISmartProxyOptions, securityManager: SecurityManager, timeoutManager: TimeoutManager);
|
|
15
21
|
/**
|
|
16
22
|
* Generate a unique connection ID
|
|
@@ -19,11 +25,19 @@ export declare class ConnectionManager {
|
|
|
19
25
|
/**
|
|
20
26
|
* Create and track a new connection
|
|
21
27
|
*/
|
|
22
|
-
createConnection(socket: plugins.net.Socket): IConnectionRecord;
|
|
28
|
+
createConnection(socket: plugins.net.Socket): IConnectionRecord | null;
|
|
23
29
|
/**
|
|
24
30
|
* Track an existing connection
|
|
25
31
|
*/
|
|
26
32
|
trackConnection(connectionId: string, record: IConnectionRecord): void;
|
|
33
|
+
/**
|
|
34
|
+
* Schedule next inactivity check for a connection
|
|
35
|
+
*/
|
|
36
|
+
private scheduleInactivityCheck;
|
|
37
|
+
/**
|
|
38
|
+
* Start the inactivity check timer
|
|
39
|
+
*/
|
|
40
|
+
private startInactivityCheckTimer;
|
|
27
41
|
/**
|
|
28
42
|
* Get a connection by ID
|
|
29
43
|
*/
|
|
@@ -40,14 +54,22 @@ export declare class ConnectionManager {
|
|
|
40
54
|
* Initiates cleanup once for a connection
|
|
41
55
|
*/
|
|
42
56
|
initiateCleanupOnce(record: IConnectionRecord, reason?: string): void;
|
|
57
|
+
/**
|
|
58
|
+
* Queue a connection for cleanup
|
|
59
|
+
*/
|
|
60
|
+
private queueCleanup;
|
|
61
|
+
/**
|
|
62
|
+
* Process the cleanup queue in batches
|
|
63
|
+
*/
|
|
64
|
+
private processCleanupQueue;
|
|
43
65
|
/**
|
|
44
66
|
* Clean up a connection record
|
|
45
67
|
*/
|
|
46
68
|
cleanupConnection(record: IConnectionRecord, reason?: string): void;
|
|
47
69
|
/**
|
|
48
|
-
* Helper method to clean up a socket
|
|
70
|
+
* Helper method to clean up a socket immediately
|
|
49
71
|
*/
|
|
50
|
-
private
|
|
72
|
+
private cleanupSocketImmediate;
|
|
51
73
|
/**
|
|
52
74
|
* Creates a generic error handler for incoming or outgoing sockets
|
|
53
75
|
*/
|
|
@@ -68,11 +90,19 @@ export declare class ConnectionManager {
|
|
|
68
90
|
outgoing: Record<string, number>;
|
|
69
91
|
};
|
|
70
92
|
/**
|
|
71
|
-
*
|
|
93
|
+
* Optimized inactivity check - only checks connections that are due
|
|
94
|
+
*/
|
|
95
|
+
private performOptimizedInactivityCheck;
|
|
96
|
+
/**
|
|
97
|
+
* Legacy method for backward compatibility
|
|
72
98
|
*/
|
|
73
99
|
performInactivityCheck(): void;
|
|
74
100
|
/**
|
|
75
101
|
* Clear all connections (for shutdown)
|
|
76
102
|
*/
|
|
77
|
-
clearConnections(): void
|
|
103
|
+
clearConnections(): Promise<void>;
|
|
104
|
+
/**
|
|
105
|
+
* Override LifecycleComponent's onCleanup method
|
|
106
|
+
*/
|
|
107
|
+
protected onCleanup(): Promise<void>;
|
|
78
108
|
}
|