@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,399 @@
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
+ import { SecurityLogger } from '../../security/classes.securitylogger.js';
5
+ export class StatsHandler {
6
+ opsServerRef;
7
+ constructor(opsServerRef) {
8
+ this.opsServerRef = opsServerRef;
9
+ this.registerHandlers();
10
+ }
11
+ registerHandlers() {
12
+ // All stats endpoints register directly on viewRouter (valid identity required via middleware)
13
+ const router = this.opsServerRef.viewRouter;
14
+ // Server Statistics Handler
15
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getServerStatistics', async (dataArg, toolsArg) => {
16
+ const stats = await this.collectServerStats();
17
+ return {
18
+ stats: {
19
+ uptime: stats.uptime,
20
+ startTime: Date.now() - (stats.uptime * 1000),
21
+ memoryUsage: stats.memoryUsage,
22
+ cpuUsage: stats.cpuUsage,
23
+ activeConnections: stats.activeConnections,
24
+ totalConnections: stats.totalConnections,
25
+ requestsPerSecond: stats.requestsPerSecond,
26
+ throughput: stats.throughput,
27
+ },
28
+ history: dataArg.includeHistory ? stats.history : undefined,
29
+ };
30
+ }));
31
+ // Email Statistics Handler
32
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getEmailStatistics', async (dataArg, toolsArg) => {
33
+ const emailServer = this.opsServerRef.dcRouterRef.emailServer;
34
+ if (!emailServer) {
35
+ return {
36
+ stats: {
37
+ sent: 0,
38
+ received: 0,
39
+ bounced: 0,
40
+ queued: 0,
41
+ failed: 0,
42
+ averageDeliveryTime: 0,
43
+ deliveryRate: 0,
44
+ bounceRate: 0,
45
+ },
46
+ };
47
+ }
48
+ const stats = await this.collectEmailStats();
49
+ return {
50
+ stats: {
51
+ sent: stats.sentToday,
52
+ received: stats.receivedToday,
53
+ bounced: Math.floor(stats.sentToday * stats.bounceRate / 100),
54
+ queued: stats.queueSize,
55
+ failed: 0,
56
+ averageDeliveryTime: 0,
57
+ deliveryRate: stats.deliveryRate,
58
+ bounceRate: stats.bounceRate,
59
+ },
60
+ domainBreakdown: dataArg.includeDetails ? stats.domainBreakdown : undefined,
61
+ };
62
+ }));
63
+ // DNS Statistics Handler
64
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getDnsStatistics', async (dataArg, toolsArg) => {
65
+ const dnsServer = this.opsServerRef.dcRouterRef.dnsServer;
66
+ if (!dnsServer) {
67
+ return {
68
+ stats: {
69
+ totalQueries: 0,
70
+ cacheHits: 0,
71
+ cacheMisses: 0,
72
+ cacheHitRate: 0,
73
+ activeDomains: 0,
74
+ averageResponseTime: 0,
75
+ queryTypes: {},
76
+ },
77
+ };
78
+ }
79
+ const stats = await this.collectDnsStats();
80
+ return {
81
+ stats: {
82
+ totalQueries: stats.totalQueries,
83
+ cacheHits: stats.cacheHits,
84
+ cacheMisses: stats.cacheMisses,
85
+ cacheHitRate: stats.cacheHitRate,
86
+ activeDomains: stats.topDomains.length,
87
+ averageResponseTime: 0,
88
+ queryTypes: stats.queryTypes,
89
+ },
90
+ domainBreakdown: dataArg.includeQueryTypes ? stats.domainBreakdown : undefined,
91
+ };
92
+ }));
93
+ // Queue Status Handler
94
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getQueueStatus', async (dataArg, toolsArg) => {
95
+ const emailServer = this.opsServerRef.dcRouterRef.emailServer;
96
+ const queues = [];
97
+ if (emailServer) {
98
+ const status = await this.getQueueStatus();
99
+ queues.push({
100
+ name: dataArg.queueName || 'default',
101
+ size: status.pending,
102
+ processing: status.active,
103
+ failed: status.failed,
104
+ retrying: status.retrying,
105
+ averageProcessingTime: 0,
106
+ });
107
+ }
108
+ return {
109
+ queues,
110
+ totalItems: queues.reduce((sum, q) => sum + q.size + q.processing + q.failed + q.retrying, 0),
111
+ };
112
+ }));
113
+ // Health Status Handler
114
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getHealthStatus', async (dataArg, toolsArg) => {
115
+ const health = await this.checkHealthStatus();
116
+ return {
117
+ health: {
118
+ healthy: health.healthy,
119
+ uptime: process.uptime(),
120
+ services: health.services.reduce((acc, service) => {
121
+ acc[service.name] = {
122
+ status: service.status,
123
+ message: service.message,
124
+ lastCheck: Date.now(),
125
+ };
126
+ return acc;
127
+ }, {}),
128
+ version: '2.12.0', // TODO: Get from package.json
129
+ },
130
+ };
131
+ }));
132
+ // Combined Metrics Handler - More efficient for frontend polling
133
+ router.addTypedHandler(new plugins.typedrequest.TypedHandler('getCombinedMetrics', async (dataArg, toolsArg) => {
134
+ const sections = dataArg.sections || {
135
+ server: true,
136
+ email: true,
137
+ dns: true,
138
+ security: true,
139
+ network: true,
140
+ };
141
+ const metrics = {};
142
+ // Run all metrics collection in parallel
143
+ const promises = [];
144
+ if (sections.server) {
145
+ promises.push(this.collectServerStats().then(stats => {
146
+ metrics.server = {
147
+ uptime: stats.uptime,
148
+ startTime: Date.now() - (stats.uptime * 1000),
149
+ memoryUsage: stats.memoryUsage,
150
+ cpuUsage: stats.cpuUsage,
151
+ activeConnections: stats.activeConnections,
152
+ totalConnections: stats.totalConnections,
153
+ requestsPerSecond: stats.requestsPerSecond,
154
+ throughput: stats.throughput,
155
+ };
156
+ }));
157
+ }
158
+ if (sections.email) {
159
+ promises.push(this.collectEmailStats().then(stats => {
160
+ // Get time-series data from MetricsManager
161
+ const timeSeries = this.opsServerRef.dcRouterRef.metricsManager
162
+ ? this.opsServerRef.dcRouterRef.metricsManager.getEmailTimeSeries(24)
163
+ : undefined;
164
+ metrics.email = {
165
+ sent: stats.sentToday,
166
+ received: stats.receivedToday,
167
+ bounced: Math.floor(stats.sentToday * stats.bounceRate / 100),
168
+ queued: stats.queueSize,
169
+ failed: 0,
170
+ averageDeliveryTime: 0,
171
+ deliveryRate: stats.deliveryRate,
172
+ bounceRate: stats.bounceRate,
173
+ timeSeries,
174
+ };
175
+ }));
176
+ }
177
+ if (sections.dns) {
178
+ promises.push(this.collectDnsStats().then(stats => {
179
+ // Get time-series data from MetricsManager
180
+ const timeSeries = this.opsServerRef.dcRouterRef.metricsManager
181
+ ? this.opsServerRef.dcRouterRef.metricsManager.getDnsTimeSeries(24)
182
+ : undefined;
183
+ metrics.dns = {
184
+ totalQueries: stats.totalQueries,
185
+ cacheHits: stats.cacheHits,
186
+ cacheMisses: stats.cacheMisses,
187
+ cacheHitRate: stats.cacheHitRate,
188
+ activeDomains: stats.topDomains.length,
189
+ averageResponseTime: 0,
190
+ queryTypes: stats.queryTypes,
191
+ timeSeries,
192
+ recentQueries: stats.recentQueries,
193
+ };
194
+ }));
195
+ }
196
+ if (sections.security && this.opsServerRef.dcRouterRef.metricsManager) {
197
+ promises.push(this.opsServerRef.dcRouterRef.metricsManager.getSecurityStats().then(stats => {
198
+ // Get recent events from the SecurityLogger singleton
199
+ const securityLogger = SecurityLogger.getInstance();
200
+ const recentEvents = securityLogger.getRecentEvents(50).map((evt) => ({
201
+ timestamp: evt.timestamp,
202
+ level: evt.level,
203
+ type: evt.type,
204
+ message: evt.message,
205
+ details: evt.details,
206
+ ipAddress: evt.ipAddress,
207
+ domain: evt.domain,
208
+ success: evt.success,
209
+ }));
210
+ metrics.security = {
211
+ blockedIPs: stats.blockedIPs,
212
+ reputationScores: {},
213
+ spamDetected: stats.spamDetected,
214
+ malwareDetected: stats.malwareDetected,
215
+ phishingDetected: stats.phishingDetected,
216
+ authenticationFailures: stats.authFailures,
217
+ suspiciousActivities: stats.totalThreatsBlocked,
218
+ recentEvents,
219
+ };
220
+ }));
221
+ }
222
+ if (sections.network && this.opsServerRef.dcRouterRef.metricsManager) {
223
+ promises.push((async () => {
224
+ const stats = await this.opsServerRef.dcRouterRef.metricsManager.getNetworkStats();
225
+ const serverStats = await this.collectServerStats();
226
+ // Build per-IP bandwidth lookup from throughputByIP
227
+ const ipBandwidth = new Map();
228
+ if (stats.throughputByIP) {
229
+ for (const [ip, tp] of stats.throughputByIP) {
230
+ ipBandwidth.set(ip, { in: tp.in, out: tp.out });
231
+ }
232
+ }
233
+ metrics.network = {
234
+ totalBandwidth: {
235
+ in: stats.throughputRate.bytesInPerSecond,
236
+ out: stats.throughputRate.bytesOutPerSecond,
237
+ },
238
+ totalBytes: {
239
+ in: stats.totalDataTransferred.bytesIn,
240
+ out: stats.totalDataTransferred.bytesOut,
241
+ },
242
+ activeConnections: serverStats.activeConnections,
243
+ connectionDetails: [],
244
+ topEndpoints: stats.topIPs.map(ip => ({
245
+ endpoint: ip.ip,
246
+ requests: ip.count,
247
+ bandwidth: ipBandwidth.get(ip.ip) || { in: 0, out: 0 },
248
+ })),
249
+ throughputHistory: stats.throughputHistory || [],
250
+ requestsPerSecond: stats.requestsPerSecond || 0,
251
+ requestsTotal: stats.requestsTotal || 0,
252
+ };
253
+ })());
254
+ }
255
+ await Promise.all(promises);
256
+ return {
257
+ metrics,
258
+ timestamp: Date.now(),
259
+ };
260
+ }));
261
+ }
262
+ async collectServerStats() {
263
+ // Get metrics from MetricsManager if available
264
+ if (this.opsServerRef.dcRouterRef.metricsManager) {
265
+ const serverStats = await this.opsServerRef.dcRouterRef.metricsManager.getServerStats();
266
+ return {
267
+ uptime: serverStats.uptime,
268
+ cpuUsage: serverStats.cpuUsage,
269
+ memoryUsage: serverStats.memoryUsage,
270
+ requestsPerSecond: serverStats.requestsPerSecond,
271
+ activeConnections: serverStats.activeConnections,
272
+ totalConnections: serverStats.totalConnections,
273
+ throughput: serverStats.throughput,
274
+ history: [], // TODO: Implement history tracking
275
+ };
276
+ }
277
+ // Fallback to basic stats if MetricsManager not available
278
+ const uptime = process.uptime();
279
+ const memUsage = process.memoryUsage();
280
+ const cpuUsage = plugins.os.loadavg()[0] * 100 / plugins.os.cpus().length;
281
+ return {
282
+ uptime,
283
+ cpuUsage: {
284
+ user: cpuUsage * 0.7,
285
+ system: cpuUsage * 0.3,
286
+ },
287
+ memoryUsage: {
288
+ heapUsed: memUsage.heapUsed,
289
+ heapTotal: memUsage.heapTotal,
290
+ external: memUsage.external,
291
+ rss: memUsage.rss,
292
+ },
293
+ requestsPerSecond: 0,
294
+ activeConnections: 0,
295
+ totalConnections: 0,
296
+ throughput: { bytesIn: 0, bytesOut: 0, bytesInPerSecond: 0, bytesOutPerSecond: 0 },
297
+ history: [],
298
+ };
299
+ }
300
+ async collectEmailStats() {
301
+ // Get metrics from MetricsManager if available
302
+ if (this.opsServerRef.dcRouterRef.metricsManager) {
303
+ const emailStats = await this.opsServerRef.dcRouterRef.metricsManager.getEmailStats();
304
+ return {
305
+ sentToday: emailStats.sentToday,
306
+ receivedToday: emailStats.receivedToday,
307
+ bounceRate: emailStats.bounceRate,
308
+ deliveryRate: emailStats.deliveryRate,
309
+ queueSize: emailStats.queueSize,
310
+ };
311
+ }
312
+ // Fallback if MetricsManager not available
313
+ return {
314
+ sentToday: 0,
315
+ receivedToday: 0,
316
+ bounceRate: 0,
317
+ deliveryRate: 100,
318
+ queueSize: 0,
319
+ };
320
+ }
321
+ async collectDnsStats() {
322
+ // Get metrics from MetricsManager if available
323
+ if (this.opsServerRef.dcRouterRef.metricsManager) {
324
+ const dnsStats = await this.opsServerRef.dcRouterRef.metricsManager.getDnsStats();
325
+ return {
326
+ queriesPerSecond: dnsStats.queriesPerSecond,
327
+ totalQueries: dnsStats.totalQueries,
328
+ cacheHits: dnsStats.cacheHits,
329
+ cacheMisses: dnsStats.cacheMisses,
330
+ cacheHitRate: dnsStats.cacheHitRate,
331
+ topDomains: dnsStats.topDomains,
332
+ queryTypes: dnsStats.queryTypes,
333
+ recentQueries: dnsStats.recentQueries,
334
+ };
335
+ }
336
+ // Fallback if MetricsManager not available
337
+ return {
338
+ queriesPerSecond: 0,
339
+ totalQueries: 0,
340
+ cacheHits: 0,
341
+ cacheMisses: 0,
342
+ cacheHitRate: 0,
343
+ topDomains: [],
344
+ queryTypes: {},
345
+ };
346
+ }
347
+ async getQueueStatus() {
348
+ // TODO: Implement actual queue status collection
349
+ return {
350
+ pending: 0,
351
+ active: 0,
352
+ failed: 0,
353
+ retrying: 0,
354
+ items: [],
355
+ };
356
+ }
357
+ async checkHealthStatus() {
358
+ const services = [];
359
+ // Check HTTP Proxy
360
+ if (this.opsServerRef.dcRouterRef.smartProxy) {
361
+ services.push({
362
+ name: 'HTTP/HTTPS Proxy',
363
+ status: 'healthy',
364
+ });
365
+ }
366
+ // Check Email Server
367
+ if (this.opsServerRef.dcRouterRef.emailServer) {
368
+ services.push({
369
+ name: 'Email Server',
370
+ status: 'healthy',
371
+ });
372
+ }
373
+ // Check DNS Server
374
+ if (this.opsServerRef.dcRouterRef.dnsServer) {
375
+ services.push({
376
+ name: 'DNS Server',
377
+ status: 'healthy',
378
+ });
379
+ }
380
+ // Check OpsServer
381
+ services.push({
382
+ name: 'OpsServer',
383
+ status: 'healthy',
384
+ });
385
+ const healthy = services.every(s => s.status === 'healthy');
386
+ return {
387
+ healthy,
388
+ services,
389
+ checks: [
390
+ {
391
+ name: 'Memory Usage',
392
+ passed: process.memoryUsage().heapUsed < (plugins.os.totalmem() * 0.9),
393
+ message: 'Memory usage within limits',
394
+ },
395
+ ],
396
+ };
397
+ }
398
+ }
399
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuaGFuZGxlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL29wc3NlcnZlci9oYW5kbGVycy9zdGF0cy5oYW5kbGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM5RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDBDQUEwQyxDQUFDO0FBRTFFLE1BQU0sT0FBTyxZQUFZO0lBQ0g7SUFBcEIsWUFBb0IsWUFBdUI7UUFBdkIsaUJBQVksR0FBWixZQUFZLENBQVc7UUFDekMsSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7SUFDMUIsQ0FBQztJQUVPLGdCQUFnQjtRQUN0QiwrRkFBK0Y7UUFDL0YsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUM7UUFFNUMsNEJBQTRCO1FBQzVCLE1BQU0sQ0FBQyxlQUFlLENBQ3BCLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQ25DLHFCQUFxQixFQUNyQixLQUFLLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUFFO1lBQzFCLE1BQU0sS0FBSyxHQUFHLE1BQU0sSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7WUFDOUMsT0FBTztnQkFDTCxLQUFLLEVBQUU7b0JBQ0wsTUFBTSxFQUFFLEtBQUssQ0FBQyxNQUFNO29CQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUM7b0JBQzdDLFdBQVcsRUFBRSxLQUFLLENBQUMsV0FBVztvQkFDOUIsUUFBUSxFQUFFLEtBQUssQ0FBQyxRQUFRO29CQUN4QixpQkFBaUIsRUFBRSxLQUFLLENBQUMs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
@@ -0,0 +1,27 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import type { AdminHandler } from '../handlers/admin.handler.js';
3
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
4
+ /**
5
+ * Helper function to use identity guards in handlers
6
+ *
7
+ * @example
8
+ * // In a handler:
9
+ * await passGuards(toolsArg, this.opsServerRef.adminHandler.validIdentityGuard, dataArg);
10
+ */
11
+ export declare function passGuards<T extends {
12
+ identity?: any;
13
+ }>(toolsArg: any, guard: plugins.smartguard.Guard<T>, dataArg: T): Promise<void>;
14
+ /**
15
+ * Helper to check admin identity in handlers and middleware.
16
+ * Accepts both optional and required identity for flexibility.
17
+ */
18
+ export declare function requireAdminIdentity(adminHandler: AdminHandler, dataArg: {
19
+ identity?: interfaces.data.IIdentity;
20
+ }): Promise<void>;
21
+ /**
22
+ * Helper to check valid identity in handlers and middleware.
23
+ * Accepts both optional and required identity for flexibility.
24
+ */
25
+ export declare function requireValidIdentity(adminHandler: AdminHandler, dataArg: {
26
+ identity?: interfaces.data.IIdentity;
27
+ }): Promise<void>;
@@ -0,0 +1,43 @@
1
+ import * as plugins from '../../plugins.js';
2
+ import * as interfaces from '../../../dist_ts_interfaces/index.js';
3
+ /**
4
+ * Helper function to use identity guards in handlers
5
+ *
6
+ * @example
7
+ * // In a handler:
8
+ * await passGuards(toolsArg, this.opsServerRef.adminHandler.validIdentityGuard, dataArg);
9
+ */
10
+ export async function passGuards(toolsArg, guard, dataArg) {
11
+ const result = await guard.exec(dataArg);
12
+ if (!result) {
13
+ const failedHint = await guard.getFailedHint(dataArg);
14
+ throw new plugins.typedrequest.TypedResponseError(failedHint || 'Guard check failed');
15
+ }
16
+ }
17
+ /**
18
+ * Helper to check admin identity in handlers and middleware.
19
+ * Accepts both optional and required identity for flexibility.
20
+ */
21
+ export async function requireAdminIdentity(adminHandler, dataArg) {
22
+ if (!dataArg.identity) {
23
+ throw new plugins.typedrequest.TypedResponseError('No identity provided');
24
+ }
25
+ const passed = await adminHandler.adminIdentityGuard.exec({ identity: dataArg.identity });
26
+ if (!passed) {
27
+ throw new plugins.typedrequest.TypedResponseError('Admin access required');
28
+ }
29
+ }
30
+ /**
31
+ * Helper to check valid identity in handlers and middleware.
32
+ * Accepts both optional and required identity for flexibility.
33
+ */
34
+ export async function requireValidIdentity(adminHandler, dataArg) {
35
+ if (!dataArg.identity) {
36
+ throw new plugins.typedrequest.TypedResponseError('No identity provided');
37
+ }
38
+ const passed = await adminHandler.validIdentityGuard.exec({ identity: dataArg.identity });
39
+ if (!passed) {
40
+ throw new plugins.typedrequest.TypedResponseError('Valid identity required');
41
+ }
42
+ }
43
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3VhcmRzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vdHMvb3Bzc2VydmVyL2hlbHBlcnMvZ3VhcmRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sa0JBQWtCLENBQUM7QUFFNUMsT0FBTyxLQUFLLFVBQVUsTUFBTSxpQ0FBaUMsQ0FBQztBQUU5RDs7Ozs7O0dBTUc7QUFDSCxNQUFNLENBQUMsS0FBSyxVQUFVLFVBQVUsQ0FDOUIsUUFBYSxFQUNiLEtBQWtDLEVBQ2xDLE9BQVU7SUFFVixNQUFNLE1BQU0sR0FBRyxNQUFNLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDekMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxVQUFVLEdBQUcsTUFBTSxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3RELE1BQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsSUFBSSxvQkFBb0IsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7QUFDSCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLEtBQUssVUFBVSxvQkFBb0IsQ0FDeEMsWUFBMEIsRUFDMUIsT0FBaUQ7SUFFakQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQzVFLENBQUM7SUFFRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFlBQVksQ0FBQyxrQkFBa0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7SUFDMUYsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ1osTUFBTSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsdUJBQXVCLENBQUMsQ0FBQztJQUM3RSxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxLQUFLLFVBQVUsb0JBQW9CLENBQ3hDLFlBQTBCLEVBQzFCLE9BQWlEO0lBRWpELElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDdEIsTUFBTSxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsa0JBQWtCLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBRUQsTUFBTSxNQUFNLEdBQUcsTUFBTSxZQUFZLENBQUMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLE9BQU8sQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBQzFGLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztRQUNaLE1BQU0sSUFBSSxPQUFPLENBQUMsWUFBWSxDQUFDLGtCQUFrQixDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDL0UsQ0FBQztBQUNILENBQUMifQ==
@@ -0,0 +1 @@
1
+ export * from './classes.opsserver.js';
@@ -0,0 +1,2 @@
1
+ export * from './classes.opsserver.js';
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9vcHNzZXJ2ZXIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyx3QkFBd0IsQ0FBQyJ9