@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,344 @@
1
+ import * as plugins from '../plugins.js';
2
+ import { logger } from '../logger.js';
3
+ // Promisify filesystem operations
4
+ const readFile = plugins.util.promisify(plugins.fs.readFile);
5
+ const writeFile = plugins.util.promisify(plugins.fs.writeFile);
6
+ const unlink = plugins.util.promisify(plugins.fs.unlink);
7
+ const rename = plugins.util.promisify(plugins.fs.rename);
8
+ const readdir = plugins.util.promisify(plugins.fs.readdir);
9
+ /**
10
+ * Central storage manager for DcRouter
11
+ * Provides unified key-value storage with multiple backend support
12
+ */
13
+ export class StorageManager {
14
+ backend;
15
+ memoryStore = new Map();
16
+ config;
17
+ fsBasePath;
18
+ constructor(config) {
19
+ this.config = config || {};
20
+ // Check if both fsPath and custom functions are provided
21
+ if (config?.fsPath && (config?.readFunction || config?.writeFunction)) {
22
+ console.warn('⚠️ WARNING: Both fsPath and custom read/write functions are configured.\n' +
23
+ ' Using custom read/write functions. fsPath will be ignored.');
24
+ }
25
+ // Determine backend based on configuration
26
+ if (config?.readFunction && config?.writeFunction) {
27
+ this.backend = 'custom';
28
+ }
29
+ else if (config?.fsPath) {
30
+ // Set up internal read/write functions for filesystem
31
+ this.backend = 'custom'; // Use custom backend with internal functions
32
+ this.fsBasePath = plugins.path.resolve(config.fsPath);
33
+ this.ensureDirectory(this.fsBasePath);
34
+ // Set up internal filesystem read/write functions
35
+ this.config.readFunction = async (key) => {
36
+ return this.fsRead(key);
37
+ };
38
+ this.config.writeFunction = async (key, value) => {
39
+ await this.fsWrite(key, value);
40
+ };
41
+ }
42
+ else {
43
+ this.backend = 'memory';
44
+ this.showMemoryWarning();
45
+ }
46
+ logger.log('info', `StorageManager initialized with ${this.backend} backend`);
47
+ }
48
+ /**
49
+ * Show warning when using memory backend
50
+ */
51
+ showMemoryWarning() {
52
+ console.warn('⚠️ WARNING: StorageManager is using in-memory storage.\n' +
53
+ ' Data will be lost when the process restarts.\n' +
54
+ ' Configure storage.fsPath or storage functions for persistence.');
55
+ }
56
+ /**
57
+ * Ensure directory exists for filesystem backend
58
+ */
59
+ async ensureDirectory(dirPath) {
60
+ try {
61
+ await plugins.fsUtils.ensureDir(dirPath);
62
+ }
63
+ catch (error) {
64
+ logger.log('error', `Failed to create storage directory: ${error.message}`);
65
+ throw error;
66
+ }
67
+ }
68
+ /**
69
+ * Validate and sanitize storage key
70
+ */
71
+ validateKey(key) {
72
+ if (!key || typeof key !== 'string') {
73
+ throw new Error('Storage key must be a non-empty string');
74
+ }
75
+ // Ensure key starts with /
76
+ if (!key.startsWith('/')) {
77
+ key = '/' + key;
78
+ }
79
+ // Remove any dangerous path elements
80
+ key = key.replace(/\.\./g, '').replace(/\/+/g, '/');
81
+ return key;
82
+ }
83
+ /**
84
+ * Convert key to filesystem path
85
+ */
86
+ keyToPath(key) {
87
+ if (!this.fsBasePath) {
88
+ throw new Error('Filesystem base path not configured');
89
+ }
90
+ // Remove leading slash and convert to path
91
+ const relativePath = key.substring(1);
92
+ return plugins.path.join(this.fsBasePath, relativePath);
93
+ }
94
+ /**
95
+ * Internal filesystem read function
96
+ */
97
+ async fsRead(key) {
98
+ const filePath = this.keyToPath(key);
99
+ try {
100
+ const content = await readFile(filePath, 'utf8');
101
+ return content;
102
+ }
103
+ catch (error) {
104
+ if (error.code === 'ENOENT') {
105
+ return null;
106
+ }
107
+ throw error;
108
+ }
109
+ }
110
+ /**
111
+ * Internal filesystem write function
112
+ */
113
+ async fsWrite(key, value) {
114
+ const filePath = this.keyToPath(key);
115
+ const dir = plugins.path.dirname(filePath);
116
+ // Ensure directory exists
117
+ await plugins.fsUtils.ensureDir(dir);
118
+ // Write atomically with temp file
119
+ const tempPath = `${filePath}.tmp`;
120
+ await writeFile(tempPath, value, 'utf8');
121
+ await rename(tempPath, filePath);
122
+ }
123
+ /**
124
+ * Get value by key
125
+ */
126
+ async get(key) {
127
+ key = this.validateKey(key);
128
+ try {
129
+ switch (this.backend) {
130
+ case 'custom': {
131
+ if (!this.config.readFunction) {
132
+ throw new Error('Read function not configured');
133
+ }
134
+ try {
135
+ return await this.config.readFunction(key);
136
+ }
137
+ catch (error) {
138
+ // Assume null if read fails (key doesn't exist)
139
+ return null;
140
+ }
141
+ }
142
+ case 'memory': {
143
+ return this.memoryStore.get(key) || null;
144
+ }
145
+ default:
146
+ throw new Error(`Unknown backend: ${this.backend}`);
147
+ }
148
+ }
149
+ catch (error) {
150
+ logger.log('error', `Storage get error for key ${key}: ${error.message}`);
151
+ throw error;
152
+ }
153
+ }
154
+ /**
155
+ * Set value by key
156
+ */
157
+ async set(key, value) {
158
+ key = this.validateKey(key);
159
+ if (typeof value !== 'string') {
160
+ throw new Error('Storage value must be a string');
161
+ }
162
+ try {
163
+ switch (this.backend) {
164
+ case 'filesystem': {
165
+ const filePath = this.keyToPath(key);
166
+ const dirPath = plugins.path.dirname(filePath);
167
+ // Ensure directory exists
168
+ await plugins.fsUtils.ensureDir(dirPath);
169
+ // Write atomically
170
+ const tempPath = filePath + '.tmp';
171
+ await writeFile(tempPath, value, 'utf8');
172
+ await rename(tempPath, filePath);
173
+ break;
174
+ }
175
+ case 'custom': {
176
+ if (!this.config.writeFunction) {
177
+ throw new Error('Write function not configured');
178
+ }
179
+ await this.config.writeFunction(key, value);
180
+ break;
181
+ }
182
+ case 'memory': {
183
+ this.memoryStore.set(key, value);
184
+ break;
185
+ }
186
+ default:
187
+ throw new Error(`Unknown backend: ${this.backend}`);
188
+ }
189
+ }
190
+ catch (error) {
191
+ logger.log('error', `Storage set error for key ${key}: ${error.message}`);
192
+ throw error;
193
+ }
194
+ }
195
+ /**
196
+ * Delete value by key
197
+ */
198
+ async delete(key) {
199
+ key = this.validateKey(key);
200
+ try {
201
+ switch (this.backend) {
202
+ case 'filesystem': {
203
+ const filePath = this.keyToPath(key);
204
+ try {
205
+ await unlink(filePath);
206
+ }
207
+ catch (error) {
208
+ if (error.code !== 'ENOENT') {
209
+ throw error;
210
+ }
211
+ }
212
+ break;
213
+ }
214
+ case 'custom': {
215
+ // Try to delete by setting empty value
216
+ if (this.config.writeFunction) {
217
+ await this.config.writeFunction(key, '');
218
+ }
219
+ break;
220
+ }
221
+ case 'memory': {
222
+ this.memoryStore.delete(key);
223
+ break;
224
+ }
225
+ default:
226
+ throw new Error(`Unknown backend: ${this.backend}`);
227
+ }
228
+ }
229
+ catch (error) {
230
+ logger.log('error', `Storage delete error for key ${key}: ${error.message}`);
231
+ throw error;
232
+ }
233
+ }
234
+ /**
235
+ * List keys by prefix
236
+ */
237
+ async list(prefix) {
238
+ prefix = prefix ? this.validateKey(prefix) : '/';
239
+ try {
240
+ switch (this.backend) {
241
+ case 'custom': {
242
+ // If we have fsBasePath, this is actually filesystem backend
243
+ if (this.fsBasePath) {
244
+ const basePath = this.keyToPath(prefix);
245
+ const keys = [];
246
+ const walkDir = async (dir, baseDir) => {
247
+ try {
248
+ const entries = await readdir(dir, { withFileTypes: true });
249
+ for (const entry of entries) {
250
+ const fullPath = plugins.path.join(dir, entry.name);
251
+ if (entry.isDirectory()) {
252
+ await walkDir(fullPath, baseDir);
253
+ }
254
+ else if (entry.isFile()) {
255
+ // Convert path back to key
256
+ const relativePath = plugins.path.relative(this.fsBasePath, fullPath);
257
+ const key = '/' + relativePath.replace(/\\/g, '/');
258
+ if (key.startsWith(prefix)) {
259
+ keys.push(key);
260
+ }
261
+ }
262
+ }
263
+ }
264
+ catch (error) {
265
+ if (error.code !== 'ENOENT') {
266
+ throw error;
267
+ }
268
+ }
269
+ };
270
+ await walkDir(basePath, basePath);
271
+ return keys.sort();
272
+ }
273
+ else {
274
+ // True custom backends need to implement their own listing
275
+ logger.log('warn', 'List operation not supported for custom backend');
276
+ return [];
277
+ }
278
+ }
279
+ case 'memory': {
280
+ const keys = [];
281
+ for (const key of this.memoryStore.keys()) {
282
+ if (key.startsWith(prefix)) {
283
+ keys.push(key);
284
+ }
285
+ }
286
+ return keys.sort();
287
+ }
288
+ default:
289
+ throw new Error(`Unknown backend: ${this.backend}`);
290
+ }
291
+ }
292
+ catch (error) {
293
+ logger.log('error', `Storage list error for prefix ${prefix}: ${error.message}`);
294
+ throw error;
295
+ }
296
+ }
297
+ /**
298
+ * Check if key exists
299
+ */
300
+ async exists(key) {
301
+ key = this.validateKey(key);
302
+ try {
303
+ const value = await this.get(key);
304
+ return value !== null;
305
+ }
306
+ catch (error) {
307
+ return false;
308
+ }
309
+ }
310
+ /**
311
+ * Get storage backend type
312
+ */
313
+ getBackend() {
314
+ // If we're using custom backend with fsBasePath, report it as filesystem
315
+ if (this.backend === 'custom' && this.fsBasePath) {
316
+ return 'filesystem';
317
+ }
318
+ return this.backend;
319
+ }
320
+ /**
321
+ * JSON helper: Get and parse JSON value
322
+ */
323
+ async getJSON(key) {
324
+ const value = await this.get(key);
325
+ if (value === null) {
326
+ return null;
327
+ }
328
+ try {
329
+ return JSON.parse(value);
330
+ }
331
+ catch (error) {
332
+ logger.log('error', `Failed to parse JSON for key ${key}: ${error.message}`);
333
+ throw error;
334
+ }
335
+ }
336
+ /**
337
+ * JSON helper: Set value as JSON
338
+ */
339
+ async setJSON(key, value) {
340
+ const jsonString = JSON.stringify(value, null, 2);
341
+ await this.set(key, jsonString);
342
+ }
343
+ }
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zdG9yYWdlbWFuYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3RzL3N0b3JhZ2UvY2xhc3Nlcy5zdG9yYWdlbWFuYWdlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBRXRDLGtDQUFrQztBQUNsQyxNQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQzdELE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLENBQUM7QUFDL0QsTUFBTSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUN6RCxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0FBQ3pELE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsT0FBTyxDQUFDLENBQUM7QUFtQjNEOzs7R0FHRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ2pCLE9BQU8sQ0FBaUI7SUFDeEIsV0FBVyxHQUF3QixJQUFJLEdBQUcsRUFBRSxDQUFDO0lBQzdDLE1BQU0sQ0FBaUI7SUFDdkIsVUFBVSxDQUFVO0lBRTVCLFlBQVksTUFBdUI7UUFDakMsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLElBQUksRUFBRSxDQUFDO1FBRTNCLHlEQUF5RDtRQUN6RCxJQUFJLE1BQU0sRUFBRSxNQUFNLElBQUksQ0FBQyxN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
@@ -0,0 +1 @@
1
+ export * from './classes.storagemanager.js';
@@ -0,0 +1,3 @@
1
+ // Storage module exports
2
+ export * from './classes.storagemanager.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi90cy9zdG9yYWdlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlCQUF5QjtBQUN6QixjQUFjLDZCQUE2QixDQUFDIn0=
@@ -0,0 +1,8 @@
1
+ export interface IIdentity {
2
+ jwt: string;
3
+ userId: string;
4
+ name: string;
5
+ expiresAt: number;
6
+ role?: string;
7
+ type?: string;
8
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3RzX2ludGVyZmFjZXMvZGF0YS9hdXRoLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,2 @@
1
+ export * from './auth.js';
2
+ export * from './stats.js';
@@ -0,0 +1,3 @@
1
+ export * from './auth.js';
2
+ export * from './stats.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxZQUFZLENBQUMifQ==
@@ -0,0 +1,120 @@
1
+ export interface IServerStats {
2
+ uptime: number;
3
+ startTime: number;
4
+ memoryUsage: {
5
+ heapUsed: number;
6
+ heapTotal: number;
7
+ external: number;
8
+ rss: number;
9
+ maxMemoryMB?: number;
10
+ actualUsageBytes?: number;
11
+ actualUsagePercentage?: number;
12
+ };
13
+ cpuUsage: {
14
+ user: number;
15
+ system: number;
16
+ };
17
+ activeConnections: number;
18
+ totalConnections: number;
19
+ }
20
+ export interface IEmailStats {
21
+ sent: number;
22
+ received: number;
23
+ bounced: number;
24
+ queued: number;
25
+ failed: number;
26
+ averageDeliveryTime: number;
27
+ deliveryRate: number;
28
+ bounceRate: number;
29
+ }
30
+ export interface IDnsStats {
31
+ totalQueries: number;
32
+ cacheHits: number;
33
+ cacheMisses: number;
34
+ cacheHitRate: number;
35
+ activeDomains: number;
36
+ averageResponseTime: number;
37
+ queryTypes: {
38
+ [key: string]: number;
39
+ };
40
+ }
41
+ export interface IRateLimitInfo {
42
+ domain: string;
43
+ currentRate: number;
44
+ limit: number;
45
+ remaining: number;
46
+ resetTime: number;
47
+ blocked: boolean;
48
+ }
49
+ export interface ISecurityMetrics {
50
+ blockedIPs: string[];
51
+ reputationScores: {
52
+ [domain: string]: number;
53
+ };
54
+ spamDetected: number;
55
+ malwareDetected: number;
56
+ phishingDetected: number;
57
+ authenticationFailures: number;
58
+ suspiciousActivities: number;
59
+ }
60
+ export interface ILogEntry {
61
+ timestamp: number;
62
+ level: 'debug' | 'info' | 'warn' | 'error';
63
+ category: 'smtp' | 'dns' | 'security' | 'system' | 'email';
64
+ message: string;
65
+ metadata?: any;
66
+ }
67
+ export interface IConnectionInfo {
68
+ id: string;
69
+ remoteAddress: string;
70
+ localAddress: string;
71
+ startTime: number;
72
+ protocol: 'smtp' | 'smtps' | 'http' | 'https';
73
+ state: 'connecting' | 'connected' | 'authenticated' | 'transmitting' | 'closing';
74
+ bytesReceived: number;
75
+ bytesSent: number;
76
+ }
77
+ export interface IQueueStatus {
78
+ name: string;
79
+ size: number;
80
+ processing: number;
81
+ failed: number;
82
+ retrying: number;
83
+ averageProcessingTime: number;
84
+ }
85
+ export interface IHealthStatus {
86
+ healthy: boolean;
87
+ uptime: number;
88
+ services: {
89
+ [service: string]: {
90
+ status: 'healthy' | 'degraded' | 'unhealthy';
91
+ message?: string;
92
+ lastCheck: number;
93
+ };
94
+ };
95
+ version?: string;
96
+ }
97
+ export interface INetworkMetrics {
98
+ totalBandwidth: {
99
+ in: number;
100
+ out: number;
101
+ };
102
+ activeConnections: number;
103
+ connectionDetails: IConnectionDetails[];
104
+ topEndpoints: Array<{
105
+ endpoint: string;
106
+ requests: number;
107
+ bandwidth: {
108
+ in: number;
109
+ out: number;
110
+ };
111
+ }>;
112
+ }
113
+ export interface IConnectionDetails {
114
+ remoteAddress: string;
115
+ protocol: 'http' | 'https' | 'smtp' | 'smtps';
116
+ state: 'connecting' | 'connected' | 'established' | 'closing';
117
+ startTime: number;
118
+ bytesIn: number;
119
+ bytesOut: number;
120
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL2RhdGEvc3RhdHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
@@ -1,9 +1,5 @@
1
1
  export * from './plugins.js';
2
-
3
- // Data types
4
2
  import * as data from './data/index.js';
5
3
  export { data };
6
-
7
- // Request interfaces
8
4
  import * as requests from './requests/index.js';
9
- export { requests };
5
+ export { requests };
@@ -0,0 +1,8 @@
1
+ export * from './plugins.js';
2
+ // Data types
3
+ import * as data from './data/index.js';
4
+ export { data };
5
+ // Request interfaces
6
+ import * as requests from './requests/index.js';
7
+ export { requests };
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi90c19pbnRlcmZhY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsY0FBYyxDQUFDO0FBRTdCLGFBQWE7QUFDYixPQUFPLEtBQUssSUFBSSxNQUFNLGlCQUFpQixDQUFDO0FBQ3hDLE9BQU8sRUFBRSxJQUFJLEVBQUUsQ0FBQztBQUVoQixxQkFBcUI7QUFDckIsT0FBTyxLQUFLLFFBQVEsTUFBTSxxQkFBcUIsQ0FBQztBQUNoRCxPQUFPLEVBQUUsUUFBUSxFQUFFLENBQUMifQ==
@@ -1,6 +1,2 @@
1
- // @apiglobal scope
2
1
  import * as typedrequestInterfaces from '@api.global/typedrequest-interfaces';
3
-
4
- export {
5
- typedrequestInterfaces
6
- }
2
+ export { typedrequestInterfaces };
@@ -0,0 +1,4 @@
1
+ // @apiglobal scope
2
+ import * as typedrequestInterfaces from '@api.global/typedrequest-interfaces';
3
+ export { typedrequestInterfaces };
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGx1Z2lucy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzX2ludGVyZmFjZXMvcGx1Z2lucy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxtQkFBbUI7QUFDbkIsT0FBTyxLQUFLLHNCQUFzQixNQUFNLHFDQUFxQyxDQUFDO0FBRTlFLE9BQU8sRUFDTCxzQkFBc0IsRUFDdkIsQ0FBQSJ9
@@ -0,0 +1,31 @@
1
+ import * as plugins from '../plugins.js';
2
+ import * as authInterfaces from '../data/auth.js';
3
+ export interface IReq_AdminLoginWithUsernameAndPassword extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_AdminLoginWithUsernameAndPassword> {
4
+ method: 'adminLoginWithUsernameAndPassword';
5
+ request: {
6
+ username: string;
7
+ password: string;
8
+ };
9
+ response: {
10
+ identity?: authInterfaces.IIdentity;
11
+ };
12
+ }
13
+ export interface IReq_AdminLogout extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_AdminLogout> {
14
+ method: 'adminLogout';
15
+ request: {
16
+ identity: authInterfaces.IIdentity;
17
+ };
18
+ response: {
19
+ success: boolean;
20
+ };
21
+ }
22
+ export interface IReq_VerifyIdentity extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_VerifyIdentity> {
23
+ method: 'verifyIdentity';
24
+ request: {
25
+ identity: authInterfaces.IIdentity;
26
+ };
27
+ response: {
28
+ valid: boolean;
29
+ identity?: authInterfaces.IIdentity;
30
+ };
31
+ }
@@ -0,0 +1,3 @@
1
+ import * as plugins from '../plugins.js';
2
+ import * as authInterfaces from '../data/auth.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRtaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL3JlcXVlc3RzL2FkbWluLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxPQUFPLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sS0FBSyxjQUFjLE1BQU0saUJBQWlCLENBQUMifQ==
@@ -0,0 +1,24 @@
1
+ import type * as data from '../data/index.js';
2
+ export interface IReq_GetCombinedMetrics {
3
+ method: 'getCombinedMetrics';
4
+ request: {
5
+ identity: data.IIdentity;
6
+ sections?: {
7
+ server?: boolean;
8
+ email?: boolean;
9
+ dns?: boolean;
10
+ security?: boolean;
11
+ network?: boolean;
12
+ };
13
+ };
14
+ response: {
15
+ metrics: {
16
+ server?: data.IServerStats;
17
+ email?: data.IEmailStats;
18
+ dns?: data.IDnsStats;
19
+ security?: data.ISecurityMetrics;
20
+ network?: data.INetworkMetrics;
21
+ };
22
+ timestamp: number;
23
+ };
24
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29tYmluZWQuc3RhdHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi90c19pbnRlcmZhY2VzL3JlcXVlc3RzL2NvbWJpbmVkLnN0YXRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIifQ==
@@ -0,0 +1,13 @@
1
+ import * as plugins from '../plugins.js';
2
+ import * as authInterfaces from '../data/auth.js';
3
+ export interface IReq_GetConfiguration extends plugins.typedrequestInterfaces.implementsTR<plugins.typedrequestInterfaces.ITypedRequest, IReq_GetConfiguration> {
4
+ method: 'getConfiguration';
5
+ request: {
6
+ identity?: authInterfaces.IIdentity;
7
+ section?: string;
8
+ };
9
+ response: {
10
+ config: any;
11
+ section?: string;
12
+ };
13
+ }
@@ -0,0 +1,3 @@
1
+ import * as plugins from '../plugins.js';
2
+ import * as authInterfaces from '../data/auth.js';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfaW50ZXJmYWNlcy9yZXF1ZXN0cy9jb25maWcudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLGNBQWMsTUFBTSxpQkFBaUIsQ0FBQyJ9