public Logic(OutputStreamSourceStage stage) : base(stage.Shape)
 {
     _stage = stage;
     _downstreamCallback = GetAsyncCallback((Either <ByteString, Exception> result) =>
     {
         if (result.IsLeft)
         {
             OnPush(result.Value as ByteString);
         }
         else
         {
             FailStage(result.Value as Exception);
         }
     });
     _upstreamCallback = GetAsyncCallback <Tuple <IAdapterToStageMessage, TaskCompletionSource <NotUsed> > >(OnAsyncMessage);
     _pullTask         = new OnPullRunnable(_downstreamCallback, stage._dataQueue);
     SetHandler(_stage._out, onPull: OnPull, onDownstreamFinish: OnDownstreamFinish);
 }
            public Logic(OutputStreamSourceStage stage, BlockingCollection <ByteString> dataQueue, AtomicReference <IDownstreamStatus> downstreamStatus, string dispatcherId) : base(stage.Shape)
            {
                _stage            = stage;
                _dataQueue        = dataQueue;
                _downstreamStatus = downstreamStatus;
                _dispatcherId     = dispatcherId;

                var downstreamCallback = GetAsyncCallback <Either <ByteString, Exception> >(result =>
                {
                    if (result.IsLeft)
                    {
                        OnPush(result.Value as ByteString);
                    }
                    else
                    {
                        FailStage(result.Value as Exception);
                    }
                });

                _upstreamCallback = GetAsyncCallback <(IAdapterToStageMessage, TaskCompletionSource <NotUsed>)>(OnAsyncMessage);
                _pullTask         = new OnPullRunnable(downstreamCallback, dataQueue, _cancellation.Token);
                SetHandler(_stage._out, this);
            }