@serve.zone/dcrouter 11.10.4 → 11.10.7

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 (76) hide show
  1. package/dist_serve/bundle.js +5102 -5102
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/cache/classes.cache.cleaner.js +1 -1
  4. package/dist_ts/cache/classes.cached.document.js +1 -1
  5. package/dist_ts/cache/classes.cachedb.js +1 -1
  6. package/dist_ts/cache/documents/classes.cached.email.js +1 -1
  7. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +1 -1
  8. package/dist_ts/classes.dcrouter.js +3 -3
  9. package/dist_ts/config/classes.route-config-manager.d.ts +1 -1
  10. package/dist_ts/config/validator.js +1 -1
  11. package/dist_ts/errors/base.errors.js +2 -2
  12. package/dist_ts/monitoring/classes.metricsmanager.d.ts +6 -1
  13. package/dist_ts/monitoring/classes.metricsmanager.js +1 -1
  14. package/dist_ts/opsserver/classes.opsserver.js +2 -2
  15. package/dist_ts/opsserver/handlers/admin.handler.js +1 -1
  16. package/dist_ts/opsserver/handlers/certificate.handler.js +1 -1
  17. package/dist_ts/opsserver/handlers/radius.handler.js +1 -1
  18. package/dist_ts/opsserver/handlers/stats.handler.js +1 -1
  19. package/dist_ts/radius/classes.accounting.manager.js +1 -1
  20. package/dist_ts/radius/classes.radius.server.js +1 -1
  21. package/dist_ts/radius/classes.vlan.manager.js +1 -1
  22. package/dist_ts/security/classes.contentscanner.js +3 -3
  23. package/dist_ts/security/classes.ipreputationchecker.js +4 -4
  24. package/dist_ts/security/classes.securitylogger.js +5 -3
  25. package/dist_ts/sms/classes.smsservice.js +2 -2
  26. package/dist_ts/storage/classes.storagemanager.d.ts +1 -1
  27. package/dist_ts/storage/classes.storagemanager.js +2 -4
  28. package/dist_ts_web/00_commitinfo_data.js +1 -1
  29. package/dist_ts_web/appstate.js +9 -6
  30. package/dist_ts_web/elements/ops-dashboard.js +3 -2
  31. package/dist_ts_web/elements/ops-view-certificates.js +1 -1
  32. package/dist_ts_web/elements/ops-view-config.js +1 -1
  33. package/dist_ts_web/elements/ops-view-emails.js +1 -1
  34. package/dist_ts_web/elements/ops-view-network.js +1 -1
  35. package/dist_ts_web/elements/ops-view-remoteingress.js +1 -1
  36. package/dist_ts_web/router.js +1 -1
  37. package/license +21 -0
  38. package/package.json +15 -15
  39. package/readme.hints.md +1 -1
  40. package/readme.md +1 -1
  41. package/ts/00_commitinfo_data.ts +1 -1
  42. package/ts/cache/classes.cache.cleaner.ts +10 -10
  43. package/ts/cache/classes.cached.document.ts +1 -1
  44. package/ts/cache/classes.cachedb.ts +6 -6
  45. package/ts/cache/documents/classes.cached.email.ts +14 -14
  46. package/ts/cache/documents/classes.cached.ip.reputation.ts +10 -10
  47. package/ts/classes.dcrouter.ts +31 -31
  48. package/ts/config/validator.ts +5 -5
  49. package/ts/errors/base.errors.ts +1 -1
  50. package/ts/monitoring/classes.metricsmanager.ts +3 -3
  51. package/ts/opsserver/classes.opsserver.ts +13 -13
  52. package/ts/opsserver/handlers/admin.handler.ts +1 -1
  53. package/ts/opsserver/handlers/certificate.handler.ts +6 -6
  54. package/ts/opsserver/handlers/radius.handler.ts +4 -4
  55. package/ts/opsserver/handlers/stats.handler.ts +1 -1
  56. package/ts/radius/classes.accounting.manager.ts +10 -10
  57. package/ts/radius/classes.radius.server.ts +2 -2
  58. package/ts/radius/classes.vlan.manager.ts +5 -5
  59. package/ts/readme.md +1 -1
  60. package/ts/security/classes.contentscanner.ts +12 -12
  61. package/ts/security/classes.ipreputationchecker.ts +26 -26
  62. package/ts/security/classes.securitylogger.ts +6 -4
  63. package/ts/sms/classes.smsservice.ts +3 -3
  64. package/ts/storage/classes.storagemanager.ts +23 -25
  65. package/ts_apiclient/readme.md +1 -1
  66. package/ts_web/00_commitinfo_data.ts +1 -1
  67. package/ts_web/appstate.ts +136 -133
  68. package/ts_web/elements/ops-dashboard.ts +15 -14
  69. package/ts_web/elements/ops-view-certificates.ts +10 -10
  70. package/ts_web/elements/ops-view-config.ts +8 -8
  71. package/ts_web/elements/ops-view-emails.ts +2 -2
  72. package/ts_web/elements/ops-view-network.ts +2 -2
  73. package/ts_web/elements/ops-view-remoteingress.ts +6 -6
  74. package/ts_web/readme.md +1 -1
  75. package/ts_web/router.ts +3 -3
  76. /package/{npmextra.json → .smartconfig.json} +0 -0
@@ -215,7 +215,7 @@ export class DcRouter {
215
215
  public emailServer?: UnifiedEmailServer;
216
216
  public radiusServer?: RadiusServer;
217
217
  public storageManager: StorageManager;
218
- public opsServer: OpsServer;
218
+ public opsServer!: OpsServer;
219
219
  public metricsManager?: MetricsManager;
220
220
 
221
221
  // Cache system (smartdata + LocalTsmDb)
@@ -448,7 +448,7 @@ export class DcRouter {
448
448
  }
449
449
 
450
450
  // DNS Server: optional, depends on SmartProxy
451
- if (this.options.dnsNsDomains?.length > 0 && this.options.dnsScopes?.length > 0) {
451
+ if (this.options.dnsNsDomains && this.options.dnsNsDomains.length > 0 && this.options.dnsScopes && this.options.dnsScopes.length > 0) {
452
452
  this.serviceManager.addService(
453
453
  new plugins.taskbuffer.Service('DnsServer')
454
454
  .optional()
@@ -787,7 +787,7 @@ export class DcRouter {
787
787
  eventComms.log(`Attempting DNS-01 via SmartAcme for ${domain}`);
788
788
  eventComms.setSource('smartacme-dns-01');
789
789
  const isWildcardDomain = domain.startsWith('*.');
790
- const cert = await this.smartAcme.getCertificateForDomain(domain, {
790
+ const cert = await this.smartAcme!.getCertificateForDomain(domain, {
791
791
  includeWildcard: !isWildcardDomain,
792
792
  });
793
793
  if (cert.validUntil) {
@@ -806,10 +806,10 @@ export class DcRouter {
806
806
  // Success — clear any backoff
807
807
  await scheduler.clearBackoff(domain);
808
808
  return result;
809
- } catch (err) {
809
+ } catch (err: unknown) {
810
810
  // Record failure for backoff tracking
811
- await scheduler.recordFailure(domain, err.message);
812
- eventComms.warn(`SmartAcme DNS-01 failed for ${domain}: ${err.message}, falling back to http-01`);
811
+ await scheduler.recordFailure(domain, (err as Error).message);
812
+ eventComms.warn(`SmartAcme DNS-01 failed for ${domain}: ${(err as Error).message}, falling back to http-01`);
813
813
  return 'http01';
814
814
  }
815
815
  };
@@ -1248,21 +1248,21 @@ export class DcRouter {
1248
1248
  // Wire delivery events to MetricsManager and logger
1249
1249
  if (this.metricsManager && this.emailServer.deliverySystem) {
1250
1250
  this.emailServer.deliverySystem.on('deliveryStart', (item: any) => {
1251
- this.metricsManager.trackEmailReceived(item?.from);
1251
+ this.metricsManager!.trackEmailReceived(item?.from);
1252
1252
  logger.log('info', `Email delivery started: ${item?.from} → ${item?.to}`, { zone: 'email' });
1253
1253
  });
1254
1254
  this.emailServer.deliverySystem.on('deliverySuccess', (item: any) => {
1255
- this.metricsManager.trackEmailSent(item?.to);
1255
+ this.metricsManager!.trackEmailSent(item?.to);
1256
1256
  logger.log('info', `Email delivered to ${item?.to}`, { zone: 'email' });
1257
1257
  });
1258
1258
  this.emailServer.deliverySystem.on('deliveryFailed', (item: any, error: any) => {
1259
- this.metricsManager.trackEmailFailed(item?.to, error?.message);
1259
+ this.metricsManager!.trackEmailFailed(item?.to, error?.message);
1260
1260
  logger.log('warn', `Email delivery failed to ${item?.to}: ${error?.message}`, { zone: 'email' });
1261
1261
  });
1262
1262
  }
1263
1263
  if (this.metricsManager && this.emailServer) {
1264
1264
  this.emailServer.on('bounceProcessed', () => {
1265
- this.metricsManager.trackEmailBounced();
1265
+ this.metricsManager!.trackEmailBounced();
1266
1266
  logger.log('warn', 'Email bounce processed', { zone: 'email' });
1267
1267
  });
1268
1268
  }
@@ -1305,12 +1305,12 @@ export class DcRouter {
1305
1305
  }
1306
1306
 
1307
1307
  logger.log('info', 'All unified email components stopped');
1308
- } catch (error) {
1309
- logger.log('error', `Error stopping unified email components: ${error.message}`);
1308
+ } catch (error: unknown) {
1309
+ logger.log('error', `Error stopping unified email components: ${(error as Error).message}`);
1310
1310
  throw error;
1311
1311
  }
1312
1312
  }
1313
-
1313
+
1314
1314
  /**
1315
1315
  * Update domain rules for email routing
1316
1316
  * @param rules New domain rules to apply
@@ -1468,7 +1468,7 @@ export class DcRouter {
1468
1468
  this.dnsServer.on('query', (event: plugins.smartdns.dnsServerMod.IDnsQueryCompletedEvent) => {
1469
1469
  // Metrics tracking
1470
1470
  for (const question of event.questions) {
1471
- this.metricsManager.trackDnsQuery(
1471
+ this.metricsManager?.trackDnsQuery(
1472
1472
  question.type,
1473
1473
  question.name,
1474
1474
  false,
@@ -1553,8 +1553,8 @@ export class DcRouter {
1553
1553
  // Use the built-in socket handler from smartdns
1554
1554
  // This handles HTTP/2, DoH protocol, etc.
1555
1555
  await (this.dnsServer as any).handleHttpsSocket(socket);
1556
- } catch (error) {
1557
- logger.log('error', `DNS socket handler error: ${error.message}`);
1556
+ } catch (error: unknown) {
1557
+ logger.log('error', `DNS socket handler error: ${(error as Error).message}`);
1558
1558
  if (!socket.destroyed) {
1559
1559
  socket.destroy();
1560
1560
  }
@@ -1695,14 +1695,14 @@ export class DcRouter {
1695
1695
  } else {
1696
1696
  logger.log('warn', `Invalid DKIM record structure in ${file}`);
1697
1697
  }
1698
- } catch (error) {
1699
- logger.log('error', `Failed to load DKIM record from ${file}: ${error.message}`);
1698
+ } catch (error: unknown) {
1699
+ logger.log('error', `Failed to load DKIM record from ${file}: ${(error as Error).message}`);
1700
1700
  }
1701
1701
  }
1702
- } catch (error) {
1703
- logger.log('error', `Failed to load DKIM records: ${error.message}`);
1702
+ } catch (error: unknown) {
1703
+ logger.log('error', `Failed to load DKIM records: ${(error as Error).message}`);
1704
1704
  }
1705
-
1705
+
1706
1706
  return records;
1707
1707
  }
1708
1708
 
@@ -1734,11 +1734,11 @@ export class DcRouter {
1734
1734
  // This ensures keys are ready even if DNS mode changes later
1735
1735
  await dkimCreator.handleDKIMKeysForDomain(domainConfig.domain);
1736
1736
  logger.log('info', `DKIM keys initialized for ${domainConfig.domain}`);
1737
- } catch (error) {
1738
- logger.log('error', `Failed to initialize DKIM for ${domainConfig.domain}: ${error.message}`);
1737
+ } catch (error: unknown) {
1738
+ logger.log('error', `Failed to initialize DKIM for ${domainConfig.domain}: ${(error as Error).message}`);
1739
1739
  }
1740
1740
  }
1741
-
1741
+
1742
1742
  logger.log('info', 'DKIM initialization complete');
1743
1743
  }
1744
1744
 
@@ -1779,10 +1779,10 @@ export class DcRouter {
1779
1779
  } else {
1780
1780
  logger.log('warn', 'Could not auto-discover public IPv4 address');
1781
1781
  }
1782
- } catch (error) {
1783
- logger.log('error', `Failed to auto-discover public IP: ${error.message}`);
1782
+ } catch (error: unknown) {
1783
+ logger.log('error', `Failed to auto-discover public IP: ${(error as Error).message}`);
1784
1784
  }
1785
-
1785
+
1786
1786
  if (!publicIp) {
1787
1787
  logger.log('warn', 'No public IP available. Nameserver A records require either proxyIps, publicIp, or successful auto-discovery.');
1788
1788
  }
@@ -1876,8 +1876,8 @@ export class DcRouter {
1876
1876
  }
1877
1877
 
1878
1878
  return null;
1879
- } catch (error) {
1880
- logger.log('warn', `Failed to detect public IP: ${error.message}`);
1879
+ } catch (error: unknown) {
1880
+ logger.log('warn', `Failed to detect public IP: ${(error as Error).message}`);
1881
1881
  return null;
1882
1882
  }
1883
1883
  }
@@ -1911,8 +1911,8 @@ export class DcRouter {
1911
1911
  const keyPem = plugins.fs.readFileSync(riCfg.tls.keyPath, 'utf8');
1912
1912
  tlsConfig = { certPem, keyPem };
1913
1913
  logger.log('info', 'Using explicit TLS cert/key for RemoteIngress tunnel');
1914
- } catch (err) {
1915
- logger.log('warn', `Failed to read RemoteIngress TLS cert/key files: ${err.message}`);
1914
+ } catch (err: unknown) {
1915
+ logger.log('warn', `Failed to read RemoteIngress TLS cert/key files: ${(err as Error).message}`);
1916
1916
  }
1917
1917
  }
1918
1918
 
@@ -170,7 +170,7 @@ export class ConfigValidator {
170
170
  } else if (rules.items.schema && itemType === 'object') {
171
171
  const itemResult = this.validate(value[i], rules.items.schema);
172
172
  if (!itemResult.valid) {
173
- errors.push(...itemResult.errors.map(err => `${key}[${i}].${err}`));
173
+ errors.push(...itemResult.errors!.map(err => `${key}[${i}].${err}`));
174
174
  }
175
175
  }
176
176
  }
@@ -181,7 +181,7 @@ export class ConfigValidator {
181
181
  if (rules.schema) {
182
182
  const nestedResult = this.validate(value, rules.schema);
183
183
  if (!nestedResult.valid) {
184
- errors.push(...nestedResult.errors.map(err => `${key}.${err}`));
184
+ errors.push(...nestedResult.errors!.map(err => `${key}.${err}`));
185
185
  }
186
186
  validatedConfig[key] = nestedResult.config;
187
187
  }
@@ -233,8 +233,8 @@ export class ConfigValidator {
233
233
 
234
234
  // Apply defaults to array items
235
235
  if (result[key] && rules.type === 'array' && rules.items && rules.items.schema) {
236
- result[key] = result[key].map(item =>
237
- typeof item === 'object' ? this.applyDefaults(item, rules.items.schema) : item
236
+ result[key] = result[key].map(item =>
237
+ typeof item === 'object' ? this.applyDefaults(item, rules.items!.schema!) : item
238
238
  );
239
239
  }
240
240
  }
@@ -255,7 +255,7 @@ export class ConfigValidator {
255
255
 
256
256
  if (!result.valid) {
257
257
  throw new ValidationError(
258
- `Configuration validation failed: ${result.errors.join(', ')}`,
258
+ `Configuration validation failed: ${result.errors!.join(', ')}`,
259
259
  'CONFIG_VALIDATION_ERROR',
260
260
  { data: { errors: result.errors } }
261
261
  );
@@ -227,7 +227,7 @@ export class PlatformError extends Error {
227
227
  const { retry } = this.context;
228
228
  if (!retry) return false;
229
229
 
230
- return retry.currentRetry < retry.maxRetries;
230
+ return (retry.currentRetry ?? 0) < (retry.maxRetries ?? 0);
231
231
  }
232
232
 
233
233
  /**
@@ -296,11 +296,11 @@ export class MetricsManager {
296
296
  const proxyMetrics = this.dcRouter.smartProxy ? this.dcRouter.smartProxy.getMetrics() : null;
297
297
 
298
298
  if (!proxyMetrics) {
299
- return [];
299
+ return [] as Array<{ type: string; count: number; source: string; lastActivity: Date }>;
300
300
  }
301
-
301
+
302
302
  const connectionsByRoute = proxyMetrics.connections.byRoute();
303
- const connectionInfo = [];
303
+ const connectionInfo: Array<{ type: string; count: number; source: string; lastActivity: Date }> = [];
304
304
 
305
305
  for (const [routeName, count] of connectionsByRoute) {
306
306
  connectionInfo.push({
@@ -7,7 +7,7 @@ import { requireValidIdentity, requireAdminIdentity } from './helpers/guards.js'
7
7
 
8
8
  export class OpsServer {
9
9
  public dcRouterRef: DcRouter;
10
- public server: plugins.typedserver.utilityservers.UtilityWebsiteServer;
10
+ public server!: plugins.typedserver.utilityservers.UtilityWebsiteServer;
11
11
 
12
12
  // Main TypedRouter — unauthenticated endpoints (login/logout/verify) and own-auth handlers
13
13
  public typedrouter = new plugins.typedrequest.TypedRouter();
@@ -17,17 +17,17 @@ export class OpsServer {
17
17
  public adminRouter = new plugins.typedrequest.TypedRouter<{ request: { identity: interfaces.data.IIdentity } }>();
18
18
 
19
19
  // Handler instances
20
- public adminHandler: handlers.AdminHandler;
21
- private configHandler: handlers.ConfigHandler;
22
- private logsHandler: handlers.LogsHandler;
23
- private securityHandler: handlers.SecurityHandler;
24
- private statsHandler: handlers.StatsHandler;
25
- private radiusHandler: handlers.RadiusHandler;
26
- private emailOpsHandler: handlers.EmailOpsHandler;
27
- private certificateHandler: handlers.CertificateHandler;
28
- private remoteIngressHandler: handlers.RemoteIngressHandler;
29
- private routeManagementHandler: handlers.RouteManagementHandler;
30
- private apiTokenHandler: handlers.ApiTokenHandler;
20
+ public adminHandler!: handlers.AdminHandler;
21
+ private configHandler!: handlers.ConfigHandler;
22
+ private logsHandler!: handlers.LogsHandler;
23
+ private securityHandler!: handlers.SecurityHandler;
24
+ private statsHandler!: handlers.StatsHandler;
25
+ private radiusHandler!: handlers.RadiusHandler;
26
+ private emailOpsHandler!: handlers.EmailOpsHandler;
27
+ private certificateHandler!: handlers.CertificateHandler;
28
+ private remoteIngressHandler!: handlers.RemoteIngressHandler;
29
+ private routeManagementHandler!: handlers.RouteManagementHandler;
30
+ private apiTokenHandler!: handlers.ApiTokenHandler;
31
31
 
32
32
  constructor(dcRouterRefArg: DcRouter) {
33
33
  this.dcRouterRef = dcRouterRefArg;
@@ -39,7 +39,7 @@ export class OpsServer {
39
39
  public async start() {
40
40
  this.server = new plugins.typedserver.utilityservers.UtilityWebsiteServer({
41
41
  domain: 'localhost',
42
- feedMetadata: null,
42
+ feedMetadata: undefined,
43
43
  serveDir: paths.distServe,
44
44
  });
45
45
 
@@ -12,7 +12,7 @@ export class AdminHandler {
12
12
  public typedrouter = new plugins.typedrequest.TypedRouter();
13
13
 
14
14
  // JWT instance
15
- public smartjwtInstance: plugins.smartjwt.SmartJwt<IJwtData>;
15
+ public smartjwtInstance!: plugins.smartjwt.SmartJwt<IJwtData>;
16
16
 
17
17
  // Simple in-memory user storage (in production, use proper database)
18
18
  private users = new Map<string, {
@@ -311,8 +311,8 @@ export class CertificateHandler {
311
311
  }
312
312
  }
313
313
  return { success: true, message: `Certificate reprovisioning triggered for route '${routeName}'` };
314
- } catch (err) {
315
- return { success: false, message: err.message || 'Failed to reprovision certificate' };
314
+ } catch (err: unknown) {
315
+ return { success: false, message: (err as Error).message || 'Failed to reprovision certificate' };
316
316
  }
317
317
  }
318
318
 
@@ -340,8 +340,8 @@ export class CertificateHandler {
340
340
  try {
341
341
  await dcRouter.smartAcme.getCertificateForDomain(domain);
342
342
  return { success: true, message: `Certificate reprovisioning triggered for domain '${domain}'` };
343
- } catch (err) {
344
- return { success: false, message: err.message || `Failed to reprovision certificate for ${domain}` };
343
+ } catch (err: unknown) {
344
+ return { success: false, message: (err as Error).message || `Failed to reprovision certificate for ${domain}` };
345
345
  }
346
346
  }
347
347
 
@@ -351,8 +351,8 @@ export class CertificateHandler {
351
351
  try {
352
352
  await smartProxy.provisionCertificate(routeNames[0]);
353
353
  return { success: true, message: `Certificate reprovisioning triggered for domain '${domain}' via route '${routeNames[0]}'` };
354
- } catch (err) {
355
- return { success: false, message: err.message || `Failed to reprovision certificate for ${domain}` };
354
+ } catch (err: unknown) {
355
+ return { success: false, message: (err as Error).message || `Failed to reprovision certificate for ${domain}` };
356
356
  }
357
357
  }
358
358
 
@@ -52,8 +52,8 @@ export class RadiusHandler {
52
52
  try {
53
53
  await radiusServer.addClient(dataArg.client);
54
54
  return { success: true };
55
- } catch (error) {
56
- return { success: false, message: error.message };
55
+ } catch (error: unknown) {
56
+ return { success: false, message: (error as Error).message };
57
57
  }
58
58
  }
59
59
  )
@@ -144,8 +144,8 @@ export class RadiusHandler {
144
144
  updatedAt: mapping.updatedAt,
145
145
  },
146
146
  };
147
- } catch (error) {
148
- return { success: false, message: error.message };
147
+ } catch (error: unknown) {
148
+ return { success: false, message: (error as Error).message };
149
149
  }
150
150
  }
151
151
  )
@@ -279,7 +279,7 @@ export class StatsHandler {
279
279
  if (sections.network && this.opsServerRef.dcRouterRef.metricsManager) {
280
280
  promises.push(
281
281
  (async () => {
282
- const stats = await this.opsServerRef.dcRouterRef.metricsManager.getNetworkStats();
282
+ const stats = await this.opsServerRef.dcRouterRef.metricsManager!.getNetworkStats();
283
283
  const serverStats = await this.collectServerStats();
284
284
 
285
285
  // Build per-IP bandwidth lookup from throughputByIP
@@ -518,8 +518,8 @@ export class AccountingManager {
518
518
  if (deletedCount > 0) {
519
519
  logger.log('info', `Cleaned up ${deletedCount} old accounting sessions`);
520
520
  }
521
- } catch (error) {
522
- logger.log('error', `Failed to cleanup old sessions: ${error.message}`);
521
+ } catch (error: unknown) {
522
+ logger.log('error', `Failed to cleanup old sessions: ${(error as Error).message}`);
523
523
  }
524
524
 
525
525
  return deletedCount;
@@ -582,8 +582,8 @@ export class AccountingManager {
582
582
  // Ignore individual errors
583
583
  }
584
584
  }
585
- } catch (error) {
586
- logger.log('warn', `Failed to load active sessions: ${error.message}`);
585
+ } catch (error: unknown) {
586
+ logger.log('warn', `Failed to load active sessions: ${(error as Error).message}`);
587
587
  }
588
588
  }
589
589
 
@@ -598,8 +598,8 @@ export class AccountingManager {
598
598
  const key = `${this.config.storagePrefix}/active/${session.sessionId}.json`;
599
599
  try {
600
600
  await this.storageManager.setJSON(key, session);
601
- } catch (error) {
602
- logger.log('error', `Failed to persist session ${session.sessionId}: ${error.message}`);
601
+ } catch (error: unknown) {
602
+ logger.log('error', `Failed to persist session ${session.sessionId}: ${(error as Error).message}`);
603
603
  }
604
604
  }
605
605
 
@@ -620,8 +620,8 @@ export class AccountingManager {
620
620
  const date = new Date(session.endTime);
621
621
  const archiveKey = `${this.config.storagePrefix}/archive/${date.getFullYear()}/${String(date.getMonth() + 1).padStart(2, '0')}/${String(date.getDate()).padStart(2, '0')}/${session.sessionId}.json`;
622
622
  await this.storageManager.setJSON(archiveKey, session);
623
- } catch (error) {
624
- logger.log('error', `Failed to archive session ${session.sessionId}: ${error.message}`);
623
+ } catch (error: unknown) {
624
+ logger.log('error', `Failed to archive session ${session.sessionId}: ${(error as Error).message}`);
625
625
  }
626
626
  }
627
627
 
@@ -653,8 +653,8 @@ export class AccountingManager {
653
653
  // Ignore individual errors
654
654
  }
655
655
  }
656
- } catch (error) {
657
- logger.log('warn', `Failed to get archived sessions: ${error.message}`);
656
+ } catch (error: unknown) {
657
+ logger.log('warn', `Failed to get archived sessions: ${(error as Error).message}`);
658
658
  }
659
659
 
660
660
  return sessions;
@@ -310,8 +310,8 @@ export class RadiusServer {
310
310
  default:
311
311
  logger.log('debug', `RADIUS Acct Unknown status type: ${statusType}`);
312
312
  }
313
- } catch (error) {
314
- logger.log('error', `RADIUS accounting error: ${error.message}`);
313
+ } catch (error: unknown) {
314
+ logger.log('error', `RADIUS accounting error: ${(error as Error).message}`);
315
315
  }
316
316
 
317
317
  return { code: plugins.smartradius.ERadiusCode.AccountingResponse };
@@ -104,7 +104,7 @@ export class VlanManager {
104
104
  if (this.normalizedMacCache.size > 10000) {
105
105
  const iterator = this.normalizedMacCache.keys();
106
106
  for (let i = 0; i < 1000; i++) {
107
- this.normalizedMacCache.delete(iterator.next().value);
107
+ this.normalizedMacCache.delete(iterator.next().value!);
108
108
  }
109
109
  }
110
110
 
@@ -348,8 +348,8 @@ export class VlanManager {
348
348
  }
349
349
  logger.log('info', `Loaded ${data.length} VLAN mappings from storage`);
350
350
  }
351
- } catch (error) {
352
- logger.log('warn', `Failed to load VLAN mappings from storage: ${error.message}`);
351
+ } catch (error: unknown) {
352
+ logger.log('warn', `Failed to load VLAN mappings from storage: ${(error as Error).message}`);
353
353
  }
354
354
  }
355
355
 
@@ -364,8 +364,8 @@ export class VlanManager {
364
364
  try {
365
365
  const mappings = Array.from(this.mappings.values());
366
366
  await this.storageManager.setJSON(this.config.storagePrefix, mappings);
367
- } catch (error) {
368
- logger.log('error', `Failed to save VLAN mappings to storage: ${error.message}`);
367
+ } catch (error: unknown) {
368
+ logger.log('error', `Failed to save VLAN mappings to storage: ${(error as Error).message}`);
369
369
  }
370
370
  }
371
371
  }
package/ts/readme.md CHANGED
@@ -136,7 +136,7 @@ Manages the Rust-based RemoteIngressHub lifecycle. Syncs allowed edges, tracks c
136
136
 
137
137
  ## License and Legal Information
138
138
 
139
- This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](../LICENSE) file.
139
+ This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [license](../license) file.
140
140
 
141
141
  **Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
142
142
 
@@ -60,7 +60,7 @@ export enum ThreatCategory {
60
60
  * Content Scanner for detecting malicious email content
61
61
  */
62
62
  export class ContentScanner {
63
- private static instance: ContentScanner;
63
+ private static instance: ContentScanner | undefined;
64
64
  private scanCache: LRUCache<string, IScanResult>;
65
65
  private options: Required<IContentScannerOptions>;
66
66
 
@@ -258,12 +258,12 @@ export class ContentScanner {
258
258
  }
259
259
 
260
260
  return result;
261
- } catch (error) {
262
- logger.log('error', `Error scanning email: ${error.message}`, {
261
+ } catch (error: unknown) {
262
+ logger.log('error', `Error scanning email: ${(error as Error).message}`, {
263
263
  messageId: email.getMessageId(),
264
- error: error.stack
264
+ error: (error as Error).stack
265
265
  });
266
-
266
+
267
267
  // Return a safe default with error indication
268
268
  return {
269
269
  isClean: true, // Let it pass if scanner fails (configure as desired)
@@ -271,7 +271,7 @@ export class ContentScanner {
271
271
  scannedElements: ['error'],
272
272
  timestamp: Date.now(),
273
273
  threatType: 'scan_error',
274
- threatDetails: `Scan error: ${error.message}`
274
+ threatDetails: `Scan error: ${(error as Error).message}`
275
275
  };
276
276
  }
277
277
  }
@@ -625,8 +625,8 @@ export class ContentScanner {
625
625
  return sample.toString('utf8')
626
626
  .replace(/[\x00-\x09\x0B-\x1F\x7F-\x9F]/g, '') // Remove control chars
627
627
  .replace(/\uFFFD/g, ''); // Remove replacement char
628
- } catch (error) {
629
- logger.log('warn', `Error extracting text from buffer: ${error.message}`);
628
+ } catch (error: unknown) {
629
+ logger.log('warn', `Error extracting text from buffer: ${(error as Error).message}`);
630
630
  return '';
631
631
  }
632
632
  }
@@ -699,10 +699,10 @@ export class ContentScanner {
699
699
  subject: email.subject
700
700
  },
701
701
  success: false,
702
- domain: email.getFromDomain()
702
+ domain: email.getFromDomain() ?? undefined
703
703
  });
704
704
  }
705
-
705
+
706
706
  /**
707
707
  * Log a threat finding to the security logger
708
708
  * @param email The email containing the threat
@@ -722,10 +722,10 @@ export class ContentScanner {
722
722
  subject: email.subject
723
723
  },
724
724
  success: false,
725
- domain: email.getFromDomain()
725
+ domain: email.getFromDomain() ?? undefined
726
726
  });
727
727
  }
728
-
728
+
729
729
  /**
730
730
  * Get threat level description based on score
731
731
  * @param score Threat score