78 lines
1.9 KiB
C#
78 lines
1.9 KiB
C#
using Microsoft.AspNetCore.Authorization;
|
|
using Microsoft.AspNetCore.SignalR;
|
|
using Microsoft.AspNetCore.Cors;
|
|
using TypedSignalR.Client;
|
|
using Tapper;
|
|
using server.Services;
|
|
|
|
#pragma warning disable 1998
|
|
|
|
namespace server.Hubs;
|
|
|
|
[Hub]
|
|
public interface IProgressHub
|
|
{
|
|
Task<bool> Join(string taskId);
|
|
Task<bool> Leave(string taskId);
|
|
Task<ProgressInfo?> GetProgress(string taskId);
|
|
}
|
|
|
|
[Receiver]
|
|
public interface IProgressReceiver
|
|
{
|
|
Task OnReceiveProgress(ProgressInfo message);
|
|
}
|
|
|
|
[TranspilationSource]
|
|
public enum ProgressStatus
|
|
{
|
|
Running,
|
|
Completed,
|
|
Canceled,
|
|
Failed
|
|
}
|
|
|
|
[TranspilationSource]
|
|
public class ProgressInfo
|
|
{
|
|
public required string TaskId { get; set; }
|
|
public required ProgressStatus Status { get; set; }
|
|
public required double ProgressPercent { get; set; }
|
|
public required string ErrorMessage { get; set; }
|
|
};
|
|
|
|
[Authorize]
|
|
[EnableCors("SignalR")]
|
|
public class ProgressHub : Hub<IProgressReceiver>, IProgressHub
|
|
{
|
|
private static NLog.Logger logger = NLog.LogManager.GetCurrentClassLogger();
|
|
private readonly ProgressTracker _progressTracker = MsgBus.ProgressTracker;
|
|
|
|
public async Task<bool> Join(string taskId)
|
|
{
|
|
await Groups.AddToGroupAsync(Context.ConnectionId, taskId);
|
|
|
|
// 发送当前状态(如果存在)
|
|
var task = _progressTracker.GetTask(taskId);
|
|
if (task != null)
|
|
{
|
|
await Clients.Caller.OnReceiveProgress(task.Value.ToProgressInfo());
|
|
}
|
|
|
|
logger.Info($"Client {Context.ConnectionId} joined task {taskId}");
|
|
return true;
|
|
}
|
|
|
|
public async Task<bool> Leave(string taskId)
|
|
{
|
|
await Groups.RemoveFromGroupAsync(Context.ConnectionId, taskId);
|
|
logger.Info($"Client {Context.ConnectionId} left task {taskId}");
|
|
return true;
|
|
}
|
|
|
|
public async Task<ProgressInfo?> GetProgress(string taskId)
|
|
{
|
|
return _progressTracker.GetTask(taskId)?.ToProgressInfo();
|
|
}
|
|
}
|