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); } }