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