using GameServer.Controllers.Factory; using Protocol; namespace GameServer.Network.Messages; internal delegate Task PushHandler(IServiceProvider serviceProvider, ReadOnlySpan data); internal delegate Task RpcHandler(IServiceProvider serviceProvider, ReadOnlySpan data); internal class MessageManager { private readonly EventHandlerFactory _handlerFactory; private readonly IServiceProvider _serviceProvider; public MessageManager(IServiceProvider serviceProvider, EventHandlerFactory handlerFactory) { _handlerFactory = handlerFactory; _serviceProvider = serviceProvider; } public async Task ExecuteRpc(MessageId messageId, ReadOnlyMemory data) { RpcHandler? handler = _handlerFactory.GetRpcHandler(messageId); if (handler != null) return await handler(_serviceProvider, data.Span); return null; } public async Task HandlePush(MessageId messageId, ReadOnlyMemory data) { PushHandler? handler = _handlerFactory.GetPushHandler(messageId); if (handler == null) return false; await handler(_serviceProvider, data.Span); return true; } public static void EncodeMessage(Memory buffer, BaseMessage message) { buffer.Span[0] = (byte)message.Type; message.Encode(buffer); } public static BaseMessage DecodeMessage(ReadOnlyMemory buffer) { MessageType type = (MessageType)buffer.Span[0]; BaseMessage message = type switch { MessageType.Request => new RequestMessage(), MessageType.Response => new ResponseMessage(), MessageType.Push => new PushMessage(), _ => throw new NotSupportedException("Message type not implemented: " + type) }; message.Decode(buffer); return message; } }