TourIAm/TIAMWebApp/Shared/Services/AcSignalRClientBase.cs

74 lines
2.6 KiB
C#

using AyCode.Core.Enums;
using AyCode.Core.Helpers;
using AyCode.Core.Loggers;
using AyCode.Entities.LogItems;
using AyCode.Services.Loggers;
using AyCode.Services.SignalRs;
using MessagePack;
using Microsoft.AspNetCore.SignalR.Client;
using Microsoft.Extensions.DependencyInjection;
using TIAMWebApp.Shared.Application.Models.ClientSide;
using TIAMWebApp.Shared.Application.Utility;
namespace TIAMWebApp.Shared.Application.Services
{
public class DevAdminSignalClient(IEnumerable<IAcLogWriterClientBase> logWriters) : AcSignalRClientBase("DevAdminHub", logWriters);
public abstract class AcSignalRClientBase : IAcSignalRHubClient
{
protected readonly HubConnection HubConnection;
protected readonly LoggerClient Logger;
protected AcSignalRClientBase(string hubName, IEnumerable<IAcLogWriterClientBase> logWriters)
{
Logger = new LoggerClient(GetType().Name, logWriters.ToArray());
HubConnection = new HubConnectionBuilder()
.WithUrl($"{Setting.BaseUrl}/{hubName}")
//.AddMessagePackProtocol(options => options.SerializerOptions = MessagePackSerializerOptions.Standard.WithSecurity(MessagePackSecurity.UntrustedData))
.Build();
HubConnection.On<string, int, object?>("Post", Post);
HubConnection.StartAsync().Forget();
}
public async Task StartConnection()
{
if (HubConnection.State == HubConnectionState.Disconnected)
await HubConnection.StartAsync();
if (HubConnection.State != HubConnectionState.Connected)
await TaskHelper.WaitToAsync(() => HubConnection.State == HubConnectionState.Connected, 3000, 100);
}
public async Task StopConnection()
{
await HubConnection.StopAsync();
await HubConnection.DisposeAsync();
}
public virtual async Task Get(string user, int messageTag)
{
Logger.Info($"{nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}");
await StartConnection();
await HubConnection.SendAsync("Get", "", SignalRTags.GetTransfersAsync);
}
public virtual async Task Post(string user, int messageTag, object? message)
{
Logger.Info($"{nameof(user)}: {user}; {nameof(messageTag)}: {messageTag}");
if (messageTag == SignalRTags.PostTransfersAsync)
{
return;
}
await StartConnection();
await HubConnection.SendAsync("Post", SignalRTags.PostTransfersAsync, message);
}
}
}