From 82ff0019e15a28a6a6ad90b2e2facd6eb2958f65 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Sat, 15 Feb 2025 21:52:38 +0300 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=BE=D0=B2=D1=8B=D0=B9=20=D0=BF=D0=BE?= =?UTF-8?q?=D0=B4=D1=85=D0=BE=D0=B4=20=D0=BA=20=D0=BB=D0=BE=D0=B3=D0=B8?= =?UTF-8?q?=D0=BA=D0=B5=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Example.Frontend/Program.cs | 11 +++---- mROA/Abstract/ISerializationToolkit.cs | 9 +++++ .../AsyncNetworkInteractionModule.cs | 33 +++++++++++++++++++ .../StreamBasedFrontendInteractionModule.cs | 13 +++++++- .../JsonSerializationToolkit.cs | 26 +++++++++++++++ 5 files changed, 85 insertions(+), 7 deletions(-) create mode 100644 mROA/Abstract/ISerializationToolkit.cs create mode 100644 mROA/Implementation/AsyncNetworkInteractionModule.cs create mode 100644 mROA/Implementation/JsonSerializationToolkit.cs diff --git a/Example.Frontend/Program.cs b/Example.Frontend/Program.cs index a2d5fca..c1d6086 100644 --- a/Example.Frontend/Program.cs +++ b/Example.Frontend/Program.cs @@ -14,20 +14,19 @@ builder.Modules.Add(new JsonFrontendSerialisationModule()); builder.Modules.Add(new StreamBasedFrontendInteractionModule()); builder.Modules.Add(new NetworkFrontendBridge(new IPEndPoint(IPAddress.Loopback, 4567))); builder.Modules.Add(new StaticSerialisationModuleProducer()); -builder.Modules.Add(new BasicExecutionModule()); -builder.Modules.Add(new CoCodegenMethodRepository()); -builder.Modules.Add(new StreamBasedVirtualBackendInteractionModule()); -builder.Modules.Add(new JsonSerialisationModule()); +// builder.Modules.Add(new BasicExecutionModule()); +// builder.Modules.Add(new CoCodegenMethodRepository()); +// builder.Modules.Add(new StreamBasedVirtualBackendInteractionModule()); +// builder.Modules.Add(new JsonSerialisationModule()); builder.UseCollectableContextRepository(); builder.Build(); - TransmissionConfig.RealContextRepository = builder.GetModule(); TransmissionConfig.RemoteEndpointContextRepository = builder.GetModule(); builder.GetModule()!.Connect(); -builder.GetModule()!.StartVirtualInteraction(); +// builder.GetModule()!.StartVirtualInteraction(); Console.WriteLine(TransmissionConfig.OwnershipRepository!.GetOwnershipId()); var context = builder.GetModule(); diff --git a/mROA/Abstract/ISerializationToolkit.cs b/mROA/Abstract/ISerializationToolkit.cs new file mode 100644 index 0000000..2653121 --- /dev/null +++ b/mROA/Abstract/ISerializationToolkit.cs @@ -0,0 +1,9 @@ +namespace mROA.Implementation; + +public interface ISerializationToolkit +{ + public byte[] Serialize(T objectToSerialize); + public byte[] Serialize(object objectToSerialize, Type type); + public T? Deserialize(byte[] rawData); + public object? Deserialize(byte[] rawData, Type type); +} \ No newline at end of file diff --git a/mROA/Implementation/AsyncNetworkInteractionModule.cs b/mROA/Implementation/AsyncNetworkInteractionModule.cs new file mode 100644 index 0000000..d3c4a96 --- /dev/null +++ b/mROA/Implementation/AsyncNetworkInteractionModule.cs @@ -0,0 +1,33 @@ +namespace mROA.Implementation; + +public class AsyncNetworkInteractionModule +{ + private ISerializationToolkit _iSerializationToolkit; + private const int BufferSize = ushort.MaxValue; + private Stream? _stream; + private List _unhandledMessages = new(8); + private byte[] _buffer = new byte[BufferSize]; + private Task? _currentReadTask; + + + public Task ReceiveNext() + { + _currentReadTask ??= StartReceiving(); + return _currentReadTask; + } + + private async Task StartReceiving() + { + await _stream.ReadExactlyAsync(_buffer, 0, 2); + var len = BitConverter.ToUInt16(_buffer, 0); + await _stream.ReadExactlyAsync(_buffer, 0, len); + + } + + public NetworkMessage GetLastMessage() + { + return _unhandledMessages.Last(); + } + + +} \ No newline at end of file diff --git a/mROA/Implementation/Frontend/StreamBasedFrontendInteractionModule.cs b/mROA/Implementation/Frontend/StreamBasedFrontendInteractionModule.cs index 0426264..cb6fcb9 100644 --- a/mROA/Implementation/Frontend/StreamBasedFrontendInteractionModule.cs +++ b/mROA/Implementation/Frontend/StreamBasedFrontendInteractionModule.cs @@ -5,9 +5,20 @@ namespace mROA.Implementation.Frontend; public class StreamBasedFrontendInteractionModule : IInteractionModule.IFrontendInteractionModule { public Stream? ServerStream { get; set; } - public int ClientId { get; set; } + public NetworkMessage[] UnhandledMessages() + { + return Array.Empty(); + } + + public NetworkMessage LastMessage() + { + return null; + } + + + public async Task ReceiveMessage() { if (ServerStream is null) diff --git a/mROA/Implementation/JsonSerializationToolkit.cs b/mROA/Implementation/JsonSerializationToolkit.cs new file mode 100644 index 0000000..1973217 --- /dev/null +++ b/mROA/Implementation/JsonSerializationToolkit.cs @@ -0,0 +1,26 @@ +using System.Text.Json; + +namespace mROA.Implementation; + +public class JsonSerializationToolkit : ISerializationToolkit +{ + public byte[] Serialize(T objectToSerialize) + { + return JsonSerializer.SerializeToUtf8Bytes(objectToSerialize); + } + + public byte[] Serialize(object objectToSerialize, Type type) + { + return JsonSerializer.SerializeToUtf8Bytes(objectToSerialize, type); + } + + public T? Deserialize(byte[] rawData) + { + return JsonSerializer.Deserialize(rawData); + } + + public object? Deserialize(byte[] rawData, Type type) + { + return JsonSerializer.Deserialize(rawData, type); + } +} \ No newline at end of file