private void WriteMessageCore(HubMessage message, IBufferWriter <byte> stream)
        {
            using var writer = new Utf8JsonWriter(stream);

            writer.WriteStartObject();
            switch (message)
            {
            case InvocationMessage m:
                WriteMessageType(writer, HubProtocolConstants.InvocationMessageType);
                WriteHeaders(writer, m);
                WriteInvocationMessage(m, writer);
                break;

            case StreamInvocationMessage m:
                WriteMessageType(writer, HubProtocolConstants.StreamInvocationMessageType);
                WriteHeaders(writer, m);
                WriteStreamInvocationMessage(m, writer);
                break;

            case StreamItemMessage m:
                WriteMessageType(writer, HubProtocolConstants.StreamItemMessageType);
                WriteHeaders(writer, m);
                WriteStreamItemMessage(m, writer);
                break;

            case CompletionMessage m:
                WriteMessageType(writer, HubProtocolConstants.CompletionMessageType);
                WriteHeaders(writer, m);
                WriteCompletionMessage(m, writer);
                break;

            case CancelInvocationMessage m:
                WriteMessageType(writer, HubProtocolConstants.CancelInvocationMessageType);
                WriteHeaders(writer, m);
                WriteCancelInvocationMessage(m, writer);
                break;

            case PingMessage _:
                WriteMessageType(writer, HubProtocolConstants.PingMessageType);
                break;

            case CloseMessage m:
                WriteMessageType(writer, HubProtocolConstants.CloseMessageType);
                WriteCloseMessage(m, writer);
                break;

            default:
                throw new InvalidOperationException($"Unsupported message type: {message.GetType().FullName}");
            }
            writer.WriteEndObject();
            writer.Flush();
            Debug.Assert(writer.CurrentDepth == 0);
        }
        private void WriteMessageCore(HubMessage message, ref MessagePackWriter writer)
        {
            switch (message)
            {
            case InvocationMessage invocationMessage:
                WriteInvocationMessage(invocationMessage, ref writer);
                break;

            case StreamInvocationMessage streamInvocationMessage:
                WriteStreamInvocationMessage(streamInvocationMessage, ref writer);
                break;

            case StreamItemMessage streamItemMessage:
                WriteStreamingItemMessage(streamItemMessage, ref writer);
                break;

            case CompletionMessage completionMessage:
                WriteCompletionMessage(completionMessage, ref writer);
                break;

            case CancelInvocationMessage cancelInvocationMessage:
                WriteCancelInvocationMessage(cancelInvocationMessage, ref writer);
                break;

            case PingMessage pingMessage:
                WritePingMessage(pingMessage, ref writer);
                break;

            case CloseMessage closeMessage:
                WriteCloseMessage(closeMessage, ref writer);
                break;

            default:
                throw new InvalidDataException($"Unexpected message type: {message.GetType().Name}");
            }

            writer.Flush();
        }
Beispiel #3
0
        private void WriteMessageCore(HubMessage message, IBufferWriter <byte> stream)
        {
            var textWriter = Utf8BufferTextWriter.Get(stream);

            try
            {
                using (var writer = JsonUtils.CreateJsonTextWriter(textWriter))
                {
                    writer.WriteStartObject();
                    switch (message)
                    {
                    case InvocationMessage m:
                        WriteMessageType(writer, HubProtocolConstants.InvocationMessageType);
                        WriteHeaders(writer, m);
                        WriteInvocationMessage(m, writer);
                        break;

                    case StreamInvocationMessage m:
                        WriteMessageType(writer, HubProtocolConstants.StreamInvocationMessageType);
                        WriteHeaders(writer, m);
                        WriteStreamInvocationMessage(m, writer);
                        break;

                    case StreamItemMessage m:
                        WriteMessageType(writer, HubProtocolConstants.StreamItemMessageType);
                        WriteHeaders(writer, m);
                        WriteStreamItemMessage(m, writer);
                        break;

                    case CompletionMessage m:
                        WriteMessageType(writer, HubProtocolConstants.CompletionMessageType);
                        WriteHeaders(writer, m);
                        WriteCompletionMessage(m, writer);
                        break;

                    case CancelInvocationMessage m:
                        WriteMessageType(writer, HubProtocolConstants.CancelInvocationMessageType);
                        WriteHeaders(writer, m);
                        WriteCancelInvocationMessage(m, writer);
                        break;

                    case PingMessage _:
                        WriteMessageType(writer, HubProtocolConstants.PingMessageType);
                        break;

                    case CloseMessage m:
                        WriteMessageType(writer, HubProtocolConstants.CloseMessageType);
                        WriteCloseMessage(m, writer);
                        break;

                    default:
                        throw new InvalidOperationException($"Unsupported message type: {message.GetType().FullName}");
                    }
                    writer.WriteEndObject();
                    writer.Flush();
                }
            }
            finally
            {
                Utf8BufferTextWriter.Return(textWriter);
            }
        }