public override async Task InvokeAsync(IPipeContext context, CancellationToken token)
        {
            if (token != default(CancellationToken))
            {
                await Next.InvokeAsync(context, token);

                return;
            }

            var timeout    = GetTimeoutTimeSpan(context);
            var ctc        = new CancellationTokenSource(timeout);
            var timeoutTsc = new TaskCompletionSource <bool>();

            ctc.Token.Register(() =>
            {
                var correlationId = context?.GetBasicProperties()?.CorrelationId;
                var cfg           = context?.GetRequestConfiguration();
                timeoutTsc.TrySetException(new TimeoutException($"The request '{correlationId}' with routing key '{cfg?.Request.RoutingKey}' timed out after {timeout:g}."));
            });

            var pipeTask = Next
                           .InvokeAsync(context, ctc.Token)
                           .ContinueWith(t =>
            {
                if (!ctc.IsCancellationRequested)
                {
                    timeoutTsc.TrySetResult(true);
                }
                return(t);
            }, token)
                           .Unwrap();

            await timeoutTsc.Task;
            await pipeTask;

            ctc.Dispose();
        }
 public static ConsumerConfiguration GetResponseConfiguration(this IPipeContext context)
 {
     return(context.GetRequestConfiguration()?.Response);
 }
 public static ExchangeDeclaration GetResponseExchange(this IPipeContext context)
 {
     return(context.GetRequestConfiguration()?.Response.Exchange);
 }
 public static QueueDeclaration GetResponseQueue(this IPipeContext context)
 {
     return(context.GetRequestConfiguration()?.Response.Queue);
 }