RobotNet/RobotNet.Clients/HubClient.cs
2025-10-15 15:15:53 +07:00

61 lines
1.9 KiB
C#

using Microsoft.AspNetCore.SignalR.Client;
namespace RobotNet.Clients;
public abstract class HubClient
{
public event Action<HubConnectionState>? ConnectionStateChanged;
public bool IsConnected => Connection.State == HubConnectionState.Connected;
protected HubConnection Connection { get; }
protected HubClient(Uri url, Func<Task<string?>> accessTokenProvider)
{
Connection = new HubConnectionBuilder()
.WithUrl(url, options =>
{
options.AccessTokenProvider = accessTokenProvider;
})
.WithAutomaticReconnect(new HubClientRepeatRetryPolicy(TimeSpan.FromSeconds(3)))
.Build();
Connection.Closed += Connection_Closed;
Connection.Reconnected += Connection_Reconnected;
}
private Task Connection_Closed(Exception? arg)
{
ConnectionStateChanged?.Invoke(Connection.State);
return Task.CompletedTask;
}
private Task Connection_Reconnected(string? arg)
{
ConnectionStateChanged?.Invoke(Connection.State);
return Task.CompletedTask;
}
public virtual async Task StartAsync()
{
if (Connection.State == HubConnectionState.Disconnected)
{
await Connection.StartAsync();
ConnectionStateChanged?.Invoke(Connection.State);
}
}
public virtual async Task StopAsync()
{
if (Connection.State != HubConnectionState.Disconnected)
{
await Connection.StopAsync();
ConnectionStateChanged?.Invoke(Connection.State);
}
}
public class HubClientRepeatRetryPolicy(TimeSpan repeatSpan) : IRetryPolicy
{
private readonly TimeSpan RepeatTimeSpan = repeatSpan;
public TimeSpan? NextRetryDelay(RetryContext retryContext) => RepeatTimeSpan;
}
}