/// <inheritdoc /> public async Task SubscribeOrExecuteAsync( string id, OperationMessagePayload payload, MessageHandlingContext context) { if (id == null) { throw new ArgumentNullException(nameof(id)); } if (payload == null) { throw new ArgumentNullException(nameof(payload)); } if (context == null) { throw new ArgumentNullException(nameof(context)); } var subscription = await ExecuteAsync(id, payload, context).ConfigureAwait(false); if (subscription == null) { return; } _subscriptions[id] = subscription; }
/// <inheritdoc /> public async Task SubscribeOrExecuteAsync( string id, OperationMessagePayload payload, IWriterPipeline writer) { var subscription = await ExecuteAsync(id, payload, writer); if (subscription == null) { return; } _subscriptions[id] = subscription; }
public Subscription(string id, OperationMessagePayload payload, SubscriptionExecutionResult result, IWriterPipeline writer, Action <Subscription> completed, ILogger <Subscription> logger) { _writer = writer; _completed = completed; _logger = logger; Id = id; OriginalPayload = payload; Subscribe(result); }
private async Task <Subscription> ExecuteAsync( string id, OperationMessagePayload payload, MessageHandlingContext context) { var writer = context.Writer; _logger.LogDebug("Executing operation: {operationName} query: {query}", payload.OperationName, payload.Query); var result = await _executer.ExecuteAsync( payload.OperationName, payload.Query, payload.Variables?.ToInputs(), context, null // TODO: find later a better way to specify services ).ConfigureAwait(false); if (result.Errors != null && result.Errors.Any()) { _logger.LogError("Execution errors: {errors}", ResultHelper.GetErrorString(result)); await writer.SendAsync(new OperationMessage { Type = MessageType.GQL_ERROR, Id = id, Payload = result }).ConfigureAwait(false); return(null); } // is sub if (result is SubscriptionExecutionResult subscriptionExecutionResult) { using (_logger.BeginScope("Subscribing to: {subscriptionId}", id)) { if (subscriptionExecutionResult.Streams?.Values.SingleOrDefault() == null) { _logger.LogError("Cannot subscribe as no result stream available"); await writer.SendAsync(new OperationMessage { Type = MessageType.GQL_ERROR, Id = id, Payload = result }).ConfigureAwait(false); return(null); } _logger.LogDebug("Creating subscription"); return(new Subscription( id, payload, subscriptionExecutionResult, writer, sub => _subscriptions.TryRemove(id, out _), _loggerFactory.CreateLogger <Subscription>())); } } //is query or mutation await writer.SendAsync(new OperationMessage { Type = MessageType.GQL_DATA, Id = id, Payload = result }).ConfigureAwait(false); await writer.SendAsync(new OperationMessage { Type = MessageType.GQL_COMPLETE, Id = id }).ConfigureAwait(false); return(null); }
private async Task <Subscription> ExecuteAsync( string id, OperationMessagePayload payload, IWriterPipeline writer) { _logger.LogDebug("Executing operation: {operationName} query: {query}", payload.OperationName, payload.Query); var result = await _executer.ExecuteAsync( payload.OperationName, payload.Query, payload.Variables); if (result.Errors != null && result.Errors.Any()) { _logger.LogError("Execution errors: {errors}", ResultHelper.GetErrorString(result)); await writer.SendAsync(new OperationMessage { Type = MessageType.GQL_ERROR, Id = id, Payload = JObject.FromObject(result) }); return(null); } // is sub if (result is SubscriptionExecutionResult subscriptionExecutionResult) { using (_logger.BeginScope("Subscribing to: {subscriptionId}", id)) { if (subscriptionExecutionResult.Streams?.Values.SingleOrDefault() == null) { _logger.LogError("Cannot subscribe as no result stream available"); await writer.SendAsync(new OperationMessage { Type = MessageType.GQL_ERROR, Id = id, Payload = JObject.FromObject(result) }); return(null); } _logger.LogInformation("Creating subscription"); return(new Subscription( id, payload, subscriptionExecutionResult, writer, sub => _subscriptions.TryRemove(id, out _), _loggerFactory.CreateLogger <Subscription>())); } } //is query or mutation await writer.SendAsync(new OperationMessage { Type = MessageType.GQL_DATA, Id = id, Payload = JObject.FromObject(result) }); await writer.SendAsync(new OperationMessage { Type = MessageType.GQL_COMPLETE, Id = id }); return(null); }