@serve.zone/dcrouter 11.0.39 → 11.0.40

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 (50) hide show
  1. package/dist_serve/bundle.js +1 -1
  2. package/dist_ts/errors/base.errors.js +320 -0
  3. package/dist_ts/errors/error.codes.d.ts +115 -0
  4. package/dist_ts/errors/error.codes.js +136 -0
  5. package/dist_ts/monitoring/classes.metricsmanager.d.ts +178 -0
  6. package/dist_ts/monitoring/classes.metricsmanager.js +642 -0
  7. package/dist_ts/monitoring/index.d.ts +1 -0
  8. package/dist_ts/monitoring/index.js +2 -0
  9. package/dist_ts/opsserver/classes.opsserver.d.ts +37 -0
  10. package/dist_ts/opsserver/classes.opsserver.js +85 -0
  11. package/dist_ts/opsserver/handlers/api-token.handler.d.ts +6 -0
  12. package/dist_ts/opsserver/handlers/api-token.handler.js +62 -0
  13. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +32 -0
  14. package/dist_ts/opsserver/handlers/certificate.handler.js +421 -0
  15. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +30 -0
  16. package/dist_ts/opsserver/handlers/email-ops.handler.js +227 -0
  17. package/dist_ts/opsserver/handlers/index.d.ts +11 -0
  18. package/dist_ts/opsserver/handlers/index.js +12 -0
  19. package/dist_ts/opsserver/handlers/radius.handler.d.ts +6 -0
  20. package/dist_ts/opsserver/handlers/radius.handler.js +295 -0
  21. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +6 -0
  22. package/dist_ts/opsserver/handlers/remoteingress.handler.js +156 -0
  23. package/dist_ts/opsserver/handlers/route-management.handler.d.ts +14 -0
  24. package/dist_ts/opsserver/handlers/route-management.handler.js +117 -0
  25. package/dist_ts/opsserver/handlers/security.handler.d.ts +9 -0
  26. package/dist_ts/opsserver/handlers/security.handler.js +231 -0
  27. package/dist_ts/opsserver/handlers/stats.handler.d.ts +11 -0
  28. package/dist_ts/opsserver/handlers/stats.handler.js +399 -0
  29. package/dist_ts/opsserver/helpers/guards.d.ts +27 -0
  30. package/dist_ts/opsserver/helpers/guards.js +43 -0
  31. package/dist_ts/opsserver/index.d.ts +1 -0
  32. package/dist_ts/opsserver/index.js +2 -0
  33. package/dist_ts/radius/classes.accounting.manager.d.ts +218 -0
  34. package/dist_ts/radius/classes.accounting.manager.js +417 -0
  35. package/dist_ts/radius/classes.radius.server.d.ts +171 -0
  36. package/dist_ts/radius/classes.radius.server.js +385 -0
  37. package/dist_ts/radius/classes.vlan.manager.d.ts +128 -0
  38. package/dist_ts/radius/classes.vlan.manager.js +279 -0
  39. package/dist_ts/radius/index.d.ts +13 -0
  40. package/dist_ts/radius/index.js +14 -0
  41. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +82 -0
  42. package/dist_ts/remoteingress/classes.remoteingress-manager.js +227 -0
  43. package/dist_ts/remoteingress/classes.tunnel-manager.d.ts +59 -0
  44. package/dist_ts/remoteingress/classes.tunnel-manager.js +165 -0
  45. package/dist_ts/remoteingress/index.d.ts +2 -0
  46. package/dist_ts/remoteingress/index.js +3 -0
  47. package/dist_ts_web/00_commitinfo_data.js +1 -1
  48. package/package.json +2 -2
  49. package/ts/00_commitinfo_data.ts +1 -1
  50. package/ts_web/00_commitinfo_data.ts +1 -1
@@ -0,0 +1,156 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
3
+ export class RemoteIngressHandler {
4
+ opsServerRef;
5
+ constructor(opsServerRef) {
6
+ this.opsServerRef = opsServerRef;
7
+ this.registerHandlers();
8
+ }
9
+ registerHandlers() {
10
+ const viewRouter = this.opsServerRef.viewRouter;
11
+ const adminRouter = this.opsServerRef.adminRouter;
12
+ // ---- Read endpoints (viewRouter — valid identity required via middleware) ----
13
+ // Get all remote ingress edges
14
+ viewRouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getRemoteIngresses', async (dataArg, toolsArg) => {
15
+ const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
16
+ if (!manager) {
17
+ return { edges: [] };
18
+ }
19
+ // Return edges without secrets, enriched with effective listen ports and breakdown
20
+ const edges = manager.getAllEdges().map((e) => {
21
+ const breakdown = manager.getPortBreakdown(e);
22
+ return {
23
+ ...e,
24
+ secret: '********', // Never expose secrets via API
25
+ effectiveListenPorts: manager.getEffectiveListenPorts(e),
26
+ manualPorts: breakdown.manual,
27
+ derivedPorts: breakdown.derived,
28
+ };
29
+ });
30
+ return { edges };
31
+ }));
32
+ // ---- Write endpoints (adminRouter) ----
33
+ // Create a new remote ingress edge
34
+ adminRouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createRemoteIngress', async (dataArg, toolsArg) => {
35
+ const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
36
+ const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
37
+ if (!manager) {
38
+ return {
39
+ success: false,
40
+ edge: null,
41
+ };
42
+ }
43
+ const edge = await manager.createEdge(dataArg.name, dataArg.listenPorts || [], dataArg.tags, dataArg.autoDerivePorts ?? true);
44
+ // Sync allowed edges with the hub
45
+ if (tunnelManager) {
46
+ await tunnelManager.syncAllowedEdges();
47
+ }
48
+ return { success: true, edge };
49
+ }));
50
+ // Delete a remote ingress edge
51
+ adminRouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteRemoteIngress', async (dataArg, toolsArg) => {
52
+ const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
53
+ const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
54
+ if (!manager) {
55
+ return { success: false, message: 'RemoteIngress not configured' };
56
+ }
57
+ const deleted = await manager.deleteEdge(dataArg.id);
58
+ if (deleted && tunnelManager) {
59
+ await tunnelManager.syncAllowedEdges();
60
+ }
61
+ return {
62
+ success: deleted,
63
+ message: deleted ? undefined : 'Edge not found',
64
+ };
65
+ }));
66
+ // Update a remote ingress edge
67
+ adminRouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updateRemoteIngress', async (dataArg, toolsArg) => {
68
+ const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
69
+ const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
70
+ if (!manager) {
71
+ return { success: false, edge: null };
72
+ }
73
+ const edge = await manager.updateEdge(dataArg.id, {
74
+ name: dataArg.name,
75
+ listenPorts: dataArg.listenPorts,
76
+ autoDerivePorts: dataArg.autoDerivePorts,
77
+ enabled: dataArg.enabled,
78
+ tags: dataArg.tags,
79
+ });
80
+ if (!edge) {
81
+ return { success: false, edge: null };
82
+ }
83
+ // Sync allowed edges — ports, tags, or enabled may have changed
84
+ if (tunnelManager) {
85
+ await tunnelManager.syncAllowedEdges();
86
+ }
87
+ const breakdown = manager.getPortBreakdown(edge);
88
+ return {
89
+ success: true,
90
+ edge: {
91
+ ...edge,
92
+ secret: '********',
93
+ effectiveListenPorts: manager.getEffectiveListenPorts(edge),
94
+ manualPorts: breakdown.manual,
95
+ derivedPorts: breakdown.derived,
96
+ },
97
+ };
98
+ }));
99
+ // Regenerate secret for an edge
100
+ adminRouter.addTypedHandler(new plugins.typedrequest.TypedHandler('regenerateRemoteIngressSecret', async (dataArg, toolsArg) => {
101
+ const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
102
+ const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
103
+ if (!manager) {
104
+ return { success: false, secret: '' };
105
+ }
106
+ const secret = await manager.regenerateSecret(dataArg.id);
107
+ if (!secret) {
108
+ return { success: false, secret: '' };
109
+ }
110
+ // Sync allowed edges since secret changed
111
+ if (tunnelManager) {
112
+ await tunnelManager.syncAllowedEdges();
113
+ }
114
+ return { success: true, secret };
115
+ }));
116
+ // Get runtime status of all edges (read)
117
+ viewRouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getRemoteIngressStatus', async (dataArg, toolsArg) => {
118
+ const tunnelManager = this.opsServerRef.dcRouterRef.tunnelManager;
119
+ if (!tunnelManager) {
120
+ return { statuses: [] };
121
+ }
122
+ return { statuses: tunnelManager.getEdgeStatuses() };
123
+ }));
124
+ // Get a connection token for an edge (write — exposes secret)
125
+ adminRouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getRemoteIngressConnectionToken', async (dataArg, toolsArg) => {
126
+ const manager = this.opsServerRef.dcRouterRef.remoteIngressManager;
127
+ if (!manager) {
128
+ return { success: false, message: 'RemoteIngress not configured' };
129
+ }
130
+ const edge = manager.getEdge(dataArg.edgeId);
131
+ if (!edge) {
132
+ return { success: false, message: 'Edge not found' };
133
+ }
134
+ if (!edge.enabled) {
135
+ return { success: false, message: 'Edge is disabled' };
136
+ }
137
+ const hubHost = dataArg.hubHost
138
+ || this.opsServerRef.dcRouterRef.options.remoteIngressConfig?.hubDomain;
139
+ if (!hubHost) {
140
+ return {
141
+ success: false,
142
+ message: 'No hub hostname configured. Set hubDomain in remoteIngressConfig or provide hubHost.',
143
+ };
144
+ }
145
+ const hubPort = this.opsServerRef.dcRouterRef.options.remoteIngressConfig?.tunnelPort ?? 8443;
146
+ const token = plugins.remoteingress.encodeConnectionToken({
147
+ hubHost,
148
+ hubPort,
149
+ edgeId: edge.id,
150
+ secret: edge.secret,
151
+ });
152
+ return { success: true, token };
153
+ }));
154
+ }
155
+ }
156
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVtb3RlaW5ncmVzcy5oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvb3Bzc2VydmVyL2hhbmRsZXJzL3JlbW90ZWluZ3Jlc3MuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sS0FBSyxVQUFVLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsTUFBTSxPQUFPLG9CQUFvQjtJQUNYO0lBQXBCLFlBQW9CLFlBQXVCO1FBQXZCLGlCQUFZLEdBQVosWUFBWSxDQUFXO1FBQ3pDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFTyxnQkFBZ0I7UUFDdEIsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFDaEQsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxXQUFXLENBQUM7UUFFbEQsaUZBQWlGO1FBRWpGLCtCQUErQjtRQUMvQixVQUFVLENBQUMsZUFBZSxDQUN4QixJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUNuQyxvQkFBb0IsRUFDcEIsS0FBSyxFQUFFLE9BQU8sRUFBRSxRQUFRLEVBQUUsRUFBRTtZQUMxQixNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxvQkFBb0IsQ0FBQztZQUNuRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7Z0JBQ2IsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsQ0FBQztZQUN2QixDQUFDO1lBQ0QsbUZBQW1GO1lBQ25GLE1BQU0sS0FBSyxHQUFHLE9BQU8sQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtnQkFDNUMsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLGdCQUFnQixDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUM5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
@@ -0,0 +1,14 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { OpsServer } from '../classes.opsserver.js';
3
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
4
+ export declare class RouteManagementHandler {
5
+ private opsServerRef;
6
+ typedrouter: plugins.typedrequest.TypedRouter<interfaces.typedrequestInterfaces.ITypedRequest>;
7
+ constructor(opsServerRef: OpsServer);
8
+ /**
9
+ * Validate auth: JWT identity OR API token with required scope.
10
+ * Returns a userId string on success, throws on failure.
11
+ */
12
+ private requireAuth;
13
+ private registerHandlers;
14
+ }
@@ -0,0 +1,117 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
3
+ export class RouteManagementHandler {
4
+ opsServerRef;
5
+ typedrouter = new plugins.typedrequest.TypedRouter();
6
+ constructor(opsServerRef) {
7
+ this.opsServerRef = opsServerRef;
8
+ this.opsServerRef.typedrouter.addTypedRouter(this.typedrouter);
9
+ this.registerHandlers();
10
+ }
11
+ /**
12
+ * Validate auth: JWT identity OR API token with required scope.
13
+ * Returns a userId string on success, throws on failure.
14
+ */
15
+ async requireAuth(request, requiredScope) {
16
+ // Try JWT identity first
17
+ if (request.identity?.jwt) {
18
+ try {
19
+ const isAdmin = await this.opsServerRef.adminHandler.adminIdentityGuard.exec({
20
+ identity: request.identity,
21
+ });
22
+ if (isAdmin)
23
+ return request.identity.userId;
24
+ }
25
+ catch { /* fall through */ }
26
+ }
27
+ // Try API token
28
+ if (request.apiToken) {
29
+ const tokenManager = this.opsServerRef.dcRouterRef.apiTokenManager;
30
+ if (tokenManager) {
31
+ const token = await tokenManager.validateToken(request.apiToken);
32
+ if (token) {
33
+ if (!requiredScope || tokenManager.hasScope(token, requiredScope)) {
34
+ return token.createdBy;
35
+ }
36
+ throw new plugins.typedrequest.TypedResponseError('insufficient scope');
37
+ }
38
+ }
39
+ }
40
+ throw new plugins.typedrequest.TypedResponseError('unauthorized');
41
+ }
42
+ registerHandlers() {
43
+ // Get merged routes
44
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('getMergedRoutes', async (dataArg) => {
45
+ await this.requireAuth(dataArg, 'routes:read');
46
+ const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
47
+ if (!manager) {
48
+ return { routes: [], warnings: [] };
49
+ }
50
+ return manager.getMergedRoutes();
51
+ }));
52
+ // Create route
53
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('createRoute', async (dataArg) => {
54
+ const userId = await this.requireAuth(dataArg, 'routes:write');
55
+ const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
56
+ if (!manager) {
57
+ return { success: false, message: 'Route management not initialized' };
58
+ }
59
+ const id = await manager.createRoute(dataArg.route, userId, dataArg.enabled ?? true);
60
+ return { success: true, storedRouteId: id };
61
+ }));
62
+ // Update route
63
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updateRoute', async (dataArg) => {
64
+ await this.requireAuth(dataArg, 'routes:write');
65
+ const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
66
+ if (!manager) {
67
+ return { success: false, message: 'Route management not initialized' };
68
+ }
69
+ const ok = await manager.updateRoute(dataArg.id, {
70
+ route: dataArg.route,
71
+ enabled: dataArg.enabled,
72
+ });
73
+ return { success: ok, message: ok ? undefined : 'Route not found' };
74
+ }));
75
+ // Delete route
76
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('deleteRoute', async (dataArg) => {
77
+ await this.requireAuth(dataArg, 'routes:write');
78
+ const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
79
+ if (!manager) {
80
+ return { success: false, message: 'Route management not initialized' };
81
+ }
82
+ const ok = await manager.deleteRoute(dataArg.id);
83
+ return { success: ok, message: ok ? undefined : 'Route not found' };
84
+ }));
85
+ // Set override on a hardcoded route
86
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('setRouteOverride', async (dataArg) => {
87
+ const userId = await this.requireAuth(dataArg, 'routes:write');
88
+ const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
89
+ if (!manager) {
90
+ return { success: false, message: 'Route management not initialized' };
91
+ }
92
+ await manager.setOverride(dataArg.routeName, dataArg.enabled, userId);
93
+ return { success: true };
94
+ }));
95
+ // Remove override from a hardcoded route
96
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('removeRouteOverride', async (dataArg) => {
97
+ await this.requireAuth(dataArg, 'routes:write');
98
+ const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
99
+ if (!manager) {
100
+ return { success: false, message: 'Route management not initialized' };
101
+ }
102
+ const ok = await manager.removeOverride(dataArg.routeName);
103
+ return { success: ok, message: ok ? undefined : 'Override not found' };
104
+ }));
105
+ // Toggle programmatic route
106
+ this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('toggleRoute', async (dataArg) => {
107
+ await this.requireAuth(dataArg, 'routes:write');
108
+ const manager = this.opsServerRef.dcRouterRef.routeConfigManager;
109
+ if (!manager) {
110
+ return { success: false, message: 'Route management not initialized' };
111
+ }
112
+ const ok = await manager.toggleRoute(dataArg.id, dataArg.enabled);
113
+ return { success: ok, message: ok ? undefined : 'Route not found' };
114
+ }));
115
+ }
116
+ }
117
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGUtbWFuYWdlbWVudC5oYW5kbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvb3Bzc2VydmVyL2hhbmRsZXJzL3JvdXRlLW1hbmFnZW1lbnQuaGFuZGxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBRTVDLE9BQU8sS0FBSyxVQUFVLE1BQU0saUNBQWlDLENBQUM7QUFFOUQsTUFBTSxPQUFPLHNCQUFzQjtJQUdiO0lBRmIsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUU1RCxZQUFvQixZQUF1QjtRQUF2QixpQkFBWSxHQUFaLFlBQVksQ0FBVztRQUN6QyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7SUFFRDs7O09BR0c7SUFDSyxLQUFLLENBQUMsV0FBVyxDQUN2QixPQUFvRSxFQUNwRSxhQUE4QztRQUU5Qyx5QkFBeUI7UUFDekIsSUFBSSxPQUFPLENBQUMsUUFBUSxFQUFFLEdBQUcsRUFBRSxDQUFDO1lBQzFCLElBQUksQ0FBQztnQkFDSCxNQUFNLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLElBQUksQ0FBQztvQkFDM0UsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRO2lCQUMzQixDQUFDLENBQUM7Z0JBQ0gsSUFBSSxPQUFPO29CQUFFLE9BQU8sT0FBTyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUM7WUFDOUMsQ0FBQztZQUFDLE1BQU0sQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDaEMsQ0FBQztRQUVELGdCQUFnQjtRQUNoQixJQUFJLE9BQU8sQ0FBQyxRQUFRLEVBQUUs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
@@ -0,0 +1,9 @@
1
+ import type { OpsServer } from '../classes.opsserver.js';
2
+ export declare class SecurityHandler {
3
+ private opsServerRef;
4
+ constructor(opsServerRef: OpsServer);
5
+ private registerHandlers;
6
+ private collectSecurityMetrics;
7
+ private getActiveConnections;
8
+ private getRateLimitStatus;
9
+ }
@@ -0,0 +1,231 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
3
+ import { MetricsManager } from '../../monitoring/index.js';
4
+ export class SecurityHandler {
5
+ opsServerRef;
6
+ constructor(opsServerRef) {
7
+ this.opsServerRef = opsServerRef;
8
+ this.registerHandlers();
9
+ }
10
+ registerHandlers() {
11
+ // All security endpoints register directly on viewRouter (valid identity required via middleware)
12
+ const router = this.opsServerRef.viewRouter;
13
+ // Security Metrics Handler
14
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getSecurityMetrics', async (dataArg, toolsArg) => {
15
+ const metrics = await this.collectSecurityMetrics();
16
+ return {
17
+ metrics: {
18
+ blockedIPs: metrics.blockedIPs,
19
+ reputationScores: metrics.reputationScores,
20
+ spamDetected: metrics.spamDetection.detected,
21
+ malwareDetected: metrics.malwareDetected,
22
+ phishingDetected: metrics.phishingDetected,
23
+ authenticationFailures: metrics.authFailures,
24
+ suspiciousActivities: metrics.suspiciousActivities,
25
+ },
26
+ trends: dataArg.includeDetails ? {
27
+ spam: metrics.trends.spam,
28
+ malware: metrics.trends.malware,
29
+ phishing: metrics.trends.phishing,
30
+ } : undefined,
31
+ };
32
+ }));
33
+ // Active Connections Handler
34
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getActiveConnections', async (dataArg, toolsArg) => {
35
+ const connections = await this.getActiveConnections(dataArg.protocol, dataArg.state);
36
+ const connectionInfos = connections.map(conn => ({
37
+ id: conn.id,
38
+ remoteAddress: conn.source.ip,
39
+ localAddress: conn.destination.ip,
40
+ startTime: conn.startTime,
41
+ protocol: conn.type === 'http' ? 'https' : conn.type,
42
+ state: conn.status,
43
+ bytesReceived: Math.floor(conn.bytesTransferred / 2),
44
+ bytesSent: Math.floor(conn.bytesTransferred / 2),
45
+ }));
46
+ const summary = {
47
+ total: connectionInfos.length,
48
+ byProtocol: connectionInfos.reduce((acc, conn) => {
49
+ acc[conn.protocol] = (acc[conn.protocol] || 0) + 1;
50
+ return acc;
51
+ }, {}),
52
+ byState: connectionInfos.reduce((acc, conn) => {
53
+ acc[conn.state] = (acc[conn.state] || 0) + 1;
54
+ return acc;
55
+ }, {}),
56
+ };
57
+ return {
58
+ connections: connectionInfos,
59
+ summary,
60
+ };
61
+ }));
62
+ // Network Stats Handler - provides comprehensive network metrics
63
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getNetworkStats', async (dataArg, toolsArg) => {
64
+ // Get network stats from MetricsManager if available
65
+ if (this.opsServerRef.dcRouterRef.metricsManager) {
66
+ const networkStats = await this.opsServerRef.dcRouterRef.metricsManager.getNetworkStats();
67
+ // Convert per-IP throughput Map to serializable array
68
+ const throughputByIP = [];
69
+ if (networkStats.throughputByIP) {
70
+ for (const [ip, tp] of networkStats.throughputByIP) {
71
+ throughputByIP.push({ ip, in: tp.in, out: tp.out });
72
+ }
73
+ }
74
+ return {
75
+ connectionsByIP: Array.from(networkStats.connectionsByIP.entries()).map(([ip, count]) => ({ ip, count })),
76
+ throughputRate: networkStats.throughputRate,
77
+ topIPs: networkStats.topIPs,
78
+ totalDataTransferred: networkStats.totalDataTransferred,
79
+ throughputHistory: networkStats.throughputHistory || [],
80
+ throughputByIP,
81
+ requestsPerSecond: networkStats.requestsPerSecond || 0,
82
+ requestsTotal: networkStats.requestsTotal || 0,
83
+ };
84
+ }
85
+ // Fallback if MetricsManager not available
86
+ return {
87
+ connectionsByIP: [],
88
+ throughputRate: { bytesInPerSecond: 0, bytesOutPerSecond: 0 },
89
+ topIPs: [],
90
+ totalDataTransferred: { bytesIn: 0, bytesOut: 0 },
91
+ throughputHistory: [],
92
+ throughputByIP: [],
93
+ requestsPerSecond: 0,
94
+ requestsTotal: 0,
95
+ };
96
+ }));
97
+ // Rate Limit Status Handler
98
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getRateLimitStatus', async (dataArg, toolsArg) => {
99
+ const status = await this.getRateLimitStatus(dataArg.domain, dataArg.ip);
100
+ const limits = status.limits.map(limit => ({
101
+ domain: limit.identifier,
102
+ currentRate: limit.current,
103
+ limit: limit.limit,
104
+ remaining: limit.limit - limit.current,
105
+ resetTime: limit.resetAt,
106
+ blocked: limit.status === 'limited',
107
+ }));
108
+ return {
109
+ limits,
110
+ globalLimit: dataArg.includeBlocked ? {
111
+ current: limits.reduce((sum, l) => sum + l.currentRate, 0),
112
+ limit: 1000, // Global limit
113
+ remaining: 1000 - limits.reduce((sum, l) => sum + l.currentRate, 0),
114
+ } : undefined,
115
+ };
116
+ }));
117
+ }
118
+ async collectSecurityMetrics() {
119
+ // Get metrics from MetricsManager if available
120
+ if (this.opsServerRef.dcRouterRef.metricsManager) {
121
+ const securityStats = await this.opsServerRef.dcRouterRef.metricsManager.getSecurityStats();
122
+ return {
123
+ blockedIPs: [], // TODO: Track actual blocked IPs
124
+ reputationScores: {},
125
+ spamDetection: {
126
+ detected: securityStats.spamDetected,
127
+ falsePositives: 0,
128
+ },
129
+ malwareDetected: securityStats.malwareDetected,
130
+ phishingDetected: securityStats.phishingDetected,
131
+ authFailures: securityStats.authFailures,
132
+ suspiciousActivities: 0,
133
+ trends: {
134
+ spam: [],
135
+ malware: [],
136
+ phishing: [],
137
+ },
138
+ };
139
+ }
140
+ // Fallback if MetricsManager not available
141
+ return {
142
+ blockedIPs: [],
143
+ reputationScores: {},
144
+ spamDetection: {
145
+ detected: 0,
146
+ falsePositives: 0,
147
+ },
148
+ malwareDetected: 0,
149
+ phishingDetected: 0,
150
+ authFailures: 0,
151
+ suspiciousActivities: 0,
152
+ trends: {
153
+ spam: [],
154
+ malware: [],
155
+ phishing: [],
156
+ },
157
+ };
158
+ }
159
+ async getActiveConnections(protocol, state) {
160
+ const connections = [];
161
+ // Get connection info and network stats from MetricsManager if available
162
+ if (this.opsServerRef.dcRouterRef.metricsManager) {
163
+ const connectionInfo = await this.opsServerRef.dcRouterRef.metricsManager.getConnectionInfo();
164
+ const networkStats = await this.opsServerRef.dcRouterRef.metricsManager.getNetworkStats();
165
+ // Use IP-based connection data from the new metrics API
166
+ if (networkStats.connectionsByIP && networkStats.connectionsByIP.size > 0) {
167
+ let connIndex = 0;
168
+ const publicIp = this.opsServerRef.dcRouterRef.options.publicIp || 'server';
169
+ for (const [ip, count] of networkStats.connectionsByIP) {
170
+ // Create a connection entry for each active IP connection
171
+ for (let i = 0; i < Math.min(count, 5); i++) { // Limit to 5 connections per IP for UI performance
172
+ connections.push({
173
+ id: `conn-${connIndex++}`,
174
+ type: 'http',
175
+ source: {
176
+ ip: ip,
177
+ port: Math.floor(Math.random() * 50000) + 10000, // High port range
178
+ },
179
+ destination: {
180
+ ip: publicIp,
181
+ port: 443,
182
+ service: 'proxy',
183
+ },
184
+ startTime: Date.now() - Math.floor(Math.random() * 3600000), // Within last hour
185
+ bytesTransferred: Math.floor(networkStats.totalDataTransferred.bytesIn / networkStats.connectionsByIP.size),
186
+ status: 'active',
187
+ });
188
+ }
189
+ }
190
+ }
191
+ else if (connectionInfo.length > 0) {
192
+ // Fallback to route-based connection info if no IP data available
193
+ connectionInfo.forEach((info, index) => {
194
+ connections.push({
195
+ id: `conn-${index}`,
196
+ type: 'http',
197
+ source: {
198
+ ip: 'unknown',
199
+ port: 0,
200
+ },
201
+ destination: {
202
+ ip: this.opsServerRef.dcRouterRef.options.publicIp || 'server',
203
+ port: 443,
204
+ service: info.source,
205
+ },
206
+ startTime: info.lastActivity.getTime(),
207
+ bytesTransferred: 0,
208
+ status: 'active',
209
+ });
210
+ });
211
+ }
212
+ }
213
+ // Filter by protocol if specified
214
+ if (protocol) {
215
+ return connections.filter(conn => {
216
+ if (protocol === 'https' || protocol === 'http') {
217
+ return conn.type === 'http';
218
+ }
219
+ return conn.type === protocol.replace('s', ''); // smtp/smtps -> smtp
220
+ });
221
+ }
222
+ return connections;
223
+ }
224
+ async getRateLimitStatus(domain, ip) {
225
+ // TODO: Implement actual rate limit status collection
226
+ return {
227
+ limits: [],
228
+ };
229
+ }
230
+ }
231
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VjdXJpdHkuaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL29wc3NlcnZlci9oYW5kbGVycy9zZWN1cml0eS5oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFFM0QsTUFBTSxPQUFPLGVBQWU7SUFDTjtJQUFwQixZQUFvQixZQUF1QjtRQUF2QixpQkFBWSxHQUFaLFlBQVksQ0FBVztRQUN6QyxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztJQUMxQixDQUFDO0lBRU8sZ0JBQWdCO1FBQ3RCLGtHQUFrRztRQUNsRyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUU1QywyQkFBMkI7UUFDM0IsTUFBTSxDQUFDLGVBQWUsQ0FDcEIsSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FDbkMsb0JBQW9CLEVBQ3BCLEtBQUssRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLEVBQUU7WUFDMUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztZQUNwRCxPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUCxVQUFVLEVBQUUsT0FBTyxDQUFDLFVBQVU7b0JBQzlCLGdCQUFnQixFQUFFLE9BQU8sQ0FBQyxnQkFBZ0I7b0JBQzFDLFlBQVksRUFBRSxPQUFPLENBQUMsYUFBYSxDQUFDLFFBQVE7b0JBQzVDLGVBQWUsRUFBRSxPQUFPLENBQUMsZUFBZTtvQkFDeEMsZ0JBQWdCLEVBQUUsT0FBTyxDQUFDLGdCQUFnQjtvQkFDMUMsc0JBQXNCLEVBQUUsT0FBTyxDQUFDLFlBQVk7b0JBQzVDLG9CQUFvQixFQUFFLE9BQU8sQ0FB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
@@ -0,0 +1,11 @@
1
+ import type { OpsServer } from '../classes.opsserver.js';
2
+ export declare class StatsHandler {
3
+ private opsServerRef;
4
+ constructor(opsServerRef: OpsServer);
5
+ private registerHandlers;
6
+ private collectServerStats;
7
+ private collectEmailStats;
8
+ private collectDnsStats;
9
+ private getQueueStatus;
10
+ private checkHealthStatus;
11
+ }