@serve.zone/dcrouter 8.1.0 → 9.1.1

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 (61) hide show
  1. package/dist_serve/bundle.js +1417 -992
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/cache/classes.cache.cleaner.d.ts +47 -0
  4. package/dist_ts/cache/classes.cache.cleaner.js +130 -0
  5. package/dist_ts/cache/classes.cached.document.d.ts +76 -0
  6. package/dist_ts/cache/classes.cached.document.js +100 -0
  7. package/dist_ts/cache/classes.cachedb.d.ts +60 -0
  8. package/dist_ts/cache/classes.cachedb.js +126 -0
  9. package/dist_ts/cache/documents/classes.cached.email.d.ts +125 -0
  10. package/dist_ts/cache/documents/classes.cached.email.js +337 -0
  11. package/dist_ts/cache/documents/classes.cached.ip.reputation.d.ts +119 -0
  12. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +323 -0
  13. package/dist_ts/cache/documents/index.d.ts +2 -0
  14. package/dist_ts/cache/documents/index.js +3 -0
  15. package/dist_ts/cache/index.d.ts +4 -0
  16. package/dist_ts/cache/index.js +7 -0
  17. package/dist_ts/monitoring/classes.metricscache.d.ts +32 -0
  18. package/dist_ts/monitoring/classes.metricscache.js +63 -0
  19. package/dist_ts/monitoring/classes.metricsmanager.d.ts +169 -0
  20. package/dist_ts/monitoring/classes.metricsmanager.js +591 -0
  21. package/dist_ts/monitoring/index.d.ts +1 -0
  22. package/dist_ts/monitoring/index.js +2 -0
  23. package/dist_ts/opsserver/handlers/admin.handler.d.ts +31 -0
  24. package/dist_ts/opsserver/handlers/admin.handler.js +180 -0
  25. package/dist_ts/opsserver/handlers/certificate.handler.d.ts +34 -0
  26. package/dist_ts/opsserver/handlers/certificate.handler.js +419 -0
  27. package/dist_ts/opsserver/handlers/config.handler.d.ts +9 -0
  28. package/dist_ts/opsserver/handlers/config.handler.js +169 -0
  29. package/dist_ts/opsserver/handlers/email-ops.handler.d.ts +32 -0
  30. package/dist_ts/opsserver/handlers/email-ops.handler.js +226 -0
  31. package/dist_ts/opsserver/handlers/logs.handler.d.ts +17 -0
  32. package/dist_ts/opsserver/handlers/logs.handler.js +215 -0
  33. package/dist_ts/opsserver/handlers/radius.handler.d.ts +8 -0
  34. package/dist_ts/opsserver/handlers/radius.handler.js +296 -0
  35. package/dist_ts/opsserver/handlers/remoteingress.handler.d.ts +8 -0
  36. package/dist_ts/opsserver/handlers/remoteingress.handler.js +154 -0
  37. package/dist_ts/opsserver/handlers/security.handler.d.ts +11 -0
  38. package/dist_ts/opsserver/handlers/security.handler.js +232 -0
  39. package/dist_ts/opsserver/handlers/stats.handler.d.ts +13 -0
  40. package/dist_ts/opsserver/handlers/stats.handler.js +400 -0
  41. package/dist_ts/security/classes.securitylogger.d.ts +140 -0
  42. package/dist_ts/security/classes.securitylogger.js +235 -0
  43. package/dist_ts/storage/classes.storagemanager.d.ts +82 -0
  44. package/dist_ts/storage/classes.storagemanager.js +344 -0
  45. package/dist_ts/storage/index.d.ts +1 -0
  46. package/dist_ts/storage/index.js +3 -0
  47. package/dist_ts_interfaces/requests/config.d.ts +77 -1
  48. package/dist_ts_web/00_commitinfo_data.js +1 -1
  49. package/dist_ts_web/appstate.d.ts +1 -1
  50. package/dist_ts_web/elements/ops-dashboard.js +15 -5
  51. package/dist_ts_web/elements/ops-view-apitokens.js +8 -4
  52. package/dist_ts_web/elements/ops-view-config.d.ts +10 -8
  53. package/dist_ts_web/elements/ops-view-config.js +215 -297
  54. package/package.json +2 -2
  55. package/ts/00_commitinfo_data.ts +1 -1
  56. package/ts/opsserver/handlers/config.handler.ts +154 -72
  57. package/ts_web/00_commitinfo_data.ts +1 -1
  58. package/ts_web/appstate.ts +1 -1
  59. package/ts_web/elements/ops-dashboard.ts +14 -4
  60. package/ts_web/elements/ops-view-apitokens.ts +7 -3
  61. package/ts_web/elements/ops-view-config.ts +237 -299
@@ -6,12 +6,14 @@ export declare class OpsViewConfig extends DeesElement {
6
6
  constructor();
7
7
  static styles: plugins.deesElement.CSSResult[];
8
8
  render(): plugins.deesElement.TemplateResult<1>;
9
- private renderConfigSection;
10
- private renderStatusBadge;
11
- private renderConfigFields;
12
- private renderArrayValue;
13
- private getArrayItemLabel;
14
- private formatFieldName;
15
- private formatValue;
16
- private formatBytes;
9
+ private renderConfig;
10
+ private renderSystemSection;
11
+ private renderSmartProxySection;
12
+ private renderEmailSection;
13
+ private renderDnsSection;
14
+ private renderTlsSection;
15
+ private renderCacheSection;
16
+ private renderRadiusSection;
17
+ private renderRemoteIngressSection;
18
+ private formatUptime;
17
19
  }
@@ -35,6 +35,7 @@ var __runInitializers = (this && this.__runInitializers) || function (thisArg, i
35
35
  import * as plugins from '../plugins.js';
36
36
  import * as shared from './shared/index.js';
37
37
  import * as appstate from '../appstate.js';
38
+ import { appRouter } from '../router.js';
38
39
  import { DeesElement, customElement, html, state, css, cssManager, } from '@design.estate/dees-element';
39
40
  let OpsViewConfig = (() => {
40
41
  let _classDecorators = [customElement('ops-view-config')];
@@ -76,165 +77,19 @@ let OpsViewConfig = (() => {
76
77
  cssManager.defaultStyles,
77
78
  shared.viewHostCss,
78
79
  css `
79
- .configSection {
80
- background: ${cssManager.bdTheme('#fff', '#222')};
81
- border: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
82
- border-radius: 8px;
83
- margin-bottom: 24px;
84
- overflow: hidden;
85
- }
86
-
87
- .sectionHeader {
88
- background: ${cssManager.bdTheme('#f8f9fa', '#1a1a1a')};
89
- padding: 16px 24px;
90
- border-bottom: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
91
- display: flex;
92
- justify-content: space-between;
93
- align-items: center;
94
- }
95
-
96
- .sectionTitle {
97
- font-size: 18px;
98
- font-weight: 600;
99
- color: ${cssManager.bdTheme('#333', '#ccc')};
100
- display: flex;
101
- align-items: center;
102
- gap: 12px;
103
- }
104
-
105
- .sectionTitle dees-icon {
106
- font-size: 20px;
107
- color: ${cssManager.bdTheme('#666', '#888')};
108
- }
109
-
110
- .sectionContent {
111
- padding: 24px;
112
- }
113
-
114
- .configField {
115
- margin-bottom: 20px;
116
- }
117
-
118
- .configField:last-child {
119
- margin-bottom: 0;
120
- }
121
-
122
- .fieldLabel {
123
- font-size: 13px;
124
- font-weight: 600;
125
- color: ${cssManager.bdTheme('#666', '#999')};
126
- margin-bottom: 8px;
127
- display: block;
128
- text-transform: uppercase;
129
- letter-spacing: 0.5px;
130
- }
131
-
132
- .fieldValue {
133
- font-family: 'Consolas', 'Monaco', monospace;
134
- font-size: 14px;
135
- color: ${cssManager.bdTheme('#333', '#ccc')};
136
- background: ${cssManager.bdTheme('#f8f9fa', '#1a1a1a')};
137
- padding: 10px 14px;
138
- border-radius: 6px;
139
- border: 1px solid ${cssManager.bdTheme('#e9ecef', '#333')};
140
- }
141
-
142
- .fieldValue.empty {
143
- color: ${cssManager.bdTheme('#999', '#666')};
144
- font-style: italic;
145
- }
146
-
147
- .nestedFields {
148
- margin-left: 16px;
149
- padding-left: 16px;
150
- border-left: 2px solid ${cssManager.bdTheme('#e9ecef', '#333')};
151
- }
152
-
153
- /* Status badge styles */
154
- .statusBadge {
155
- display: inline-flex;
156
- align-items: center;
157
- gap: 6px;
158
- padding: 4px 12px;
159
- border-radius: 20px;
160
- font-size: 13px;
161
- font-weight: 600;
162
- }
163
-
164
- .statusBadge.enabled {
165
- background: ${cssManager.bdTheme('#d4edda', '#1a3d1a')};
166
- color: ${cssManager.bdTheme('#155724', '#66cc66')};
167
- }
168
-
169
- .statusBadge.disabled {
170
- background: ${cssManager.bdTheme('#f8d7da', '#3d1a1a')};
171
- color: ${cssManager.bdTheme('#721c24', '#cc6666')};
172
- }
173
-
174
- .statusBadge dees-icon {
175
- font-size: 14px;
176
- }
177
-
178
- /* Array/list display */
179
- .arrayItems {
180
- display: flex;
181
- flex-wrap: wrap;
182
- gap: 8px;
183
- }
184
-
185
- .arrayItem {
186
- display: inline-flex;
187
- align-items: center;
188
- background: ${cssManager.bdTheme('#e7f3ff', '#1a2a3d')};
189
- color: ${cssManager.bdTheme('#0066cc', '#66aaff')};
190
- padding: 4px 12px;
191
- border-radius: 16px;
192
- font-size: 13px;
193
- font-family: 'Consolas', 'Monaco', monospace;
194
- }
195
-
196
- .arrayCount {
197
- font-size: 12px;
198
- color: ${cssManager.bdTheme('#999', '#666')};
199
- margin-bottom: 8px;
200
- }
201
-
202
- /* Numeric value formatting */
203
- .numericValue {
204
- font-weight: 600;
205
- color: ${cssManager.bdTheme('#0066cc', '#66aaff')};
206
- }
207
-
208
- .errorMessage {
209
- background: ${cssManager.bdTheme('#fee', '#4a1f1f')};
210
- border: 1px solid ${cssManager.bdTheme('#fcc', '#6a2f2f')};
211
- border-radius: 4px;
212
- padding: 16px;
213
- color: ${cssManager.bdTheme('#c00', '#ff6666')};
214
- margin: 16px 0;
215
- }
216
-
217
80
  .loadingMessage {
218
81
  text-align: center;
219
82
  padding: 40px;
220
- color: ${cssManager.bdTheme('#666', '#999')};
83
+ color: ${cssManager.bdTheme('#71717a', '#a1a1aa')};
221
84
  }
222
85
 
223
- .infoNote {
224
- background: ${cssManager.bdTheme('#e7f3ff', '#1a2a3d')};
225
- border: 1px solid ${cssManager.bdTheme('#b3d7ff', '#2a4a6d')};
86
+ .errorMessage {
87
+ background: ${cssManager.bdTheme('#fee2e2', 'rgba(239,68,68,0.1)')};
88
+ border: 1px solid ${cssManager.bdTheme('#fecaca', 'rgba(239,68,68,0.3)')};
226
89
  border-radius: 8px;
227
90
  padding: 16px;
228
- margin-bottom: 24px;
229
- color: ${cssManager.bdTheme('#004085', '#88ccff')};
230
- display: flex;
231
- align-items: center;
232
- gap: 12px;
233
- }
234
-
235
- .infoNote dees-icon {
236
- font-size: 20px;
237
- flex-shrink: 0;
91
+ color: ${cssManager.bdTheme('#dc2626', '#ef4444')};
92
+ margin: 16px 0;
238
93
  }
239
94
  `,
240
95
  ];
@@ -242,167 +97,230 @@ let OpsViewConfig = (() => {
242
97
  return html `
243
98
  <ops-sectionheading>Configuration</ops-sectionheading>
244
99
 
245
- ${this.configState.isLoading ? html `
246
- <div class="loadingMessage">
247
- <dees-spinner></dees-spinner>
248
- <p>Loading configuration...</p>
249
- </div>
250
- ` : this.configState.error ? html `
251
- <div class="errorMessage">
252
- Error loading configuration: ${this.configState.error}
253
- </div>
254
- ` : this.configState.config ? html `
255
- <div class="infoNote">
256
- <dees-icon icon="lucide:info"></dees-icon>
257
- <span>This view displays the current running configuration. DcRouter is configured through code or remote management.</span>
258
- </div>
259
-
260
- ${this.renderConfigSection('email', 'Email', 'lucide:mail', this.configState.config?.email)}
261
- ${this.renderConfigSection('dns', 'DNS', 'lucide:globe', this.configState.config?.dns)}
262
- ${this.renderConfigSection('proxy', 'Proxy', 'lucide:network', this.configState.config?.proxy)}
263
- ${this.renderConfigSection('security', 'Security', 'lucide:shield', this.configState.config?.security)}
264
- ` : html `
265
- <div class="errorMessage">No configuration loaded</div>
266
- `}
100
+ ${this.configState.isLoading
101
+ ? html `
102
+ <div class="loadingMessage">
103
+ <dees-spinner></dees-spinner>
104
+ <p>Loading configuration...</p>
105
+ </div>
106
+ `
107
+ : this.configState.error
108
+ ? html `
109
+ <div class="errorMessage">
110
+ Error loading configuration: ${this.configState.error}
111
+ </div>
112
+ `
113
+ : this.configState.config
114
+ ? this.renderConfig()
115
+ : html `<div class="errorMessage">No configuration loaded</div>`}
267
116
  `;
268
117
  }
269
- renderConfigSection(key, title, icon, config) {
270
- const isEnabled = config?.enabled ?? false;
118
+ renderConfig() {
119
+ const cfg = this.configState.config;
271
120
  return html `
272
- <div class="configSection">
273
- <div class="sectionHeader">
274
- <h3 class="sectionTitle">
275
- <dees-icon icon="${icon}"></dees-icon>
276
- ${title}
277
- </h3>
278
- ${this.renderStatusBadge(isEnabled)}
279
- </div>
280
- <div class="sectionContent">
281
- ${config ? this.renderConfigFields(config) : html `
282
- <div class="fieldValue empty">Not configured</div>
283
- `}
284
- </div>
285
- </div>
121
+ <sz-config-overview
122
+ infoText="This view displays the current running configuration. DcRouter is configured through code or remote management."
123
+ @navigate=${(e) => {
124
+ if (e.detail?.view) {
125
+ appRouter.navigateToView(e.detail.view);
126
+ }
127
+ }}
128
+ >
129
+ ${this.renderSystemSection(cfg.system)}
130
+ ${this.renderSmartProxySection(cfg.smartProxy)}
131
+ ${this.renderEmailSection(cfg.email)}
132
+ ${this.renderDnsSection(cfg.dns)}
133
+ ${this.renderTlsSection(cfg.tls)}
134
+ ${this.renderCacheSection(cfg.cache)}
135
+ ${this.renderRadiusSection(cfg.radius)}
136
+ ${this.renderRemoteIngressSection(cfg.remoteIngress)}
137
+ </sz-config-overview>
286
138
  `;
287
139
  }
288
- renderStatusBadge(enabled) {
289
- return enabled
290
- ? html `<span class="statusBadge enabled"><dees-icon icon="lucide:check"></dees-icon>Enabled</span>`
291
- : html `<span class="statusBadge disabled"><dees-icon icon="lucide:x"></dees-icon>Disabled</span>`;
140
+ renderSystemSection(sys) {
141
+ const fields = [
142
+ { key: 'Base Directory', value: sys.baseDir },
143
+ { key: 'Data Directory', value: sys.dataDir },
144
+ { key: 'Public IP', value: sys.publicIp },
145
+ { key: 'Proxy IPs', value: sys.proxyIps.length > 0 ? sys.proxyIps : null, type: 'pills' },
146
+ { key: 'Uptime', value: this.formatUptime(sys.uptime) },
147
+ { key: 'Storage Backend', value: sys.storageBackend, type: 'badge' },
148
+ { key: 'Storage Path', value: sys.storagePath },
149
+ ];
150
+ return html `
151
+ <sz-config-section
152
+ title="System"
153
+ subtitle="Base paths and infrastructure"
154
+ icon="lucide:server"
155
+ status="enabled"
156
+ .fields=${fields}
157
+ ></sz-config-section>
158
+ `;
292
159
  }
293
- renderConfigFields(config, prefix = '') {
294
- if (!config || typeof config !== 'object') {
295
- return html `<div class="fieldValue">${this.formatValue(config)}</div>`;
160
+ renderSmartProxySection(proxy) {
161
+ const fields = [
162
+ { key: 'Route Count', value: proxy.routeCount },
163
+ ];
164
+ if (proxy.acme) {
165
+ fields.push({ key: 'ACME Enabled', value: proxy.acme.enabled, type: 'boolean' }, { key: 'Account Email', value: proxy.acme.accountEmail || null }, { key: 'Use Production', value: proxy.acme.useProduction, type: 'boolean' }, { key: 'Auto Renew', value: proxy.acme.autoRenew, type: 'boolean' }, { key: 'Renew Threshold', value: `${proxy.acme.renewThresholdDays} days` });
296
166
  }
297
- return Object.entries(config).map(([key, value]) => {
298
- const fieldName = prefix ? `${prefix}.${key}` : key;
299
- const displayName = this.formatFieldName(key);
300
- // Handle boolean values with badges
301
- if (typeof value === 'boolean') {
302
- return html `
303
- <div class="configField">
304
- <label class="fieldLabel">${displayName}</label>
305
- ${this.renderStatusBadge(value)}
306
- </div>
307
- `;
308
- }
309
- // Handle arrays
310
- if (Array.isArray(value)) {
311
- return html `
312
- <div class="configField">
313
- <label class="fieldLabel">${displayName}</label>
314
- ${this.renderArrayValue(value, key)}
315
- </div>
316
- `;
317
- }
318
- // Handle nested objects
319
- if (typeof value === 'object' && value !== null) {
320
- return html `
321
- <div class="configField">
322
- <label class="fieldLabel">${displayName}</label>
323
- <div class="nestedFields">
324
- ${this.renderConfigFields(value, fieldName)}
325
- </div>
326
- </div>
327
- `;
328
- }
329
- // Handle primitive values
330
- return html `
331
- <div class="configField">
332
- <label class="fieldLabel">${displayName}</label>
333
- <div class="fieldValue">${this.formatValue(value, key)}</div>
334
- </div>
335
- `;
336
- });
167
+ const actions = [
168
+ { label: 'View Routes', icon: 'lucide:arrow-right', event: 'navigate', detail: { view: 'routes' } },
169
+ ];
170
+ return html `
171
+ <sz-config-section
172
+ title="SmartProxy"
173
+ subtitle="HTTP/HTTPS and TCP/SNI reverse proxy"
174
+ icon="lucide:network"
175
+ .status=${proxy.enabled ? 'enabled' : 'disabled'}
176
+ .fields=${fields}
177
+ .actions=${actions}
178
+ ></sz-config-section>
179
+ `;
337
180
  }
338
- renderArrayValue(arr, fieldKey) {
339
- if (arr.length === 0) {
340
- return html `<div class="fieldValue empty">None configured</div>`;
341
- }
342
- // Determine if we should show as pills/tags
343
- const showAsPills = arr.every(item => typeof item === 'string' || typeof item === 'number');
344
- if (showAsPills) {
345
- const itemLabel = this.getArrayItemLabel(fieldKey, arr.length);
346
- return html `
347
- <div class="arrayCount">${arr.length} ${itemLabel}</div>
348
- <div class="arrayItems">
349
- ${arr.map(item => html `<span class="arrayItem">${item}</span>`)}
350
- </div>
351
- `;
181
+ renderEmailSection(email) {
182
+ const fields = [
183
+ { key: 'Ports', value: email.ports.length > 0 ? email.ports.map(String) : null, type: 'pills' },
184
+ { key: 'Hostname', value: email.hostname },
185
+ { key: 'Domains', value: email.domains.length > 0 ? email.domains : null, type: 'pills' },
186
+ { key: 'Email Routes', value: email.emailRouteCount },
187
+ { key: 'Received Emails Path', value: email.receivedEmailsPath },
188
+ ];
189
+ if (email.portMapping) {
190
+ const mappingStr = Object.entries(email.portMapping)
191
+ .map(([ext, int]) => `${ext} → ${int}`)
192
+ .join(', ');
193
+ fields.splice(1, 0, { key: 'Port Mapping', value: mappingStr, type: 'code' });
352
194
  }
353
- // For complex arrays, show as JSON
195
+ const actions = [
196
+ { label: 'View Emails', icon: 'lucide:arrow-right', event: 'navigate', detail: { view: 'emails' } },
197
+ ];
354
198
  return html `
355
- <div class="fieldValue">
356
- ${arr.length} items configured
357
- </div>
199
+ <sz-config-section
200
+ title="Email Server"
201
+ subtitle="SMTP email handling with smartmta"
202
+ icon="lucide:mail"
203
+ .status=${email.enabled ? 'enabled' : 'disabled'}
204
+ .fields=${fields}
205
+ .actions=${actions}
206
+ ></sz-config-section>
358
207
  `;
359
208
  }
360
- getArrayItemLabel(fieldKey, count) {
361
- const labels = {
362
- ports: ['port', 'ports'],
363
- domains: ['domain', 'domains'],
364
- nameservers: ['nameserver', 'nameservers'],
365
- blockList: ['IP', 'IPs'],
366
- };
367
- const label = labels[fieldKey] || ['item', 'items'];
368
- return count === 1 ? label[0] : label[1];
209
+ renderDnsSection(dns) {
210
+ const fields = [
211
+ { key: 'Port', value: dns.port },
212
+ { key: 'NS Domains', value: dns.nsDomains.length > 0 ? dns.nsDomains : null, type: 'pills' },
213
+ { key: 'Scopes', value: dns.scopes.length > 0 ? dns.scopes : null, type: 'pills' },
214
+ { key: 'Record Count', value: dns.recordCount },
215
+ { key: 'DNS Challenge', value: dns.dnsChallenge, type: 'boolean' },
216
+ ];
217
+ return html `
218
+ <sz-config-section
219
+ title="DNS Server"
220
+ subtitle="Authoritative DNS with smartdns"
221
+ icon="lucide:globe"
222
+ .status=${dns.enabled ? 'enabled' : 'disabled'}
223
+ .fields=${fields}
224
+ ></sz-config-section>
225
+ `;
369
226
  }
370
- formatFieldName(key) {
371
- // Convert camelCase to readable format
372
- return key
373
- .replace(/([A-Z])/g, ' $1')
374
- .replace(/^./, str => str.toUpperCase())
375
- .trim();
227
+ renderTlsSection(tls) {
228
+ const fields = [
229
+ { key: 'Contact Email', value: tls.contactEmail },
230
+ { key: 'Domain', value: tls.domain },
231
+ { key: 'Source', value: tls.source, type: 'badge' },
232
+ { key: 'Certificate Path', value: tls.certPath },
233
+ { key: 'Key Path', value: tls.keyPath },
234
+ ];
235
+ const status = tls.source === 'none' ? 'not-configured' : 'enabled';
236
+ const actions = [
237
+ { label: 'View Certificates', icon: 'lucide:arrow-right', event: 'navigate', detail: { view: 'certificates' } },
238
+ ];
239
+ return html `
240
+ <sz-config-section
241
+ title="TLS / Certificates"
242
+ subtitle="Certificate management and ACME"
243
+ icon="lucide:shield-check"
244
+ .status=${status}
245
+ .fields=${fields}
246
+ .actions=${actions}
247
+ ></sz-config-section>
248
+ `;
376
249
  }
377
- formatValue(value, fieldKey) {
378
- if (value === null || value === undefined) {
379
- return html `<span class="empty">Not set</span>`;
380
- }
381
- if (typeof value === 'number') {
382
- // Format bytes
383
- if (fieldKey?.toLowerCase().includes('size') || fieldKey?.toLowerCase().includes('bytes')) {
384
- return html `<span class="numericValue">${this.formatBytes(value)}</span>`;
385
- }
386
- // Format time values
387
- if (fieldKey?.toLowerCase().includes('ttl') || fieldKey?.toLowerCase().includes('timeout')) {
388
- return html `<span class="numericValue">${value} seconds</span>`;
389
- }
390
- // Format port numbers
391
- if (fieldKey?.toLowerCase().includes('port')) {
392
- return html `<span class="numericValue">${value}</span>`;
250
+ renderCacheSection(cache) {
251
+ const fields = [
252
+ { key: 'Storage Path', value: cache.storagePath },
253
+ { key: 'DB Name', value: cache.dbName },
254
+ { key: 'Default TTL', value: `${cache.defaultTTLDays} days` },
255
+ { key: 'Cleanup Interval', value: `${cache.cleanupIntervalHours} hours` },
256
+ ];
257
+ if (cache.ttlConfig && Object.keys(cache.ttlConfig).length > 0) {
258
+ for (const [key, val] of Object.entries(cache.ttlConfig)) {
259
+ fields.push({ key: `TTL: ${key}`, value: `${val} days` });
393
260
  }
394
- // Format counts with separators
395
- return html `<span class="numericValue">${value.toLocaleString()}</span>`;
396
261
  }
397
- return String(value);
262
+ return html `
263
+ <sz-config-section
264
+ title="Cache Database"
265
+ subtitle="Persistent caching with smartdata"
266
+ icon="lucide:database"
267
+ .status=${cache.enabled ? 'enabled' : 'disabled'}
268
+ .fields=${fields}
269
+ ></sz-config-section>
270
+ `;
271
+ }
272
+ renderRadiusSection(radius) {
273
+ const fields = [
274
+ { key: 'Auth Port', value: radius.authPort },
275
+ { key: 'Accounting Port', value: radius.acctPort },
276
+ { key: 'Bind Address', value: radius.bindAddress },
277
+ { key: 'Client Count', value: radius.clientCount },
278
+ ];
279
+ if (radius.vlanDefaultVlan !== null) {
280
+ fields.push({ key: 'Default VLAN', value: radius.vlanDefaultVlan }, { key: 'Allow Unknown MACs', value: radius.vlanAllowUnknownMacs, type: 'boolean' }, { key: 'VLAN Mappings', value: radius.vlanMappingCount });
281
+ }
282
+ const status = radius.enabled ? 'enabled' : 'not-configured';
283
+ return html `
284
+ <sz-config-section
285
+ title="RADIUS Server"
286
+ subtitle="Network authentication and VLAN assignment"
287
+ icon="lucide:wifi"
288
+ .status=${status}
289
+ .fields=${fields}
290
+ ></sz-config-section>
291
+ `;
292
+ }
293
+ renderRemoteIngressSection(ri) {
294
+ const fields = [
295
+ { key: 'Tunnel Port', value: ri.tunnelPort },
296
+ { key: 'Hub Domain', value: ri.hubDomain },
297
+ { key: 'TLS Configured', value: ri.tlsConfigured, type: 'boolean' },
298
+ ];
299
+ const actions = [
300
+ { label: 'View Remote Ingress', icon: 'lucide:arrow-right', event: 'navigate', detail: { view: 'remoteingress' } },
301
+ ];
302
+ return html `
303
+ <sz-config-section
304
+ title="Remote Ingress"
305
+ subtitle="Edge tunnel nodes"
306
+ icon="lucide:cloud"
307
+ .status=${ri.enabled ? 'enabled' : 'disabled'}
308
+ .fields=${fields}
309
+ .actions=${actions}
310
+ ></sz-config-section>
311
+ `;
398
312
  }
399
- formatBytes(bytes) {
400
- if (bytes === 0)
401
- return '0 B';
402
- const k = 1024;
403
- const sizes = ['B', 'KB', 'MB', 'GB', 'TB'];
404
- const i = Math.floor(Math.log(bytes) / Math.log(k));
405
- return parseFloat((bytes / Math.pow(k, i)).toFixed(2)) + ' ' + sizes[i];
313
+ formatUptime(seconds) {
314
+ const days = Math.floor(seconds / 86400);
315
+ const hours = Math.floor((seconds % 86400) / 3600);
316
+ const mins = Math.floor((seconds % 3600) / 60);
317
+ const parts = [];
318
+ if (days > 0)
319
+ parts.push(`${days}d`);
320
+ if (hours > 0)
321
+ parts.push(`${hours}h`);
322
+ parts.push(`${mins}m`);
323
+ return parts.join(' ');
406
324
  }
407
325
  static {
408
326
  __runInitializers(_classThis, _classExtraInitializers);
@@ -411,4 +329,4 @@ let OpsViewConfig = (() => {
411
329
  return OpsViewConfig = _classThis;
412
330
  })();
413
331
  export { OpsViewConfig };
414
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL29wcy12aWV3LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE9BQU8sRUFDTCxXQUFXLEVBQ1gsYUFBYSxFQUNiLElBQUksRUFDSixLQUFLLEVBQ0wsR0FBRyxFQUNILFVBQVUsR0FFWCxNQUFNLDZCQUE2QixDQUFDO0lBR3hCLGFBQWE7NEJBRHpCLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQzs7OztzQkFDRSxXQUFXOzs7OzZCQUFuQixTQUFRLFdBQVc7Ozs7dUNBQzNDLEtBQUssRUFBRTtZQUNSLHNMQUFTLFdBQVcsNkJBQVgsV0FBVyxpR0FJbEI7WUFOSiw2S0FrWEM7Ozs7UUFoWEMsbUZBQThDO1lBQzVDLE1BQU0sRUFBRSxJQUFJO1lBQ1osU0FBUyxFQUFFLEtBQUs7WUFDaEIsS0FBSyxFQUFFLElBQUk7U0FDWixFQUFDO1FBSkYsSUFBUyxXQUFXLGlEQUlsQjtRQUpGLElBQVMsV0FBVyx1REFJbEI7UUFFRjtZQUNFLEtBQUssRUFBRSxDQUFDOztZQUNSLE1BQU0sWUFBWSxHQUFHLFFBQVEsQ0FBQyxlQUFlO2lCQUMxQyxNQUFNLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDLFFBQVEsQ0FBQztpQkFDOUIsU0FBUyxDQUFDLENBQUMsV0FBVyxFQUFFLEVBQUU7Z0JBQ3pCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1lBQ2pDLENBQUMsQ0FBQyxDQUFDO1lBQ0wsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENB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
332
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib3BzLXZpZXctY29uZmlnLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdHNfd2ViL2VsZW1lbnRzL29wcy12aWV3LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxlQUFlLENBQUM7QUFDekMsT0FBTyxLQUFLLE1BQU0sTUFBTSxtQkFBbUIsQ0FBQztBQUM1QyxPQUFPLEtBQUssUUFBUSxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFekMsT0FBTyxFQUNMLFdBQVcsRUFDWCxhQUFhLEVBQ2IsSUFBSSxFQUNKLEtBQUssRUFDTCxHQUFHLEVBQ0gsVUFBVSxHQUVYLE1BQU0sNkJBQTZCLENBQUM7SUFLeEIsYUFBYTs0QkFEekIsYUFBYSxDQUFDLGlCQUFpQixDQUFDOzs7O3NCQUNFLFdBQVc7Ozs7NkJBQW5CLFNBQVEsV0FBVzs7Ozt1Q0FDM0MsS0FBSyxFQUFFO1lBQ1Isc0xBQVMsV0FBVyw2QkFBWCxXQUFXLGlHQUlsQjtZQU5KLDZLQWlUQzs7OztRQS9TQyxtRkFBOEM7WUFDNUMsTUFBTSxFQUFFLElBQUk7WUFDWixTQUFTLEVBQUUsS0FBSztZQUNoQixLQUFLLEVBQUUsSUFBSTtTQUNaLEVBQUM7UUFKRixJQUFTLFdBQVcsaURBSWxCO1FBSkYsSUFBUyxXQUFXLHVEQUlsQjtRQUVGO1lBQ0UsS0FBSyxFQUFFLENBQUM7O1lBQ1IsTUFBTSxZQUFZLEdBQUcsUUFBUSxDQUFDLGVBQWU7aUJBQzFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDO2lCQUM5QixTQUFTLENBQUMsQ0FBQyxXQUFXLEVBQUUsRUFBRTtnQkFDekIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7WUFDakMsQ0FBQyxDQUFDLENBQUM7WUFDTCxJ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
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@serve.zone/dcrouter",
3
3
  "private": false,
4
- "version": "8.1.0",
4
+ "version": "9.1.1",
5
5
  "description": "A multifaceted routing service handling mail and SMS delivery functions.",
6
6
  "type": "module",
7
7
  "exports": {
@@ -55,7 +55,7 @@
55
55
  "@push.rocks/smartrx": "^3.0.10",
56
56
  "@push.rocks/smartstate": "^2.0.30",
57
57
  "@push.rocks/smartunique": "^3.0.9",
58
- "@serve.zone/catalog": "^2.3.0",
58
+ "@serve.zone/catalog": "^2.5.0",
59
59
  "@serve.zone/interfaces": "^5.3.0",
60
60
  "@serve.zone/remoteingress": "^4.0.0",
61
61
  "@tsclass/tsclass": "^9.3.0",