Refactor Network gateway module
This commit is contained in:
@@ -16,7 +16,7 @@ namespace mROA.Implementation.Backend
|
||||
private readonly HubRequestExtractor _hre;
|
||||
private readonly DistributionOptions _distribution;
|
||||
private readonly IContextualSerializationToolKit _serialization;
|
||||
private readonly Dictionary<int, CancellationTokenSource> _extractorsCTS = new();
|
||||
private readonly Dictionary<int, CancellationTokenSource> _extractorsTokenSources = new();
|
||||
private readonly ICallIndexProvider _callIndexProvider;
|
||||
private readonly IIdentityGenerator _identityGenerator;
|
||||
public NetworkGatewayModule(IOptions<GatewayOptions> options, IIdentityGenerator identityGenerator, IContextualSerializationToolKit serialization, ICallIndexProvider callIndexProvider, IConnectionHub hub, IOptions<DistributionOptions> distribution, HubRequestExtractor hre)
|
||||
@@ -49,11 +49,19 @@ namespace mROA.Implementation.Backend
|
||||
while (true)
|
||||
{
|
||||
var client = await _tcpListener.AcceptTcpClientAsync();
|
||||
_ = HandleConnection(client).ConfigureAwait(false);
|
||||
}
|
||||
}
|
||||
|
||||
private async Task HandleConnection(TcpClient client)
|
||||
{
|
||||
Console.WriteLine($"Client connected from {client.Client.RemoteEndPoint}");
|
||||
var interaction = new ChannelInteractionModule(_serialization, _identityGenerator);
|
||||
|
||||
var context = new EndPointContext(null, null);
|
||||
context.CallIndexProvider = _callIndexProvider;
|
||||
var context = new EndPointContext(null, null)
|
||||
{
|
||||
CallIndexProvider = _callIndexProvider
|
||||
};
|
||||
var streamExtractor =
|
||||
new ChannelInteractionModule.StreamExtractor(client.GetStream(), _serialization, context);
|
||||
interaction.IsConnected = () => streamExtractor.IsConnected;
|
||||
@@ -68,6 +76,22 @@ namespace mROA.Implementation.Backend
|
||||
switch (connectionRequest.MessageType)
|
||||
{
|
||||
case EMessageType.ClientConnect:
|
||||
HandleNewClient(context, interaction, streamExtractor, cts);
|
||||
break;
|
||||
case EMessageType.ClientRecovery:
|
||||
{
|
||||
RecoverDisconnectedClient(connectionRequest, streamExtractor, cts);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
client.Close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
private void HandleNewClient(EndPointContext context, ChannelInteractionModule interaction,
|
||||
ChannelInteractionModule.StreamExtractor streamExtractor, CancellationTokenSource cts)
|
||||
{
|
||||
context.HostId = 0;
|
||||
context.OwnerId = -interaction.ConnectionId;
|
||||
interaction.Context = context;
|
||||
@@ -75,22 +99,24 @@ namespace mROA.Implementation.Backend
|
||||
_ = streamExtractor.SendFromChannel(interaction.TrustedPostChanel, cts.Token);
|
||||
interaction.PostMessageAsync(new NetworkMessageHeader(_serialization,
|
||||
new IdAssignment { Id = interaction.ConnectionId }, null));
|
||||
_extractorsCTS[interaction.ConnectionId] = cts;
|
||||
_extractorsTokenSources[interaction.ConnectionId] = cts;
|
||||
|
||||
_hub.RegisterInteraction(interaction);
|
||||
_hre.HubOnOnConnected(new RepresentationModule(interaction, _serialization));
|
||||
|
||||
if (_distribution.DistributionType != EDistributionType.Channeled)
|
||||
{
|
||||
|
||||
}
|
||||
Console.WriteLine("Client registered");
|
||||
break;
|
||||
case EMessageType.ClientRecovery:
|
||||
}
|
||||
|
||||
private void RecoverDisconnectedClient(NetworkMessageHeader connectionRequest, ChannelInteractionModule.StreamExtractor streamExtractor,
|
||||
CancellationTokenSource cts)
|
||||
{
|
||||
var recoveryRequest = _serialization.Deserialize<ClientRecovery>(connectionRequest.Data, null);
|
||||
var recoveryInteraction = _hub.GetInteraction(recoveryRequest.Id);
|
||||
|
||||
_extractorsCTS[-recoveryRequest.Id].Cancel();
|
||||
_extractorsTokenSources[-recoveryRequest.Id].Cancel();
|
||||
|
||||
recoveryInteraction.IsConnected = () => streamExtractor.IsConnected;
|
||||
streamExtractor.MessageReceived = message =>
|
||||
@@ -101,15 +127,7 @@ namespace mROA.Implementation.Backend
|
||||
|
||||
Task.Run(async () => await streamExtractor.LoopedReceive(cts.Token).ConfigureAwait(false));
|
||||
|
||||
|
||||
recoveryInteraction.Restart(false);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
client.Close();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user