File: BrowserLogsPipeBrowserProcess.cs
Web Access
Project: src\src\Aspire.Hosting.Browsers\Aspire.Hosting.Browsers.csproj (Aspire.Hosting.Browsers)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
namespace Aspire.Hosting;
 
internal interface IBrowserLogsPipeBrowserProcess : IAsyncDisposable
{
    int ProcessId { get; }
 
    Stream BrowserOutput { get; }
 
    Stream BrowserInput { get; }
 
    Task<BrowserLogsProcessResult> ProcessTask { get; }
}
 
internal sealed class BrowserLogsPipeBrowserProcess(
    int processId,
    Stream browserOutput,
    Stream browserInput,
    Task<BrowserLogsProcessResult> processTask,
    IBrowserLogsPipeBrowserProcessLifetime processLifetime) : IBrowserLogsPipeBrowserProcess
{
    private readonly Stream _browserInput = browserInput;
    private readonly Stream _browserOutput = browserOutput;
    private readonly IBrowserLogsPipeBrowserProcessLifetime _processLifetime = processLifetime;
    private int _disposed;
 
    public int ProcessId { get; } = processId;
 
    public Stream BrowserOutput => _browserOutput;
 
    public Stream BrowserInput => _browserInput;
 
    public Task<BrowserLogsProcessResult> ProcessTask { get; } = processTask;
 
    public async ValueTask DisposeAsync()
    {
        if (Interlocked.Exchange(ref _disposed, 1) != 0)
        {
            return;
        }
 
        try
        {
            await _browserInput.DisposeAsync().ConfigureAwait(false);
        }
        finally
        {
            try
            {
                await _browserOutput.DisposeAsync().ConfigureAwait(false);
            }
            finally
            {
                await _processLifetime.DisposeAsync().ConfigureAwait(false);
            }
        }
    }
}
 
internal interface IBrowserLogsPipeBrowserProcessLifetime
{
    ValueTask DisposeAsync();
}