protected override async ValueTask ReadCoreAsync()

in src/StreamJsonRpc/WebSocketMessageHandler.cs [89:138]


        protected override async ValueTask<JsonRpcMessage?> ReadCoreAsync(CancellationToken cancellationToken)
        {
#if NETSTANDARD2_1_OR_GREATER
            ValueWebSocketReceiveResult result;
#else
            WebSocketReceiveResult result;
#endif
            do
            {
#if NETSTANDARD2_1_OR_GREATER
                Memory<byte> memory = this.contentSequenceBuilder.GetMemory(this.sizeHint);
                result = await this.WebSocket.ReceiveAsync(memory, cancellationToken).ConfigureAwait(false);
                this.contentSequenceBuilder.Advance(result.Count);
#else
                ArrayPool<byte> pool = ArrayPool<byte>.Shared;
                byte[] segment = pool.Rent(this.sizeHint);
                try
                {
                    result = await this.WebSocket.ReceiveAsync(new ArraySegment<byte>(segment), cancellationToken).ConfigureAwait(false);
                    this.contentSequenceBuilder.Write(segment.AsSpan(0, result.Count));
                }
                finally
                {
                    pool.Return(segment);
                }
#endif
                if (result.MessageType == WebSocketMessageType.Close)
                {
                    await this.WebSocket.CloseAsync(WebSocketCloseStatus.NormalClosure, "Closed as requested.", CancellationToken.None).ConfigureAwait(false);
                    return null;
                }
            }
            while (!result.EndOfMessage);

            if (this.contentSequenceBuilder.AsReadOnlySequence.Length > 0)
            {
                JsonRpcMessage message = this.Formatter.Deserialize(this.contentSequenceBuilder);
                this.bufferedMessage = message as IJsonRpcMessageBufferManager;
                if (this.bufferedMessage is null)
                {
                    this.contentSequenceBuilder.Reset();
                }

                return message;
            }
            else
            {
                return null;
            }
        }