40ca4b6908
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>
23 lines
1.0 KiB
C#
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;
|
|
}
|
|
}
|