File: Commands\AppHostStartupTimeout.cs
Web Access
Project: src\src\Aspire.Cli\Aspire.Cli.csproj (aspire)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Globalization;
using Aspire.Cli.Interaction;
using Aspire.Cli.Resources;
using Aspire.Hosting;
using Microsoft.Extensions.Configuration;
 
namespace Aspire.Cli.Commands;
 
internal static class AppHostStartupTimeout
{
    public static bool TryGetTimeoutSeconds(IConfiguration configuration, IInteractionService interactionService, out int timeoutSeconds)
    {
        timeoutSeconds = WaitCommand.DefaultTimeoutSeconds;
 
        var configuredTimeout = configuration[CliConfigNames.AppHostStartupTimeout];
        if (string.IsNullOrWhiteSpace(configuredTimeout))
        {
            return true;
        }
 
        if (int.TryParse(configuredTimeout, NumberStyles.None, CultureInfo.InvariantCulture, out var parsedTimeout) &&
            parsedTimeout > 0)
        {
            timeoutSeconds = parsedTimeout;
            return true;
        }
 
        interactionService.DisplayError(string.Format(
            CultureInfo.CurrentCulture,
            RunCommandStrings.InvalidAppHostStartupTimeoutEnvironmentVariable,
            CliConfigNames.AppHostStartupTimeout));
        return false;
    }
 
    public static TimeSpan GetBackchannelConnectionTimeout(IConfiguration configuration)
    {
        var configuredValue = configuration[KnownConfigNames.CliBackchannelConnectTimeoutSeconds];
        if (double.TryParse(configuredValue, CultureInfo.InvariantCulture, out var seconds)
            && double.IsFinite(seconds)
            && seconds >= 0
            && seconds <= TimeSpan.MaxValue.TotalSeconds)
        {
            return TimeSpan.FromSeconds(seconds);
        }
 
        var timeout = TimeSpan.FromSeconds(WaitCommand.DefaultTimeoutSeconds);
        var configuredStartupTimeout = configuration[CliConfigNames.AppHostStartupTimeout];
        if (int.TryParse(configuredStartupTimeout, CultureInfo.InvariantCulture, out var startupTimeoutSeconds) && startupTimeoutSeconds > timeout.TotalSeconds)
        {
            timeout = TimeSpan.FromSeconds(startupTimeoutSeconds);
        }
 
        return timeout;
    }
}