diff --git a/mROA.Test/StreamTest.cs b/mROA.Test/StreamTest.cs new file mode 100644 index 0000000..e799071 --- /dev/null +++ b/mROA.Test/StreamTest.cs @@ -0,0 +1,28 @@ +using mROA.Implementation; + +namespace mROA.Test; + +public class StreamTest +{ + private StreamBasedInteractionModule _interactionModule; + private ISerialisationModule _serialisationModule; + private IExecuteModule _executeModule; + private IMethodRepository _methodRepository; + private IContextRepository _contextRepository; + [SetUp] + public void Setup() + { + _interactionModule = new StreamBasedInteractionModule(); + + _serialisationModule = new JsonSerialisationModule(_interactionModule, _methodRepository); + + _executeModule = new MockExecModule(); + _serialisationModule.SetExecuteModule(_executeModule); + } + + [Test] + public void StreamingTest() + { + + } +} \ No newline at end of file diff --git a/mROA/Implementation/JsonFrontendSerialisationModule.cs b/mROA/Implementation/JsonFrontendSerialisationModule.cs index 5f63f6f..080d423 100644 --- a/mROA/Implementation/JsonFrontendSerialisationModule.cs +++ b/mROA/Implementation/JsonFrontendSerialisationModule.cs @@ -1,6 +1,5 @@ using System.Text; using System.Text.Json; -using System.Windows.Input; namespace mROA.Implementation; @@ -11,6 +10,11 @@ public class JsonFrontendSerialisationModule(IInteractionModule.IFrontendInterac { var receiveMessage = interactionModule.ReceiveMessage(); var parsed = JsonSerializer.Deserialize(receiveMessage); + while (parsed.CallRequestId != requestId) + { + receiveMessage = interactionModule.ReceiveMessage(); + parsed = JsonSerializer.Deserialize(receiveMessage); + } return parsed; } diff --git a/mROA/Implementation/StreamBasedFrontendInteractionModule.cs b/mROA/Implementation/StreamBasedFrontendInteractionModule.cs new file mode 100644 index 0000000..e9c0b09 --- /dev/null +++ b/mROA/Implementation/StreamBasedFrontendInteractionModule.cs @@ -0,0 +1,31 @@ +namespace mROA.Implementation; + +public class StreamBasedFrontendInteractionModule : IInteractionModule.IFrontendInteractionModule +{ + private Stream _serverStream; + + public StreamBasedFrontendInteractionModule(Stream serverStream) + { + _serverStream = serverStream; + } + + public byte[] ReceiveMessage() + { + const int bufferSize = ushort.MaxValue; + + byte[] buffer = new byte[bufferSize]; + if (!_serverStream.CanRead) throw new IOException("Server is not connected."); + + _serverStream.ReadExactly(buffer, 0, 2); + var len = BitConverter.ToUInt16(buffer, 0); + _serverStream.ReadExactly(buffer, 0, len); + + return buffer[..len]; + } + + public void PostMessage(byte[] message) + { + _serverStream.Write(BitConverter.GetBytes((ushort)message.Length), 0, sizeof(ushort)); + _serverStream.Write(message, 0, message.Length); + } +} \ No newline at end of file diff --git a/mROA/Implementation/Test/MockExecModule.cs b/mROA/Implementation/Test/MockExecModule.cs index 697e1c2..928fb54 100644 --- a/mROA/Implementation/Test/MockExecModule.cs +++ b/mROA/Implementation/Test/MockExecModule.cs @@ -5,6 +5,6 @@ public class MockExecModule : IExecuteModule public ICommandExecution Execute(ICallRequest command) { return new FinalCommandExecution - { ClientId = command.ClientId, CommandId = command.CommandId, Result = new { A = "wqer", B = 5 } }; + { ClientId = command.ClientId, CommandId = command.CommandId, Result = new { A = "wqer", B = 5 }, CallRequestId = command.CallRequestId }; } } \ No newline at end of file