@serve.zone/dcrouter 13.38.4 → 13.40.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/deno.json +1 -1
- package/dist_serve/bundle.js +350 -343
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/db/documents/classes.remote-ingress-edge.doc.d.ts +2 -0
- package/dist_ts/db/documents/classes.remote-ingress-edge.doc.js +8 -2
- package/dist_ts/http3/http3-route-augmentation.d.ts +1 -1
- package/dist_ts/http3/http3-route-augmentation.js +3 -17
- package/dist_ts/monitoring/classes.metricsmanager.d.ts +2 -0
- package/dist_ts/monitoring/classes.metricsmanager.js +53 -19
- package/dist_ts/opsserver/handlers/remoteingress.handler.js +3 -2
- package/dist_ts/opsserver/handlers/security.handler.d.ts +2 -0
- package/dist_ts/opsserver/handlers/security.handler.js +50 -73
- package/dist_ts/radius/classes.radius.server.d.ts +0 -5
- package/dist_ts/radius/classes.radius.server.js +46 -78
- package/dist_ts/remoteingress/classes.remoteingress-manager.d.ts +4 -2
- package/dist_ts/remoteingress/classes.remoteingress-manager.js +9 -21
- package/dist_ts_interfaces/data/remoteingress.d.ts +10 -0
- package/dist_ts_interfaces/requests/remoteingress.d.ts +3 -1
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/dist_ts_web/appstate.d.ts +2 -0
- package/dist_ts_web/appstate.js +3 -1
- package/dist_ts_web/elements/network/ops-view-remoteingress.d.ts +2 -0
- package/dist_ts_web/elements/network/ops-view-remoteingress.js +55 -2
- package/dist_ts_web/elements/overview/ops-view-config.js +4 -1
- package/package.json +3 -3
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/db/documents/classes.remote-ingress-edge.doc.ts +4 -0
- package/ts/http3/http3-route-augmentation.ts +2 -18
- package/ts/monitoring/classes.metricsmanager.ts +59 -21
- package/ts/opsserver/handlers/remoteingress.handler.ts +2 -0
- package/ts/opsserver/handlers/security.handler.ts +57 -109
- package/ts/radius/classes.radius.server.ts +54 -80
- package/ts/remoteingress/classes.remoteingress-manager.ts +12 -21
- package/ts_web/00_commitinfo_data.ts +1 -1
- package/ts_web/appstate.ts +4 -0
- package/ts_web/elements/network/ops-view-remoteingress.ts +57 -1
- package/ts_web/elements/overview/ops-view-config.ts +10 -0
|
@@ -242,6 +242,7 @@ export class OpsViewRemoteIngress extends DeesElement {
|
|
|
242
242
|
publicIp: this.getEdgePublicIp(edge.id),
|
|
243
243
|
ports: this.getPortsHtml(edge),
|
|
244
244
|
tunnels: this.getEdgeTunnelCount(edge.id),
|
|
245
|
+
maxConnections: this.getMaxConnectionsHtml(edge),
|
|
245
246
|
window: this.getWindowHtml(edge.id),
|
|
246
247
|
queues: this.getQueuesHtml(edge.id),
|
|
247
248
|
traffic: this.getTrafficHtml(edge.id),
|
|
@@ -261,6 +262,7 @@ export class OpsViewRemoteIngress extends DeesElement {
|
|
|
261
262
|
<dees-input-text .key=${'name'} .label=${'Name'} .required=${true}></dees-input-text>
|
|
262
263
|
<dees-input-text .key=${'listenPorts'} .label=${'Manual Ports'} .description=${'Comma-separated port numbers, optional'}></dees-input-text>
|
|
263
264
|
<dees-input-checkbox .key=${'autoDerivePorts'} .label=${'Auto-derive ports from routes'} .value=${true}></dees-input-checkbox>
|
|
265
|
+
<dees-input-text .key=${'maxStreamsPerEdge'} .label=${'Max Connections'} .description=${'Optional maximum concurrent client connections for this edge. Leave empty to use the hub default.'}></dees-input-text>
|
|
264
266
|
<dees-input-text .key=${'tags'} .label=${'Tags'} .description=${'Comma-separated, optional'}></dees-input-text>
|
|
265
267
|
</dees-form>
|
|
266
268
|
`,
|
|
@@ -284,12 +286,20 @@ export class OpsViewRemoteIngress extends DeesElement {
|
|
|
284
286
|
? portsStr.split(',').map((p: string) => parseInt(p.trim(), 10)).filter((p: number) => !isNaN(p))
|
|
285
287
|
: undefined;
|
|
286
288
|
const autoDerivePorts = formData.autoDerivePorts !== false;
|
|
289
|
+
let performance: interfaces.data.IRemoteIngressPerformanceConfig | undefined;
|
|
290
|
+
try {
|
|
291
|
+
performance = this.collectPerformanceOverride(formData);
|
|
292
|
+
} catch (err: unknown) {
|
|
293
|
+
const { DeesToast } = await import('@design.estate/dees-catalog');
|
|
294
|
+
DeesToast.show({ message: (err as Error).message, type: 'error', duration: 4000 });
|
|
295
|
+
return;
|
|
296
|
+
}
|
|
287
297
|
const tags = formData.tags
|
|
288
298
|
? formData.tags.split(',').map((t: string) => t.trim()).filter(Boolean)
|
|
289
299
|
: undefined;
|
|
290
300
|
await appstate.remoteIngressStatePart.dispatchAction(
|
|
291
301
|
appstate.createRemoteIngressAction,
|
|
292
|
-
{ name, listenPorts, autoDerivePorts, tags },
|
|
302
|
+
{ name, listenPorts, autoDerivePorts, performance, tags },
|
|
293
303
|
);
|
|
294
304
|
await modalArg.destroy();
|
|
295
305
|
},
|
|
@@ -338,6 +348,7 @@ export class OpsViewRemoteIngress extends DeesElement {
|
|
|
338
348
|
<dees-input-text .key=${'name'} .label=${'Name'} .value=${edge.name}></dees-input-text>
|
|
339
349
|
<dees-input-text .key=${'listenPorts'} .label=${'Manual Ports'} .description=${'Comma-separated port numbers'} .value=${(edge.listenPorts || []).join(', ')}></dees-input-text>
|
|
340
350
|
<dees-input-checkbox .key=${'autoDerivePorts'} .label=${'Auto-derive ports from routes'} .value=${edge.autoDerivePorts !== false}></dees-input-checkbox>
|
|
351
|
+
<dees-input-text .key=${'maxStreamsPerEdge'} .label=${'Max Connections'} .description=${'Optional maximum concurrent client connections for this edge. Leave empty to use the hub default.'} .value=${edge.performance?.maxStreamsPerEdge?.toString() || ''}></dees-input-text>
|
|
341
352
|
<dees-input-text .key=${'tags'} .label=${'Tags'} .description=${'Comma-separated'} .value=${(edge.tags || []).join(', ')}></dees-input-text>
|
|
342
353
|
</dees-form>
|
|
343
354
|
`,
|
|
@@ -359,6 +370,14 @@ export class OpsViewRemoteIngress extends DeesElement {
|
|
|
359
370
|
? portsStr.split(',').map((p: string) => parseInt(p.trim(), 10)).filter((p: number) => !isNaN(p))
|
|
360
371
|
: [];
|
|
361
372
|
const autoDerivePorts = formData.autoDerivePorts !== false;
|
|
373
|
+
let performance: interfaces.data.IRemoteIngressPerformanceConfig | undefined;
|
|
374
|
+
try {
|
|
375
|
+
performance = this.collectPerformanceOverride(formData, edge.performance);
|
|
376
|
+
} catch (err: unknown) {
|
|
377
|
+
const { DeesToast } = await import('@design.estate/dees-catalog');
|
|
378
|
+
DeesToast.show({ message: (err as Error).message, type: 'error', duration: 4000 });
|
|
379
|
+
return;
|
|
380
|
+
}
|
|
362
381
|
const tags = formData.tags
|
|
363
382
|
? formData.tags.split(',').map((t: string) => t.trim()).filter(Boolean)
|
|
364
383
|
: [];
|
|
@@ -369,6 +388,7 @@ export class OpsViewRemoteIngress extends DeesElement {
|
|
|
369
388
|
name: formData.name || edge.name,
|
|
370
389
|
listenPorts,
|
|
371
390
|
autoDerivePorts,
|
|
391
|
+
performance,
|
|
372
392
|
tags,
|
|
373
393
|
},
|
|
374
394
|
);
|
|
@@ -475,6 +495,19 @@ export class OpsViewRemoteIngress extends DeesElement {
|
|
|
475
495
|
return status?.activeTunnels || 0;
|
|
476
496
|
}
|
|
477
497
|
|
|
498
|
+
private getMaxConnectionsHtml(edge: interfaces.data.IRemoteIngress): TemplateResult | string {
|
|
499
|
+
const status = this.getEdgeStatus(edge.id);
|
|
500
|
+
const override = edge.performance?.maxStreamsPerEdge;
|
|
501
|
+
const effective = status?.performance?.maxStreamsPerEdge;
|
|
502
|
+
if (!override && !effective) return '-';
|
|
503
|
+
return html`
|
|
504
|
+
<div class="metricStack">
|
|
505
|
+
<span>${override || effective}</span>
|
|
506
|
+
<span class="metricMuted">${override ? 'edge override' : 'hub default'}</span>
|
|
507
|
+
</div>
|
|
508
|
+
`;
|
|
509
|
+
}
|
|
510
|
+
|
|
478
511
|
private getTransportHtml(edgeId: string): TemplateResult | string {
|
|
479
512
|
const status = this.getEdgeStatus(edgeId);
|
|
480
513
|
if (!status?.connected) return '-';
|
|
@@ -535,4 +568,27 @@ export class OpsViewRemoteIngress extends DeesElement {
|
|
|
535
568
|
}
|
|
536
569
|
return `${value >= 10 || unitIndex === 0 ? value.toFixed(0) : value.toFixed(1)} ${units[unitIndex]}`;
|
|
537
570
|
}
|
|
571
|
+
|
|
572
|
+
private collectPerformanceOverride(
|
|
573
|
+
formData: Record<string, any>,
|
|
574
|
+
base?: interfaces.data.IRemoteIngressPerformanceConfig,
|
|
575
|
+
): interfaces.data.IRemoteIngressPerformanceConfig | undefined {
|
|
576
|
+
const next: interfaces.data.IRemoteIngressPerformanceConfig = { ...(base || {}) };
|
|
577
|
+
const maxStreamsText = `${formData.maxStreamsPerEdge || ''}`.trim();
|
|
578
|
+
if (maxStreamsText) {
|
|
579
|
+
const maxStreamsPerEdge = Number.parseInt(maxStreamsText, 10);
|
|
580
|
+
if (!Number.isInteger(maxStreamsPerEdge) || maxStreamsPerEdge < 1) {
|
|
581
|
+
throw new Error('Max Connections must be a positive integer');
|
|
582
|
+
}
|
|
583
|
+
next.maxStreamsPerEdge = maxStreamsPerEdge;
|
|
584
|
+
} else {
|
|
585
|
+
delete next.maxStreamsPerEdge;
|
|
586
|
+
}
|
|
587
|
+
|
|
588
|
+
if (Object.keys(next).length > 0) {
|
|
589
|
+
return next;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
return base ? {} : undefined;
|
|
593
|
+
}
|
|
538
594
|
}
|
|
@@ -304,6 +304,16 @@ export class OpsViewConfig extends DeesElement {
|
|
|
304
304
|
{ key: 'Connected Edge IPs', value: ri.connectedEdgeIps?.length > 0 ? ri.connectedEdgeIps : null, type: 'pills' },
|
|
305
305
|
];
|
|
306
306
|
|
|
307
|
+
if (ri.performance) {
|
|
308
|
+
fields.push(
|
|
309
|
+
{ key: 'Performance Profile', value: ri.performance.profile || null, type: 'badge' },
|
|
310
|
+
{ key: 'Max Connections / Edge', value: ri.performance.maxStreamsPerEdge ?? null },
|
|
311
|
+
{ key: 'Client Write Timeout', value: ri.performance.clientWriteTimeoutMs ? `${ri.performance.clientWriteTimeoutMs} ms` : null },
|
|
312
|
+
{ key: 'First Data Timeout', value: ri.performance.firstDataConnectTimeoutMs ? `${ri.performance.firstDataConnectTimeoutMs} ms` : null },
|
|
313
|
+
{ key: 'Server-first Ports', value: ri.performance.serverFirstPorts?.length ? ri.performance.serverFirstPorts.map(String) : null, type: 'pills' },
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
|
|
307
317
|
const actions: IConfigSectionAction[] = [
|
|
308
318
|
{ label: 'View Remote Ingress', icon: 'lucide:arrow-right', event: 'navigate', detail: { view: 'network', subview: 'remoteingress' } },
|
|
309
319
|
];
|