@serve.zone/dcrouter 11.13.0 → 11.15.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.
@@ -974,7 +974,7 @@ export const fetchVpnAction = vpnStatePart.createAction(async (statePartArg): Pr
974
974
 
975
975
  export const createVpnClientAction = vpnStatePart.createAction<{
976
976
  clientId: string;
977
- tags?: string[];
977
+ serverDefinedClientTags?: string[];
978
978
  description?: string;
979
979
  }>(async (statePartArg, dataArg, actionContext): Promise<IVpnState> => {
980
980
  const context = getActionContext();
@@ -988,7 +988,7 @@ export const createVpnClientAction = vpnStatePart.createAction<{
988
988
  const response = await request.fire({
989
989
  identity: context.identity!,
990
990
  clientId: dataArg.clientId,
991
- tags: dataArg.tags,
991
+ serverDefinedClientTags: dataArg.serverDefinedClientTags,
992
992
  description: dataArg.description,
993
993
  });
994
994
 
@@ -255,8 +255,8 @@ export class OpsViewVpn extends DeesElement {
255
255
  ? html`<span class="statusBadge enabled">enabled</span>`
256
256
  : html`<span class="statusBadge disabled">disabled</span>`,
257
257
  'VPN IP': client.assignedIp || '-',
258
- 'Tags': client.tags?.length
259
- ? html`${client.tags.map(t => html`<span class="tagBadge">${t}</span>`)}`
258
+ 'Tags': client.serverDefinedClientTags?.length
259
+ ? html`${client.serverDefinedClientTags.map(t => html`<span class="tagBadge">${t}</span>`)}`
260
260
  : '-',
261
261
  'Description': client.description || '-',
262
262
  'Created': new Date(client.createdAt).toLocaleDateString(),
@@ -312,11 +312,11 @@ export class OpsViewVpn extends DeesElement {
312
312
  action: async (modal: any) => {
313
313
  const form = modal.shadowRoot!.querySelector('dees-form') as any;
314
314
  const data = await form.collectFormData();
315
- const tags = data.tags ? data.tags.split(',').map((t: string) => t.trim()).filter(Boolean) : undefined;
315
+ const serverDefinedClientTags = data.tags ? data.tags.split(',').map((t: string) => t.trim()).filter(Boolean) : undefined;
316
316
  await appstate.vpnStatePart.dispatchAction(appstate.createVpnClientAction, {
317
317
  clientId: data.clientId,
318
318
  description: data.description || undefined,
319
- tags,
319
+ serverDefinedClientTags,
320
320
  });
321
321
  modal.destroy();
322
322
  },
package/ts_web/readme.md CHANGED
@@ -50,6 +50,13 @@ For reporting bugs, issues, or security vulnerabilities, please visit [community
50
50
  - **Connection token generation** — one-click "Copy Token" for easy edge provisioning
51
51
  - Enable/disable, edit, secret regeneration, and delete actions
52
52
 
53
+ ### 🔐 VPN Management
54
+ - VPN server status with forwarding mode, subnet, and WireGuard port
55
+ - Client registration table with create, enable/disable, and delete actions
56
+ - WireGuard config download and clipboard copy on client creation
57
+ - Per-client telemetry (bytes sent/received, keepalives)
58
+ - Server public key display for manual client configuration
59
+
53
60
  ### 📜 Log Viewer
54
61
  - Real-time log streaming
55
62
  - Filter by log level (error, warning, info, debug)
@@ -100,6 +107,7 @@ ts_web/
100
107
  ├── ops-view-emails.ts # Email queue management
101
108
  ├── ops-view-certificates.ts # Certificate overview & reprovisioning
102
109
  ├── ops-view-remoteingress.ts # Remote ingress edge management
110
+ ├── ops-view-vpn.ts # VPN client management
103
111
  ├── ops-view-logs.ts # Log viewer
104
112
  ├── ops-view-routes.ts # Route & API token management
105
113
  ├── ops-view-config.ts # Configuration display
@@ -124,6 +132,7 @@ The app uses `@push.rocks/smartstate` v2.3+ with multiple state parts, scheduled
124
132
  | `emailOpsStatePart` | Soft | Email queues, bounces, suppression list |
125
133
  | `certificateStatePart` | Soft | Certificate list, summary, loading state |
126
134
  | `remoteIngressStatePart` | Soft | Edge list, statuses, new edge secret |
135
+ | `vpnStatePart` | Soft | VPN clients, server status, new client config |
127
136
 
128
137
  ### Tab Visibility Optimization
129
138
 
@@ -173,6 +182,13 @@ regenerateRemoteIngressSecretAction(id) // New secret
173
182
  toggleRemoteIngressAction(id, enabled) // Enable/disable
174
183
  clearNewEdgeSecretAction() // Dismiss secret banner
175
184
  fetchConnectionToken(edgeId) // Get connection token (standalone function)
185
+
186
+ // VPN
187
+ fetchVpnAction() // Clients + server status
188
+ createVpnClientAction(data) // Create new VPN client
189
+ deleteVpnClientAction(clientId) // Remove VPN client
190
+ toggleVpnClientAction(id, enabled) // Enable/disable
191
+ clearNewClientConfigAction() // Dismiss config banner
176
192
  ```
177
193
 
178
194
  ### Client-Side Routing
@@ -187,6 +203,7 @@ fetchConnectionToken(edgeId) // Get connection token (standalone function)
187
203
  /emails/security → Security incidents
188
204
  /certificates → Certificate management
189
205
  /remoteingress → Remote ingress edge management
206
+ /vpn → VPN client management
190
207
  /routes → Route & API token management
191
208
  /logs → Log viewer
192
209
  /configuration → System configuration
package/ts_web/router.ts CHANGED
@@ -3,7 +3,7 @@ import * as appstate from './appstate.js';
3
3
 
4
4
  const SmartRouter = plugins.domtools.plugins.smartrouter.SmartRouter;
5
5
 
6
- export const validViews = ['overview', 'network', 'emails', 'logs', 'routes', 'apitokens', 'configuration', 'security', 'certificates', 'remoteingress'] as const;
6
+ export const validViews = ['overview', 'network', 'emails', 'logs', 'routes', 'apitokens', 'configuration', 'security', 'certificates', 'remoteingress', 'vpn'] as const;
7
7
 
8
8
  export type TValidView = typeof validViews[number];
9
9