@push.rocks/smartproxy 22.6.0 → 23.1.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.
- package/changelog.md +18 -0
- package/dist_rust/{rustproxy → rustproxy_linux_amd64} +0 -0
- package/dist_rust/rustproxy_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/index.d.ts +0 -1
- package/dist_ts/index.js +1 -3
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/proxies/index.d.ts +0 -1
- package/dist_ts/proxies/index.js +1 -3
- package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +9 -21
- package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +83 -212
- package/dist_ts/proxies/smart-proxy/smart-proxy.js +2 -3
- package/npmextra.json +3 -0
- package/package.json +13 -11
- package/readme.md +35 -31
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/index.ts +0 -3
- package/ts/plugins.ts +2 -0
- package/ts/proxies/index.ts +0 -3
- package/ts/proxies/smart-proxy/models/route-types.ts +0 -2
- package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +102 -233
- package/ts/proxies/smart-proxy/smart-proxy.ts +1 -2
- package/dist_ts/common/eventUtils.d.ts +0 -14
- package/dist_ts/common/eventUtils.js +0 -20
- package/dist_ts/common/types.d.ts +0 -82
- package/dist_ts/common/types.js +0 -15
- package/dist_ts/core/utils/event-system.d.ts +0 -200
- package/dist_ts/core/utils/event-system.js +0 -224
- package/dist_ts/core/utils/event-utils.d.ts +0 -15
- package/dist_ts/core/utils/event-utils.js +0 -11
- package/dist_ts/core/utils/route-manager.d.ts +0 -88
- package/dist_ts/core/utils/route-manager.js +0 -342
- package/dist_ts/core/utils/route-utils.d.ts +0 -28
- package/dist_ts/core/utils/route-utils.js +0 -67
- package/dist_ts/detection/detectors/http-detector-v2.d.ts +0 -33
- package/dist_ts/detection/detectors/http-detector-v2.js +0 -87
- package/dist_ts/detection/detectors/tls-detector-v2.d.ts +0 -33
- package/dist_ts/detection/detectors/tls-detector-v2.js +0 -80
- package/dist_ts/detection/protocol-detector-v2.d.ts +0 -46
- package/dist_ts/detection/protocol-detector-v2.js +0 -116
- package/dist_ts/forwarding/config/forwarding-types.d.ts +0 -42
- package/dist_ts/forwarding/config/forwarding-types.js +0 -18
- package/dist_ts/forwarding/config/index.d.ts +0 -9
- package/dist_ts/forwarding/config/index.js +0 -10
- package/dist_ts/forwarding/factory/forwarding-factory.d.ts +0 -25
- package/dist_ts/forwarding/factory/forwarding-factory.js +0 -172
- package/dist_ts/forwarding/factory/index.d.ts +0 -4
- package/dist_ts/forwarding/factory/index.js +0 -5
- package/dist_ts/forwarding/handlers/base-handler.d.ts +0 -62
- package/dist_ts/forwarding/handlers/base-handler.js +0 -121
- package/dist_ts/forwarding/handlers/http-handler.d.ts +0 -30
- package/dist_ts/forwarding/handlers/http-handler.js +0 -143
- package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +0 -29
- package/dist_ts/forwarding/handlers/https-passthrough-handler.js +0 -156
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +0 -36
- package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +0 -276
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +0 -35
- package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +0 -261
- package/dist_ts/forwarding/handlers/index.d.ts +0 -8
- package/dist_ts/forwarding/handlers/index.js +0 -9
- package/dist_ts/forwarding/index.d.ts +0 -13
- package/dist_ts/forwarding/index.js +0 -16
- package/dist_ts/http/index.d.ts +0 -5
- package/dist_ts/http/index.js +0 -8
- package/dist_ts/http/models/http-types.d.ts +0 -6
- package/dist_ts/http/models/http-types.js +0 -7
- package/dist_ts/http/router/index.d.ts +0 -8
- package/dist_ts/http/router/index.js +0 -7
- package/dist_ts/http/router/proxy-router.d.ts +0 -115
- package/dist_ts/http/router/proxy-router.js +0 -325
- package/dist_ts/http/router/route-router.d.ts +0 -108
- package/dist_ts/http/router/route-router.js +0 -393
- package/dist_ts/protocols/tls/constants.d.ts +0 -122
- package/dist_ts/protocols/tls/constants.js +0 -135
- package/dist_ts/protocols/tls/parser.d.ts +0 -53
- package/dist_ts/protocols/tls/parser.js +0 -294
- package/dist_ts/protocols/tls/types.d.ts +0 -65
- package/dist_ts/protocols/tls/types.js +0 -5
- package/dist_ts/proxies/http-proxy/certificate-manager.d.ts +0 -95
- package/dist_ts/proxies/http-proxy/certificate-manager.js +0 -214
- package/dist_ts/proxies/http-proxy/connection-pool.d.ts +0 -47
- package/dist_ts/proxies/http-proxy/connection-pool.js +0 -195
- package/dist_ts/proxies/http-proxy/context-creator.d.ts +0 -34
- package/dist_ts/proxies/http-proxy/context-creator.js +0 -108
- package/dist_ts/proxies/http-proxy/default-certificates.d.ts +0 -54
- package/dist_ts/proxies/http-proxy/default-certificates.js +0 -127
- package/dist_ts/proxies/http-proxy/function-cache.d.ts +0 -95
- package/dist_ts/proxies/http-proxy/function-cache.js +0 -215
- package/dist_ts/proxies/http-proxy/handlers/index.d.ts +0 -4
- package/dist_ts/proxies/http-proxy/handlers/index.js +0 -6
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.d.ts +0 -18
- package/dist_ts/proxies/http-proxy/handlers/redirect-handler.js +0 -78
- package/dist_ts/proxies/http-proxy/handlers/static-handler.d.ts +0 -19
- package/dist_ts/proxies/http-proxy/handlers/static-handler.js +0 -211
- package/dist_ts/proxies/http-proxy/http-proxy.d.ts +0 -117
- package/dist_ts/proxies/http-proxy/http-proxy.js +0 -521
- package/dist_ts/proxies/http-proxy/http-request-handler.d.ts +0 -40
- package/dist_ts/proxies/http-proxy/http-request-handler.js +0 -257
- package/dist_ts/proxies/http-proxy/http2-request-handler.d.ts +0 -24
- package/dist_ts/proxies/http-proxy/http2-request-handler.js +0 -201
- package/dist_ts/proxies/http-proxy/index.d.ts +0 -14
- package/dist_ts/proxies/http-proxy/index.js +0 -16
- package/dist_ts/proxies/http-proxy/models/http-types.d.ts +0 -117
- package/dist_ts/proxies/http-proxy/models/http-types.js +0 -92
- package/dist_ts/proxies/http-proxy/models/index.d.ts +0 -5
- package/dist_ts/proxies/http-proxy/models/index.js +0 -6
- package/dist_ts/proxies/http-proxy/models/types.d.ts +0 -75
- package/dist_ts/proxies/http-proxy/models/types.js +0 -35
- package/dist_ts/proxies/http-proxy/request-handler.d.ts +0 -97
- package/dist_ts/proxies/http-proxy/request-handler.js +0 -737
- package/dist_ts/proxies/http-proxy/security-manager.d.ts +0 -98
- package/dist_ts/proxies/http-proxy/security-manager.js +0 -341
- package/dist_ts/proxies/http-proxy/websocket-handler.d.ts +0 -50
- package/dist_ts/proxies/http-proxy/websocket-handler.js +0 -505
- package/dist_ts/proxies/nftables-proxy/index.d.ts +0 -6
- package/dist_ts/proxies/nftables-proxy/index.js +0 -7
- package/dist_ts/proxies/nftables-proxy/models/errors.d.ts +0 -15
- package/dist_ts/proxies/nftables-proxy/models/errors.js +0 -28
- package/dist_ts/proxies/nftables-proxy/models/index.d.ts +0 -5
- package/dist_ts/proxies/nftables-proxy/models/index.js +0 -6
- package/dist_ts/proxies/nftables-proxy/models/interfaces.d.ts +0 -75
- package/dist_ts/proxies/nftables-proxy/models/interfaces.js +0 -5
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +0 -124
- package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +0 -1374
- package/dist_ts/proxies/nftables-proxy/utils/index.d.ts +0 -9
- package/dist_ts/proxies/nftables-proxy/utils/index.js +0 -12
- package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.d.ts +0 -66
- package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.js +0 -131
- package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.d.ts +0 -39
- package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.js +0 -112
- package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.d.ts +0 -59
- package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.js +0 -130
- package/dist_ts/proxies/smart-proxy/acme-state-manager.d.ts +0 -42
- package/dist_ts/proxies/smart-proxy/acme-state-manager.js +0 -101
- package/dist_ts/proxies/smart-proxy/cert-store.d.ts +0 -10
- package/dist_ts/proxies/smart-proxy/cert-store.js +0 -72
- package/dist_ts/proxies/smart-proxy/certificate-manager.d.ts +0 -164
- package/dist_ts/proxies/smart-proxy/certificate-manager.js +0 -745
- package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +0 -128
- package/dist_ts/proxies/smart-proxy/connection-manager.js +0 -689
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.d.ts +0 -43
- package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +0 -180
- package/dist_ts/proxies/smart-proxy/metrics-collector.d.ts +0 -98
- package/dist_ts/proxies/smart-proxy/metrics-collector.js +0 -355
- package/dist_ts/proxies/smart-proxy/nftables-manager.d.ts +0 -82
- package/dist_ts/proxies/smart-proxy/nftables-manager.js +0 -237
- package/dist_ts/proxies/smart-proxy/port-manager.d.ts +0 -117
- package/dist_ts/proxies/smart-proxy/port-manager.js +0 -318
- package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +0 -60
- package/dist_ts/proxies/smart-proxy/route-connection-handler.js +0 -1407
- package/dist_ts/proxies/smart-proxy/route-manager.d.ts +0 -112
- package/dist_ts/proxies/smart-proxy/route-manager.js +0 -453
- package/dist_ts/proxies/smart-proxy/route-orchestrator.d.ts +0 -56
- package/dist_ts/proxies/smart-proxy/route-orchestrator.js +0 -204
- package/dist_ts/proxies/smart-proxy/rust-binary-locator.d.ts +0 -23
- package/dist_ts/proxies/smart-proxy/rust-binary-locator.js +0 -104
- package/dist_ts/proxies/smart-proxy/security-manager.d.ts +0 -74
- package/dist_ts/proxies/smart-proxy/security-manager.js +0 -227
- package/dist_ts/proxies/smart-proxy/throughput-tracker.d.ts +0 -36
- package/dist_ts/proxies/smart-proxy/throughput-tracker.js +0 -115
- package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +0 -48
- package/dist_ts/proxies/smart-proxy/timeout-manager.js +0 -158
- package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +0 -50
- package/dist_ts/proxies/smart-proxy/tls-manager.js +0 -110
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +0 -161
- package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +0 -282
- package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +0 -73
- package/dist_ts/proxies/smart-proxy/utils/route-validators.js +0 -259
- package/dist_ts/routing/router/proxy-router.d.ts +0 -115
- package/dist_ts/routing/router/proxy-router.js +0 -325
- package/dist_ts/routing/router/route-router.d.ts +0 -108
- package/dist_ts/routing/router/route-router.js +0 -393
- package/dist_ts/tls/alerts/index.d.ts +0 -4
- package/dist_ts/tls/alerts/index.js +0 -5
- package/dist_ts/tls/alerts/tls-alert.d.ts +0 -150
- package/dist_ts/tls/alerts/tls-alert.js +0 -226
- package/dist_ts/tls/sni/client-hello-parser.d.ts +0 -100
- package/dist_ts/tls/sni/client-hello-parser.js +0 -464
- package/dist_ts/tls/sni/sni-extraction.d.ts +0 -58
- package/dist_ts/tls/sni/sni-extraction.js +0 -275
- package/dist_ts/tls/utils/index.d.ts +0 -4
- package/dist_ts/tls/utils/index.js +0 -5
- package/dist_ts/tls/utils/tls-utils.d.ts +0 -49
- package/dist_ts/tls/utils/tls-utils.js +0 -75
- package/ts/proxies/nftables-proxy/index.ts +0 -6
- package/ts/proxies/nftables-proxy/models/errors.ts +0 -30
- package/ts/proxies/nftables-proxy/models/index.ts +0 -5
- package/ts/proxies/nftables-proxy/models/interfaces.ts +0 -94
- package/ts/proxies/nftables-proxy/nftables-proxy.ts +0 -1754
- package/ts/proxies/nftables-proxy/utils/index.ts +0 -38
- package/ts/proxies/nftables-proxy/utils/nft-command-executor.ts +0 -162
- package/ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.ts +0 -125
- package/ts/proxies/nftables-proxy/utils/nft-rule-validator.ts +0 -156
- package/ts/proxies/smart-proxy/rust-binary-locator.ts +0 -112
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import { HttpProxy } from '../http-proxy/index.js';
|
|
3
|
-
import type { IConnectionRecord } from './models/interfaces.js';
|
|
4
|
-
import type { IRouteConfig } from './models/route-types.js';
|
|
5
|
-
import { WrappedSocket } from '../../core/models/wrapped-socket.js';
|
|
6
|
-
import type { SmartProxy } from './smart-proxy.js';
|
|
7
|
-
export declare class HttpProxyBridge {
|
|
8
|
-
private smartProxy;
|
|
9
|
-
private httpProxy;
|
|
10
|
-
constructor(smartProxy: SmartProxy);
|
|
11
|
-
/**
|
|
12
|
-
* Get the HttpProxy instance
|
|
13
|
-
*/
|
|
14
|
-
getHttpProxy(): HttpProxy | null;
|
|
15
|
-
/**
|
|
16
|
-
* Initialize HttpProxy instance
|
|
17
|
-
*/
|
|
18
|
-
initialize(): Promise<void>;
|
|
19
|
-
/**
|
|
20
|
-
* Sync routes to HttpProxy
|
|
21
|
-
*/
|
|
22
|
-
syncRoutesToHttpProxy(routes: IRouteConfig[]): Promise<void>;
|
|
23
|
-
/**
|
|
24
|
-
* Convert route to HttpProxy configuration
|
|
25
|
-
*/
|
|
26
|
-
private routeToHttpProxyConfig;
|
|
27
|
-
/**
|
|
28
|
-
* Check if connection should use HttpProxy
|
|
29
|
-
*/
|
|
30
|
-
shouldUseHttpProxy(connection: IConnectionRecord, routeMatch: any): boolean;
|
|
31
|
-
/**
|
|
32
|
-
* Forward connection to HttpProxy
|
|
33
|
-
*/
|
|
34
|
-
forwardToHttpProxy(connectionId: string, socket: plugins.net.Socket | WrappedSocket, record: IConnectionRecord, initialChunk: Buffer, httpProxyPort: number, cleanupCallback: (reason: string) => void): Promise<void>;
|
|
35
|
-
/**
|
|
36
|
-
* Start HttpProxy
|
|
37
|
-
*/
|
|
38
|
-
start(): Promise<void>;
|
|
39
|
-
/**
|
|
40
|
-
* Stop HttpProxy
|
|
41
|
-
*/
|
|
42
|
-
stop(): Promise<void>;
|
|
43
|
-
}
|
|
@@ -1,180 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import { HttpProxy } from '../http-proxy/index.js';
|
|
3
|
-
import { setupBidirectionalForwarding } from '../../core/utils/socket-utils.js';
|
|
4
|
-
import { WrappedSocket } from '../../core/models/wrapped-socket.js';
|
|
5
|
-
export class HttpProxyBridge {
|
|
6
|
-
constructor(smartProxy) {
|
|
7
|
-
this.smartProxy = smartProxy;
|
|
8
|
-
this.httpProxy = null;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Get the HttpProxy instance
|
|
12
|
-
*/
|
|
13
|
-
getHttpProxy() {
|
|
14
|
-
return this.httpProxy;
|
|
15
|
-
}
|
|
16
|
-
/**
|
|
17
|
-
* Initialize HttpProxy instance
|
|
18
|
-
*/
|
|
19
|
-
async initialize() {
|
|
20
|
-
if (!this.httpProxy && this.smartProxy.settings.useHttpProxy && this.smartProxy.settings.useHttpProxy.length > 0) {
|
|
21
|
-
const httpProxyOptions = {
|
|
22
|
-
port: this.smartProxy.settings.httpProxyPort,
|
|
23
|
-
portProxyIntegration: true,
|
|
24
|
-
logLevel: this.smartProxy.settings.enableDetailedLogging ? 'debug' : 'info'
|
|
25
|
-
};
|
|
26
|
-
this.httpProxy = new HttpProxy(httpProxyOptions);
|
|
27
|
-
console.log(`Initialized HttpProxy on port ${this.smartProxy.settings.httpProxyPort}`);
|
|
28
|
-
// Apply route configurations to HttpProxy
|
|
29
|
-
await this.syncRoutesToHttpProxy(this.smartProxy.settings.routes || []);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Sync routes to HttpProxy
|
|
34
|
-
*/
|
|
35
|
-
async syncRoutesToHttpProxy(routes) {
|
|
36
|
-
if (!this.httpProxy)
|
|
37
|
-
return;
|
|
38
|
-
// Convert routes to HttpProxy format
|
|
39
|
-
const httpProxyConfigs = routes
|
|
40
|
-
.filter(route => {
|
|
41
|
-
// Check if this route matches any of the specified network proxy ports
|
|
42
|
-
const routePorts = Array.isArray(route.match.ports)
|
|
43
|
-
? route.match.ports
|
|
44
|
-
: [route.match.ports];
|
|
45
|
-
return routePorts.some(port => this.smartProxy.settings.useHttpProxy?.includes(port));
|
|
46
|
-
})
|
|
47
|
-
.map(route => this.routeToHttpProxyConfig(route));
|
|
48
|
-
// Apply configurations to HttpProxy
|
|
49
|
-
await this.httpProxy.updateRouteConfigs(httpProxyConfigs);
|
|
50
|
-
}
|
|
51
|
-
/**
|
|
52
|
-
* Convert route to HttpProxy configuration
|
|
53
|
-
*/
|
|
54
|
-
routeToHttpProxyConfig(route) {
|
|
55
|
-
// Convert route to HttpProxy domain config format
|
|
56
|
-
let domain = '*';
|
|
57
|
-
if (route.match.domains) {
|
|
58
|
-
if (Array.isArray(route.match.domains)) {
|
|
59
|
-
domain = route.match.domains[0] || '*';
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
domain = route.match.domains;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return {
|
|
66
|
-
...route, // Keep the original route structure
|
|
67
|
-
match: {
|
|
68
|
-
...route.match,
|
|
69
|
-
domains: domain // Ensure domains is always set for HttpProxy
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Check if connection should use HttpProxy
|
|
75
|
-
*/
|
|
76
|
-
shouldUseHttpProxy(connection, routeMatch) {
|
|
77
|
-
// Only use HttpProxy for TLS termination
|
|
78
|
-
return (routeMatch.route.action.tls?.mode === 'terminate' ||
|
|
79
|
-
routeMatch.route.action.tls?.mode === 'terminate-and-reencrypt') && this.httpProxy !== null;
|
|
80
|
-
}
|
|
81
|
-
/**
|
|
82
|
-
* Forward connection to HttpProxy
|
|
83
|
-
*/
|
|
84
|
-
async forwardToHttpProxy(connectionId, socket, record, initialChunk, httpProxyPort, cleanupCallback) {
|
|
85
|
-
if (!this.httpProxy) {
|
|
86
|
-
throw new Error('HttpProxy not initialized');
|
|
87
|
-
}
|
|
88
|
-
// Check if client socket is already destroyed before proceeding
|
|
89
|
-
const underlyingSocket = socket instanceof WrappedSocket ? socket.socket : socket;
|
|
90
|
-
if (underlyingSocket.destroyed) {
|
|
91
|
-
console.log(`[${connectionId}] Client socket already destroyed, skipping HttpProxy forwarding`);
|
|
92
|
-
cleanupCallback('client_disconnected_before_proxy');
|
|
93
|
-
return;
|
|
94
|
-
}
|
|
95
|
-
const proxySocket = new plugins.net.Socket();
|
|
96
|
-
// Handle client disconnect during proxy connection setup
|
|
97
|
-
const clientDisconnectHandler = () => {
|
|
98
|
-
console.log(`[${connectionId}] Client disconnected during HttpProxy connection setup`);
|
|
99
|
-
proxySocket.destroy();
|
|
100
|
-
cleanupCallback('client_disconnected_during_setup');
|
|
101
|
-
};
|
|
102
|
-
underlyingSocket.once('close', clientDisconnectHandler);
|
|
103
|
-
try {
|
|
104
|
-
await new Promise((resolve, reject) => {
|
|
105
|
-
proxySocket.connect(httpProxyPort, 'localhost', () => {
|
|
106
|
-
console.log(`[${connectionId}] Connected to HttpProxy for termination`);
|
|
107
|
-
resolve();
|
|
108
|
-
});
|
|
109
|
-
proxySocket.on('error', reject);
|
|
110
|
-
});
|
|
111
|
-
}
|
|
112
|
-
finally {
|
|
113
|
-
// Remove the disconnect handler after connection attempt
|
|
114
|
-
underlyingSocket.removeListener('close', clientDisconnectHandler);
|
|
115
|
-
}
|
|
116
|
-
// Double-check client socket is still connected after async operation
|
|
117
|
-
if (underlyingSocket.destroyed) {
|
|
118
|
-
console.log(`[${connectionId}] Client disconnected while connecting to HttpProxy`);
|
|
119
|
-
proxySocket.destroy();
|
|
120
|
-
cleanupCallback('client_disconnected_after_proxy_connect');
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
// Send client IP information header first (custom protocol)
|
|
124
|
-
// Format: "CLIENT_IP:<ip>\r\n"
|
|
125
|
-
const clientIPHeader = Buffer.from(`CLIENT_IP:${record.remoteIP}\r\n`);
|
|
126
|
-
proxySocket.write(clientIPHeader);
|
|
127
|
-
// Send initial chunk if present
|
|
128
|
-
if (initialChunk) {
|
|
129
|
-
// Count the initial chunk bytes
|
|
130
|
-
record.bytesReceived += initialChunk.length;
|
|
131
|
-
if (this.smartProxy.metricsCollector) {
|
|
132
|
-
this.smartProxy.metricsCollector.recordBytes(record.id, initialChunk.length, 0);
|
|
133
|
-
}
|
|
134
|
-
proxySocket.write(initialChunk);
|
|
135
|
-
}
|
|
136
|
-
// Use centralized bidirectional forwarding (underlyingSocket already extracted above)
|
|
137
|
-
setupBidirectionalForwarding(underlyingSocket, proxySocket, {
|
|
138
|
-
onClientData: (chunk) => {
|
|
139
|
-
// Update stats - this is the ONLY place bytes are counted for HttpProxy connections
|
|
140
|
-
if (record) {
|
|
141
|
-
record.bytesReceived += chunk.length;
|
|
142
|
-
if (this.smartProxy.metricsCollector) {
|
|
143
|
-
this.smartProxy.metricsCollector.recordBytes(record.id, chunk.length, 0);
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
onServerData: (chunk) => {
|
|
148
|
-
// Update stats - this is the ONLY place bytes are counted for HttpProxy connections
|
|
149
|
-
if (record) {
|
|
150
|
-
record.bytesSent += chunk.length;
|
|
151
|
-
if (this.smartProxy.metricsCollector) {
|
|
152
|
-
this.smartProxy.metricsCollector.recordBytes(record.id, 0, chunk.length);
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
},
|
|
156
|
-
onCleanup: (reason) => {
|
|
157
|
-
cleanupCallback(reason);
|
|
158
|
-
},
|
|
159
|
-
enableHalfOpen: false // Close both when one closes (required for proxy chains)
|
|
160
|
-
});
|
|
161
|
-
}
|
|
162
|
-
/**
|
|
163
|
-
* Start HttpProxy
|
|
164
|
-
*/
|
|
165
|
-
async start() {
|
|
166
|
-
if (this.httpProxy) {
|
|
167
|
-
await this.httpProxy.start();
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
/**
|
|
171
|
-
* Stop HttpProxy
|
|
172
|
-
*/
|
|
173
|
-
async stop() {
|
|
174
|
-
if (this.httpProxy) {
|
|
175
|
-
await this.httpProxy.stop();
|
|
176
|
-
this.httpProxy = null;
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1wcm94eS1icmlkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L2h0dHAtcHJveHktYnJpZGdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSw0QkFBNEIsRUFBRSxNQUFNLGtDQUFrQyxDQUFDO0FBR2hGLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQ0FBcUMsQ0FBQztBQUdwRSxNQUFNLE9BQU8sZUFBZTtJQUcxQixZQUFvQixVQUFzQjtRQUF0QixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBRmxDLGNBQVMsR0FBcUIsSUFBSSxDQUFDO0lBRUUsQ0FBQztJQUU5Qzs7T0FFRztJQUNJLFlBQVk7UUFDakIsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVO1FBQ3JCLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ2pILE1BQU0sZ0JBQWdCLEdBQVE7Z0JBQzVCLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxhQUFjO2dCQUM3QyxvQkFBb0IsRUFBRSxJQUFJO2dCQUMxQixRQUFRLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMscUJBQXFCLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsTUFBTTthQUM1RSxDQUFDO1lBRUYsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxn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
|
|
@@ -1,98 +0,0 @@
|
|
|
1
|
-
import type { SmartProxy } from './smart-proxy.js';
|
|
2
|
-
import type { IMetrics, IThroughputData, IThroughputHistoryPoint } from './models/metrics-types.js';
|
|
3
|
-
/**
|
|
4
|
-
* Collects and provides metrics for SmartProxy with clean API
|
|
5
|
-
*/
|
|
6
|
-
export declare class MetricsCollector implements IMetrics {
|
|
7
|
-
private smartProxy;
|
|
8
|
-
private throughputTracker;
|
|
9
|
-
private routeThroughputTrackers;
|
|
10
|
-
private ipThroughputTrackers;
|
|
11
|
-
private requestTimestamps;
|
|
12
|
-
private totalRequests;
|
|
13
|
-
private connectionByteTrackers;
|
|
14
|
-
private samplingInterval?;
|
|
15
|
-
private connectionSubscription?;
|
|
16
|
-
private readonly sampleIntervalMs;
|
|
17
|
-
private readonly retentionSeconds;
|
|
18
|
-
private connectionDurations;
|
|
19
|
-
private bytesInArray;
|
|
20
|
-
private bytesOutArray;
|
|
21
|
-
constructor(smartProxy: SmartProxy, config?: {
|
|
22
|
-
sampleIntervalMs?: number;
|
|
23
|
-
retentionSeconds?: number;
|
|
24
|
-
});
|
|
25
|
-
connections: {
|
|
26
|
-
active: () => number;
|
|
27
|
-
total: () => number;
|
|
28
|
-
byRoute: () => Map<string, number>;
|
|
29
|
-
byIP: () => Map<string, number>;
|
|
30
|
-
topIPs: (limit?: number) => Array<{
|
|
31
|
-
ip: string;
|
|
32
|
-
count: number;
|
|
33
|
-
}>;
|
|
34
|
-
};
|
|
35
|
-
throughput: {
|
|
36
|
-
instant: () => IThroughputData;
|
|
37
|
-
recent: () => IThroughputData;
|
|
38
|
-
average: () => IThroughputData;
|
|
39
|
-
custom: (seconds: number) => IThroughputData;
|
|
40
|
-
history: (seconds: number) => Array<IThroughputHistoryPoint>;
|
|
41
|
-
byRoute: (windowSeconds?: number) => Map<string, IThroughputData>;
|
|
42
|
-
byIP: (windowSeconds?: number) => Map<string, IThroughputData>;
|
|
43
|
-
};
|
|
44
|
-
requests: {
|
|
45
|
-
perSecond: () => number;
|
|
46
|
-
perMinute: () => number;
|
|
47
|
-
total: () => number;
|
|
48
|
-
};
|
|
49
|
-
totals: {
|
|
50
|
-
bytesIn: () => number;
|
|
51
|
-
bytesOut: () => number;
|
|
52
|
-
connections: () => number;
|
|
53
|
-
};
|
|
54
|
-
private calculatePercentile;
|
|
55
|
-
percentiles: {
|
|
56
|
-
connectionDuration: () => {
|
|
57
|
-
p50: number;
|
|
58
|
-
p95: number;
|
|
59
|
-
p99: number;
|
|
60
|
-
};
|
|
61
|
-
bytesTransferred: () => {
|
|
62
|
-
in: {
|
|
63
|
-
p50: number;
|
|
64
|
-
p95: number;
|
|
65
|
-
p99: number;
|
|
66
|
-
};
|
|
67
|
-
out: {
|
|
68
|
-
p50: number;
|
|
69
|
-
p95: number;
|
|
70
|
-
p99: number;
|
|
71
|
-
};
|
|
72
|
-
};
|
|
73
|
-
};
|
|
74
|
-
/**
|
|
75
|
-
* Record a new request
|
|
76
|
-
*/
|
|
77
|
-
recordRequest(connectionId: string, routeName: string, remoteIP: string): void;
|
|
78
|
-
/**
|
|
79
|
-
* Record bytes transferred for a connection
|
|
80
|
-
*/
|
|
81
|
-
recordBytes(connectionId: string, bytesIn: number, bytesOut: number): void;
|
|
82
|
-
/**
|
|
83
|
-
* Clean up tracking for a closed connection
|
|
84
|
-
*/
|
|
85
|
-
removeConnection(connectionId: string): void;
|
|
86
|
-
/**
|
|
87
|
-
* Start the metrics collector
|
|
88
|
-
*/
|
|
89
|
-
start(): void;
|
|
90
|
-
/**
|
|
91
|
-
* Stop the metrics collector
|
|
92
|
-
*/
|
|
93
|
-
stop(): void;
|
|
94
|
-
/**
|
|
95
|
-
* Alias for stop() for compatibility
|
|
96
|
-
*/
|
|
97
|
-
destroy(): void;
|
|
98
|
-
}
|