From 0f5bb1878712602b37d263d7f85a98f069394c0f Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Sun, 6 Apr 2025 21:20:18 +0300 Subject: [PATCH] Backend reconnection implementation --- mROA/Abstract/IConnectionHub.cs | 2 +- mROA/Abstract/IInteractionModule.cs | 3 ++- mROA/Implementation/Backend/ConnectionHub.cs | 2 +- .../Backend/NetworkGatewayModule.cs | 20 ++++--------------- .../CreativeRepresentationModuleProducer.cs | 2 +- .../Frontend/NetworkFrontendBridge.cs | 17 ++++++++-------- 6 files changed, 18 insertions(+), 28 deletions(-) diff --git a/mROA/Abstract/IConnectionHub.cs b/mROA/Abstract/IConnectionHub.cs index 34106f3..3c6afd4 100644 --- a/mROA/Abstract/IConnectionHub.cs +++ b/mROA/Abstract/IConnectionHub.cs @@ -7,7 +7,7 @@ public interface IConnectionHub : IInjectableModule { void RegisterInteraction(INextGenerationInteractionModule interaction); - INextGenerationInteractionModule GetInteracion(int id); + INextGenerationInteractionModule GetInteraction(int id); event ConnectionHandler? OnConnected; event DisconnectionHandler? OnDisconnected; } diff --git a/mROA/Abstract/IInteractionModule.cs b/mROA/Abstract/IInteractionModule.cs index c622df6..edf66aa 100644 --- a/mROA/Abstract/IInteractionModule.cs +++ b/mROA/Abstract/IInteractionModule.cs @@ -15,6 +15,7 @@ namespace mROA.Abstract NetworkMessageHeader[] UnhandledMessages { get; } NetworkMessageHeader? FirstByFilter(Predicate predicate); event Action OnDisconected; - + Task Restart(); + } } \ No newline at end of file diff --git a/mROA/Implementation/Backend/ConnectionHub.cs b/mROA/Implementation/Backend/ConnectionHub.cs index f26a304..de302b0 100644 --- a/mROA/Implementation/Backend/ConnectionHub.cs +++ b/mROA/Implementation/Backend/ConnectionHub.cs @@ -21,7 +21,7 @@ namespace mROA.Implementation.Backend OnConnected?.Invoke(module); } - public INextGenerationInteractionModule GetInteracion(int id) + public INextGenerationInteractionModule GetInteraction(int id) { return _connections!.GetValueOrDefault(id, null) ?? throw new Exception("No connection found"); } diff --git a/mROA/Implementation/Backend/NetworkGatewayModule.cs b/mROA/Implementation/Backend/NetworkGatewayModule.cs index 9573178..f4585f2 100644 --- a/mROA/Implementation/Backend/NetworkGatewayModule.cs +++ b/mROA/Implementation/Backend/NetworkGatewayModule.cs @@ -85,23 +85,11 @@ namespace mROA.Implementation.Backend Console.WriteLine("Client registered"); }else if (connectionRequest.MessageType == EMessageType.ClientRecovery) { - var modidiedModules = _injectableModules!.ToList(); - modidiedModules.RemoveAll(i => i is IIdentityGenerator); - - foreach (var injectableModule in modidiedModules) - interaction.Inject(injectableModule); - var recoveryRequest = _serialization!.Deserialize(connectionRequest.Data)!; - interaction.ConnectionId = recoveryRequest.Id; - - interaction.Inject(_serialization); - - interaction.BaseStream = client.GetStream(); - - interaction.PostMessageAsync(new NetworkMessageHeader(_serialization!, - new IdAssignment { Id = -interaction.ConnectionId })); - _hub!.RegisterInteraction(interaction); - Console.WriteLine("Client registered"); + var recoveryInteraction = _hub.GetInteraction(recoveryRequest.Id); + recoveryInteraction.BaseStream = client.GetStream(); + recoveryInteraction.Restart(); + Console.WriteLine($"Client {recoveryRequest.Id} reconnected"); } } } diff --git a/mROA/Implementation/CreativeRepresentationModuleProducer.cs b/mROA/Implementation/CreativeRepresentationModuleProducer.cs index 0e21899..3d8b13e 100644 --- a/mROA/Implementation/CreativeRepresentationModuleProducer.cs +++ b/mROA/Implementation/CreativeRepresentationModuleProducer.cs @@ -34,7 +34,7 @@ namespace mROA.Implementation foreach (var creationModule in _creationModules) produced.Inject(creationModule); - var interaction = _hub.GetInteracion(id); + var interaction = _hub.GetInteraction(id); produced.Inject(interaction); return produced; diff --git a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs index 526fdaa..b34042a 100644 --- a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs +++ b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs @@ -9,14 +9,14 @@ namespace mROA.Implementation.Frontend { public class NetworkFrontendBridge : IFrontendBridge { - private readonly IPEndPoint _ipEndPoint; - private readonly TcpClient _tcpClient = new(); + private readonly IPEndPoint _serverEndPoint; + private TcpClient _tcpClient = new(); private NextGenerationInteractionModule? _interactionModule; private ISerializationToolkit? _serialization; - public NetworkFrontendBridge(IPEndPoint ipEndPoint) + public NetworkFrontendBridge(IPEndPoint serverEndPoint) { - _ipEndPoint = ipEndPoint; + _serverEndPoint = serverEndPoint; } public void Inject(T dependency) @@ -39,13 +39,13 @@ namespace mROA.Implementation.Frontend if (_serialization == null) throw new NullReferenceException("Serialization toolkit is not initialized"); - _tcpClient.Connect(_ipEndPoint); + _tcpClient.Connect(_serverEndPoint); _interactionModule.BaseStream = _tcpClient.GetStream(); _interactionModule.OnDisconected += async id => { - await Reconect(); + await Reconnect(); }; _ = _interactionModule.PostMessageAsync(new NetworkMessageHeader(_serialization, new ClientConnect())); var welcomeMessage = _interactionModule.GetNextMessageReceiving().GetAwaiter().GetResult(); @@ -61,9 +61,10 @@ namespace mROA.Implementation.Frontend TransmissionConfig.OwnershipRepository = new StaticOwnershipRepository(assignment.Id); } - private async Task Reconect() + private async Task Reconnect() { - _tcpClient.Connect(_ipEndPoint); + _tcpClient = new TcpClient(); + _tcpClient.Connect(_serverEndPoint); _interactionModule.BaseStream = _tcpClient.GetStream(); await _interactionModule.Restart(); }