1
0
mirror of https://github.com/chylex/Minecraft-Phantom-Panel.git synced 2025-07-25 21:59:04 +02:00
Minecraft-Phantom-Panel/Utils/Phantom.Utils.Rpc/Message/MessageHandler.cs

42 lines
1.3 KiB
C#

using Phantom.Utils.Logging;
using Serilog;
namespace Phantom.Utils.Rpc.Message;
abstract class MessageHandler<TListener> {
protected ILogger Logger { get; }
private readonly TListener listener;
private readonly MessageQueues messageQueues;
protected MessageHandler(string loggerName, TListener listener) {
this.Logger = PhantomLogger.Create("MessageHandler", loggerName);
this.listener = listener;
this.messageQueues = new MessageQueues(loggerName + ":Receive");
}
internal void Enqueue<TMessage, TReply>(uint sequenceId, TMessage message) where TMessage : IMessage<TListener, TReply> {
messageQueues.Enqueue(message.QueueKey, () => TryHandle<TMessage, TReply>(sequenceId, message));
}
private async Task TryHandle<TMessage, TReply>(uint sequenceId, TMessage message) where TMessage : IMessage<TListener, TReply> {
TReply reply;
try {
reply = await message.Accept(listener);
} catch (Exception e) {
Logger.Error(e, "Failed to handle message {Type}.", message.GetType().Name);
return;
}
if (reply is not NoReply) {
await SendReply(sequenceId, MessageSerializer.Serialize(reply));
}
}
protected abstract Task SendReply(uint sequenceId, byte[] serializedReply);
internal Task StopReceiving() {
return messageQueues.Stop();
}
}