namespace Zcbot.WindowsNode; internal sealed class NodeConnectionLoop : INodeConnection { private readonly JobCoordinator coordinator; private readonly NodeSession session; internal NodeConnectionLoop( NodeConfig config, NodePaths paths, Action? 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(); }