using Microsoft.AspNetCore.SignalR; namespace ZB.MOM.WW.MxGateway.Server.Dashboard.Hubs; /// /// Background service that subscribes to /// and broadcasts every snapshot it produces to every connected /// client. There is one publisher per /// gateway process; clients listen via the hub. /// public sealed class DashboardSnapshotPublisher( IDashboardSnapshotService snapshotService, IHubContext hubContext, ILogger logger) : BackgroundService { protected override async Task ExecuteAsync(CancellationToken stoppingToken) { try { await foreach (DashboardSnapshot snapshot in snapshotService .WatchSnapshotsAsync(stoppingToken) .ConfigureAwait(false)) { try { await hubContext.Clients .All .SendAsync(DashboardSnapshotHub.SnapshotMessage, snapshot, stoppingToken) .ConfigureAwait(false); } catch (Exception ex) when (ex is not OperationCanceledException) { logger.LogWarning(ex, "Snapshot broadcast failed; will retry on the next snapshot tick."); } } } catch (OperationCanceledException) { } } }