Fixed usage of IAsyncObservable. Added runtime exit handler

This commit is contained in:
2025-07-29 21:14:41 +02:00
parent b546a168d2
commit f57d33cb1e
9 changed files with 85 additions and 57 deletions

View File

@@ -3,7 +3,6 @@ using System.Reactive.Subjects;
using System.Text;
using Docker.DotNet;
using Docker.DotNet.Models;
using Microsoft.Extensions.Options;
using MoonCore.Helpers;
using MoonlightServers.Daemon.ServerSys.Abstractions;
@@ -11,8 +10,8 @@ namespace MoonlightServers.Daemon.ServerSys.Implementations;
public class DockerConsole : IConsole
{
public IObservable<string> OnOutput => OnOutputSubject;
public IObservable<string> OnInput => OnInputSubject;
public IAsyncObservable<string> OnOutput => OnOutputSubject.ToAsyncObservable();
public IAsyncObservable<string> OnInput => OnInputSubject.ToAsyncObservable();
private readonly Subject<string> OnOutputSubject = new();
private readonly Subject<string> OnInputSubject = new();
@@ -146,13 +145,7 @@ public class DockerConsole : IConsole
OutputCache.Add(content);
if (OutputCache.Count > 250) // TODO: Config
{
// TODO: Replace with remove range once it becomes available in mooncore
for (var i = 0; i < 100; i++)
{
OutputCache.RemoveAt(i);
}
}
OutputCache.RemoveRange(0, 100);
OnOutputSubject.OnNext(content);
return Task.CompletedTask;

View File

@@ -1,21 +1,30 @@
using System.Reactive.Linq;
using System.Reactive.Subjects;
using MoonlightServers.Daemon.ServerSys.Abstractions;
using MoonlightServers.Daemon.Services;
namespace MoonlightServers.Daemon.ServerSys.Implementations;
public class DockerInstaller : IInstaller
{
public IObservable<object> OnExited => OnExitedSubject;
public IAsyncObservable<object> OnExited => OnExitedSubject.ToAsyncObservable();
public bool IsRunning { get; private set; } = false;
private readonly Subject<string> OnExitedSubject = new();
private readonly ILogger<DockerInstaller> Logger;
public DockerInstaller(ILogger<DockerInstaller> logger)
private readonly Subject<string> OnExitedSubject = new();
private readonly ILogger<DockerInstaller> Logger;
private readonly DockerEventService EventService;
private string? ContainerId;
private string? ContainerName;
public DockerInstaller(
ILogger<DockerInstaller> logger,
DockerEventService eventService
)
{
Logger = logger;
EventService = eventService;
}
public Task Initialize()
@@ -27,7 +36,7 @@ public class DockerInstaller : IInstaller
{
throw new NotImplementedException();
}
public Task Start()
{
throw new NotImplementedException();
@@ -47,7 +56,7 @@ public class DockerInstaller : IInstaller
{
throw new NotImplementedException();
}
public async ValueTask DisposeAsync()
{
OnExitedSubject.Dispose();

View File

@@ -11,7 +11,7 @@ namespace MoonlightServers.Daemon.ServerSys.Implementations;
public class DockerProvisioner : IProvisioner
{
public IObservable<object> OnExited => OnExitedSubject;
public IAsyncObservable<object> OnExited => OnExitedSubject.ToAsyncObservable();
public bool IsProvisioned { get; private set; }
private readonly DockerClient DockerClient;
@@ -27,7 +27,7 @@ public class DockerProvisioner : IProvisioner
private string? ContainerId;
private string ContainerName;
private IDisposable? ContainerEventSubscription;
private IAsyncDisposable? ContainerEventSubscription;
public DockerProvisioner(
DockerClient dockerClient,
@@ -54,9 +54,9 @@ public class DockerProvisioner : IProvisioner
{
ContainerName = $"moonlight-runtime-{Context.Configuration.Id}";
ContainerEventSubscription = EventService
ContainerEventSubscription = await EventService
.OnContainerEvent
.Subscribe(HandleContainerEvent);
.SubscribeAsync(HandleContainerEvent);
// Check for any already existing runtime container to reclaim
Logger.LogDebug("Searching for orphan container to reclaim");
@@ -74,17 +74,19 @@ public class DockerProvisioner : IProvisioner
}
}
private void HandleContainerEvent(Message message)
private ValueTask HandleContainerEvent(Message message)
{
// Only handle events for our own container
if (message.ID != ContainerId)
return;
return ValueTask.CompletedTask;
// Only handle die events
if (message.Action != "die")
return;
return ValueTask.CompletedTask;
OnExitedSubject.OnNext(message);
return ValueTask.CompletedTask;
}
public Task Sync()
@@ -253,6 +255,6 @@ public class DockerProvisioner : IProvisioner
OnExitedSubject.Dispose();
if (ContainerEventSubscription != null)
ContainerEventSubscription.Dispose();
await ContainerEventSubscription.DisposeAsync();
}
}