zcbot/windows-node/Zcbot.WindowsNode/Host/NodeConnectionLoop.cs

44 lines
1.2 KiB
C#

namespace Zcbot.WindowsNode;
internal sealed class NodeConnectionLoop : INodeConnection
{
private readonly JobCoordinator coordinator;
private readonly NodeSession session;
internal NodeConnectionLoop(
NodeConfig config,
NodePaths paths,
Action<NodeStatus>? statusChanged = null)
{
coordinator = new JobCoordinator(config, paths);
session = new NodeSession(
config,
coordinator.RuntimePayload,
coordinator.ReportRecoverableJobsAsync,
coordinator.ResumeDeferredUploadsAsync,
coordinator.HandleMessageAsync,
(state, message) => statusChanged?.Invoke(NodeStatus.Create(state, message)));
}
public async Task RunAsync(CancellationToken cancellationToken)
{
try
{
await session.RunAsync(cancellationToken);
}
finally
{
try
{
await coordinator.WaitForIdleAsync();
}
finally
{
coordinator.Dispose();
}
}
}
public void CancelActiveJobsForExit() => coordinator.CancelActiveJobsForExit();
}