@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.
Files changed (196) hide show
  1. package/changelog.md +18 -0
  2. package/dist_rust/{rustproxy → rustproxy_linux_amd64} +0 -0
  3. package/dist_rust/rustproxy_linux_arm64 +0 -0
  4. package/dist_ts/00_commitinfo_data.js +1 -1
  5. package/dist_ts/index.d.ts +0 -1
  6. package/dist_ts/index.js +1 -3
  7. package/dist_ts/plugins.d.ts +2 -1
  8. package/dist_ts/plugins.js +3 -2
  9. package/dist_ts/proxies/index.d.ts +0 -1
  10. package/dist_ts/proxies/index.js +1 -3
  11. package/dist_ts/proxies/smart-proxy/models/route-types.js +1 -1
  12. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.d.ts +9 -21
  13. package/dist_ts/proxies/smart-proxy/rust-proxy-bridge.js +83 -212
  14. package/dist_ts/proxies/smart-proxy/smart-proxy.js +2 -3
  15. package/npmextra.json +3 -0
  16. package/package.json +13 -11
  17. package/readme.md +35 -31
  18. package/ts/00_commitinfo_data.ts +1 -1
  19. package/ts/index.ts +0 -3
  20. package/ts/plugins.ts +2 -0
  21. package/ts/proxies/index.ts +0 -3
  22. package/ts/proxies/smart-proxy/models/route-types.ts +0 -2
  23. package/ts/proxies/smart-proxy/rust-proxy-bridge.ts +102 -233
  24. package/ts/proxies/smart-proxy/smart-proxy.ts +1 -2
  25. package/dist_ts/common/eventUtils.d.ts +0 -14
  26. package/dist_ts/common/eventUtils.js +0 -20
  27. package/dist_ts/common/types.d.ts +0 -82
  28. package/dist_ts/common/types.js +0 -15
  29. package/dist_ts/core/utils/event-system.d.ts +0 -200
  30. package/dist_ts/core/utils/event-system.js +0 -224
  31. package/dist_ts/core/utils/event-utils.d.ts +0 -15
  32. package/dist_ts/core/utils/event-utils.js +0 -11
  33. package/dist_ts/core/utils/route-manager.d.ts +0 -88
  34. package/dist_ts/core/utils/route-manager.js +0 -342
  35. package/dist_ts/core/utils/route-utils.d.ts +0 -28
  36. package/dist_ts/core/utils/route-utils.js +0 -67
  37. package/dist_ts/detection/detectors/http-detector-v2.d.ts +0 -33
  38. package/dist_ts/detection/detectors/http-detector-v2.js +0 -87
  39. package/dist_ts/detection/detectors/tls-detector-v2.d.ts +0 -33
  40. package/dist_ts/detection/detectors/tls-detector-v2.js +0 -80
  41. package/dist_ts/detection/protocol-detector-v2.d.ts +0 -46
  42. package/dist_ts/detection/protocol-detector-v2.js +0 -116
  43. package/dist_ts/forwarding/config/forwarding-types.d.ts +0 -42
  44. package/dist_ts/forwarding/config/forwarding-types.js +0 -18
  45. package/dist_ts/forwarding/config/index.d.ts +0 -9
  46. package/dist_ts/forwarding/config/index.js +0 -10
  47. package/dist_ts/forwarding/factory/forwarding-factory.d.ts +0 -25
  48. package/dist_ts/forwarding/factory/forwarding-factory.js +0 -172
  49. package/dist_ts/forwarding/factory/index.d.ts +0 -4
  50. package/dist_ts/forwarding/factory/index.js +0 -5
  51. package/dist_ts/forwarding/handlers/base-handler.d.ts +0 -62
  52. package/dist_ts/forwarding/handlers/base-handler.js +0 -121
  53. package/dist_ts/forwarding/handlers/http-handler.d.ts +0 -30
  54. package/dist_ts/forwarding/handlers/http-handler.js +0 -143
  55. package/dist_ts/forwarding/handlers/https-passthrough-handler.d.ts +0 -29
  56. package/dist_ts/forwarding/handlers/https-passthrough-handler.js +0 -156
  57. package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.d.ts +0 -36
  58. package/dist_ts/forwarding/handlers/https-terminate-to-http-handler.js +0 -276
  59. package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.d.ts +0 -35
  60. package/dist_ts/forwarding/handlers/https-terminate-to-https-handler.js +0 -261
  61. package/dist_ts/forwarding/handlers/index.d.ts +0 -8
  62. package/dist_ts/forwarding/handlers/index.js +0 -9
  63. package/dist_ts/forwarding/index.d.ts +0 -13
  64. package/dist_ts/forwarding/index.js +0 -16
  65. package/dist_ts/http/index.d.ts +0 -5
  66. package/dist_ts/http/index.js +0 -8
  67. package/dist_ts/http/models/http-types.d.ts +0 -6
  68. package/dist_ts/http/models/http-types.js +0 -7
  69. package/dist_ts/http/router/index.d.ts +0 -8
  70. package/dist_ts/http/router/index.js +0 -7
  71. package/dist_ts/http/router/proxy-router.d.ts +0 -115
  72. package/dist_ts/http/router/proxy-router.js +0 -325
  73. package/dist_ts/http/router/route-router.d.ts +0 -108
  74. package/dist_ts/http/router/route-router.js +0 -393
  75. package/dist_ts/protocols/tls/constants.d.ts +0 -122
  76. package/dist_ts/protocols/tls/constants.js +0 -135
  77. package/dist_ts/protocols/tls/parser.d.ts +0 -53
  78. package/dist_ts/protocols/tls/parser.js +0 -294
  79. package/dist_ts/protocols/tls/types.d.ts +0 -65
  80. package/dist_ts/protocols/tls/types.js +0 -5
  81. package/dist_ts/proxies/http-proxy/certificate-manager.d.ts +0 -95
  82. package/dist_ts/proxies/http-proxy/certificate-manager.js +0 -214
  83. package/dist_ts/proxies/http-proxy/connection-pool.d.ts +0 -47
  84. package/dist_ts/proxies/http-proxy/connection-pool.js +0 -195
  85. package/dist_ts/proxies/http-proxy/context-creator.d.ts +0 -34
  86. package/dist_ts/proxies/http-proxy/context-creator.js +0 -108
  87. package/dist_ts/proxies/http-proxy/default-certificates.d.ts +0 -54
  88. package/dist_ts/proxies/http-proxy/default-certificates.js +0 -127
  89. package/dist_ts/proxies/http-proxy/function-cache.d.ts +0 -95
  90. package/dist_ts/proxies/http-proxy/function-cache.js +0 -215
  91. package/dist_ts/proxies/http-proxy/handlers/index.d.ts +0 -4
  92. package/dist_ts/proxies/http-proxy/handlers/index.js +0 -6
  93. package/dist_ts/proxies/http-proxy/handlers/redirect-handler.d.ts +0 -18
  94. package/dist_ts/proxies/http-proxy/handlers/redirect-handler.js +0 -78
  95. package/dist_ts/proxies/http-proxy/handlers/static-handler.d.ts +0 -19
  96. package/dist_ts/proxies/http-proxy/handlers/static-handler.js +0 -211
  97. package/dist_ts/proxies/http-proxy/http-proxy.d.ts +0 -117
  98. package/dist_ts/proxies/http-proxy/http-proxy.js +0 -521
  99. package/dist_ts/proxies/http-proxy/http-request-handler.d.ts +0 -40
  100. package/dist_ts/proxies/http-proxy/http-request-handler.js +0 -257
  101. package/dist_ts/proxies/http-proxy/http2-request-handler.d.ts +0 -24
  102. package/dist_ts/proxies/http-proxy/http2-request-handler.js +0 -201
  103. package/dist_ts/proxies/http-proxy/index.d.ts +0 -14
  104. package/dist_ts/proxies/http-proxy/index.js +0 -16
  105. package/dist_ts/proxies/http-proxy/models/http-types.d.ts +0 -117
  106. package/dist_ts/proxies/http-proxy/models/http-types.js +0 -92
  107. package/dist_ts/proxies/http-proxy/models/index.d.ts +0 -5
  108. package/dist_ts/proxies/http-proxy/models/index.js +0 -6
  109. package/dist_ts/proxies/http-proxy/models/types.d.ts +0 -75
  110. package/dist_ts/proxies/http-proxy/models/types.js +0 -35
  111. package/dist_ts/proxies/http-proxy/request-handler.d.ts +0 -97
  112. package/dist_ts/proxies/http-proxy/request-handler.js +0 -737
  113. package/dist_ts/proxies/http-proxy/security-manager.d.ts +0 -98
  114. package/dist_ts/proxies/http-proxy/security-manager.js +0 -341
  115. package/dist_ts/proxies/http-proxy/websocket-handler.d.ts +0 -50
  116. package/dist_ts/proxies/http-proxy/websocket-handler.js +0 -505
  117. package/dist_ts/proxies/nftables-proxy/index.d.ts +0 -6
  118. package/dist_ts/proxies/nftables-proxy/index.js +0 -7
  119. package/dist_ts/proxies/nftables-proxy/models/errors.d.ts +0 -15
  120. package/dist_ts/proxies/nftables-proxy/models/errors.js +0 -28
  121. package/dist_ts/proxies/nftables-proxy/models/index.d.ts +0 -5
  122. package/dist_ts/proxies/nftables-proxy/models/index.js +0 -6
  123. package/dist_ts/proxies/nftables-proxy/models/interfaces.d.ts +0 -75
  124. package/dist_ts/proxies/nftables-proxy/models/interfaces.js +0 -5
  125. package/dist_ts/proxies/nftables-proxy/nftables-proxy.d.ts +0 -124
  126. package/dist_ts/proxies/nftables-proxy/nftables-proxy.js +0 -1374
  127. package/dist_ts/proxies/nftables-proxy/utils/index.d.ts +0 -9
  128. package/dist_ts/proxies/nftables-proxy/utils/index.js +0 -12
  129. package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.d.ts +0 -66
  130. package/dist_ts/proxies/nftables-proxy/utils/nft-command-executor.js +0 -131
  131. package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.d.ts +0 -39
  132. package/dist_ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.js +0 -112
  133. package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.d.ts +0 -59
  134. package/dist_ts/proxies/nftables-proxy/utils/nft-rule-validator.js +0 -130
  135. package/dist_ts/proxies/smart-proxy/acme-state-manager.d.ts +0 -42
  136. package/dist_ts/proxies/smart-proxy/acme-state-manager.js +0 -101
  137. package/dist_ts/proxies/smart-proxy/cert-store.d.ts +0 -10
  138. package/dist_ts/proxies/smart-proxy/cert-store.js +0 -72
  139. package/dist_ts/proxies/smart-proxy/certificate-manager.d.ts +0 -164
  140. package/dist_ts/proxies/smart-proxy/certificate-manager.js +0 -745
  141. package/dist_ts/proxies/smart-proxy/connection-manager.d.ts +0 -128
  142. package/dist_ts/proxies/smart-proxy/connection-manager.js +0 -689
  143. package/dist_ts/proxies/smart-proxy/http-proxy-bridge.d.ts +0 -43
  144. package/dist_ts/proxies/smart-proxy/http-proxy-bridge.js +0 -180
  145. package/dist_ts/proxies/smart-proxy/metrics-collector.d.ts +0 -98
  146. package/dist_ts/proxies/smart-proxy/metrics-collector.js +0 -355
  147. package/dist_ts/proxies/smart-proxy/nftables-manager.d.ts +0 -82
  148. package/dist_ts/proxies/smart-proxy/nftables-manager.js +0 -237
  149. package/dist_ts/proxies/smart-proxy/port-manager.d.ts +0 -117
  150. package/dist_ts/proxies/smart-proxy/port-manager.js +0 -318
  151. package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +0 -60
  152. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +0 -1407
  153. package/dist_ts/proxies/smart-proxy/route-manager.d.ts +0 -112
  154. package/dist_ts/proxies/smart-proxy/route-manager.js +0 -453
  155. package/dist_ts/proxies/smart-proxy/route-orchestrator.d.ts +0 -56
  156. package/dist_ts/proxies/smart-proxy/route-orchestrator.js +0 -204
  157. package/dist_ts/proxies/smart-proxy/rust-binary-locator.d.ts +0 -23
  158. package/dist_ts/proxies/smart-proxy/rust-binary-locator.js +0 -104
  159. package/dist_ts/proxies/smart-proxy/security-manager.d.ts +0 -74
  160. package/dist_ts/proxies/smart-proxy/security-manager.js +0 -227
  161. package/dist_ts/proxies/smart-proxy/throughput-tracker.d.ts +0 -36
  162. package/dist_ts/proxies/smart-proxy/throughput-tracker.js +0 -115
  163. package/dist_ts/proxies/smart-proxy/timeout-manager.d.ts +0 -48
  164. package/dist_ts/proxies/smart-proxy/timeout-manager.js +0 -158
  165. package/dist_ts/proxies/smart-proxy/tls-manager.d.ts +0 -50
  166. package/dist_ts/proxies/smart-proxy/tls-manager.js +0 -110
  167. package/dist_ts/proxies/smart-proxy/utils/route-patterns.d.ts +0 -161
  168. package/dist_ts/proxies/smart-proxy/utils/route-patterns.js +0 -282
  169. package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +0 -73
  170. package/dist_ts/proxies/smart-proxy/utils/route-validators.js +0 -259
  171. package/dist_ts/routing/router/proxy-router.d.ts +0 -115
  172. package/dist_ts/routing/router/proxy-router.js +0 -325
  173. package/dist_ts/routing/router/route-router.d.ts +0 -108
  174. package/dist_ts/routing/router/route-router.js +0 -393
  175. package/dist_ts/tls/alerts/index.d.ts +0 -4
  176. package/dist_ts/tls/alerts/index.js +0 -5
  177. package/dist_ts/tls/alerts/tls-alert.d.ts +0 -150
  178. package/dist_ts/tls/alerts/tls-alert.js +0 -226
  179. package/dist_ts/tls/sni/client-hello-parser.d.ts +0 -100
  180. package/dist_ts/tls/sni/client-hello-parser.js +0 -464
  181. package/dist_ts/tls/sni/sni-extraction.d.ts +0 -58
  182. package/dist_ts/tls/sni/sni-extraction.js +0 -275
  183. package/dist_ts/tls/utils/index.d.ts +0 -4
  184. package/dist_ts/tls/utils/index.js +0 -5
  185. package/dist_ts/tls/utils/tls-utils.d.ts +0 -49
  186. package/dist_ts/tls/utils/tls-utils.js +0 -75
  187. package/ts/proxies/nftables-proxy/index.ts +0 -6
  188. package/ts/proxies/nftables-proxy/models/errors.ts +0 -30
  189. package/ts/proxies/nftables-proxy/models/index.ts +0 -5
  190. package/ts/proxies/nftables-proxy/models/interfaces.ts +0 -94
  191. package/ts/proxies/nftables-proxy/nftables-proxy.ts +0 -1754
  192. package/ts/proxies/nftables-proxy/utils/index.ts +0 -38
  193. package/ts/proxies/nftables-proxy/utils/nft-command-executor.ts +0 -162
  194. package/ts/proxies/nftables-proxy/utils/nft-port-spec-normalizer.ts +0 -125
  195. package/ts/proxies/nftables-proxy/utils/nft-rule-validator.ts +0 -156
  196. 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
- }