Example #1
0
        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);
        }