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