@serve.zone/dcrouter 11.12.4 → 11.13.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_serve/bundle.js +705 -548
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.dcrouter.d.ts +30 -0
- package/dist_ts/classes.dcrouter.js +92 -2
- package/dist_ts/config/classes.route-config-manager.d.ts +2 -1
- package/dist_ts/config/classes.route-config-manager.js +21 -5
- package/dist_ts/opsserver/classes.opsserver.d.ts +1 -0
- package/dist_ts/opsserver/classes.opsserver.js +3 -1
- package/dist_ts/opsserver/handlers/index.d.ts +1 -0
- package/dist_ts/opsserver/handlers/index.js +2 -1
- package/dist_ts/opsserver/handlers/vpn.handler.d.ts +6 -0
- package/dist_ts/opsserver/handlers/vpn.handler.js +199 -0
- package/dist_ts/plugins.d.ts +2 -1
- package/dist_ts/plugins.js +3 -2
- package/dist_ts/vpn/classes.vpn-manager.d.ts +113 -0
- package/dist_ts/vpn/classes.vpn-manager.js +297 -0
- package/dist_ts/vpn/index.d.ts +1 -0
- package/dist_ts/vpn/index.js +2 -0
- package/dist_ts_interfaces/data/index.d.ts +1 -0
- package/dist_ts_interfaces/data/index.js +2 -1
- package/dist_ts_interfaces/data/remoteingress.d.ts +10 -1
- package/dist_ts_interfaces/data/vpn.d.ts +43 -0
- package/dist_ts_interfaces/data/vpn.js +2 -0
- package/dist_ts_interfaces/requests/index.d.ts +1 -0
- package/dist_ts_interfaces/requests/index.js +2 -1
- package/dist_ts_interfaces/requests/vpn.d.ts +135 -0
- package/dist_ts_interfaces/requests/vpn.js +3 -0
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate.d.ts +22 -0
- package/dist_ts_web/appstate.js +111 -1
- package/dist_ts_web/elements/index.d.ts +1 -0
- package/dist_ts_web/elements/index.js +2 -1
- package/dist_ts_web/elements/ops-dashboard.js +7 -1
- package/dist_ts_web/elements/ops-view-vpn.d.ts +14 -0
- package/dist_ts_web/elements/ops-view-vpn.js +369 -0
- package/package.json +2 -1
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.dcrouter.ts +126 -0
- package/ts/config/classes.route-config-manager.ts +20 -3
- package/ts/opsserver/classes.opsserver.ts +2 -0
- package/ts/opsserver/handlers/index.ts +2 -1
- package/ts/opsserver/handlers/vpn.handler.ts +257 -0
- package/ts/plugins.ts +2 -1
- package/ts/vpn/classes.vpn-manager.ts +378 -0
- package/ts/vpn/index.ts +1 -0
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +164 -0
- package/ts_web/elements/index.ts +1 -0
- package/ts_web/elements/ops-dashboard.ts +6 -0
- package/ts_web/elements/ops-view-vpn.ts +330 -0
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import { logger } from '../logger.js';
|
|
3
|
+
const STORAGE_PREFIX_KEYS = '/vpn/server-keys';
|
|
4
|
+
const STORAGE_PREFIX_CLIENTS = '/vpn/clients/';
|
|
5
|
+
/**
|
|
6
|
+
* Manages the SmartVPN server lifecycle and VPN client CRUD.
|
|
7
|
+
* Persists server keys and client registrations via StorageManager.
|
|
8
|
+
*/
|
|
9
|
+
export class VpnManager {
|
|
10
|
+
storageManager;
|
|
11
|
+
config;
|
|
12
|
+
vpnServer;
|
|
13
|
+
clients = new Map();
|
|
14
|
+
serverKeys;
|
|
15
|
+
_forwardingMode;
|
|
16
|
+
constructor(storageManager, config) {
|
|
17
|
+
this.storageManager = storageManager;
|
|
18
|
+
this.config = config;
|
|
19
|
+
// Auto-detect forwarding mode: tun if root, socket otherwise
|
|
20
|
+
this._forwardingMode = config.forwardingMode
|
|
21
|
+
?? (process.getuid?.() === 0 ? 'tun' : 'socket');
|
|
22
|
+
}
|
|
23
|
+
/** The effective forwarding mode (tun or socket). */
|
|
24
|
+
get forwardingMode() {
|
|
25
|
+
return this._forwardingMode;
|
|
26
|
+
}
|
|
27
|
+
/** The VPN subnet CIDR. */
|
|
28
|
+
getSubnet() {
|
|
29
|
+
return this.config.subnet || '10.8.0.0/24';
|
|
30
|
+
}
|
|
31
|
+
/** Whether the VPN server is running. */
|
|
32
|
+
get running() {
|
|
33
|
+
return this.vpnServer?.running ?? false;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Start the VPN server.
|
|
37
|
+
* Loads or generates server keys, loads persisted clients, starts VpnServer.
|
|
38
|
+
*/
|
|
39
|
+
async start() {
|
|
40
|
+
// Load or generate server keys
|
|
41
|
+
this.serverKeys = await this.loadOrGenerateServerKeys();
|
|
42
|
+
// Load persisted clients
|
|
43
|
+
await this.loadPersistedClients();
|
|
44
|
+
// Build client entries for the daemon
|
|
45
|
+
const clientEntries = [];
|
|
46
|
+
for (const client of this.clients.values()) {
|
|
47
|
+
clientEntries.push({
|
|
48
|
+
clientId: client.clientId,
|
|
49
|
+
publicKey: client.noisePublicKey,
|
|
50
|
+
wgPublicKey: client.wgPublicKey,
|
|
51
|
+
enabled: client.enabled,
|
|
52
|
+
tags: client.tags,
|
|
53
|
+
description: client.description,
|
|
54
|
+
assignedIp: client.assignedIp,
|
|
55
|
+
expiresAt: client.expiresAt,
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
const subnet = this.getSubnet();
|
|
59
|
+
const wgListenPort = this.config.wgListenPort ?? 51820;
|
|
60
|
+
// Create and start VpnServer
|
|
61
|
+
this.vpnServer = new plugins.smartvpn.VpnServer({
|
|
62
|
+
transport: { transport: 'stdio' },
|
|
63
|
+
});
|
|
64
|
+
const serverConfig = {
|
|
65
|
+
listenAddr: '0.0.0.0:0', // WS listener not strictly needed but required field
|
|
66
|
+
privateKey: this.serverKeys.noisePrivateKey,
|
|
67
|
+
publicKey: this.serverKeys.noisePublicKey,
|
|
68
|
+
subnet,
|
|
69
|
+
dns: this.config.dns,
|
|
70
|
+
forwardingMode: this._forwardingMode,
|
|
71
|
+
transportMode: 'all',
|
|
72
|
+
wgPrivateKey: this.serverKeys.wgPrivateKey,
|
|
73
|
+
wgListenPort,
|
|
74
|
+
clients: clientEntries,
|
|
75
|
+
socketForwardProxyProtocol: this._forwardingMode === 'socket',
|
|
76
|
+
};
|
|
77
|
+
await this.vpnServer.start(serverConfig);
|
|
78
|
+
logger.log('info', `VPN server started: mode=${this._forwardingMode}, subnet=${subnet}, wg=:${wgListenPort}, clients=${this.clients.size}`);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Stop the VPN server.
|
|
82
|
+
*/
|
|
83
|
+
async stop() {
|
|
84
|
+
if (this.vpnServer) {
|
|
85
|
+
try {
|
|
86
|
+
await this.vpnServer.stopServer();
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore stop errors
|
|
90
|
+
}
|
|
91
|
+
this.vpnServer.stop();
|
|
92
|
+
this.vpnServer = undefined;
|
|
93
|
+
}
|
|
94
|
+
logger.log('info', 'VPN server stopped');
|
|
95
|
+
}
|
|
96
|
+
// ── Client CRUD ────────────────────────────────────────────────────────
|
|
97
|
+
/**
|
|
98
|
+
* Create a new VPN client. Returns the config bundle (secrets only shown once).
|
|
99
|
+
*/
|
|
100
|
+
async createClient(opts) {
|
|
101
|
+
if (!this.vpnServer) {
|
|
102
|
+
throw new Error('VPN server not running');
|
|
103
|
+
}
|
|
104
|
+
const bundle = await this.vpnServer.createClient({
|
|
105
|
+
clientId: opts.clientId,
|
|
106
|
+
tags: opts.tags,
|
|
107
|
+
description: opts.description,
|
|
108
|
+
});
|
|
109
|
+
// Update WireGuard config endpoint if serverEndpoint is configured
|
|
110
|
+
if (this.config.serverEndpoint && bundle.wireguardConfig) {
|
|
111
|
+
const wgPort = this.config.wgListenPort ?? 51820;
|
|
112
|
+
bundle.wireguardConfig = bundle.wireguardConfig.replace(/Endpoint\s*=\s*.+/, `Endpoint = ${this.config.serverEndpoint}:${wgPort}`);
|
|
113
|
+
}
|
|
114
|
+
// Persist client entry (without private keys)
|
|
115
|
+
const persisted = {
|
|
116
|
+
clientId: bundle.entry.clientId,
|
|
117
|
+
enabled: bundle.entry.enabled ?? true,
|
|
118
|
+
tags: bundle.entry.tags,
|
|
119
|
+
description: bundle.entry.description,
|
|
120
|
+
assignedIp: bundle.entry.assignedIp,
|
|
121
|
+
noisePublicKey: bundle.entry.publicKey,
|
|
122
|
+
wgPublicKey: bundle.entry.wgPublicKey || '',
|
|
123
|
+
createdAt: Date.now(),
|
|
124
|
+
updatedAt: Date.now(),
|
|
125
|
+
expiresAt: bundle.entry.expiresAt,
|
|
126
|
+
};
|
|
127
|
+
this.clients.set(persisted.clientId, persisted);
|
|
128
|
+
await this.persistClient(persisted);
|
|
129
|
+
return bundle;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Remove a VPN client.
|
|
133
|
+
*/
|
|
134
|
+
async removeClient(clientId) {
|
|
135
|
+
if (!this.vpnServer) {
|
|
136
|
+
throw new Error('VPN server not running');
|
|
137
|
+
}
|
|
138
|
+
await this.vpnServer.removeClient(clientId);
|
|
139
|
+
this.clients.delete(clientId);
|
|
140
|
+
await this.storageManager.delete(`${STORAGE_PREFIX_CLIENTS}${clientId}`);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* List all registered clients (without secrets).
|
|
144
|
+
*/
|
|
145
|
+
listClients() {
|
|
146
|
+
return [...this.clients.values()];
|
|
147
|
+
}
|
|
148
|
+
/**
|
|
149
|
+
* Enable a client.
|
|
150
|
+
*/
|
|
151
|
+
async enableClient(clientId) {
|
|
152
|
+
if (!this.vpnServer)
|
|
153
|
+
throw new Error('VPN server not running');
|
|
154
|
+
await this.vpnServer.enableClient(clientId);
|
|
155
|
+
const client = this.clients.get(clientId);
|
|
156
|
+
if (client) {
|
|
157
|
+
client.enabled = true;
|
|
158
|
+
client.updatedAt = Date.now();
|
|
159
|
+
await this.persistClient(client);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Disable a client.
|
|
164
|
+
*/
|
|
165
|
+
async disableClient(clientId) {
|
|
166
|
+
if (!this.vpnServer)
|
|
167
|
+
throw new Error('VPN server not running');
|
|
168
|
+
await this.vpnServer.disableClient(clientId);
|
|
169
|
+
const client = this.clients.get(clientId);
|
|
170
|
+
if (client) {
|
|
171
|
+
client.enabled = false;
|
|
172
|
+
client.updatedAt = Date.now();
|
|
173
|
+
await this.persistClient(client);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* Rotate a client's keys. Returns the new config bundle.
|
|
178
|
+
*/
|
|
179
|
+
async rotateClientKey(clientId) {
|
|
180
|
+
if (!this.vpnServer)
|
|
181
|
+
throw new Error('VPN server not running');
|
|
182
|
+
const bundle = await this.vpnServer.rotateClientKey(clientId);
|
|
183
|
+
// Update endpoint in WireGuard config
|
|
184
|
+
if (this.config.serverEndpoint && bundle.wireguardConfig) {
|
|
185
|
+
const wgPort = this.config.wgListenPort ?? 51820;
|
|
186
|
+
bundle.wireguardConfig = bundle.wireguardConfig.replace(/Endpoint\s*=\s*.+/, `Endpoint = ${this.config.serverEndpoint}:${wgPort}`);
|
|
187
|
+
}
|
|
188
|
+
// Update persisted entry with new public keys
|
|
189
|
+
const client = this.clients.get(clientId);
|
|
190
|
+
if (client) {
|
|
191
|
+
client.noisePublicKey = bundle.entry.publicKey;
|
|
192
|
+
client.wgPublicKey = bundle.entry.wgPublicKey || '';
|
|
193
|
+
client.updatedAt = Date.now();
|
|
194
|
+
await this.persistClient(client);
|
|
195
|
+
}
|
|
196
|
+
return bundle;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Export a client config (without secrets).
|
|
200
|
+
*/
|
|
201
|
+
async exportClientConfig(clientId, format) {
|
|
202
|
+
if (!this.vpnServer)
|
|
203
|
+
throw new Error('VPN server not running');
|
|
204
|
+
let config = await this.vpnServer.exportClientConfig(clientId, format);
|
|
205
|
+
// Update endpoint in WireGuard config
|
|
206
|
+
if (format === 'wireguard' && this.config.serverEndpoint) {
|
|
207
|
+
const wgPort = this.config.wgListenPort ?? 51820;
|
|
208
|
+
config = config.replace(/Endpoint\s*=\s*.+/, `Endpoint = ${this.config.serverEndpoint}:${wgPort}`);
|
|
209
|
+
}
|
|
210
|
+
return config;
|
|
211
|
+
}
|
|
212
|
+
// ── Status and telemetry ───────────────────────────────────────────────
|
|
213
|
+
/**
|
|
214
|
+
* Get server status.
|
|
215
|
+
*/
|
|
216
|
+
async getStatus() {
|
|
217
|
+
if (!this.vpnServer)
|
|
218
|
+
return null;
|
|
219
|
+
return this.vpnServer.getStatus();
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Get server statistics.
|
|
223
|
+
*/
|
|
224
|
+
async getStatistics() {
|
|
225
|
+
if (!this.vpnServer)
|
|
226
|
+
return null;
|
|
227
|
+
return this.vpnServer.getStatistics();
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* List currently connected clients.
|
|
231
|
+
*/
|
|
232
|
+
async getConnectedClients() {
|
|
233
|
+
if (!this.vpnServer)
|
|
234
|
+
return [];
|
|
235
|
+
return this.vpnServer.listClients();
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Get telemetry for a specific client.
|
|
239
|
+
*/
|
|
240
|
+
async getClientTelemetry(clientId) {
|
|
241
|
+
if (!this.vpnServer)
|
|
242
|
+
return null;
|
|
243
|
+
return this.vpnServer.getClientTelemetry(clientId);
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get server public keys (for display/info).
|
|
247
|
+
*/
|
|
248
|
+
getServerPublicKeys() {
|
|
249
|
+
if (!this.serverKeys)
|
|
250
|
+
return null;
|
|
251
|
+
return {
|
|
252
|
+
noisePublicKey: this.serverKeys.noisePublicKey,
|
|
253
|
+
wgPublicKey: this.serverKeys.wgPublicKey,
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
// ── Private helpers ────────────────────────────────────────────────────
|
|
257
|
+
async loadOrGenerateServerKeys() {
|
|
258
|
+
const stored = await this.storageManager.getJSON(STORAGE_PREFIX_KEYS);
|
|
259
|
+
if (stored?.noisePrivateKey && stored?.wgPrivateKey) {
|
|
260
|
+
logger.log('info', 'Loaded VPN server keys from storage');
|
|
261
|
+
return stored;
|
|
262
|
+
}
|
|
263
|
+
// Generate new keys via the daemon
|
|
264
|
+
const tempServer = new plugins.smartvpn.VpnServer({
|
|
265
|
+
transport: { transport: 'stdio' },
|
|
266
|
+
});
|
|
267
|
+
await tempServer.start();
|
|
268
|
+
const noiseKeys = await tempServer.generateKeypair();
|
|
269
|
+
const wgKeys = await tempServer.generateWgKeypair();
|
|
270
|
+
tempServer.stop();
|
|
271
|
+
const keys = {
|
|
272
|
+
noisePrivateKey: noiseKeys.privateKey,
|
|
273
|
+
noisePublicKey: noiseKeys.publicKey,
|
|
274
|
+
wgPrivateKey: wgKeys.privateKey,
|
|
275
|
+
wgPublicKey: wgKeys.publicKey,
|
|
276
|
+
};
|
|
277
|
+
await this.storageManager.setJSON(STORAGE_PREFIX_KEYS, keys);
|
|
278
|
+
logger.log('info', 'Generated and persisted new VPN server keys');
|
|
279
|
+
return keys;
|
|
280
|
+
}
|
|
281
|
+
async loadPersistedClients() {
|
|
282
|
+
const keys = await this.storageManager.list(STORAGE_PREFIX_CLIENTS);
|
|
283
|
+
for (const key of keys) {
|
|
284
|
+
const client = await this.storageManager.getJSON(key);
|
|
285
|
+
if (client) {
|
|
286
|
+
this.clients.set(client.clientId, client);
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
if (this.clients.size > 0) {
|
|
290
|
+
logger.log('info', `Loaded ${this.clients.size} persisted VPN client(s)`);
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
async persistClient(client) {
|
|
294
|
+
await this.storageManager.setJSON(`${STORAGE_PREFIX_CLIENTS}${client.clientId}`, client);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy52cG4tbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3Zwbi9jbGFzc2VzLnZwbi1tYW5hZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdEMsTUFBTSxtQkFBbUIsR0FBRyxrQkFBa0IsQ0FBQztBQUMvQyxNQUFNLHNCQUFzQixHQUFHLGVBQWUsQ0FBQztBQW1DL0M7OztHQUdHO0FBQ0gsTUFBTSxPQUFPLFVBQVU7SUFDYixjQUFjLENBQWlCO0lBQy9CLE1BQU0sQ0FBb0I7SUFDMUIsU0FBUyxDQUE4QjtJQUN2QyxPQUFPLEdBQWtDLElBQUksR0FBRyxFQUFFLENBQUM7SUFDbkQsVUFBVSxDQUF3QjtJQUNsQyxlQUFlLENBQW1CO0lBRTFDLFlBQVksY0FBOEIsRUFBRSxNQUF5QjtRQUNuRSxJQUFJLENBQUMsY0FBYyxHQUFHLGNBQWMsQ0FBQztRQUNyQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQiw2REFBNkQ7UUFDN0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsY0FBYztlQUN2QyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxRQUFRLENBQUMsQ0FBQztJQUNyRCxDQUFDO0lBRUQscURBQXFEO0lBQ3JELElBQVcsY0FBYztRQUN2QixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztJQUVELDJCQUEyQjtJQUNwQixTQUFTO1FBQ2QsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sSUFBSSxhQUFhLENBQUM7SUFDN0MsQ0FBQztJQUVELHlDQUF5QztJQUN6QyxJQUFXLE9BQU87UUFDaEIsT0FBTyxJQUFJLENBQUMsU0FBUyxFQUFFLE9BQU8sSUFBSSxLQUFLLENBQUM7SUFDMUMsQ0FBQztJQUVEOzs7T0FHRztJQUNJLEtBQUssQ0FBQyxLQUFLO1FBQ2hCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLHdCQUF3QixFQUFFLENBQUM7UUFFeEQseUJBQXlCO1FBQ3pCLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFbEMsc0NBQXNDO1FBQ3RDLE1BQU0sYUFBYSxHQUFvQyxFQUFFLENBQUM7UUFDMUQsS0FBSyxNQUFNLE1BQU0sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUM7WUFDM0MsYUFBYSxDQUFDLElBQUksQ0FBQztnQkFDakIsUUFBUSxFQUFFLE1BQU0sQ0FBQyxRQUFRO2dCQUN6QixTQUFTLEVBQUUsTUFBTSxDQUFDLGNBQWM7Z0JBQ2hDLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDL0IsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO2dCQUN2QixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7Z0JBQ2pCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztnQkFDL0IsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2dCQUM3QixTQUFTLEVBQUUsTUFBTSxDQUFDLFNBQVM7YUFDNUIsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUNoQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUM7UUFFdkQsNkJBQTZCO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztZQUM5QyxTQUFTLEVBQUUsRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFO1NBQ2xDLENBQUMsQ0FBQztRQUVILE1BQU0sWUFBWSxHQUFzQztZQUN0RCxVQUFVLEVBQUUsV0FBVyxFQUFFLHFEQUFxRDtZQUM5RSxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxlQUFlO1lBQzNDLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLGNBQWM7WUFDekMsTUFBTTtZQUNOLEdBQUcsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUc7WUFDcEIsY0FBYyxFQUFFLElBQUksQ0FBQyxlQUFlO1lBQ3BDLGFBQWEsRUFBRSxLQUFLO1lBQ3BCLFlBQVksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFlBQVk7WUFDMUMsWUFBWTtZQUNaLE9BQU8sRUFBRSxhQUFhO1lBQ3RCLDBCQUEwQixFQUFFLElBQUksQ0FBQyxlQUFlLEtBQUssUUFBUTtTQUM5RCxDQUFDO1FBRUYsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsR0FBRyxDQUFDLE1BQU0sRUFBRSw0QkFBNEIsSUFBSSxDQUFDLGVBQWUsWUFBWSxNQUFNLFNBQVMsWUFBWSxhQUFhLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUM5SSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsSUFBSTtRQUNmLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ25CLElBQUksQ0FBQztnQkFDSCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFLENBQUM7WUFDcEMsQ0FBQztZQUFDLE1BQU0sQ0FBQztnQkFDUCxxQkFBcUI7WUFDdkIsQ0FBQztZQUNELElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDdEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxTQUFTLENBQUM7UUFDN0IsQ0FBQztRQUNELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLG9CQUFvQixDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELDBFQUEwRTtJQUUxRTs7T0FFRztJQUNJLEtBQUssQ0FBQyxZQUFZLENBQUMsSUFJekI7UUFDQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQztZQUMvQyxRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO1NBQzlCLENBQUMsQ0FBQztRQUVILG1FQUFtRTtRQUNuRSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLE1BQU0sQ0FBQyxlQUFlLEVBQUUsQ0FBQztZQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUM7WUFDakQsTUFBTSxDQUFDLGVBQWUsR0FBRyxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FDckQsbUJBQW1CLEVBQ25CLGNBQWMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLElBQUksTUFBTSxFQUFFLENBQ3JELENBQUM7UUFDSixDQUFDO1FBRUQsOENBQThDO1FBQzlDLE1BQU0sU0FBUyxHQUFxQjtZQUNsQyxRQUFRLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxRQUFRO1lBQy9CLE9BQU8sRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLE9BQU8sSUFBSSxJQUFJO1lBQ3JDLElBQUksRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUk7WUFDdkIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVztZQUNyQyxVQUFVLEVBQUUsTUFBTSxDQUFDLEtBQUssQ0FBQyxVQUFVO1lBQ25DLGNBQWMsRUFBRSxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVM7WUFDdEMsV0FBVyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLEVBQUU7WUFDM0MsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUU7WUFDckIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsU0FBUztTQUNsQyxDQUFDO1FBQ0YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUNoRCxNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUM7UUFFcEMsT0FBTyxNQUFNLENBQUM7SUFDaEIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLFlBQVksQ0FBQyxRQUFnQjtRQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUM1QyxDQUFDO1FBQ0QsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM1QyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM5QixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsc0JBQXNCLEdBQUcsUUFBUSxFQUFFLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxXQUFXO1FBQ2hCLE9BQU8sQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBRUQ7O09BRUc7SUFDSSxLQUFLLENBQUMsWUFBWSxDQUFDLFFBQWdCO1FBQ3hDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMvRCxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzVDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBQzFDLElBQUksTUFBTSxFQUFFLENBQUM7WUFDWCxNQUFNLENBQUMsT0FBTyxHQUFHLElBQUksQ0FBQztZQUN0QixNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxhQUFhLENBQUMsUUFBZ0I7UUFDekMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDN0MsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7UUFDMUMsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLE1BQU0sQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO1lBQ3ZCLE1BQU0sQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNuQyxDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGVBQWUsQ0FBQyxRQUFnQjtRQUMzQyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDL0QsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUU5RCxzQ0FBc0M7UUFDdEMsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsSUFBSSxNQUFNLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDekQsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLElBQUksS0FBSyxDQUFDO1lBQ2pELE1BQU0sQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQ3JELG1CQUFtQixFQUNuQixjQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLE1BQU0sRUFBRSxDQUNyRCxDQUFDO1FBQ0osQ0FBQztRQUVELDhDQUE4QztRQUM5QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUMxQyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQztZQUMvQyxNQUFNLENBQUMsV0FBVyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztZQUNwRCxNQUFNLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztZQUM5QixNQUFNLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkMsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLE1BQWdDO1FBQ2hGLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUztZQUFFLE1BQU0sSUFBSSxLQUFLLENBQUMsd0JBQXdCLENBQUMsQ0FBQztRQUMvRCxJQUFJLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBRXZFLHNDQUFzQztRQUN0QyxJQUFJLE1BQU0sS0FBSyxXQUFXLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxjQUFjLEVBQUUsQ0FBQztZQUN6RCxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUM7WUFDakQsTUFBTSxHQUFHLE1BQU0sQ0FBQyxPQUFPLENBQ3JCLG1CQUFtQixFQUNuQixjQUFjLElBQUksQ0FBQyxNQUFNLENBQUMsY0FBYyxJQUFJLE1BQU0sRUFBRSxDQUNyRCxDQUFDO1FBQ0osQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCwwRUFBMEU7SUFFMUU7O09BRUc7SUFDSSxLQUFLLENBQUMsU0FBUztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFLENBQUM7SUFDcEMsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFDLGFBQWE7UUFDeEIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFDakMsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLGFBQWEsRUFBRSxDQUFDO0lBQ3hDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxtQkFBbUI7UUFDOUIsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFDL0IsT0FBTyxJQUFJLENBQUMsU0FBUyxDQUFDLFdBQVcsRUFBRSxDQUFDO0lBQ3RDLENBQUM7SUFFRDs7T0FFRztJQUNJLEtBQUssQ0FBQyxrQkFBa0IsQ0FBQyxRQUFnQjtRQUM5QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQztRQUNqQyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVEOztPQUVHO0lBQ0ksbUJBQW1CO1FBQ3hCLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVTtZQUFFLE9BQU8sSUFBSSxDQUFDO1FBQ2xDLE9BQU87WUFDTCxjQUFjLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxjQUFjO1lBQzlDLFdBQVcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFdBQVc7U0FDekMsQ0FBQztJQUNKLENBQUM7SUFFRCwwRUFBMEU7SUFFbEUsS0FBSyxDQUFDLHdCQUF3QjtRQUNwQyxNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUF1QixtQkFBbUIsQ0FBQyxDQUFDO1FBQzVGLElBQUksTUFBTSxFQUFFLGVBQWUsSUFBSSxNQUFNLEVBQUUsWUFBWSxFQUFFLENBQUM7WUFDcEQsTUFBTSxDQUFDLEdBQUcsQ0FBQyxNQUFNLEVBQUUscUNBQXFDLENBQUMsQ0FBQztZQUMxRCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO1FBRUQsbUNBQW1DO1FBQ25DLE1BQU0sVUFBVSxHQUFHLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7WUFDaEQsU0FBUyxFQUFFLEVBQUUsU0FBUyxFQUFFLE9BQU8sRUFBRTtTQUNsQyxDQUFDLENBQUM7UUFDSCxNQUFNLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUV6QixNQUFNLFNBQVMsR0FBRyxNQUFNLFVBQVUsQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNyRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1FBQ3BELFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUVsQixNQUFNLElBQUksR0FBeUI7WUFDakMsZUFBZSxFQUFFLFNBQVMsQ0FBQyxVQUFVO1lBQ3JDLGNBQWMsRUFBRSxTQUFTLENBQUMsU0FBUztZQUNuQyxZQUFZLEVBQUUsTUFBTSxDQUFDLFVBQVU7WUFDL0IsV0FBVyxFQUFFLE1BQU0sQ0FBQyxTQUFTO1NBQzlCLENBQUM7UUFFRixNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFDLG1CQUFtQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdELE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLDZDQUE2QyxDQUFDLENBQUM7UUFDbEUsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRU8sS0FBSyxDQUFDLG9CQUFvQjtRQUNoQyxNQUFNLElBQUksR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUM7UUFDcEUsS0FBSyxNQUFNLEdBQUcsSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN2QixNQUFNLE1BQU0sR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFtQixHQUFHLENBQUMsQ0FBQztZQUN4RSxJQUFJLE1BQU0sRUFBRSxDQUFDO2dCQUNYLElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxDQUFDLENBQUM7WUFDNUMsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQzFCLE1BQU0sQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLFVBQVUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLDBCQUEwQixDQUFDLENBQUM7UUFDNUUsQ0FBQztJQUNILENBQUM7SUFFTyxLQUFLLENBQUMsYUFBYSxDQUFDLE1BQXdCO1FBQ2xELE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUMsR0FBRyxzQkFBc0IsR0FBRyxNQUFNLENBQUMsUUFBUSxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDM0YsQ0FBQztDQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './classes.vpn-manager.js';
|
|
@@ -2,4 +2,5 @@ export * from './auth.js';
|
|
|
2
2
|
export * from './stats.js';
|
|
3
3
|
export * from './remoteingress.js';
|
|
4
4
|
export * from './route-management.js';
|
|
5
|
-
|
|
5
|
+
export * from './vpn.js';
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxZQUFZLENBQUM7QUFDM0IsY0FBYyxvQkFBb0IsQ0FBQztBQUNuQyxjQUFjLHVCQUF1QixDQUFDO0FBQ3RDLGNBQWMsVUFBVSxDQUFDIn0=
|
|
@@ -47,11 +47,20 @@ export interface IRouteRemoteIngress {
|
|
|
47
47
|
* When absent, the route applies to all edges. */
|
|
48
48
|
edgeFilter?: string[];
|
|
49
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Route-level VPN access configuration.
|
|
52
|
+
* When attached to a route, restricts access to VPN clients only.
|
|
53
|
+
*/
|
|
54
|
+
export interface IRouteVpn {
|
|
55
|
+
/** Whether this route requires VPN access */
|
|
56
|
+
required: boolean;
|
|
57
|
+
}
|
|
50
58
|
/**
|
|
51
59
|
* Extended route config used within dcrouter.
|
|
52
|
-
* Adds
|
|
60
|
+
* Adds optional `remoteIngress` and `vpn` properties to SmartProxy's IRouteConfig.
|
|
53
61
|
* SmartProxy ignores unknown properties at runtime.
|
|
54
62
|
*/
|
|
55
63
|
export type IDcRouterRouteConfig = IRouteConfig & {
|
|
56
64
|
remoteIngress?: IRouteRemoteIngress;
|
|
65
|
+
vpn?: IRouteVpn;
|
|
57
66
|
};
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A registered VPN client (secrets excluded from API responses).
|
|
3
|
+
*/
|
|
4
|
+
export interface IVpnClient {
|
|
5
|
+
clientId: string;
|
|
6
|
+
enabled: boolean;
|
|
7
|
+
tags?: string[];
|
|
8
|
+
description?: string;
|
|
9
|
+
assignedIp?: string;
|
|
10
|
+
createdAt: number;
|
|
11
|
+
updatedAt: number;
|
|
12
|
+
expiresAt?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* VPN server status.
|
|
16
|
+
*/
|
|
17
|
+
export interface IVpnServerStatus {
|
|
18
|
+
running: boolean;
|
|
19
|
+
forwardingMode: 'tun' | 'socket';
|
|
20
|
+
subnet: string;
|
|
21
|
+
wgListenPort: number;
|
|
22
|
+
serverPublicKeys: {
|
|
23
|
+
noisePublicKey: string;
|
|
24
|
+
wgPublicKey: string;
|
|
25
|
+
} | null;
|
|
26
|
+
registeredClients: number;
|
|
27
|
+
connectedClients: number;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* VPN client telemetry data.
|
|
31
|
+
*/
|
|
32
|
+
export interface IVpnClientTelemetry {
|
|
33
|
+
clientId: string;
|
|
34
|
+
assignedIp: string;
|
|
35
|
+
bytesSent: number;
|
|
36
|
+
bytesReceived: number;
|
|
37
|
+
packetsDropped: number;
|
|
38
|
+
bytesDropped: number;
|
|
39
|
+
lastKeepaliveAt?: string;
|
|
40
|
+
keepalivesReceived: number;
|
|
41
|
+
rateLimitBytesPerSec?: number;
|
|
42
|
+
burstBytes?: number;
|
|
43
|
+
}
|
|
@@ -9,4 +9,5 @@ export * from './certificate.js';
|
|
|
9
9
|
export * from './remoteingress.js';
|
|
10
10
|
export * from './route-management.js';
|
|
11
11
|
export * from './api-tokens.js';
|
|
12
|
-
|
|
12
|
+
export * from './vpn.js';
|
|
13
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL3JlcXVlc3RzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMsYUFBYSxDQUFDO0FBQzVCLGNBQWMsV0FBVyxDQUFDO0FBQzFCLGNBQWMsWUFBWSxDQUFDO0FBQzNCLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMsb0JBQW9CLENBQUM7QUFDbkMsY0FBYyx1QkFBdUIsQ0FBQztBQUN0QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsVUFBVSxDQUFDIn0=
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as authInterfaces from '../data/auth.js';
|
|
3
|
+
import type { IVpnClient, IVpnServerStatus, IVpnClientTelemetry } from '../data/vpn.js';
|
|
4
|
+
/**
|
|
5
|
+
* Get all registered VPN clients.
|
|
6
|
+
*/
|
|
7
|
+
export interface IReq_GetVpnClients extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetVpnClients> {
|
|
8
|
+
method: 'getVpnClients';
|
|
9
|
+
request: {
|
|
10
|
+
identity: authInterfaces.IIdentity;
|
|
11
|
+
};
|
|
12
|
+
response: {
|
|
13
|
+
clients: IVpnClient[];
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get VPN server status.
|
|
18
|
+
*/
|
|
19
|
+
export interface IReq_GetVpnStatus extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetVpnStatus> {
|
|
20
|
+
method: 'getVpnStatus';
|
|
21
|
+
request: {
|
|
22
|
+
identity: authInterfaces.IIdentity;
|
|
23
|
+
};
|
|
24
|
+
response: {
|
|
25
|
+
status: IVpnServerStatus;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Create a new VPN client. Returns the config bundle (secrets only shown once).
|
|
30
|
+
*/
|
|
31
|
+
export interface IReq_CreateVpnClient extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_CreateVpnClient> {
|
|
32
|
+
method: 'createVpnClient';
|
|
33
|
+
request: {
|
|
34
|
+
identity: authInterfaces.IIdentity;
|
|
35
|
+
clientId: string;
|
|
36
|
+
tags?: string[];
|
|
37
|
+
description?: string;
|
|
38
|
+
};
|
|
39
|
+
response: {
|
|
40
|
+
success: boolean;
|
|
41
|
+
client?: IVpnClient;
|
|
42
|
+
/** WireGuard .conf file content (only returned at creation) */
|
|
43
|
+
wireguardConfig?: string;
|
|
44
|
+
message?: string;
|
|
45
|
+
};
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Delete a VPN client.
|
|
49
|
+
*/
|
|
50
|
+
export interface IReq_DeleteVpnClient extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_DeleteVpnClient> {
|
|
51
|
+
method: 'deleteVpnClient';
|
|
52
|
+
request: {
|
|
53
|
+
identity: authInterfaces.IIdentity;
|
|
54
|
+
clientId: string;
|
|
55
|
+
};
|
|
56
|
+
response: {
|
|
57
|
+
success: boolean;
|
|
58
|
+
message?: string;
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Enable a VPN client.
|
|
63
|
+
*/
|
|
64
|
+
export interface IReq_EnableVpnClient extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_EnableVpnClient> {
|
|
65
|
+
method: 'enableVpnClient';
|
|
66
|
+
request: {
|
|
67
|
+
identity: authInterfaces.IIdentity;
|
|
68
|
+
clientId: string;
|
|
69
|
+
};
|
|
70
|
+
response: {
|
|
71
|
+
success: boolean;
|
|
72
|
+
message?: string;
|
|
73
|
+
};
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Disable a VPN client.
|
|
77
|
+
*/
|
|
78
|
+
export interface IReq_DisableVpnClient extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_DisableVpnClient> {
|
|
79
|
+
method: 'disableVpnClient';
|
|
80
|
+
request: {
|
|
81
|
+
identity: authInterfaces.IIdentity;
|
|
82
|
+
clientId: string;
|
|
83
|
+
};
|
|
84
|
+
response: {
|
|
85
|
+
success: boolean;
|
|
86
|
+
message?: string;
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Rotate a VPN client's keys. Returns the new config bundle.
|
|
91
|
+
*/
|
|
92
|
+
export interface IReq_RotateVpnClientKey extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_RotateVpnClientKey> {
|
|
93
|
+
method: 'rotateVpnClientKey';
|
|
94
|
+
request: {
|
|
95
|
+
identity: authInterfaces.IIdentity;
|
|
96
|
+
clientId: string;
|
|
97
|
+
};
|
|
98
|
+
response: {
|
|
99
|
+
success: boolean;
|
|
100
|
+
/** WireGuard .conf file content with new keys */
|
|
101
|
+
wireguardConfig?: string;
|
|
102
|
+
message?: string;
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Export a VPN client config.
|
|
107
|
+
*/
|
|
108
|
+
export interface IReq_ExportVpnClientConfig extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_ExportVpnClientConfig> {
|
|
109
|
+
method: 'exportVpnClientConfig';
|
|
110
|
+
request: {
|
|
111
|
+
identity: authInterfaces.IIdentity;
|
|
112
|
+
clientId: string;
|
|
113
|
+
format: 'smartvpn' | 'wireguard';
|
|
114
|
+
};
|
|
115
|
+
response: {
|
|
116
|
+
success: boolean;
|
|
117
|
+
config?: string;
|
|
118
|
+
message?: string;
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Get telemetry for a specific VPN client.
|
|
123
|
+
*/
|
|
124
|
+
export interface IReq_GetVpnClientTelemetry extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetVpnClientTelemetry> {
|
|
125
|
+
method: 'getVpnClientTelemetry';
|
|
126
|
+
request: {
|
|
127
|
+
identity: authInterfaces.IIdentity;
|
|
128
|
+
clientId: string;
|
|
129
|
+
};
|
|
130
|
+
response: {
|
|
131
|
+
success: boolean;
|
|
132
|
+
telemetry?: IVpnClientTelemetry;
|
|
133
|
+
message?: string;
|
|
134
|
+
};
|
|
135
|
+
}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import * as plugins from '../plugins.js';
|
|
2
|
+
import * as authInterfaces from '../data/auth.js';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidnBuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfaW50ZXJmYWNlcy9yZXF1ZXN0cy92cG4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQkFBaUIsQ0FBQyJ9
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export const commitinfo = {
|
|
5
5
|
name: '@serve.zone/dcrouter',
|
|
6
|
-
version: '11.
|
|
6
|
+
version: '11.13.0',
|
|
7
7
|
description: 'A multifaceted routing service handling mail and SMS delivery functions.'
|
|
8
8
|
};
|
|
9
9
|
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vdHNfd2ViLzAwX2NvbW1pdGluZm9fZGF0YS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUNILE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBRztJQUN4QixJQUFJLEVBQUUsc0JBQXNCO0lBQzVCLE9BQU8sRUFBRSxTQUFTO0lBQ2xCLFdBQVcsRUFBRSwwRUFBMEU7Q0FDeEYsQ0FBQSJ9
|
|
@@ -182,6 +182,28 @@ export declare const toggleRemoteIngressAction: plugins.deesElement.domtools.plu
|
|
|
182
182
|
id: string;
|
|
183
183
|
enabled: boolean;
|
|
184
184
|
}>;
|
|
185
|
+
export interface IVpnState {
|
|
186
|
+
clients: interfaces.data.IVpnClient[];
|
|
187
|
+
status: interfaces.data.IVpnServerStatus | null;
|
|
188
|
+
isLoading: boolean;
|
|
189
|
+
error: string | null;
|
|
190
|
+
lastUpdated: number;
|
|
191
|
+
/** WireGuard config shown after create/rotate (only shown once) */
|
|
192
|
+
newClientConfig: string | null;
|
|
193
|
+
}
|
|
194
|
+
export declare const vpnStatePart: plugins.deesElement.domtools.plugins.smartstate.StatePart<string, IVpnState>;
|
|
195
|
+
export declare const fetchVpnAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IVpnState, unknown>;
|
|
196
|
+
export declare const createVpnClientAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IVpnState, {
|
|
197
|
+
clientId: string;
|
|
198
|
+
tags?: string[];
|
|
199
|
+
description?: string;
|
|
200
|
+
}>;
|
|
201
|
+
export declare const deleteVpnClientAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IVpnState, string>;
|
|
202
|
+
export declare const toggleVpnClientAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IVpnState, {
|
|
203
|
+
clientId: string;
|
|
204
|
+
enabled: boolean;
|
|
205
|
+
}>;
|
|
206
|
+
export declare const clearNewClientConfigAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IVpnState, unknown>;
|
|
185
207
|
export declare const fetchMergedRoutesAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IRouteManagementState, unknown>;
|
|
186
208
|
export declare const createRouteAction: plugins.deesElement.domtools.plugins.smartstate.StateAction<IRouteManagementState, {
|
|
187
209
|
route: any;
|