public async Task <int> ReadNextMessagesAsync(Stream outputMessageStream)
        {
            MessageCount             = 0;
            RemainingMessageDataSize = 0;

            var previousStreamPosition = outputMessageStream.Position;

            outputMessageStream.Position = outputMessageStream.Length;

            try
            {
                while (true)
                {
                    await DataStreamBuffer.ReadFromAsync(InputStream).ConfigureAwait(false);  //Populate the buffer

                    if (!ProcessStream(outputMessageStream))
                    {
                        break;
                    }
                }

                CheckEndOfStreamValidity();
            }
            finally
            {
                outputMessageStream.Position = previousStreamPosition;
                DataStreamBuffer.Reset();
            }

            return(MessageCount);
        }
        void ParseMessages(Stream outputMessageStream)
        {
            while (DataStreamBuffer.RemainingData > 0)
            {
                if (RemainingMessageDataSize == 0)
                {
                    if (ReadAndParseChunkSize() == ChunkType.ZeroChunk)
                    {
                        if (IsMessageOpen)
                        {
                            CloseMessage();
                            MessageCount++;
                        }

                        continue;
                    }

                    OpenMessage();
                }

                var writeLength = Math.Min(RemainingMessageDataSize, DataStreamBuffer.RemainingData);
                DataStreamBuffer.WriteInto(outputMessageStream, writeLength);
                RemainingMessageDataSize -= writeLength;
            }
        }
        public int ReadNextMessages(Stream outputMessageStream)
        {
            MessageCount             = 0;
            RemainingMessageDataSize = 0;

            var previousStreamPosition = outputMessageStream.Position;

            outputMessageStream.Position = outputMessageStream.Length;

            try
            {
                while (true)
                {
                    DataStreamBuffer.ReadFrom(InputStream);  //Populate the buffer
                    if (!ProcessStream(outputMessageStream))
                    {
                        break;
                    }
                }

                CheckEndOfStreamValidity();
            }
            finally
            {
                outputMessageStream.Position = previousStreamPosition;
                DataStreamBuffer.Reset();
            }

            return(MessageCount);
        }
 private int ReadChunkSize()
 {
     DataStreamBuffer.WriteInto(_chunkSizeBuffer, 0, ChunkHeaderSize);
     return(PackStreamBitConverter.ToUInt16(_chunkSizeBuffer));
 }