public override void Execute()
        {
            //wire up events
            InputChannel.OnOpen    += Input_OnOpen;
            InputChannel.OnReceive += Input_OnReceive;
            InputChannel.OnError   += Input_OnError;
            InputChannel.OnClose   += Input_OnClose;

            OutputChannel.OnClose   += Output_OnClose;
            OutputChannel.OnError   += Output_OnError;
            OutputChannel.OnReceive += Output_OnReceive;
            OutputChannel.OnOpen    += Output_OnOpen;

            try
            {
                InputChannel.OpenAsync().GetAwaiter();
                OutputChannel.OpenAsync().GetAwaiter();
            }
            catch (Exception ex)
            {
                OnPipelineError?.Invoke(this, new PipelineErrorEventArgs(Id, ex));
            }
        }
 private void Input_OnClose(object sender, ChannelCloseEventArgs e)
 {
     logger?.LogWarning("Input channel closed.");
     OnPipelineError?.Invoke(this, new PipelineErrorEventArgs(this.Id));
 }