@push.rocks/smartproxy 27.6.0 → 27.7.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.
@@ -140,12 +140,23 @@ export function routeMatchesHeaders(route, headers) {
140
140
  if (!route.match?.headers || Object.keys(route.match.headers).length === 0) {
141
141
  return true; // No headers specified means it matches any headers
142
142
  }
143
- // Convert RegExp patterns to strings for HeaderMatcher
144
- const stringHeaders = {};
145
- for (const [key, value] of Object.entries(route.match.headers)) {
146
- stringHeaders[key] = value instanceof RegExp ? value.source : value;
143
+ for (const [headerName, expectedValue] of Object.entries(route.match.headers)) {
144
+ const actualKey = Object.keys(headers).find((key) => key.toLowerCase() === headerName.toLowerCase());
145
+ const actualValue = actualKey ? headers[actualKey] : undefined;
146
+ if (actualValue === undefined) {
147
+ return false;
148
+ }
149
+ if (expectedValue instanceof RegExp) {
150
+ if (!expectedValue.test(actualValue)) {
151
+ return false;
152
+ }
153
+ continue;
154
+ }
155
+ if (!HeaderMatcher.match(expectedValue, actualValue)) {
156
+ return false;
157
+ }
147
158
  }
148
- return HeaderMatcher.matchAll(stringHeaders, headers);
159
+ return true;
149
160
  }
150
161
  /**
151
162
  * Find all routes that match the given criteria
@@ -226,4 +237,4 @@ export function generateRouteId(route) {
226
237
  export function cloneRoute(route) {
227
238
  return JSON.parse(JSON.stringify(route));
228
239
  }
229
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3JvdXRlLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixTQUF1QixFQUN2QixhQUFvQztJQUVwQyx5REFBeUQ7SUFDekQsTUFBTSxXQUFXLEdBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXhFLG1DQUFtQztJQUNuQyxJQUFJLGFBQWEsQ0FBQyxFQUFFO1FBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO0lBQ3hELElBQUksYUFBYSxDQUFDLElBQUk7UUFBRSxXQUFXLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDOUQsSUFBSSxhQUFhLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDckYsSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFFeEYsNEJBQTRCO0lBQzVCLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU3QyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMs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
240
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtdXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3JvdXRlLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7OztHQUtHO0FBR0gsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFM0Q7Ozs7OztHQU1HO0FBQ0gsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixTQUF1QixFQUN2QixhQUFvQztJQUVwQyx5REFBeUQ7SUFDekQsTUFBTSxXQUFXLEdBQWlCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBRXhFLG1DQUFtQztJQUNuQyxJQUFJLGFBQWEsQ0FBQyxFQUFFO1FBQUUsV0FBVyxDQUFDLEVBQUUsR0FBRyxhQUFhLENBQUMsRUFBRSxDQUFDO0lBQ3hELElBQUksYUFBYSxDQUFDLElBQUk7UUFBRSxXQUFXLENBQUMsSUFBSSxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUM7SUFDOUQsSUFBSSxhQUFhLENBQUMsT0FBTyxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQyxPQUFPLENBQUM7SUFDckYsSUFBSSxhQUFhLENBQUMsUUFBUSxLQUFLLFNBQVM7UUFBRSxXQUFXLENBQUMsUUFBUSxHQUFHLGFBQWEsQ0FBQyxRQUFRLENBQUM7SUFFeEYsNEJBQTRCO0lBQzVCLElBQUksYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3hCLFdBQVcsQ0FBQyxLQUFLLEdBQUcsRUFBRSxHQUFHLFdBQVcsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUU3QyxJQUFJLGFBQWEsQ0FBQyxLQUFLLENBQUMsS0FBSyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzVDLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxHQUFHLGFBQWEsQ0FBQyxLQUFLLENBQUMs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
@@ -0,0 +1,11 @@
1
+ import type { IAcmeOptions, ISmartProxyOptions } from '../models/interfaces.js';
2
+ import type { IRouteAction, IRouteConfig, IRouteMatch, IRouteTarget, ITargetMatch } from '../models/route-types.js';
3
+ import type { IRustProxyOptions, IRustRouteAction, IRustRouteConfig, IRustRouteMatch, IRustRouteTarget, IRustTargetMatch, TRustHeaderMatchers } from '../models/rust-types.js';
4
+ export declare function serializeHeaderMatchValue(value: string | RegExp): string;
5
+ export declare function serializeHeaderMatchers(headers?: Record<string, string | RegExp>): TRustHeaderMatchers | undefined;
6
+ export declare function serializeTargetMatchForRust(match?: ITargetMatch): IRustTargetMatch | undefined;
7
+ export declare function serializeRouteMatchForRust(match: IRouteMatch): IRustRouteMatch;
8
+ export declare function serializeRouteTargetForRust(target: IRouteTarget): IRustRouteTarget;
9
+ export declare function serializeRouteActionForRust(action: IRouteAction): IRustRouteAction;
10
+ export declare function serializeRouteForRust(route: IRouteConfig): IRustRouteConfig;
11
+ export declare function buildRustProxyOptions(settings: ISmartProxyOptions, routes: IRustRouteConfig[], acmeOverride?: IAcmeOptions): IRustProxyOptions;
@@ -0,0 +1,133 @@
1
+ const SUPPORTED_REGEX_FLAGS = new Set(['i', 'm', 's', 'u', 'g']);
2
+ export function serializeHeaderMatchValue(value) {
3
+ if (typeof value === 'string') {
4
+ return value;
5
+ }
6
+ const unsupportedFlags = Array.from(new Set(value.flags)).filter((flag) => !SUPPORTED_REGEX_FLAGS.has(flag));
7
+ if (unsupportedFlags.length > 0) {
8
+ throw new Error(`Header RegExp uses unsupported flags for Rust serialization: ${unsupportedFlags.join(', ')}`);
9
+ }
10
+ return `/${value.source}/${value.flags}`;
11
+ }
12
+ export function serializeHeaderMatchers(headers) {
13
+ if (!headers) {
14
+ return undefined;
15
+ }
16
+ return Object.fromEntries(Object.entries(headers).map(([key, value]) => [key, serializeHeaderMatchValue(value)]));
17
+ }
18
+ export function serializeTargetMatchForRust(match) {
19
+ if (!match) {
20
+ return undefined;
21
+ }
22
+ return {
23
+ ...match,
24
+ headers: serializeHeaderMatchers(match.headers),
25
+ };
26
+ }
27
+ export function serializeRouteMatchForRust(match) {
28
+ return {
29
+ ...match,
30
+ headers: serializeHeaderMatchers(match.headers),
31
+ };
32
+ }
33
+ export function serializeRouteTargetForRust(target) {
34
+ if (typeof target.host !== 'string' && !Array.isArray(target.host)) {
35
+ throw new Error('Route target host must be serialized before sending to Rust');
36
+ }
37
+ if (typeof target.port !== 'number' && target.port !== 'preserve') {
38
+ throw new Error('Route target port must be serialized before sending to Rust');
39
+ }
40
+ return {
41
+ ...target,
42
+ host: target.host,
43
+ port: target.port,
44
+ match: serializeTargetMatchForRust(target.match),
45
+ };
46
+ }
47
+ function serializeUdpForRust(udp) {
48
+ if (!udp) {
49
+ return undefined;
50
+ }
51
+ const { maxSessionsPerIP, ...rest } = udp;
52
+ return {
53
+ ...rest,
54
+ maxSessionsPerIp: maxSessionsPerIP,
55
+ };
56
+ }
57
+ export function serializeRouteActionForRust(action) {
58
+ const { socketHandler: _socketHandler, datagramHandler: _datagramHandler, forwardingEngine: _forwardingEngine, nftables: _nftables, targets, udp, ...rest } = action;
59
+ return {
60
+ ...rest,
61
+ targets: targets?.map((target) => serializeRouteTargetForRust(target)),
62
+ udp: serializeUdpForRust(udp),
63
+ };
64
+ }
65
+ export function serializeRouteForRust(route) {
66
+ return {
67
+ ...route,
68
+ match: serializeRouteMatchForRust(route.match),
69
+ action: serializeRouteActionForRust(route.action),
70
+ };
71
+ }
72
+ function serializeAcmeForRust(acme) {
73
+ if (!acme) {
74
+ return undefined;
75
+ }
76
+ return {
77
+ enabled: acme.enabled,
78
+ email: acme.email,
79
+ environment: acme.environment,
80
+ accountEmail: acme.accountEmail,
81
+ port: acme.port,
82
+ useProduction: acme.useProduction,
83
+ renewThresholdDays: acme.renewThresholdDays,
84
+ autoRenew: acme.autoRenew,
85
+ skipConfiguredCerts: acme.skipConfiguredCerts,
86
+ renewCheckIntervalHours: acme.renewCheckIntervalHours,
87
+ };
88
+ }
89
+ function serializeDefaultsForRust(defaults) {
90
+ if (!defaults) {
91
+ return undefined;
92
+ }
93
+ const { preserveSourceIP, ...rest } = defaults;
94
+ return {
95
+ ...rest,
96
+ preserveSourceIp: preserveSourceIP,
97
+ };
98
+ }
99
+ export function buildRustProxyOptions(settings, routes, acmeOverride) {
100
+ const acme = acmeOverride !== undefined ? acmeOverride : settings.acme;
101
+ return {
102
+ routes,
103
+ preserveSourceIp: settings.preserveSourceIP,
104
+ proxyIps: settings.proxyIPs,
105
+ acceptProxyProtocol: settings.acceptProxyProtocol,
106
+ sendProxyProtocol: settings.sendProxyProtocol,
107
+ defaults: serializeDefaultsForRust(settings.defaults),
108
+ connectionTimeout: settings.connectionTimeout,
109
+ initialDataTimeout: settings.initialDataTimeout,
110
+ socketTimeout: settings.socketTimeout,
111
+ inactivityCheckInterval: settings.inactivityCheckInterval,
112
+ maxConnectionLifetime: settings.maxConnectionLifetime,
113
+ inactivityTimeout: settings.inactivityTimeout,
114
+ gracefulShutdownTimeout: settings.gracefulShutdownTimeout,
115
+ noDelay: settings.noDelay,
116
+ keepAlive: settings.keepAlive,
117
+ keepAliveInitialDelay: settings.keepAliveInitialDelay,
118
+ maxPendingDataSize: settings.maxPendingDataSize,
119
+ disableInactivityCheck: settings.disableInactivityCheck,
120
+ enableKeepAliveProbes: settings.enableKeepAliveProbes,
121
+ enableDetailedLogging: settings.enableDetailedLogging,
122
+ enableTlsDebugLogging: settings.enableTlsDebugLogging,
123
+ enableRandomizedTimeouts: settings.enableRandomizedTimeouts,
124
+ maxConnectionsPerIp: settings.maxConnectionsPerIP,
125
+ connectionRateLimitPerMinute: settings.connectionRateLimitPerMinute,
126
+ keepAliveTreatment: settings.keepAliveTreatment,
127
+ keepAliveInactivityMultiplier: settings.keepAliveInactivityMultiplier,
128
+ extendedKeepAliveLifetime: settings.extendedKeepAliveLifetime,
129
+ metrics: settings.metrics,
130
+ acme: serializeAcmeForRust(acme),
131
+ };
132
+ }
133
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3V0aWxzL3J1c3QtY29uZmlnLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWVBLE1BQU0scUJBQXFCLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUVqRSxNQUFNLFVBQVUseUJBQXlCLENBQUMsS0FBc0I7SUFDOUQsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUM5QixPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCxNQUFNLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLHFCQUFxQixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzdHLElBQUksZ0JBQWdCLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2hDLE1BQU0sSUFBSSxLQUFLLENBQ2IsZ0VBQWdFLGdCQUFnQixDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUM5RixDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sSUFBSSxLQUFLLENBQUMsTUFBTSxJQUFJLEtBQUssQ0FBQyxLQUFLLEVBQUUsQ0FBQztBQUMzQyxDQUFDO0FBRUQsTUFBTSxVQUFVLHVCQUF1QixDQUFDLE9BQXlDO0lBQy9FLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNiLE9BQU8sU0FBUyxDQUFDO0lBQ25CLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLE1BQU0sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxD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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartproxy",
3
- "version": "27.6.0",
3
+ "version": "27.7.0",
4
4
  "private": false,
5
5
  "description": "A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.",
6
6
  "main": "dist_ts/index.js",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartproxy',
6
- version: '27.6.0',
6
+ version: '27.7.0',
7
7
  description: 'A powerful proxy package with unified route-based configuration for high traffic management. Features include SSL/TLS support, flexible routing patterns, WebSocket handling, advanced security options, and automatic ACME certificate management.'
8
8
  }
@@ -0,0 +1,160 @@
1
+ import type { IProtocolCacheEntry, IProtocolDistribution } from './metrics-types.js';
2
+ import type { IAcmeOptions, ISmartProxyOptions } from './interfaces.js';
3
+ import type {
4
+ IRouteAction,
5
+ IRouteConfig,
6
+ IRouteMatch,
7
+ IRouteTarget,
8
+ ITargetMatch,
9
+ IRouteUdp,
10
+ } from './route-types.js';
11
+
12
+ export type TRustHeaderMatchers = Record<string, string>;
13
+
14
+ export interface IRustRouteMatch extends Omit<IRouteMatch, 'headers'> {
15
+ headers?: TRustHeaderMatchers;
16
+ }
17
+
18
+ export interface IRustTargetMatch extends Omit<ITargetMatch, 'headers'> {
19
+ headers?: TRustHeaderMatchers;
20
+ }
21
+
22
+ export interface IRustRouteTarget extends Omit<IRouteTarget, 'host' | 'port' | 'match'> {
23
+ host: string | string[];
24
+ port: number | 'preserve';
25
+ match?: IRustTargetMatch;
26
+ }
27
+
28
+ export interface IRustRouteUdp extends Omit<IRouteUdp, 'maxSessionsPerIP'> {
29
+ maxSessionsPerIp?: number;
30
+ }
31
+
32
+ export interface IRustDefaultConfig extends Omit<NonNullable<ISmartProxyOptions['defaults']>, 'preserveSourceIP'> {
33
+ preserveSourceIp?: boolean;
34
+ }
35
+
36
+ export interface IRustRouteAction
37
+ extends Omit<IRouteAction, 'targets' | 'socketHandler' | 'datagramHandler' | 'forwardingEngine' | 'nftables' | 'udp'> {
38
+ targets?: IRustRouteTarget[];
39
+ udp?: IRustRouteUdp;
40
+ }
41
+
42
+ export interface IRustRouteConfig extends Omit<IRouteConfig, 'match' | 'action'> {
43
+ match: IRustRouteMatch;
44
+ action: IRustRouteAction;
45
+ }
46
+
47
+ export interface IRustAcmeOptions extends Omit<IAcmeOptions, 'routeForwards'> {}
48
+
49
+ export interface IRustProxyOptions {
50
+ routes: IRustRouteConfig[];
51
+ preserveSourceIp?: boolean;
52
+ proxyIps?: string[];
53
+ acceptProxyProtocol?: boolean;
54
+ sendProxyProtocol?: boolean;
55
+ defaults?: IRustDefaultConfig;
56
+ connectionTimeout?: number;
57
+ initialDataTimeout?: number;
58
+ socketTimeout?: number;
59
+ inactivityCheckInterval?: number;
60
+ maxConnectionLifetime?: number;
61
+ inactivityTimeout?: number;
62
+ gracefulShutdownTimeout?: number;
63
+ noDelay?: boolean;
64
+ keepAlive?: boolean;
65
+ keepAliveInitialDelay?: number;
66
+ maxPendingDataSize?: number;
67
+ disableInactivityCheck?: boolean;
68
+ enableKeepAliveProbes?: boolean;
69
+ enableDetailedLogging?: boolean;
70
+ enableTlsDebugLogging?: boolean;
71
+ enableRandomizedTimeouts?: boolean;
72
+ maxConnectionsPerIp?: number;
73
+ connectionRateLimitPerMinute?: number;
74
+ keepAliveTreatment?: ISmartProxyOptions['keepAliveTreatment'];
75
+ keepAliveInactivityMultiplier?: number;
76
+ extendedKeepAliveLifetime?: number;
77
+ metrics?: ISmartProxyOptions['metrics'];
78
+ acme?: IRustAcmeOptions;
79
+ }
80
+
81
+ export interface IRustStatistics {
82
+ activeConnections: number;
83
+ totalConnections: number;
84
+ routesCount: number;
85
+ listeningPorts: number[];
86
+ uptimeSeconds: number;
87
+ }
88
+
89
+ export interface IRustCertificateStatus {
90
+ domain: string;
91
+ source: string;
92
+ expiresAt: number;
93
+ isValid: boolean;
94
+ }
95
+
96
+ export interface IRustThroughputSample {
97
+ timestampMs: number;
98
+ bytesIn: number;
99
+ bytesOut: number;
100
+ }
101
+
102
+ export interface IRustRouteMetrics {
103
+ activeConnections: number;
104
+ totalConnections: number;
105
+ bytesIn: number;
106
+ bytesOut: number;
107
+ throughputInBytesPerSec: number;
108
+ throughputOutBytesPerSec: number;
109
+ throughputRecentInBytesPerSec: number;
110
+ throughputRecentOutBytesPerSec: number;
111
+ }
112
+
113
+ export interface IRustIpMetrics {
114
+ activeConnections: number;
115
+ totalConnections: number;
116
+ bytesIn: number;
117
+ bytesOut: number;
118
+ throughputInBytesPerSec: number;
119
+ throughputOutBytesPerSec: number;
120
+ domainRequests: Record<string, number>;
121
+ }
122
+
123
+ export interface IRustBackendMetrics {
124
+ activeConnections: number;
125
+ totalConnections: number;
126
+ protocol: string;
127
+ connectErrors: number;
128
+ handshakeErrors: number;
129
+ requestErrors: number;
130
+ totalConnectTimeUs: number;
131
+ connectCount: number;
132
+ poolHits: number;
133
+ poolMisses: number;
134
+ h2Failures: number;
135
+ }
136
+
137
+ export interface IRustMetricsSnapshot {
138
+ activeConnections: number;
139
+ totalConnections: number;
140
+ bytesIn: number;
141
+ bytesOut: number;
142
+ throughputInBytesPerSec: number;
143
+ throughputOutBytesPerSec: number;
144
+ throughputRecentInBytesPerSec: number;
145
+ throughputRecentOutBytesPerSec: number;
146
+ routes: Record<string, IRustRouteMetrics>;
147
+ ips: Record<string, IRustIpMetrics>;
148
+ backends: Record<string, IRustBackendMetrics>;
149
+ throughputHistory: IRustThroughputSample[];
150
+ totalHttpRequests: number;
151
+ httpRequestsPerSec: number;
152
+ httpRequestsPerSecRecent: number;
153
+ activeUdpSessions: number;
154
+ totalUdpSessions: number;
155
+ totalDatagramsIn: number;
156
+ totalDatagramsOut: number;
157
+ detectedProtocols: IProtocolCacheEntry[];
158
+ frontendProtocols: IProtocolDistribution;
159
+ backendProtocols: IProtocolDistribution;
160
+ }
@@ -1,5 +1,6 @@
1
1
  import type { IRouteConfig, IRouteAction, IRouteTarget } from './models/route-types.js';
2
- import { logger } from '../../core/utils/logger.js';
2
+ import type { IRustRouteConfig } from './models/rust-types.js';
3
+ import { serializeRouteForRust } from './utils/rust-config.js';
3
4
 
4
5
  /**
5
6
  * Preprocesses routes before sending them to Rust.
@@ -24,7 +25,7 @@ export class RoutePreprocessor {
24
25
  * - Non-serializable fields are stripped
25
26
  * - Original routes are preserved in the local map for handler lookup
26
27
  */
27
- public preprocessForRust(routes: IRouteConfig[]): IRouteConfig[] {
28
+ public preprocessForRust(routes: IRouteConfig[]): IRustRouteConfig[] {
28
29
  this.originalRoutes.clear();
29
30
  return routes.map((route, index) => this.preprocessRoute(route, index));
30
31
  }
@@ -43,7 +44,7 @@ export class RoutePreprocessor {
43
44
  return new Map(this.originalRoutes);
44
45
  }
45
46
 
46
- private preprocessRoute(route: IRouteConfig, index: number): IRouteConfig {
47
+ private preprocessRoute(route: IRouteConfig, index: number): IRustRouteConfig {
47
48
  const routeKey = route.name || route.id || `route_${index}`;
48
49
 
49
50
  // Check if this route needs TS-side handling
@@ -57,7 +58,7 @@ export class RoutePreprocessor {
57
58
  // Create a clean copy for Rust
58
59
  const cleanRoute: IRouteConfig = {
59
60
  ...route,
60
- action: this.cleanAction(route.action, routeKey, needsTsHandling),
61
+ action: this.cleanAction(route.action, needsTsHandling),
61
62
  };
62
63
 
63
64
  // Ensure we have a name for handler lookup
@@ -65,7 +66,7 @@ export class RoutePreprocessor {
65
66
  cleanRoute.name = routeKey;
66
67
  }
67
68
 
68
- return cleanRoute;
69
+ return serializeRouteForRust(cleanRoute);
69
70
  }
70
71
 
71
72
  private routeNeedsTsHandling(route: IRouteConfig): boolean {
@@ -91,15 +92,16 @@ export class RoutePreprocessor {
91
92
  return false;
92
93
  }
93
94
 
94
- private cleanAction(action: IRouteAction, routeKey: string, needsTsHandling: boolean): IRouteAction {
95
- const cleanAction: IRouteAction = { ...action };
95
+ private cleanAction(action: IRouteAction, needsTsHandling: boolean): IRouteAction {
96
+ let cleanAction: IRouteAction = { ...action };
96
97
 
97
98
  if (needsTsHandling) {
98
99
  // Convert to socket-handler type for Rust (Rust will relay back to TS)
99
- cleanAction.type = 'socket-handler';
100
- // Remove the JS handlers (not serializable)
101
- delete (cleanAction as any).socketHandler;
102
- delete (cleanAction as any).datagramHandler;
100
+ const { socketHandler: _socketHandler, datagramHandler: _datagramHandler, ...serializableAction } = cleanAction;
101
+ cleanAction = {
102
+ ...serializableAction,
103
+ type: 'socket-handler',
104
+ };
103
105
  }
104
106
 
105
107
  // Clean targets - replace functions with static values
@@ -1,5 +1,6 @@
1
1
  import type { IMetrics, IBackendMetrics, IProtocolCacheEntry, IProtocolDistribution, IThroughputData, IThroughputHistoryPoint } from './models/metrics-types.js';
2
2
  import type { RustProxyBridge } from './rust-proxy-bridge.js';
3
+ import type { IRustBackendMetrics, IRustIpMetrics, IRustMetricsSnapshot, IRustRouteMetrics } from './models/rust-types.js';
3
4
 
4
5
  /**
5
6
  * Adapts Rust JSON metrics to the IMetrics interface.
@@ -14,7 +15,7 @@ import type { RustProxyBridge } from './rust-proxy-bridge.js';
14
15
  */
15
16
  export class RustMetricsAdapter implements IMetrics {
16
17
  private bridge: RustProxyBridge;
17
- private cache: any = null;
18
+ private cache: IRustMetricsSnapshot | null = null;
18
19
  private pollTimer: ReturnType<typeof setInterval> | null = null;
19
20
  private pollIntervalMs: number;
20
21
 
@@ -65,8 +66,8 @@ export class RustMetricsAdapter implements IMetrics {
65
66
  byRoute: (): Map<string, number> => {
66
67
  const result = new Map<string, number>();
67
68
  if (this.cache?.routes) {
68
- for (const [name, rm] of Object.entries(this.cache.routes)) {
69
- result.set(name, (rm as any).activeConnections ?? 0);
69
+ for (const [name, rm] of Object.entries(this.cache.routes) as Array<[string, IRustRouteMetrics]>) {
70
+ result.set(name, rm.activeConnections ?? 0);
70
71
  }
71
72
  }
72
73
  return result;
@@ -74,8 +75,8 @@ export class RustMetricsAdapter implements IMetrics {
74
75
  byIP: (): Map<string, number> => {
75
76
  const result = new Map<string, number>();
76
77
  if (this.cache?.ips) {
77
- for (const [ip, im] of Object.entries(this.cache.ips)) {
78
- result.set(ip, (im as any).activeConnections ?? 0);
78
+ for (const [ip, im] of Object.entries(this.cache.ips) as Array<[string, IRustIpMetrics]>) {
79
+ result.set(ip, im.activeConnections ?? 0);
79
80
  }
80
81
  }
81
82
  return result;
@@ -83,8 +84,8 @@ export class RustMetricsAdapter implements IMetrics {
83
84
  topIPs: (limit: number = 10): Array<{ ip: string; count: number }> => {
84
85
  const result: Array<{ ip: string; count: number }> = [];
85
86
  if (this.cache?.ips) {
86
- for (const [ip, im] of Object.entries(this.cache.ips)) {
87
- result.push({ ip, count: (im as any).activeConnections ?? 0 });
87
+ for (const [ip, im] of Object.entries(this.cache.ips) as Array<[string, IRustIpMetrics]>) {
88
+ result.push({ ip, count: im.activeConnections ?? 0 });
88
89
  }
89
90
  }
90
91
  result.sort((a, b) => b.count - a.count);
@@ -93,8 +94,8 @@ export class RustMetricsAdapter implements IMetrics {
93
94
  domainRequestsByIP: (): Map<string, Map<string, number>> => {
94
95
  const result = new Map<string, Map<string, number>>();
95
96
  if (this.cache?.ips) {
96
- for (const [ip, im] of Object.entries(this.cache.ips)) {
97
- const dr = (im as any).domainRequests;
97
+ for (const [ip, im] of Object.entries(this.cache.ips) as Array<[string, IRustIpMetrics]>) {
98
+ const dr = im.domainRequests;
98
99
  if (dr && typeof dr === 'object') {
99
100
  const domainMap = new Map<string, number>();
100
101
  for (const [domain, count] of Object.entries(dr)) {
@@ -111,8 +112,8 @@ export class RustMetricsAdapter implements IMetrics {
111
112
  topDomainRequests: (limit: number = 20): Array<{ ip: string; domain: string; count: number }> => {
112
113
  const result: Array<{ ip: string; domain: string; count: number }> = [];
113
114
  if (this.cache?.ips) {
114
- for (const [ip, im] of Object.entries(this.cache.ips)) {
115
- const dr = (im as any).domainRequests;
115
+ for (const [ip, im] of Object.entries(this.cache.ips) as Array<[string, IRustIpMetrics]>) {
116
+ const dr = im.domainRequests;
116
117
  if (dr && typeof dr === 'object') {
117
118
  for (const [domain, count] of Object.entries(dr)) {
118
119
  result.push({ ip, domain, count: count as number });
@@ -176,7 +177,7 @@ export class RustMetricsAdapter implements IMetrics {
176
177
  },
177
178
  history: (seconds: number): Array<IThroughputHistoryPoint> => {
178
179
  if (!this.cache?.throughputHistory) return [];
179
- return this.cache.throughputHistory.slice(-seconds).map((p: any) => ({
180
+ return this.cache.throughputHistory.slice(-seconds).map((p) => ({
180
181
  timestamp: p.timestampMs,
181
182
  in: p.bytesIn,
182
183
  out: p.bytesOut,
@@ -185,10 +186,10 @@ export class RustMetricsAdapter implements IMetrics {
185
186
  byRoute: (_windowSeconds?: number): Map<string, IThroughputData> => {
186
187
  const result = new Map<string, IThroughputData>();
187
188
  if (this.cache?.routes) {
188
- for (const [name, rm] of Object.entries(this.cache.routes)) {
189
+ for (const [name, rm] of Object.entries(this.cache.routes) as Array<[string, IRustRouteMetrics]>) {
189
190
  result.set(name, {
190
- in: (rm as any).throughputInBytesPerSec ?? 0,
191
- out: (rm as any).throughputOutBytesPerSec ?? 0,
191
+ in: rm.throughputInBytesPerSec ?? 0,
192
+ out: rm.throughputOutBytesPerSec ?? 0,
192
193
  });
193
194
  }
194
195
  }
@@ -197,10 +198,10 @@ export class RustMetricsAdapter implements IMetrics {
197
198
  byIP: (_windowSeconds?: number): Map<string, IThroughputData> => {
198
199
  const result = new Map<string, IThroughputData>();
199
200
  if (this.cache?.ips) {
200
- for (const [ip, im] of Object.entries(this.cache.ips)) {
201
+ for (const [ip, im] of Object.entries(this.cache.ips) as Array<[string, IRustIpMetrics]>) {
201
202
  result.set(ip, {
202
- in: (im as any).throughputInBytesPerSec ?? 0,
203
- out: (im as any).throughputOutBytesPerSec ?? 0,
203
+ in: im.throughputInBytesPerSec ?? 0,
204
+ out: im.throughputOutBytesPerSec ?? 0,
204
205
  });
205
206
  }
206
207
  }
@@ -236,23 +237,22 @@ export class RustMetricsAdapter implements IMetrics {
236
237
  byBackend: (): Map<string, IBackendMetrics> => {
237
238
  const result = new Map<string, IBackendMetrics>();
238
239
  if (this.cache?.backends) {
239
- for (const [key, bm] of Object.entries(this.cache.backends)) {
240
- const m = bm as any;
241
- const totalTimeUs = m.totalConnectTimeUs ?? 0;
242
- const count = m.connectCount ?? 0;
243
- const poolHits = m.poolHits ?? 0;
244
- const poolMisses = m.poolMisses ?? 0;
240
+ for (const [key, bm] of Object.entries(this.cache.backends) as Array<[string, IRustBackendMetrics]>) {
241
+ const totalTimeUs = bm.totalConnectTimeUs ?? 0;
242
+ const count = bm.connectCount ?? 0;
243
+ const poolHits = bm.poolHits ?? 0;
244
+ const poolMisses = bm.poolMisses ?? 0;
245
245
  const poolTotal = poolHits + poolMisses;
246
246
  result.set(key, {
247
- protocol: m.protocol ?? 'unknown',
248
- activeConnections: m.activeConnections ?? 0,
249
- totalConnections: m.totalConnections ?? 0,
250
- connectErrors: m.connectErrors ?? 0,
251
- handshakeErrors: m.handshakeErrors ?? 0,
252
- requestErrors: m.requestErrors ?? 0,
247
+ protocol: bm.protocol ?? 'unknown',
248
+ activeConnections: bm.activeConnections ?? 0,
249
+ totalConnections: bm.totalConnections ?? 0,
250
+ connectErrors: bm.connectErrors ?? 0,
251
+ handshakeErrors: bm.handshakeErrors ?? 0,
252
+ requestErrors: bm.requestErrors ?? 0,
253
253
  avgConnectTimeMs: count > 0 ? (totalTimeUs / count) / 1000 : 0,
254
254
  poolHitRate: poolTotal > 0 ? poolHits / poolTotal : 0,
255
- h2Failures: m.h2Failures ?? 0,
255
+ h2Failures: bm.h2Failures ?? 0,
256
256
  });
257
257
  }
258
258
  }
@@ -261,8 +261,8 @@ export class RustMetricsAdapter implements IMetrics {
261
261
  protocols: (): Map<string, string> => {
262
262
  const result = new Map<string, string>();
263
263
  if (this.cache?.backends) {
264
- for (const [key, bm] of Object.entries(this.cache.backends)) {
265
- result.set(key, (bm as any).protocol ?? 'unknown');
264
+ for (const [key, bm] of Object.entries(this.cache.backends) as Array<[string, IRustBackendMetrics]>) {
265
+ result.set(key, bm.protocol ?? 'unknown');
266
266
  }
267
267
  }
268
268
  return result;
@@ -270,9 +270,8 @@ export class RustMetricsAdapter implements IMetrics {
270
270
  topByErrors: (limit: number = 10): Array<{ backend: string; errors: number }> => {
271
271
  const result: Array<{ backend: string; errors: number }> = [];
272
272
  if (this.cache?.backends) {
273
- for (const [key, bm] of Object.entries(this.cache.backends)) {
274
- const m = bm as any;
275
- const errors = (m.connectErrors ?? 0) + (m.handshakeErrors ?? 0) + (m.requestErrors ?? 0);
273
+ for (const [key, bm] of Object.entries(this.cache.backends) as Array<[string, IRustBackendMetrics]>) {
274
+ const errors = (bm.connectErrors ?? 0) + (bm.handshakeErrors ?? 0) + (bm.requestErrors ?? 0);
276
275
  if (errors > 0) result.push({ backend: key, errors });
277
276
  }
278
277
  }