Exemplo n.º 1
0
        private async Task <IrcMessage> ReceiveAsync(ClientWebSocket client, CancellationToken cancelToken)
        {
            // Reset memory stream
            _memoryStream.Position = 0;
            _memoryStream.SetLength(0);

            WebSocketReceiveResult result;

            do
            {
                var buffer = _memoryStream.Buffer.RequestSegment(10 * 1024);
                result = await client.ReceiveAsync(buffer, cancelToken).ConfigureAwait(false);

                _memoryStream.Buffer.Advance(result.Count);

                if (result.CloseStatus != null)
                {
                    throw new WebSocketClosedException(result.CloseStatus.Value, result.CloseStatusDescription);
                }
            }while (!result.EndOfMessage);

            var payload = IrcParser.Read(_memoryStream.Buffer.AsReadOnlySpan(), Serializer);

            HandleEvent(payload);
            ReceivedPayload?.Invoke(payload, _memoryStream.Buffer.Length);
            return(payload);
        }