Backend reconnection implementation

This commit is contained in:
2025-04-06 21:20:18 +03:00
parent abaac48246
commit 0f5bb18787
6 changed files with 18 additions and 28 deletions
+1 -1
View File
@@ -7,7 +7,7 @@
public interface IConnectionHub : IInjectableModule public interface IConnectionHub : IInjectableModule
{ {
void RegisterInteraction(INextGenerationInteractionModule interaction); void RegisterInteraction(INextGenerationInteractionModule interaction);
INextGenerationInteractionModule GetInteracion(int id); INextGenerationInteractionModule GetInteraction(int id);
event ConnectionHandler? OnConnected; event ConnectionHandler? OnConnected;
event DisconnectionHandler? OnDisconnected; event DisconnectionHandler? OnDisconnected;
} }
+1
View File
@@ -15,6 +15,7 @@ namespace mROA.Abstract
NetworkMessageHeader[] UnhandledMessages { get; } NetworkMessageHeader[] UnhandledMessages { get; }
NetworkMessageHeader? FirstByFilter(Predicate<NetworkMessageHeader> predicate); NetworkMessageHeader? FirstByFilter(Predicate<NetworkMessageHeader> predicate);
event Action<int> OnDisconected; event Action<int> OnDisconected;
Task Restart();
} }
} }
+1 -1
View File
@@ -21,7 +21,7 @@ namespace mROA.Implementation.Backend
OnConnected?.Invoke(module); OnConnected?.Invoke(module);
} }
public INextGenerationInteractionModule GetInteracion(int id) public INextGenerationInteractionModule GetInteraction(int id)
{ {
return _connections!.GetValueOrDefault(id, null) ?? throw new Exception("No connection found"); return _connections!.GetValueOrDefault(id, null) ?? throw new Exception("No connection found");
} }
@@ -85,23 +85,11 @@ namespace mROA.Implementation.Backend
Console.WriteLine("Client registered"); Console.WriteLine("Client registered");
}else if (connectionRequest.MessageType == EMessageType.ClientRecovery) }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<ClientRecovery>(connectionRequest.Data)!; var recoveryRequest = _serialization!.Deserialize<ClientRecovery>(connectionRequest.Data)!;
interaction.ConnectionId = recoveryRequest.Id; var recoveryInteraction = _hub.GetInteraction(recoveryRequest.Id);
recoveryInteraction.BaseStream = client.GetStream();
interaction.Inject(_serialization); recoveryInteraction.Restart();
Console.WriteLine($"Client {recoveryRequest.Id} reconnected");
interaction.BaseStream = client.GetStream();
interaction.PostMessageAsync(new NetworkMessageHeader(_serialization!,
new IdAssignment { Id = -interaction.ConnectionId }));
_hub!.RegisterInteraction(interaction);
Console.WriteLine("Client registered");
} }
} }
} }
@@ -34,7 +34,7 @@ namespace mROA.Implementation
foreach (var creationModule in _creationModules) foreach (var creationModule in _creationModules)
produced.Inject(creationModule); produced.Inject(creationModule);
var interaction = _hub.GetInteracion(id); var interaction = _hub.GetInteraction(id);
produced.Inject(interaction); produced.Inject(interaction);
return produced; return produced;
@@ -9,14 +9,14 @@ namespace mROA.Implementation.Frontend
{ {
public class NetworkFrontendBridge : IFrontendBridge public class NetworkFrontendBridge : IFrontendBridge
{ {
private readonly IPEndPoint _ipEndPoint; private readonly IPEndPoint _serverEndPoint;
private readonly TcpClient _tcpClient = new(); private TcpClient _tcpClient = new();
private NextGenerationInteractionModule? _interactionModule; private NextGenerationInteractionModule? _interactionModule;
private ISerializationToolkit? _serialization; private ISerializationToolkit? _serialization;
public NetworkFrontendBridge(IPEndPoint ipEndPoint) public NetworkFrontendBridge(IPEndPoint serverEndPoint)
{ {
_ipEndPoint = ipEndPoint; _serverEndPoint = serverEndPoint;
} }
public void Inject<T>(T dependency) public void Inject<T>(T dependency)
@@ -39,13 +39,13 @@ namespace mROA.Implementation.Frontend
if (_serialization == null) if (_serialization == null)
throw new NullReferenceException("Serialization toolkit is not initialized"); throw new NullReferenceException("Serialization toolkit is not initialized");
_tcpClient.Connect(_ipEndPoint); _tcpClient.Connect(_serverEndPoint);
_interactionModule.BaseStream = _tcpClient.GetStream(); _interactionModule.BaseStream = _tcpClient.GetStream();
_interactionModule.OnDisconected += async id => _interactionModule.OnDisconected += async id =>
{ {
await Reconect(); await Reconnect();
}; };
_ = _interactionModule.PostMessageAsync(new NetworkMessageHeader(_serialization, new ClientConnect())); _ = _interactionModule.PostMessageAsync(new NetworkMessageHeader(_serialization, new ClientConnect()));
var welcomeMessage = _interactionModule.GetNextMessageReceiving().GetAwaiter().GetResult(); var welcomeMessage = _interactionModule.GetNextMessageReceiving().GetAwaiter().GetResult();
@@ -61,9 +61,10 @@ namespace mROA.Implementation.Frontend
TransmissionConfig.OwnershipRepository = new StaticOwnershipRepository(assignment.Id); 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(); _interactionModule.BaseStream = _tcpClient.GetStream();
await _interactionModule.Restart(); await _interactionModule.Restart();
} }