@push.rocks/smartvpn 1.7.0 → 1.9.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.vpnconfig.js +22 -1
- package/dist_ts/smartvpn.classes.vpnserver.d.ts +42 -1
- package/dist_ts/smartvpn.classes.vpnserver.js +65 -1
- package/dist_ts/smartvpn.interfaces.d.ts +152 -1
- package/package.json +1 -1
- package/readme.md +269 -768
- package/readme.plan.md +253 -0
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/smartvpn.classes.vpnconfig.ts +21 -0
- package/ts/smartvpn.classes.vpnserver.ts +77 -0
- package/ts/smartvpn.interfaces.ts +109 -1
|
Binary file
|
|
Binary file
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@push.rocks/smartvpn',
|
|
6
|
-
version: '1.
|
|
6
|
+
version: '1.9.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=
|
|
@@ -47,6 +47,15 @@ export class VpnConfig {
|
|
|
47
47
|
if (!config.serverPublicKey) {
|
|
48
48
|
throw new Error('VpnConfig: serverPublicKey is required');
|
|
49
49
|
}
|
|
50
|
+
// Noise IK requires client keypair
|
|
51
|
+
if (!config.clientPrivateKey) {
|
|
52
|
+
throw new Error('VpnConfig: clientPrivateKey is required for Noise IK authentication');
|
|
53
|
+
}
|
|
54
|
+
VpnConfig.validateBase64Key(config.clientPrivateKey, 'clientPrivateKey');
|
|
55
|
+
if (!config.clientPublicKey) {
|
|
56
|
+
throw new Error('VpnConfig: clientPublicKey is required for Noise IK authentication');
|
|
57
|
+
}
|
|
58
|
+
VpnConfig.validateBase64Key(config.clientPublicKey, 'clientPublicKey');
|
|
50
59
|
}
|
|
51
60
|
if (config.mtu !== undefined && (config.mtu < 576 || config.mtu > 65535)) {
|
|
52
61
|
throw new Error('VpnConfig: mtu must be between 576 and 65535');
|
|
@@ -112,6 +121,18 @@ export class VpnConfig {
|
|
|
112
121
|
if (!VpnConfig.isValidSubnet(config.subnet)) {
|
|
113
122
|
throw new Error(`VpnConfig: invalid subnet: ${config.subnet}`);
|
|
114
123
|
}
|
|
124
|
+
// Validate client entries if provided
|
|
125
|
+
if (config.clients) {
|
|
126
|
+
for (const client of config.clients) {
|
|
127
|
+
if (!client.clientId) {
|
|
128
|
+
throw new Error('VpnConfig: client entry must have a clientId');
|
|
129
|
+
}
|
|
130
|
+
if (!client.publicKey) {
|
|
131
|
+
throw new Error(`VpnConfig: client '${client.clientId}' must have a publicKey`);
|
|
132
|
+
}
|
|
133
|
+
VpnConfig.validateBase64Key(client.publicKey, `client '${client.clientId}' publicKey`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
115
136
|
}
|
|
116
137
|
if (config.mtu !== undefined && (config.mtu < 576 || config.mtu > 65535)) {
|
|
117
138
|
throw new Error('VpnConfig: mtu must be between 576 and 65535');
|
|
@@ -198,4 +219,4 @@ export class VpnConfig {
|
|
|
198
219
|
}
|
|
199
220
|
}
|
|
200
221
|
}
|
|
201
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
222
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4uY2xhc3Nlcy52cG5jb25maWcuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHZwbi5jbGFzc2VzLnZwbmNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBTWpEOztHQUVHO0FBQ0gsTUFBTSxPQUFPLFNBQVM7SUFDcEI7O09BRUc7SUFDSSxNQUFNLENBQUMsb0JBQW9CLENBQUMsTUFBd0I7UUFDekQsSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ3JDLGdDQUFnQztZQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN6QixNQUFNLElBQUksS0FBSyxDQUFDLDZEQUE2RCxDQUFDLENBQUM7WUFDakYsQ0FBQztZQUNELFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsWUFBWSxFQUFFLGNBQWMsQ0FBQyxDQUFDO1lBQ2pFLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsMERBQTBELENBQUMsQ0FBQztZQUM5RSxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxnRUFBZ0UsQ0FBQyxDQUFDO1lBQ3BGLENBQUM7WUFDRCxTQUFTLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO1lBQ3ZFLElBQUksQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUM7Z0JBQ3ZCLE1BQU0sSUFBSSxLQUFLLENBQUMsMkRBQTJELENBQUMsQ0FBQztZQUMvRSxDQUFDO1lBQ0QsSUFBSSxNQUFNLENBQUMsY0FBYyxFQUFFLENBQUM7Z0JBQzFCLFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsY0FBYyxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDdkUsQ0FBQztZQUNELElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUN4QixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdkMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQzt3QkFDakMsTUFBTSxJQUFJLEtBQUssQ0FBQyxzQ0FBc0MsSUFBSSxFQUFFLENBQUMsQ0FBQztvQkFDaEUsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQztnQkFDdEIsTUFBTSxJQUFJLEtBQUssQ0FBQyxrQ0FBa0MsQ0FBQyxDQUFDO1lBQ3RELENBQUM7WUFDRCwyR0FBMkc7WUFDM0csSUFBSSxNQUFNLENBQUMsU0FBUyxLQUFLLE1BQU0sRUFBRSxDQUFDO2dCQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDO29CQUNwRixNQUFNLElBQUksS0FBSyxDQUFDLGdGQUFnRixDQUFDLENBQUM7Z0JBQ3BHLENBQUM7WUFDSCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztnQkFDNUIsTUFBTSxJQUFJLEtBQUssQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFDO1lBQzVELENBQUM7WUFDRCxtQ0FBbUM7WUFDbkMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO2dCQUM3QixNQUFNLElBQUksS0FBSyxDQUFDLHFFQUFxRSxDQUFDLENBQUM7WUFDekYsQ0FBQztZQUNELFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztZQUN6RSxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsRUFBRSxDQUFDO2dCQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLG9FQUFvRSxDQUFDLENBQUM7WUFDeEYsQ0FBQztZQUNELFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsZUFBZSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDekUsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLHFCQUFxQixHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25GLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNuRSxDQUFDO1FBQ0QsSUFBSSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7WUFDZixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEVBQUUsQ0FBQztnQkFDN0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDNUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLG9CQUFvQixDQUFDLE1BQXdCO1FBQ3pELElBQUksTUFBTSxDQUFDLGFBQWEsS0FBSyxXQUFXLEVBQUUsQ0FBQztZQUN6Qyw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFDRCxTQUFTLENBQUMsaUJBQWlCLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxZQUFZLENBQUMsQ0FBQztZQUM3RCxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUUsQ0FBQztnQkFDbkQsTUFBTSxJQUFJLEtBQUssQ0FBQyxzRUFBc0UsQ0FBQyxDQUFDO1lBQzFGLENBQUM7WUFDRCxLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbEMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztvQkFDcEIsTUFBTSxJQUFJLEtBQUssQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFDO2dCQUMzRCxDQUFDO2dCQUNELFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLGdCQUFnQixDQUFDLENBQUM7Z0JBQzlELElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO29CQUNyRCxNQUFNLElBQUksS0FBSyxDQUFDLHdDQUF3QyxDQUFDLENBQUM7Z0JBQzVELENBQUM7Z0JBQ0QsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7d0JBQ2pDLE1BQU0sSUFBSSxLQUFLLENBQUMsMkNBQTJDLElBQUksRUFBRSxDQUFDLENBQUM7b0JBQ3JFLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCxJQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDdEIsU0FBUyxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztnQkFDdEUsQ0FBQztZQUNILENBQUM7WUFDRCxJQUFJLE1BQU0sQ0FBQyxZQUFZLEtBQUssU0FBUyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksR0FBRyxDQUFDLElBQUksTUFBTSxDQUFDLFlBQVksR0FBRyxLQUFLLENBQUMsRUFBRSxDQUFDO2dCQUNsRyxNQUFNLElBQUksS0FBSyxDQUFDLHFEQUFxRCxDQUFDLENBQUM7WUFDekUsQ0FBQztRQUNILENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDdkIsTUFBTSxJQUFJLEtBQUssQ0FBQyxtQ0FBbUMsQ0FBQyxDQUFDO1lBQ3ZELENBQUM7WUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDO2dCQUN2QixNQUFNLElBQUksS0FBSyxDQUFDLG1DQUFtQyxDQUFDLENBQUM7WUFDdkQsQ0FBQztZQUNELElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLENBQUMsQ0FBQztZQUN0RCxDQUFDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbkIsTUFBTSxJQUFJLEtBQUssQ0FBQywrQkFBK0IsQ0FBQyxDQUFDO1lBQ25ELENBQUM7WUFDRCxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztnQkFDNUMsTUFBTSxJQUFJLEtBQUssQ0FBQyw4QkFBOEIsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDakUsQ0FBQztZQUNELHNDQUFzQztZQUN0QyxJQUFJLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDbkIsS0FBSyxNQUFNLE1BQU0sSUFBSSxNQUFNLENBQUMsT0FBTyxFQUFFLENBQUM7b0JBQ3BDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUM7d0JBQ3JCLE1BQU0sSUFBSSxLQUFLLENBQUMsOENBQThDLENBQUMsQ0FBQztvQkFDbEUsQ0FBQztvQkFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixNQUFNLENBQUMsUUFBUSx5QkFBeUIsQ0FBQyxDQUFDO29CQUNsRixDQUFDO29CQUNELFNBQVMsQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxFQUFFLFdBQVcsTUFBTSxDQUFDLFFBQVEsYUFBYSxDQUFDLENBQUM7Z0JBQ3pGLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUNELElBQUksTUFBTSxDQUFDLEdBQUcsS0FBSyxTQUFTLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxHQUFHLEdBQUcsSUFBSSxNQUFNLENBQUMsR0FBRyxHQUFHLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDekUsTUFBTSxJQUFJLEtBQUssQ0FBQyw4Q0FBOEMsQ0FBQyxDQUFDO1FBQ2xFLENBQUM7UUFDRCxJQUFJLE1BQU0sQ0FBQyxxQkFBcUIsS0FBSyxTQUFTLElBQUksTUFBTSxDQUFDLHFCQUFxQixHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ25GLE1BQU0sSUFBSSxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQztRQUNuRSxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUksUUFBZ0I7UUFDbEQsTUFBTSxPQUFPLEdBQUcsTUFBTSxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ3RFLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQU0sQ0FBQztJQUNsQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBSSxRQUFnQixFQUFFLE1BQVM7UUFDM0QsTUFBTSxPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBQ2hELE1BQU0sT0FBTyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssTUFBTSxDQUFDLFNBQVMsQ0FBQyxFQUFVO1FBQ2pDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDNUIsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNyQyxPQUFPLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUMxQixNQUFNLEdBQUcsR0FBRyxRQUFRLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksR0FBRyxJQUFJLE1BQU0sQ0FBQyxHQUFHLENBQUMsS0FBSyxJQUFJLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsYUFBYSxDQUFDLE1BQWM7UUFDekMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsRUFBRSxDQUFDO1lBQUUsT0FBTyxLQUFLLENBQUM7UUFDM0MsTUFBTSxTQUFTLEdBQUcsUUFBUSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN2QyxPQUFPLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxJQUFJLFNBQVMsSUFBSSxDQUFDLElBQUksU0FBUyxJQUFJLEVBQUUsQ0FBQztJQUNoRSxDQUFDO0lBRUQ7O09BRUc7SUFDSyxNQUFNLENBQUMsV0FBVyxDQUFDLElBQVk7UUFDckMsTUFBTSxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUM5QixJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBQ3JDLE1BQU0sU0FBUyxHQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDekMsSUFBSSxLQUFLLENBQUMsU0FBUyxDQUFDLElBQUksU0FBUyxHQUFHLENBQUM7WUFBRSxPQUFPLEtBQUssQ0FBQztRQUNwRCxPQUFPO1FBQ1AsSUFBSSxTQUFTLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7WUFDbEMsT0FBTyxTQUFTLElBQUksRUFBRSxDQUFDO1FBQ3pCLENBQUM7UUFDRCxxQkFBcUI7UUFDckIsSUFBSSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDM0IsT0FBTyxTQUFTLElBQUksR0FBRyxDQUFDO1FBQzFCLENBQUM7UUFDRCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxHQUFXLEVBQUUsU0FBaUI7UUFDN0QsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO1lBQ3RCLE1BQU0sSUFBSSxLQUFLLENBQUMsY0FBYyxTQUFTLG9EQUFvRCxHQUFHLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztRQUMzRyxDQUFDO1FBQ0QsSUFBSSxDQUFDO1lBQ0gsTUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDdkMsSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLEVBQUUsRUFBRSxDQUFDO2dCQUN0QixNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsU0FBUyxpQ0FBaUMsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7WUFDeEYsQ0FBQztRQUNILENBQUM7UUFBQyxPQUFPLENBQUMsRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLFlBQVksS0FBSyxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBVSxDQUFDLFlBQVksQ0FBQztnQkFBRSxNQUFNLENBQUMsQ0FBQztZQUN0RSxNQUFNLElBQUksS0FBSyxDQUFDLGNBQWMsU0FBUyxzQkFBc0IsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as plugins from './smartvpn.plugins.js';
|
|
2
|
-
import type { IVpnServerOptions, IVpnServerConfig, IVpnStatus, IVpnServerStatistics, IVpnClientInfo, IVpnKeypair, IVpnClientTelemetry, IWgPeerConfig, IWgPeerInfo } from './smartvpn.interfaces.js';
|
|
2
|
+
import type { IVpnServerOptions, IVpnServerConfig, IVpnStatus, IVpnServerStatistics, IVpnClientInfo, IVpnKeypair, IVpnClientTelemetry, IWgPeerConfig, IWgPeerInfo, IClientEntry, IClientConfigBundle } from './smartvpn.interfaces.js';
|
|
3
3
|
/**
|
|
4
4
|
* VPN Server — manages a smartvpn daemon in server mode.
|
|
5
5
|
*/
|
|
@@ -63,6 +63,47 @@ export declare class VpnServer extends plugins.events.EventEmitter {
|
|
|
63
63
|
* List WireGuard peers with stats.
|
|
64
64
|
*/
|
|
65
65
|
listWgPeers(): Promise<IWgPeerInfo[]>;
|
|
66
|
+
/**
|
|
67
|
+
* Create a new client. Generates keypairs, assigns IP, returns full config bundle.
|
|
68
|
+
* The secrets (private keys) are only returned at creation time.
|
|
69
|
+
*/
|
|
70
|
+
createClient(opts: Partial<IClientEntry>): Promise<IClientConfigBundle>;
|
|
71
|
+
/**
|
|
72
|
+
* Remove a registered client (also disconnects if connected).
|
|
73
|
+
*/
|
|
74
|
+
removeClient(clientId: string): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Get a registered client by ID.
|
|
77
|
+
*/
|
|
78
|
+
getClient(clientId: string): Promise<IClientEntry>;
|
|
79
|
+
/**
|
|
80
|
+
* List all registered clients.
|
|
81
|
+
*/
|
|
82
|
+
listRegisteredClients(): Promise<IClientEntry[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Update a registered client's fields (ACLs, tags, description, etc.).
|
|
85
|
+
*/
|
|
86
|
+
updateClient(clientId: string, update: Partial<IClientEntry>): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Enable a previously disabled client.
|
|
89
|
+
*/
|
|
90
|
+
enableClient(clientId: string): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Disable a client (also disconnects if connected).
|
|
93
|
+
*/
|
|
94
|
+
disableClient(clientId: string): Promise<void>;
|
|
95
|
+
/**
|
|
96
|
+
* Rotate a client's keys. Returns a new config bundle with fresh keypairs.
|
|
97
|
+
*/
|
|
98
|
+
rotateClientKey(clientId: string): Promise<IClientConfigBundle>;
|
|
99
|
+
/**
|
|
100
|
+
* Export a client config (without secrets) in the specified format.
|
|
101
|
+
*/
|
|
102
|
+
exportClientConfig(clientId: string, format: 'smartvpn' | 'wireguard'): Promise<string>;
|
|
103
|
+
/**
|
|
104
|
+
* Generate a standalone Noise IK keypair (not tied to a client).
|
|
105
|
+
*/
|
|
106
|
+
generateClientKeypair(): Promise<IVpnKeypair>;
|
|
66
107
|
/**
|
|
67
108
|
* Stop the daemon bridge.
|
|
68
109
|
*/
|
|
@@ -116,6 +116,70 @@ export class VpnServer extends plugins.events.EventEmitter {
|
|
|
116
116
|
const result = await this.bridge.sendCommand('listWgPeers', {});
|
|
117
117
|
return result.peers;
|
|
118
118
|
}
|
|
119
|
+
// ── Client Registry (Hub) Methods ─────────────────────────────────────
|
|
120
|
+
/**
|
|
121
|
+
* Create a new client. Generates keypairs, assigns IP, returns full config bundle.
|
|
122
|
+
* The secrets (private keys) are only returned at creation time.
|
|
123
|
+
*/
|
|
124
|
+
async createClient(opts) {
|
|
125
|
+
return this.bridge.sendCommand('createClient', { client: opts });
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Remove a registered client (also disconnects if connected).
|
|
129
|
+
*/
|
|
130
|
+
async removeClient(clientId) {
|
|
131
|
+
await this.bridge.sendCommand('removeClient', { clientId });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Get a registered client by ID.
|
|
135
|
+
*/
|
|
136
|
+
async getClient(clientId) {
|
|
137
|
+
return this.bridge.sendCommand('getClient', { clientId });
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* List all registered clients.
|
|
141
|
+
*/
|
|
142
|
+
async listRegisteredClients() {
|
|
143
|
+
const result = await this.bridge.sendCommand('listRegisteredClients', {});
|
|
144
|
+
return result.clients;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Update a registered client's fields (ACLs, tags, description, etc.).
|
|
148
|
+
*/
|
|
149
|
+
async updateClient(clientId, update) {
|
|
150
|
+
await this.bridge.sendCommand('updateClient', { clientId, update });
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Enable a previously disabled client.
|
|
154
|
+
*/
|
|
155
|
+
async enableClient(clientId) {
|
|
156
|
+
await this.bridge.sendCommand('enableClient', { clientId });
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Disable a client (also disconnects if connected).
|
|
160
|
+
*/
|
|
161
|
+
async disableClient(clientId) {
|
|
162
|
+
await this.bridge.sendCommand('disableClient', { clientId });
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Rotate a client's keys. Returns a new config bundle with fresh keypairs.
|
|
166
|
+
*/
|
|
167
|
+
async rotateClientKey(clientId) {
|
|
168
|
+
return this.bridge.sendCommand('rotateClientKey', { clientId });
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Export a client config (without secrets) in the specified format.
|
|
172
|
+
*/
|
|
173
|
+
async exportClientConfig(clientId, format) {
|
|
174
|
+
const result = await this.bridge.sendCommand('exportClientConfig', { clientId, format });
|
|
175
|
+
return result.config;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Generate a standalone Noise IK keypair (not tied to a client).
|
|
179
|
+
*/
|
|
180
|
+
async generateClientKeypair() {
|
|
181
|
+
return this.bridge.sendCommand('generateClientKeypair', {});
|
|
182
|
+
}
|
|
119
183
|
/**
|
|
120
184
|
* Stop the daemon bridge.
|
|
121
185
|
*/
|
|
@@ -129,4 +193,4 @@ export class VpnServer extends plugins.events.EventEmitter {
|
|
|
129
193
|
return this.bridge.running;
|
|
130
194
|
}
|
|
131
195
|
}
|
|
132
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
196
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic21hcnR2cG4uY2xhc3Nlcy52cG5zZXJ2ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90cy9zbWFydHZwbi5jbGFzc2VzLnZwbnNlcnZlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLHVCQUF1QixDQUFDO0FBQ2pELE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQWdCNUQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8sU0FBVSxTQUFRLE9BQU8sQ0FBQyxNQUFNLENBQUMsWUFBWTtJQUl4RCxZQUFZLE9BQTBCO1FBQ3BDLEtBQUssRUFBRSxDQUFDO1FBQ1IsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxJQUFJLFNBQVMsQ0FBcUI7WUFDOUMsU0FBUyxFQUFFLE9BQU8sQ0FBQyxTQUFTO1lBQzVCLElBQUksRUFBRSxRQUFRO1NBQ2YsQ0FBQyxDQUFDO1FBRUgsd0JBQXdCO1FBQ3hCLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sRUFBRSxDQUFDLElBQW1CLEVBQUUsTUFBcUIsRUFBRSxFQUFFO1lBQ3BFLElBQUksQ0FBQyxJQUFJLENBQUMsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7UUFDdEMsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxhQUFhLEVBQUUsR0FBRyxFQUFFO1lBQ2pDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDM0IsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQXlCO1FBQzFDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsT0FBTyxF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
|
|
@@ -13,8 +13,12 @@ export type TVpnTransportOptions = IVpnTransportStdio | IVpnTransportSocket;
|
|
|
13
13
|
export interface IVpnClientConfig {
|
|
14
14
|
/** Server WebSocket URL, e.g. wss://vpn.example.com/tunnel */
|
|
15
15
|
serverUrl: string;
|
|
16
|
-
/** Server's static public key (base64) for Noise
|
|
16
|
+
/** Server's static public key (base64) for Noise IK handshake */
|
|
17
17
|
serverPublicKey: string;
|
|
18
|
+
/** Client's Noise IK private key (base64) — required for SmartVPN native transport */
|
|
19
|
+
clientPrivateKey: string;
|
|
20
|
+
/** Client's Noise IK public key (base64) — for reference/display */
|
|
21
|
+
clientPublicKey: string;
|
|
18
22
|
/** Optional DNS servers to use while connected */
|
|
19
23
|
dns?: string[];
|
|
20
24
|
/** Optional MTU for the TUN device */
|
|
@@ -79,6 +83,15 @@ export interface IVpnServerConfig {
|
|
|
79
83
|
wgListenPort?: number;
|
|
80
84
|
/** WireGuard: configured peers */
|
|
81
85
|
wgPeers?: IWgPeerConfig[];
|
|
86
|
+
/** Pre-registered clients for Noise IK authentication */
|
|
87
|
+
clients?: IClientEntry[];
|
|
88
|
+
/** Enable PROXY protocol v2 on incoming WebSocket connections.
|
|
89
|
+
* Required when behind a reverse proxy that sends PP v2 headers (HAProxy, SmartProxy).
|
|
90
|
+
* SECURITY: Must be false when accepting direct client connections. */
|
|
91
|
+
proxyProtocol?: boolean;
|
|
92
|
+
/** Server-level IP block list — applied at TCP accept, before Noise handshake.
|
|
93
|
+
* Supports exact IPs, CIDR, wildcards, ranges. */
|
|
94
|
+
connectionIpBlockList?: string[];
|
|
82
95
|
}
|
|
83
96
|
export interface IVpnServerOptions {
|
|
84
97
|
transport: TVpnTransportOptions;
|
|
@@ -114,6 +127,12 @@ export interface IVpnClientInfo {
|
|
|
114
127
|
keepalivesReceived: number;
|
|
115
128
|
rateLimitBytesPerSec?: number;
|
|
116
129
|
burstBytes?: number;
|
|
130
|
+
/** Client's authenticated Noise IK public key (base64) */
|
|
131
|
+
authenticatedKey: string;
|
|
132
|
+
/** Registered client ID from the client registry */
|
|
133
|
+
registeredClientId: string;
|
|
134
|
+
/** Real client IP:port (from PROXY protocol or direct TCP connection) */
|
|
135
|
+
remoteAddr?: string;
|
|
117
136
|
}
|
|
118
137
|
export interface IVpnServerStatistics extends IVpnStatistics {
|
|
119
138
|
activeClients: number;
|
|
@@ -154,6 +173,76 @@ export interface IVpnClientTelemetry {
|
|
|
154
173
|
rateLimitBytesPerSec?: number;
|
|
155
174
|
burstBytes?: number;
|
|
156
175
|
}
|
|
176
|
+
/** Per-client rate limiting. */
|
|
177
|
+
export interface IClientRateLimit {
|
|
178
|
+
/** Max throughput in bytes/sec */
|
|
179
|
+
bytesPerSec: number;
|
|
180
|
+
/** Burst allowance in bytes */
|
|
181
|
+
burstBytes: number;
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Per-client security settings.
|
|
185
|
+
* Mirrors SmartProxy's IRouteSecurity: ipAllowList/ipBlockList naming + deny-overrides-allow.
|
|
186
|
+
* Adds VPN-specific destination filtering.
|
|
187
|
+
*/
|
|
188
|
+
export interface IClientSecurity {
|
|
189
|
+
/** Source IPs/CIDRs the client may connect FROM (empty = any).
|
|
190
|
+
* Supports: exact IP, CIDR, wildcard (192.168.1.*), ranges (1.1.1.1-1.1.1.5). */
|
|
191
|
+
ipAllowList?: string[];
|
|
192
|
+
/** Source IPs blocked — overrides ipAllowList (deny wins). */
|
|
193
|
+
ipBlockList?: string[];
|
|
194
|
+
/** Destination IPs/CIDRs the client may reach through the VPN (empty = all). */
|
|
195
|
+
destinationAllowList?: string[];
|
|
196
|
+
/** Destination IPs blocked — overrides destinationAllowList (deny wins). */
|
|
197
|
+
destinationBlockList?: string[];
|
|
198
|
+
/** Max concurrent connections from this client. */
|
|
199
|
+
maxConnections?: number;
|
|
200
|
+
/** Per-client rate limiting. */
|
|
201
|
+
rateLimit?: IClientRateLimit;
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Server-side client definition — the central config object for the Hub.
|
|
205
|
+
* Naming and structure aligned with SmartProxy's IRouteConfig / IRouteSecurity.
|
|
206
|
+
*/
|
|
207
|
+
export interface IClientEntry {
|
|
208
|
+
/** Human-readable client ID (e.g. "alice-laptop") */
|
|
209
|
+
clientId: string;
|
|
210
|
+
/** Client's Noise IK public key (base64) — for SmartVPN native transport */
|
|
211
|
+
publicKey: string;
|
|
212
|
+
/** Client's WireGuard public key (base64) — for WireGuard transport */
|
|
213
|
+
wgPublicKey?: string;
|
|
214
|
+
/** Security settings (ACLs, rate limits) */
|
|
215
|
+
security?: IClientSecurity;
|
|
216
|
+
/** Traffic priority (lower = higher priority, default: 100) */
|
|
217
|
+
priority?: number;
|
|
218
|
+
/** Whether this client is enabled (default: true) */
|
|
219
|
+
enabled?: boolean;
|
|
220
|
+
/** Tags for grouping (e.g. ["engineering", "office"]) */
|
|
221
|
+
tags?: string[];
|
|
222
|
+
/** Optional description */
|
|
223
|
+
description?: string;
|
|
224
|
+
/** Optional expiry (ISO 8601 timestamp, omit = never expires) */
|
|
225
|
+
expiresAt?: string;
|
|
226
|
+
/** Assigned VPN IP address (set by server) */
|
|
227
|
+
assignedIp?: string;
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Complete client config bundle — returned by createClient() and rotateClientKey().
|
|
231
|
+
* Contains everything the client needs to connect.
|
|
232
|
+
*/
|
|
233
|
+
export interface IClientConfigBundle {
|
|
234
|
+
/** The server-side client entry */
|
|
235
|
+
entry: IClientEntry;
|
|
236
|
+
/** Ready-to-use SmartVPN client config (typed object) */
|
|
237
|
+
smartvpnConfig: IVpnClientConfig;
|
|
238
|
+
/** Ready-to-use WireGuard .conf file content (string) */
|
|
239
|
+
wireguardConfig: string;
|
|
240
|
+
/** Client's private keys (ONLY returned at creation time, not stored server-side) */
|
|
241
|
+
secrets: {
|
|
242
|
+
noisePrivateKey: string;
|
|
243
|
+
wgPrivateKey: string;
|
|
244
|
+
};
|
|
245
|
+
}
|
|
157
246
|
export interface IWgPeerConfig {
|
|
158
247
|
/** Peer's public key (base64, X25519) */
|
|
159
248
|
publicKey: string;
|
|
@@ -284,6 +373,68 @@ export type TVpnServerCommands = {
|
|
|
284
373
|
peers: IWgPeerInfo[];
|
|
285
374
|
};
|
|
286
375
|
};
|
|
376
|
+
createClient: {
|
|
377
|
+
params: {
|
|
378
|
+
client: Partial<IClientEntry>;
|
|
379
|
+
};
|
|
380
|
+
result: IClientConfigBundle;
|
|
381
|
+
};
|
|
382
|
+
removeClient: {
|
|
383
|
+
params: {
|
|
384
|
+
clientId: string;
|
|
385
|
+
};
|
|
386
|
+
result: void;
|
|
387
|
+
};
|
|
388
|
+
getClient: {
|
|
389
|
+
params: {
|
|
390
|
+
clientId: string;
|
|
391
|
+
};
|
|
392
|
+
result: IClientEntry;
|
|
393
|
+
};
|
|
394
|
+
listRegisteredClients: {
|
|
395
|
+
params: Record<string, never>;
|
|
396
|
+
result: {
|
|
397
|
+
clients: IClientEntry[];
|
|
398
|
+
};
|
|
399
|
+
};
|
|
400
|
+
updateClient: {
|
|
401
|
+
params: {
|
|
402
|
+
clientId: string;
|
|
403
|
+
update: Partial<IClientEntry>;
|
|
404
|
+
};
|
|
405
|
+
result: void;
|
|
406
|
+
};
|
|
407
|
+
enableClient: {
|
|
408
|
+
params: {
|
|
409
|
+
clientId: string;
|
|
410
|
+
};
|
|
411
|
+
result: void;
|
|
412
|
+
};
|
|
413
|
+
disableClient: {
|
|
414
|
+
params: {
|
|
415
|
+
clientId: string;
|
|
416
|
+
};
|
|
417
|
+
result: void;
|
|
418
|
+
};
|
|
419
|
+
rotateClientKey: {
|
|
420
|
+
params: {
|
|
421
|
+
clientId: string;
|
|
422
|
+
};
|
|
423
|
+
result: IClientConfigBundle;
|
|
424
|
+
};
|
|
425
|
+
exportClientConfig: {
|
|
426
|
+
params: {
|
|
427
|
+
clientId: string;
|
|
428
|
+
format: 'smartvpn' | 'wireguard';
|
|
429
|
+
};
|
|
430
|
+
result: {
|
|
431
|
+
config: string;
|
|
432
|
+
};
|
|
433
|
+
};
|
|
434
|
+
generateClientKeypair: {
|
|
435
|
+
params: Record<string, never>;
|
|
436
|
+
result: IVpnKeypair;
|
|
437
|
+
};
|
|
287
438
|
};
|
|
288
439
|
export type TVpnPlatform = 'linux' | 'macos' | 'windows' | 'unknown';
|
|
289
440
|
export interface IVpnServiceUnit {
|