@serve.zone/dcrouter 5.0.2 → 5.0.3

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 (202) hide show
  1. package/dist_serve/bundle.js +30539 -0
  2. package/dist_serve/bundle.js.map +7 -0
  3. package/dist_serve/index.html +1 -0
  4. package/dist_ts/00_commitinfo_data.d.ts +8 -0
  5. package/dist_ts/00_commitinfo_data.js +9 -0
  6. package/dist_ts/cache/classes.cache.cleaner.d.ts +47 -0
  7. package/dist_ts/cache/classes.cache.cleaner.js +130 -0
  8. package/dist_ts/cache/classes.cached.document.d.ts +76 -0
  9. package/dist_ts/cache/classes.cached.document.js +100 -0
  10. package/dist_ts/cache/classes.cachedb.d.ts +60 -0
  11. package/dist_ts/cache/classes.cachedb.js +125 -0
  12. package/dist_ts/cache/documents/classes.cached.email.d.ts +125 -0
  13. package/dist_ts/cache/documents/classes.cached.email.js +337 -0
  14. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +119 -0
  15. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +323 -0
  16. package/dist_ts/cache/documents/index.d.ts +2 -0
  17. package/dist_ts/cache/documents/index.js +3 -0
  18. package/dist_ts/cache/index.d.ts +4 -0
  19. package/dist_ts/cache/index.js +7 -0
  20. package/dist_ts/classes.dcrouter.d.ts +276 -0
  21. package/dist_ts/classes.dcrouter.js +1033 -0
  22. package/dist_ts/config/index.d.ts +1 -0
  23. package/dist_ts/config/index.js +3 -0
  24. package/dist_ts/config/validator.d.ts +104 -0
  25. package/dist_ts/config/validator.js +152 -0
  26. package/dist_ts/errors/base.errors.d.ts +224 -0
  27. package/dist_ts/errors/base.errors.js +320 -0
  28. package/dist_ts/errors/error-handler.d.ts +98 -0
  29. package/dist_ts/errors/error-handler.js +282 -0
  30. package/dist_ts/errors/error.codes.d.ts +115 -0
  31. package/dist_ts/errors/error.codes.js +136 -0
  32. package/dist_ts/errors/index.d.ts +54 -0
  33. package/dist_ts/errors/index.js +136 -0
  34. package/dist_ts/errors/reputation.errors.d.ts +183 -0
  35. package/dist_ts/errors/reputation.errors.js +292 -0
  36. package/dist_ts/index.d.ts +6 -0
  37. package/dist_ts/index.js +9 -0
  38. package/dist_ts/logger.d.ts +17 -0
  39. package/dist_ts/logger.js +76 -0
  40. package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
  41. package/dist_ts/monitoring/classes.metricscache.js +63 -0
  42. package/dist_ts/monitoring/classes.metricsmanager.d.ts +112 -0
  43. package/dist_ts/monitoring/classes.metricsmanager.js +446 -0
  44. package/dist_ts/monitoring/index.d.ts +1 -0
  45. package/dist_ts/monitoring/index.js +2 -0
  46. package/dist_ts/opsserver/classes.opsserver.d.ts +22 -0
  47. package/dist_ts/opsserver/classes.opsserver.js +56 -0
  48. package/dist_ts/opsserver/handlers/admin.handler.d.ts +31 -0
  49. package/dist_ts/opsserver/handlers/admin.handler.js +180 -0
  50. package/dist_ts/opsserver/handlers/config.handler.d.ts +9 -0
  51. package/dist_ts/opsserver/handlers/config.handler.js +67 -0
  52. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +12 -0
  53. package/dist_ts/opsserver/handlers/email-ops.handler.js +219 -0
  54. package/dist_ts/opsserver/handlers/index.d.ts +7 -0
  55. package/dist_ts/opsserver/handlers/index.js +8 -0
  56. package/dist_ts/opsserver/handlers/logs.handler.d.ts +10 -0
  57. package/dist_ts/opsserver/handlers/logs.handler.js +122 -0
  58. package/dist_ts/opsserver/handlers/radius.handler.d.ts +8 -0
  59. package/dist_ts/opsserver/handlers/radius.handler.js +296 -0
  60. package/dist_ts/opsserver/handlers/security.handler.d.ts +11 -0
  61. package/dist_ts/opsserver/handlers/security.handler.js +217 -0
  62. package/dist_ts/opsserver/handlers/stats.handler.d.ts +13 -0
  63. package/dist_ts/opsserver/handlers/stats.handler.js +366 -0
  64. package/dist_ts/opsserver/helpers/guards.d.ts +25 -0
  65. package/dist_ts/opsserver/helpers/guards.js +41 -0
  66. package/dist_ts/opsserver/index.d.ts +1 -0
  67. package/dist_ts/opsserver/index.js +2 -0
  68. package/dist_ts/paths.d.ts +14 -0
  69. package/dist_ts/paths.js +39 -0
  70. package/dist_ts/plugins.d.ts +78 -0
  71. package/dist_ts/plugins.js +112 -0
  72. package/dist_ts/radius/classes.accounting.manager.d.ts +218 -0
  73. package/dist_ts/radius/classes.accounting.manager.js +417 -0
  74. package/dist_ts/radius/classes.radius.server.d.ts +171 -0
  75. package/dist_ts/radius/classes.radius.server.js +385 -0
  76. package/dist_ts/radius/classes.vlan.manager.d.ts +128 -0
  77. package/dist_ts/radius/classes.vlan.manager.js +272 -0
  78. package/dist_ts/radius/index.d.ts +13 -0
  79. package/dist_ts/radius/index.js +14 -0
  80. package/dist_ts/security/classes.contentscanner.d.ts +160 -0
  81. package/dist_ts/security/classes.contentscanner.js +637 -0
  82. package/dist_ts/security/classes.ipreputationchecker.d.ts +150 -0
  83. package/dist_ts/security/classes.ipreputationchecker.js +512 -0
  84. package/dist_ts/security/classes.securitylogger.d.ts +140 -0
  85. package/dist_ts/security/classes.securitylogger.js +235 -0
  86. package/dist_ts/security/index.d.ts +3 -0
  87. package/dist_ts/security/index.js +4 -0
  88. package/dist_ts/sms/classes.smsservice.d.ts +15 -0
  89. package/dist_ts/sms/classes.smsservice.js +72 -0
  90. package/dist_ts/sms/config/sms.config.d.ts +93 -0
  91. package/dist_ts/sms/config/sms.config.js +2 -0
  92. package/dist_ts/sms/config/sms.schema.d.ts +5 -0
  93. package/dist_ts/sms/config/sms.schema.js +121 -0
  94. package/dist_ts/sms/index.d.ts +1 -0
  95. package/dist_ts/sms/index.js +2 -0
  96. package/dist_ts/storage/classes.storagemanager.d.ts +82 -0
  97. package/dist_ts/storage/classes.storagemanager.js +344 -0
  98. package/dist_ts/storage/index.d.ts +1 -0
  99. package/dist_ts/storage/index.js +3 -0
  100. package/dist_ts_interfaces/data/auth.d.ts +8 -0
  101. package/dist_ts_interfaces/data/auth.js +2 -0
  102. package/dist_ts_interfaces/data/index.d.ts +2 -0
  103. package/dist_ts_interfaces/data/index.js +3 -0
  104. package/dist_ts_interfaces/data/stats.d.ts +120 -0
  105. package/dist_ts_interfaces/data/stats.js +2 -0
  106. package/{ts_interfaces/index.ts → dist_ts_interfaces/index.d.ts} +1 -5
  107. package/dist_ts_interfaces/index.js +8 -0
  108. package/{ts_interfaces/plugins.ts → dist_ts_interfaces/plugins.d.ts} +1 -5
  109. package/dist_ts_interfaces/plugins.js +4 -0
  110. package/dist_ts_interfaces/requests/admin.d.ts +31 -0
  111. package/dist_ts_interfaces/requests/admin.js +3 -0
  112. package/dist_ts_interfaces/requests/combined.stats.d.ts +24 -0
  113. package/dist_ts_interfaces/requests/combined.stats.js +2 -0
  114. package/dist_ts_interfaces/requests/config.d.ts +13 -0
  115. package/dist_ts_interfaces/requests/config.js +3 -0
  116. package/dist_ts_interfaces/requests/email-ops.d.ts +139 -0
  117. package/dist_ts_interfaces/requests/email-ops.js +3 -0
  118. package/{ts_interfaces/requests/index.ts → dist_ts_interfaces/requests/index.d.ts} +1 -1
  119. package/dist_ts_interfaces/requests/index.js +8 -0
  120. package/dist_ts_interfaces/requests/logs.d.ts +34 -0
  121. package/dist_ts_interfaces/requests/logs.js +4 -0
  122. package/dist_ts_interfaces/requests/radius.d.ts +268 -0
  123. package/dist_ts_interfaces/requests/radius.js +3 -0
  124. package/dist_ts_interfaces/requests/stats.d.ts +131 -0
  125. package/dist_ts_interfaces/requests/stats.js +4 -0
  126. package/dist_ts_web/00_commitinfo_data.d.ts +8 -0
  127. package/dist_ts_web/00_commitinfo_data.js +9 -0
  128. package/dist_ts_web/appstate.d.ts +96 -0
  129. package/dist_ts_web/appstate.js +587 -0
  130. package/dist_ts_web/elements/index.d.ts +8 -0
  131. package/dist_ts_web/elements/index.js +9 -0
  132. package/dist_ts_web/elements/ops-dashboard.d.ts +23 -0
  133. package/dist_ts_web/elements/ops-dashboard.js +271 -0
  134. package/dist_ts_web/elements/ops-view-config.d.ts +17 -0
  135. package/dist_ts_web/elements/ops-view-config.js +414 -0
  136. package/dist_ts_web/elements/ops-view-emails.d.ts +44 -0
  137. package/dist_ts_web/elements/ops-view-emails.js +880 -0
  138. package/dist_ts_web/elements/ops-view-logs.d.ts +13 -0
  139. package/dist_ts_web/elements/ops-view-logs.js +249 -0
  140. package/dist_ts_web/elements/ops-view-network.d.ts +65 -0
  141. package/dist_ts_web/elements/ops-view-network.js +579 -0
  142. package/dist_ts_web/elements/ops-view-overview.d.ts +14 -0
  143. package/dist_ts_web/elements/ops-view-overview.js +344 -0
  144. package/dist_ts_web/elements/ops-view-security.d.ts +21 -0
  145. package/dist_ts_web/elements/ops-view-security.js +568 -0
  146. package/dist_ts_web/elements/shared/css.d.ts +1 -0
  147. package/dist_ts_web/elements/shared/css.js +10 -0
  148. package/dist_ts_web/elements/shared/index.d.ts +2 -0
  149. package/dist_ts_web/elements/shared/index.js +3 -0
  150. package/dist_ts_web/elements/shared/ops-sectionheading.d.ts +5 -0
  151. package/dist_ts_web/elements/shared/ops-sectionheading.js +82 -0
  152. package/dist_ts_web/index.d.ts +1 -0
  153. package/dist_ts_web/index.js +10 -0
  154. package/dist_ts_web/plugins.d.ts +4 -0
  155. package/dist_ts_web/plugins.js +7 -0
  156. package/dist_ts_web/router.d.ts +25 -0
  157. package/dist_ts_web/router.js +165 -0
  158. package/package.json +14 -2
  159. package/ts/00_commitinfo_data.ts +1 -1
  160. package/ts_web/00_commitinfo_data.ts +1 -1
  161. package/.dockerignore +0 -1
  162. package/.gitea/workflows/docker_nottags.yaml +0 -71
  163. package/.gitea/workflows/docker_tags.yaml +0 -106
  164. package/.playwright-mcp/dcrouter-scrollbar-issue.png +0 -0
  165. package/.playwright-mcp/page-2026-02-01T23-10-23-737Z.png +0 -0
  166. package/.playwright-mcp/page-2026-02-01T23-11-19-449Z.png +0 -0
  167. package/.playwright-mcp/page-2026-02-01T23-12-03-126Z.png +0 -0
  168. package/.playwright-mcp/page-2026-02-01T23-12-15-576Z.png +0 -0
  169. package/.vscode/launch.json +0 -11
  170. package/.vscode/settings.json +0 -26
  171. package/Dockerfile +0 -46
  172. package/changelog.md +0 -350
  173. package/cli.child.js +0 -4
  174. package/cli.child.ts +0 -4
  175. package/cli.ts.js +0 -5
  176. package/html/index.html +0 -121
  177. package/test/readme.md +0 -443
  178. package/test/test.config.md +0 -175
  179. package/test/test.contentscanner.ts +0 -265
  180. package/test/test.dcrouter.email.ts +0 -159
  181. package/test/test.dns-server-config.ts +0 -140
  182. package/test/test.dns-socket-handler.ts +0 -148
  183. package/test/test.errors.ts +0 -274
  184. package/test/test.ipreputationchecker.ts +0 -179
  185. package/test/test.jwt-auth.ts +0 -131
  186. package/test/test.opsserver-api.ts +0 -84
  187. package/test/test.protected-endpoint.ts +0 -120
  188. package/test/test.storagemanager.ts +0 -289
  189. package/test_watch/devserver.ts +0 -35
  190. package/ts_interfaces/data/auth.ts +0 -8
  191. package/ts_interfaces/data/index.ts +0 -2
  192. package/ts_interfaces/data/stats.ts +0 -131
  193. package/ts_interfaces/readme.md +0 -205
  194. package/ts_interfaces/requests/admin.ts +0 -46
  195. package/ts_interfaces/requests/combined.stats.ts +0 -25
  196. package/ts_interfaces/requests/config.ts +0 -18
  197. package/ts_interfaces/requests/email-ops.ts +0 -239
  198. package/ts_interfaces/requests/logs.ts +0 -44
  199. package/ts_interfaces/requests/radius.ts +0 -329
  200. package/ts_interfaces/requests/stats.ts +0 -162
  201. package/ts_interfaces/tspublish.json +0 -3
  202. package/tsconfig.json +0 -12
@@ -0,0 +1,323 @@
1
+ var __esDecorate = (this && this.__esDecorate) || function (ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {
2
+ function accept(f) { if (f !== void 0 && typeof f !== "function") throw new TypeError("Function expected"); return f; }
3
+ var kind = contextIn.kind, key = kind === "getter" ? "get" : kind === "setter" ? "set" : "value";
4
+ var target = !descriptorIn && ctor ? contextIn["static"] ? ctor : ctor.prototype : null;
5
+ var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});
6
+ var _, done = false;
7
+ for (var i = decorators.length - 1; i >= 0; i--) {
8
+ var context = {};
9
+ for (var p in contextIn) context[p] = p === "access" ? {} : contextIn[p];
10
+ for (var p in contextIn.access) context.access[p] = contextIn.access[p];
11
+ context.addInitializer = function (f) { if (done) throw new TypeError("Cannot add initializers after decoration has completed"); extraInitializers.push(accept(f || null)); };
12
+ var result = (0, decorators[i])(kind === "accessor" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);
13
+ if (kind === "accessor") {
14
+ if (result === void 0) continue;
15
+ if (result === null || typeof result !== "object") throw new TypeError("Object expected");
16
+ if (_ = accept(result.get)) descriptor.get = _;
17
+ if (_ = accept(result.set)) descriptor.set = _;
18
+ if (_ = accept(result.init)) initializers.unshift(_);
19
+ }
20
+ else if (_ = accept(result)) {
21
+ if (kind === "field") initializers.unshift(_);
22
+ else descriptor[key] = _;
23
+ }
24
+ }
25
+ if (target) Object.defineProperty(target, contextIn.name, descriptor);
26
+ done = true;
27
+ };
28
+ var __runInitializers = (this && this.__runInitializers) || function (thisArg, initializers, value) {
29
+ var useValue = arguments.length > 2;
30
+ for (var i = 0; i < initializers.length; i++) {
31
+ value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);
32
+ }
33
+ return useValue ? value : void 0;
34
+ };
35
+ import * as plugins from '../../plugins.js';
36
+ import { CachedDocument, TTL } from '../classes.cached.document.js';
37
+ import { CacheDb } from '../classes.cachedb.js';
38
+ /**
39
+ * Helper to get the smartdata database instance
40
+ */
41
+ const getDb = () => CacheDb.getInstance().getDb();
42
+ /**
43
+ * CachedIPReputation - Stores IP reputation lookup results
44
+ *
45
+ * Caches the results of IP reputation checks to avoid repeated
46
+ * external API calls. Default TTL is 24 hours.
47
+ */
48
+ let CachedIPReputation = (() => {
49
+ let _classDecorators = [plugins.smartdata.Collection(() => getDb())];
50
+ let _classDescriptor;
51
+ let _classExtraInitializers = [];
52
+ let _classThis;
53
+ let _classSuper = CachedDocument;
54
+ let _createdAt_decorators;
55
+ let _createdAt_initializers = [];
56
+ let _createdAt_extraInitializers = [];
57
+ let _expiresAt_decorators;
58
+ let _expiresAt_initializers = [];
59
+ let _expiresAt_extraInitializers = [];
60
+ let _lastAccessedAt_decorators;
61
+ let _lastAccessedAt_initializers = [];
62
+ let _lastAccessedAt_extraInitializers = [];
63
+ let _ipAddress_decorators;
64
+ let _ipAddress_initializers = [];
65
+ let _ipAddress_extraInitializers = [];
66
+ let _score_decorators;
67
+ let _score_initializers = [];
68
+ let _score_extraInitializers = [];
69
+ let _isSpam_decorators;
70
+ let _isSpam_initializers = [];
71
+ let _isSpam_extraInitializers = [];
72
+ let _isProxy_decorators;
73
+ let _isProxy_initializers = [];
74
+ let _isProxy_extraInitializers = [];
75
+ let _isTor_decorators;
76
+ let _isTor_initializers = [];
77
+ let _isTor_extraInitializers = [];
78
+ let _isVPN_decorators;
79
+ let _isVPN_initializers = [];
80
+ let _isVPN_extraInitializers = [];
81
+ let _country_decorators;
82
+ let _country_initializers = [];
83
+ let _country_extraInitializers = [];
84
+ let _asn_decorators;
85
+ let _asn_initializers = [];
86
+ let _asn_extraInitializers = [];
87
+ let _org_decorators;
88
+ let _org_initializers = [];
89
+ let _org_extraInitializers = [];
90
+ let _blacklists_decorators;
91
+ let _blacklists_initializers = [];
92
+ let _blacklists_extraInitializers = [];
93
+ let _checkCount_decorators;
94
+ let _checkCount_initializers = [];
95
+ let _checkCount_extraInitializers = [];
96
+ let _connectionCount_decorators;
97
+ let _connectionCount_initializers = [];
98
+ let _connectionCount_extraInitializers = [];
99
+ let _emailCount_decorators;
100
+ let _emailCount_initializers = [];
101
+ let _emailCount_extraInitializers = [];
102
+ let _spamCount_decorators;
103
+ let _spamCount_initializers = [];
104
+ let _spamCount_extraInitializers = [];
105
+ var CachedIPReputation = class extends _classSuper {
106
+ static { _classThis = this; }
107
+ static {
108
+ const _metadata = typeof Symbol === "function" && Symbol.metadata ? Object.create(_classSuper[Symbol.metadata] ?? null) : void 0;
109
+ _createdAt_decorators = [plugins.smartdata.svDb()];
110
+ _expiresAt_decorators = [plugins.smartdata.svDb()];
111
+ _lastAccessedAt_decorators = [plugins.smartdata.svDb()];
112
+ _ipAddress_decorators = [plugins.smartdata.unI(), plugins.smartdata.svDb()];
113
+ _score_decorators = [plugins.smartdata.svDb()];
114
+ _isSpam_decorators = [plugins.smartdata.svDb()];
115
+ _isProxy_decorators = [plugins.smartdata.svDb()];
116
+ _isTor_decorators = [plugins.smartdata.svDb()];
117
+ _isVPN_decorators = [plugins.smartdata.svDb()];
118
+ _country_decorators = [plugins.smartdata.svDb()];
119
+ _asn_decorators = [plugins.smartdata.svDb()];
120
+ _org_decorators = [plugins.smartdata.svDb()];
121
+ _blacklists_decorators = [plugins.smartdata.svDb()];
122
+ _checkCount_decorators = [plugins.smartdata.svDb()];
123
+ _connectionCount_decorators = [plugins.smartdata.svDb()];
124
+ _emailCount_decorators = [plugins.smartdata.svDb()];
125
+ _spamCount_decorators = [plugins.smartdata.svDb()];
126
+ __esDecorate(null, null, _createdAt_decorators, { kind: "field", name: "createdAt", static: false, private: false, access: { has: obj => "createdAt" in obj, get: obj => obj.createdAt, set: (obj, value) => { obj.createdAt = value; } }, metadata: _metadata }, _createdAt_initializers, _createdAt_extraInitializers);
127
+ __esDecorate(null, null, _expiresAt_decorators, { kind: "field", name: "expiresAt", static: false, private: false, access: { has: obj => "expiresAt" in obj, get: obj => obj.expiresAt, set: (obj, value) => { obj.expiresAt = value; } }, metadata: _metadata }, _expiresAt_initializers, _expiresAt_extraInitializers);
128
+ __esDecorate(null, null, _lastAccessedAt_decorators, { kind: "field", name: "lastAccessedAt", static: false, private: false, access: { has: obj => "lastAccessedAt" in obj, get: obj => obj.lastAccessedAt, set: (obj, value) => { obj.lastAccessedAt = value; } }, metadata: _metadata }, _lastAccessedAt_initializers, _lastAccessedAt_extraInitializers);
129
+ __esDecorate(null, null, _ipAddress_decorators, { kind: "field", name: "ipAddress", static: false, private: false, access: { has: obj => "ipAddress" in obj, get: obj => obj.ipAddress, set: (obj, value) => { obj.ipAddress = value; } }, metadata: _metadata }, _ipAddress_initializers, _ipAddress_extraInitializers);
130
+ __esDecorate(null, null, _score_decorators, { kind: "field", name: "score", static: false, private: false, access: { has: obj => "score" in obj, get: obj => obj.score, set: (obj, value) => { obj.score = value; } }, metadata: _metadata }, _score_initializers, _score_extraInitializers);
131
+ __esDecorate(null, null, _isSpam_decorators, { kind: "field", name: "isSpam", static: false, private: false, access: { has: obj => "isSpam" in obj, get: obj => obj.isSpam, set: (obj, value) => { obj.isSpam = value; } }, metadata: _metadata }, _isSpam_initializers, _isSpam_extraInitializers);
132
+ __esDecorate(null, null, _isProxy_decorators, { kind: "field", name: "isProxy", static: false, private: false, access: { has: obj => "isProxy" in obj, get: obj => obj.isProxy, set: (obj, value) => { obj.isProxy = value; } }, metadata: _metadata }, _isProxy_initializers, _isProxy_extraInitializers);
133
+ __esDecorate(null, null, _isTor_decorators, { kind: "field", name: "isTor", static: false, private: false, access: { has: obj => "isTor" in obj, get: obj => obj.isTor, set: (obj, value) => { obj.isTor = value; } }, metadata: _metadata }, _isTor_initializers, _isTor_extraInitializers);
134
+ __esDecorate(null, null, _isVPN_decorators, { kind: "field", name: "isVPN", static: false, private: false, access: { has: obj => "isVPN" in obj, get: obj => obj.isVPN, set: (obj, value) => { obj.isVPN = value; } }, metadata: _metadata }, _isVPN_initializers, _isVPN_extraInitializers);
135
+ __esDecorate(null, null, _country_decorators, { kind: "field", name: "country", static: false, private: false, access: { has: obj => "country" in obj, get: obj => obj.country, set: (obj, value) => { obj.country = value; } }, metadata: _metadata }, _country_initializers, _country_extraInitializers);
136
+ __esDecorate(null, null, _asn_decorators, { kind: "field", name: "asn", static: false, private: false, access: { has: obj => "asn" in obj, get: obj => obj.asn, set: (obj, value) => { obj.asn = value; } }, metadata: _metadata }, _asn_initializers, _asn_extraInitializers);
137
+ __esDecorate(null, null, _org_decorators, { kind: "field", name: "org", static: false, private: false, access: { has: obj => "org" in obj, get: obj => obj.org, set: (obj, value) => { obj.org = value; } }, metadata: _metadata }, _org_initializers, _org_extraInitializers);
138
+ __esDecorate(null, null, _blacklists_decorators, { kind: "field", name: "blacklists", static: false, private: false, access: { has: obj => "blacklists" in obj, get: obj => obj.blacklists, set: (obj, value) => { obj.blacklists = value; } }, metadata: _metadata }, _blacklists_initializers, _blacklists_extraInitializers);
139
+ __esDecorate(null, null, _checkCount_decorators, { kind: "field", name: "checkCount", static: false, private: false, access: { has: obj => "checkCount" in obj, get: obj => obj.checkCount, set: (obj, value) => { obj.checkCount = value; } }, metadata: _metadata }, _checkCount_initializers, _checkCount_extraInitializers);
140
+ __esDecorate(null, null, _connectionCount_decorators, { kind: "field", name: "connectionCount", static: false, private: false, access: { has: obj => "connectionCount" in obj, get: obj => obj.connectionCount, set: (obj, value) => { obj.connectionCount = value; } }, metadata: _metadata }, _connectionCount_initializers, _connectionCount_extraInitializers);
141
+ __esDecorate(null, null, _emailCount_decorators, { kind: "field", name: "emailCount", static: false, private: false, access: { has: obj => "emailCount" in obj, get: obj => obj.emailCount, set: (obj, value) => { obj.emailCount = value; } }, metadata: _metadata }, _emailCount_initializers, _emailCount_extraInitializers);
142
+ __esDecorate(null, null, _spamCount_decorators, { kind: "field", name: "spamCount", static: false, private: false, access: { has: obj => "spamCount" in obj, get: obj => obj.spamCount, set: (obj, value) => { obj.spamCount = value; } }, metadata: _metadata }, _spamCount_initializers, _spamCount_extraInitializers);
143
+ __esDecorate(null, _classDescriptor = { value: _classThis }, _classDecorators, { kind: "class", name: _classThis.name, metadata: _metadata }, null, _classExtraInitializers);
144
+ CachedIPReputation = _classThis = _classDescriptor.value;
145
+ if (_metadata) Object.defineProperty(_classThis, Symbol.metadata, { enumerable: true, configurable: true, writable: true, value: _metadata });
146
+ __runInitializers(_classThis, _classExtraInitializers);
147
+ }
148
+ // TTL fields from base class (decorators required on concrete class)
149
+ createdAt = __runInitializers(this, _createdAt_initializers, new Date());
150
+ expiresAt = (__runInitializers(this, _createdAt_extraInitializers), __runInitializers(this, _expiresAt_initializers, new Date(Date.now() + TTL.HOURS_24)));
151
+ lastAccessedAt = (__runInitializers(this, _expiresAt_extraInitializers), __runInitializers(this, _lastAccessedAt_initializers, new Date()));
152
+ /**
153
+ * IP address (unique identifier)
154
+ */
155
+ ipAddress = (__runInitializers(this, _lastAccessedAt_extraInitializers), __runInitializers(this, _ipAddress_initializers, void 0));
156
+ /**
157
+ * Reputation score (0-100, higher = better)
158
+ */
159
+ score = (__runInitializers(this, _ipAddress_extraInitializers), __runInitializers(this, _score_initializers, void 0));
160
+ /**
161
+ * Whether the IP is flagged as spam source
162
+ */
163
+ isSpam = (__runInitializers(this, _score_extraInitializers), __runInitializers(this, _isSpam_initializers, void 0));
164
+ /**
165
+ * Whether the IP is a known proxy
166
+ */
167
+ isProxy = (__runInitializers(this, _isSpam_extraInitializers), __runInitializers(this, _isProxy_initializers, void 0));
168
+ /**
169
+ * Whether the IP is a Tor exit node
170
+ */
171
+ isTor = (__runInitializers(this, _isProxy_extraInitializers), __runInitializers(this, _isTor_initializers, void 0));
172
+ /**
173
+ * Whether the IP is a VPN endpoint
174
+ */
175
+ isVPN = (__runInitializers(this, _isTor_extraInitializers), __runInitializers(this, _isVPN_initializers, void 0));
176
+ /**
177
+ * Country code (ISO 3166-1 alpha-2)
178
+ */
179
+ country = (__runInitializers(this, _isVPN_extraInitializers), __runInitializers(this, _country_initializers, void 0));
180
+ /**
181
+ * Autonomous System Number
182
+ */
183
+ asn = (__runInitializers(this, _country_extraInitializers), __runInitializers(this, _asn_initializers, void 0));
184
+ /**
185
+ * Organization name
186
+ */
187
+ org = (__runInitializers(this, _asn_extraInitializers), __runInitializers(this, _org_initializers, void 0));
188
+ /**
189
+ * List of blacklists the IP appears on
190
+ */
191
+ blacklists = (__runInitializers(this, _org_extraInitializers), __runInitializers(this, _blacklists_initializers, void 0));
192
+ /**
193
+ * Number of times this IP has been checked
194
+ */
195
+ checkCount = (__runInitializers(this, _blacklists_extraInitializers), __runInitializers(this, _checkCount_initializers, 0));
196
+ /**
197
+ * Number of connections from this IP
198
+ */
199
+ connectionCount = (__runInitializers(this, _checkCount_extraInitializers), __runInitializers(this, _connectionCount_initializers, 0));
200
+ /**
201
+ * Number of emails received from this IP
202
+ */
203
+ emailCount = (__runInitializers(this, _connectionCount_extraInitializers), __runInitializers(this, _emailCount_initializers, 0));
204
+ /**
205
+ * Number of spam emails from this IP
206
+ */
207
+ spamCount = (__runInitializers(this, _emailCount_extraInitializers), __runInitializers(this, _spamCount_initializers, 0));
208
+ constructor() {
209
+ super();
210
+ __runInitializers(this, _spamCount_extraInitializers);
211
+ this.setTTL(TTL.HOURS_24); // Default 24-hour TTL
212
+ this.blacklists = [];
213
+ this.score = 50; // Default neutral score
214
+ this.isSpam = false;
215
+ this.isProxy = false;
216
+ this.isTor = false;
217
+ this.isVPN = false;
218
+ }
219
+ /**
220
+ * Create from reputation data
221
+ */
222
+ static fromReputationData(ipAddress, data) {
223
+ const cached = new CachedIPReputation();
224
+ cached.ipAddress = ipAddress;
225
+ cached.score = data.score;
226
+ cached.isSpam = data.isSpam;
227
+ cached.isProxy = data.isProxy;
228
+ cached.isTor = data.isTor;
229
+ cached.isVPN = data.isVPN;
230
+ cached.country = data.country || '';
231
+ cached.asn = data.asn || '';
232
+ cached.org = data.org || '';
233
+ cached.blacklists = data.blacklists || [];
234
+ cached.checkCount = 1;
235
+ return cached;
236
+ }
237
+ /**
238
+ * Convert to reputation data object
239
+ */
240
+ toReputationData() {
241
+ this.touch();
242
+ return {
243
+ score: this.score,
244
+ isSpam: this.isSpam,
245
+ isProxy: this.isProxy,
246
+ isTor: this.isTor,
247
+ isVPN: this.isVPN,
248
+ country: this.country,
249
+ asn: this.asn,
250
+ org: this.org,
251
+ blacklists: this.blacklists,
252
+ };
253
+ }
254
+ /**
255
+ * Find by IP address
256
+ */
257
+ static async findByIP(ipAddress) {
258
+ return await CachedIPReputation.getInstance({
259
+ ipAddress,
260
+ });
261
+ }
262
+ /**
263
+ * Find all IPs flagged as spam
264
+ */
265
+ static async findSpamIPs() {
266
+ return await CachedIPReputation.getInstances({
267
+ isSpam: true,
268
+ });
269
+ }
270
+ /**
271
+ * Find IPs with score below threshold
272
+ */
273
+ static async findLowScoreIPs(threshold) {
274
+ return await CachedIPReputation.getInstances({
275
+ score: { $lt: threshold },
276
+ });
277
+ }
278
+ /**
279
+ * Record a connection from this IP
280
+ */
281
+ recordConnection() {
282
+ this.connectionCount++;
283
+ this.touch();
284
+ }
285
+ /**
286
+ * Record an email from this IP
287
+ */
288
+ recordEmail(isSpam = false) {
289
+ this.emailCount++;
290
+ if (isSpam) {
291
+ this.spamCount++;
292
+ }
293
+ this.touch();
294
+ }
295
+ /**
296
+ * Update the reputation data
297
+ */
298
+ updateReputation(data) {
299
+ this.score = data.score;
300
+ this.isSpam = data.isSpam;
301
+ this.isProxy = data.isProxy;
302
+ this.isTor = data.isTor;
303
+ this.isVPN = data.isVPN;
304
+ this.country = data.country || this.country;
305
+ this.asn = data.asn || this.asn;
306
+ this.org = data.org || this.org;
307
+ this.blacklists = data.blacklists || this.blacklists;
308
+ this.checkCount++;
309
+ this.touch();
310
+ // Refresh TTL on update
311
+ this.setTTL(TTL.HOURS_24);
312
+ }
313
+ /**
314
+ * Check if this IP should be blocked
315
+ */
316
+ shouldBlock() {
317
+ return this.isSpam || this.score < 20 || this.blacklists.length > 2;
318
+ }
319
+ };
320
+ return CachedIPReputation = _classThis;
321
+ })();
322
+ export { CachedIPReputation };
323
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5jYWNoZWQuaXAucmVwdXRhdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3RzL2NhY2hlL2RvY3VtZW50cy9jbGFzc2VzLmNhY2hlZC5pcC5yZXB1dGF0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxjQUFjLEVBQUUsR0FBRyxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDcEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWhEOztHQUVHO0FBQ0gsTUFBTSxLQUFLLEdBQUcsR0FBRyxFQUFFLENBQUMsT0FBTyxDQUFDLFdBQVcsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO0FBaUJsRDs7Ozs7R0FLRztJQUVVLGtCQUFrQjs0QkFEOUIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxFQUFFLENBQUM7Ozs7c0JBQ0osY0FBYzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztrQ0FBdEIsU0FBUSxXQUFrQzs7OztxQ0FFdkUsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7cUNBR3hCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFOzBDQUd4QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTtxQ0FNeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFDdkIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7aUNBTXhCLE9BQU8sQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFO2tDQU14QixPQUFPLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRTttQ0FNeEIsT0FBTyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUU7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
@@ -0,0 +1,2 @@
1
+ export * from './classes.cached.email.js';
2
+ export * from './classes.cached.ip.reputation.js';
@@ -0,0 +1,3 @@
1
+ export * from './classes.cached.email.js';
2
+ export * from './classes.cached.ip.reputation.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi90cy9jYWNoZS9kb2N1bWVudHMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLG1DQUFtQyxDQUFDIn0=
@@ -0,0 +1,4 @@
1
+ export * from './classes.cachedb.js';
2
+ export * from './classes.cached.document.js';
3
+ export * from './classes.cache.cleaner.js';
4
+ export * from './documents/index.js';
@@ -0,0 +1,7 @@
1
+ // Core cache infrastructure
2
+ export * from './classes.cachedb.js';
3
+ export * from './classes.cached.document.js';
4
+ export * from './classes.cache.cleaner.js';
5
+ // Document classes
6
+ export * from './documents/index.js';
7
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9jYWNoZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSw0QkFBNEI7QUFDNUIsY0FBYyxzQkFBc0IsQ0FBQztBQUNyQyxjQUFjLDhCQUE4QixDQUFDO0FBQzdDLGNBQWMsNEJBQTRCLENBQUM7QUFFM0MsbUJBQW1CO0FBQ25CLGNBQWMsc0JBQXNCLENBQUMifQ==
@@ -0,0 +1,276 @@
1
+ import * as plugins from './plugins.js';
2
+ import { UnifiedEmailServer, type IUnifiedEmailServerOptions, type IEmailRoute } from '@push.rocks/smartmta';
3
+ import { StorageManager, type IStorageConfig } from './storage/index.js';
4
+ import { CacheDb, CacheCleaner } from './cache/index.js';
5
+ import { OpsServer } from './opsserver/index.js';
6
+ import { MetricsManager } from './monitoring/index.js';
7
+ import { RadiusServer, type IRadiusServerConfig } from './radius/index.js';
8
+ export interface IDcRouterOptions {
9
+ /**
10
+ * Direct SmartProxy configuration - gives full control over HTTP/HTTPS and TCP/SNI traffic
11
+ * This is the preferred way to configure HTTP/HTTPS and general TCP/SNI traffic
12
+ */
13
+ smartProxyConfig?: plugins.smartproxy.ISmartProxyOptions;
14
+ /**
15
+ * Email server configuration
16
+ * This enables all email handling with pattern-based routing
17
+ */
18
+ emailConfig?: IUnifiedEmailServerOptions;
19
+ /**
20
+ * Custom email port configuration
21
+ * Allows configuring specific ports for email handling
22
+ * This overrides the default port mapping in the emailConfig
23
+ */
24
+ emailPortConfig?: {
25
+ /** External to internal port mapping */
26
+ portMapping?: Record<number, number>;
27
+ /** Custom port configuration for specific ports */
28
+ portSettings?: Record<number, any>;
29
+ /** Path to store received emails */
30
+ receivedEmailsPath?: string;
31
+ };
32
+ /** TLS/certificate configuration */
33
+ tls?: {
34
+ /** Contact email for ACME certificates */
35
+ contactEmail: string;
36
+ /** Domain for main certificate */
37
+ domain?: string;
38
+ /** Path to certificate file (if not using auto-provisioning) */
39
+ certPath?: string;
40
+ /** Path to key file (if not using auto-provisioning) */
41
+ keyPath?: string;
42
+ /** Path to CA certificate file (for custom CAs) */
43
+ caPath?: string;
44
+ };
45
+ /**
46
+ * The nameserver domains (e.g., ['ns1.example.com', 'ns2.example.com'])
47
+ * These will automatically get A records pointing to publicIp or proxyIps[0]
48
+ * These are what go in the NS records for ALL domains in dnsScopes
49
+ */
50
+ dnsNsDomains?: string[];
51
+ /**
52
+ * Domains this DNS server is authoritative for (e.g., ['example.com', 'mail.example.org'])
53
+ * NS records will be auto-generated for these domains
54
+ * Any DNS record outside these scopes will trigger a warning
55
+ * Email domains with `internal-dns` mode must be included here
56
+ */
57
+ dnsScopes?: string[];
58
+ /**
59
+ * IPs of proxies that forward traffic to your server (optional)
60
+ * When defined AND useIngressProxy is true, A records with server IP are replaced with proxy IPs
61
+ * If not defined or empty, all A records use the real server IP
62
+ * Helps hide real server IP for security/privacy
63
+ */
64
+ proxyIps?: string[];
65
+ /**
66
+ * Public IP address for nameserver A records (required if proxyIps not set)
67
+ * This is the IP that will be used for the nameserver domains (dnsNsDomains)
68
+ * If proxyIps is set, the first proxy IP will be used instead
69
+ */
70
+ publicIp?: string;
71
+ /**
72
+ * DNS records to register
73
+ * Must be within the defined dnsScopes (or receive warning)
74
+ * Only need A, CNAME, TXT, MX records (NS records auto-generated, SOA handled by smartdns)
75
+ * Can use `useIngressProxy: false` to expose real server IP (defaults to true)
76
+ */
77
+ dnsRecords?: Array<{
78
+ name: string;
79
+ type: 'A' | 'AAAA' | 'CNAME' | 'MX' | 'TXT' | 'NS' | 'SOA';
80
+ value: string;
81
+ ttl?: number;
82
+ useIngressProxy?: boolean;
83
+ }>;
84
+ /** DNS challenge configuration for ACME (optional) */
85
+ dnsChallenge?: {
86
+ /** Cloudflare API key for DNS challenges */
87
+ cloudflareApiKey?: string;
88
+ };
89
+ /** Storage configuration */
90
+ storage?: IStorageConfig;
91
+ /**
92
+ * Cache database configuration using smartdata and LocalTsmDb
93
+ * Provides persistent caching for emails, IP reputation, bounces, etc.
94
+ */
95
+ cacheConfig?: {
96
+ /** Enable cache database (default: true) */
97
+ enabled?: boolean;
98
+ /** Storage path for TsmDB data (default: /etc/dcrouter/tsmdb) */
99
+ storagePath?: string;
100
+ /** Database name (default: dcrouter) */
101
+ dbName?: string;
102
+ /** Default TTL in days for cached items (default: 30) */
103
+ defaultTTLDays?: number;
104
+ /** Cleanup interval in hours (default: 1) */
105
+ cleanupIntervalHours?: number;
106
+ /** TTL configuration per data type (in days) */
107
+ ttlConfig?: {
108
+ /** Email cache TTL (default: 30 days) */
109
+ emails?: number;
110
+ /** IP reputation cache TTL (default: 1 day) */
111
+ ipReputation?: number;
112
+ /** Bounce records TTL (default: 30 days) */
113
+ bounces?: number;
114
+ /** DKIM keys TTL (default: 90 days) */
115
+ dkimKeys?: number;
116
+ /** Suppression list TTL (default: 30 days, can be permanent) */
117
+ suppression?: number;
118
+ };
119
+ };
120
+ /**
121
+ * RADIUS server configuration for network authentication
122
+ * Enables MAC Authentication Bypass (MAB) and VLAN assignment
123
+ */
124
+ radiusConfig?: IRadiusServerConfig;
125
+ }
126
+ /**
127
+ * DcRouter can be run on ingress and egress to and from a datacenter site.
128
+ */
129
+ /**
130
+ * Context passed to HTTP routing rules
131
+ */
132
+ /**
133
+ * Context passed to port proxy (SmartProxy) routing rules
134
+ */
135
+ export interface PortProxyRuleContext {
136
+ proxy: plugins.smartproxy.SmartProxy;
137
+ routes: plugins.smartproxy.IRouteConfig[];
138
+ }
139
+ export declare class DcRouter {
140
+ options: IDcRouterOptions;
141
+ smartProxy?: plugins.smartproxy.SmartProxy;
142
+ dnsServer?: plugins.smartdns.dnsServerMod.DnsServer;
143
+ emailServer?: UnifiedEmailServer;
144
+ radiusServer?: RadiusServer;
145
+ storageManager: StorageManager;
146
+ opsServer: OpsServer;
147
+ metricsManager?: MetricsManager;
148
+ cacheDb?: CacheDb;
149
+ cacheCleaner?: CacheCleaner;
150
+ typedrouter: plugins.typedrequest.TypedRouter;
151
+ private qenv;
152
+ constructor(optionsArg: IDcRouterOptions);
153
+ start(): Promise<void>;
154
+ /**
155
+ * Log comprehensive startup summary
156
+ */
157
+ private logStartupSummary;
158
+ /**
159
+ * Set up the cache database (smartdata + LocalTsmDb)
160
+ */
161
+ private setupCacheDb;
162
+ /**
163
+ * Set up SmartProxy with direct configuration and automatic email routes
164
+ */
165
+ private setupSmartProxy;
166
+ /**
167
+ * Generate SmartProxy routes for email configuration
168
+ */
169
+ private generateEmailRoutes;
170
+ /**
171
+ * Generate SmartProxy routes for DNS configuration
172
+ */
173
+ private generateDnsRoutes;
174
+ /**
175
+ * Check if a domain matches a pattern (including wildcard support)
176
+ * @param domain The domain to check
177
+ * @param pattern The pattern to match against (e.g., "*.example.com")
178
+ * @returns Whether the domain matches the pattern
179
+ */
180
+ private isDomainMatch;
181
+ stop(): Promise<void>;
182
+ /**
183
+ * Update SmartProxy configuration
184
+ * @param config New SmartProxy configuration
185
+ */
186
+ updateSmartProxyConfig(config: plugins.smartproxy.ISmartProxyOptions): Promise<void>;
187
+ /**
188
+ * Set up unified email handling with pattern-based routing
189
+ * This implements the consolidated emailConfig approach
190
+ */
191
+ private setupUnifiedEmailHandling;
192
+ /**
193
+ * Update the unified email configuration
194
+ * @param config New email configuration
195
+ */
196
+ updateEmailConfig(config: IUnifiedEmailServerOptions): Promise<void>;
197
+ /**
198
+ * Stop all unified email components
199
+ */
200
+ private stopUnifiedEmailComponents;
201
+ /**
202
+ * Update domain rules for email routing
203
+ * @param rules New domain rules to apply
204
+ */
205
+ updateEmailRoutes(routes: IEmailRoute[]): Promise<void>;
206
+ /**
207
+ * Get statistics from all components
208
+ */
209
+ getStats(): any;
210
+ /**
211
+ * Register DNS records with the DNS server
212
+ * @param records Array of DNS records to register
213
+ */
214
+ private registerDnsRecords;
215
+ /**
216
+ * Parse DNS record data based on record type
217
+ * @param type DNS record type
218
+ * @param value DNS record value
219
+ * @returns Parsed data for the DNS response
220
+ */
221
+ private parseDnsRecordData;
222
+ /**
223
+ * Set up DNS server with socket handler for DoH
224
+ */
225
+ private setupDnsWithSocketHandler;
226
+ /**
227
+ * Create DNS socket handler for DoH
228
+ */
229
+ private createDnsSocketHandler;
230
+ /**
231
+ * Validate DNS configuration
232
+ */
233
+ private validateDnsConfiguration;
234
+ /**
235
+ * Generate email DNS records for domains with internal-dns mode
236
+ */
237
+ private generateEmailDnsRecords;
238
+ /**
239
+ * Load DKIM records from JSON files
240
+ * Reads all *.dkimrecord.json files from the DNS records directory
241
+ */
242
+ private loadDkimRecords;
243
+ /**
244
+ * Initialize DKIM keys for all configured email domains
245
+ * This ensures DKIM records are available immediately at startup
246
+ */
247
+ private initializeDkimForEmailDomains;
248
+ /**
249
+ * Generate authoritative DNS records (NS only) for all domains in dnsScopes
250
+ * SOA records are now automatically generated by smartdns with primaryNameserver setting
251
+ */
252
+ private generateAuthoritativeRecords;
253
+ /**
254
+ * Extract the base domain from a DNS record name
255
+ */
256
+ private extractDomain;
257
+ /**
258
+ * Apply proxy IP replacement logic to DNS records
259
+ */
260
+ private applyProxyIpReplacement;
261
+ /**
262
+ * Detect the server's public IP address
263
+ */
264
+ private detectServerPublicIp;
265
+ /**
266
+ * Set up RADIUS server for network authentication
267
+ */
268
+ private setupRadiusServer;
269
+ /**
270
+ * Update RADIUS configuration at runtime
271
+ */
272
+ updateRadiusConfig(config: IRadiusServerConfig): Promise<void>;
273
+ }
274
+ export type { IUnifiedEmailServerOptions };
275
+ export type { IRadiusServerConfig };
276
+ export default DcRouter;