using AyCode.Core.Extensions; using AyCode.Core.Helpers; using AyCode.Core.Loggers; using AyCode.Core.Serializers.Binaries; using AyCode.Core.Serializers.Jsons; using AyCode.Services.SignalRs; using Microsoft.AspNetCore.SignalR; namespace AyCode.Services.Server.SignalRs; public abstract class AcSignalRSendToClientService(IHubContext signalRHub, IAcLoggerBase logger) where TSignalRHub: Hub, IAcSignalRHubServer where TSignalRTags : AcSignalRTags where TLogger : IAcLoggerBase { protected IAcLoggerBase Logger => logger; protected virtual async Task SendMessageToClient(IAcSignalRHubItemServer sendTo, int messageTag, object? content) { var responseBytes = SignalRSerializationHelper.CreateResponseData(content, AcBinarySerializerOptions.Default) ?? []; var responseData = new SignalData(responseBytes); var signalParams = new SignalParams { Status = SignalResponseStatus.Success, DataSerializerType = AyCode.Core.Serializers.AcSerializerType.Binary }; Logger.Info($"[{responseData.Length / 1024}kb] Server sending to client; {ConstHelper.NameByValue(messageTag)}"); await sendTo.OnReceiveMessage(messageTag, null, signalParams, responseData); } public virtual Task SendMessageToAllClients(int messageTag, object? content) => SendMessageToClient(signalRHub.Clients.All, messageTag, content); public virtual Task SendMessageToConnection(string connectionId, int messageTag, object? content) => SendMessageToClient(signalRHub.Clients.Client(connectionId), messageTag, content); public virtual Task SendMessageToConnections(IEnumerable connectionIds, int messageTag, object? content) => SendMessageToClient(signalRHub.Clients.Clients(connectionIds), messageTag, content); public virtual Task SendMessageToUser(string user, int messageTag, object? content) => SendMessageToClient(signalRHub.Clients.User(user), messageTag, content); public virtual Task SendMessageToUsers(IEnumerable users, int messageTag, object? content) => SendMessageToClient(signalRHub.Clients.Users(users), messageTag, content); }