File: NatsHealthCheck.cs
Web Access
Project: src\src\Components\Aspire.NATS.Net\Aspire.NATS.Net.csproj (Aspire.NATS.Net)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using Microsoft.Extensions.Diagnostics.HealthChecks;
using NATS.Client.Core;
 
namespace Aspire.NATS.Net;
 
internal sealed class NatsHealthCheck(INatsConnection connection) : IHealthCheck
{
    public async Task<HealthCheckResult> CheckHealthAsync(HealthCheckContext context, CancellationToken cancellationToken = default)
    {
        var result = connection.ConnectionState switch
        {
            NatsConnectionState.Open => HealthCheckResult.Healthy(),
            NatsConnectionState.Connecting or NatsConnectionState.Reconnecting => HealthCheckResult.Degraded(),
            NatsConnectionState.Closed => await TryConnect(connection).ConfigureAwait(false),
            _ => new HealthCheckResult(context.Registration.FailureStatus)
        };
 
        return result;
    }
 
    private static async Task<HealthCheckResult> TryConnect(INatsConnection natsConnection)
    {
        try
        {
            await natsConnection.ConnectAsync().ConfigureAwait(false);
            return HealthCheckResult.Healthy();
        }
        catch (Exception)
        {
            return HealthCheckResult.Unhealthy();
        }
    }
}