コード例 #1
0
        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));
        }
コード例 #2
0
        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);
        }