Example #1
0
        private async Task <Envelope> GetEnvelopeFromBufferAsync()
        {
            Envelope envelope = null;

            byte[] jsonBytes;

            if (_jsonBuffer.TryExtractJsonFromBuffer(out jsonBytes))
            {
                var envelopeJson = Encoding.UTF8.GetString(jsonBytes);

                await TraceAsync(envelopeJson, DataOperation.Receive).ConfigureAwait(false);

                try
                {
                    envelope = _envelopeSerializer.Deserialize(envelopeJson);
                }
                catch (Exception ex)
                {
                    if (!_ignoreDeserializationErrors)
                    {
                        throw;
                    }

                    var deserializationErrorHandler = DeserializationErrorHandler;
                    if (deserializationErrorHandler != null)
                    {
                        await deserializationErrorHandler(envelopeJson, ex);
                    }
                }
            }
            return(envelope);
        }
        private async Task ListenAsync(CancellationToken cancellationToken)
        {
            try
            {
                while (!cancellationToken.IsCancellationRequested && WebSocket.State == WebSocketState.Open)
                {
                    try
                    {
                        var buffer = new ArraySegment <byte>(_jsonBuffer.Buffer);
                        while (true)
                        {
                            var receiveResult =
                                await WebSocket.ReceiveAsync(buffer, cancellationToken).ConfigureAwait(false);

                            if (receiveResult.MessageType == WebSocketMessageType.Close)
                            {
                                await HandleCloseMessageAsync(receiveResult);

                                break;
                            }

                            if (receiveResult.MessageType != WebSocketMessageType.Text)
                            {
                                CloseStatus            = WebSocketCloseStatus.InvalidMessageType;
                                CloseStatusDescription = "An unsupported message type was received";
                                throw new InvalidOperationException(CloseStatusDescription);
                            }

                            _jsonBuffer.BufferCurPos += receiveResult.Count;
                            if (receiveResult.EndOfMessage)
                            {
                                break;
                            }
                        }

                        byte[] jsonBytes;
                        if (_jsonBuffer.TryExtractJsonFromBuffer(out jsonBytes))
                        {
                            var envelopeJson = Encoding.UTF8.GetString(jsonBytes);

                            if (_traceWriter != null &&
                                _traceWriter.IsEnabled)
                            {
                                await _traceWriter.TraceAsync(envelopeJson, DataOperation.Receive).ConfigureAwait(false);
                            }
                            var envelope = _envelopeSerializer.Deserialize(envelopeJson);
                            await _receivedEnvelopeBufferBlock.SendAsync(envelope, cancellationToken);
                        }
                    }
                    catch (OperationCanceledException) when(cancellationToken.IsCancellationRequested)
                    {
                        break;
                    }
                }
            }
            finally
            {
                StopListenerTask();
            }
        }
Example #3
0
        public override async Task <Envelope> ReceiveAsync(CancellationToken cancellationToken)
        {
            if (_clientWebSocket.State != WebSocketState.Open)
            {
                throw new InvalidOperationException("The connection was not initialized. Call OpenAsync first.");
            }

            await _receiveSemaphore.WaitAsync(cancellationToken).ConfigureAwait(false);

            try
            {
                var buffer = new ArraySegment <byte>(_jsonBuffer.Buffer);
                while (true)
                {
                    var receiveResult = await _clientWebSocket.ReceiveAsync(buffer, cancellationToken).ConfigureAwait(false);

                    _jsonBuffer.BufferCurPos += receiveResult.Count;
                    if (receiveResult.EndOfMessage)
                    {
                        break;
                    }
                }

                byte[] jsonBytes;
                if (_jsonBuffer.TryExtractJsonFromBuffer(out jsonBytes))
                {
                    var envelopeJson = Encoding.UTF8.GetString(jsonBytes);

                    if (_traceWriter != null &&
                        _traceWriter.IsEnabled)
                    {
                        await _traceWriter.TraceAsync(envelopeJson, DataOperation.Receive).ConfigureAwait(false);
                    }

                    return(_envelopeSerializer.Deserialize(envelopeJson));
                }
            }
            finally
            {
                _receiveSemaphore.Release();
            }

            return(null);
        }