@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.
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartvpn',
6
- version: '1.0.3',
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4uY2xhc3Nlcy52cG5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHZwbi5jbGFzc2VzLnZwbmNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVM1RDs7R0FFRztBQUNILE1BQU0sT0FBTyxTQUFVLFNBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBSXhELFlBQVksT0FBMEI7UUFDcEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFxQjtZQUM5QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDLENBQUM7UUFFSCx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBbUIsRUFBRSxNQUFxQixFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQXlCO1FBQzVDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUMxQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDN0QsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFVBQVU7UUFDckIsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxZQUFZLEVBQUUsRUFBMkIsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxTQUFTO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsV0FBVyxFQUFFLEVBQTJCLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsYUFBYTtRQUN4QixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxFQUEyQixDQUFDLENBQUM7SUFDL0UsQ0FBQztJQUVEOztPQUVHO0lBQ0ksSUFBSTtRQUNULElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztDQUNGIn0=
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4uY2xhc3Nlcy52cG5zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHZwbi5jbGFzc2VzLnZwbnNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQVc1RDs7R0FFRztBQUNILE1BQU0sT0FBTyxTQUFVLFNBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBSXhELFlBQVksT0FBMEI7UUFDcEMsS0FBSyxFQUFFLENBQUM7UUFDUixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksU0FBUyxDQUFxQjtZQUM5QyxTQUFTLEVBQUUsT0FBTyxDQUFDLFNBQVM7WUFDNUIsSUFBSSxFQUFFLFFBQVE7U0FDZixDQUFDLENBQUM7UUFFSCx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxFQUFFLENBQUMsSUFBbUIsRUFBRSxNQUFxQixFQUFFLEVBQUU7WUFDcEUsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUN0QyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLGFBQWEsRUFBRSxHQUFHLEVBQUU7WUFDakMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMzQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLLENBQUMsTUFBeUI7UUFDMUMsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQzFDLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUNiLE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztRQUM5RCxDQUFDO1FBQ0QsTUFBTSxHQUFHLEdBQUcsTUFBTSxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDO1FBQzFDLElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE9BQU8sRUFBRSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO1FBQzFELENBQUM7SUFDSCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsVUFBVTtRQUNyQixNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sRUFBRSxFQUEyQixDQUFDLENBQUM7SUFDckUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFNBQVM7UUFDcEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxXQUFXLEVBQUUsRUFBMkIsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxhQUFhO1FBQ3hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLEVBQTJCLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsV0FBVztRQUN0QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsRUFBRSxFQUEyQixDQUFDLENBQUM7UUFDekYsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDO0lBQ3hCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFnQjtRQUM1QyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGtCQUFrQixFQUFFLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUNsRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsZUFBZTtRQUMxQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLGlCQUFpQixFQUFFLEVBQTJCLENBQUMsQ0FBQztJQUNqRixDQUFDO0lBRUQ7O09BRUc7SUFDSSxJQUFJO1FBQ1QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUNyQixDQUFDO0lBRUQ7O09BRUc7SUFDSCxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQztJQUM3QixDQUFDO0NBQ0YifQ==
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@push.rocks/smartvpn",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "private": false,
5
5
  "description": "A VPN solution with TypeScript control plane and Rust data plane daemon",
6
6
  "type": "module",
@@ -3,6 +3,6 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@push.rocks/smartvpn',
6
- version: '1.0.3',
6
+ version: '1.1.0',
7
7
  description: 'A VPN solution with TypeScript control plane and Rust data plane daemon'
8
8
  }
@@ -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
  // ============================================================================