public override int Read(byte[] buffer, int offset, int count) { // TODO: Cancellation // Block WebSocketReceiveTuple result = receiveAsync(new ArraySegment <byte>(buffer, offset, count), CancellationToken.None).Result; // Check for close if (result.Item1 == closeCode) { // End of incoming data, expect future reads to fail. return(0); } return(result.Item3.Value); // read }
private void ContinueReceiving(WebSocketReceiveTuple receiveData) { try { while (!_cts.Token.IsCancellationRequested) { if (receiveData != null) { goto process; } var receiveTask = _receiveAsync(_buffer, _cts.Token); if (!receiveTask.IsCompleted) { receiveTask .Then((Action <WebSocketReceiveTuple>)ContinueReceiving) .Catch(ErrorReceiving); return; } receiveData = receiveTask.Result; process: var messageType = (WebSocketMessageType)receiveData.Item1; bool endOfMessage = receiveData.Item2; int? count = receiveData.Item3; receiveData = null; if (messageType == WebSocketMessageType.Text) { if (count.HasValue) { var text = Encoding.UTF8.GetString(_buffer.Array, 0, count.Value); if (_text != null) { _text += text; } else { _text = text; } } if (endOfMessage) { var text = _text; _text = null; if (OnMessage != null) { OnMessage(text); } } continue; } if (messageType == WebSocketMessageType.Close) { if (OnClose != null) { OnClose(); } return; } throw new InvalidOperationException("Unexpected websocket message type"); } } catch (Exception ex) { ErrorReceiving(ex); } }