@push.rocks/smartproxy 27.0.0 → 27.2.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 CHANGED
@@ -1,5 +1,20 @@
1
1
  # Changelog
2
2
 
3
+ ## 2026-04-04 - 27.2.0 - feat(metrics)
4
+ add frontend and backend protocol distribution metrics
5
+
6
+ - track active and total frontend protocol counts for h1, h2, h3, websocket, and other traffic
7
+ - add backend protocol counters with RAII guards to ensure metrics are decremented on all exit paths
8
+ - expose protocol distribution through the TypeScript metrics interfaces and Rust metrics adapter
9
+
10
+ ## 2026-03-27 - 27.1.0 - feat(rustproxy-passthrough)
11
+ add selective connection recycling for route, security, and certificate updates
12
+
13
+ - introduce a shared connection registry to track active TCP and QUIC connections by route, source IP, and domain
14
+ - recycle only affected connections when route actions or security rules change instead of broadly invalidating traffic
15
+ - gracefully recycle existing connections when TLS certificates change for a domain
16
+ - apply route-level IP security checks to QUIC connections and share route cancellation state with UDP listeners
17
+
3
18
  ## 2026-03-26 - 27.0.0 - BREAKING CHANGE(smart-proxy)
4
19
  remove route helper APIs and standardize route configuration on plain route objects
5
20
 
Binary file
Binary file
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartproxy',
6
- version: '27.0.0',
6
+ version: '27.2.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
  };
9
9
  //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSx3QkFBd0I7SUFDOUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLHFQQUFxUDtDQUNuUSxDQUFBIn0=
@@ -29,6 +29,22 @@ export interface IThroughputHistoryPoint {
29
29
  /**
30
30
  * Main metrics interface with clean, grouped API
31
31
  */
32
+ /**
33
+ * Protocol distribution for frontend (client→proxy) or backend (proxy→upstream).
34
+ * Tracks active and total counts for h1/h2/h3/ws/other.
35
+ */
36
+ export interface IProtocolDistribution {
37
+ h1Active: number;
38
+ h1Total: number;
39
+ h2Active: number;
40
+ h2Total: number;
41
+ h3Active: number;
42
+ h3Total: number;
43
+ wsActive: number;
44
+ wsTotal: number;
45
+ otherActive: number;
46
+ otherTotal: number;
47
+ }
32
48
  export interface IMetrics {
33
49
  connections: {
34
50
  active(): number;
@@ -39,6 +55,8 @@ export interface IMetrics {
39
55
  ip: string;
40
56
  count: number;
41
57
  }>;
58
+ frontendProtocols(): IProtocolDistribution;
59
+ backendProtocols(): IProtocolDistribution;
42
60
  };
43
61
  throughput: {
44
62
  instant(): IThroughputData;
@@ -1,4 +1,4 @@
1
- import type { IMetrics, IBackendMetrics, IProtocolCacheEntry, IThroughputData, IThroughputHistoryPoint } from './models/metrics-types.js';
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
3
  /**
4
4
  * Adapts Rust JSON metrics to the IMetrics interface.
@@ -32,6 +32,8 @@ export declare class RustMetricsAdapter implements IMetrics {
32
32
  ip: string;
33
33
  count: number;
34
34
  }>;
35
+ frontendProtocols: () => IProtocolDistribution;
36
+ backendProtocols: () => IProtocolDistribution;
35
37
  };
36
38
  throughput: {
37
39
  instant: () => IThroughputData;
@@ -83,6 +83,58 @@ export class RustMetricsAdapter {
83
83
  result.sort((a, b) => b.count - a.count);
84
84
  return result.slice(0, limit);
85
85
  },
86
+ frontendProtocols: () => {
87
+ const fp = this.cache?.frontendProtocols;
88
+ return {
89
+ h1Active: fp?.h1Active ?? 0,
90
+ h1Total: fp?.h1Total ?? 0,
91
+ h2Active: fp?.h2Active ?? 0,
92
+ h2Total: fp?.h2Total ?? 0,
93
+ h3Active: fp?.h3Active ?? 0,
94
+ h3Total: fp?.h3Total ?? 0,
95
+ wsActive: fp?.wsActive ?? 0,
96
+ wsTotal: fp?.wsTotal ?? 0,
97
+ otherActive: fp?.otherActive ?? 0,
98
+ otherTotal: fp?.otherTotal ?? 0,
99
+ };
100
+ },
101
+ backendProtocols: () => {
102
+ // Merge per-backend h1/h2/h3 data with aggregate ws/other counters
103
+ const bp = this.cache?.backendProtocols;
104
+ let h1Active = 0, h1Total = 0;
105
+ let h2Active = 0, h2Total = 0;
106
+ let h3Active = 0, h3Total = 0;
107
+ if (this.cache?.backends) {
108
+ for (const bm of Object.values(this.cache.backends)) {
109
+ const m = bm;
110
+ const active = m.activeConnections ?? 0;
111
+ const total = m.totalConnections ?? 0;
112
+ switch (m.protocol) {
113
+ case 'h2':
114
+ h2Active += active;
115
+ h2Total += total;
116
+ break;
117
+ case 'h3':
118
+ h3Active += active;
119
+ h3Total += total;
120
+ break;
121
+ default:
122
+ h1Active += active;
123
+ h1Total += total;
124
+ break;
125
+ }
126
+ }
127
+ }
128
+ return {
129
+ h1Active, h1Total,
130
+ h2Active, h2Total,
131
+ h3Active, h3Total,
132
+ wsActive: bp?.wsActive ?? 0,
133
+ wsTotal: bp?.wsTotal ?? 0,
134
+ otherActive: bp?.otherActive ?? 0,
135
+ otherTotal: bp?.otherTotal ?? 0,
136
+ };
137
+ },
86
138
  };
87
139
  throughput = {
88
140
  instant: () => {
@@ -229,4 +281,4 @@ export class RustMetricsAdapter {
229
281
  },
230
282
  };
231
283
  }
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1tZXRyaWNzLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3J1c3QtbWV0cmljcy1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3JCLE1BQU0sQ0FBa0I7SUFDeEIsS0FBSyxHQUFRLElBQUksQ0FBQztJQUNsQixTQUFTLEdBQTBDLElBQUksQ0FBQztJQUN4RCxjQUFjLENBQVM7SUFFL0IsWUFBWSxNQUF1QixFQUFFLGNBQWMsR0FBRyxJQUFJO1FBQ3hELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLG1EQUFtRDtRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDM0Isa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNoQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNo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
284
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1tZXRyaWNzLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3J1c3QtbWV0cmljcy1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBQ3JCLE1BQU0sQ0FBa0I7SUFDeEIsS0FBSyxHQUFRLElBQUksQ0FBQztJQUNsQixTQUFTLEdBQTBDLElBQUksQ0FBQztJQUN4RCxjQUFjLENBQVM7SUFFL0IsWUFBWSxNQUF1QixFQUFFLGNBQWMsR0FBRyxJQUFJO1FBQ3hELElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO0lBQ3ZDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxJQUFJO1FBQ2YsSUFBSSxDQUFDO1lBQ0gsSUFBSSxDQUFDLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDOUMsQ0FBQztRQUFDLE1BQU0sQ0FBQztZQUNQLG1EQUFtRDtRQUNyRCxDQUFDO0lBQ0gsQ0FBQztJQUVNLFlBQVk7UUFDakIsSUFBSSxJQUFJLENBQUMsU0FBUztZQUFFLE9BQU87UUFDM0Isa0RBQWtEO1FBQ2xELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNaLElBQUksQ0FBQyxTQUFTLEdBQUcsV0FBVyxDQUFDLEdBQUcsRUFBRTtZQUNoQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDZCxDQUFDLEVBQUUsSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQ3hCLElBQUksSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUN6QixJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ3pCLENBQUM7SUFDSCxDQUFDO0lBRU0sV0FBVztRQUNo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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartproxy",
3
- "version": "27.0.0",
3
+ "version": "27.2.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.0.0',
6
+ version: '27.2.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
  }
@@ -32,6 +32,23 @@ export interface IThroughputHistoryPoint {
32
32
  /**
33
33
  * Main metrics interface with clean, grouped API
34
34
  */
35
+ /**
36
+ * Protocol distribution for frontend (client→proxy) or backend (proxy→upstream).
37
+ * Tracks active and total counts for h1/h2/h3/ws/other.
38
+ */
39
+ export interface IProtocolDistribution {
40
+ h1Active: number;
41
+ h1Total: number;
42
+ h2Active: number;
43
+ h2Total: number;
44
+ h3Active: number;
45
+ h3Total: number;
46
+ wsActive: number;
47
+ wsTotal: number;
48
+ otherActive: number;
49
+ otherTotal: number;
50
+ }
51
+
35
52
  export interface IMetrics {
36
53
  // Connection metrics
37
54
  connections: {
@@ -40,6 +57,8 @@ export interface IMetrics {
40
57
  byRoute(): Map<string, number>;
41
58
  byIP(): Map<string, number>;
42
59
  topIPs(limit?: number): Array<{ ip: string; count: number }>;
60
+ frontendProtocols(): IProtocolDistribution;
61
+ backendProtocols(): IProtocolDistribution;
43
62
  };
44
63
 
45
64
  // Throughput metrics (bytes per second)
@@ -1,4 +1,4 @@
1
- import type { IMetrics, IBackendMetrics, IProtocolCacheEntry, IThroughputData, IThroughputHistoryPoint } from './models/metrics-types.js';
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
3
 
4
4
  /**
@@ -90,6 +90,49 @@ export class RustMetricsAdapter implements IMetrics {
90
90
  result.sort((a, b) => b.count - a.count);
91
91
  return result.slice(0, limit);
92
92
  },
93
+ frontendProtocols: (): IProtocolDistribution => {
94
+ const fp = this.cache?.frontendProtocols;
95
+ return {
96
+ h1Active: fp?.h1Active ?? 0,
97
+ h1Total: fp?.h1Total ?? 0,
98
+ h2Active: fp?.h2Active ?? 0,
99
+ h2Total: fp?.h2Total ?? 0,
100
+ h3Active: fp?.h3Active ?? 0,
101
+ h3Total: fp?.h3Total ?? 0,
102
+ wsActive: fp?.wsActive ?? 0,
103
+ wsTotal: fp?.wsTotal ?? 0,
104
+ otherActive: fp?.otherActive ?? 0,
105
+ otherTotal: fp?.otherTotal ?? 0,
106
+ };
107
+ },
108
+ backendProtocols: (): IProtocolDistribution => {
109
+ // Merge per-backend h1/h2/h3 data with aggregate ws/other counters
110
+ const bp = this.cache?.backendProtocols;
111
+ let h1Active = 0, h1Total = 0;
112
+ let h2Active = 0, h2Total = 0;
113
+ let h3Active = 0, h3Total = 0;
114
+ if (this.cache?.backends) {
115
+ for (const bm of Object.values(this.cache.backends)) {
116
+ const m = bm as any;
117
+ const active = m.activeConnections ?? 0;
118
+ const total = m.totalConnections ?? 0;
119
+ switch (m.protocol) {
120
+ case 'h2': h2Active += active; h2Total += total; break;
121
+ case 'h3': h3Active += active; h3Total += total; break;
122
+ default: h1Active += active; h1Total += total; break;
123
+ }
124
+ }
125
+ }
126
+ return {
127
+ h1Active, h1Total,
128
+ h2Active, h2Total,
129
+ h3Active, h3Total,
130
+ wsActive: bp?.wsActive ?? 0,
131
+ wsTotal: bp?.wsTotal ?? 0,
132
+ otherActive: bp?.otherActive ?? 0,
133
+ otherTotal: bp?.otherTotal ?? 0,
134
+ };
135
+ },
93
136
  };
94
137
 
95
138
  public throughput = {