@serve.zone/dcrouter 11.12.4 → 11.14.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.
Files changed (214) hide show
  1. package/dist_serve/bundle.js +705 -548
  2. package/dist_ts_interfaces/data/index.d.ts +1 -0
  3. package/dist_ts_interfaces/data/index.js +2 -1
  4. package/dist_ts_interfaces/data/remoteingress.d.ts +10 -1
  5. package/dist_ts_interfaces/data/vpn.d.ts +43 -0
  6. package/dist_ts_interfaces/data/vpn.js +2 -0
  7. package/dist_ts_interfaces/requests/index.d.ts +1 -0
  8. package/dist_ts_interfaces/requests/index.js +2 -1
  9. package/dist_ts_interfaces/requests/vpn.d.ts +135 -0
  10. package/dist_ts_interfaces/requests/vpn.js +3 -0
  11. package/package.json +2 -1
  12. package/readme.md +107 -3
  13. package/ts/00_commitinfo_data.ts +1 -1
  14. package/ts/classes.dcrouter.ts +126 -0
  15. package/ts/config/classes.route-config-manager.ts +20 -3
  16. package/ts/opsserver/classes.opsserver.ts +2 -0
  17. package/ts/opsserver/handlers/index.ts +2 -1
  18. package/ts/opsserver/handlers/vpn.handler.ts +257 -0
  19. package/ts/plugins.ts +2 -1
  20. package/ts/vpn/classes.vpn-manager.ts +378 -0
  21. package/ts/vpn/index.ts +1 -0
  22. package/ts_web/00_commitinfo_data.ts +1 -1
  23. package/ts_web/appstate.ts +164 -0
  24. package/ts_web/elements/index.ts +1 -0
  25. package/ts_web/elements/ops-dashboard.ts +6 -0
  26. package/ts_web/elements/ops-view-vpn.ts +330 -0
  27. package/ts_web/readme.md +17 -0
  28. package/ts_web/router.ts +1 -1
  29. package/dist_ts/00_commitinfo_data.d.ts +0 -8
  30. package/dist_ts/00_commitinfo_data.js +0 -9
  31. package/dist_ts/cache/classes.cache.cleaner.d.ts +0 -47
  32. package/dist_ts/cache/classes.cache.cleaner.js +0 -130
  33. package/dist_ts/cache/classes.cached.document.d.ts +0 -76
  34. package/dist_ts/cache/classes.cached.document.js +0 -100
  35. package/dist_ts/cache/classes.cachedb.d.ts +0 -60
  36. package/dist_ts/cache/classes.cachedb.js +0 -126
  37. package/dist_ts/cache/documents/classes.cached.email.d.ts +0 -125
  38. package/dist_ts/cache/documents/classes.cached.email.js +0 -337
  39. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +0 -119
  40. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +0 -323
  41. package/dist_ts/cache/documents/index.d.ts +0 -2
  42. package/dist_ts/cache/documents/index.js +0 -3
  43. package/dist_ts/cache/index.d.ts +0 -4
  44. package/dist_ts/cache/index.js +0 -7
  45. package/dist_ts/classes.cert-provision-scheduler.d.ts +0 -54
  46. package/dist_ts/classes.cert-provision-scheduler.js +0 -118
  47. package/dist_ts/classes.dcrouter.d.ts +0 -356
  48. package/dist_ts/classes.dcrouter.js +0 -1592
  49. package/dist_ts/classes.storage-cert-manager.d.ts +0 -18
  50. package/dist_ts/classes.storage-cert-manager.js +0 -43
  51. package/dist_ts/config/classes.api-token-manager.d.ts +0 -46
  52. package/dist_ts/config/classes.api-token-manager.js +0 -150
  53. package/dist_ts/config/classes.route-config-manager.d.ts +0 -37
  54. package/dist_ts/config/classes.route-config-manager.js +0 -240
  55. package/dist_ts/config/index.d.ts +0 -3
  56. package/dist_ts/config/index.js +0 -5
  57. package/dist_ts/config/validator.d.ts +0 -104
  58. package/dist_ts/config/validator.js +0 -152
  59. package/dist_ts/errors/base.errors.d.ts +0 -224
  60. package/dist_ts/errors/base.errors.js +0 -320
  61. package/dist_ts/errors/error-handler.d.ts +0 -98
  62. package/dist_ts/errors/error-handler.js +0 -282
  63. package/dist_ts/errors/error.codes.d.ts +0 -115
  64. package/dist_ts/errors/error.codes.js +0 -136
  65. package/dist_ts/errors/index.d.ts +0 -54
  66. package/dist_ts/errors/index.js +0 -136
  67. package/dist_ts/errors/reputation.errors.d.ts +0 -183
  68. package/dist_ts/errors/reputation.errors.js +0 -292
  69. package/dist_ts/http3/http3-route-augmentation.d.ts +0 -50
  70. package/dist_ts/http3/http3-route-augmentation.js +0 -98
  71. package/dist_ts/http3/index.d.ts +0 -1
  72. package/dist_ts/http3/index.js +0 -2
  73. package/dist_ts/index.d.ts +0 -8
  74. package/dist_ts/index.js +0 -29
  75. package/dist_ts/logger.d.ts +0 -21
  76. package/dist_ts/logger.js +0 -81
  77. package/dist_ts/monitoring/classes.metricscache.d.ts +0 -32
  78. package/dist_ts/monitoring/classes.metricscache.js +0 -63
  79. package/dist_ts/monitoring/classes.metricsmanager.d.ts +0 -184
  80. package/dist_ts/monitoring/classes.metricsmanager.js +0 -744
  81. package/dist_ts/monitoring/index.d.ts +0 -1
  82. package/dist_ts/monitoring/index.js +0 -2
  83. package/dist_ts/opsserver/classes.opsserver.d.ts +0 -37
  84. package/dist_ts/opsserver/classes.opsserver.js +0 -85
  85. package/dist_ts/opsserver/handlers/admin.handler.d.ts +0 -31
  86. package/dist_ts/opsserver/handlers/admin.handler.js +0 -180
  87. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +0 -6
  88. package/dist_ts/opsserver/handlers/api-token.handler.js +0 -62
  89. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +0 -32
  90. package/dist_ts/opsserver/handlers/certificate.handler.js +0 -421
  91. package/dist_ts/opsserver/handlers/config.handler.d.ts +0 -7
  92. package/dist_ts/opsserver/handlers/config.handler.js +0 -192
  93. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +0 -30
  94. package/dist_ts/opsserver/handlers/email-ops.handler.js +0 -227
  95. package/dist_ts/opsserver/handlers/index.d.ts +0 -11
  96. package/dist_ts/opsserver/handlers/index.js +0 -12
  97. package/dist_ts/opsserver/handlers/logs.handler.d.ts +0 -25
  98. package/dist_ts/opsserver/handlers/logs.handler.js +0 -256
  99. package/dist_ts/opsserver/handlers/radius.handler.d.ts +0 -6
  100. package/dist_ts/opsserver/handlers/radius.handler.js +0 -295
  101. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +0 -6
  102. package/dist_ts/opsserver/handlers/remoteingress.handler.js +0 -156
  103. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +0 -14
  104. package/dist_ts/opsserver/handlers/route-management.handler.js +0 -117
  105. package/dist_ts/opsserver/handlers/security.handler.d.ts +0 -9
  106. package/dist_ts/opsserver/handlers/security.handler.js +0 -233
  107. package/dist_ts/opsserver/handlers/stats.handler.d.ts +0 -11
  108. package/dist_ts/opsserver/handlers/stats.handler.js +0 -403
  109. package/dist_ts/opsserver/helpers/guards.d.ts +0 -27
  110. package/dist_ts/opsserver/helpers/guards.js +0 -43
  111. package/dist_ts/opsserver/index.d.ts +0 -1
  112. package/dist_ts/opsserver/index.js +0 -2
  113. package/dist_ts/paths.d.ts +0 -26
  114. package/dist_ts/paths.js +0 -45
  115. package/dist_ts/plugins.d.ts +0 -80
  116. package/dist_ts/plugins.js +0 -114
  117. package/dist_ts/radius/classes.accounting.manager.d.ts +0 -231
  118. package/dist_ts/radius/classes.accounting.manager.js +0 -462
  119. package/dist_ts/radius/classes.radius.server.d.ts +0 -171
  120. package/dist_ts/radius/classes.radius.server.js +0 -386
  121. package/dist_ts/radius/classes.vlan.manager.d.ts +0 -128
  122. package/dist_ts/radius/classes.vlan.manager.js +0 -279
  123. package/dist_ts/radius/index.d.ts +0 -13
  124. package/dist_ts/radius/index.js +0 -14
  125. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +0 -94
  126. package/dist_ts/remoteingress/classes.remoteingress-manager.js +0 -271
  127. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +0 -59
  128. package/dist_ts/remoteingress/classes.tunnel-manager.js +0 -165
  129. package/dist_ts/remoteingress/index.d.ts +0 -2
  130. package/dist_ts/remoteingress/index.js +0 -3
  131. package/dist_ts/security/classes.contentscanner.d.ts +0 -164
  132. package/dist_ts/security/classes.contentscanner.js +0 -642
  133. package/dist_ts/security/classes.ipreputationchecker.d.ts +0 -160
  134. package/dist_ts/security/classes.ipreputationchecker.js +0 -537
  135. package/dist_ts/security/classes.securitylogger.d.ts +0 -144
  136. package/dist_ts/security/classes.securitylogger.js +0 -235
  137. package/dist_ts/security/index.d.ts +0 -3
  138. package/dist_ts/security/index.js +0 -4
  139. package/dist_ts/sms/classes.smsservice.d.ts +0 -15
  140. package/dist_ts/sms/classes.smsservice.js +0 -72
  141. package/dist_ts/sms/config/sms.config.d.ts +0 -93
  142. package/dist_ts/sms/config/sms.config.js +0 -2
  143. package/dist_ts/sms/config/sms.schema.d.ts +0 -5
  144. package/dist_ts/sms/config/sms.schema.js +0 -121
  145. package/dist_ts/sms/index.d.ts +0 -1
  146. package/dist_ts/sms/index.js +0 -2
  147. package/dist_ts/storage/classes.storagemanager.d.ts +0 -83
  148. package/dist_ts/storage/classes.storagemanager.js +0 -348
  149. package/dist_ts/storage/index.d.ts +0 -1
  150. package/dist_ts/storage/index.js +0 -3
  151. package/dist_ts_apiclient/classes.apitoken.d.ts +0 -41
  152. package/dist_ts_apiclient/classes.apitoken.js +0 -115
  153. package/dist_ts_apiclient/classes.certificate.d.ts +0 -57
  154. package/dist_ts_apiclient/classes.certificate.js +0 -69
  155. package/dist_ts_apiclient/classes.config.d.ts +0 -7
  156. package/dist_ts_apiclient/classes.config.js +0 -11
  157. package/dist_ts_apiclient/classes.dcrouterapiclient.d.ts +0 -41
  158. package/dist_ts_apiclient/classes.dcrouterapiclient.js +0 -81
  159. package/dist_ts_apiclient/classes.email.d.ts +0 -30
  160. package/dist_ts_apiclient/classes.email.js +0 -52
  161. package/dist_ts_apiclient/classes.logs.d.ts +0 -21
  162. package/dist_ts_apiclient/classes.logs.js +0 -14
  163. package/dist_ts_apiclient/classes.radius.d.ts +0 -59
  164. package/dist_ts_apiclient/classes.radius.js +0 -95
  165. package/dist_ts_apiclient/classes.remoteingress.d.ts +0 -54
  166. package/dist_ts_apiclient/classes.remoteingress.js +0 -136
  167. package/dist_ts_apiclient/classes.route.d.ts +0 -42
  168. package/dist_ts_apiclient/classes.route.js +0 -154
  169. package/dist_ts_apiclient/classes.stats.d.ts +0 -47
  170. package/dist_ts_apiclient/classes.stats.js +0 -38
  171. package/dist_ts_apiclient/index.d.ts +0 -10
  172. package/dist_ts_apiclient/index.js +0 -14
  173. package/dist_ts_apiclient/plugins.d.ts +0 -3
  174. package/dist_ts_apiclient/plugins.js +0 -5
  175. package/dist_ts_web/00_commitinfo_data.d.ts +0 -8
  176. package/dist_ts_web/00_commitinfo_data.js +0 -9
  177. package/dist_ts_web/appstate.d.ts +0 -216
  178. package/dist_ts_web/appstate.js +0 -1064
  179. package/dist_ts_web/elements/index.d.ts +0 -12
  180. package/dist_ts_web/elements/index.js +0 -13
  181. package/dist_ts_web/elements/ops-dashboard.d.ts +0 -23
  182. package/dist_ts_web/elements/ops-dashboard.js +0 -317
  183. package/dist_ts_web/elements/ops-view-apitokens.d.ts +0 -13
  184. package/dist_ts_web/elements/ops-view-apitokens.js +0 -371
  185. package/dist_ts_web/elements/ops-view-certificates.d.ts +0 -22
  186. package/dist_ts_web/elements/ops-view-certificates.js +0 -528
  187. package/dist_ts_web/elements/ops-view-config.d.ts +0 -19
  188. package/dist_ts_web/elements/ops-view-config.js +0 -339
  189. package/dist_ts_web/elements/ops-view-emails.d.ts +0 -21
  190. package/dist_ts_web/elements/ops-view-emails.js +0 -165
  191. package/dist_ts_web/elements/ops-view-logs.d.ts +0 -13
  192. package/dist_ts_web/elements/ops-view-logs.js +0 -159
  193. package/dist_ts_web/elements/ops-view-network.d.ts +0 -71
  194. package/dist_ts_web/elements/ops-view-network.js +0 -764
  195. package/dist_ts_web/elements/ops-view-overview.d.ts +0 -22
  196. package/dist_ts_web/elements/ops-view-overview.js +0 -456
  197. package/dist_ts_web/elements/ops-view-remoteingress.d.ts +0 -20
  198. package/dist_ts_web/elements/ops-view-remoteingress.js +0 -494
  199. package/dist_ts_web/elements/ops-view-routes.d.ts +0 -12
  200. package/dist_ts_web/elements/ops-view-routes.js +0 -404
  201. package/dist_ts_web/elements/ops-view-security.d.ts +0 -21
  202. package/dist_ts_web/elements/ops-view-security.js +0 -574
  203. package/dist_ts_web/elements/shared/css.d.ts +0 -1
  204. package/dist_ts_web/elements/shared/css.js +0 -10
  205. package/dist_ts_web/elements/shared/index.d.ts +0 -2
  206. package/dist_ts_web/elements/shared/index.js +0 -3
  207. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +0 -5
  208. package/dist_ts_web/elements/shared/ops-sectionheading.js +0 -82
  209. package/dist_ts_web/index.d.ts +0 -1
  210. package/dist_ts_web/index.js +0 -10
  211. package/dist_ts_web/plugins.d.ts +0 -6
  212. package/dist_ts_web/plugins.js +0 -11
  213. package/dist_ts_web/router.d.ts +0 -19
  214. package/dist_ts_web/router.js +0 -91
@@ -7,6 +7,7 @@ import type {
7
7
  IMergedRoute,
8
8
  IRouteWarning,
9
9
  } from '../../ts_interfaces/data/route-management.js';
10
+ import type { IDcRouterRouteConfig } from '../../ts_interfaces/data/remoteingress.js';
10
11
  import { type IHttp3Config, augmentRouteWithHttp3 } from '../http3/index.js';
11
12
 
12
13
  const ROUTES_PREFIX = '/config-api/routes/';
@@ -22,6 +23,7 @@ export class RouteConfigManager {
22
23
  private getHardcodedRoutes: () => plugins.smartproxy.IRouteConfig[],
23
24
  private getSmartProxy: () => plugins.smartproxy.SmartProxy | undefined,
24
25
  private getHttp3Config?: () => IHttp3Config | undefined,
26
+ private getVpnSubnet?: () => string | undefined,
25
27
  ) {}
26
28
 
27
29
  /**
@@ -262,13 +264,28 @@ export class RouteConfigManager {
262
264
 
263
265
  // Add enabled programmatic routes (with HTTP/3 augmentation if enabled)
264
266
  const http3Config = this.getHttp3Config?.();
267
+ const vpnSubnet = this.getVpnSubnet?.();
265
268
  for (const stored of this.storedRoutes.values()) {
266
269
  if (stored.enabled) {
270
+ let route = stored.route;
267
271
  if (http3Config && http3Config.enabled !== false) {
268
- enabledRoutes.push(augmentRouteWithHttp3(stored.route, { enabled: true, ...http3Config }));
269
- } else {
270
- enabledRoutes.push(stored.route);
272
+ route = augmentRouteWithHttp3(route, { enabled: true, ...http3Config });
271
273
  }
274
+ // Inject VPN security for programmatic routes with vpn.required
275
+ if (vpnSubnet) {
276
+ const dcRoute = route as IDcRouterRouteConfig;
277
+ if (dcRoute.vpn?.required) {
278
+ const existing = route.security?.ipAllowList || [];
279
+ route = {
280
+ ...route,
281
+ security: {
282
+ ...route.security,
283
+ ipAllowList: [...existing, vpnSubnet],
284
+ },
285
+ };
286
+ }
287
+ }
288
+ enabledRoutes.push(route);
272
289
  }
273
290
  }
274
291
 
@@ -28,6 +28,7 @@ export class OpsServer {
28
28
  private remoteIngressHandler!: handlers.RemoteIngressHandler;
29
29
  private routeManagementHandler!: handlers.RouteManagementHandler;
30
30
  private apiTokenHandler!: handlers.ApiTokenHandler;
31
+ private vpnHandler!: handlers.VpnHandler;
31
32
 
32
33
  constructor(dcRouterRefArg: DcRouter) {
33
34
  this.dcRouterRef = dcRouterRefArg;
@@ -86,6 +87,7 @@ export class OpsServer {
86
87
  this.remoteIngressHandler = new handlers.RemoteIngressHandler(this);
87
88
  this.routeManagementHandler = new handlers.RouteManagementHandler(this);
88
89
  this.apiTokenHandler = new handlers.ApiTokenHandler(this);
90
+ this.vpnHandler = new handlers.VpnHandler(this);
89
91
 
90
92
  console.log('✅ OpsServer TypedRequest handlers initialized');
91
93
  }
@@ -8,4 +8,5 @@ export * from './email-ops.handler.js';
8
8
  export * from './certificate.handler.js';
9
9
  export * from './remoteingress.handler.js';
10
10
  export * from './route-management.handler.js';
11
- export * from './api-token.handler.js';
11
+ export * from './api-token.handler.js';
12
+ export * from './vpn.handler.js';
@@ -0,0 +1,257 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { OpsServer } from '../classes.opsserver.js';
3
+ import * as interfaces from '../../../ts_interfaces/index.js';
4
+
5
+ export class VpnHandler {
6
+ constructor(private opsServerRef: OpsServer) {
7
+ this.registerHandlers();
8
+ }
9
+
10
+ private registerHandlers(): void {
11
+ const viewRouter = this.opsServerRef.viewRouter;
12
+ const adminRouter = this.opsServerRef.adminRouter;
13
+
14
+ // ---- Read endpoints (viewRouter — valid identity required via middleware) ----
15
+
16
+ // Get all registered VPN clients
17
+ viewRouter.addTypedHandler(
18
+ new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_GetVpnClients>(
19
+ 'getVpnClients',
20
+ async (dataArg, toolsArg) => {
21
+ const manager = this.opsServerRef.dcRouterRef.vpnManager;
22
+ if (!manager) {
23
+ return { clients: [] };
24
+ }
25
+ const clients = manager.listClients().map((c) => ({
26
+ clientId: c.clientId,
27
+ enabled: c.enabled,
28
+ tags: c.tags,
29
+ description: c.description,
30
+ assignedIp: c.assignedIp,
31
+ createdAt: c.createdAt,
32
+ updatedAt: c.updatedAt,
33
+ expiresAt: c.expiresAt,
34
+ }));
35
+ return { clients };
36
+ },
37
+ ),
38
+ );
39
+
40
+ // Get VPN server status
41
+ viewRouter.addTypedHandler(
42
+ new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_GetVpnStatus>(
43
+ 'getVpnStatus',
44
+ async (dataArg, toolsArg) => {
45
+ const manager = this.opsServerRef.dcRouterRef.vpnManager;
46
+ const vpnConfig = this.opsServerRef.dcRouterRef.options.vpnConfig;
47
+ if (!manager) {
48
+ return {
49
+ status: {
50
+ running: false,
51
+ forwardingMode: 'socket' as const,
52
+ subnet: vpnConfig?.subnet || '10.8.0.0/24',
53
+ wgListenPort: vpnConfig?.wgListenPort ?? 51820,
54
+ serverPublicKeys: null,
55
+ registeredClients: 0,
56
+ connectedClients: 0,
57
+ },
58
+ };
59
+ }
60
+
61
+ const connected = await manager.getConnectedClients();
62
+ return {
63
+ status: {
64
+ running: manager.running,
65
+ forwardingMode: manager.forwardingMode,
66
+ subnet: manager.getSubnet(),
67
+ wgListenPort: vpnConfig?.wgListenPort ?? 51820,
68
+ serverPublicKeys: manager.getServerPublicKeys(),
69
+ registeredClients: manager.listClients().length,
70
+ connectedClients: connected.length,
71
+ },
72
+ };
73
+ },
74
+ ),
75
+ );
76
+
77
+ // ---- Write endpoints (adminRouter — admin identity required via middleware) ----
78
+
79
+ // Create a new VPN client
80
+ adminRouter.addTypedHandler(
81
+ new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_CreateVpnClient>(
82
+ 'createVpnClient',
83
+ async (dataArg, toolsArg) => {
84
+ const manager = this.opsServerRef.dcRouterRef.vpnManager;
85
+ if (!manager) {
86
+ return { success: false, message: 'VPN not configured' };
87
+ }
88
+
89
+ try {
90
+ const bundle = await manager.createClient({
91
+ clientId: dataArg.clientId,
92
+ tags: dataArg.tags,
93
+ description: dataArg.description,
94
+ });
95
+
96
+ return {
97
+ success: true,
98
+ client: {
99
+ clientId: bundle.entry.clientId,
100
+ enabled: bundle.entry.enabled ?? true,
101
+ tags: bundle.entry.tags,
102
+ description: bundle.entry.description,
103
+ assignedIp: bundle.entry.assignedIp,
104
+ createdAt: Date.now(),
105
+ updatedAt: Date.now(),
106
+ expiresAt: bundle.entry.expiresAt,
107
+ },
108
+ wireguardConfig: bundle.wireguardConfig,
109
+ };
110
+ } catch (err: unknown) {
111
+ return { success: false, message: (err as Error).message };
112
+ }
113
+ },
114
+ ),
115
+ );
116
+
117
+ // Delete a VPN client
118
+ adminRouter.addTypedHandler(
119
+ new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_DeleteVpnClient>(
120
+ 'deleteVpnClient',
121
+ async (dataArg, toolsArg) => {
122
+ const manager = this.opsServerRef.dcRouterRef.vpnManager;
123
+ if (!manager) {
124
+ return { success: false, message: 'VPN not configured' };
125
+ }
126
+
127
+ try {
128
+ await manager.removeClient(dataArg.clientId);
129
+ return { success: true };
130
+ } catch (err: unknown) {
131
+ return { success: false, message: (err as Error).message };
132
+ }
133
+ },
134
+ ),
135
+ );
136
+
137
+ // Enable a VPN client
138
+ adminRouter.addTypedHandler(
139
+ new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_EnableVpnClient>(
140
+ 'enableVpnClient',
141
+ async (dataArg, toolsArg) => {
142
+ const manager = this.opsServerRef.dcRouterRef.vpnManager;
143
+ if (!manager) {
144
+ return { success: false, message: 'VPN not configured' };
145
+ }
146
+
147
+ try {
148
+ await manager.enableClient(dataArg.clientId);
149
+ return { success: true };
150
+ } catch (err: unknown) {
151
+ return { success: false, message: (err as Error).message };
152
+ }
153
+ },
154
+ ),
155
+ );
156
+
157
+ // Disable a VPN client
158
+ adminRouter.addTypedHandler(
159
+ new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_DisableVpnClient>(
160
+ 'disableVpnClient',
161
+ async (dataArg, toolsArg) => {
162
+ const manager = this.opsServerRef.dcRouterRef.vpnManager;
163
+ if (!manager) {
164
+ return { success: false, message: 'VPN not configured' };
165
+ }
166
+
167
+ try {
168
+ await manager.disableClient(dataArg.clientId);
169
+ return { success: true };
170
+ } catch (err: unknown) {
171
+ return { success: false, message: (err as Error).message };
172
+ }
173
+ },
174
+ ),
175
+ );
176
+
177
+ // Rotate a VPN client's keys
178
+ adminRouter.addTypedHandler(
179
+ new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_RotateVpnClientKey>(
180
+ 'rotateVpnClientKey',
181
+ async (dataArg, toolsArg) => {
182
+ const manager = this.opsServerRef.dcRouterRef.vpnManager;
183
+ if (!manager) {
184
+ return { success: false, message: 'VPN not configured' };
185
+ }
186
+
187
+ try {
188
+ const bundle = await manager.rotateClientKey(dataArg.clientId);
189
+ return {
190
+ success: true,
191
+ wireguardConfig: bundle.wireguardConfig,
192
+ };
193
+ } catch (err: unknown) {
194
+ return { success: false, message: (err as Error).message };
195
+ }
196
+ },
197
+ ),
198
+ );
199
+
200
+ // Export a VPN client config
201
+ adminRouter.addTypedHandler(
202
+ new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_ExportVpnClientConfig>(
203
+ 'exportVpnClientConfig',
204
+ async (dataArg, toolsArg) => {
205
+ const manager = this.opsServerRef.dcRouterRef.vpnManager;
206
+ if (!manager) {
207
+ return { success: false, message: 'VPN not configured' };
208
+ }
209
+
210
+ try {
211
+ const config = await manager.exportClientConfig(dataArg.clientId, dataArg.format);
212
+ return { success: true, config };
213
+ } catch (err: unknown) {
214
+ return { success: false, message: (err as Error).message };
215
+ }
216
+ },
217
+ ),
218
+ );
219
+
220
+ // Get telemetry for a specific VPN client
221
+ viewRouter.addTypedHandler(
222
+ new plugins.typedrequest.TypedHandler<interfaces.requests.IReq_GetVpnClientTelemetry>(
223
+ 'getVpnClientTelemetry',
224
+ async (dataArg, toolsArg) => {
225
+ const manager = this.opsServerRef.dcRouterRef.vpnManager;
226
+ if (!manager) {
227
+ return { success: false, message: 'VPN not configured' };
228
+ }
229
+
230
+ try {
231
+ const telemetry = await manager.getClientTelemetry(dataArg.clientId);
232
+ if (!telemetry) {
233
+ return { success: false, message: 'Client not found or not connected' };
234
+ }
235
+ return {
236
+ success: true,
237
+ telemetry: {
238
+ clientId: telemetry.clientId,
239
+ assignedIp: telemetry.assignedIp,
240
+ bytesSent: telemetry.bytesSent,
241
+ bytesReceived: telemetry.bytesReceived,
242
+ packetsDropped: telemetry.packetsDropped,
243
+ bytesDropped: telemetry.bytesDropped,
244
+ lastKeepaliveAt: telemetry.lastKeepaliveAt,
245
+ keepalivesReceived: telemetry.keepalivesReceived,
246
+ rateLimitBytesPerSec: telemetry.rateLimitBytesPerSec,
247
+ burstBytes: telemetry.burstBytes,
248
+ },
249
+ };
250
+ } catch (err: unknown) {
251
+ return { success: false, message: (err as Error).message };
252
+ }
253
+ },
254
+ ),
255
+ );
256
+ }
257
+ }
package/ts/plugins.ts CHANGED
@@ -58,13 +58,14 @@ import * as smartnetwork from '@push.rocks/smartnetwork';
58
58
  import * as smartpath from '@push.rocks/smartpath';
59
59
  import * as smartproxy from '@push.rocks/smartproxy';
60
60
  import * as smartpromise from '@push.rocks/smartpromise';
61
+ import * as smartvpn from '@push.rocks/smartvpn';
61
62
  import * as smartradius from '@push.rocks/smartradius';
62
63
  import * as smartrequest from '@push.rocks/smartrequest';
63
64
  import * as smartrx from '@push.rocks/smartrx';
64
65
  import * as smartunique from '@push.rocks/smartunique';
65
66
  import * as taskbuffer from '@push.rocks/taskbuffer';
66
67
 
67
- export { projectinfo, qenv, smartacme, smartdata, smartdns, smartfs, smartguard, smartjwt, smartlog, smartmetrics, smartdb, smartmta, smartnetwork, smartpath, smartproxy, smartpromise, smartradius, smartrequest, smartrx, smartunique, taskbuffer };
68
+ export { projectinfo, qenv, smartacme, smartdata, smartdns, smartfs, smartguard, smartjwt, smartlog, smartmetrics, smartdb, smartmta, smartnetwork, smartpath, smartproxy, smartpromise, smartradius, smartrequest, smartrx, smartunique, smartvpn, taskbuffer };
68
69
 
69
70
  // Define SmartLog types for use in error handling
70
71
  export type TLogLevel = 'error' | 'warn' | 'info' | 'success' | 'debug';