@push.rocks/smartvpn 1.0.3 → 1.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.
- package/dist_rust/smartvpn_daemon_linux_amd64 +0 -0
- package/dist_rust/smartvpn_daemon_linux_arm64 +0 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/smartvpn.classes.vpnclient.d.ts +10 -2
- package/dist_ts/smartvpn.classes.vpnclient.js +14 -2
- package/dist_ts/smartvpn.classes.vpnserver.d.ts +13 -1
- package/dist_ts/smartvpn.classes.vpnserver.js +23 -1
- package/dist_ts/smartvpn.interfaces.d.ts +70 -0
- package/package.json +1 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/smartvpn.classes.vpnclient.ts +17 -1
- package/ts/smartvpn.classes.vpnserver.ts +30 -0
- package/ts/smartvpn.interfaces.ts +63 -0
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartvpn',
|
|
6
|
-
version: '1.0
|
|
6
|
+
version: '1.1.0',
|
|
7
7
|
description: 'A VPN solution with TypeScript control plane and Rust data plane daemon'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLE9BQU87SUFDaEIsV0FBVyxFQUFFLHlFQUF5RTtDQUN2RixDQUFBIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './smartvpn.plugins.js';
|
|
2
|
-
import type { IVpnClientOptions, IVpnClientConfig, IVpnStatus, IVpnStatistics } from './smartvpn.interfaces.js';
|
|
2
|
+
import type { IVpnClientOptions, IVpnClientConfig, IVpnStatus, IVpnStatistics, IVpnConnectionQuality, IVpnMtuInfo } from './smartvpn.interfaces.js';
|
|
3
3
|
/**
|
|
4
4
|
* VPN Client — manages a smartvpn daemon in client mode.
|
|
5
5
|
*/
|
|
@@ -26,9 +26,17 @@ export declare class VpnClient extends plugins.events.EventEmitter {
|
|
|
26
26
|
*/
|
|
27
27
|
getStatus(): Promise<IVpnStatus>;
|
|
28
28
|
/**
|
|
29
|
-
* Get traffic statistics.
|
|
29
|
+
* Get traffic statistics (includes connection quality when connected).
|
|
30
30
|
*/
|
|
31
31
|
getStatistics(): Promise<IVpnStatistics>;
|
|
32
|
+
/**
|
|
33
|
+
* Get connection quality metrics (RTT, jitter, loss, link health).
|
|
34
|
+
*/
|
|
35
|
+
getConnectionQuality(): Promise<IVpnConnectionQuality>;
|
|
36
|
+
/**
|
|
37
|
+
* Get MTU information (overhead, effective MTU, oversized packet stats).
|
|
38
|
+
*/
|
|
39
|
+
getMtuInfo(): Promise<IVpnMtuInfo>;
|
|
32
40
|
/**
|
|
33
41
|
* Stop the daemon bridge.
|
|
34
42
|
*/
|
|
@@ -48,11 +48,23 @@ export class VpnClient extends plugins.events.EventEmitter {
|
|
|
48
48
|
return this.bridge.sendCommand('getStatus', {});
|
|
49
49
|
}
|
|
50
50
|
/**
|
|
51
|
-
* Get traffic statistics.
|
|
51
|
+
* Get traffic statistics (includes connection quality when connected).
|
|
52
52
|
*/
|
|
53
53
|
async getStatistics() {
|
|
54
54
|
return this.bridge.sendCommand('getStatistics', {});
|
|
55
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* Get connection quality metrics (RTT, jitter, loss, link health).
|
|
58
|
+
*/
|
|
59
|
+
async getConnectionQuality() {
|
|
60
|
+
return this.bridge.sendCommand('getConnectionQuality', {});
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Get MTU information (overhead, effective MTU, oversized packet stats).
|
|
64
|
+
*/
|
|
65
|
+
async getMtuInfo() {
|
|
66
|
+
return this.bridge.sendCommand('getMtuInfo', {});
|
|
67
|
+
}
|
|
56
68
|
/**
|
|
57
69
|
* Stop the daemon bridge.
|
|
58
70
|
*/
|
|
@@ -66,4 +78,4 @@ export class VpnClient extends plugins.events.EventEmitter {
|
|
|
66
78
|
return this.bridge.running;
|
|
67
79
|
}
|
|
68
80
|
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
81
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4uY2xhc3Nlcy52cG5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHZwbi5jbGFzc2VzLnZwbmNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVc1RDs7R0FFRztBQUNILE1BQU0sT0FBTyxTQUFVLFNBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBSXhELFlBQVksT0FBMEI7UUFDcEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFxQjtZQUM5QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDLENBQUM7UUFFSCx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBbUIsRUFBRSxNQUFxQixFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQXlCO1FBQzVDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUMxQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsRUFBMkIsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQTJCLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsYUFBYTtRQUN4QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxFQUEyQixDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLG9CQUFvQjtRQUMvQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHNCQUFzQixFQUFFLEVBQTJCLENBQUMsQ0FBQztJQUN0RixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFlBQVksRUFBRSxFQUEyQixDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSTtRQUNULElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztDQUNGIn0=
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './smartvpn.plugins.js';
|
|
2
|
-
import type { IVpnServerOptions, IVpnServerConfig, IVpnStatus, IVpnServerStatistics, IVpnClientInfo, IVpnKeypair } from './smartvpn.interfaces.js';
|
|
2
|
+
import type { IVpnServerOptions, IVpnServerConfig, IVpnStatus, IVpnServerStatistics, IVpnClientInfo, IVpnKeypair, IVpnClientTelemetry } from './smartvpn.interfaces.js';
|
|
3
3
|
/**
|
|
4
4
|
* VPN Server — manages a smartvpn daemon in server mode.
|
|
5
5
|
*/
|
|
@@ -35,6 +35,18 @@ export declare class VpnServer extends plugins.events.EventEmitter {
|
|
|
35
35
|
* Generate a new Noise keypair.
|
|
36
36
|
*/
|
|
37
37
|
generateKeypair(): Promise<IVpnKeypair>;
|
|
38
|
+
/**
|
|
39
|
+
* Set rate limit for a specific client.
|
|
40
|
+
*/
|
|
41
|
+
setClientRateLimit(clientId: string, rateBytesPerSec: number, burstBytes: number): Promise<void>;
|
|
42
|
+
/**
|
|
43
|
+
* Remove rate limit for a specific client (unlimited).
|
|
44
|
+
*/
|
|
45
|
+
removeClientRateLimit(clientId: string): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Get telemetry for a specific client.
|
|
48
|
+
*/
|
|
49
|
+
getClientTelemetry(clientId: string): Promise<IVpnClientTelemetry>;
|
|
38
50
|
/**
|
|
39
51
|
* Stop the daemon bridge.
|
|
40
52
|
*/
|
|
@@ -69,6 +69,28 @@ export class VpnServer extends plugins.events.EventEmitter {
|
|
|
69
69
|
async generateKeypair() {
|
|
70
70
|
return this.bridge.sendCommand('generateKeypair', {});
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Set rate limit for a specific client.
|
|
74
|
+
*/
|
|
75
|
+
async setClientRateLimit(clientId, rateBytesPerSec, burstBytes) {
|
|
76
|
+
await this.bridge.sendCommand('setClientRateLimit', {
|
|
77
|
+
clientId,
|
|
78
|
+
rateBytesPerSec,
|
|
79
|
+
burstBytes,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Remove rate limit for a specific client (unlimited).
|
|
84
|
+
*/
|
|
85
|
+
async removeClientRateLimit(clientId) {
|
|
86
|
+
await this.bridge.sendCommand('removeClientRateLimit', { clientId });
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Get telemetry for a specific client.
|
|
90
|
+
*/
|
|
91
|
+
async getClientTelemetry(clientId) {
|
|
92
|
+
return this.bridge.sendCommand('getClientTelemetry', { clientId });
|
|
93
|
+
}
|
|
72
94
|
/**
|
|
73
95
|
* Stop the daemon bridge.
|
|
74
96
|
*/
|
|
@@ -82,4 +104,4 @@ export class VpnServer extends plugins.events.EventEmitter {
|
|
|
82
104
|
return this.bridge.running;
|
|
83
105
|
}
|
|
84
106
|
}
|
|
85
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
107
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4uY2xhc3Nlcy52cG5zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHZwbi5jbGFzc2VzLnZwbnNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVk1RDs7R0FFRztBQUNILE1BQU0sT0FBTyxTQUFVLFNBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBSXhELFlBQVksT0FBMEI7UUFDcEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFxQjtZQUM5QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDLENBQUM7UUFFSCx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBbUIsRUFBRSxNQUFxQixFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBeUI7UUFDMUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEVB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
|
|
@@ -47,6 +47,10 @@ export interface IVpnServerConfig {
|
|
|
47
47
|
keepaliveIntervalSecs?: number;
|
|
48
48
|
/** Enable NAT/masquerade for client traffic */
|
|
49
49
|
enableNat?: boolean;
|
|
50
|
+
/** Default rate limit for new clients (bytes/sec). Omit for unlimited. */
|
|
51
|
+
defaultRateLimitBytesPerSec?: number;
|
|
52
|
+
/** Default burst size for new clients (bytes). Omit for unlimited. */
|
|
53
|
+
defaultBurstBytes?: number;
|
|
50
54
|
}
|
|
51
55
|
export interface IVpnServerOptions {
|
|
52
56
|
transport: TVpnTransportOptions;
|
|
@@ -68,6 +72,7 @@ export interface IVpnStatistics {
|
|
|
68
72
|
keepalivesSent: number;
|
|
69
73
|
keepalivesReceived: number;
|
|
70
74
|
uptimeSeconds: number;
|
|
75
|
+
quality?: IVpnConnectionQuality;
|
|
71
76
|
}
|
|
72
77
|
export interface IVpnClientInfo {
|
|
73
78
|
clientId: string;
|
|
@@ -75,6 +80,12 @@ export interface IVpnClientInfo {
|
|
|
75
80
|
connectedSince: string;
|
|
76
81
|
bytesSent: number;
|
|
77
82
|
bytesReceived: number;
|
|
83
|
+
packetsDropped: number;
|
|
84
|
+
bytesDropped: number;
|
|
85
|
+
lastKeepaliveAt?: string;
|
|
86
|
+
keepalivesReceived: number;
|
|
87
|
+
rateLimitBytesPerSec?: number;
|
|
88
|
+
burstBytes?: number;
|
|
78
89
|
}
|
|
79
90
|
export interface IVpnServerStatistics extends IVpnStatistics {
|
|
80
91
|
activeClients: number;
|
|
@@ -84,6 +95,37 @@ export interface IVpnKeypair {
|
|
|
84
95
|
publicKey: string;
|
|
85
96
|
privateKey: string;
|
|
86
97
|
}
|
|
98
|
+
export type TVpnLinkHealth = 'healthy' | 'degraded' | 'critical';
|
|
99
|
+
export interface IVpnConnectionQuality {
|
|
100
|
+
srttMs: number;
|
|
101
|
+
jitterMs: number;
|
|
102
|
+
minRttMs: number;
|
|
103
|
+
maxRttMs: number;
|
|
104
|
+
lossRatio: number;
|
|
105
|
+
consecutiveTimeouts: number;
|
|
106
|
+
linkHealth: TVpnLinkHealth;
|
|
107
|
+
currentKeepaliveIntervalSecs: number;
|
|
108
|
+
}
|
|
109
|
+
export interface IVpnMtuInfo {
|
|
110
|
+
tunMtu: number;
|
|
111
|
+
effectiveMtu: number;
|
|
112
|
+
linkMtu: number;
|
|
113
|
+
overheadBytes: number;
|
|
114
|
+
oversizedPacketsDropped: number;
|
|
115
|
+
icmpTooBigSent: number;
|
|
116
|
+
}
|
|
117
|
+
export interface IVpnClientTelemetry {
|
|
118
|
+
clientId: string;
|
|
119
|
+
assignedIp: string;
|
|
120
|
+
lastKeepaliveAt?: string;
|
|
121
|
+
keepalivesReceived: number;
|
|
122
|
+
packetsDropped: number;
|
|
123
|
+
bytesDropped: number;
|
|
124
|
+
bytesReceived: number;
|
|
125
|
+
bytesSent: number;
|
|
126
|
+
rateLimitBytesPerSec?: number;
|
|
127
|
+
burstBytes?: number;
|
|
128
|
+
}
|
|
87
129
|
export type TVpnClientCommands = {
|
|
88
130
|
connect: {
|
|
89
131
|
params: {
|
|
@@ -105,6 +147,14 @@ export type TVpnClientCommands = {
|
|
|
105
147
|
params: Record<string, never>;
|
|
106
148
|
result: IVpnStatistics;
|
|
107
149
|
};
|
|
150
|
+
getConnectionQuality: {
|
|
151
|
+
params: Record<string, never>;
|
|
152
|
+
result: IVpnConnectionQuality;
|
|
153
|
+
};
|
|
154
|
+
getMtuInfo: {
|
|
155
|
+
params: Record<string, never>;
|
|
156
|
+
result: IVpnMtuInfo;
|
|
157
|
+
};
|
|
108
158
|
};
|
|
109
159
|
export type TVpnServerCommands = {
|
|
110
160
|
start: {
|
|
@@ -141,6 +191,26 @@ export type TVpnServerCommands = {
|
|
|
141
191
|
params: Record<string, never>;
|
|
142
192
|
result: IVpnKeypair;
|
|
143
193
|
};
|
|
194
|
+
setClientRateLimit: {
|
|
195
|
+
params: {
|
|
196
|
+
clientId: string;
|
|
197
|
+
rateBytesPerSec: number;
|
|
198
|
+
burstBytes: number;
|
|
199
|
+
};
|
|
200
|
+
result: void;
|
|
201
|
+
};
|
|
202
|
+
removeClientRateLimit: {
|
|
203
|
+
params: {
|
|
204
|
+
clientId: string;
|
|
205
|
+
};
|
|
206
|
+
result: void;
|
|
207
|
+
};
|
|
208
|
+
getClientTelemetry: {
|
|
209
|
+
params: {
|
|
210
|
+
clientId: string;
|
|
211
|
+
};
|
|
212
|
+
result: IVpnClientTelemetry;
|
|
213
|
+
};
|
|
144
214
|
};
|
|
145
215
|
export type TVpnPlatform = 'linux' | 'macos' | 'windows' | 'unknown';
|
|
146
216
|
export interface IVpnServiceUnit {
|
package/package.json
CHANGED
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -5,6 +5,8 @@ import type {
|
|
|
5
5
|
IVpnClientConfig,
|
|
6
6
|
IVpnStatus,
|
|
7
7
|
IVpnStatistics,
|
|
8
|
+
IVpnConnectionQuality,
|
|
9
|
+
IVpnMtuInfo,
|
|
8
10
|
TVpnClientCommands,
|
|
9
11
|
} from './smartvpn.interfaces.js';
|
|
10
12
|
|
|
@@ -65,12 +67,26 @@ export class VpnClient extends plugins.events.EventEmitter {
|
|
|
65
67
|
}
|
|
66
68
|
|
|
67
69
|
/**
|
|
68
|
-
* Get traffic statistics.
|
|
70
|
+
* Get traffic statistics (includes connection quality when connected).
|
|
69
71
|
*/
|
|
70
72
|
public async getStatistics(): Promise<IVpnStatistics> {
|
|
71
73
|
return this.bridge.sendCommand('getStatistics', {} as Record<string, never>);
|
|
72
74
|
}
|
|
73
75
|
|
|
76
|
+
/**
|
|
77
|
+
* Get connection quality metrics (RTT, jitter, loss, link health).
|
|
78
|
+
*/
|
|
79
|
+
public async getConnectionQuality(): Promise<IVpnConnectionQuality> {
|
|
80
|
+
return this.bridge.sendCommand('getConnectionQuality', {} as Record<string, never>);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Get MTU information (overhead, effective MTU, oversized packet stats).
|
|
85
|
+
*/
|
|
86
|
+
public async getMtuInfo(): Promise<IVpnMtuInfo> {
|
|
87
|
+
return this.bridge.sendCommand('getMtuInfo', {} as Record<string, never>);
|
|
88
|
+
}
|
|
89
|
+
|
|
74
90
|
/**
|
|
75
91
|
* Stop the daemon bridge.
|
|
76
92
|
*/
|
|
@@ -7,6 +7,7 @@ import type {
|
|
|
7
7
|
IVpnServerStatistics,
|
|
8
8
|
IVpnClientInfo,
|
|
9
9
|
IVpnKeypair,
|
|
10
|
+
IVpnClientTelemetry,
|
|
10
11
|
TVpnServerCommands,
|
|
11
12
|
} from './smartvpn.interfaces.js';
|
|
12
13
|
|
|
@@ -91,6 +92,35 @@ export class VpnServer extends plugins.events.EventEmitter {
|
|
|
91
92
|
return this.bridge.sendCommand('generateKeypair', {} as Record<string, never>);
|
|
92
93
|
}
|
|
93
94
|
|
|
95
|
+
/**
|
|
96
|
+
* Set rate limit for a specific client.
|
|
97
|
+
*/
|
|
98
|
+
public async setClientRateLimit(
|
|
99
|
+
clientId: string,
|
|
100
|
+
rateBytesPerSec: number,
|
|
101
|
+
burstBytes: number,
|
|
102
|
+
): Promise<void> {
|
|
103
|
+
await this.bridge.sendCommand('setClientRateLimit', {
|
|
104
|
+
clientId,
|
|
105
|
+
rateBytesPerSec,
|
|
106
|
+
burstBytes,
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Remove rate limit for a specific client (unlimited).
|
|
112
|
+
*/
|
|
113
|
+
public async removeClientRateLimit(clientId: string): Promise<void> {
|
|
114
|
+
await this.bridge.sendCommand('removeClientRateLimit', { clientId });
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get telemetry for a specific client.
|
|
119
|
+
*/
|
|
120
|
+
public async getClientTelemetry(clientId: string): Promise<IVpnClientTelemetry> {
|
|
121
|
+
return this.bridge.sendCommand('getClientTelemetry', { clientId });
|
|
122
|
+
}
|
|
123
|
+
|
|
94
124
|
/**
|
|
95
125
|
* Stop the daemon bridge.
|
|
96
126
|
*/
|
|
@@ -64,6 +64,10 @@ export interface IVpnServerConfig {
|
|
|
64
64
|
keepaliveIntervalSecs?: number;
|
|
65
65
|
/** Enable NAT/masquerade for client traffic */
|
|
66
66
|
enableNat?: boolean;
|
|
67
|
+
/** Default rate limit for new clients (bytes/sec). Omit for unlimited. */
|
|
68
|
+
defaultRateLimitBytesPerSec?: number;
|
|
69
|
+
/** Default burst size for new clients (bytes). Omit for unlimited. */
|
|
70
|
+
defaultBurstBytes?: number;
|
|
67
71
|
}
|
|
68
72
|
|
|
69
73
|
export interface IVpnServerOptions {
|
|
@@ -99,6 +103,7 @@ export interface IVpnStatistics {
|
|
|
99
103
|
keepalivesSent: number;
|
|
100
104
|
keepalivesReceived: number;
|
|
101
105
|
uptimeSeconds: number;
|
|
106
|
+
quality?: IVpnConnectionQuality;
|
|
102
107
|
}
|
|
103
108
|
|
|
104
109
|
export interface IVpnClientInfo {
|
|
@@ -107,6 +112,12 @@ export interface IVpnClientInfo {
|
|
|
107
112
|
connectedSince: string;
|
|
108
113
|
bytesSent: number;
|
|
109
114
|
bytesReceived: number;
|
|
115
|
+
packetsDropped: number;
|
|
116
|
+
bytesDropped: number;
|
|
117
|
+
lastKeepaliveAt?: string;
|
|
118
|
+
keepalivesReceived: number;
|
|
119
|
+
rateLimitBytesPerSec?: number;
|
|
120
|
+
burstBytes?: number;
|
|
110
121
|
}
|
|
111
122
|
|
|
112
123
|
export interface IVpnServerStatistics extends IVpnStatistics {
|
|
@@ -119,6 +130,53 @@ export interface IVpnKeypair {
|
|
|
119
130
|
privateKey: string;
|
|
120
131
|
}
|
|
121
132
|
|
|
133
|
+
// ============================================================================
|
|
134
|
+
// QoS: Connection quality
|
|
135
|
+
// ============================================================================
|
|
136
|
+
|
|
137
|
+
export type TVpnLinkHealth = 'healthy' | 'degraded' | 'critical';
|
|
138
|
+
|
|
139
|
+
export interface IVpnConnectionQuality {
|
|
140
|
+
srttMs: number;
|
|
141
|
+
jitterMs: number;
|
|
142
|
+
minRttMs: number;
|
|
143
|
+
maxRttMs: number;
|
|
144
|
+
lossRatio: number;
|
|
145
|
+
consecutiveTimeouts: number;
|
|
146
|
+
linkHealth: TVpnLinkHealth;
|
|
147
|
+
currentKeepaliveIntervalSecs: number;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
// ============================================================================
|
|
151
|
+
// QoS: MTU info
|
|
152
|
+
// ============================================================================
|
|
153
|
+
|
|
154
|
+
export interface IVpnMtuInfo {
|
|
155
|
+
tunMtu: number;
|
|
156
|
+
effectiveMtu: number;
|
|
157
|
+
linkMtu: number;
|
|
158
|
+
overheadBytes: number;
|
|
159
|
+
oversizedPacketsDropped: number;
|
|
160
|
+
icmpTooBigSent: number;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
// ============================================================================
|
|
164
|
+
// QoS: Client telemetry (server-side per-client)
|
|
165
|
+
// ============================================================================
|
|
166
|
+
|
|
167
|
+
export interface IVpnClientTelemetry {
|
|
168
|
+
clientId: string;
|
|
169
|
+
assignedIp: string;
|
|
170
|
+
lastKeepaliveAt?: string;
|
|
171
|
+
keepalivesReceived: number;
|
|
172
|
+
packetsDropped: number;
|
|
173
|
+
bytesDropped: number;
|
|
174
|
+
bytesReceived: number;
|
|
175
|
+
bytesSent: number;
|
|
176
|
+
rateLimitBytesPerSec?: number;
|
|
177
|
+
burstBytes?: number;
|
|
178
|
+
}
|
|
179
|
+
|
|
122
180
|
// ============================================================================
|
|
123
181
|
// IPC Command maps (used by smartrust RustBridge<TCommands>)
|
|
124
182
|
// ============================================================================
|
|
@@ -128,6 +186,8 @@ export type TVpnClientCommands = {
|
|
|
128
186
|
disconnect: { params: Record<string, never>; result: void };
|
|
129
187
|
getStatus: { params: Record<string, never>; result: IVpnStatus };
|
|
130
188
|
getStatistics: { params: Record<string, never>; result: IVpnStatistics };
|
|
189
|
+
getConnectionQuality: { params: Record<string, never>; result: IVpnConnectionQuality };
|
|
190
|
+
getMtuInfo: { params: Record<string, never>; result: IVpnMtuInfo };
|
|
131
191
|
};
|
|
132
192
|
|
|
133
193
|
export type TVpnServerCommands = {
|
|
@@ -138,6 +198,9 @@ export type TVpnServerCommands = {
|
|
|
138
198
|
listClients: { params: Record<string, never>; result: { clients: IVpnClientInfo[] } };
|
|
139
199
|
disconnectClient: { params: { clientId: string }; result: void };
|
|
140
200
|
generateKeypair: { params: Record<string, never>; result: IVpnKeypair };
|
|
201
|
+
setClientRateLimit: { params: { clientId: string; rateBytesPerSec: number; burstBytes: number }; result: void };
|
|
202
|
+
removeClientRateLimit: { params: { clientId: string }; result: void };
|
|
203
|
+
getClientTelemetry: { params: { clientId: string }; result: IVpnClientTelemetry };
|
|
141
204
|
};
|
|
142
205
|
|
|
143
206
|
// ============================================================================
|