private async Task <WebSocketMessageEnvelope> SendAsync(WebSocketMessageEnvelope envelope) { var json = envelope.ToJson(); Logger?.DebugFormat("Sending JSON over web socket: {0}", json); var buffer = System.Text.Encoding.UTF8.GetBytes(json); var cts = new CancellationTokenSource(_sendTimeoutSec); if (string.IsNullOrEmpty(envelope.Cid)) { await _adapter.SendAsync(new ArraySegment <byte>(buffer), true, cts.Token); return(null); // No response required. } var completer = new TaskCompletionSource <WebSocketMessageEnvelope>(); lock (_responsesLock) { _responses[envelope.Cid] = completer; } cts.Token.Register(() => { lock (_responsesLock) { if (_responses.ContainsKey(envelope.Cid)) { _responses.Remove(envelope.Cid); } } completer.TrySetCanceled(); }); await _adapter.SendAsync(new ArraySegment <byte>(buffer), true, cts.Token); return(await completer.Task); }