From 9575f745f9febcce4da6d92b35b030bcae145255 Mon Sep 17 00:00:00 2001 From: Mikhail Mitrofanov Date: Sun, 4 May 2025 19:43:15 +0300 Subject: [PATCH] Remove non-context serialization module --- mROA/Abstract/IChannelInteractionModule.cs | 1 + .../IContextualSerializationToolKit.cs | 5 +- mROA/Abstract/IEndPointContext.cs | 2 +- mROA/Abstract/IRepresentationModule.cs | 21 ++-- mROA/Abstract/ISerializationToolkit.cs | 22 ++-- .../Backend/BasicExecutionModule.cs | 4 +- mROA/Implementation/Backend/ConnectionHub.cs | 4 +- .../Backend/HubRequestExtractor.cs | 4 +- .../Backend/NetworkGatewayModule.cs | 4 +- mROA/Implementation/Backend/UdpGateway.cs | 4 +- .../ChannelInteractionModule.cs | 29 +++-- mROA/Implementation/EndPointContext.cs | 4 + .../Frontend/NetworkFrontendBridge.cs | 4 +- .../Frontend/RequestExtractor.cs | 4 +- .../Frontend/UdpUntrustedInteraction.cs | 4 +- .../JsonSerializationToolkit.cs | 108 +++++++++--------- mROA/Implementation/NetworkMessageHeader.cs | 2 +- mROA/Implementation/RemoteObjectBase.cs | 5 +- mROA/Implementation/RepresentationModule.cs | 38 +++--- 19 files changed, 138 insertions(+), 131 deletions(-) rename {mROA.Cbor => mROA/Abstract}/IContextualSerializationToolKit.cs (85%) diff --git a/mROA/Abstract/IChannelInteractionModule.cs b/mROA/Abstract/IChannelInteractionModule.cs index e9030d1..1abdb10 100644 --- a/mROA/Abstract/IChannelInteractionModule.cs +++ b/mROA/Abstract/IChannelInteractionModule.cs @@ -9,6 +9,7 @@ namespace mROA.Abstract public interface IChannelInteractionModule : IInjectableModule, IDisposable { int ConnectionId { get; set; } + IEndPointContext Context { get; set; } Channel ReceiveChanel { get; } ChannelReader TrustedPostChanel { get; } ChannelReader UntrustedPostChanel { get; } diff --git a/mROA.Cbor/IContextualSerializationToolKit.cs b/mROA/Abstract/IContextualSerializationToolKit.cs similarity index 85% rename from mROA.Cbor/IContextualSerializationToolKit.cs rename to mROA/Abstract/IContextualSerializationToolKit.cs index 957ca29..d027205 100644 --- a/mROA.Cbor/IContextualSerializationToolKit.cs +++ b/mROA/Abstract/IContextualSerializationToolKit.cs @@ -1,9 +1,8 @@ using System; -using mROA.Abstract; -namespace mROA.Cbor +namespace mROA.Abstract { - public interface IContextualSerializationToolKit : ISerializationToolkit + public interface IContextualSerializationToolKit { byte[] Serialize(object objectToSerialize, IEndPointContext? context); void Serialize(object objectToSerialize, Span destination, IEndPointContext? context); diff --git a/mROA/Abstract/IEndPointContext.cs b/mROA/Abstract/IEndPointContext.cs index 0267321..494669e 100644 --- a/mROA/Abstract/IEndPointContext.cs +++ b/mROA/Abstract/IEndPointContext.cs @@ -1,6 +1,6 @@ namespace mROA.Abstract { - public interface IEndPointContext + public interface IEndPointContext : IInjectableModule { IContextRepository RealRepository { get; } IContextRepository RemoteRepository { get; } diff --git a/mROA/Abstract/IRepresentationModule.cs b/mROA/Abstract/IRepresentationModule.cs index be692ea..101b399 100644 --- a/mROA/Abstract/IRepresentationModule.cs +++ b/mROA/Abstract/IRepresentationModule.cs @@ -11,15 +11,20 @@ namespace mROA.Abstract int Id { get; } Task<(object? Deserialized, EMessageType MessageType)> GetSingle(Predicate rule, - CancellationToken token, - params Func[] converter); - - IAsyncEnumerable<(object parced, EMessageType originalType)> GetStream(Predicate rule, CancellationToken token, + IEndPointContext? context, CancellationToken token = default, params Func[] converter); - Task PostCallMessageAsync(Guid id, EMessageType eMessageType, T payload) where T : notnull; - void PostCallMessage(Guid id, EMessageType eMessageType, T payload) where T : notnull; - Task PostCallMessageUntrustedAsync(Guid id, EMessageType eMessageType, T payload) where T : notnull; - void PostCallMessage(Guid id, EMessageType eMessageType, object payload, Type payloadType); + IAsyncEnumerable<(object parced, EMessageType originalType)> GetStream(Predicate rule, + IEndPointContext? context, CancellationToken token = default, + params Func[] converter); + + Task PostCallMessageAsync(Guid id, EMessageType eMessageType, T payload, IEndPointContext? context) + where T : notnull; + + void PostCallMessage(Guid id, EMessageType eMessageType, T payload, IEndPointContext? context) + where T : notnull; + + Task PostCallMessageUntrustedAsync(Guid id, EMessageType eMessageType, T payload, IEndPointContext? context) + where T : notnull; } } \ No newline at end of file diff --git a/mROA/Abstract/ISerializationToolkit.cs b/mROA/Abstract/ISerializationToolkit.cs index 497c953..92b806a 100644 --- a/mROA/Abstract/ISerializationToolkit.cs +++ b/mROA/Abstract/ISerializationToolkit.cs @@ -2,15 +2,15 @@ namespace mROA.Abstract { - public interface ISerializationToolkit : IInjectableModule - { - byte[] Serialize(T objectToSerialize); - 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); - } + // public interface IContextualSerializationToolKit : IInjectableModule + // { + // byte[] Serialize(T objectToSerialize); + // 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); + // } } \ No newline at end of file diff --git a/mROA/Implementation/Backend/BasicExecutionModule.cs b/mROA/Implementation/Backend/BasicExecutionModule.cs index fee9bbb..3264b52 100644 --- a/mROA/Implementation/Backend/BasicExecutionModule.cs +++ b/mROA/Implementation/Backend/BasicExecutionModule.cs @@ -9,7 +9,7 @@ namespace mROA.Implementation.Backend { private ICancellationRepository? _cancellationRepo; private IMethodRepository? _methodRepo; - private ISerializationToolkit? _serialization; + private IContextualSerializationToolKit? _serialization; public void Inject(T dependency) { @@ -21,7 +21,7 @@ namespace mROA.Implementation.Backend case ICancellationRepository cancellationRepo: _cancellationRepo = cancellationRepo; break; - case ISerializationToolkit serializationToolkit: + case IContextualSerializationToolKit serializationToolkit: _serialization = serializationToolkit; break; } diff --git a/mROA/Implementation/Backend/ConnectionHub.cs b/mROA/Implementation/Backend/ConnectionHub.cs index 22b7b6b..34c7064 100644 --- a/mROA/Implementation/Backend/ConnectionHub.cs +++ b/mROA/Implementation/Backend/ConnectionHub.cs @@ -7,7 +7,7 @@ namespace mROA.Implementation.Backend public class ConnectionHub : IConnectionHub { private readonly Dictionary _connections = new(); - private ISerializationToolkit? _serializationToolkit; + private IContextualSerializationToolKit? _serializationToolkit; public void RegisterInteraction(IChannelInteractionModule interaction) { @@ -31,7 +31,7 @@ namespace mROA.Implementation.Backend public void Inject(T dependency) { - if (dependency is ISerializationToolkit serializationToolkit) + if (dependency is IContextualSerializationToolKit serializationToolkit) _serializationToolkit = serializationToolkit; } } diff --git a/mROA/Implementation/Backend/HubRequestExtractor.cs b/mROA/Implementation/Backend/HubRequestExtractor.cs index 71171de..7d760fe 100644 --- a/mROA/Implementation/Backend/HubRequestExtractor.cs +++ b/mROA/Implementation/Backend/HubRequestExtractor.cs @@ -10,7 +10,7 @@ namespace mROA.Implementation.Backend private IContextRepository? _contextRepository; private IContextRepository? _remoteContextRepository; private IMethodRepository? _methodRepository; - private ISerializationToolkit? _serializationToolkit; + private IContextualSerializationToolKit? _serializationToolkit; private IExecuteModule? _executeModule; private readonly Type _extractorType; @@ -37,7 +37,7 @@ namespace mROA.Implementation.Backend case IMethodRepository methodRepository: _methodRepository = methodRepository; break; - case ISerializationToolkit serializationToolkit: + case IContextualSerializationToolKit serializationToolkit: _serializationToolkit = serializationToolkit; break; case IExecuteModule executeModule: diff --git a/mROA/Implementation/Backend/NetworkGatewayModule.cs b/mROA/Implementation/Backend/NetworkGatewayModule.cs index 9634fd1..9112bdd 100644 --- a/mROA/Implementation/Backend/NetworkGatewayModule.cs +++ b/mROA/Implementation/Backend/NetworkGatewayModule.cs @@ -15,7 +15,7 @@ namespace mROA.Implementation.Backend private readonly Type? _interactionModuleType; private readonly TcpListener _tcpListener; private IConnectionHub? _hub; - private ISerializationToolkit? _serialization; + private IContextualSerializationToolKit? _serialization; private Dictionary _extractorsCTS = new(); @@ -58,7 +58,7 @@ namespace mROA.Implementation.Backend case IConnectionHub interactionModule: _hub = interactionModule; break; - case ISerializationToolkit serializationToolkit: + case IContextualSerializationToolKit serializationToolkit: _serialization = serializationToolkit; break; } diff --git a/mROA/Implementation/Backend/UdpGateway.cs b/mROA/Implementation/Backend/UdpGateway.cs index 68be81a..0bbcf5d 100644 --- a/mROA/Implementation/Backend/UdpGateway.cs +++ b/mROA/Implementation/Backend/UdpGateway.cs @@ -16,7 +16,7 @@ namespace mROA.Implementation.Backend private UdpClient _client; private Dictionary _reservedPorts = new(); private CancellationTokenSource _tokenSource = new(); - private ISerializationToolkit _serializationToolkit; + private IContextualSerializationToolKit _serializationToolkit; public UdpGateway(IPEndPoint listeningEndpoint) { @@ -31,7 +31,7 @@ namespace mROA.Implementation.Backend case IConnectionHub hub: _hub = hub; break; - case ISerializationToolkit serializationToolkit: + case IContextualSerializationToolKit serializationToolkit: _serializationToolkit = serializationToolkit; break; } diff --git a/mROA/Implementation/ChannelInteractionModule.cs b/mROA/Implementation/ChannelInteractionModule.cs index 4657c62..400f333 100644 --- a/mROA/Implementation/ChannelInteractionModule.cs +++ b/mROA/Implementation/ChannelInteractionModule.cs @@ -1,7 +1,5 @@ using System; -using System.Collections.Generic; using System.IO; -using System.Linq; using System.Threading; using System.Threading.Channels; using System.Threading.Tasks; @@ -16,13 +14,12 @@ namespace mROA.Implementation private readonly ChannelWriter _untrustedWriter; private readonly Channel _outputTrustedChannel; private readonly Channel _outputUntrustedChannel; - private readonly List _messageBuffer = new(128); private Task? _currentReceiving; - private ISerializationToolkit? _serialization; + private IContextualSerializationToolKit? _serialization; private bool _isConnected = true; private bool _isActive = true; private TaskCompletionSource _reconnection; - + public IEndPointContext Context { get; set; } public ChannelInteractionModule() { ReceiveChanel = Channel.CreateUnbounded(new UnboundedChannelOptions @@ -58,12 +55,15 @@ namespace mROA.Implementation { switch (dependency) { - case ISerializationToolkit toolkit: + case IContextualSerializationToolKit toolkit: _serialization = toolkit; break; case IIdentityGenerator identityGenerator: ConnectionId = identityGenerator.GetNextIdentity(); break; + case IEndPointContext endpointContext: + Context = endpointContext; + break; } } @@ -122,11 +122,6 @@ namespace mROA.Implementation await _untrustedWriter.WriteAsync(messageHeader); } - public NetworkMessageHeader? FirstByFilter(Predicate predicate) - { - return _messageBuffer.FirstOrDefault(m => predicate(m)); - } - public event Action? OnDisconnected; public async Task Restart(bool sendRecovery) @@ -189,17 +184,18 @@ namespace mROA.Implementation public class StreamExtractor { private readonly Stream _ioStream; - private readonly ISerializationToolkit _serializationToolkit; + private readonly IContextualSerializationToolKit _serializationToolkit; private const int BufferSize = ushort.MaxValue; private readonly Memory _buffer = new byte[BufferSize]; private bool _manualConnectionState = true; - + private IEndPointContext Context; public readonly int Id = new Random().Next(); - public StreamExtractor(Stream ioStream, ISerializationToolkit serializationToolkit) + public StreamExtractor(Stream ioStream, IContextualSerializationToolKit serializationToolkit, IEndPointContext context) { _ioStream = ioStream; _serializationToolkit = serializationToolkit; + Context = context; } public Action MessageReceived = _ => { }; @@ -231,7 +227,7 @@ namespace mROA.Implementation await _ioStream.ReadExactlyAsync(localSpan, cancellationToken: Token); - var message = _serializationToolkit.Deserialize(localSpan.Span); + var message = _serializationToolkit.Deserialize(localSpan, Context); #if TRACE Console.WriteLine( $"{DateTime.Now.TimeOfDay} [{Id}] Received Message {message.Id} - {message.MessageType}"); @@ -254,9 +250,10 @@ namespace mROA.Implementation public async Task Send(NetworkMessageHeader message, CancellationToken token = default) { + try { - var rawMessage = _serializationToolkit.Serialize(message); + var rawMessage = _serializationToolkit.Serialize(message, Context); var header = BitConverter.GetBytes((ushort)rawMessage.Length).AsMemory(0, sizeof(ushort)); #if TRACE diff --git a/mROA/Implementation/EndPointContext.cs b/mROA/Implementation/EndPointContext.cs index e6351e9..b249aeb 100644 --- a/mROA/Implementation/EndPointContext.cs +++ b/mROA/Implementation/EndPointContext.cs @@ -16,5 +16,9 @@ namespace mROA.Implementation // ReSharper disable once UnusedMember.Global set { OwnerFunc = () => value; } } + + public void Inject(T dependency) + { + } } } \ No newline at end of file diff --git a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs index fdbface..e7ed3c6 100644 --- a/mROA/Implementation/Frontend/NetworkFrontendBridge.cs +++ b/mROA/Implementation/Frontend/NetworkFrontendBridge.cs @@ -16,7 +16,7 @@ namespace mROA.Implementation.Frontend private readonly IPEndPoint _serverEndPoint; private TcpClient _tcpClient = new(); private IChannelInteractionModule? _interactionModule; - private ISerializationToolkit? _serialization; + private IContextualSerializationToolKit? _serialization; private ChannelInteractionModule.StreamExtractor _currentExtractor; private CancellationTokenSource _rawExtractorCancellation; @@ -33,7 +33,7 @@ namespace mROA.Implementation.Frontend case ChannelInteractionModule interactionModule: _interactionModule = interactionModule; break; - case ISerializationToolkit toolkit: + case IContextualSerializationToolKit toolkit: _serialization = toolkit; break; } diff --git a/mROA/Implementation/Frontend/RequestExtractor.cs b/mROA/Implementation/Frontend/RequestExtractor.cs index 33fe375..f38152e 100644 --- a/mROA/Implementation/Frontend/RequestExtractor.cs +++ b/mROA/Implementation/Frontend/RequestExtractor.cs @@ -16,7 +16,7 @@ namespace mROA.Implementation.Frontend private IContextRepository? _realContextRepository; private IContextRepository? _remoteContextRepository; private IRepresentationModule? _representationModule; - private ISerializationToolkit? _serializationToolkit; + private IContextualSerializationToolKit? _serializationToolkit; public void Inject(T dependency) { @@ -38,7 +38,7 @@ namespace mROA.Implementation.Frontend case IRepresentationModule representationModule: _representationModule = representationModule; break; - case ISerializationToolkit serializationToolkit: + case IContextualSerializationToolKit serializationToolkit: _serializationToolkit = serializationToolkit; break; } diff --git a/mROA/Implementation/Frontend/UdpUntrustedInteraction.cs b/mROA/Implementation/Frontend/UdpUntrustedInteraction.cs index 6dafb47..4ee2f00 100644 --- a/mROA/Implementation/Frontend/UdpUntrustedInteraction.cs +++ b/mROA/Implementation/Frontend/UdpUntrustedInteraction.cs @@ -9,7 +9,7 @@ namespace mROA.Implementation.Frontend { public class UdpUntrustedInteraction : IUntrustedInteractionModule { - private ISerializationToolkit _serializationToolkit; + private IContextualSerializationToolKit _serializationToolkit; private IChannelInteractionModule _channelInteractionModule; private CancellationTokenSource _tokenSource = new CancellationTokenSource(); @@ -77,7 +77,7 @@ namespace mROA.Implementation.Frontend case IChannelInteractionModule channelModule: _channelInteractionModule = channelModule; break; - case ISerializationToolkit serializationToolkit: + case IContextualSerializationToolKit serializationToolkit: _serializationToolkit = serializationToolkit; break; } diff --git a/mROA/Implementation/JsonSerializationToolkit.cs b/mROA/Implementation/JsonSerializationToolkit.cs index 61a3c7e..38f8c19 100644 --- a/mROA/Implementation/JsonSerializationToolkit.cs +++ b/mROA/Implementation/JsonSerializationToolkit.cs @@ -4,58 +4,58 @@ using mROA.Abstract; 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); - } - - 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 - { - JsonElement jsonElement => jsonElement.Deserialize()!, - T casted => casted, - _ => throw new JsonException("Cannot cast object to type " + typeof(T).FullName) - }; - } - - public object Cast(object nonCasted, Type type) - { - if (nonCasted is JsonElement jsonElement) - return jsonElement.Deserialize(type)!; - - throw new JsonException("Cannot cast object to type " + type.FullName); - } - - public void Inject(T dependency) - { - } - } + // public class JsonSerializationToolkit : IContextualSerializationToolKit + // { + // 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); + // } + // + // 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 + // { + // JsonElement jsonElement => jsonElement.Deserialize()!, + // T casted => casted, + // _ => throw new JsonException("Cannot cast object to type " + typeof(T).FullName) + // }; + // } + // + // public object Cast(object nonCasted, Type type) + // { + // if (nonCasted is JsonElement jsonElement) + // return jsonElement.Deserialize(type)!; + // + // throw new JsonException("Cannot cast object to type " + type.FullName); + // } + // + // public void Inject(T dependency) + // { + // } + // } } \ No newline at end of file diff --git a/mROA/Implementation/NetworkMessageHeader.cs b/mROA/Implementation/NetworkMessageHeader.cs index 61ecea2..db47fe9 100644 --- a/mROA/Implementation/NetworkMessageHeader.cs +++ b/mROA/Implementation/NetworkMessageHeader.cs @@ -34,7 +34,7 @@ namespace mROA.Implementation MessageType = EMessageType.Unknown; Data = Array.Empty(); } - public NetworkMessageHeader(ISerializationToolkit serializationToolkit, INetworkMessage networkMessage) + public NetworkMessageHeader(IContextualSerializationToolKit serializationToolkit, INetworkMessage networkMessage) { MessageType = networkMessage.MessageType; Data = serializationToolkit.Serialize(networkMessage); diff --git a/mROA/Implementation/RemoteObjectBase.cs b/mROA/Implementation/RemoteObjectBase.cs index 264fd4b..89fb54e 100644 --- a/mROA/Implementation/RemoteObjectBase.cs +++ b/mROA/Implementation/RemoteObjectBase.cs @@ -1,4 +1,5 @@ using System; +using System.Net; using System.Threading; using System.Threading.Tasks; using mROA.Abstract; @@ -10,6 +11,7 @@ namespace mROA.Implementation { public abstract class RemoteObjectBase : IDisposable { + private readonly IEndPointContext _context; public bool Equals(RemoteObjectBase other) { return _identifier.Equals(other._identifier); @@ -31,10 +33,11 @@ namespace mROA.Implementation private readonly ComplexObjectIdentifier _identifier; private readonly IRepresentationModule _representationModule; - protected RemoteObjectBase(int id, IRepresentationModule representationModule) + protected RemoteObjectBase(int id, IRepresentationModule representationModule, IEndPointContext context) { _identifier = new ComplexObjectIdentifier { ContextId = id, OwnerId = representationModule.Id }; _representationModule = representationModule; + _context = context; } public int Id => _identifier.ContextId; diff --git a/mROA/Implementation/RepresentationModule.cs b/mROA/Implementation/RepresentationModule.cs index d2f01e9..14db0fd 100644 --- a/mROA/Implementation/RepresentationModule.cs +++ b/mROA/Implementation/RepresentationModule.cs @@ -11,13 +11,13 @@ namespace mROA.Implementation public class RepresentationModule : IRepresentationModule { private IChannelInteractionModule? _interaction; - private ISerializationToolkit? _serialization; + private IContextualSerializationToolKit? _serialization; public void Inject(T dependency) { switch (dependency) { - case ISerializationToolkit toolkit: + case IContextualSerializationToolKit toolkit: _serialization = toolkit; break; case IChannelInteractionModule interactionModule: @@ -31,7 +31,7 @@ namespace mROA.Implementation .ConnectionId; public async Task<(object? Deserialized, EMessageType MessageType)> GetSingle( - Predicate rule, + Predicate rule, IEndPointContext? context, CancellationToken token = default, params Func[] converter) { var writer = _interaction.ReceiveChanel.Writer; @@ -47,7 +47,7 @@ namespace mROA.Implementation } var type = converter.Select(i => i(message)).First(i => i != null)!; - var deserialized = _serialization.Deserialize(message.Data, type); + var deserialized = _serialization.Deserialize(message.Data, type, context); return (deserialized, message.MessageType); } @@ -55,7 +55,7 @@ namespace mROA.Implementation } public async IAsyncEnumerable<(object parced, EMessageType originalType)> GetStream( - Predicate rule, [EnumeratorCancellation] CancellationToken token = default, + Predicate rule, IEndPointContext? context, [EnumeratorCancellation] CancellationToken token = default, params Func[] converter) { var writer = _interaction?.ReceiveChanel.Writer; @@ -68,43 +68,41 @@ namespace mROA.Implementation } var type = converter.Select(i => i(message)).First(i => i != null)!; - var deserialized = _serialization.Deserialize(message.Data, type); + var deserialized = _serialization.Deserialize(message.Data, type, context); yield return (deserialized, message.MessageType)!; } } - public async Task PostCallMessageAsync(Guid id, EMessageType eMessageType, T payload) where T : notnull + public async Task PostCallMessageAsync(Guid id, EMessageType eMessageType, T payload, + IEndPointContext? context) where T : notnull { - await PostCallMessageAsync(id, eMessageType, payload, typeof(T)); + await PostCallMessageAsync(id, eMessageType, payload, context); } - - public async Task PostCallMessageAsync(Guid id, EMessageType eMessageType, object payload, Type payloadType) + + public async Task PostCallMessageAsync(Guid id, EMessageType eMessageType, object payload, + IEndPointContext? context) { if (_interaction == null) throw new NullReferenceException("Interaction toolkit is not initialized"); if (_serialization == null) throw new NullReferenceException("Serialization toolkit is not initialized"); - var serialized = _serialization.Serialize(payload, payloadType); + var serialized = _serialization.Serialize(payload, context); await _interaction.PostMessageAsync(new NetworkMessageHeader { Id = id, MessageType = eMessageType, Data = serialized }); } - public void PostCallMessage(Guid id, EMessageType eMessageType, T payload) where T : notnull + public void PostCallMessage(Guid id, EMessageType eMessageType, T payload, IEndPointContext? context) where T : notnull { - PostCallMessageAsync(id, eMessageType, payload).GetAwaiter().GetResult(); + PostCallMessageAsync(id, eMessageType, payload, context).GetAwaiter().GetResult(); } - public async Task PostCallMessageUntrustedAsync(Guid id, EMessageType eMessageType, T payload) where T : notnull + public async Task PostCallMessageUntrustedAsync(Guid id, EMessageType eMessageType, T payload, + IEndPointContext? context) where T : notnull { - var serialized = _serialization.Serialize(payload, typeof(T)); + var serialized = _serialization.Serialize(payload, context); await _interaction.PostMessageUntrustedAsync(new NetworkMessageHeader { Id = id, MessageType = eMessageType, Data = serialized }); } - - public void PostCallMessage(Guid id, EMessageType eMessageType, object payload, Type payloadType) - { - PostCallMessageAsync(id, eMessageType, payload, payloadType).GetAwaiter().GetResult(); - } } } \ No newline at end of file