private ValueTask ProcessAsync(
            ReadOnlySequence <byte> slice,
            CancellationToken cancellationToken)
        {
            try
            {
                GraphQLWebSocketMessage message = GraphQLWebSocketMessageParser.Parse(slice);

                if (message.Id is { } id)
                {
                    switch (message.Type)
                    {
                    case GraphQLWebSocketMessageType.Data:
                        return(Notify(
                                   id,
                                   new DataDocumentOperationMessage <JsonDocument>(message.Payload),
                                   cancellationToken));

                    case GraphQLWebSocketMessageType.Complete:
                        return(Notify(
                                   id,
                                   CompleteOperationMessage.Default,
                                   cancellationToken));

                    case GraphQLWebSocketMessageType.Error:
                        return(Notify(
                                   id,
                                   ErrorOperationMessage.UnexpectedServerError,
                                   cancellationToken));

                    case GraphQLWebSocketMessageType.ConnectionError:
                        return(Notify(
                                   id,
                                   ErrorOperationMessage.ConnectionInitializationError,
                                   cancellationToken));

                    default:
                        return(CloseSocketOnProtocolError(
                                   "Invalid message type received: " + message.Type,
                                   cancellationToken));
                    }
                }
            }
            catch (Exception ex)
            {
                return(CloseSocketOnProtocolError(
                           "Invalid message received: " + ex.Message,
                           cancellationToken));
            }

            return(default);
        private ValueTask ProcessAsync(
            ReadOnlySequence <byte> slice,
            CancellationToken cancellationToken)
        {
            try
            {
                GraphQLWebSocketMessage message = GraphQLWebSocketMessageParser.Parse(slice);

                if (message.Id is { } id)
                {
                    return(message.Type switch
                    {
                        GraphQLWebSocketMessageType.Data =>
                        Notify(
                            id,
                            new DataDocumentOperationMessage <JsonDocument>(message.Payload),
                            cancellationToken),

                        GraphQLWebSocketMessageType.Complete =>
                        Notify(
                            id,
                            CompleteOperationMessage.Default,
                            cancellationToken),

                        GraphQLWebSocketMessageType.Error =>
                        Notify(
                            id,
                            ErrorOperationMessage.UnexpectedServerError,
                            cancellationToken),

                        GraphQLWebSocketMessageType.ConnectionError =>
                        Notify(
                            id,
                            ErrorOperationMessage.ConnectionInitializationError,
                            cancellationToken),

                        _ => CloseSocketOnProtocolError(
                            "Invalid message type received: " + message.Type,
                            cancellationToken)
                    });
                }
        /// <summary>
        /// Parses the message out of the sequence
        /// </summary>
        /// <returns></returns>
        /// <exception cref="SerializationException">
        /// Thrown when a invalid token, a unknown field or the type is not specified
        /// </exception>
        private GraphQLWebSocketMessage ParseMessage()
        {
            _reader.Read();
            Expect(JsonTokenType.StartObject);

            var message = new GraphQLWebSocketMessage();

            _reader.Read();
            while (_reader.TokenType != JsonTokenType.EndObject)
            {
                ParseMessageProperty(ref message);
                _reader.Read();
            }

            if (message.Type == GraphQLWebSocketMessageType.None)
            {
                throw ThrowHelper.Serialization_MessageHadNoTypeSpecified();
            }

            return(message);
        }
        private void ParseMessageProperty(ref GraphQLWebSocketMessage message)
        {
            Expect(JsonTokenType.PropertyName);
            ReadOnlySpan <byte> fieldName = _reader.ValueSpan;

            _reader.Read();
            switch (fieldName[0])
            {
            case _t:
                if (fieldName.SequenceEqual(Type))
                {
                    Expect(JsonTokenType.String);
                    message.Type = ParseMessageType();
                }

                break;

            case _i:
                if (fieldName.SequenceEqual(Id))
                {
                    Expect(JsonTokenType.String);
                    message.Id = _reader.GetString();
                }

                break;

            case _p:
                if (fieldName.SequenceEqual(Payload))
                {
                    message.Payload = JsonDocument.ParseValue(ref _reader);
                }

                break;

            default:
                throw ThrowHelper.Serialization_UnknownField(fieldName);
            }
        }