решены баги и один шаг до обратного вызова
This commit is contained in:
@@ -20,8 +20,12 @@ public interface ISerialisationModule : IInjectableModule
|
||||
public interface IRepresentationModule : IInjectableModule
|
||||
{
|
||||
int Id { get; }
|
||||
Task<T> GetMessage<T>(Guid? requestId = null, MessageType? messageType = null);
|
||||
Task<T> GetMessageAsync<T>(Guid? requestId = null, MessageType? messageType = null);
|
||||
T GetMessage<T>(Guid? requestId = null, MessageType? messageType = null);
|
||||
Task<byte[]> GetRawMessage(Guid? requestId = null, MessageType? messageType = null);
|
||||
Task PostCallMessage<T>(Guid id, MessageType messageType, T payload);
|
||||
Task PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType);
|
||||
|
||||
Task PostCallMessageAsync<T>(Guid id, MessageType messageType, T payload);
|
||||
Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType);
|
||||
void PostCallMessage<T>(Guid id, MessageType messageType, T payload);
|
||||
void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType);
|
||||
}
|
||||
@@ -12,6 +12,7 @@ public class ConnectionHub : IConnectionHub
|
||||
if (_serializationToolkit is null)
|
||||
throw new NullReferenceException("Serialization toolkit is null");
|
||||
|
||||
_connections.Add(interaction.ConnectionId, interaction);
|
||||
var module = new RepresentationModule();
|
||||
module.Inject(_serializationToolkit);
|
||||
module.Inject(interaction);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
using mROA.Abstract;
|
||||
using mROA.Implementation.Backend;
|
||||
// ReSharper disable MethodHasAsyncOverload
|
||||
|
||||
namespace mROA.Implementation.Frontend;
|
||||
|
||||
@@ -46,6 +47,8 @@ public class RequestExtractor : IRequestExtractor
|
||||
if (_methodRepository == null)
|
||||
throw new NullReferenceException("Method repository is null.");
|
||||
|
||||
await Task.Yield();
|
||||
|
||||
var multiClientOwnershipRepository = TransmissionConfig.OwnershipRepository as MultiClientOwnershipRepository;
|
||||
|
||||
|
||||
@@ -55,8 +58,8 @@ public class RequestExtractor : IRequestExtractor
|
||||
{
|
||||
while (true)
|
||||
{
|
||||
var request =
|
||||
await _representationModule!.GetMessage<DefaultCallRequest>(messageType: MessageType.CallRequest);
|
||||
var request =
|
||||
_representationModule!.GetMessage<DefaultCallRequest>(messageType: MessageType.CallRequest);
|
||||
|
||||
if (request.Parameter is not null)
|
||||
{
|
||||
@@ -72,7 +75,7 @@ public class RequestExtractor : IRequestExtractor
|
||||
? MessageType.FinishedCommandExecution
|
||||
: MessageType.ExceptionCommandExecution;
|
||||
|
||||
await _representationModule.PostCallMessage(request.CallRequestId, resultType, result);
|
||||
_representationModule.PostCallMessage(request.CallRequestId, resultType, result, result.GetType());
|
||||
}
|
||||
}
|
||||
catch
|
||||
|
||||
@@ -20,13 +20,13 @@ public abstract class RemoteObjectBase
|
||||
{
|
||||
var request = new DefaultCallRequest
|
||||
{ CommandId = methodId, ObjectId = _id, Parameter = parameter, ParameterType = parameter?.GetType() };
|
||||
await _representationModule.PostCallMessage(request.CallRequestId, MessageType.CallRequest, request);
|
||||
await _representationModule.PostCallMessageAsync(request.CallRequestId, MessageType.CallRequest, request);
|
||||
|
||||
var successResponse =
|
||||
_representationModule.GetMessage<FinalCommandExecution<T>>(
|
||||
_representationModule.GetMessageAsync<FinalCommandExecution<T>>(
|
||||
messageType: MessageType.FinishedCommandExecution, requestId: request.CallRequestId);
|
||||
var errorResponse =
|
||||
_representationModule.GetMessage<ExceptionCommandExecution>(
|
||||
_representationModule.GetMessageAsync<ExceptionCommandExecution>(
|
||||
messageType: MessageType.ExceptionCommandExecution, requestId: request.CallRequestId);
|
||||
Task.WaitAny(successResponse, errorResponse);
|
||||
|
||||
@@ -40,13 +40,13 @@ public abstract class RemoteObjectBase
|
||||
{
|
||||
var request = new DefaultCallRequest
|
||||
{ CommandId = methodId, ObjectId = _id, Parameter = parameter, ParameterType = parameter?.GetType() };
|
||||
await _representationModule.PostCallMessage(request.CallRequestId, MessageType.CallRequest, request);
|
||||
await _representationModule.PostCallMessageAsync(request.CallRequestId, MessageType.CallRequest, request);
|
||||
|
||||
var successResponse =
|
||||
_representationModule.GetMessage<FinalCommandExecution>(
|
||||
_representationModule.GetMessageAsync<FinalCommandExecution>(
|
||||
messageType: MessageType.FinishedCommandExecution, requestId: request.CallRequestId);
|
||||
var errorResponse =
|
||||
_representationModule.GetMessage<ExceptionCommandExecution>(
|
||||
_representationModule.GetMessageAsync<ExceptionCommandExecution>(
|
||||
messageType: MessageType.ExceptionCommandExecution, requestId: request.CallRequestId);
|
||||
|
||||
Task.WaitAny(successResponse, errorResponse);
|
||||
|
||||
@@ -22,11 +22,16 @@ public class RepresentationModule : IRepresentationModule
|
||||
|
||||
public int Id => _interaction.ConnectionId;
|
||||
|
||||
public async Task<T> GetMessage<T>(Guid? requestId, MessageType? messageType)
|
||||
public async Task<T> GetMessageAsync<T>(Guid? requestId, MessageType? messageType)
|
||||
{
|
||||
return _serialization.Deserialize<T>(await GetRawMessage(requestId, messageType))!;
|
||||
}
|
||||
|
||||
public T GetMessage<T>(Guid? requestId = null, MessageType? messageType = null)
|
||||
{
|
||||
return _serialization.Deserialize<T>(GetRawMessage(requestId, messageType).GetAwaiter().GetResult())!;
|
||||
}
|
||||
|
||||
public async Task<byte[]> GetRawMessage(Guid? requestId = null, MessageType? messageType = null)
|
||||
{
|
||||
while (true)
|
||||
@@ -38,14 +43,24 @@ public class RepresentationModule : IRepresentationModule
|
||||
}
|
||||
}
|
||||
|
||||
public async Task PostCallMessage<T>(Guid id, MessageType messageType, T payload)
|
||||
public async Task PostCallMessageAsync<T>(Guid id, MessageType messageType, T payload)
|
||||
{
|
||||
await PostCallMessage(id, messageType, payload, typeof(T));
|
||||
await PostCallMessageAsync(id, messageType, payload, typeof(T));
|
||||
}
|
||||
|
||||
public async Task PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType)
|
||||
public async Task PostCallMessageAsync(Guid id, MessageType messageType, object payload, Type payloadType)
|
||||
{
|
||||
await _interaction.PostMessage(new NetworkMessage
|
||||
{ Id = id, SchemaId = messageType, Data = _serialization.Serialize(payload, payloadType) });
|
||||
}
|
||||
|
||||
public void PostCallMessage<T>(Guid id, MessageType messageType, T payload)
|
||||
{
|
||||
PostCallMessageAsync(id, messageType, payload).GetAwaiter().GetResult();
|
||||
}
|
||||
|
||||
public void PostCallMessage(Guid id, MessageType messageType, object payload, Type payloadType)
|
||||
{
|
||||
PostCallMessageAsync(id, messageType, payload, payloadType).GetAwaiter().GetResult();
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,7 @@ public class SharedObject<T> where T : notnull
|
||||
{
|
||||
if (_contextId != -2)
|
||||
return _contextId;
|
||||
|
||||
|
||||
_contextId = TransmissionConfig.RealContextRepository!.GetObjectIndex(Value);
|
||||
return _contextId;
|
||||
}
|
||||
@@ -68,8 +68,8 @@ public class SharedObject<T> where T : notnull
|
||||
_ownerId = ro.OwnerId;
|
||||
_contextId = ro.Id;
|
||||
}
|
||||
|
||||
_ownerId = TransmissionConfig.OwnershipRepository!.GetHostOwnershipId();
|
||||
else
|
||||
_ownerId = TransmissionConfig.OwnershipRepository!.GetHostOwnershipId();
|
||||
}
|
||||
|
||||
public static implicit operator T(SharedObject<T> value) => value.Value;
|
||||
|
||||
Reference in New Issue
Block a user