using FinalFactory.Rendezvous.Server.Provisioning; using FinalFactory.Rendezvous.Server.State; using FinalFactory.Rendezvous.Server.Transport; using Microsoft.Extensions.Options; namespace FinalFactory.Rendezvous.Server.Observability; internal sealed class RendezvousReadiness( UdpMediatorService mediator, ProvisioningReadiness provisioning, IEphemeralRendezvousStore state, IOptions udpOptions) { public ReadinessSnapshot GetSnapshot() { bool ipv6Required = !string.IsNullOrWhiteSpace(udpOptions.Value.Ipv6ListenAddress); return new ReadinessSnapshot( HttpListenerReady: true, UdpIpv4ListenerReady: mediator.LocalEndpoint is not null, UdpIpv6ListenerReady: !ipv6Required || mediator.LocalIpv6Endpoint is not null, ProvisioningReady: provisioning.IsReady, StoreAvailable: state.IsAvailable, Draining: state.IsDraining); } } internal sealed record ReadinessSnapshot( bool HttpListenerReady, bool UdpIpv4ListenerReady, bool UdpIpv6ListenerReady, bool ProvisioningReady, bool StoreAvailable, bool Draining) { public bool IsReady => HttpListenerReady && UdpIpv4ListenerReady && UdpIpv6ListenerReady && ProvisioningReady && StoreAvailable && !Draining; }