private PipeReader CreateReader(DataItem[] data)
            {
                var outputData = data
                                 .Select <DataItem, object>(
                    z =>
                {
                    if (z.MsgKind.EndsWith("response"))
                    {
                        return(new OutgoingResponse(z.MsgId, z.Arg, new Request(z.MsgId, z.MsgType, JValue.CreateNull())));
                    }

                    if (z.MsgKind.EndsWith("request"))
                    {
                        return(new OutgoingRequest
                        {
                            Id = z.MsgId,
                            Method = z.MsgType,
                            Params = z.Arg
                        });
                    }

                    if (z.MsgKind.EndsWith("notification"))
                    {
                        return(new OutgoingNotification
                        {
                            Method = z.MsgType,
                            Params = z.Arg
                        });
                    }

                    throw new NotSupportedException("unknown message kind " + z.MsgKind);
                }
                    );

                var pipeIn = new Pipe();

                var serializer = new JsonRpcSerializer();

                Task.Run(
                    async() =>
                {
                    foreach (var item in outputData)
                    {
                        var content      = serializer.SerializeObject(item);
                        var contentBytes = Encoding.UTF8.GetBytes(content).AsMemory();

                        await pipeIn.Writer.WriteAsync(
                            Encoding.UTF8.GetBytes($"Content-Length: {contentBytes.Length}\r\n\r\n")
                            );
                        await pipeIn.Writer.WriteAsync(contentBytes);
                        await pipeIn.Writer.FlushAsync();
                    }

                    await pipeIn.Writer.CompleteAsync();
                }
                    );


                return(pipeIn.Reader);
            }