@push.rocks/smartproxy 25.1.0 → 25.2.1
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 +16 -0
- package/dist_rust/rustproxy_linux_amd64 +0 -0
- package/dist_rust/rustproxy_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.d.ts +2 -2
- package/dist_ts/proxies/smart-proxy/rust-metrics-adapter.js +38 -15
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/proxies/smart-proxy/rust-metrics-adapter.ts +36 -14
package/changelog.md
CHANGED
|
@@ -1,5 +1,21 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 2026-02-14 - 25.2.1 - fix(smartproxy)
|
|
4
|
+
no changes detected in git diff
|
|
5
|
+
|
|
6
|
+
- The provided diff contains no file changes; no code or documentation updates to release.
|
|
7
|
+
|
|
8
|
+
## 2026-02-14 - 25.2.0 - feat(metrics)
|
|
9
|
+
add per-IP and HTTP-request metrics, propagate source IP through proxy paths, and expose new metrics to the TS adapter
|
|
10
|
+
|
|
11
|
+
- Add per-IP tracking and IpMetrics in MetricsCollector (active/total connections, bytes, throughput).
|
|
12
|
+
- Add HTTP request counters and tracking (total_http_requests, http_requests_per_sec, recent counters and tests).
|
|
13
|
+
- Include throughput history (ThroughputSample serialization, retention and snapshotting) and expose history in snapshots.
|
|
14
|
+
- Propagate source IP through HTTP and passthrough code paths: CountingBody.record_bytes and MetricsCollector methods now accept source_ip; connection_opened/closed calls include source IP.
|
|
15
|
+
- Introduce ForwardMetricsCtx to carry metrics context (collector, route_id, source_ip) into passthrough forwarding routines; update ConnectionGuard to include source_ip.
|
|
16
|
+
- TypeScript adapter (rust-metrics-adapter.ts) updated to return per-IP counts, top IPs, per-IP throughput, throughput history mapping, and HTTP request rates/total where available.
|
|
17
|
+
- Numerous unit tests added for per-IP tracking, HTTP request tracking, throughput history and ThroughputTracker.history behavior.
|
|
18
|
+
|
|
3
19
|
## 2026-02-13 - 25.1.0 - feat(metrics)
|
|
4
20
|
add real-time throughput sampling and byte-counting metrics
|
|
5
21
|
|
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartproxy',
|
|
6
|
-
version: '25.1
|
|
6
|
+
version: '25.2.1',
|
|
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=
|
|
@@ -28,7 +28,7 @@ export declare class RustMetricsAdapter implements IMetrics {
|
|
|
28
28
|
total: () => number;
|
|
29
29
|
byRoute: () => Map<string, number>;
|
|
30
30
|
byIP: () => Map<string, number>;
|
|
31
|
-
topIPs: (
|
|
31
|
+
topIPs: (limit?: number) => Array<{
|
|
32
32
|
ip: string;
|
|
33
33
|
count: number;
|
|
34
34
|
}>;
|
|
@@ -38,7 +38,7 @@ export declare class RustMetricsAdapter implements IMetrics {
|
|
|
38
38
|
recent: () => IThroughputData;
|
|
39
39
|
average: () => IThroughputData;
|
|
40
40
|
custom: (_seconds: number) => IThroughputData;
|
|
41
|
-
history: (
|
|
41
|
+
history: (seconds: number) => Array<IThroughputHistoryPoint>;
|
|
42
42
|
byRoute: (_windowSeconds?: number) => Map<string, IThroughputData>;
|
|
43
43
|
byIP: (_windowSeconds?: number) => Map<string, IThroughputData>;
|
|
44
44
|
};
|
|
@@ -31,12 +31,23 @@ export class RustMetricsAdapter {
|
|
|
31
31
|
return result;
|
|
32
32
|
},
|
|
33
33
|
byIP: () => {
|
|
34
|
-
|
|
35
|
-
|
|
34
|
+
const result = new Map();
|
|
35
|
+
if (this.cache?.ips) {
|
|
36
|
+
for (const [ip, im] of Object.entries(this.cache.ips)) {
|
|
37
|
+
result.set(ip, im.activeConnections ?? 0);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return result;
|
|
36
41
|
},
|
|
37
|
-
topIPs: (
|
|
38
|
-
|
|
39
|
-
|
|
42
|
+
topIPs: (limit = 10) => {
|
|
43
|
+
const result = [];
|
|
44
|
+
if (this.cache?.ips) {
|
|
45
|
+
for (const [ip, im] of Object.entries(this.cache.ips)) {
|
|
46
|
+
result.push({ ip, count: im.activeConnections ?? 0 });
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
result.sort((a, b) => b.count - a.count);
|
|
50
|
+
return result.slice(0, limit);
|
|
40
51
|
},
|
|
41
52
|
};
|
|
42
53
|
this.throughput = {
|
|
@@ -58,9 +69,14 @@ export class RustMetricsAdapter {
|
|
|
58
69
|
custom: (_seconds) => {
|
|
59
70
|
return this.throughput.instant();
|
|
60
71
|
},
|
|
61
|
-
history: (
|
|
62
|
-
|
|
63
|
-
|
|
72
|
+
history: (seconds) => {
|
|
73
|
+
if (!this.cache?.throughputHistory)
|
|
74
|
+
return [];
|
|
75
|
+
return this.cache.throughputHistory.slice(-seconds).map((p) => ({
|
|
76
|
+
timestamp: p.timestampMs,
|
|
77
|
+
in: p.bytesIn,
|
|
78
|
+
out: p.bytesOut,
|
|
79
|
+
}));
|
|
64
80
|
},
|
|
65
81
|
byRoute: (_windowSeconds) => {
|
|
66
82
|
const result = new Map();
|
|
@@ -75,20 +91,27 @@ export class RustMetricsAdapter {
|
|
|
75
91
|
return result;
|
|
76
92
|
},
|
|
77
93
|
byIP: (_windowSeconds) => {
|
|
78
|
-
|
|
94
|
+
const result = new Map();
|
|
95
|
+
if (this.cache?.ips) {
|
|
96
|
+
for (const [ip, im] of Object.entries(this.cache.ips)) {
|
|
97
|
+
result.set(ip, {
|
|
98
|
+
in: im.throughputInBytesPerSec ?? 0,
|
|
99
|
+
out: im.throughputOutBytesPerSec ?? 0,
|
|
100
|
+
});
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
79
104
|
},
|
|
80
105
|
};
|
|
81
106
|
this.requests = {
|
|
82
107
|
perSecond: () => {
|
|
83
|
-
|
|
84
|
-
return 0;
|
|
108
|
+
return this.cache?.httpRequestsPerSec ?? 0;
|
|
85
109
|
},
|
|
86
110
|
perMinute: () => {
|
|
87
|
-
return 0;
|
|
111
|
+
return (this.cache?.httpRequestsPerSecRecent ?? 0) * 60;
|
|
88
112
|
},
|
|
89
113
|
total: () => {
|
|
90
|
-
|
|
91
|
-
return this.cache?.totalConnections ?? 0;
|
|
114
|
+
return this.cache?.totalHttpRequests ?? this.cache?.totalConnections ?? 0;
|
|
92
115
|
},
|
|
93
116
|
};
|
|
94
117
|
this.totals = {
|
|
@@ -146,4 +169,4 @@ export class RustMetricsAdapter {
|
|
|
146
169
|
}
|
|
147
170
|
}
|
|
148
171
|
}
|
|
149
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
172
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVzdC1tZXRyaWNzLWFkYXB0ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9wcm94aWVzL3NtYXJ0LXByb3h5L3J1c3QtbWV0cmljcy1hZGFwdGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBOzs7Ozs7Ozs7O0dBVUc7QUFDSCxNQUFNLE9BQU8sa0JBQWtCO0lBTTdCLFlBQVksTUFBdUIsRUFBRSxjQUFjLEdBQUcsSUFBSTtRQUpsRCxVQUFLLEdBQVEsSUFBSSxDQUFDO1FBQ2xCLGNBQVMsR0FBMEMsSUFBSSxDQUFDO1FBc0NoRSxrQ0FBa0M7UUFFM0IsZ0JBQVcsR0FBRztZQUNuQixNQUFNLEVBQUUsR0FBVyxFQUFFO2dCQUNuQixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsaUJBQWlCLElBQUksQ0FBQyxDQUFDO1lBQzVDLENBQUM7WUFDRCxLQUFLLEVBQUUsR0FBVyxFQUFFO2dCQUNsQixPQUFPLElBQUksQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLElBQUksQ0FBQyxDQUFDO1lBQzNDLENBQUM7WUFDRCxPQUFPLEVBQUUsR0FBd0IsRUFBRTtnQkFDakMsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWtCLENBQUM7Z0JBQ3pDLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUMzRCxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRyxFQUFVLENBQUMsaUJBQWlCLElBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3ZELENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxPQUFPLE1BQU0sQ0FBQztZQUNoQixDQUFDO1lBQ0QsSUFBSSxFQUFFLEdBQXdCLEVBQUU7Z0JBQzlCLE1BQU0sTUFBTSxHQUFHLElB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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartproxy",
|
|
3
|
-
"version": "25.1
|
|
3
|
+
"version": "25.2.1",
|
|
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",
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -3,6 +3,6 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartproxy',
|
|
6
|
-
version: '25.1
|
|
6
|
+
version: '25.2.1',
|
|
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
|
}
|
|
@@ -72,12 +72,23 @@ export class RustMetricsAdapter implements IMetrics {
|
|
|
72
72
|
return result;
|
|
73
73
|
},
|
|
74
74
|
byIP: (): Map<string, number> => {
|
|
75
|
-
|
|
76
|
-
|
|
75
|
+
const result = new Map<string, number>();
|
|
76
|
+
if (this.cache?.ips) {
|
|
77
|
+
for (const [ip, im] of Object.entries(this.cache.ips)) {
|
|
78
|
+
result.set(ip, (im as any).activeConnections ?? 0);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
return result;
|
|
77
82
|
},
|
|
78
|
-
topIPs: (
|
|
79
|
-
|
|
80
|
-
|
|
83
|
+
topIPs: (limit: number = 10): Array<{ ip: string; count: number }> => {
|
|
84
|
+
const result: Array<{ ip: string; count: number }> = [];
|
|
85
|
+
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 });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
result.sort((a, b) => b.count - a.count);
|
|
91
|
+
return result.slice(0, limit);
|
|
81
92
|
},
|
|
82
93
|
};
|
|
83
94
|
|
|
@@ -100,9 +111,13 @@ export class RustMetricsAdapter implements IMetrics {
|
|
|
100
111
|
custom: (_seconds: number): IThroughputData => {
|
|
101
112
|
return this.throughput.instant();
|
|
102
113
|
},
|
|
103
|
-
history: (
|
|
104
|
-
|
|
105
|
-
return
|
|
114
|
+
history: (seconds: number): Array<IThroughputHistoryPoint> => {
|
|
115
|
+
if (!this.cache?.throughputHistory) return [];
|
|
116
|
+
return this.cache.throughputHistory.slice(-seconds).map((p: any) => ({
|
|
117
|
+
timestamp: p.timestampMs,
|
|
118
|
+
in: p.bytesIn,
|
|
119
|
+
out: p.bytesOut,
|
|
120
|
+
}));
|
|
106
121
|
},
|
|
107
122
|
byRoute: (_windowSeconds?: number): Map<string, IThroughputData> => {
|
|
108
123
|
const result = new Map<string, IThroughputData>();
|
|
@@ -117,21 +132,28 @@ export class RustMetricsAdapter implements IMetrics {
|
|
|
117
132
|
return result;
|
|
118
133
|
},
|
|
119
134
|
byIP: (_windowSeconds?: number): Map<string, IThroughputData> => {
|
|
120
|
-
|
|
135
|
+
const result = new Map<string, IThroughputData>();
|
|
136
|
+
if (this.cache?.ips) {
|
|
137
|
+
for (const [ip, im] of Object.entries(this.cache.ips)) {
|
|
138
|
+
result.set(ip, {
|
|
139
|
+
in: (im as any).throughputInBytesPerSec ?? 0,
|
|
140
|
+
out: (im as any).throughputOutBytesPerSec ?? 0,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return result;
|
|
121
145
|
},
|
|
122
146
|
};
|
|
123
147
|
|
|
124
148
|
public requests = {
|
|
125
149
|
perSecond: (): number => {
|
|
126
|
-
|
|
127
|
-
return 0;
|
|
150
|
+
return this.cache?.httpRequestsPerSec ?? 0;
|
|
128
151
|
},
|
|
129
152
|
perMinute: (): number => {
|
|
130
|
-
return 0;
|
|
153
|
+
return (this.cache?.httpRequestsPerSecRecent ?? 0) * 60;
|
|
131
154
|
},
|
|
132
155
|
total: (): number => {
|
|
133
|
-
|
|
134
|
-
return this.cache?.totalConnections ?? 0;
|
|
156
|
+
return this.cache?.totalHttpRequests ?? this.cache?.totalConnections ?? 0;
|
|
135
157
|
},
|
|
136
158
|
};
|
|
137
159
|
|