@push.rocks/smartvpn 2.4.1 → 2.5.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_musl +0 -0
- package/dist_rust/smartvpn_daemon_linux_amd64_musl.tsrust-build.json +5 -5
- package/dist_rust/smartvpn_daemon_linux_arm64_musl +0 -0
- package/dist_rust/smartvpn_daemon_linux_arm64_musl.tsrust-build.json +5 -5
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/smartvpn.classes.vpnbridge.js +4 -1
- package/dist_ts/smartvpn.classes.vpnclient.d.ts +3 -0
- package/dist_ts/smartvpn.classes.vpnclient.js +11 -1
- package/dist_ts/smartvpn.interfaces.d.ts +17 -1
- package/package.json +4 -3
- package/readme.md +55 -10
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/smartvpn.classes.vpnbridge.ts +4 -0
- package/ts/smartvpn.classes.vpnclient.ts +11 -0
- package/ts/smartvpn.interfaces.ts +18 -1
|
Binary file
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": "tsrust.build-provenance.v2",
|
|
3
|
-
"binarySha256": "
|
|
3
|
+
"binarySha256": "8a54ee5cd111d95eb416875990a87e9ed88b684cf54fee408c18ee926dde6a74",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@push.rocks/smartvpn",
|
|
6
|
-
"projectVersion": "2.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "2.5.0",
|
|
7
|
+
"gitCommit": "88f2b2aaa6c7e382a4b9ac4e66ca453873cfcb86",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-
|
|
10
|
-
"tsrustVersion": "
|
|
9
|
+
"builtAt": "2026-10-02T01:39:06.799Z",
|
|
10
|
+
"tsrustVersion": "3.0.0",
|
|
11
11
|
"binary": "smartvpn_daemon",
|
|
12
12
|
"target": "linux_amd64_musl"
|
|
13
13
|
}
|
|
Binary file
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"format": "tsrust.build-provenance.v2",
|
|
3
|
-
"binarySha256": "
|
|
3
|
+
"binarySha256": "3f8a6b395ea0f02ff052a48044a1ed8698f9d1e1a3855ec44fcbba1acec23f74",
|
|
4
4
|
"buildInfo": {
|
|
5
5
|
"projectName": "@push.rocks/smartvpn",
|
|
6
|
-
"projectVersion": "2.
|
|
7
|
-
"gitCommit": "
|
|
6
|
+
"projectVersion": "2.5.0",
|
|
7
|
+
"gitCommit": "88f2b2aaa6c7e382a4b9ac4e66ca453873cfcb86",
|
|
8
8
|
"gitDirty": false,
|
|
9
|
-
"builtAt": "2026-
|
|
10
|
-
"tsrustVersion": "
|
|
9
|
+
"builtAt": "2026-10-02T01:41:01.675Z",
|
|
10
|
+
"tsrustVersion": "3.0.0",
|
|
11
11
|
"binary": "smartvpn_daemon",
|
|
12
12
|
"target": "linux_arm64_musl"
|
|
13
13
|
}
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartvpn',
|
|
6
|
-
version: '2.
|
|
6
|
+
version: '2.5.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=
|
|
@@ -57,6 +57,9 @@ export class VpnBridge extends plugins.events.EventEmitter {
|
|
|
57
57
|
this.bridge.on('management:managed-session-state', (data) => {
|
|
58
58
|
this.emit('managed-session-state', data);
|
|
59
59
|
});
|
|
60
|
+
this.bridge.on('management:managed-session-assignment', (data) => {
|
|
61
|
+
this.emit('managed-session-assignment', data);
|
|
62
|
+
});
|
|
60
63
|
this.bridge.on('management:status', (data) => {
|
|
61
64
|
this.emit('status', data);
|
|
62
65
|
});
|
|
@@ -113,4 +116,4 @@ export class VpnBridge extends plugins.events.EventEmitter {
|
|
|
113
116
|
return this.bridge.running;
|
|
114
117
|
}
|
|
115
118
|
}
|
|
116
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4uY2xhc3Nlcy52cG5icmlkZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHZwbi5jbGFzc2VzLnZwbmJyaWRnZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sS0FBSyxLQUFLLE1BQU0scUJBQXFCLENBQUM7QUFVN0M7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFNBQXlDLFNBQVEsT0FBTyxDQUFDLE1BQU0sQ0FBQyxZQUFZO0lBS3ZGLFlBQVksT0FLWDtRQUNDLEtBQUssRUFBRSxDQUFDO1FBRVIsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLGtCQUFrQixDQUFDO1FBQy9DLElBQUksV0FBVyxLQUFLLFNBQVMsRUFBRSxDQUFDO1lBQzlCLElBQUksT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLElBQUksS0FBSyxRQUFRLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxTQUFTLEtBQUssT0FBTyxFQUFFLENBQUM7Z0JBQzlHLE1BQU0sSUFBSSxLQUFLLENBQUMsNERBQTRELENBQUMsQ0FBQztZQUNoRixDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksV0FBVyxHQUFHLENBQUMsSUFBSSxXQUFXLEdBQUcsV0FBVyxFQUFFLENBQUM7Z0JBQ25GLE1BQU0sSUFBSSxLQUFLLENBQUMsdUVBQXVFLENBQUMsQ0FBQztZQUMzRixDQUFDO1FBQ0gsQ0FBQztRQUNELE1BQU0sVUFBVSxHQUFHLE9BQU8sQ0FBQyxVQUFVLElBQUksaUJBQWlCLENBQUM7UUFDM0QsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFNBQVMsS0FBSyxPQUFPLElBQUksT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLEtBQUssU0FBUztlQUNwRixDQUFDLE9BQU8sT0FBTyxD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
|
|
@@ -14,6 +14,9 @@ export declare class VpnClient extends plugins.events.EventEmitter {
|
|
|
14
14
|
private retiredSessionGeneration?;
|
|
15
15
|
private invalidatedSessionGeneration?;
|
|
16
16
|
constructor(options: IVpnClientOptions);
|
|
17
|
+
/** Forward only the live generation's assignments; a retired, stopped-and-replaced
|
|
18
|
+
* or invalidated generation's late observation is never reported as in force. */
|
|
19
|
+
private observeSessionAssignment;
|
|
17
20
|
private observeSessionEvent;
|
|
18
21
|
private invalidateGeneration;
|
|
19
22
|
private invalidateBridge;
|
|
@@ -34,6 +34,16 @@ export class VpnClient extends plugins.events.EventEmitter {
|
|
|
34
34
|
this.bridge.on('managed-session-state', (event) => {
|
|
35
35
|
this.observeSessionEvent(event);
|
|
36
36
|
});
|
|
37
|
+
this.bridge.on('managed-session-assignment', (event) => {
|
|
38
|
+
this.observeSessionAssignment(event);
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Forward only the live generation's assignments; a retired, stopped-and-replaced
|
|
42
|
+
* or invalidated generation's late observation is never reported as in force. */
|
|
43
|
+
observeSessionAssignment(event) {
|
|
44
|
+
if (event.generation !== this.sessionGeneration)
|
|
45
|
+
return;
|
|
46
|
+
this.emit('managed-session-assignment', event);
|
|
37
47
|
}
|
|
38
48
|
observeSessionEvent(event) {
|
|
39
49
|
if (event.phase === 'retired') {
|
|
@@ -216,4 +226,4 @@ export class VpnClient extends plugins.events.EventEmitter {
|
|
|
216
226
|
return this.bridge.running;
|
|
217
227
|
}
|
|
218
228
|
}
|
|
219
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4uY2xhc3Nlcy52cG5jbGllbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHZwbi5jbGFzc2VzLnZwbmNsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQW1CNUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBVSxTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWTtJQVd4RCxZQUFZLE9BQTBCO1FBQ3BDLEtBQUssRUFBRSxDQUFDO1FBVEYsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFVdEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBcUI7WUFDOUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLElBQUksRUFBRSxRQUFRO1lBQ2Qsa0JBQWtCLEVBQUUsT0FBTyxDQUFDLGtCQUFrQjtTQUMvQyxDQUFDLENBQUM7UUFFSCx3QkFBd0I7UUFDeEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsY0FBYyxFQUFFLEdBQUcsRUFBRTtZQUNsQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsK0JBQStCLENBQUMsQ0FBQztRQUN6RCxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQW1CLEVBQUUsTUFBcUIsRUFBRSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO1lBQ25ELElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFZLEVBQUUsRUFBRTtZQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUM1QixDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLDZCQUE2QixFQUFFLENBQUMsS0FBcUMsRUFBRSxFQUFFO1lBQ3RGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNuQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLHVCQUF1QixFQUFFLENBQUMsS0FBOEIsRUFBRSxFQUFFO1lBQ3pFLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUNsQyxDQUFDLENBQUMsQ0FBQztRQUNILElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLDRCQUE0QixFQUFFLENBQUMsS0FBbUMsRUFBRSxFQUFFO1lBQ25GLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN2QyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRDtxRkFDaUY7SUFDekUsd0JBQXdCLENBQUMsS0FBbUM7UUFDbEUsSUFBSSxLQUFLLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyxpQkFBaUI7WUFBRSxPQUFPO1FBQ3hELElBQUksQ0FBQyxJQUFJLENBQUMsNEJBQTRCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVPLG1CQUFtQixDQUFDLEtBQThCO1FBQ3hELElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUUsQ0FBQztZQUM5QixJQUFJLENBQUMsd0JBQXdCLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztZQUNqRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxLQUFLLENBQUMsVUFBVTtnQkFBRSxJQUFJLENBQUMsaUJBQWlCLEdBQUcsU0FBUyxDQUFDO1FBQ3RGLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLHdCQUF3QixHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7UUFDbkQsQ0FBQztRQUNELElBQUksQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsS0FBSyxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVPLG9CQUFvQixDQUFDLEtBQXFDO1FBQ2hFLElBQUksSUFBSSxDQUFDLHlCQUF5QixLQUFLLEtBQUssQ0FBQyxVQUFVO1lBQUUsT0FBTztRQUNoRSxJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDLFVBQVUsQ0FBQztRQUNsRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsS0FBSyxLQUFLLENBQUMsVUFBVTtZQUFFLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxTQUFTLENBQUM7UUFDcEYsSUFBSSxDQUFDLElBQUksQ0FBQyw2QkFBNkIsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUNsRCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsTUFBYztRQUNyQyxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxJQUFJLENBQUMsaUJBQWlCO1lBQUUsSUFBSSxDQUFDLG9CQUFvQixDQUFDLEVBQUUsVUFBVSxFQUFFLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RHLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDM0IsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO1lBQzFDLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxVQUFVLENBQUM7WUFDL0MsSUFBSSxDQUFDLGlCQUFpQixHQUFHLFNBQVMsQ0FBQztZQUNuQyxJQUFJLENBQUMsSUFBSSxDQUFDLDZCQUE2QixFQUFFLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDbkUsQ0FBQztJQUNILENBQUM7SUFFTyxZQUFZLENBQUMsTUFBMEIsRUFBRSxLQUFhLEVBQUUsVUFBbUI7UUFDakYsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUM7UUFDeEMsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFdBQVcsSUFBSSxRQUFRLEtBQUssSUFBSSxDQUFDLHdCQUF3QjtlQUN2RSxRQUFRLEtBQUssSUFBSSxDQUFDLDRCQUE0QjtlQUM5QyxDQUFDLFVBQVUsS0FBSyxTQUFTLElBQUksUUFBUSxLQUFLLFVBQVUsQ0FBQztlQUNyRCxDQUFDLFFBQVEsS0FBSyxJQUFJLENBQUMsd0JBQXdCLElBQUksTUFBTSxDQUFDLEtBQUssS0FBSyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQ2hGLE1BQU0sSUFBSSxLQUFLLENBQUMsNEVBQTRFLENBQUMsQ0FBQztRQUNoRyxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1lBQ3ZELElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUM7UUFDcEMsQ0FBQztJQUNILENBQUM7SUFFRCxtRkFBbUY7SUFDNUUsS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQWdDO1FBQy9ELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDaEYsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDakMsSUFBSSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQ2hELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs4RUFDMEU7SUFDbkUsb0JBQW9CLENBQUMsVUFBa0I7UUFDNUMsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHNCQUFzQixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2pFLENBQUM7SUFFRDt1RkFDbUY7SUFDNUUsdUJBQXVCLENBQUMsVUFBa0I7UUFDL0MsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHlCQUF5QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ3BFLENBQUM7SUFFRDt3RkFDb0Y7SUFDN0UscUJBQXFCLENBQUMsVUFBa0I7UUFDN0MsT0FBTyxJQUFJLENBQUMsY0FBYyxDQUFDLHVCQUF1QixFQUFFLFVBQVUsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxxQkFBcUIsQ0FBQyxVQUFrQjtRQUM3QyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsdUJBQXVCLEVBQUUsVUFBVSxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOzs7O3VGQUltRjtJQUM1RSxLQUFLLENBQUMsbUJBQW1CLENBQUMsVUFBa0IsRUFBRSxPQUFrQztRQUNyRixJQUFJLENBQUMsd0JBQXdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDMUMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMvQixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLHFCQUFxQixFQUFFLEVBQUUsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDN0YsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQzdDLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFTyxLQUFLLENBQUMsY0FBYyxDQUFDLE1BQ3dCLEVBQUUsVUFBa0I7UUFDdkUsSUFBSSxDQUFDLHdCQUF3QixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxNQUFNLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxVQUFVLENBQUMsQ0FBQztRQUM3QyxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRU8sd0JBQXdCLENBQUMsVUFBa0I7UUFDakQsSUFBSSxPQUFPLFVBQVUsS0FBSyxRQUFRLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUN6RSxNQUFNLElBQUksS0FBSyxDQUFDLGdFQUFnRSxDQUFDLENBQUM7UUFDcEYsQ0FBQztRQUNELElBQUksVUFBVSxLQUFLLElBQUksQ0FBQyw0QkFBNEIsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7WUFDckcsTUFBTSxJQUFJLEtBQUssQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO1FBQ2hFLENBQUM7SUFDSCxDQUFDO0lBRU8sZ0JBQWdCLENBQUMsT0FBMkIsRUFBRSxLQUFhLEVBQUUsVUFBbUI7UUFDdEYsSUFBSSxLQUFLLEtBQUssSUFBSSxDQUFDLFdBQVcsSUFBSSxPQUFPLENBQUMsVUFBVSxLQUFLLElBQUksQ0FBQyx5QkFBeUI7ZUFDbEYsQ0FBQyxVQUFVLEtBQUssU0FBUyxJQUFJLE9BQU8sQ0FBQyxVQUFVLEtBQUssVUFBVSxDQUFDLEVBQUUsQ0FBQztZQUNyRSxNQUFNLElBQUksS0FBSyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDbEUsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM3QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQXlCO1FBQzVDLE1BQU0sR0FBRyxHQUFHLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztRQUMxQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDVCxNQUFNLElBQUksS0FBSyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7UUFDM0QsQ0FBQztRQUNELE1BQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDL0IsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxTQUFTLEVBQUUsRUFBRSxNQUFNLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztRQUN6RSxJQUFJLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUMxQixJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLGNBQWMsRUFBRSxLQUFLLENBQUMsQ0FBQztZQUNwRCxJQUFJLENBQUMsaUJBQWlCLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUM7UUFDNUQsQ0FBQztRQUNELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDtvRkFDZ0Y7SUFDekUsS0FBSyxDQUFDLHFCQUFxQixDQUFDLFVBQWtCO1FBQ25ELElBQUksT0FBTyxVQUFVLEtBQUssUUFBUSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUM7WUFDekUsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1FBQ3BGLENBQUM7UUFDRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBQy9CLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsdUJBQXVCLEVBQUUsRUFBRSxVQUFVLEVBQUUsQ0FBQyxDQUFDO1FBQ3RGLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxVQUFVO1FBQ3JCLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQTJCLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsU0FBUztRQUNwQixPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFdBQVcsRUFBRSxFQUEyQixDQUFDLENBQUM7SUFDM0UsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGFBQWE7UUFDeEIsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxlQUFlLEVBQUUsRUFBMkIsQ0FBQyxDQUFDO0lBQy9FLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxvQkFBb0I7UUFDL0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRSxFQUEyQixDQUFDLENBQUM7SUFDdEYsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxVQUFVO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsWUFBWSxFQUFFLEVBQTJCLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQ7OztPQUdHO0lBQ0ksS0FBSyxDQUFDLElBQUk7UUFDZixJQUFJLENBQUMsZ0JBQWdCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztRQUMvQyxNQUFNLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBVyxPQUFPO1FBQ2hCLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUM7SUFDN0IsQ0FBQztDQUNGIn0=
|
|
@@ -197,7 +197,8 @@ export interface IVpnServerOptions {
|
|
|
197
197
|
}
|
|
198
198
|
export type TVpnConnectionState = 'disconnected' | 'connecting' | 'handshaking' | 'connected' | 'reconnecting' | 'error';
|
|
199
199
|
export interface IVpnStatus {
|
|
200
|
-
/**
|
|
200
|
+
/** The native managed assignment in force for this connection, absent after retirement.
|
|
201
|
+
* It starts as the authenticated one and follows hub assignment updates. */
|
|
201
202
|
managedNetwork?: IManagedNetworkAssignment;
|
|
202
203
|
state: TVpnConnectionState;
|
|
203
204
|
assignedIp?: string;
|
|
@@ -766,6 +767,20 @@ export interface IVpnManagedSession {
|
|
|
766
767
|
/** The native lease currently in force. `plan.lease` stays the lease the
|
|
767
768
|
* generation authenticated under; renewal moves only this one. */
|
|
768
769
|
lease: IVpnManagedSessionConfig['lease'];
|
|
770
|
+
/** The assignment currently in force. `plan.assignment` stays the assignment the
|
|
771
|
+
* generation authenticated under; a hub assignment update moves only this one.
|
|
772
|
+
* A prepared TUN holds exactly its split routes. */
|
|
773
|
+
assignment: IVpnManagedSessionPlan['assignment'];
|
|
774
|
+
}
|
|
775
|
+
/** The hub committed a new managed assignment for this generation and it is now in
|
|
776
|
+
* force: a prepared TUN's split routes moved in place (withdrawn routes removed
|
|
777
|
+
* before new ones are added), and `runtime` is a fresh inspection of that TUN, or
|
|
778
|
+
* null before preparation. A refused or unappliable update stops the generation
|
|
779
|
+
* instead; the hub drops traffic under withdrawn routes either way. */
|
|
780
|
+
export interface IVpnManagedSessionAssignment {
|
|
781
|
+
generation: string;
|
|
782
|
+
assignment: IVpnManagedSessionPlan['assignment'];
|
|
783
|
+
runtime: IVpnManagedRuntime | null;
|
|
769
784
|
}
|
|
770
785
|
/** Stopped means the complete packet I/O future ended; retired means the native
|
|
771
786
|
* session owner ended. Neither proves namespace-wide cleanup, conntrack drain,
|
|
@@ -836,6 +851,7 @@ export interface IVpnServiceUnit {
|
|
|
836
851
|
}
|
|
837
852
|
export interface IVpnEventMap {
|
|
838
853
|
'managed-session-state': IVpnManagedSessionEvent;
|
|
854
|
+
'managed-session-assignment': IVpnManagedSessionAssignment;
|
|
839
855
|
'managed-session-invalidated': IVpnManagedSessionInvalidation;
|
|
840
856
|
'managed-runtime-invalidated': IVpnManagedRuntimeInvalidation;
|
|
841
857
|
'status': IVpnStatus;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@push.rocks/smartvpn",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "A VPN solution with TypeScript control plane and Rust data plane daemon",
|
|
6
6
|
"type": "module",
|
|
@@ -28,9 +28,9 @@
|
|
|
28
28
|
"@push.rocks/smartrust": "^2.1.0"
|
|
29
29
|
},
|
|
30
30
|
"devDependencies": {
|
|
31
|
-
"@git.zone/tsbuild": "^5.
|
|
31
|
+
"@git.zone/tsbuild": "^5.1.0",
|
|
32
32
|
"@git.zone/tsrun": "^3.0.2",
|
|
33
|
-
"@git.zone/tsrust": "^
|
|
33
|
+
"@git.zone/tsrust": "^3.0.0",
|
|
34
34
|
"@git.zone/tstest": "^6.3.2",
|
|
35
35
|
"@types/node": "^26.6.2"
|
|
36
36
|
},
|
|
@@ -55,6 +55,7 @@
|
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
57
57
|
"build": "(tsbuild tsfolders) && (tsrust)",
|
|
58
|
+
"build:release": "(tsbuild tsfolders) && (tsrust --configured-targets) && (tsrust verify)",
|
|
58
59
|
"test:before": "(tsrust)",
|
|
59
60
|
"test": "tstest test/ --verbose --logfile --timeout 90",
|
|
60
61
|
"test:rust": "cd rust && cargo test",
|
package/readme.md
CHANGED
|
@@ -147,7 +147,8 @@ It is rejected for socket transport and server bridges. The native equivalent is
|
|
|
147
147
|
at FD 3. Server facade firewall setup runs in its parent process, so server
|
|
148
148
|
namespace placement requires a separately coordinated policy owner.
|
|
149
149
|
|
|
150
|
-
The Linux amd64 musl candidate passed offline Linux 6.18.35
|
|
150
|
+
The Linux amd64 musl candidate passed offline Linux qualification (6.18.35 at the time; the
|
|
151
|
+
guest pin is now Alpine `linux-virt-6.18.54-r0`, see `hints.md`) with
|
|
151
152
|
all native threads in the target namespace, child descriptor closure, retained
|
|
152
153
|
caller ownership and denied-entry rejection. The shared `serve.zone/testing`
|
|
153
154
|
scenario also passed real WS/Noise traffic through inherited namespace entry,
|
|
@@ -182,6 +183,15 @@ passed is final: packet I/O stops at that deadline, a late renewal rejects, and
|
|
|
182
183
|
the caller authenticates a new generation. `plan.lease` never changes; every
|
|
183
184
|
session observation reports the lease in force as `lease`.
|
|
184
185
|
|
|
186
|
+
The hub can also move the generation's assignment in place (see caller-owned
|
|
187
|
+
managed networks below). `plan.assignment` never changes; every session observation
|
|
188
|
+
reports the assignment in force as `assignment`, and a prepared TUN holds exactly
|
|
189
|
+
its split routes. Each applied update emits `managed-session-assignment` with the
|
|
190
|
+
`generation`, the `assignment` in force and a fresh `runtime` inspection (null
|
|
191
|
+
before preparation). An update that arrives while the TUN is being prepared is
|
|
192
|
+
applied before prepare replies. Record route revisions from this event; a refused
|
|
193
|
+
or unappliable update stops the generation instead of keeping stale routes.
|
|
194
|
+
|
|
185
195
|
The native lease is only the node's half. The hub ends a session at the node's
|
|
186
196
|
`expiresAt` from its own managed snapshot, so the controller renews that expiry
|
|
187
197
|
by reconciling a snapshot that changes only `expiresAt`. A hub running SmartVPN
|
|
@@ -189,8 +199,8 @@ by reconciling a snapshot that changes only `expiresAt`. A hub running SmartVPN
|
|
|
189
199
|
it. Renew both halves before the nearer of the two deadlines. Renewal adds no
|
|
190
200
|
message between client and hub, so a 2.4 client works with any 2.3.x hub.
|
|
191
201
|
|
|
192
|
-
Register `managed-session-state`, `managed-session-
|
|
193
|
-
`managed-runtime-invalidated` listeners before
|
|
202
|
+
Register `managed-session-state`, `managed-session-assignment`,
|
|
203
|
+
`managed-session-invalidated` and `managed-runtime-invalidated` listeners before
|
|
194
204
|
starting. Keep the live client owner and use the returned generation for each step:
|
|
195
205
|
|
|
196
206
|
1. `authenticateManaged(config)` authenticates Noise and validates the full server
|
|
@@ -806,11 +816,42 @@ are never routed back to the hub merely because a grant involves them.
|
|
|
806
816
|
Invalid preparation preserves active authority. A valid change quarantines and
|
|
807
817
|
cancels only affected node generations, joins their packet work, prepares WG
|
|
808
818
|
crypto and commits the whole snapshot atomically before acknowledging. A node is
|
|
809
|
-
affected when it is added or removed, or when its keys, control address or
|
|
810
|
-
`enabled
|
|
811
|
-
|
|
812
|
-
a node
|
|
813
|
-
|
|
819
|
+
affected when it is added or removed, or when its keys, control address or control
|
|
820
|
+
domain, or `enabled` change. Every other node keeps its live session.
|
|
821
|
+
|
|
822
|
+
A change to a node's workload prefixes, or to the grants and routes involving it,
|
|
823
|
+
moves that node's packet policy in place when the snapshot commits. Relay
|
|
824
|
+
decisions, source checks, server WireGuard AllowedIPs and queued packets switch
|
|
825
|
+
from the old policy to the committed one under the same gate. No packet passes
|
|
826
|
+
under a grant before its commit, and none under a withdrawn grant or prefix after
|
|
827
|
+
it. Queued traffic for withdrawn authority drops rather than falling back, and a
|
|
828
|
+
native writer re-checks a packet it already took before sending it.
|
|
829
|
+
|
|
830
|
+
A native client installs the split routes (remote destinations) of its assignment.
|
|
831
|
+
The hub advertises assignment updates in its Noise handshake response, and a
|
|
832
|
+
managed client that understands them takes them up with its first encrypted
|
|
833
|
+
frame. For such a client, the hub sends the node's committed assignment (owned
|
|
834
|
+
prefixes, split routes and revision) after the commit that moved it; several
|
|
835
|
+
quick commits coalesce into the latest. The client checks that the update keeps
|
|
836
|
+
its binding and lifetime, names a later revision and passes the same route
|
|
837
|
+
preflight as an authenticated assignment. It then moves a prepared TUN's routes in
|
|
838
|
+
place: every withdrawn route is removed before any new one is added, so a prefix
|
|
839
|
+
that moved to the node is released first and no route the hub has not committed
|
|
840
|
+
is ever installed. `getStatus().managedNetwork` reports the assignment in force. A
|
|
841
|
+
refused update, or routes that cannot be moved, ends the generation. Until the
|
|
842
|
+
client applies an update, traffic on a withdrawn route drops at the hub.
|
|
843
|
+
|
|
844
|
+
A client from before assignment updates never takes them up, and a hub from before
|
|
845
|
+
them never offers them, so either side works with the other. For such a client, a
|
|
846
|
+
change to its split routes still ends the generation at the commit and joins it
|
|
847
|
+
before acknowledging; the node reconnects with its unchanged keys and receives the
|
|
848
|
+
new routes. Its own prefixes and incoming grants still move in place.
|
|
849
|
+
WireGuard clients take their AllowedIPs from `getManagedNodeProjection`, so
|
|
850
|
+
WireGuard sessions follow every policy change in place while the controller
|
|
851
|
+
re-applies the projection.
|
|
852
|
+
|
|
853
|
+
A change to `expiresAt` alone does not affect a node either: its live native or
|
|
854
|
+
WireGuard session stays connected and follows the committed expiry in place. A later expiry keeps the session, an earlier future
|
|
814
855
|
expiry re-arms its deadline, and an expiry that has already passed ends it when
|
|
815
856
|
the snapshot commits. A session whose expiry passed is never revived, so renew
|
|
816
857
|
before expiry; after a late renewal the node can reconnect with its unchanged keys.
|
|
@@ -832,7 +873,9 @@ Missing, unexpected or differently bound managed assignments reject before host
|
|
|
832
873
|
effects; a managed client cannot downgrade to a standalone subnet assignment.
|
|
833
874
|
Native encrypted assignments carry schema, node/authority/lifetime/revision,
|
|
834
875
|
local ownership and remote outgoing routes. Client `getStatus().managedNetwork`
|
|
835
|
-
reports only the live validated assignment
|
|
876
|
+
reports only the live validated assignment in force, including hub assignment
|
|
877
|
+
updates, and clears on retirement. A retained `forwardingMode: 'tun'` runtime moves
|
|
878
|
+
its routes in place on an update; `inspectManagedRuntime` reports the moved routes. Native Linux
|
|
836
879
|
TUN setup uses a fresh nonpersistent /32 device with strict exclusive route adds,
|
|
837
880
|
not shell commands or route-conflict suppression. Preflight rejects malformed,
|
|
838
881
|
overlapping, default, local-prefix and active-hub-endpoint capture. The netlink
|
|
@@ -1051,7 +1094,7 @@ All frames use `[type:1B][length:4B][payload:NB]` with a 64KB max payload:
|
|
|
1051
1094
|
| Type | Hex | Direction | Description |
|
|
1052
1095
|
|------|-----|-----------|-------------|
|
|
1053
1096
|
| HandshakeInit | `0x01` | Client → Server | Noise IK first message |
|
|
1054
|
-
| HandshakeResp | `0x02` | Server → Client | Noise IK response |
|
|
1097
|
+
| HandshakeResp | `0x02` | Server → Client | Noise IK response; a hub that sends assignment updates carries `{"assignmentUpdates":true}` as its encrypted payload (empty from older hubs) |
|
|
1055
1098
|
| IpPacket | `0x10` | Bidirectional | Encrypted tunnel data |
|
|
1056
1099
|
| Keepalive | `0x20` | Client → Server | App-level keepalive (not WS ping) |
|
|
1057
1100
|
| KeepaliveAck | `0x21` | Server → Client | Keepalive response with RTT payload |
|
|
@@ -1059,6 +1102,8 @@ All frames use `[type:1B][length:4B][payload:NB]` with a 64KB max payload:
|
|
|
1059
1102
|
| SessionResumeOk | `0x31` | Server → Client | Session resume accepted |
|
|
1060
1103
|
| SessionResumeErr | `0x32` | Server → Client | Session resume rejected |
|
|
1061
1104
|
| Disconnect | `0x3F` | Bidirectional | Graceful disconnect |
|
|
1105
|
+
| ClientCapabilities | `0x40` | Client → Server | Encrypted, the first message of a managed client that saw the hub's offer; takes up assignment updates |
|
|
1106
|
+
| AssignmentUpdate | `0x41` | Server → Client | Encrypted, only after `ClientCapabilities`: the node's committed assignment (owned prefixes, remote routes, revision) |
|
|
1062
1107
|
|
|
1063
1108
|
## Development 🛠️
|
|
1064
1109
|
|
package/ts/00_commitinfo_data.ts
CHANGED
|
@@ -5,6 +5,7 @@ import type {
|
|
|
5
5
|
IVpnTransportSocket,
|
|
6
6
|
IVpnManagedRuntimeInvalidation,
|
|
7
7
|
IVpnManagedSessionEvent,
|
|
8
|
+
IVpnManagedSessionAssignment,
|
|
8
9
|
} from './smartvpn.interfaces.js';
|
|
9
10
|
import type { TCommandMap, IRustBridgeDisconnectedEvent } from '@push.rocks/smartrust';
|
|
10
11
|
|
|
@@ -78,6 +79,9 @@ export class VpnBridge<TCommands extends TCommandMap> extends plugins.events.Eve
|
|
|
78
79
|
this.bridge.on('management:managed-session-state', (data: IVpnManagedSessionEvent) => {
|
|
79
80
|
this.emit('managed-session-state', data);
|
|
80
81
|
});
|
|
82
|
+
this.bridge.on('management:managed-session-assignment', (data: IVpnManagedSessionAssignment) => {
|
|
83
|
+
this.emit('managed-session-assignment', data);
|
|
84
|
+
});
|
|
81
85
|
this.bridge.on('management:status', (data: any) => {
|
|
82
86
|
this.emit('status', data);
|
|
83
87
|
});
|
|
@@ -14,6 +14,7 @@ import type {
|
|
|
14
14
|
IVpnManagedSessionRenewal,
|
|
15
15
|
IVpnManagedSession,
|
|
16
16
|
IVpnManagedSessionEvent,
|
|
17
|
+
IVpnManagedSessionAssignment,
|
|
17
18
|
TVpnClientCommands,
|
|
18
19
|
} from './smartvpn.interfaces.js';
|
|
19
20
|
|
|
@@ -61,6 +62,16 @@ export class VpnClient extends plugins.events.EventEmitter {
|
|
|
61
62
|
this.bridge.on('managed-session-state', (event: IVpnManagedSessionEvent) => {
|
|
62
63
|
this.observeSessionEvent(event);
|
|
63
64
|
});
|
|
65
|
+
this.bridge.on('managed-session-assignment', (event: IVpnManagedSessionAssignment) => {
|
|
66
|
+
this.observeSessionAssignment(event);
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/** Forward only the live generation's assignments; a retired, stopped-and-replaced
|
|
71
|
+
* or invalidated generation's late observation is never reported as in force. */
|
|
72
|
+
private observeSessionAssignment(event: IVpnManagedSessionAssignment): void {
|
|
73
|
+
if (event.generation !== this.sessionGeneration) return;
|
|
74
|
+
this.emit('managed-session-assignment', event);
|
|
64
75
|
}
|
|
65
76
|
|
|
66
77
|
private observeSessionEvent(event: IVpnManagedSessionEvent): void {
|
|
@@ -234,7 +234,8 @@ export type TVpnConnectionState =
|
|
|
234
234
|
| 'error';
|
|
235
235
|
|
|
236
236
|
export interface IVpnStatus {
|
|
237
|
-
/**
|
|
237
|
+
/** The native managed assignment in force for this connection, absent after retirement.
|
|
238
|
+
* It starts as the authenticated one and follows hub assignment updates. */
|
|
238
239
|
managedNetwork?: IManagedNetworkAssignment;
|
|
239
240
|
state: TVpnConnectionState;
|
|
240
241
|
assignedIp?: string;
|
|
@@ -676,6 +677,21 @@ export interface IVpnManagedSession {
|
|
|
676
677
|
/** The native lease currently in force. `plan.lease` stays the lease the
|
|
677
678
|
* generation authenticated under; renewal moves only this one. */
|
|
678
679
|
lease: IVpnManagedSessionConfig['lease'];
|
|
680
|
+
/** The assignment currently in force. `plan.assignment` stays the assignment the
|
|
681
|
+
* generation authenticated under; a hub assignment update moves only this one.
|
|
682
|
+
* A prepared TUN holds exactly its split routes. */
|
|
683
|
+
assignment: IVpnManagedSessionPlan['assignment'];
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
/** The hub committed a new managed assignment for this generation and it is now in
|
|
687
|
+
* force: a prepared TUN's split routes moved in place (withdrawn routes removed
|
|
688
|
+
* before new ones are added), and `runtime` is a fresh inspection of that TUN, or
|
|
689
|
+
* null before preparation. A refused or unappliable update stops the generation
|
|
690
|
+
* instead; the hub drops traffic under withdrawn routes either way. */
|
|
691
|
+
export interface IVpnManagedSessionAssignment {
|
|
692
|
+
generation: string;
|
|
693
|
+
assignment: IVpnManagedSessionPlan['assignment'];
|
|
694
|
+
runtime: IVpnManagedRuntime | null;
|
|
679
695
|
}
|
|
680
696
|
|
|
681
697
|
/** Stopped means the complete packet I/O future ended; retired means the native
|
|
@@ -760,6 +776,7 @@ export interface IVpnServiceUnit {
|
|
|
760
776
|
|
|
761
777
|
export interface IVpnEventMap {
|
|
762
778
|
'managed-session-state': IVpnManagedSessionEvent;
|
|
779
|
+
'managed-session-assignment': IVpnManagedSessionAssignment;
|
|
763
780
|
'managed-session-invalidated': IVpnManagedSessionInvalidation;
|
|
764
781
|
'managed-runtime-invalidated': IVpnManagedRuntimeInvalidation;
|
|
765
782
|
'status': IVpnStatus;
|