diff --git a/mROA/Abstract/IInteractionModule.cs b/mROA/Abstract/IInteractionModule.cs index e2697c9..cb1072e 100644 --- a/mROA/Abstract/IInteractionModule.cs +++ b/mROA/Abstract/IInteractionModule.cs @@ -10,4 +10,5 @@ public interface INextGenerationInteractionModule : IInjectableModule Task PostMessage(NetworkMessage message); void HandleMessage(NetworkMessage message); NetworkMessage[] UnhandledMessages { get; } + NetworkMessage? FirstByFilter(Predicate predicate); } \ No newline at end of file diff --git a/mROA/Abstract/ISerializationToolkit.cs b/mROA/Abstract/ISerializationToolkit.cs index d11359a..769180a 100644 --- a/mROA/Abstract/ISerializationToolkit.cs +++ b/mROA/Abstract/ISerializationToolkit.cs @@ -6,6 +6,8 @@ public interface ISerializationToolkit : IInjectableModule byte[] Serialize(object objectToSerialize, Type type); T? Deserialize(byte[] rawData); object? Deserialize(byte[] rawData, Type type); + T? Deserialize(Span rawData); + object? Deserialize(Span rawData, Type type); T Cast(object nonCasted); object Cast(object nonCasted, Type type); diff --git a/mROA/Implementation/JsonSerializationToolkit.cs b/mROA/Implementation/JsonSerializationToolkit.cs index 82299f3..4cc0f75 100644 --- a/mROA/Implementation/JsonSerializationToolkit.cs +++ b/mROA/Implementation/JsonSerializationToolkit.cs @@ -25,6 +25,16 @@ public class JsonSerializationToolkit : ISerializationToolkit return JsonSerializer.Deserialize(rawData, type); } + public T? Deserialize(Span rawData) + { + return JsonSerializer.Deserialize(rawData); + } + + public object? Deserialize(Span rawData, Type type) + { + return JsonSerializer.Deserialize(rawData, type); + } + public T Cast(object nonCasted) { return nonCasted switch diff --git a/mROA/Implementation/NextGenerationInteractionModule.cs b/mROA/Implementation/NextGenerationInteractionModule.cs index 911f748..0036eda 100644 --- a/mROA/Implementation/NextGenerationInteractionModule.cs +++ b/mROA/Implementation/NextGenerationInteractionModule.cs @@ -9,8 +9,8 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule public Stream? BaseStream { get; set; } private Task? _currentReceiving; private const int BufferSize = ushort.MaxValue; - private readonly byte[] _buffer = new byte[BufferSize]; - private readonly List _messageBuffer = []; + private readonly Memory _buffer = new byte[BufferSize]; + private readonly List _messageBuffer = new (128); public void Inject(T dependency) @@ -29,8 +29,6 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule public Task GetNextMessageReceiving() { - // Console.WriteLine(_currentReceiving?.Status); - if (_currentReceiving != null) return _currentReceiving; _currentReceiving = Task.Run(GetNextMessage); return _currentReceiving; @@ -59,6 +57,10 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule } public NetworkMessage[] UnhandledMessages => _messageBuffer.ToArray(); + public NetworkMessage? FirstByFilter(Predicate predicate) + { + return _messageBuffer.FirstOrDefault(m => predicate(m)); + } private NetworkMessage GetNextMessage() { @@ -70,15 +72,14 @@ public class NextGenerationInteractionModule : INextGenerationInteractionModule // Console.WriteLine("Receiving message"); - BaseStream.ReadExactly(_buffer, 0, 2); - var len = BitConverter.ToUInt16(_buffer, 0); - BaseStream.ReadExactly(_buffer, 0, len); + var len = BitConverter.ToUInt16([(byte)BaseStream.ReadByte(), (byte)BaseStream.ReadByte()]); + var localSpan = _buffer.Span.Slice(0, len); + BaseStream.ReadExactly(localSpan); // Console.WriteLine("Receiving {0}", Encoding.Default.GetString(_buffer[..len])); - var message = _serialization.Deserialize(_buffer[..len]); + var message = _serialization.Deserialize(localSpan); _messageBuffer.Add(message!); - _currentReceiving = Task.Run(GetNextMessage); return message!; diff --git a/mROA/Implementation/RepresentationModule.cs b/mROA/Implementation/RepresentationModule.cs index 7dda269..4a119b9 100644 --- a/mROA/Implementation/RepresentationModule.cs +++ b/mROA/Implementation/RepresentationModule.cs @@ -44,9 +44,10 @@ public class RepresentationModule : IRepresentationModule throw new NullReferenceException("Interaction toolkit is not initialized"); var fromBuffer = - _interaction.UnhandledMessages.FirstOrDefault(message => + _interaction.FirstByFilter(message => (requestId is null || message.Id == requestId) && (messageType is null || message.SchemaId == messageType)); + if (fromBuffer == null) { while (true)