internal async Task ProcessConnectionDataMessageAsync()

in src/Microsoft.Azure.SignalR/ClientConnections/ClientConnectionContext.cs [459:500]


    internal async Task ProcessConnectionDataMessageAsync(ConnectionDataMessage connectionDataMessage)
    {
        try
        {
#if !NET8_0_OR_GREATER
            // do NOT write close message until net 8 or later.
            if (connectionDataMessage.Type == DataMessageType.Close)
            {
                return;
            }
#endif
            if (connectionDataMessage.IsPartial)
            {
                var owner = ExactSizeMemoryPool.Shared.Rent((int)connectionDataMessage.Payload.Length);
                connectionDataMessage.Payload.CopyTo(owner.Memory.Span);
                // make sure there is no await operation before _bufferingMessages.
                _bufferedMessages.Enqueue(owner);
            }
            else
            {
                long length = 0;
                foreach (var owner in _bufferedMessages)
                {
                    using (owner)
                    {
                        await WriteToApplicationAsync(new ReadOnlySequence<byte>(owner.Memory));
                        length += owner.Memory.Length;
                    }
                }
                _bufferedMessages.Clear();

                var payload = connectionDataMessage.Payload;
                length += payload.Length;
                Log.WriteMessageToApplication(Logger, length, connectionDataMessage.ConnectionId);
                await WriteToApplicationAsync(payload);
            }
        }
        catch (Exception ex)
        {
            Log.FailToWriteMessageToApplication(Logger, connectionDataMessage, ex);
        }
    }