Exemple #1
0
        private async Task <WebSocketMessageEnvelope> SendAsync(WebSocketMessageEnvelope message)
        {
            if (!IsConnected)
            {
                throw new InvalidOperationException("Socket is not connected.");
            }

            Send(message.ToJson());
            if (string.IsNullOrEmpty(message.Cid))
            {
                // No response required.
                return(null);
            }

            var completer = new TaskCompletionSource <WebSocketMessageEnvelope>();

            _messageReplies[message.Cid] = completer;
            var resultTask = completer.Task;

            var timeoutTask = Task.Delay(_options.ConnectTimeout);

            if (await Task.WhenAny(resultTask, timeoutTask).ConfigureAwait(false) == timeoutTask)
            {
                throw new TimeoutException($"Socket send timed out after {_options.ConnectTimeout.ToString()} time.");
            }

            return(await resultTask.ConfigureAwait(false));
        }
Exemple #2
0
        private async Task <WebSocketMessageEnvelope> SendAsync(WebSocketMessageEnvelope message)
        {
            if (_listener == null || !_listener.IsConnected)
            {
                throw new InvalidOperationException("Socket is not connected.");
            }

            _sendBuffer.Enqueue(message.ToJson());
            if (string.IsNullOrEmpty(message.Cid))
            {
                // No response required.
                return(null);
            }

            var completer = new TaskCompletionSource <WebSocketMessageEnvelope>();

            _messageReplies[message.Cid] = completer;
            var resultTask = completer.Task;

            var timeoutTask = Task.Delay(TimeSpan.FromMilliseconds(TimeoutMs));

            if (await Task.WhenAny(resultTask, timeoutTask).ConfigureAwait(false) == timeoutTask)
            {
                throw new TimeoutException($"Socket send timed out after '{TimeoutMs}' milliseconds.");
            }

            return(await resultTask.ConfigureAwait(false));
        }
Exemple #3
0
        private Task <WebSocketMessageEnvelope> SendAsync(WebSocketMessageEnvelope envelope)
        {
            var json   = envelope.ToJson();
            var buffer = System.Text.Encoding.UTF8.GetBytes(json);

            if (string.IsNullOrEmpty(envelope.Cid))
            {
                _adapter.Send(new ArraySegment <byte>(buffer), CancellationToken.None);
                return(null); // No response required.
            }

            var completer = new TaskCompletionSource <WebSocketMessageEnvelope>();

            _responses[envelope.Cid] = completer;
            _adapter.Send(new ArraySegment <byte>(buffer), CancellationToken.None);
            return(completer.Task);
        }
Exemple #4
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);
        }