internal sealed class AspireHostService()

in src/dotnet/AspireWorker/AspireHost/AspireHostService.cs [11:62]


internal sealed class AspireHostService(
    IRdConnectionWrapper connectionWrapper,
    ResiliencePipelineProvider<string> resiliencePipelineProvider,
    IHostEnvironment hostEnvironment,
    ILoggerFactory loggerFactory
) : IAspireHostService
{
    private readonly Dictionary<string, AspireHost> _hosts = new();

    public void AddNewHost(string id, AspireHostModel host, Lifetime lifetime)
    {
        var aspireHost = new AspireHost(
            id,
            connectionWrapper,
            host,
            resiliencePipelineProvider,
            hostEnvironment,
            loggerFactory,
            lifetime);

        _hosts.AddLifetimed(lifetime, new KeyValuePair<string, AspireHost>(id, aspireHost));
    }

    public async Task<(string? sessionId, ErrorResponse? error)?> CreateSession(string aspireHostId, Session session)
    {
        var aspireHost = _hosts.GetValueOrDefault(aspireHostId);
        if (aspireHost is null)
        {
            return null;
        }

        return await aspireHost.Create(session);
    }

    public async Task<(string? sessionId, ErrorResponse? error)?> DeleteSession(string aspireHostId, string sessionId)
    {
        var aspireHost = _hosts.GetValueOrDefault(aspireHostId);
        if (aspireHost is null)
        {
            return null;
        }

        return await aspireHost.Delete(sessionId);
    }

    public ChannelReader<ISessionEvent>? GetSessionEventReader(string aspireHostId)
    {
        var aspireHost = _hosts.GetValueOrDefault(aspireHostId);

        return aspireHost?.SessionEventReader;
    }
}