@push.rocks/smartproxy 16.0.2 → 16.0.3

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 (115) hide show
  1. package/dist_ts/00_commitinfo_data.js +1 -1
  2. package/dist_ts/core/models/index.d.ts +2 -0
  3. package/dist_ts/core/models/index.js +3 -1
  4. package/dist_ts/core/models/route-context.d.ts +62 -0
  5. package/dist_ts/core/models/route-context.js +43 -0
  6. package/dist_ts/core/models/socket-augmentation.d.ts +12 -0
  7. package/dist_ts/core/models/socket-augmentation.js +18 -0
  8. package/dist_ts/core/utils/event-system.d.ts +200 -0
  9. package/dist_ts/core/utils/event-system.js +224 -0
  10. package/dist_ts/core/utils/index.d.ts +7 -0
  11. package/dist_ts/core/utils/index.js +8 -1
  12. package/dist_ts/core/utils/route-manager.d.ts +118 -0
  13. package/dist_ts/core/utils/route-manager.js +383 -0
  14. package/dist_ts/core/utils/route-utils.d.ts +94 -0
  15. package/dist_ts/core/utils/route-utils.js +264 -0
  16. package/dist_ts/core/utils/security-utils.d.ts +111 -0
  17. package/dist_ts/core/utils/security-utils.js +212 -0
  18. package/dist_ts/core/utils/shared-security-manager.d.ts +110 -0
  19. package/dist_ts/core/utils/shared-security-manager.js +252 -0
  20. package/dist_ts/core/utils/template-utils.d.ts +37 -0
  21. package/dist_ts/core/utils/template-utils.js +104 -0
  22. package/dist_ts/core/utils/websocket-utils.d.ts +23 -0
  23. package/dist_ts/core/utils/websocket-utils.js +86 -0
  24. package/dist_ts/http/router/index.d.ts +5 -1
  25. package/dist_ts/http/router/index.js +4 -2
  26. package/dist_ts/http/router/route-router.d.ts +108 -0
  27. package/dist_ts/http/router/route-router.js +393 -0
  28. package/dist_ts/index.d.ts +8 -2
  29. package/dist_ts/index.js +10 -3
  30. package/dist_ts/proxies/index.d.ts +7 -2
  31. package/dist_ts/proxies/index.js +10 -4
  32. package/dist_ts/proxies/network-proxy/certificate-manager.d.ts +21 -0
  33. package/dist_ts/proxies/network-proxy/certificate-manager.js +92 -1
  34. package/dist_ts/proxies/network-proxy/context-creator.d.ts +34 -0
  35. package/dist_ts/proxies/network-proxy/context-creator.js +108 -0
  36. package/dist_ts/proxies/network-proxy/function-cache.d.ts +90 -0
  37. package/dist_ts/proxies/network-proxy/function-cache.js +198 -0
  38. package/dist_ts/proxies/network-proxy/http-request-handler.d.ts +40 -0
  39. package/dist_ts/proxies/network-proxy/http-request-handler.js +256 -0
  40. package/dist_ts/proxies/network-proxy/http2-request-handler.d.ts +24 -0
  41. package/dist_ts/proxies/network-proxy/http2-request-handler.js +201 -0
  42. package/dist_ts/proxies/network-proxy/models/types.d.ts +73 -1
  43. package/dist_ts/proxies/network-proxy/models/types.js +242 -1
  44. package/dist_ts/proxies/network-proxy/network-proxy.d.ts +23 -20
  45. package/dist_ts/proxies/network-proxy/network-proxy.js +147 -60
  46. package/dist_ts/proxies/network-proxy/request-handler.d.ts +38 -5
  47. package/dist_ts/proxies/network-proxy/request-handler.js +584 -198
  48. package/dist_ts/proxies/network-proxy/security-manager.d.ts +65 -0
  49. package/dist_ts/proxies/network-proxy/security-manager.js +255 -0
  50. package/dist_ts/proxies/network-proxy/websocket-handler.d.ts +13 -2
  51. package/dist_ts/proxies/network-proxy/websocket-handler.js +238 -20
  52. package/dist_ts/proxies/smart-proxy/index.d.ts +1 -1
  53. package/dist_ts/proxies/smart-proxy/index.js +3 -3
  54. package/dist_ts/proxies/smart-proxy/models/interfaces.d.ts +3 -5
  55. package/dist_ts/proxies/smart-proxy/models/route-types.d.ts +56 -3
  56. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.d.ts +4 -57
  57. package/dist_ts/proxies/smart-proxy/network-proxy-bridge.js +19 -228
  58. package/dist_ts/proxies/smart-proxy/port-manager.d.ts +81 -0
  59. package/dist_ts/proxies/smart-proxy/port-manager.js +166 -0
  60. package/dist_ts/proxies/smart-proxy/route-connection-handler.d.ts +5 -0
  61. package/dist_ts/proxies/smart-proxy/route-connection-handler.js +131 -15
  62. package/dist_ts/proxies/smart-proxy/route-helpers/index.d.ts +3 -1
  63. package/dist_ts/proxies/smart-proxy/route-helpers/index.js +5 -3
  64. package/dist_ts/proxies/smart-proxy/route-helpers.d.ts +5 -178
  65. package/dist_ts/proxies/smart-proxy/route-helpers.js +8 -296
  66. package/dist_ts/proxies/smart-proxy/route-manager.d.ts +11 -2
  67. package/dist_ts/proxies/smart-proxy/route-manager.js +79 -10
  68. package/dist_ts/proxies/smart-proxy/smart-proxy.d.ts +29 -2
  69. package/dist_ts/proxies/smart-proxy/smart-proxy.js +48 -43
  70. package/dist_ts/proxies/smart-proxy/utils/route-helpers.d.ts +67 -1
  71. package/dist_ts/proxies/smart-proxy/utils/route-helpers.js +120 -1
  72. package/dist_ts/proxies/smart-proxy/utils/route-validators.d.ts +3 -3
  73. package/dist_ts/proxies/smart-proxy/utils/route-validators.js +27 -5
  74. package/package.json +1 -1
  75. package/readme.md +102 -14
  76. package/readme.plan.md +103 -168
  77. package/ts/00_commitinfo_data.ts +1 -1
  78. package/ts/core/models/index.ts +2 -0
  79. package/ts/core/models/route-context.ts +113 -0
  80. package/ts/core/models/socket-augmentation.ts +33 -0
  81. package/ts/core/utils/event-system.ts +376 -0
  82. package/ts/core/utils/index.ts +7 -0
  83. package/ts/core/utils/route-manager.ts +489 -0
  84. package/ts/core/utils/route-utils.ts +312 -0
  85. package/ts/core/utils/security-utils.ts +309 -0
  86. package/ts/core/utils/shared-security-manager.ts +333 -0
  87. package/ts/core/utils/template-utils.ts +124 -0
  88. package/ts/core/utils/websocket-utils.ts +81 -0
  89. package/ts/http/router/index.ts +8 -1
  90. package/ts/http/router/route-router.ts +482 -0
  91. package/ts/index.ts +14 -2
  92. package/ts/proxies/index.ts +12 -3
  93. package/ts/proxies/network-proxy/certificate-manager.ts +114 -10
  94. package/ts/proxies/network-proxy/context-creator.ts +145 -0
  95. package/ts/proxies/network-proxy/function-cache.ts +259 -0
  96. package/ts/proxies/network-proxy/http-request-handler.ts +330 -0
  97. package/ts/proxies/network-proxy/http2-request-handler.ts +255 -0
  98. package/ts/proxies/network-proxy/models/types.ts +312 -1
  99. package/ts/proxies/network-proxy/network-proxy.ts +195 -86
  100. package/ts/proxies/network-proxy/request-handler.ts +698 -246
  101. package/ts/proxies/network-proxy/security-manager.ts +298 -0
  102. package/ts/proxies/network-proxy/websocket-handler.ts +276 -33
  103. package/ts/proxies/smart-proxy/index.ts +2 -12
  104. package/ts/proxies/smart-proxy/models/interfaces.ts +7 -4
  105. package/ts/proxies/smart-proxy/models/route-types.ts +78 -10
  106. package/ts/proxies/smart-proxy/network-proxy-bridge.ts +20 -257
  107. package/ts/proxies/smart-proxy/port-manager.ts +195 -0
  108. package/ts/proxies/smart-proxy/route-connection-handler.ts +156 -21
  109. package/ts/proxies/smart-proxy/route-manager.ts +98 -14
  110. package/ts/proxies/smart-proxy/smart-proxy.ts +56 -55
  111. package/ts/proxies/smart-proxy/utils/route-helpers.ts +167 -1
  112. package/ts/proxies/smart-proxy/utils/route-validators.ts +24 -5
  113. package/ts/proxies/smart-proxy/domain-config-manager.ts.bak +0 -441
  114. package/ts/proxies/smart-proxy/route-helpers/index.ts +0 -9
  115. package/ts/proxies/smart-proxy/route-helpers.ts +0 -498
@@ -0,0 +1,65 @@
1
+ import type { ILogger } from './models/types.js';
2
+ import type { IRouteConfig } from '../smart-proxy/models/route-types.js';
3
+ import type { IRouteContext } from '../../core/models/route-context.js';
4
+ /**
5
+ * Manages security features for the NetworkProxy
6
+ * Implements Phase 5.4: Security features like IP filtering and rate limiting
7
+ */
8
+ export declare class SecurityManager {
9
+ private logger;
10
+ private routes;
11
+ private ipFilterCache;
12
+ private rateLimits;
13
+ constructor(logger: ILogger, routes?: IRouteConfig[]);
14
+ /**
15
+ * Update the routes configuration
16
+ */
17
+ setRoutes(routes: IRouteConfig[]): void;
18
+ /**
19
+ * Check if a client is allowed to access a specific route
20
+ *
21
+ * @param route The route to check access for
22
+ * @param context The route context with client information
23
+ * @returns True if access is allowed, false otherwise
24
+ */
25
+ isAllowed(route: IRouteConfig, context: IRouteContext): boolean;
26
+ /**
27
+ * Check if an IP is allowed based on route security settings
28
+ */
29
+ private isIpAllowed;
30
+ /**
31
+ * Check if IP matches any pattern in the list
32
+ */
33
+ private ipMatchesPattern;
34
+ /**
35
+ * Check if IP matches CIDR notation
36
+ * Very basic implementation - for production use, consider a dedicated IP library
37
+ */
38
+ private ipMatchesCidr;
39
+ /**
40
+ * Check if request is within rate limit
41
+ */
42
+ private isWithinRateLimit;
43
+ /**
44
+ * Clean up expired rate limits
45
+ * Should be called periodically to prevent memory leaks
46
+ */
47
+ cleanupExpiredRateLimits(): void;
48
+ /**
49
+ * Check basic auth credentials
50
+ *
51
+ * @param route The route to check auth for
52
+ * @param username The provided username
53
+ * @param password The provided password
54
+ * @returns True if credentials are valid, false otherwise
55
+ */
56
+ checkBasicAuth(route: IRouteConfig, username: string, password: string): boolean;
57
+ /**
58
+ * Verify a JWT token
59
+ *
60
+ * @param route The route to verify the token for
61
+ * @param token The JWT token to verify
62
+ * @returns True if the token is valid, false otherwise
63
+ */
64
+ verifyJwtToken(route: IRouteConfig, token: string): boolean;
65
+ }
@@ -0,0 +1,255 @@
1
+ import * as plugins from '../../plugins.js';
2
+ /**
3
+ * Manages security features for the NetworkProxy
4
+ * Implements Phase 5.4: Security features like IP filtering and rate limiting
5
+ */
6
+ export class SecurityManager {
7
+ constructor(logger, routes = []) {
8
+ this.logger = logger;
9
+ this.routes = routes;
10
+ // Cache IP filtering results to avoid constant regex matching
11
+ this.ipFilterCache = new Map();
12
+ // Store rate limits per route and key
13
+ this.rateLimits = new Map();
14
+ }
15
+ /**
16
+ * Update the routes configuration
17
+ */
18
+ setRoutes(routes) {
19
+ this.routes = routes;
20
+ // Reset caches when routes change
21
+ this.ipFilterCache.clear();
22
+ }
23
+ /**
24
+ * Check if a client is allowed to access a specific route
25
+ *
26
+ * @param route The route to check access for
27
+ * @param context The route context with client information
28
+ * @returns True if access is allowed, false otherwise
29
+ */
30
+ isAllowed(route, context) {
31
+ if (!route.security) {
32
+ return true; // No security restrictions
33
+ }
34
+ // --- IP filtering ---
35
+ if (!this.isIpAllowed(route, context.clientIp)) {
36
+ this.logger.debug(`IP ${context.clientIp} is blocked for route ${route.name || route.id || 'unnamed'}`);
37
+ return false;
38
+ }
39
+ // --- Rate limiting ---
40
+ if (route.security.rateLimit?.enabled && !this.isWithinRateLimit(route, context)) {
41
+ this.logger.debug(`Rate limit exceeded for route ${route.name || route.id || 'unnamed'}`);
42
+ return false;
43
+ }
44
+ // --- Basic Auth (handled at HTTP level) ---
45
+ // Basic auth is not checked here as it requires HTTP headers
46
+ // and is handled in the RequestHandler
47
+ return true;
48
+ }
49
+ /**
50
+ * Check if an IP is allowed based on route security settings
51
+ */
52
+ isIpAllowed(route, clientIp) {
53
+ if (!route.security) {
54
+ return true; // No security restrictions
55
+ }
56
+ const routeId = route.id || route.name || 'unnamed';
57
+ // Check cache first
58
+ if (!this.ipFilterCache.has(routeId)) {
59
+ this.ipFilterCache.set(routeId, new Map());
60
+ }
61
+ const routeCache = this.ipFilterCache.get(routeId);
62
+ if (routeCache.has(clientIp)) {
63
+ return routeCache.get(clientIp);
64
+ }
65
+ let allowed = true;
66
+ // Check block list first (deny has priority over allow)
67
+ if (route.security.ipBlockList && route.security.ipBlockList.length > 0) {
68
+ if (this.ipMatchesPattern(clientIp, route.security.ipBlockList)) {
69
+ allowed = false;
70
+ }
71
+ }
72
+ // Then check allow list (overrides block list if specified)
73
+ if (route.security.ipAllowList && route.security.ipAllowList.length > 0) {
74
+ // If allow list is specified, IP must match an entry to be allowed
75
+ allowed = this.ipMatchesPattern(clientIp, route.security.ipAllowList);
76
+ }
77
+ // Cache the result
78
+ routeCache.set(clientIp, allowed);
79
+ return allowed;
80
+ }
81
+ /**
82
+ * Check if IP matches any pattern in the list
83
+ */
84
+ ipMatchesPattern(ip, patterns) {
85
+ for (const pattern of patterns) {
86
+ // CIDR notation
87
+ if (pattern.includes('/')) {
88
+ if (this.ipMatchesCidr(ip, pattern)) {
89
+ return true;
90
+ }
91
+ }
92
+ // Wildcard notation
93
+ else if (pattern.includes('*')) {
94
+ const regex = new RegExp('^' + pattern.replace(/\./g, '\\.').replace(/\*/g, '.*') + '$');
95
+ if (regex.test(ip)) {
96
+ return true;
97
+ }
98
+ }
99
+ // Exact match
100
+ else if (pattern === ip) {
101
+ return true;
102
+ }
103
+ }
104
+ return false;
105
+ }
106
+ /**
107
+ * Check if IP matches CIDR notation
108
+ * Very basic implementation - for production use, consider a dedicated IP library
109
+ */
110
+ ipMatchesCidr(ip, cidr) {
111
+ try {
112
+ const [subnet, bits] = cidr.split('/');
113
+ const mask = parseInt(bits, 10);
114
+ // Convert IP to numeric format
115
+ const ipParts = ip.split('.').map(part => parseInt(part, 10));
116
+ const subnetParts = subnet.split('.').map(part => parseInt(part, 10));
117
+ // Calculate the numeric IP and subnet
118
+ const ipNum = (ipParts[0] << 24) | (ipParts[1] << 16) | (ipParts[2] << 8) | ipParts[3];
119
+ const subnetNum = (subnetParts[0] << 24) | (subnetParts[1] << 16) | (subnetParts[2] << 8) | subnetParts[3];
120
+ // Calculate the mask
121
+ const maskNum = ~((1 << (32 - mask)) - 1);
122
+ // Check if IP is in subnet
123
+ return (ipNum & maskNum) === (subnetNum & maskNum);
124
+ }
125
+ catch (e) {
126
+ this.logger.error(`Invalid CIDR notation: ${cidr}`);
127
+ return false;
128
+ }
129
+ }
130
+ /**
131
+ * Check if request is within rate limit
132
+ */
133
+ isWithinRateLimit(route, context) {
134
+ if (!route.security?.rateLimit?.enabled) {
135
+ return true;
136
+ }
137
+ const rateLimit = route.security.rateLimit;
138
+ const routeId = route.id || route.name || 'unnamed';
139
+ // Determine rate limit key (by IP, path, or header)
140
+ let key = context.clientIp; // Default to IP
141
+ if (rateLimit.keyBy === 'path' && context.path) {
142
+ key = `${context.clientIp}:${context.path}`;
143
+ }
144
+ else if (rateLimit.keyBy === 'header' && rateLimit.headerName && context.headers) {
145
+ const headerValue = context.headers[rateLimit.headerName.toLowerCase()];
146
+ if (headerValue) {
147
+ key = `${context.clientIp}:${headerValue}`;
148
+ }
149
+ }
150
+ // Get or create rate limit tracking for this route
151
+ if (!this.rateLimits.has(routeId)) {
152
+ this.rateLimits.set(routeId, new Map());
153
+ }
154
+ const routeLimits = this.rateLimits.get(routeId);
155
+ const now = Date.now();
156
+ // Get or create rate limit tracking for this key
157
+ let limit = routeLimits.get(key);
158
+ if (!limit || limit.expiry < now) {
159
+ // Create new rate limit or reset expired one
160
+ limit = {
161
+ count: 1,
162
+ expiry: now + (rateLimit.window * 1000)
163
+ };
164
+ routeLimits.set(key, limit);
165
+ return true;
166
+ }
167
+ // Increment the counter
168
+ limit.count++;
169
+ // Check if rate limit is exceeded
170
+ return limit.count <= rateLimit.maxRequests;
171
+ }
172
+ /**
173
+ * Clean up expired rate limits
174
+ * Should be called periodically to prevent memory leaks
175
+ */
176
+ cleanupExpiredRateLimits() {
177
+ const now = Date.now();
178
+ for (const [routeId, routeLimits] of this.rateLimits.entries()) {
179
+ let removed = 0;
180
+ for (const [key, limit] of routeLimits.entries()) {
181
+ if (limit.expiry < now) {
182
+ routeLimits.delete(key);
183
+ removed++;
184
+ }
185
+ }
186
+ if (removed > 0) {
187
+ this.logger.debug(`Cleaned up ${removed} expired rate limits for route ${routeId}`);
188
+ }
189
+ }
190
+ }
191
+ /**
192
+ * Check basic auth credentials
193
+ *
194
+ * @param route The route to check auth for
195
+ * @param username The provided username
196
+ * @param password The provided password
197
+ * @returns True if credentials are valid, false otherwise
198
+ */
199
+ checkBasicAuth(route, username, password) {
200
+ if (!route.security?.basicAuth?.enabled) {
201
+ return true;
202
+ }
203
+ const basicAuth = route.security.basicAuth;
204
+ // Check credentials against configured users
205
+ for (const user of basicAuth.users) {
206
+ if (user.username === username && user.password === password) {
207
+ return true;
208
+ }
209
+ }
210
+ return false;
211
+ }
212
+ /**
213
+ * Verify a JWT token
214
+ *
215
+ * @param route The route to verify the token for
216
+ * @param token The JWT token to verify
217
+ * @returns True if the token is valid, false otherwise
218
+ */
219
+ verifyJwtToken(route, token) {
220
+ if (!route.security?.jwtAuth?.enabled) {
221
+ return true;
222
+ }
223
+ try {
224
+ // This is a simplified version - in production you'd use a proper JWT library
225
+ const jwtAuth = route.security.jwtAuth;
226
+ // Verify structure
227
+ const parts = token.split('.');
228
+ if (parts.length !== 3) {
229
+ return false;
230
+ }
231
+ // Decode payload
232
+ const payload = JSON.parse(Buffer.from(parts[1], 'base64').toString());
233
+ // Check expiration
234
+ if (payload.exp && payload.exp < Math.floor(Date.now() / 1000)) {
235
+ return false;
236
+ }
237
+ // Check issuer
238
+ if (jwtAuth.issuer && payload.iss !== jwtAuth.issuer) {
239
+ return false;
240
+ }
241
+ // Check audience
242
+ if (jwtAuth.audience && payload.aud !== jwtAuth.audience) {
243
+ return false;
244
+ }
245
+ // In a real implementation, you'd also verify the signature
246
+ // using the secret and algorithm specified in jwtAuth
247
+ return true;
248
+ }
249
+ catch (err) {
250
+ this.logger.error(`Error verifying JWT: ${err}`);
251
+ return false;
252
+ }
253
+ }
254
+ }
255
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHktbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Byb3hpZXMvbmV0d29yay1wcm94eS9zZWN1cml0eS1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFLNUM7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFPMUIsWUFBb0IsTUFBZSxFQUFVLFNBQXlCLEVBQUU7UUFBcEQsV0FBTSxHQUFOLE1BQU0sQ0FBUztRQUFVLFdBQU0sR0FBTixNQUFNLENBQXFCO1FBTnhFLDhEQUE4RDtRQUN0RCxrQkFBYSxHQUFzQyxJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRXJFLHNDQUFzQztRQUM5QixlQUFVLEdBQWdFLElBQUksR0FBRyxFQUFFLENBQUM7SUFFakIsQ0FBQztJQUU1RTs7T0FFRztJQUNJLFNBQVMsQ0FBQyxNQUFzQjtRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixrQ0FBa0M7UUFDbEMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksU0FBUyxDQUFDLEtBQW1CLEVBQUUsT0FBc0I7UUFDMUQsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUNwQixPQUFPLElBQUksQ0FBQyxDQUFDLDJCQUEyQjtRQUMxQyxDQUFDO1FBRUQsdUJBQXVCO1FBQ3ZCLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztZQUMvQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLE9BQU8sQ0FBQyxRQUFRLHlCQUF5QixLQUFLLENBQUMsSUFBSSxJQUFJLEtBQUssQ0FBQyxFQUFFLElBQUksU0FBUyxFQUFFLENBQUMsQ0FBQztZQUN4RyxP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
@@ -1,18 +1,29 @@
1
1
  import * as plugins from '../../plugins.js';
2
+ import '../../core/models/socket-augmentation.js';
2
3
  import { type INetworkProxyOptions } from './models/types.js';
3
4
  import { ConnectionPool } from './connection-pool.js';
4
5
  import { ProxyRouter } from '../../http/router/index.js';
6
+ import type { IRouteConfig } from '../smart-proxy/models/route-types.js';
5
7
  /**
6
8
  * Handles WebSocket connections and proxying
7
9
  */
8
10
  export declare class WebSocketHandler {
9
11
  private options;
10
12
  private connectionPool;
11
- private router;
13
+ private legacyRouter;
14
+ private routes;
12
15
  private heartbeatInterval;
13
16
  private wsServer;
14
17
  private logger;
15
- constructor(options: INetworkProxyOptions, connectionPool: ConnectionPool, router: ProxyRouter);
18
+ private contextCreator;
19
+ private routeRouter;
20
+ private securityManager;
21
+ constructor(options: INetworkProxyOptions, connectionPool: ConnectionPool, legacyRouter: ProxyRouter, // Legacy router for backward compatibility
22
+ routes?: IRouteConfig[]);
23
+ /**
24
+ * Set the route configurations
25
+ */
26
+ setRoutes(routes: IRouteConfig[]): void;
16
27
  /**
17
28
  * Initialize WebSocket server on an existing HTTPS server
18
29
  */