private void ProcessReceivedBytes(byte[] buffer, int offset, int bytesTransferred)
        {
            while (bytesTransferred > 0)
            {
                if (!_handshakeCompleted)
                {
                    var isCompleted = _handshakeFrame.Read(buffer, ref offset, ref bytesTransferred);
                    if (!isCompleted)
                    {
                        return;
                    }
                    HandshakeReceived(this, new HandshakeFrameReceivedEventArgs(_handshakeFrame));
                    _handshakeFrame.ResetRead();
                    continue;
                }

                switch (_frameType)
                {
                case FrameType.Unknown:
                    var flags = (FrameFlags)buffer[offset];
                    if ((flags & FrameFlags.ExtensionFrame) != 0)
                    {
                        _frameType = FrameType.Extension;
                    }
                    else if ((flags & FrameFlags.CommandFrame) != 0)
                    {
                        _frameType = FrameType.Command;
                    }
                    else
                    {
                        _frameType = FrameType.Message;
                    }

                    //do not increase offset, let the frame handle the flags.
                    //only peek it to be able to switch state
                    break;

                case FrameType.Message:
                    var isCompleted = _inboundMessage.Read(buffer, ref offset, ref bytesTransferred);
                    if (isCompleted)
                    {
                        MessageFrameReceived(_inboundMessage);
                        _inboundMessage.ResetRead();
                        _frameType = FrameType.Unknown;
                    }

                    break;

                case FrameType.Extension:
                    var isCompleted2 = _extensionFrameProcessor.Read(buffer, ref offset, ref bytesTransferred);
                    if (isCompleted2)
                    {
                        _frameType = FrameType.Unknown;
                    }
                    break;
                }
            }
        }