private async Task <QueryStream> ExecuteAsync( graphql.ExecutionOptions options, CancellationToken cancellationToken) { var result = await Executor.ExecuteAsync(options, cancellationToken); var channel = Channel.CreateBounded <ExecutionResult>(1); await channel.Writer.WriteAsync(result, cancellationToken); channel.Writer.TryComplete(); _logger.Executed(options.OperationName, options.VariableValues, null); return(new QueryStream(channel)); }
private async Task <QueryStream> SubscribeAsync( graphql.ExecutionOptions options, CancellationToken cancellationToken) { if (!cancellationToken.CanBeCanceled) { throw new InvalidOperationException( "Invalid cancellation token. To unsubscribe the provided cancellation token must be cancellable."); } var unsubscribeSource = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); var result = await Executor.SubscribeAsync(options, unsubscribeSource.Token); _logger.Subscribed(options.OperationName, options.VariableValues, null); unsubscribeSource.Token.Register(() => { _logger?.Unsubscribed( options.OperationName, options.VariableValues, null); }); if (result.Errors != null && result.Errors.Any()) { var channel = Channel.CreateBounded <ExecutionResult>(1); await channel.Writer.WriteAsync(new ExecutionResult { Errors = result.Errors, Extensions = result.Extensions }, CancellationToken.None); channel.Writer.TryComplete(); // unsubscribe unsubscribeSource.Cancel(); return(new QueryStream(channel.Reader)); } var stream = new QueryStream(result.Source); return(stream); }