44 lines
1.2 KiB
C#
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();
|
|
}
|