Files
mxaccessgw/src/MxGateway.Server/Alarms/AlarmsServiceCollectionExtensions.cs
T
Joseph Doherty 40ca4b6908 Add gateway central alarm monitor and StreamAlarms feed
The gateway now monitors alarms continuously, independent of any client
session, and fans the feed out to every client.

GatewayAlarmMonitor is an always-on hosted service that owns one
gateway-managed worker session dedicated to alarms: it subscribes the
configured provider, caches the active-alarm set from the worker's
transition events (reconciled periodically against the worker's
authoritative snapshot), re-opens the session if the worker faults,
and broadcasts to all subscribers.

The new session-less StreamAlarms RPC opens with the current
active-alarm snapshot, then streams live transitions; any number of
clients fan out from the single monitor without opening a worker
session. AcknowledgeAlarm is now session-less and routes through the
monitor. The session-scoped QueryActiveAlarms RPC and the per-session
alarm auto-subscribe hook are removed, along with the now-dead
IAlarmRpcDispatcher trio; the dashboard Alarms tab reads the monitor's
in-process cache directly.

This intentionally reverses the v1 "no multi-subscriber fan-out"
decision for the alarm subsystem.

Contracts regenerated; gateway, dashboard and tests build clean,
94 alarm-affected tests pass, and the monitor is verified live.
Language-client stubs are regenerated in a follow-up change.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-21 16:23:56 -04:00

23 lines
1.0 KiB
C#

namespace MxGateway.Server.Alarms;
/// <summary>Service-collection wiring for the gateway's central alarm monitor.</summary>
public static class AlarmsServiceCollectionExtensions
{
/// <summary>
/// Registers the always-on <see cref="GatewayAlarmMonitor"/> as both
/// the <see cref="IGatewayAlarmService"/> singleton and a hosted
/// service, so it starts with the gateway host and is shared by the
/// gRPC alarm surface and the dashboard.
/// </summary>
/// <param name="services">Service collection to register services in.</param>
/// <returns>The service collection for chaining.</returns>
public static IServiceCollection AddGatewayAlarms(this IServiceCollection services)
{
services.AddSingleton<GatewayAlarmMonitor>();
services.AddSingleton<IGatewayAlarmService>(provider => provider.GetRequiredService<GatewayAlarmMonitor>());
services.AddHostedService(provider => provider.GetRequiredService<GatewayAlarmMonitor>());
return services;
}
}