@serve.zone/dcrouter 11.23.5 → 12.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 (128) hide show
  1. package/dist_serve/bundle.js +1052 -939
  2. package/dist_ts/00_commitinfo_data.js +2 -2
  3. package/dist_ts/classes.cert-provision-scheduler.d.ts +6 -8
  4. package/dist_ts/classes.cert-provision-scheduler.js +37 -17
  5. package/dist_ts/classes.dcrouter.d.ts +26 -29
  6. package/dist_ts/classes.dcrouter.js +101 -91
  7. package/dist_ts/classes.storage-cert-manager.d.ts +3 -6
  8. package/dist_ts/classes.storage-cert-manager.js +35 -25
  9. package/dist_ts/config/classes.api-token-manager.d.ts +1 -3
  10. package/dist_ts/config/classes.api-token-manager.js +45 -15
  11. package/dist_ts/config/classes.route-config-manager.d.ts +1 -3
  12. package/dist_ts/config/classes.route-config-manager.js +62 -24
  13. package/dist_ts/{cache → db}/classes.cache.cleaner.d.ts +3 -3
  14. package/dist_ts/db/classes.cache.cleaner.js +130 -0
  15. package/dist_ts/{cache → db}/classes.cached.document.js +1 -1
  16. package/dist_ts/db/classes.dcrouter-db.d.ts +70 -0
  17. package/dist_ts/db/classes.dcrouter-db.js +146 -0
  18. package/dist_ts/db/documents/classes.accounting-session.doc.d.ts +32 -0
  19. package/dist_ts/db/documents/classes.accounting-session.doc.js +214 -0
  20. package/dist_ts/db/documents/classes.acme-cert.doc.d.ts +13 -0
  21. package/dist_ts/db/documents/classes.acme-cert.doc.js +109 -0
  22. package/dist_ts/db/documents/classes.api-token.doc.d.ts +18 -0
  23. package/dist_ts/db/documents/classes.api-token.doc.js +127 -0
  24. package/dist_ts/{cache → db}/documents/classes.cached.email.js +3 -3
  25. package/dist_ts/{cache → db}/documents/classes.cached.ip.reputation.js +3 -3
  26. package/dist_ts/db/documents/classes.cert-backoff.doc.d.ts +11 -0
  27. package/dist_ts/db/documents/classes.cert-backoff.doc.js +97 -0
  28. package/dist_ts/db/documents/classes.proxy-cert.doc.d.ts +12 -0
  29. package/dist_ts/db/documents/classes.proxy-cert.doc.js +103 -0
  30. package/dist_ts/db/documents/classes.remote-ingress-edge.doc.d.ts +17 -0
  31. package/dist_ts/db/documents/classes.remote-ingress-edge.doc.js +130 -0
  32. package/dist_ts/db/documents/classes.route-override.doc.d.ts +10 -0
  33. package/dist_ts/db/documents/classes.route-override.doc.js +91 -0
  34. package/dist_ts/db/documents/classes.stored-route.doc.d.ts +12 -0
  35. package/dist_ts/db/documents/classes.stored-route.doc.js +103 -0
  36. package/dist_ts/db/documents/classes.vlan-mappings.doc.d.ts +15 -0
  37. package/dist_ts/db/documents/classes.vlan-mappings.doc.js +77 -0
  38. package/dist_ts/db/documents/classes.vpn-client.doc.d.ts +26 -0
  39. package/dist_ts/db/documents/classes.vpn-client.doc.js +184 -0
  40. package/dist_ts/db/documents/classes.vpn-server-keys.doc.d.ts +10 -0
  41. package/dist_ts/db/documents/classes.vpn-server-keys.doc.js +94 -0
  42. package/dist_ts/db/documents/index.d.ts +13 -0
  43. package/dist_ts/db/documents/index.js +20 -0
  44. package/dist_ts/{cache → db}/index.d.ts +1 -1
  45. package/dist_ts/db/index.js +9 -0
  46. package/dist_ts/opsserver/handlers/certificate.handler.js +66 -66
  47. package/dist_ts/opsserver/handlers/config.handler.js +14 -15
  48. package/dist_ts/opsserver/handlers/vpn.handler.js +35 -1
  49. package/dist_ts/paths.d.ts +0 -1
  50. package/dist_ts/paths.js +1 -2
  51. package/dist_ts/radius/classes.accounting.manager.d.ts +4 -12
  52. package/dist_ts/radius/classes.accounting.manager.js +80 -93
  53. package/dist_ts/radius/classes.radius.server.d.ts +1 -3
  54. package/dist_ts/radius/classes.radius.server.js +4 -6
  55. package/dist_ts/radius/classes.vlan.manager.d.ts +3 -7
  56. package/dist_ts/radius/classes.vlan.manager.js +21 -28
  57. package/dist_ts/radius/index.d.ts +1 -1
  58. package/dist_ts/radius/index.js +1 -1
  59. package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +3 -5
  60. package/dist_ts/remoteingress/classes.remoteingress-manager.js +41 -21
  61. package/dist_ts/security/classes.ipreputationchecker.d.ts +6 -21
  62. package/dist_ts/security/classes.ipreputationchecker.js +59 -138
  63. package/dist_ts/vpn/classes.vpn-manager.d.ts +37 -22
  64. package/dist_ts/vpn/classes.vpn-manager.js +161 -51
  65. package/dist_ts_interfaces/data/vpn.d.ts +8 -0
  66. package/dist_ts_interfaces/requests/vpn.d.ts +16 -0
  67. package/dist_ts_oci_container/index.js +4 -4
  68. package/dist_ts_web/00_commitinfo_data.js +2 -2
  69. package/dist_ts_web/appstate.d.ts +16 -0
  70. package/dist_ts_web/appstate.js +17 -1
  71. package/dist_ts_web/elements/ops-view-vpn.js +155 -3
  72. package/package.json +3 -3
  73. package/readme.storage.md +55 -91
  74. package/ts/00_commitinfo_data.ts +1 -1
  75. package/ts/classes.cert-provision-scheduler.ts +35 -17
  76. package/ts/classes.dcrouter.ts +129 -125
  77. package/ts/classes.storage-cert-manager.ts +34 -22
  78. package/ts/config/classes.api-token-manager.ts +42 -11
  79. package/ts/config/classes.route-config-manager.ts +56 -21
  80. package/ts/{cache → db}/classes.cache.cleaner.ts +6 -6
  81. package/ts/db/classes.dcrouter-db.ts +179 -0
  82. package/ts/db/documents/classes.accounting-session.doc.ts +106 -0
  83. package/ts/db/documents/classes.acme-cert.doc.ts +41 -0
  84. package/ts/db/documents/classes.api-token.doc.ts +56 -0
  85. package/ts/{cache → db}/documents/classes.cached.email.ts +2 -2
  86. package/ts/{cache → db}/documents/classes.cached.ip.reputation.ts +2 -2
  87. package/ts/db/documents/classes.cert-backoff.doc.ts +35 -0
  88. package/ts/db/documents/classes.proxy-cert.doc.ts +38 -0
  89. package/ts/db/documents/classes.remote-ingress-edge.doc.ts +54 -0
  90. package/ts/db/documents/classes.route-override.doc.ts +32 -0
  91. package/ts/db/documents/classes.stored-route.doc.ts +38 -0
  92. package/ts/db/documents/classes.vlan-mappings.doc.ts +32 -0
  93. package/ts/db/documents/classes.vpn-client.doc.ts +81 -0
  94. package/ts/db/documents/classes.vpn-server-keys.doc.ts +31 -0
  95. package/ts/db/documents/index.ts +24 -0
  96. package/ts/{cache → db}/index.ts +6 -2
  97. package/ts/opsserver/handlers/certificate.handler.ts +67 -65
  98. package/ts/opsserver/handlers/config.handler.ts +13 -14
  99. package/ts/opsserver/handlers/vpn.handler.ts +37 -0
  100. package/ts/paths.ts +0 -1
  101. package/ts/radius/classes.accounting.manager.ts +81 -103
  102. package/ts/radius/classes.radius.server.ts +3 -6
  103. package/ts/radius/classes.vlan.manager.ts +20 -32
  104. package/ts/radius/index.ts +1 -1
  105. package/ts/remoteingress/classes.remoteingress-manager.ts +40 -22
  106. package/ts/security/classes.ipreputationchecker.ts +103 -196
  107. package/ts/vpn/classes.vpn-manager.ts +187 -81
  108. package/ts_web/00_commitinfo_data.ts +1 -1
  109. package/ts_web/appstate.ts +32 -0
  110. package/ts_web/elements/ops-view-vpn.ts +153 -2
  111. package/dist_ts/cache/classes.cache.cleaner.js +0 -130
  112. package/dist_ts/cache/classes.cachedb.d.ts +0 -60
  113. package/dist_ts/cache/classes.cachedb.js +0 -126
  114. package/dist_ts/cache/documents/index.d.ts +0 -2
  115. package/dist_ts/cache/documents/index.js +0 -3
  116. package/dist_ts/cache/index.js +0 -7
  117. package/dist_ts/storage/classes.storagemanager.d.ts +0 -83
  118. package/dist_ts/storage/classes.storagemanager.js +0 -348
  119. package/dist_ts/storage/index.d.ts +0 -1
  120. package/dist_ts/storage/index.js +0 -3
  121. package/ts/cache/classes.cachedb.ts +0 -155
  122. package/ts/cache/documents/index.ts +0 -2
  123. package/ts/storage/classes.storagemanager.ts +0 -404
  124. package/ts/storage/index.ts +0 -2
  125. /package/dist_ts/{cache → db}/classes.cached.document.d.ts +0 -0
  126. /package/dist_ts/{cache → db}/documents/classes.cached.email.d.ts +0 -0
  127. /package/dist_ts/{cache → db}/documents/classes.cached.ip.reputation.d.ts +0 -0
  128. /package/ts/{cache → db}/classes.cached.document.ts +0 -0
@@ -3,7 +3,7 @@
3
3
  */
4
4
  export const commitinfo = {
5
5
  name: '@serve.zone/dcrouter',
6
- version: '11.23.5',
6
+ version: '12.1.0',
7
7
  description: 'A multifaceted routing service handling mail and SMS delivery functions.'
8
8
  };
9
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLFNBQVM7SUFDbEIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMDBfY29tbWl0aW5mb19kYXRhLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHMvMDBfY29tbWl0aW5mb19kYXRhLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOztHQUVHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sVUFBVSxHQUFHO0lBQ3hCLElBQUksRUFBRSxzQkFBc0I7SUFDNUIsT0FBTyxFQUFFLFFBQVE7SUFDakIsV0FBVyxFQUFFLDBFQUEwRTtDQUN4RixDQUFBIn0=
@@ -1,28 +1,26 @@
1
- import type { StorageManager } from './storage/index.js';
2
1
  /**
3
2
  * Manages certificate provisioning scheduling with:
4
- * - Per-domain exponential backoff persisted in StorageManager
3
+ * - Per-domain exponential backoff persisted via CertBackoffDoc
5
4
  *
6
5
  * Note: Serial stagger queue was removed — smartacme v9 handles
7
6
  * concurrency, per-domain dedup, and rate limiting internally.
8
7
  */
9
8
  export declare class CertProvisionScheduler {
10
- private storageManager;
11
9
  private maxBackoffHours;
12
10
  private backoffCache;
13
- constructor(storageManager: StorageManager, options?: {
11
+ constructor(options?: {
14
12
  maxBackoffHours?: number;
15
13
  });
16
14
  /**
17
- * Storage key for a domain's backoff entry
15
+ * Sanitized domain key for storage lookups
18
16
  */
19
- private backoffKey;
17
+ private sanitizeDomain;
20
18
  /**
21
- * Load backoff entry from storage (with in-memory cache)
19
+ * Load backoff entry from database (with in-memory cache)
22
20
  */
23
21
  private loadBackoff;
24
22
  /**
25
- * Save backoff entry to both cache and storage
23
+ * Save backoff entry to both cache and database
26
24
  */
27
25
  private saveBackoff;
28
26
  /**
@@ -1,46 +1,62 @@
1
1
  import { logger } from './logger.js';
2
+ import { CertBackoffDoc } from './db/index.js';
2
3
  /**
3
4
  * Manages certificate provisioning scheduling with:
4
- * - Per-domain exponential backoff persisted in StorageManager
5
+ * - Per-domain exponential backoff persisted via CertBackoffDoc
5
6
  *
6
7
  * Note: Serial stagger queue was removed — smartacme v9 handles
7
8
  * concurrency, per-domain dedup, and rate limiting internally.
8
9
  */
9
10
  export class CertProvisionScheduler {
10
- storageManager;
11
11
  maxBackoffHours;
12
12
  // In-memory backoff cache (mirrors storage for fast lookups)
13
13
  backoffCache = new Map();
14
- constructor(storageManager, options) {
15
- this.storageManager = storageManager;
14
+ constructor(options) {
16
15
  this.maxBackoffHours = options?.maxBackoffHours ?? 24;
17
16
  }
18
17
  /**
19
- * Storage key for a domain's backoff entry
18
+ * Sanitized domain key for storage lookups
20
19
  */
21
- backoffKey(domain) {
22
- const clean = domain.replace(/\*/g, '_wildcard_').replace(/[^a-zA-Z0-9._-]/g, '_');
23
- return `/cert-backoff/${clean}`;
20
+ sanitizeDomain(domain) {
21
+ return domain.replace(/\*/g, '_wildcard_').replace(/[^a-zA-Z0-9._-]/g, '_');
24
22
  }
25
23
  /**
26
- * Load backoff entry from storage (with in-memory cache)
24
+ * Load backoff entry from database (with in-memory cache)
27
25
  */
28
26
  async loadBackoff(domain) {
29
27
  const cached = this.backoffCache.get(domain);
30
28
  if (cached)
31
29
  return cached;
32
- const entry = await this.storageManager.getJSON(this.backoffKey(domain));
33
- if (entry) {
30
+ const sanitized = this.sanitizeDomain(domain);
31
+ const doc = await CertBackoffDoc.findByDomain(sanitized);
32
+ if (doc) {
33
+ const entry = {
34
+ failures: doc.failures,
35
+ lastFailure: doc.lastFailure,
36
+ retryAfter: doc.retryAfter,
37
+ lastError: doc.lastError,
38
+ };
34
39
  this.backoffCache.set(domain, entry);
40
+ return entry;
35
41
  }
36
- return entry;
42
+ return null;
37
43
  }
38
44
  /**
39
- * Save backoff entry to both cache and storage
45
+ * Save backoff entry to both cache and database
40
46
  */
41
47
  async saveBackoff(domain, entry) {
42
48
  this.backoffCache.set(domain, entry);
43
- await this.storageManager.setJSON(this.backoffKey(domain), entry);
49
+ const sanitized = this.sanitizeDomain(domain);
50
+ let doc = await CertBackoffDoc.findByDomain(sanitized);
51
+ if (!doc) {
52
+ doc = new CertBackoffDoc();
53
+ doc.domain = sanitized;
54
+ }
55
+ doc.failures = entry.failures;
56
+ doc.lastFailure = entry.lastFailure;
57
+ doc.retryAfter = entry.retryAfter;
58
+ doc.lastError = entry.lastError || '';
59
+ await doc.save();
44
60
  }
45
61
  /**
46
62
  * Check if a domain is currently in backoff.
@@ -83,10 +99,14 @@ export class CertProvisionScheduler {
83
99
  async clearBackoff(domain) {
84
100
  this.backoffCache.delete(domain);
85
101
  try {
86
- await this.storageManager.delete(this.backoffKey(domain));
102
+ const sanitized = this.sanitizeDomain(domain);
103
+ const doc = await CertBackoffDoc.findByDomain(sanitized);
104
+ if (doc) {
105
+ await doc.delete();
106
+ }
87
107
  }
88
108
  catch {
89
- // Ignore delete errors (key may not exist)
109
+ // Ignore delete errors (doc may not exist)
90
110
  }
91
111
  }
92
112
  /**
@@ -115,4 +135,4 @@ export class CertProvisionScheduler {
115
135
  };
116
136
  }
117
137
  }
118
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jZXJ0LXByb3Zpc2lvbi1zY2hlZHVsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmNlcnQtcHJvdmlzaW9uLXNjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBVXJDOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxzQkFBc0I7SUFDekIsY0FBYyxDQUFpQjtJQUMvQixlQUFlLENBQVM7SUFFaEMsNkRBQTZEO0lBQ3JELFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUV4RCxZQUNFLGNBQThCLEVBQzlCLE9BQXNDO1FBRXRDLElBQUksQ0FBQyxjQUFjLEdBQUcsY0FBYyxDQUFDO1FBQ3JDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssVUFBVSxDQUFDLE1BQWM7UUFDL0IsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLGtCQUFrQixFQUFFLEdBQUcsQ0FBQyxDQUFDO1FBQ25GLE9BQU8saUJBQWlCLEtBQUssRUFBRSxDQUFDO0lBQ2xDLENBQUM7SUFFRDs7T0FFRztJQUNLLEtBQUssQ0FBQyxXQUFXLENBQUMsTUFBYztRQUN0QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QyxJQUFJLE1BQU07WUFBRSxPQUFPLE1BQU0sQ0FBQztRQUUxQixNQUFNLEtBQUssR0FBRyxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUMsT0FBTyxDQUFnQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDeEYsSUFBSSxLQUFLLEVBQUUsQ0FBQztZQUNWLElB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
138
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jZXJ0LXByb3Zpc2lvbi1zY2hlZHVsZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90cy9jbGFzc2VzLmNlcnQtcHJvdmlzaW9uLXNjaGVkdWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3JDLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFTL0M7Ozs7OztHQU1HO0FBQ0gsTUFBTSxPQUFPLHNCQUFzQjtJQUN6QixlQUFlLENBQVM7SUFFaEMsNkRBQTZEO0lBQ3JELFlBQVksR0FBRyxJQUFJLEdBQUcsRUFBeUIsQ0FBQztJQUV4RCxZQUNFLE9BQXNDO1FBRXRDLElBQUksQ0FBQyxlQUFlLEdBQUcsT0FBTyxFQUFFLGVBQWUsSUFBSSxFQUFFLENBQUM7SUFDeEQsQ0FBQztJQUVEOztPQUVHO0lBQ0ssY0FBYyxDQUFDLE1BQWM7UUFDbkMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxZQUFZLENBQUMsQ0FBQyxPQUFPLENBQUMsa0JBQWtCLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDOUUsQ0FBQztJQUVEOztPQUVHO0lBQ0ssS0FBSyxDQUFDLFdBQVcsQ0FBQyxNQUFjO1FBQ3RDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzdDLElBQUksTUFBTTtZQUFFLE9BQU8sTUFBTSxDQUFDO1FBRTFCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUMsTUFBTSxHQUFHLEdBQUcsTUFBTSxjQUFjLENBQUMsWUFBWSxDQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQ3pELElBQUksR0FBRyxFQUFFLENBQUM7WUFDUixNQUFNLEtBQUssR0FBa0I7Z0JBQzNCLFFBQVEsRUFBRSxHQUFHLENBQUMsUUFBUTtn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
@@ -1,9 +1,8 @@
1
1
  import * as plugins from './plugins.js';
2
2
  import * as paths from './paths.js';
3
3
  import { UnifiedEmailServer, type IUnifiedEmailServerOptions, type IEmailRoute } from '@push.rocks/smartmta';
4
- import { StorageManager, type IStorageConfig } from './storage/index.js';
5
4
  import { CertProvisionScheduler } from './classes.cert-provision-scheduler.js';
6
- import { CacheDb, CacheCleaner } from './cache/index.js';
5
+ import { DcRouterDb, CacheCleaner } from './db/index.js';
7
6
  import { OpsServer } from './opsserver/index.js';
8
7
  import { MetricsManager } from './monitoring/index.js';
9
8
  import { RadiusServer, type IRadiusServerConfig } from './radius/index.js';
@@ -94,36 +93,23 @@ export interface IDcRouterOptions {
94
93
  /** Cloudflare API key for DNS challenges */
95
94
  cloudflareApiKey?: string;
96
95
  };
97
- /** Storage configuration */
98
- storage?: IStorageConfig;
99
96
  /**
100
- * Cache database configuration using smartdata and LocalTsmDb
101
- * Provides persistent caching for emails, IP reputation, bounces, etc.
97
+ * Unified database configuration.
98
+ * All persistent data (config, certs, VPN, cache, etc.) is stored via smartdata.
99
+ * If mongoDbUrl is provided, connects to external MongoDB.
100
+ * Otherwise, starts an embedded LocalSmartDb automatically.
102
101
  */
103
- cacheConfig?: {
104
- /** Enable cache database (default: true) */
102
+ dbConfig?: {
103
+ /** Enable database (default: true). Set to false in tests to skip DB startup. */
105
104
  enabled?: boolean;
106
- /** Storage path for TsmDB data (default: ~/.serve.zone/dcrouter/tsmdb) */
105
+ /** External MongoDB connection URL. If absent, uses embedded LocalSmartDb. */
106
+ mongoDbUrl?: string;
107
+ /** Storage path for embedded database data (default: ~/.serve.zone/dcrouter/tsmdb) */
107
108
  storagePath?: string;
108
109
  /** Database name (default: dcrouter) */
109
110
  dbName?: string;
110
- /** Default TTL in days for cached items (default: 30) */
111
- defaultTTLDays?: number;
112
- /** Cleanup interval in hours (default: 1) */
111
+ /** Cache cleanup interval in hours (default: 1) */
113
112
  cleanupIntervalHours?: number;
114
- /** TTL configuration per data type (in days) */
115
- ttlConfig?: {
116
- /** Email cache TTL (default: 30 days) */
117
- emails?: number;
118
- /** IP reputation cache TTL (default: 1 day) */
119
- ipReputation?: number;
120
- /** Bounce records TTL (default: 30 days) */
121
- bounces?: number;
122
- /** DKIM keys TTL (default: 90 days) */
123
- dkimKeys?: number;
124
- /** Suppression list TTL (default: 30 days, can be permanent) */
125
- suppression?: number;
126
- };
127
113
  };
128
114
  /**
129
115
  * RADIUS server configuration for network authentication
@@ -187,6 +173,17 @@ export interface IDcRouterOptions {
187
173
  allowList?: string[];
188
174
  blockList?: string[];
189
175
  };
176
+ /** Forwarding mode: 'socket' (default, userspace NAT), 'bridge' (L2 bridge to host LAN),
177
+ * or 'hybrid' (socket default, bridge for clients with useHostIp=true) */
178
+ forwardingMode?: 'socket' | 'bridge' | 'hybrid';
179
+ /** LAN subnet CIDR for bridge mode (e.g., '192.168.1.0/24') */
180
+ bridgeLanSubnet?: string;
181
+ /** Physical network interface for bridge mode (auto-detected if omitted) */
182
+ bridgePhysicalInterface?: string;
183
+ /** Start of VPN client IP range in LAN subnet (host offset, default: 200) */
184
+ bridgeIpRangeStart?: number;
185
+ /** End of VPN client IP range in LAN subnet (host offset, default: 250) */
186
+ bridgeIpRangeEnd?: number;
190
187
  };
191
188
  }
192
189
  /**
@@ -210,10 +207,10 @@ export declare class DcRouter {
210
207
  dnsServer?: plugins.smartdns.dnsServerMod.DnsServer;
211
208
  emailServer?: UnifiedEmailServer;
212
209
  radiusServer?: RadiusServer;
213
- storageManager: StorageManager;
214
210
  opsServer: OpsServer;
215
211
  metricsManager?: MetricsManager;
216
- cacheDb?: CacheDb;
212
+ storageManager: any;
213
+ dcRouterDb?: DcRouterDb;
217
214
  cacheCleaner?: CacheCleaner;
218
215
  remoteIngressManager?: RemoteIngressManager;
219
216
  tunnelManager?: TunnelManager;
@@ -257,9 +254,9 @@ export declare class DcRouter {
257
254
  */
258
255
  private logStartupSummary;
259
256
  /**
260
- * Set up the cache database (smartdata + LocalTsmDb)
257
+ * Set up the unified database (smartdata + LocalSmartDb or external MongoDB)
261
258
  */
262
- private setupCacheDb;
259
+ private setupDcRouterDb;
263
260
  /**
264
261
  * Set up SmartProxy with direct configuration and automatic email routes
265
262
  */