diff --git a/Example.Backend/Program.cs b/Example.Backend/Program.cs index c6c2b4b..ff62dcf 100644 --- a/Example.Backend/Program.cs +++ b/Example.Backend/Program.cs @@ -5,23 +5,31 @@ using mROA.Codegen; using mROA.Implementation; using mROA.Implementation.Backend; using mROA.Implementation.Bootstrap; -using mROA.Implementation.Frontend; var builder = new FullMixBuilder(); builder.UseJsonSerialisation(); -builder.UseNetworkGateway(new IPEndPoint(IPAddress.Loopback, 4567)); -builder.UseStreamInteraction(); +builder.Modules.Add(new BackendIdentityGenerator()); +builder.UseNetworkGateway(new IPEndPoint(IPAddress.Loopback, 4567), typeof(NextGenerationInteractionModule), + builder.GetModule()!); + +builder.Modules.Add(new ConnectionHub()); +builder.Modules.Add(new HubRequestExtractor()); + builder.UseBasicExecution(); + builder.Modules.Add(new RemoteContextRepository()); builder.UseCollectableContextRepository(typeof(PrinterFactory).Assembly); builder.SetupMethodsRepository(new CoCodegenMethodRepository()); -builder.Modules.Add(new CreativeSerializationModuleProducer([], typeof(JsonFrontendSerialisationModule))); +builder.Modules.Add(new CreativeSerializationModuleProducer([builder.GetModule()!], typeof(RepresentationModule))); builder.Build(); new RemoteTypeBinder(); -TransmissionConfig.RemoteEndpointContextRepository = builder.GetModule(); -var gateway = builder.GetModule() ; +TransmissionConfig.RealContextRepository = builder.GetModule(); +TransmissionConfig.RemoteEndpointContextRepository = builder.GetModule(); +TransmissionConfig.OwnershipRepository = new MultiClientOwnershipRepository(); + +var gateway = builder.GetModule(); gateway.Run(); \ No newline at end of file diff --git a/Example.Frontend/Program.cs b/Example.Frontend/Program.cs index c59954a..64733c6 100644 --- a/Example.Frontend/Program.cs +++ b/Example.Frontend/Program.cs @@ -9,9 +9,10 @@ using mROA.Implementation.Frontend; var builder = new FullMixBuilder(); new RemoteTypeBinder(); +builder.Modules.Add(new JsonSerializationToolkit()); builder.Modules.Add(new RemoteContextRepository()); -builder.Modules.Add(new JsonFrontendSerialisationModule()); -builder.Modules.Add(new StreamBasedFrontendInteractionModule()); +builder.Modules.Add(new NextGenerationInteractionModule()); +builder.Modules.Add(new RepresentationModule()); builder.Modules.Add(new NetworkFrontendBridge(new IPEndPoint(IPAddress.Loopback, 4567))); builder.Modules.Add(new StaticRepresentationModuleProducer()); // builder.Modules.Add(new BasicExecutionModule()); diff --git a/mROA/Abstract/IConnectionHub.cs b/mROA/Abstract/IConnectionHub.cs index 8c7f22f..1a595c8 100644 --- a/mROA/Abstract/IConnectionHub.cs +++ b/mROA/Abstract/IConnectionHub.cs @@ -3,7 +3,7 @@ public delegate void ConnectionHandler(IRepresentationModule representationModule); public delegate void DisconnectionHandler(IRepresentationModule representationModule); -public interface IConnectionHub +public interface IConnectionHub : IInjectableModule { void RegisterInteraction(INextGenerationInteractionModule interaction); INextGenerationInteractionModule GetInteracion(int id); diff --git a/mROA/Abstract/IIdentityGenerator.cs b/mROA/Abstract/IIdentityGenerator.cs index 29f0f2c..bede9f3 100644 --- a/mROA/Abstract/IIdentityGenerator.cs +++ b/mROA/Abstract/IIdentityGenerator.cs @@ -1,6 +1,6 @@ namespace mROA.Abstract; -public interface IIdentityGenerator +public interface IIdentityGenerator : IInjectableModule { int GetNextIdentity(); } \ No newline at end of file diff --git a/mROA/Abstract/IInteractionModule.cs b/mROA/Abstract/IInteractionModule.cs index 5ccc8e6..96a91b3 100644 --- a/mROA/Abstract/IInteractionModule.cs +++ b/mROA/Abstract/IInteractionModule.cs @@ -4,7 +4,7 @@ namespace mROA.Abstract; public interface INextGenerationInteractionModule : IInjectableModule { - int ConntectionId { get; } + int ConnectionId { get; } public Stream? BaseStream { get; set; } Task GetNextMessageReceiving(); Task PostMessage(NetworkMessage message); diff --git a/mROA/Implementation/Backend/BackendIdentityGenerator.cs b/mROA/Implementation/Backend/BackendIdentityGenerator.cs index add087e..82dd4e2 100644 --- a/mROA/Implementation/Backend/BackendIdentityGenerator.cs +++ b/mROA/Implementation/Backend/BackendIdentityGenerator.cs @@ -10,4 +10,8 @@ public class BackendIdentityGenerator : IIdentityGenerator { return ++_currentId; } + + public void Inject(T dependency) + { + } } \ No newline at end of file diff --git a/mROA/Implementation/Backend/ConntectionHub.cs b/mROA/Implementation/Backend/ConnectionHub.cs similarity index 62% rename from mROA/Implementation/Backend/ConntectionHub.cs rename to mROA/Implementation/Backend/ConnectionHub.cs index 2111b4b..1a93416 100644 --- a/mROA/Implementation/Backend/ConntectionHub.cs +++ b/mROA/Implementation/Backend/ConnectionHub.cs @@ -2,14 +2,16 @@ namespace mROA.Implementation.Backend; -public class ConntectionHub : IConnectionHub +public class ConnectionHub : IConnectionHub { private readonly Dictionary _connections = new(); - private ISerializationToolkit _serializationToolkit; + private ISerializationToolkit? _serializationToolkit; public void RegisterInteraction(INextGenerationInteractionModule interaction) { - + if (_serializationToolkit is null) + throw new NullReferenceException("Serialization toolkit is null"); + var module = new RepresentationModule(); module.Inject(_serializationToolkit); module.Inject(interaction); @@ -23,4 +25,10 @@ public class ConntectionHub : IConnectionHub public event ConnectionHandler? OnConnected; public event DisconnectionHandler? OnDisconnected; + public void Inject(T dependency) + { + if (dependency is ISerializationToolkit serializationToolkit) + _serializationToolkit = serializationToolkit; + + } } \ No newline at end of file diff --git a/mROA/Implementation/Backend/HubRequestExtractor.cs b/mROA/Implementation/Backend/HubRequestExtractor.cs index 3391a43..17c4f35 100644 --- a/mROA/Implementation/Backend/HubRequestExtractor.cs +++ b/mROA/Implementation/Backend/HubRequestExtractor.cs @@ -10,6 +10,7 @@ public class HubRequestExtractor : IInjectableModule private IContextRepository? _contextRepository; private IMethodRepository? _methodRepository; private ISerializationToolkit? _serializationToolkit; + private IExecuteModule? _executeModule; public void Inject(T dependency) { switch (dependency) @@ -27,6 +28,9 @@ public class HubRequestExtractor : IInjectableModule case ISerializationToolkit serializationToolkit: _serializationToolkit = serializationToolkit; break; + case IExecuteModule executeModule: + _executeModule = executeModule; + break; } } @@ -37,6 +41,7 @@ public class HubRequestExtractor : IInjectableModule extractor.Inject(_contextRepository); extractor.Inject(_methodRepository); extractor.Inject(_serializationToolkit); + extractor.Inject(_executeModule); _ = extractor.StartExtraction(); } } \ No newline at end of file diff --git a/mROA/Implementation/Backend/NetworkGatewayModule.cs b/mROA/Implementation/Backend/NetworkGatewayModule.cs index 4865db0..2146c0a 100644 --- a/mROA/Implementation/Backend/NetworkGatewayModule.cs +++ b/mROA/Implementation/Backend/NetworkGatewayModule.cs @@ -10,6 +10,7 @@ public class NetworkGatewayModule : IGatewayModule private readonly IInjectableModule[]? _injectableModules; private readonly TcpListener? _tcpListener; private IConnectionHub? _hub; + private ISerializationToolkit _serializationToolkit; public NetworkGatewayModule(IPEndPoint endpoint, Type interactionModuleType, IInjectableModule[] injectableModules) { @@ -46,25 +47,35 @@ public class NetworkGatewayModule : IGatewayModule { if (_hub is null) throw new NullReferenceException("Hub module is null"); - + if (_tcpListener == null) throw new NullReferenceException("TcpListener is null"); - + if (_injectableModules is null) throw new NullReferenceException("InjectableModules is null"); if (_interactionModuleType is null) throw new NullReferenceException("InteractionModuleType is null"); - + while (true) { var client = _tcpListener.AcceptTcpClient(); Console.WriteLine($"Client connected from {client.Client.RemoteEndPoint}"); - var interacton = Activator.CreateInstance(_interactionModuleType) as INextGenerationInteractionModule; - + var interaction = Activator.CreateInstance(_interactionModuleType) as INextGenerationInteractionModule; + foreach (var injectableModule in _injectableModules) - interacton.Inject(injectableModule); - _hub.RegisterInteraction(interacton); + interaction!.Inject(injectableModule); + + interaction!.Inject(_serializationToolkit); + + interaction.BaseStream = client.GetStream(); + + interaction.PostMessage(new NetworkMessage + { + Id = Guid.NewGuid(), SchemaId = MessageType.IdAssigning, + Data = _serializationToolkit.Serialize(new IdAssingnment { Id = interaction.ConnectionId }) + }); + _hub.RegisterInteraction(interaction); Console.WriteLine("Client registered"); } } @@ -73,5 +84,7 @@ public class NetworkGatewayModule : IGatewayModule { if (dependency is IConnectionHub interactionModule) _hub = interactionModule; + if (dependency is ISerializationToolkit serializationToolkit) + _serializationToolkit = serializationToolkit; } } \ No newline at end of file diff --git a/mROA/Implementation/NextGenerationInteractionModule.cs b/mROA/Implementation/NextGenerationInteractionModule.cs index 3477340..d2e4105 100644 --- a/mROA/Implementation/NextGenerationInteractionModule.cs +++ b/mROA/Implementation/NextGenerationInteractionModule.cs @@ -6,7 +6,7 @@ namespace mROA.Implementation; public class NextGenerationInteractionModule : INextGenerationInteractionModule { private ISerializationToolkit? _serialization; - public int ConntectionId { get; private set; } + public int ConnectionId { get; private set; } public Stream? BaseStream { get; set; } private Task? _currentReceiving; private const int BufferSize = ushort.MaxValue; @@ -20,7 +20,7 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule _serialization = toolkit; break; case IIdentityGenerator identityGenerator: - ConntectionId = identityGenerator.GetNextIdentity(); + ConnectionId = identityGenerator.GetNextIdentity(); break; } } diff --git a/mROA/Implementation/RepresentationModule.cs b/mROA/Implementation/RepresentationModule.cs index 0516893..ee69974 100644 --- a/mROA/Implementation/RepresentationModule.cs +++ b/mROA/Implementation/RepresentationModule.cs @@ -20,7 +20,7 @@ public class RepresentationModule : IRepresentationModule } } - public int Id => _interaction.ConntectionId; + public int Id => _interaction.ConnectionId; public async Task GetMessage(Guid? requestId, MessageType? messageType) {