using AyCode.Core.Extensions; using AyCode.Core.Helpers; using AyCode.Core.Loggers; using AyCode.Services.Loggers; using AyCode.Services.SignalRs; using MessagePack.Resolvers; using Microsoft.AspNetCore.SignalR; using Microsoft.Extensions.Logging; namespace AyCode.Services.Server.SignalRs; public abstract class AcSignalRSendToClientService(IHubContext signalRHub, IAcLoggerBase logger) //: IAcSignalRHubServer 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 jsonContent = new SignalResponseJsonMessage(messageTag, SignalResponseStatus.Success, content); await SendMessageToClient(sendTo, messageTag, jsonContent, null); } protected virtual async Task SendMessageToClient(IAcSignalRHubItemServer sendTo, int messageTag, ISignalRMessage message, int? requestId = null) { var sendingDataMessagePack = message.ToMessagePack(ContractlessStandardResolver.Options); Logger.Info($"[{(sendingDataMessagePack.Length/1024)}kb] Server sending dataMessagePack to client; {nameof(requestId)}: {requestId}; {ConstHelper.NameByValue(messageTag)}"); //Logger.Info($"[{(responseDataMessagePack.Length/1024)}kb] Server sending dataMessagePack to client; {nameof(requestId)}: {requestId}; ConnectionId: {signalRHub.ConnectionId}; {ConstHelper.NameByValue(messageTag)}"); await sendTo.OnReceiveMessage(messageTag, sendingDataMessagePack, requestId); } public virtual async Task SendMessageToAllClients(int messageTag, object? content) { await SendMessageToClient(signalRHub.Clients.All, messageTag, content); } public virtual async Task SendMessageToConnection(string connectionId, int messageTag, object? content) { await SendMessageToClient(signalRHub.Clients.Client(connectionId), messageTag, content); } public virtual async Task SendMessageToConnections(IEnumerable connectionIds, int messageTag, object? content) { await SendMessageToClient(signalRHub.Clients.Clients(connectionIds), messageTag, content); } public virtual async Task SendMessageToUser(string user, int messageTag, object? content) { await SendMessageToClient(signalRHub.Clients.User(user), messageTag, content); } public virtual async Task SendMessageToUsers(IEnumerable users, int messageTag, object? content) { await SendMessageToClient(signalRHub.Clients.Users(users), messageTag, content); } }