mirror of
https://github.com/chylex/Minecraft-Phantom-Panel.git
synced 2025-10-09 04:26:56 +02:00
.config
.run
.workdir
Agent
Common
Controller
Docker
Utils
Phantom.Utils
Phantom.Utils.Actor
Phantom.Utils.Events
Phantom.Utils.Logging
Phantom.Utils.Rpc
Message
IMessageDefinitions.cs
IReply.cs
IReplyMessageFactory.cs
IReplySender.cs
MessageHandler.cs
MessageRegistry.cs
MessageReplyTracker.cs
MessageSerializer.cs
ReplySender.cs
Runtime
Sockets
Phantom.Utils.Rpc.csproj
RpcConfiguration.cs
RpcExtensions.cs
Phantom.Utils.Tests
Web
.dockerignore
.gitattributes
.gitignore
AddMigration.bat
AddMigration.sh
Directory.Build.props
Directory.Build.targets
Dockerfile
LICENSE
Packages.props
PhantomPanel.sln
README.md
global.json
36 lines
1.1 KiB
C#
36 lines
1.1 KiB
C#
using Phantom.Utils.Actor;
|
|
using Phantom.Utils.Logging;
|
|
using Serilog;
|
|
|
|
namespace Phantom.Utils.Rpc.Message;
|
|
|
|
sealed class MessageHandler<TMessageBase> {
|
|
private readonly ILogger logger;
|
|
private readonly ActorRef<TMessageBase> handlerActor;
|
|
private readonly IReplySender replySender;
|
|
|
|
public MessageHandler(string loggerName, ActorRef<TMessageBase> handlerActor, IReplySender replySender) {
|
|
this.logger = PhantomLogger.Create("MessageHandler", loggerName);
|
|
this.handlerActor = handlerActor;
|
|
this.replySender = replySender;
|
|
}
|
|
|
|
public void Tell(TMessageBase message) {
|
|
handlerActor.Tell(message);
|
|
}
|
|
|
|
public Task TellAndReply<TMessage, TReply>(TMessage message, uint sequenceId) where TMessage : ICanReply<TReply> {
|
|
return handlerActor.Request(message).ContinueWith(task => {
|
|
if (task.IsCompletedSuccessfully) {
|
|
return replySender.SendReply(sequenceId, MessageSerializer.Serialize(task.Result));
|
|
}
|
|
|
|
if (task.IsFaulted) {
|
|
logger.Error(task.Exception, "Failed to handle message {Type}.", message.GetType().Name);
|
|
}
|
|
|
|
return task;
|
|
}, TaskScheduler.Default);
|
|
}
|
|
}
|