private void Messenger_MessageReceived(object sender, WebsocketReceiveEventArgs e) { try { // TODO: type is response, not command var response = Responseo.Parse(e.Message); if (response.Sequence == 0) { // TODO: message type Broadcast?.Invoke(this, EventArgs.Empty); } else { if (commandCompletionSources.TryRemove(response.Sequence, out var tcs)) { // TODO: outcome tcs.TrySetResult(response); } else { // TODO: desync? throw? } } } catch (FormatException) { MessageError?.Invoke(this, EventArgs.Empty); } }
async Task ReceiveLoop() { while (!tokenSource.IsCancellationRequested) { var nextMessage = await socket.ReceiveAsync(new ArraySegment <byte>(receiveBuffer), tokenSource.Token); var messageEventArgs = new WebsocketReceiveEventArgs(encoding.GetString(receiveBuffer, 0, nextMessage.Count)); messageEventSource.SendOrBuffer(this, messageEventArgs); if (nextMessage.CloseStatus.HasValue) { tokenSource.Cancel(); } } }