@serve.zone/dcrouter 17.1.4 → 17.1.6

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 (49) hide show
  1. package/deno.json +1 -1
  2. package/dist_serve/bundle.js +559 -559
  3. package/dist_ts/00_commitinfo_data.js +1 -1
  4. package/dist_ts/classes.dcrouter.js +9 -3
  5. package/dist_ts/db/documents/classes.ip-intelligence.doc.d.ts +10 -0
  6. package/dist_ts/db/documents/classes.ip-intelligence.doc.js +63 -1
  7. package/dist_ts/dns/classes.dns-server-runtime.d.ts +1 -0
  8. package/dist_ts/dns/classes.dns-server-runtime.js +8 -4
  9. package/dist_ts/dns/manager.dns.js +23 -6
  10. package/dist_ts/email/classes.email-domain.manager.js +27 -15
  11. package/dist_ts/email/classes.mail-dns-sync.d.ts +19 -2
  12. package/dist_ts/email/classes.mail-dns-sync.js +158 -32
  13. package/dist_ts/email/index.d.ts +1 -0
  14. package/dist_ts/email/index.js +2 -1
  15. package/dist_ts/email/mail-dns-status.d.ts +5 -0
  16. package/dist_ts/email/mail-dns-status.js +31 -0
  17. package/dist_ts/monitoring/classes.metricscache.d.ts +2 -0
  18. package/dist_ts/monitoring/classes.metricscache.js +28 -6
  19. package/dist_ts/monitoring/classes.metricsmanager.d.ts +10 -0
  20. package/dist_ts/monitoring/classes.metricsmanager.js +99 -31
  21. package/dist_ts/opsserver/handlers/security.handler.js +24 -6
  22. package/dist_ts/opsserver/handlers/stats.handler.js +2 -3
  23. package/dist_ts/remoteingress/classes.hub-lifecycle.js +2 -2
  24. package/dist_ts/security/classes.security-policy-manager.d.ts +17 -0
  25. package/dist_ts/security/classes.security-policy-manager.js +171 -26
  26. package/dist_ts_interfaces/requests/stats.d.ts +7 -0
  27. package/dist_ts_migrations/index.js +395 -9
  28. package/dist_ts_web/00_commitinfo_data.js +1 -1
  29. package/dist_ts_web/appstate/network.js +11 -2
  30. package/dist_ts_web/appstate/ui.js +1 -8
  31. package/package.json +3 -3
  32. package/ts/00_commitinfo_data.ts +1 -1
  33. package/ts/classes.dcrouter.ts +11 -2
  34. package/ts/db/documents/classes.ip-intelligence.doc.ts +75 -0
  35. package/ts/dns/classes.dns-server-runtime.ts +9 -3
  36. package/ts/dns/manager.dns.ts +22 -5
  37. package/ts/email/classes.email-domain.manager.ts +23 -16
  38. package/ts/email/classes.mail-dns-sync.ts +172 -38
  39. package/ts/email/index.ts +1 -0
  40. package/ts/email/mail-dns-status.ts +35 -0
  41. package/ts/monitoring/classes.metricscache.ts +36 -8
  42. package/ts/monitoring/classes.metricsmanager.ts +113 -32
  43. package/ts/opsserver/handlers/security.handler.ts +35 -6
  44. package/ts/opsserver/handlers/stats.handler.ts +1 -2
  45. package/ts/remoteingress/classes.hub-lifecycle.ts +3 -1
  46. package/ts/security/classes.security-policy-manager.ts +193 -26
  47. package/ts_web/00_commitinfo_data.ts +1 -1
  48. package/ts_web/appstate/network.ts +12 -1
  49. package/ts_web/appstate/ui.ts +0 -9
@@ -3,6 +3,7 @@ export * from './classes.email-domain.manager.js';
3
3
  export * from './classes.email-route-builder.js';
4
4
  export * from './classes.mail-dns-sync.js';
5
5
  export * from './mail-dns-txt-policy.js';
6
+ export * from './mail-dns-status.js';
6
7
  export * from './reconcile-mail-dns-singleton.js';
7
8
  export * from './classes.mail-egress-coordinator.js';
8
9
  export * from './classes.mail-edge-eligibility.js';
@@ -3,6 +3,7 @@ export * from './classes.email-domain.manager.js';
3
3
  export * from './classes.email-route-builder.js';
4
4
  export * from './classes.mail-dns-sync.js';
5
5
  export * from './mail-dns-txt-policy.js';
6
+ export * from './mail-dns-status.js';
6
7
  export * from './reconcile-mail-dns-singleton.js';
7
8
  export * from './classes.mail-egress-coordinator.js';
8
9
  export * from './classes.mail-edge-eligibility.js';
@@ -12,4 +13,4 @@ export * from './classes.smartmta-storage-manager.js';
12
13
  export * from './smartmta-storage-policy.js';
13
14
  export * from './classes.workapp-mail-manager.js';
14
15
  export * from './email-dns-records.js';
15
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9lbWFpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxtQ0FBbUMsQ0FBQztBQUNsRCxjQUFjLHNDQUFzQyxDQUFDO0FBQ3JELGNBQWMsb0NBQW9DLENBQUM7QUFDbkQsY0FBYyxxQ0FBcUMsQ0FBQztBQUNwRCxjQUFjLDRDQUE0QyxDQUFDO0FBQzNELGNBQWMsdUNBQXVDLENBQUM7QUFDdEQsY0FBYyw4QkFBOEIsQ0FBQztBQUM3QyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMsd0JBQXdCLENBQUMifQ==
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9lbWFpbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyxrQ0FBa0MsQ0FBQztBQUNqRCxjQUFjLDRCQUE0QixDQUFDO0FBQzNDLGNBQWMsMEJBQTBCLENBQUM7QUFDekMsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLG1DQUFtQyxDQUFDO0FBQ2xELGNBQWMsc0NBQXNDLENBQUM7QUFDckQsY0FBYyxvQ0FBb0MsQ0FBQztBQUNuRCxjQUFjLHFDQUFxQyxDQUFDO0FBQ3BELGNBQWMsNENBQTRDLENBQUM7QUFDM0QsY0FBYyx1Q0FBdUMsQ0FBQztBQUN0RCxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsbUNBQW1DLENBQUM7QUFDbEQsY0FBYyx3QkFBd0IsQ0FBQyJ9
@@ -0,0 +1,5 @@
1
+ import type { IEmailDnsRecordIntent, TDnsRecordStatus } from '../../dist_ts_interfaces/data/email-domain.js';
2
+ /** Project one durable reconciliation intent into the operator-facing DNS status. */
3
+ export declare function projectMailDnsIntentStatus(intent: IEmailDnsRecordIntent | undefined): TDnsRecordStatus;
4
+ /** Aggregate matching intents with deterministic operator-facing precedence. */
5
+ export declare function projectMailDnsIntentAggregateStatus(intents: IEmailDnsRecordIntent[], predicate: (intent: IEmailDnsRecordIntent) => boolean): TDnsRecordStatus;
@@ -0,0 +1,31 @@
1
+ /** Project one durable reconciliation intent into the operator-facing DNS status. */
2
+ export function projectMailDnsIntentStatus(intent) {
3
+ if (!intent)
4
+ return 'unchecked';
5
+ if (intent.verificationOutcome === 'duplicate'
6
+ || intent.verificationOutcome === 'conflict'
7
+ || intent.verificationOutcome === 'invalid'
8
+ || intent.status === 'conflict'
9
+ || intent.status === 'failed')
10
+ return 'invalid';
11
+ if (intent.verificationOutcome === 'missing')
12
+ return 'missing';
13
+ if (intent.verificationOutcome === 'valid' && intent.status === 'valid')
14
+ return 'valid';
15
+ return 'unchecked';
16
+ }
17
+ /** Aggregate matching intents with deterministic operator-facing precedence. */
18
+ export function projectMailDnsIntentAggregateStatus(intents, predicate) {
19
+ const selected = intents.filter(predicate);
20
+ if (selected.length === 0)
21
+ return 'unchecked';
22
+ const statuses = selected.map(projectMailDnsIntentStatus);
23
+ if (statuses.includes('invalid'))
24
+ return 'invalid';
25
+ if (statuses.includes('missing'))
26
+ return 'missing';
27
+ if (statuses.includes('unchecked'))
28
+ return 'unchecked';
29
+ return 'valid';
30
+ }
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFpbC1kbnMtc3RhdHVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZW1haWwvbWFpbC1kbnMtc3RhdHVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLHFGQUFxRjtBQUNyRixNQUFNLFVBQVUsMEJBQTBCLENBQ3hDLE1BQXlDO0lBRXpDLElBQUksQ0FBQyxNQUFNO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDaEMsSUFDRSxNQUFNLENBQUMsbUJBQW1CLEtBQUssV0FBVztXQUN2QyxNQUFNLENBQUMsbUJBQW1CLEtBQUssVUFBVTtXQUN6QyxNQUFNLENBQUMsbUJBQW1CLEtBQUssU0FBUztXQUN4QyxNQUFNLENBQUMsTUFBTSxLQUFLLFVBQVU7V0FDNUIsTUFBTSxDQUFDLE1BQU0sS0FBSyxRQUFRO1FBQzdCLE9BQU8sU0FBUyxDQUFDO0lBQ25CLElBQUksTUFBTSxDQUFDLG1CQUFtQixLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUMvRCxJQUFJLE1BQU0sQ0FBQyxtQkFBbUIsS0FBSyxPQUFPLElBQUksTUFBTSxDQUFDLE1BQU0sS0FBSyxPQUFPO1FBQUUsT0FBTyxPQUFPLENBQUM7SUFDeEYsT0FBTyxXQUFXLENBQUM7QUFDckIsQ0FBQztBQUVELGdGQUFnRjtBQUNoRixNQUFNLFVBQVUsbUNBQW1DLENBQ2pELE9BQWdDLEVBQ2hDLFNBQXFEO0lBRXJELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7SUFDM0MsSUFBSSxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLFdBQVcsQ0FBQztJQUM5QyxNQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7SUFDMUQsSUFBSSxRQUFRLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBQ25ELElBQUksUUFBUSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUM7UUFBRSxPQUFPLFNBQVMsQ0FBQztJQUNuRCxJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDO1FBQUUsT0FBTyxXQUFXLENBQUM7SUFDdkQsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyJ9
@@ -1,9 +1,11 @@
1
1
  export interface ICacheEntry<T> {
2
2
  data: T;
3
3
  timestamp: number;
4
+ ttl: number;
4
5
  }
5
6
  export declare class MetricsCache {
6
7
  private cache;
8
+ private inFlight;
7
9
  private readonly defaultTTL;
8
10
  constructor(defaultTTL?: number);
9
11
  /**
@@ -1,5 +1,6 @@
1
1
  export class MetricsCache {
2
2
  cache = new Map();
3
+ inFlight = new Map();
3
4
  defaultTTL;
4
5
  constructor(defaultTTL = 500) {
5
6
  this.defaultTTL = defaultTTL;
@@ -11,19 +12,38 @@ export class MetricsCache {
11
12
  const cached = this.cache.get(key);
12
13
  const now = Date.now();
13
14
  const actualTTL = ttl ?? this.defaultTTL;
14
- if (cached && (now - cached.timestamp) < actualTTL) {
15
+ if (cached && (now - cached.timestamp) < cached.ttl) {
15
16
  return cached.data;
16
17
  }
18
+ if (cached) {
19
+ this.cache.delete(key);
20
+ }
21
+ const pending = this.inFlight.get(key);
22
+ if (pending) {
23
+ return pending;
24
+ }
17
25
  const result = computeFn();
18
26
  // Handle both sync and async compute functions
19
27
  if (result instanceof Promise) {
20
- return result.then(data => {
21
- this.cache.set(key, { data, timestamp: now });
28
+ let inFlightPromise;
29
+ inFlightPromise = result.then((data) => {
30
+ if (this.inFlight.get(key) === inFlightPromise) {
31
+ this.inFlight.delete(key);
32
+ this.cache.set(key, { data, timestamp: Date.now(), ttl: actualTTL });
33
+ }
22
34
  return data;
35
+ }, (error) => {
36
+ if (this.inFlight.get(key) === inFlightPromise) {
37
+ this.inFlight.delete(key);
38
+ this.cache.delete(key);
39
+ }
40
+ throw error;
23
41
  });
42
+ this.inFlight.set(key, inFlightPromise);
43
+ return inFlightPromise;
24
44
  }
25
45
  else {
26
- this.cache.set(key, { data: result, timestamp: now });
46
+ this.cache.set(key, { data: result, timestamp: now, ttl: actualTTL });
27
47
  return result;
28
48
  }
29
49
  }
@@ -32,12 +52,14 @@ export class MetricsCache {
32
52
  */
33
53
  invalidate(key) {
34
54
  this.cache.delete(key);
55
+ this.inFlight.delete(key);
35
56
  }
36
57
  /**
37
58
  * Clear all cache entries
38
59
  */
39
60
  clear() {
40
61
  this.cache.clear();
62
+ this.inFlight.clear();
41
63
  }
42
64
  /**
43
65
  * Get cache statistics
@@ -54,10 +76,10 @@ export class MetricsCache {
54
76
  cleanup() {
55
77
  const now = Date.now();
56
78
  for (const [key, entry] of this.cache.entries()) {
57
- if (now - entry.timestamp > this.defaultTTL) {
79
+ if (now - entry.timestamp > entry.ttl) {
58
80
  this.cache.delete(key);
59
81
  }
60
82
  }
61
83
  }
62
84
  }
63
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tZXRyaWNzY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9tb25pdG9yaW5nL2NsYXNzZXMubWV0cmljc2NhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUtBLE1BQU0sT0FBTyxZQUFZO0lBQ2YsS0FBSyxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0lBQ25DLFVBQVUsQ0FBUztJQUVwQyxZQUFZLGFBQXFCLEdBQUc7UUFDbEMsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDL0IsQ0FBQztJQUVEOztPQUVHO0lBQ0ksR0FBRyxDQUFJLEdBQVcsRUFBRSxTQUErQixFQUFFLEdBQVk7UUFDdEUsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDbkMsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLE1BQU0sU0FBUyxHQUFHLEdBQUcsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBRXpDLElBQUksTUFBTSxJQUFJLENBQUMsR0FBRyxHQUFHLE1BQU0sQ0FBQyxTQUFTLENBQUMsR0FBRyxTQUFTLEVBQUUsQ0FBQztZQUNuRCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7UUFDckIsQ0FBQztRQUVELE1BQU0sTUFBTSxHQUFHLFNBQVMsRUFBRSxDQUFDO1FBRTNCLCtDQUErQztRQUMvQyxJQUFJLE1BQU0sWUFBWSxPQUFPLEVBQUUsQ0FBQztZQUM5QixPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztnQkFDOUMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztZQUN0RCxPQUFPLE1BQU0sQ0FBQztRQUNoQixDQUFDO0lBQ0gsQ0FBQztJQUVEOztPQUVHO0lBQ0ksVUFBVSxDQUFDLEdBQVc7UUFDM0IsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDekIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSztRQUNWLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7SUFDckIsQ0FBQztJQUVEOztPQUVHO0lBQ0ksUUFBUTtRQUNiLE9BQU87WUFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJO1lBQ3JCLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7U0FDcEMsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNJLE9BQU87UUFDWixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDdkIsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQztZQUNoRCxJQUFJLEdBQUcsR0FBRyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztnQkFDNUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7WUFDekIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0NBQ0YifQ==
85
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5tZXRyaWNzY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9tb25pdG9yaW5nL2NsYXNzZXMubWV0cmljc2NhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQU1BLE1BQU0sT0FBTyxZQUFZO0lBQ2YsS0FBSyxHQUFHLElBQUksR0FBRyxFQUE0QixDQUFDO0lBQzVDLFFBQVEsR0FBRyxJQUFJLEdBQUcsRUFBd0IsQ0FBQztJQUNsQyxVQUFVLENBQVM7SUFFcEMsWUFBWSxhQUFxQixHQUFHO1FBQ2xDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO0lBQy9CLENBQUM7SUFFRDs7T0FFRztJQUNJLEdBQUcsQ0FBSSxHQUFXLEVBQUUsU0FBK0IsRUFBRSxHQUFZO1FBQ3RFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ25DLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN2QixNQUFNLFNBQVMsR0FBRyxHQUFHLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQztRQUV6QyxJQUFJLE1BQU0sSUFBSSxDQUFDLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsRUFBRSxDQUFDO1lBQ3BELE9BQU8sTUFBTSxDQUFDLElBQUksQ0FBQztRQUNyQixDQUFDO1FBRUQsSUFBSSxNQUFNLEVBQUUsQ0FBQztZQUNYLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3pCLENBQUM7UUFFRCxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQTJCLENBQUM7UUFDakUsSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUNaLE9BQU8sT0FBTyxDQUFDO1FBQ2pCLENBQUM7UUFFRCxNQUFNLE1BQU0sR0FBRyxTQUFT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
@@ -6,6 +6,7 @@ export declare class MetricsManager {
6
6
  private smartMetrics;
7
7
  private dcRouter;
8
8
  private resetInterval?;
9
+ private observedIpSamplerInterval?;
9
10
  private metricsCache;
10
11
  private readonly MAX_TOP_DOMAINS;
11
12
  private emailMetrics;
@@ -101,6 +102,7 @@ export declare class MetricsManager {
101
102
  }[];
102
103
  }>;
103
104
  getActiveConnectionSnapshots(options?: plugins.smartproxy.IActiveConnectionSnapshotOptions): Promise<plugins.smartproxy.IActiveConnectionSnapshot[]>;
105
+ getActiveConnectionSnapshotPage(options?: plugins.smartproxy.IActiveConnectionSnapshotOptions): Promise<plugins.smartproxy.IActiveConnectionSnapshotPage>;
104
106
  getConnectionInfo(): Promise<{
105
107
  type: string;
106
108
  count: number;
@@ -118,8 +120,15 @@ export declare class MetricsManager {
118
120
  trackSpamDetected(sender?: string): void;
119
121
  trackMalwareDetected(source?: string): void;
120
122
  trackPhishingDetected(source?: string): void;
123
+ /**
124
+ * Feed IP intelligence from maintained data-plane counters, independently of
125
+ * dashboard reads. Startup order is intentionally tolerated: until both
126
+ * SmartProxy and SecurityPolicyManager exist, the sample is a no-op.
127
+ */
128
+ private sampleObservedIps;
121
129
  getNetworkStats(): Promise<{
122
130
  connectionsByIP: Map<string, number>;
131
+ activeConnections: number;
123
132
  throughputRate: {
124
133
  bytesInPerSecond: number;
125
134
  bytesOutPerSecond: number;
@@ -165,6 +174,7 @@ export declare class MetricsManager {
165
174
  backendProtocols: null;
166
175
  } | {
167
176
  connectionsByIP: Map<string, number>;
177
+ activeConnections: number;
168
178
  throughputRate: {
169
179
  bytesInPerSecond: number;
170
180
  bytesOutPerSecond: number;