@push.rocks/smartproxy 23.0.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 +10 -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/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- 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 +41 -11
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/plugins.ts +2 -0
- 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/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/smart-proxy/rust-binary-locator.ts +0 -112
|
@@ -1,355 +0,0 @@
|
|
|
1
|
-
import * as plugins from '../../plugins.js';
|
|
2
|
-
import { ThroughputTracker } from './throughput-tracker.js';
|
|
3
|
-
import { logger } from '../../core/utils/logger.js';
|
|
4
|
-
/**
|
|
5
|
-
* Collects and provides metrics for SmartProxy with clean API
|
|
6
|
-
*/
|
|
7
|
-
export class MetricsCollector {
|
|
8
|
-
constructor(smartProxy, config) {
|
|
9
|
-
this.smartProxy = smartProxy;
|
|
10
|
-
this.routeThroughputTrackers = new Map();
|
|
11
|
-
this.ipThroughputTrackers = new Map();
|
|
12
|
-
// Request tracking
|
|
13
|
-
this.requestTimestamps = [];
|
|
14
|
-
this.totalRequests = 0;
|
|
15
|
-
// Connection byte tracking for per-route/IP metrics
|
|
16
|
-
this.connectionByteTrackers = new Map();
|
|
17
|
-
// Track connection durations for percentile calculations
|
|
18
|
-
this.connectionDurations = [];
|
|
19
|
-
this.bytesInArray = [];
|
|
20
|
-
this.bytesOutArray = [];
|
|
21
|
-
// Connection metrics implementation
|
|
22
|
-
this.connections = {
|
|
23
|
-
active: () => {
|
|
24
|
-
return this.smartProxy.connectionManager.getConnectionCount();
|
|
25
|
-
},
|
|
26
|
-
total: () => {
|
|
27
|
-
const stats = this.smartProxy.connectionManager.getTerminationStats();
|
|
28
|
-
let total = this.smartProxy.connectionManager.getConnectionCount();
|
|
29
|
-
for (const reason in stats.incoming) {
|
|
30
|
-
total += stats.incoming[reason];
|
|
31
|
-
}
|
|
32
|
-
return total;
|
|
33
|
-
},
|
|
34
|
-
byRoute: () => {
|
|
35
|
-
const routeCounts = new Map();
|
|
36
|
-
const connections = this.smartProxy.connectionManager.getConnections();
|
|
37
|
-
for (const [_, record] of connections) {
|
|
38
|
-
const routeName = record.routeName ||
|
|
39
|
-
record.routeConfig?.name ||
|
|
40
|
-
'unknown';
|
|
41
|
-
const current = routeCounts.get(routeName) || 0;
|
|
42
|
-
routeCounts.set(routeName, current + 1);
|
|
43
|
-
}
|
|
44
|
-
return routeCounts;
|
|
45
|
-
},
|
|
46
|
-
byIP: () => {
|
|
47
|
-
const ipCounts = new Map();
|
|
48
|
-
for (const [_, record] of this.smartProxy.connectionManager.getConnections()) {
|
|
49
|
-
const ip = record.remoteIP;
|
|
50
|
-
const current = ipCounts.get(ip) || 0;
|
|
51
|
-
ipCounts.set(ip, current + 1);
|
|
52
|
-
}
|
|
53
|
-
return ipCounts;
|
|
54
|
-
},
|
|
55
|
-
topIPs: (limit = 10) => {
|
|
56
|
-
const ipCounts = this.connections.byIP();
|
|
57
|
-
return Array.from(ipCounts.entries())
|
|
58
|
-
.sort((a, b) => b[1] - a[1])
|
|
59
|
-
.slice(0, limit)
|
|
60
|
-
.map(([ip, count]) => ({ ip, count }));
|
|
61
|
-
}
|
|
62
|
-
};
|
|
63
|
-
// Throughput metrics implementation
|
|
64
|
-
this.throughput = {
|
|
65
|
-
instant: () => {
|
|
66
|
-
return this.throughputTracker.getRate(1);
|
|
67
|
-
},
|
|
68
|
-
recent: () => {
|
|
69
|
-
return this.throughputTracker.getRate(10);
|
|
70
|
-
},
|
|
71
|
-
average: () => {
|
|
72
|
-
return this.throughputTracker.getRate(60);
|
|
73
|
-
},
|
|
74
|
-
custom: (seconds) => {
|
|
75
|
-
return this.throughputTracker.getRate(seconds);
|
|
76
|
-
},
|
|
77
|
-
history: (seconds) => {
|
|
78
|
-
return this.throughputTracker.getHistory(seconds);
|
|
79
|
-
},
|
|
80
|
-
byRoute: (windowSeconds = 1) => {
|
|
81
|
-
const routeThroughput = new Map();
|
|
82
|
-
// Get throughput from each route's dedicated tracker
|
|
83
|
-
for (const [route, tracker] of this.routeThroughputTrackers) {
|
|
84
|
-
const rate = tracker.getRate(windowSeconds);
|
|
85
|
-
if (rate.in > 0 || rate.out > 0) {
|
|
86
|
-
routeThroughput.set(route, rate);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
return routeThroughput;
|
|
90
|
-
},
|
|
91
|
-
byIP: (windowSeconds = 1) => {
|
|
92
|
-
const ipThroughput = new Map();
|
|
93
|
-
// Get throughput from each IP's dedicated tracker
|
|
94
|
-
for (const [ip, tracker] of this.ipThroughputTrackers) {
|
|
95
|
-
const rate = tracker.getRate(windowSeconds);
|
|
96
|
-
if (rate.in > 0 || rate.out > 0) {
|
|
97
|
-
ipThroughput.set(ip, rate);
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
return ipThroughput;
|
|
101
|
-
}
|
|
102
|
-
};
|
|
103
|
-
// Request metrics implementation
|
|
104
|
-
this.requests = {
|
|
105
|
-
perSecond: () => {
|
|
106
|
-
const now = Date.now();
|
|
107
|
-
const oneSecondAgo = now - 1000;
|
|
108
|
-
// Clean old timestamps
|
|
109
|
-
this.requestTimestamps = this.requestTimestamps.filter(ts => ts > now - 60000);
|
|
110
|
-
// Count requests in last second
|
|
111
|
-
const recentRequests = this.requestTimestamps.filter(ts => ts > oneSecondAgo);
|
|
112
|
-
return recentRequests.length;
|
|
113
|
-
},
|
|
114
|
-
perMinute: () => {
|
|
115
|
-
const now = Date.now();
|
|
116
|
-
const oneMinuteAgo = now - 60000;
|
|
117
|
-
// Count requests in last minute
|
|
118
|
-
const recentRequests = this.requestTimestamps.filter(ts => ts > oneMinuteAgo);
|
|
119
|
-
return recentRequests.length;
|
|
120
|
-
},
|
|
121
|
-
total: () => {
|
|
122
|
-
return this.totalRequests;
|
|
123
|
-
}
|
|
124
|
-
};
|
|
125
|
-
// Totals implementation
|
|
126
|
-
this.totals = {
|
|
127
|
-
bytesIn: () => {
|
|
128
|
-
let total = 0;
|
|
129
|
-
// Sum from all active connections
|
|
130
|
-
for (const [_, record] of this.smartProxy.connectionManager.getConnections()) {
|
|
131
|
-
total += record.bytesReceived;
|
|
132
|
-
}
|
|
133
|
-
// TODO: Add historical data from terminated connections
|
|
134
|
-
return total;
|
|
135
|
-
},
|
|
136
|
-
bytesOut: () => {
|
|
137
|
-
let total = 0;
|
|
138
|
-
// Sum from all active connections
|
|
139
|
-
for (const [_, record] of this.smartProxy.connectionManager.getConnections()) {
|
|
140
|
-
total += record.bytesSent;
|
|
141
|
-
}
|
|
142
|
-
// TODO: Add historical data from terminated connections
|
|
143
|
-
return total;
|
|
144
|
-
},
|
|
145
|
-
connections: () => {
|
|
146
|
-
return this.connections.total();
|
|
147
|
-
}
|
|
148
|
-
};
|
|
149
|
-
// Percentiles implementation
|
|
150
|
-
this.percentiles = {
|
|
151
|
-
connectionDuration: () => {
|
|
152
|
-
return {
|
|
153
|
-
p50: this.calculatePercentile(this.connectionDurations, 0.5),
|
|
154
|
-
p95: this.calculatePercentile(this.connectionDurations, 0.95),
|
|
155
|
-
p99: this.calculatePercentile(this.connectionDurations, 0.99)
|
|
156
|
-
};
|
|
157
|
-
},
|
|
158
|
-
bytesTransferred: () => {
|
|
159
|
-
return {
|
|
160
|
-
in: {
|
|
161
|
-
p50: this.calculatePercentile(this.bytesInArray, 0.5),
|
|
162
|
-
p95: this.calculatePercentile(this.bytesInArray, 0.95),
|
|
163
|
-
p99: this.calculatePercentile(this.bytesInArray, 0.99)
|
|
164
|
-
},
|
|
165
|
-
out: {
|
|
166
|
-
p50: this.calculatePercentile(this.bytesOutArray, 0.5),
|
|
167
|
-
p95: this.calculatePercentile(this.bytesOutArray, 0.95),
|
|
168
|
-
p99: this.calculatePercentile(this.bytesOutArray, 0.99)
|
|
169
|
-
}
|
|
170
|
-
};
|
|
171
|
-
}
|
|
172
|
-
};
|
|
173
|
-
this.sampleIntervalMs = config?.sampleIntervalMs || 1000;
|
|
174
|
-
this.retentionSeconds = config?.retentionSeconds || 3600;
|
|
175
|
-
this.throughputTracker = new ThroughputTracker(this.retentionSeconds);
|
|
176
|
-
}
|
|
177
|
-
// Helper to calculate percentiles from an array
|
|
178
|
-
calculatePercentile(arr, percentile) {
|
|
179
|
-
if (arr.length === 0)
|
|
180
|
-
return 0;
|
|
181
|
-
const sorted = [...arr].sort((a, b) => a - b);
|
|
182
|
-
const index = Math.floor((sorted.length - 1) * percentile);
|
|
183
|
-
return sorted[index];
|
|
184
|
-
}
|
|
185
|
-
/**
|
|
186
|
-
* Record a new request
|
|
187
|
-
*/
|
|
188
|
-
recordRequest(connectionId, routeName, remoteIP) {
|
|
189
|
-
const now = Date.now();
|
|
190
|
-
this.requestTimestamps.push(now);
|
|
191
|
-
this.totalRequests++;
|
|
192
|
-
// Initialize byte tracker for this connection
|
|
193
|
-
this.connectionByteTrackers.set(connectionId, {
|
|
194
|
-
connectionId,
|
|
195
|
-
routeName,
|
|
196
|
-
remoteIP,
|
|
197
|
-
bytesIn: 0,
|
|
198
|
-
bytesOut: 0,
|
|
199
|
-
startTime: now,
|
|
200
|
-
lastUpdate: now
|
|
201
|
-
});
|
|
202
|
-
// Cleanup old request timestamps
|
|
203
|
-
if (this.requestTimestamps.length > 5000) {
|
|
204
|
-
// First try to clean up old timestamps (older than 1 minute)
|
|
205
|
-
const cutoff = now - 60000;
|
|
206
|
-
this.requestTimestamps = this.requestTimestamps.filter(ts => ts > cutoff);
|
|
207
|
-
// If still too many, enforce hard cap of 5000 most recent
|
|
208
|
-
if (this.requestTimestamps.length > 5000) {
|
|
209
|
-
this.requestTimestamps = this.requestTimestamps.slice(-5000);
|
|
210
|
-
}
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Record bytes transferred for a connection
|
|
215
|
-
*/
|
|
216
|
-
recordBytes(connectionId, bytesIn, bytesOut) {
|
|
217
|
-
// Update global throughput tracker
|
|
218
|
-
this.throughputTracker.recordBytes(bytesIn, bytesOut);
|
|
219
|
-
// Update connection-specific tracker
|
|
220
|
-
const tracker = this.connectionByteTrackers.get(connectionId);
|
|
221
|
-
if (tracker) {
|
|
222
|
-
tracker.bytesIn += bytesIn;
|
|
223
|
-
tracker.bytesOut += bytesOut;
|
|
224
|
-
tracker.lastUpdate = Date.now();
|
|
225
|
-
// Update per-route throughput tracker
|
|
226
|
-
let routeTracker = this.routeThroughputTrackers.get(tracker.routeName);
|
|
227
|
-
if (!routeTracker) {
|
|
228
|
-
routeTracker = new ThroughputTracker(this.retentionSeconds);
|
|
229
|
-
this.routeThroughputTrackers.set(tracker.routeName, routeTracker);
|
|
230
|
-
}
|
|
231
|
-
routeTracker.recordBytes(bytesIn, bytesOut);
|
|
232
|
-
// Update per-IP throughput tracker
|
|
233
|
-
let ipTracker = this.ipThroughputTrackers.get(tracker.remoteIP);
|
|
234
|
-
if (!ipTracker) {
|
|
235
|
-
ipTracker = new ThroughputTracker(this.retentionSeconds);
|
|
236
|
-
this.ipThroughputTrackers.set(tracker.remoteIP, ipTracker);
|
|
237
|
-
}
|
|
238
|
-
ipTracker.recordBytes(bytesIn, bytesOut);
|
|
239
|
-
}
|
|
240
|
-
}
|
|
241
|
-
/**
|
|
242
|
-
* Clean up tracking for a closed connection
|
|
243
|
-
*/
|
|
244
|
-
removeConnection(connectionId) {
|
|
245
|
-
const tracker = this.connectionByteTrackers.get(connectionId);
|
|
246
|
-
if (tracker) {
|
|
247
|
-
// Calculate connection duration
|
|
248
|
-
const duration = Date.now() - tracker.startTime;
|
|
249
|
-
// Add to arrays for percentile calculations (bounded to prevent memory growth)
|
|
250
|
-
const MAX_SAMPLES = 5000;
|
|
251
|
-
this.connectionDurations.push(duration);
|
|
252
|
-
if (this.connectionDurations.length > MAX_SAMPLES) {
|
|
253
|
-
this.connectionDurations.shift();
|
|
254
|
-
}
|
|
255
|
-
this.bytesInArray.push(tracker.bytesIn);
|
|
256
|
-
if (this.bytesInArray.length > MAX_SAMPLES) {
|
|
257
|
-
this.bytesInArray.shift();
|
|
258
|
-
}
|
|
259
|
-
this.bytesOutArray.push(tracker.bytesOut);
|
|
260
|
-
if (this.bytesOutArray.length > MAX_SAMPLES) {
|
|
261
|
-
this.bytesOutArray.shift();
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
this.connectionByteTrackers.delete(connectionId);
|
|
265
|
-
}
|
|
266
|
-
/**
|
|
267
|
-
* Start the metrics collector
|
|
268
|
-
*/
|
|
269
|
-
start() {
|
|
270
|
-
if (!this.smartProxy.routeConnectionHandler) {
|
|
271
|
-
throw new Error('MetricsCollector: RouteConnectionHandler not available');
|
|
272
|
-
}
|
|
273
|
-
// Start periodic sampling
|
|
274
|
-
this.samplingInterval = setInterval(() => {
|
|
275
|
-
// Sample global throughput
|
|
276
|
-
this.throughputTracker.takeSample();
|
|
277
|
-
// Sample per-route throughput
|
|
278
|
-
for (const [_, tracker] of this.routeThroughputTrackers) {
|
|
279
|
-
tracker.takeSample();
|
|
280
|
-
}
|
|
281
|
-
// Sample per-IP throughput
|
|
282
|
-
for (const [_, tracker] of this.ipThroughputTrackers) {
|
|
283
|
-
tracker.takeSample();
|
|
284
|
-
}
|
|
285
|
-
// Clean up old connection trackers (connections closed more than 5 minutes ago)
|
|
286
|
-
const cutoff = Date.now() - 300000;
|
|
287
|
-
for (const [id, tracker] of this.connectionByteTrackers) {
|
|
288
|
-
if (tracker.lastUpdate < cutoff) {
|
|
289
|
-
this.connectionByteTrackers.delete(id);
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
// Clean up unused route trackers
|
|
293
|
-
const activeRoutes = new Set(Array.from(this.connectionByteTrackers.values()).map(t => t.routeName));
|
|
294
|
-
for (const [route, _] of this.routeThroughputTrackers) {
|
|
295
|
-
if (!activeRoutes.has(route)) {
|
|
296
|
-
this.routeThroughputTrackers.delete(route);
|
|
297
|
-
}
|
|
298
|
-
}
|
|
299
|
-
// Clean up unused IP trackers
|
|
300
|
-
const activeIPs = new Set(Array.from(this.connectionByteTrackers.values()).map(t => t.remoteIP));
|
|
301
|
-
for (const [ip, _] of this.ipThroughputTrackers) {
|
|
302
|
-
if (!activeIPs.has(ip)) {
|
|
303
|
-
this.ipThroughputTrackers.delete(ip);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
}, this.sampleIntervalMs);
|
|
307
|
-
// Unref the interval so it doesn't keep the process alive
|
|
308
|
-
if (this.samplingInterval.unref) {
|
|
309
|
-
this.samplingInterval.unref();
|
|
310
|
-
}
|
|
311
|
-
// Subscribe to new connections
|
|
312
|
-
this.connectionSubscription = this.smartProxy.routeConnectionHandler.newConnectionSubject.subscribe({
|
|
313
|
-
next: (record) => {
|
|
314
|
-
const routeName = record.routeConfig?.name || 'unknown';
|
|
315
|
-
this.recordRequest(record.id, routeName, record.remoteIP);
|
|
316
|
-
if (this.smartProxy.settings?.enableDetailedLogging) {
|
|
317
|
-
logger.log('debug', `MetricsCollector: New connection recorded`, {
|
|
318
|
-
connectionId: record.id,
|
|
319
|
-
remoteIP: record.remoteIP,
|
|
320
|
-
routeName,
|
|
321
|
-
component: 'metrics'
|
|
322
|
-
});
|
|
323
|
-
}
|
|
324
|
-
},
|
|
325
|
-
error: (err) => {
|
|
326
|
-
logger.log('error', `MetricsCollector: Error in connection subscription`, {
|
|
327
|
-
error: err.message,
|
|
328
|
-
component: 'metrics'
|
|
329
|
-
});
|
|
330
|
-
}
|
|
331
|
-
});
|
|
332
|
-
logger.log('debug', 'MetricsCollector started', { component: 'metrics' });
|
|
333
|
-
}
|
|
334
|
-
/**
|
|
335
|
-
* Stop the metrics collector
|
|
336
|
-
*/
|
|
337
|
-
stop() {
|
|
338
|
-
if (this.samplingInterval) {
|
|
339
|
-
clearInterval(this.samplingInterval);
|
|
340
|
-
this.samplingInterval = undefined;
|
|
341
|
-
}
|
|
342
|
-
if (this.connectionSubscription) {
|
|
343
|
-
this.connectionSubscription.unsubscribe();
|
|
344
|
-
this.connectionSubscription = undefined;
|
|
345
|
-
}
|
|
346
|
-
logger.log('debug', 'MetricsCollector stopped', { component: 'metrics' });
|
|
347
|
-
}
|
|
348
|
-
/**
|
|
349
|
-
* Alias for stop() for compatibility
|
|
350
|
-
*/
|
|
351
|
-
destroy() {
|
|
352
|
-
this.stop();
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0cmljcy1jb2xsZWN0b3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L21ldHJpY3MtY29sbGVjdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFRNUMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDNUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRXBEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGdCQUFnQjtJQTBCM0IsWUFDVSxVQUFzQixFQUM5QixNQUdDO1FBSk8sZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQXhCeEIsNEJBQXVCLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7UUFDL0QseUJBQW9CLEdBQUcsSUFBSSxHQUFHLEVBQTZCLENBQUM7UUFFcEUsbUJBQW1CO1FBQ1gsc0JBQWlCLEdBQWEsRUFBRSxDQUFDO1FBQ2pDLGtCQUFhLEdBQVcsQ0FBQyxDQUFDO1FBRWxDLG9EQUFvRDtRQUM1QywyQkFBc0IsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztRQVVqRSx5REFBeUQ7UUFDakQsd0JBQW1CLEdBQWEsRUFBRSxDQUFDO1FBQ25DLGlCQUFZLEdBQWEsRUFBRSxDQUFDO1FBQzVCLGtCQUFhLEdBQWEsRUFBRSxDQUFDO1FBY3JDLG9DQUFvQztRQUM3QixnQkFBVyxHQUFHO1lBQ25CLE1BQU0sRUFBRSxHQUFXLEVBQUU7Z0JBQ25CLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDO1lBQ2hFLENBQUM7WUFFRCxLQUFLLEVBQUUsR0FBVyxFQUFFO2dCQUNsQixNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixFQUFFLENBQUM7Z0JBQ3RFLElBQUksS0FBSyxHQUFH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
|
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import type { NfTablesStatus } from '../nftables-proxy/models/interfaces.js';
|
|
2
|
-
import type { IRouteConfig } from './models/route-types.js';
|
|
3
|
-
import type { SmartProxy } from './smart-proxy.js';
|
|
4
|
-
/**
|
|
5
|
-
* Manages NFTables rules based on SmartProxy route configurations
|
|
6
|
-
*
|
|
7
|
-
* This class bridges the gap between SmartProxy routes and the NFTablesProxy,
|
|
8
|
-
* allowing high-performance kernel-level packet forwarding for routes that
|
|
9
|
-
* specify NFTables as their forwarding engine.
|
|
10
|
-
*/
|
|
11
|
-
export declare class NFTablesManager {
|
|
12
|
-
private smartProxy;
|
|
13
|
-
private rulesMap;
|
|
14
|
-
/**
|
|
15
|
-
* Creates a new NFTablesManager
|
|
16
|
-
*
|
|
17
|
-
* @param smartProxy The SmartProxy instance
|
|
18
|
-
*/
|
|
19
|
-
constructor(smartProxy: SmartProxy);
|
|
20
|
-
/**
|
|
21
|
-
* Provision NFTables rules for a route
|
|
22
|
-
*
|
|
23
|
-
* @param route The route configuration
|
|
24
|
-
* @returns A promise that resolves to true if successful, false otherwise
|
|
25
|
-
*/
|
|
26
|
-
provisionRoute(route: IRouteConfig): Promise<boolean>;
|
|
27
|
-
/**
|
|
28
|
-
* Remove NFTables rules for a route
|
|
29
|
-
*
|
|
30
|
-
* @param route The route configuration
|
|
31
|
-
* @returns A promise that resolves to true if successful, false otherwise
|
|
32
|
-
*/
|
|
33
|
-
deprovisionRoute(route: IRouteConfig): Promise<boolean>;
|
|
34
|
-
/**
|
|
35
|
-
* Update NFTables rules when route changes
|
|
36
|
-
*
|
|
37
|
-
* @param oldRoute The previous route configuration
|
|
38
|
-
* @param newRoute The new route configuration
|
|
39
|
-
* @returns A promise that resolves to true if successful, false otherwise
|
|
40
|
-
*/
|
|
41
|
-
updateRoute(oldRoute: IRouteConfig, newRoute: IRouteConfig): Promise<boolean>;
|
|
42
|
-
/**
|
|
43
|
-
* Generate a unique ID for a route
|
|
44
|
-
*
|
|
45
|
-
* @param route The route configuration
|
|
46
|
-
* @returns A unique ID string
|
|
47
|
-
*/
|
|
48
|
-
private generateRouteId;
|
|
49
|
-
/**
|
|
50
|
-
* Create NFTablesProxy options from a route configuration
|
|
51
|
-
*
|
|
52
|
-
* @param route The route configuration
|
|
53
|
-
* @returns NFTableProxyOptions object
|
|
54
|
-
*/
|
|
55
|
-
private createNfTablesOptions;
|
|
56
|
-
/**
|
|
57
|
-
* Expand port range specifications
|
|
58
|
-
*
|
|
59
|
-
* @param ports The port range specification
|
|
60
|
-
* @returns Expanded port range
|
|
61
|
-
*/
|
|
62
|
-
private expandPortRange;
|
|
63
|
-
/**
|
|
64
|
-
* Get status of all managed rules
|
|
65
|
-
*
|
|
66
|
-
* @returns A promise that resolves to a record of NFTables status objects
|
|
67
|
-
*/
|
|
68
|
-
getStatus(): Promise<Record<string, NfTablesStatus>>;
|
|
69
|
-
/**
|
|
70
|
-
* Check if a route is currently provisioned
|
|
71
|
-
*
|
|
72
|
-
* @param route The route configuration
|
|
73
|
-
* @returns True if the route is provisioned, false otherwise
|
|
74
|
-
*/
|
|
75
|
-
isRouteProvisioned(route: IRouteConfig): boolean;
|
|
76
|
-
/**
|
|
77
|
-
* Stop all NFTables rules
|
|
78
|
-
*
|
|
79
|
-
* @returns A promise that resolves when all rules have been stopped
|
|
80
|
-
*/
|
|
81
|
-
stop(): Promise<void>;
|
|
82
|
-
}
|