mbproxy: close out the dashboard code-review minor findings

Resolves the remaining Minor items from the 2026-05-15 review so the
web-UI dashboard work has no open follow-ups: a real-HubConnection
end-to-end test for the SignalR feed, stable mbproxy.admin.broadcast.*
log-event names, keyboard/aria accessibility on the fleet table,
frontend JS hardening (URL-decode guard, NaN guards, shared util.js),
reconciler<->capture-registry coverage, throwing-sink and embedded-asset
tests, broadcaster polish, and a soft upper bound on AdminPushIntervalMs.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Joseph Doherty
2026-05-16 16:36:39 -04:00
parent 374eecd205
commit 0308490aef
21 changed files with 576 additions and 67 deletions
@@ -11,7 +11,8 @@ public sealed class MbproxyOptions
/// <summary>
/// Server-push cadence (milliseconds) for the admin dashboard's SignalR feed.
/// Every interval the admin endpoint builds a status snapshot and pushes it to
/// connected dashboard / detail-page clients. Must be &gt; 0. Defaults to 1000.
/// connected dashboard / detail-page clients. Must be in the range 160000 ms
/// (a value past a minute makes the "live" feed non-live). Defaults to 1000.
/// </summary>
public int AdminPushIntervalMs { get; init; } = 1000;
@@ -114,8 +115,12 @@ public sealed class MbproxyOptionsValidator : IValidateOptions<MbproxyOptions>
errors.Add(
$"Connection.GracefulShutdownTimeoutMs must be > 0; got {options.Connection.GracefulShutdownTimeoutMs}.");
if (options.AdminPushIntervalMs <= 0)
errors.Add($"AdminPushIntervalMs must be > 0; got {options.AdminPushIntervalMs}.");
// AdminPushIntervalMs has a soft upper bound: a value past a minute makes the
// dashboard's "live" feed effectively non-live, which is almost always a typo
// (e.g. a seconds value pasted as milliseconds) rather than an intent.
if (options.AdminPushIntervalMs <= 0 || options.AdminPushIntervalMs > 60_000)
errors.Add(
$"AdminPushIntervalMs must be between 1 and 60000 ms; got {options.AdminPushIntervalMs}.");
// Keepalive section ranges. Cross-field rules (heartbeat interval vs request
// timeout) are enforced in ReloadValidator.