@serve.zone/dcrouter 11.10.3 → 11.10.7

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 (76) hide show
  1. package/dist_serve/bundle.js +5102 -5102
  2. package/dist_ts/00_commitinfo_data.js +1 -1
  3. package/dist_ts/cache/classes.cache.cleaner.js +1 -1
  4. package/dist_ts/cache/classes.cached.document.js +1 -1
  5. package/dist_ts/cache/classes.cachedb.js +1 -1
  6. package/dist_ts/cache/documents/classes.cached.email.js +1 -1
  7. package/dist_ts/cache/documents/classes.cached.ip.reputation.js +1 -1
  8. package/dist_ts/classes.dcrouter.js +3 -3
  9. package/dist_ts/config/classes.route-config-manager.d.ts +1 -1
  10. package/dist_ts/config/validator.js +1 -1
  11. package/dist_ts/errors/base.errors.js +2 -2
  12. package/dist_ts/monitoring/classes.metricsmanager.d.ts +6 -1
  13. package/dist_ts/monitoring/classes.metricsmanager.js +69 -31
  14. package/dist_ts/opsserver/classes.opsserver.js +2 -2
  15. package/dist_ts/opsserver/handlers/admin.handler.js +1 -1
  16. package/dist_ts/opsserver/handlers/certificate.handler.js +1 -1
  17. package/dist_ts/opsserver/handlers/radius.handler.js +1 -1
  18. package/dist_ts/opsserver/handlers/stats.handler.js +1 -1
  19. package/dist_ts/radius/classes.accounting.manager.js +1 -1
  20. package/dist_ts/radius/classes.radius.server.js +1 -1
  21. package/dist_ts/radius/classes.vlan.manager.js +1 -1
  22. package/dist_ts/security/classes.contentscanner.js +3 -3
  23. package/dist_ts/security/classes.ipreputationchecker.js +4 -4
  24. package/dist_ts/security/classes.securitylogger.js +5 -3
  25. package/dist_ts/sms/classes.smsservice.js +2 -2
  26. package/dist_ts/storage/classes.storagemanager.d.ts +1 -1
  27. package/dist_ts/storage/classes.storagemanager.js +2 -4
  28. package/dist_ts_web/00_commitinfo_data.js +1 -1
  29. package/dist_ts_web/appstate.js +9 -6
  30. package/dist_ts_web/elements/ops-dashboard.js +3 -2
  31. package/dist_ts_web/elements/ops-view-certificates.js +1 -1
  32. package/dist_ts_web/elements/ops-view-config.js +1 -1
  33. package/dist_ts_web/elements/ops-view-emails.js +1 -1
  34. package/dist_ts_web/elements/ops-view-network.js +1 -1
  35. package/dist_ts_web/elements/ops-view-remoteingress.js +1 -1
  36. package/dist_ts_web/router.js +1 -1
  37. package/license +21 -0
  38. package/package.json +15 -15
  39. package/readme.hints.md +1 -1
  40. package/readme.md +1 -1
  41. package/ts/00_commitinfo_data.ts +1 -1
  42. package/ts/cache/classes.cache.cleaner.ts +10 -10
  43. package/ts/cache/classes.cached.document.ts +1 -1
  44. package/ts/cache/classes.cachedb.ts +6 -6
  45. package/ts/cache/documents/classes.cached.email.ts +14 -14
  46. package/ts/cache/documents/classes.cached.ip.reputation.ts +10 -10
  47. package/ts/classes.dcrouter.ts +31 -31
  48. package/ts/config/validator.ts +5 -5
  49. package/ts/errors/base.errors.ts +1 -1
  50. package/ts/monitoring/classes.metricsmanager.ts +70 -33
  51. package/ts/opsserver/classes.opsserver.ts +13 -13
  52. package/ts/opsserver/handlers/admin.handler.ts +1 -1
  53. package/ts/opsserver/handlers/certificate.handler.ts +6 -6
  54. package/ts/opsserver/handlers/radius.handler.ts +4 -4
  55. package/ts/opsserver/handlers/stats.handler.ts +1 -1
  56. package/ts/radius/classes.accounting.manager.ts +10 -10
  57. package/ts/radius/classes.radius.server.ts +2 -2
  58. package/ts/radius/classes.vlan.manager.ts +5 -5
  59. package/ts/readme.md +1 -1
  60. package/ts/security/classes.contentscanner.ts +12 -12
  61. package/ts/security/classes.ipreputationchecker.ts +26 -26
  62. package/ts/security/classes.securitylogger.ts +6 -4
  63. package/ts/sms/classes.smsservice.ts +3 -3
  64. package/ts/storage/classes.storagemanager.ts +23 -25
  65. package/ts_apiclient/readme.md +1 -1
  66. package/ts_web/00_commitinfo_data.ts +1 -1
  67. package/ts_web/appstate.ts +136 -133
  68. package/ts_web/elements/ops-dashboard.ts +15 -14
  69. package/ts_web/elements/ops-view-certificates.ts +10 -10
  70. package/ts_web/elements/ops-view-config.ts +8 -8
  71. package/ts_web/elements/ops-view-emails.ts +2 -2
  72. package/ts_web/elements/ops-view-network.ts +2 -2
  73. package/ts_web/elements/ops-view-remoteingress.ts +6 -6
  74. package/ts_web/readme.md +1 -1
  75. package/ts_web/router.ts +3 -3
  76. /package/{npmextra.json → .smartconfig.json} +0 -0
@@ -195,17 +195,18 @@ export class OpsDashboard extends DeesElement {
195
195
  }
196
196
 
197
197
  public async firstUpdated() {
198
- const simpleLogin = this.shadowRoot.querySelector('dees-simple-login');
199
- simpleLogin.addEventListener('login', (e: CustomEvent) => {
198
+ const simpleLogin = this.shadowRoot!.querySelector('dees-simple-login') as any;
199
+ simpleLogin.addEventListener('login', (e: Event) => {
200
200
  // Handle logout event
201
- this.login(e.detail.data.username, e.detail.data.password);
201
+ const detail = (e as CustomEvent).detail;
202
+ this.login(detail.data.username, detail.data.password);
202
203
  });
203
204
 
204
205
  // Handle view changes
205
- const appDash = this.shadowRoot.querySelector('dees-simple-appdash');
206
+ const appDash = this.shadowRoot!.querySelector('dees-simple-appdash');
206
207
  if (appDash) {
207
- appDash.addEventListener('view-select', (e: CustomEvent) => {
208
- const viewName = e.detail.view.name.toLowerCase();
208
+ appDash.addEventListener('view-select', (e: Event) => {
209
+ const viewName = (e as CustomEvent).detail.view.name.toLowerCase();
209
210
  // Use router for navigation instead of direct state update
210
211
  appRouter.navigateToView(viewName);
211
212
  });
@@ -217,7 +218,7 @@ export class OpsDashboard extends DeesElement {
217
218
  }
218
219
 
219
220
  // Handle initial state - check if we have a stored session that's still valid
220
- const loginState = appstate.loginStatePart.getState();
221
+ const loginState = appstate.loginStatePart.getState()!;
221
222
  if (loginState.identity?.jwt) {
222
223
  if (loginState.identity.expiresAt > Date.now()) {
223
224
  // Client-side expiry looks valid — verify with server (keypair may have changed)
@@ -229,7 +230,7 @@ export class OpsDashboard extends DeesElement {
229
230
  if (response.valid) {
230
231
  // JWT confirmed valid by server
231
232
  this.loginState = loginState;
232
- await simpleLogin.switchToSlottedContent();
233
+ await (simpleLogin as any).switchToSlottedContent();
233
234
  await appstate.statsStatePart.dispatchAction(appstate.fetchAllStatsAction, null);
234
235
  await appstate.configStatePart.dispatchAction(appstate.fetchConfigurationAction, null);
235
236
  } else {
@@ -250,8 +251,8 @@ export class OpsDashboard extends DeesElement {
250
251
  private async login(username: string, password: string) {
251
252
  const domtools = await this.domtoolsPromise;
252
253
  console.log(`Attempting to login...`);
253
- const simpleLogin = this.shadowRoot.querySelector('dees-simple-login');
254
- const form = simpleLogin.shadowRoot.querySelector('dees-form');
254
+ const simpleLogin = this.shadowRoot!.querySelector('dees-simple-login') as any;
255
+ const form = simpleLogin.shadowRoot!.querySelector('dees-form') as any;
255
256
  form.setStatus('pending', 'Logging in...');
256
257
 
257
258
  const state = await appstate.loginStatePart.dispatchAction(appstate.loginAction, {
@@ -262,14 +263,14 @@ export class OpsDashboard extends DeesElement {
262
263
  if (state.identity) {
263
264
  console.log('Login successful');
264
265
  this.loginState = state;
265
- form.setStatus('success', 'Logged in!');
266
- await simpleLogin.switchToSlottedContent();
266
+ form!.setStatus('success', 'Logged in!');
267
+ await simpleLogin!.switchToSlottedContent();
267
268
  await appstate.statsStatePart.dispatchAction(appstate.fetchAllStatsAction, null);
268
269
  await appstate.configStatePart.dispatchAction(appstate.fetchConfigurationAction, null);
269
270
  } else {
270
- form.setStatus('error', 'Login failed!');
271
+ form!.setStatus('error', 'Login failed!');
271
272
  await domtools.convenience.smartdelay.delayFor(2000);
272
- form.reset();
273
+ form!.reset();
273
274
  }
274
275
  }
275
276
  }
@@ -21,7 +21,7 @@ declare global {
21
21
  @customElement('ops-view-certificates')
22
22
  export class OpsViewCertificates extends DeesElement {
23
23
  @state()
24
- accessor certState: appstate.ICertificateState = appstate.certificateStatePart.getState();
24
+ accessor certState: appstate.ICertificateState = appstate.certificateStatePart.getState()!;
25
25
 
26
26
  constructor() {
27
27
  super();
@@ -264,10 +264,10 @@ export class OpsViewCertificates extends DeesElement {
264
264
  {
265
265
  name: 'Import',
266
266
  iconName: 'lucide:upload',
267
- action: async (modal) => {
267
+ action: async (modal: any) => {
268
268
  const { DeesToast } = await import('@design.estate/dees-catalog');
269
269
  try {
270
- const form = modal.shadowRoot.querySelector('dees-form') as any;
270
+ const form = modal.shadowRoot!.querySelector('dees-form') as any;
271
271
  const formData = await form.collectFormData();
272
272
  const files = formData.certJsonFile;
273
273
  if (!files || files.length === 0) {
@@ -287,8 +287,8 @@ export class OpsViewCertificates extends DeesElement {
287
287
  );
288
288
  DeesToast.show({ message: `Certificate imported for ${cert.domainName}`, type: 'success', duration: 3000 });
289
289
  modal.destroy();
290
- } catch (err) {
291
- DeesToast.show({ message: `Import failed: ${err.message}`, type: 'error', duration: 4000 });
290
+ } catch (err: unknown) {
291
+ DeesToast.show({ message: `Import failed: ${(err as Error).message}`, type: 'error', duration: 4000 });
292
292
  }
293
293
  },
294
294
  },
@@ -339,8 +339,8 @@ export class OpsViewCertificates extends DeesElement {
339
339
  } else {
340
340
  DeesToast.show({ message: response.message || 'Export failed', type: 'error', duration: 4000 });
341
341
  }
342
- } catch (err) {
343
- DeesToast.show({ message: `Export failed: ${err.message}`, type: 'error', duration: 4000 });
342
+ } catch (err: unknown) {
343
+ DeesToast.show({ message: `Export failed: ${(err as Error).message}`, type: 'error', duration: 4000 });
344
344
  }
345
345
  },
346
346
  },
@@ -363,7 +363,7 @@ export class OpsViewCertificates extends DeesElement {
363
363
  {
364
364
  name: 'Delete',
365
365
  iconName: 'lucide:trash-2',
366
- action: async (modal) => {
366
+ action: async (modal: any) => {
367
367
  try {
368
368
  await appstate.certificateStatePart.dispatchAction(
369
369
  appstate.deleteCertificateAction,
@@ -371,8 +371,8 @@ export class OpsViewCertificates extends DeesElement {
371
371
  );
372
372
  DeesToast.show({ message: `Certificate deleted for ${cert.domain}`, type: 'success', duration: 3000 });
373
373
  modal.destroy();
374
- } catch (err) {
375
- DeesToast.show({ message: `Delete failed: ${err.message}`, type: 'error', duration: 4000 });
374
+ } catch (err: unknown) {
375
+ DeesToast.show({ message: `Delete failed: ${(err as Error).message}`, type: 'error', duration: 4000 });
376
376
  }
377
377
  },
378
378
  },
@@ -102,7 +102,7 @@ export class OpsViewConfig extends DeesElement {
102
102
  `;
103
103
  }
104
104
 
105
- private renderSystemSection(sys: appstate.IConfigState['config']['system']): TemplateResult {
105
+ private renderSystemSection(sys: NonNullable<appstate.IConfigState['config']>['system']): TemplateResult {
106
106
  // Annotate proxy IPs with source hint when Remote Ingress is active
107
107
  const ri = this.configState.config?.remoteIngress;
108
108
  let proxyIpValues: string[] | null = sys.proxyIps.length > 0 ? [...sys.proxyIps] : null;
@@ -133,7 +133,7 @@ export class OpsViewConfig extends DeesElement {
133
133
  `;
134
134
  }
135
135
 
136
- private renderSmartProxySection(proxy: appstate.IConfigState['config']['smartProxy']): TemplateResult {
136
+ private renderSmartProxySection(proxy: NonNullable<appstate.IConfigState['config']>['smartProxy']): TemplateResult {
137
137
  const fields: IConfigField[] = [
138
138
  { key: 'Route Count', value: proxy.routeCount },
139
139
  ];
@@ -164,7 +164,7 @@ export class OpsViewConfig extends DeesElement {
164
164
  `;
165
165
  }
166
166
 
167
- private renderEmailSection(email: appstate.IConfigState['config']['email']): TemplateResult {
167
+ private renderEmailSection(email: NonNullable<appstate.IConfigState['config']>['email']): TemplateResult {
168
168
  const fields: IConfigField[] = [
169
169
  { key: 'Ports', value: email.ports.length > 0 ? email.ports.map(String) : null, type: 'pills' },
170
170
  { key: 'Hostname', value: email.hostname },
@@ -196,7 +196,7 @@ export class OpsViewConfig extends DeesElement {
196
196
  `;
197
197
  }
198
198
 
199
- private renderDnsSection(dns: appstate.IConfigState['config']['dns']): TemplateResult {
199
+ private renderDnsSection(dns: NonNullable<appstate.IConfigState['config']>['dns']): TemplateResult {
200
200
  const fields: IConfigField[] = [
201
201
  { key: 'Port', value: dns.port },
202
202
  { key: 'NS Domains', value: dns.nsDomains.length > 0 ? dns.nsDomains : null, type: 'pills' },
@@ -216,7 +216,7 @@ export class OpsViewConfig extends DeesElement {
216
216
  `;
217
217
  }
218
218
 
219
- private renderTlsSection(tls: appstate.IConfigState['config']['tls']): TemplateResult {
219
+ private renderTlsSection(tls: NonNullable<appstate.IConfigState['config']>['tls']): TemplateResult {
220
220
  const fields: IConfigField[] = [
221
221
  { key: 'Contact Email', value: tls.contactEmail },
222
222
  { key: 'Domain', value: tls.domain },
@@ -242,7 +242,7 @@ export class OpsViewConfig extends DeesElement {
242
242
  `;
243
243
  }
244
244
 
245
- private renderCacheSection(cache: appstate.IConfigState['config']['cache']): TemplateResult {
245
+ private renderCacheSection(cache: NonNullable<appstate.IConfigState['config']>['cache']): TemplateResult {
246
246
  const fields: IConfigField[] = [
247
247
  { key: 'Storage Path', value: cache.storagePath },
248
248
  { key: 'DB Name', value: cache.dbName },
@@ -267,7 +267,7 @@ export class OpsViewConfig extends DeesElement {
267
267
  `;
268
268
  }
269
269
 
270
- private renderRadiusSection(radius: appstate.IConfigState['config']['radius']): TemplateResult {
270
+ private renderRadiusSection(radius: NonNullable<appstate.IConfigState['config']>['radius']): TemplateResult {
271
271
  const fields: IConfigField[] = [
272
272
  { key: 'Auth Port', value: radius.authPort },
273
273
  { key: 'Accounting Port', value: radius.acctPort },
@@ -296,7 +296,7 @@ export class OpsViewConfig extends DeesElement {
296
296
  `;
297
297
  }
298
298
 
299
- private renderRemoteIngressSection(ri: appstate.IConfigState['config']['remoteIngress']): TemplateResult {
299
+ private renderRemoteIngressSection(ri: NonNullable<appstate.IConfigState['config']>['remoteIngress']): TemplateResult {
300
300
  const fields: IConfigField[] = [
301
301
  { key: 'Tunnel Port', value: ri.tunnelPort },
302
302
  { key: 'Hub Domain', value: ri.hubDomain },
@@ -83,13 +83,13 @@ export class OpsViewEmails extends DeesElement {
83
83
  private async handleEmailClick(e: CustomEvent<interfaces.requests.IEmail>) {
84
84
  const emailSummary = e.detail;
85
85
  try {
86
- const context = appstate.loginStatePart.getState();
86
+ const context = appstate.loginStatePart.getState()!;
87
87
  const request = new plugins.domtools.plugins.typedrequest.TypedRequest<
88
88
  interfaces.requests.IReq_GetEmailDetail
89
89
  >('/typedrequest', 'getEmailDetail');
90
90
 
91
91
  const response = await request.fire({
92
- identity: context.identity,
92
+ identity: context.identity!,
93
93
  emailId: emailSummary.id,
94
94
  });
95
95
 
@@ -29,10 +29,10 @@ interface INetworkRequest {
29
29
  @customElement('ops-view-network')
30
30
  export class OpsViewNetwork extends DeesElement {
31
31
  @state()
32
- accessor statsState = appstate.statsStatePart.getState();
32
+ accessor statsState = appstate.statsStatePart.getState()!;
33
33
 
34
34
  @state()
35
- accessor networkState = appstate.networkStatePart.getState();
35
+ accessor networkState = appstate.networkStatePart.getState()!;
36
36
 
37
37
 
38
38
  @state()
@@ -21,7 +21,7 @@ declare global {
21
21
  @customElement('ops-view-remoteingress')
22
22
  export class OpsViewRemoteIngress extends DeesElement {
23
23
  @state()
24
- accessor riState: appstate.IRemoteIngressState = appstate.remoteIngressStatePart.getState();
24
+ accessor riState: appstate.IRemoteIngressState = appstate.remoteIngressStatePart.getState()!;
25
25
 
26
26
  constructor() {
27
27
  super();
@@ -184,7 +184,7 @@ export class OpsViewRemoteIngress extends DeesElement {
184
184
  @click=${async () => {
185
185
  const { DeesToast } = await import('@design.estate/dees-catalog');
186
186
  try {
187
- const response = await appstate.fetchConnectionToken(this.riState.newEdgeId);
187
+ const response = await appstate.fetchConnectionToken(this.riState.newEdgeId!);
188
188
  if (response.success && response.token) {
189
189
  if (navigator.clipboard && typeof navigator.clipboard.writeText === 'function') {
190
190
  await navigator.clipboard.writeText(response.token);
@@ -202,8 +202,8 @@ export class OpsViewRemoteIngress extends DeesElement {
202
202
  } else {
203
203
  DeesToast.show({ message: response.message || 'Failed to get token', type: 'error', duration: 4000 });
204
204
  }
205
- } catch (err) {
206
- DeesToast.show({ message: `Failed: ${err.message}`, type: 'error', duration: 4000 });
205
+ } catch (err: unknown) {
206
+ DeesToast.show({ message: `Failed: ${(err as Error).message}`, type: 'error', duration: 4000 });
207
207
  }
208
208
  }}
209
209
  >Copy Connection Token</dees-button>
@@ -399,8 +399,8 @@ export class OpsViewRemoteIngress extends DeesElement {
399
399
  } else {
400
400
  DeesToast.show({ message: response.message || 'Failed to get token', type: 'error', duration: 4000 });
401
401
  }
402
- } catch (err) {
403
- DeesToast.show({ message: `Failed: ${err.message}`, type: 'error', duration: 4000 });
402
+ } catch (err: unknown) {
403
+ DeesToast.show({ message: `Failed: ${(err as Error).message}`, type: 'error', duration: 4000 });
404
404
  }
405
405
  },
406
406
  },
package/ts_web/readme.md CHANGED
@@ -237,7 +237,7 @@ export class OpsViewMyView extends DeesElement {
237
237
 
238
238
  ## License and Legal Information
239
239
 
240
- This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [LICENSE](../LICENSE) file.
240
+ This repository contains open-source code licensed under the MIT License. A copy of the license can be found in the [license](../license) file.
241
241
 
242
242
  **Please note:** The MIT License does not grant permission to use the trade names, trademarks, service marks, or product names of the project, except as required for reasonable and customary use in describing the origin of the work and reproducing the content of the NOTICE file.
243
243
 
package/ts_web/router.ts CHANGED
@@ -71,12 +71,12 @@ class AppRouter {
71
71
 
72
72
  private updateViewState(view: string): void {
73
73
  this.suppressStateUpdate = true;
74
- const currentState = appstate.uiStatePart.getState();
74
+ const currentState = appstate.uiStatePart.getState()!;
75
75
  if (currentState.activeView !== view) {
76
76
  appstate.uiStatePart.setState({
77
77
  ...currentState,
78
78
  activeView: view,
79
- });
79
+ } as appstate.IUiState);
80
80
  }
81
81
  this.suppressStateUpdate = false;
82
82
  }
@@ -94,7 +94,7 @@ class AppRouter {
94
94
  }
95
95
 
96
96
  public getCurrentView(): string {
97
- return appstate.uiStatePart.getState().activeView;
97
+ return appstate.uiStatePart.getState()!.activeView;
98
98
  }
99
99
 
100
100
  public destroy(): void {
File without changes