public override async Task <ResultResp> Result(ResultReq request, ServerCallContext context) { var resetSource = new TaskCompletionSource <Value>(); var options = request.Options; var name = options.Name; var partition = options.Partition ?? string.Empty; var envelope = new CallbackEnvelope(OnMessage); _queue.Publish(new ProjectionManagementMessage.Command.GetResult(envelope, name, partition)); return(new ResultResp { Result = await resetSource.Task.ConfigureAwait(false) }); void OnMessage(Message message) { if (!(message is ProjectionManagementMessage.ProjectionResult result)) { resetSource.TrySetException(UnknownMessage <ProjectionManagementMessage.ProjectionResult>(message)); return; } var document = JsonDocument.Parse(result.Result); resetSource.TrySetResult(GetProtoValue(document.RootElement)); } }
public override async Task <ResultResp> Result(ResultReq request, ServerCallContext context) { var user = context.GetHttpContext().User; if (!await _authorizationProvider.CheckAccessAsync(user, ResultOperation, context.CancellationToken) .ConfigureAwait(false)) { throw AccessDenied(); } var resultSource = new TaskCompletionSource <Value>(); var options = request.Options; var name = options.Name; var partition = options.Partition ?? string.Empty; var envelope = new CallbackEnvelope(OnMessage); _queue.Publish(new ProjectionManagementMessage.Command.GetResult(envelope, name, partition)); return(new ResultResp { Result = await resultSource.Task.ConfigureAwait(false) }); void OnMessage(Message message) { if (!(message is ProjectionManagementMessage.ProjectionResult result)) { resultSource.TrySetException(UnknownMessage <ProjectionManagementMessage.ProjectionResult>(message)); return; } if (string.IsNullOrEmpty(result.Result)) { resultSource.TrySetResult(new Value { StructValue = new Struct() }); return; } var document = JsonDocument.Parse(result.Result); resultSource.TrySetResult(GetProtoValue(document.RootElement)); } }