Ejemplo n.º 1
0
        public int SubscribeWs(JObject jsonMap, IWebSocketMessageObserver observer)
        {
            // Send normal request
            var response = Request(jsonMap);

            // Get response for this request and extract subscription ID
            int subscriptionId = response["result"].ToObject <int>();

            JObject pendingResponse = null;

            lock (_subscriptionLock)
            {
                // Check if there is a pending response for this sibscription ID
                // The subscription handler may only be set at this point if update arrived before
                // we knew the subscription ID. In this case, a pending response is present in the response queue.
                // Handle it immediately.
                _pendingSubscriptionUpdates.TryRemove(subscriptionId, out pendingResponse);

                // Register observer for this subscription ID
                _subscriptions.TryAdd(subscriptionId, observer);
            }

            if (pendingResponse != null)
            {
                observer.HandleWsMessage(subscriptionId, pendingResponse);
            }

            _logger.Info($"Subscribed with subscription ID: {subscriptionId}");

            return(subscriptionId);
        }
Ejemplo n.º 2
0
        public void HandleMessage(string payload)
        {
            dynamic json = JsonConvert.DeserializeObject(payload);

            _logger.Info($"Message received: {payload}");
            long requestId      = 0;
            int  subscriptionId = 0;

            if (json["id"] != null)
            {
                requestId = json["id"].Value;
            }
            if (json["params"] != null)
            {
                subscriptionId = (int)json["params"]["subscription"].Value;
            }

            // message is simple request
            if (requestId != 0)
            {
                // cut off protocol body
                BufferBlock <JObject> resp;
                _responses.TryGetValue((int)requestId, out resp);
                JObject result = null;
                try
                {
                    result = JObject.FromObject(new { result = json["result"].ToString() });
                }
                catch (Exception)
                {
                    _logger.Error($"error while processing response: requestId - {requestId};   {json.ToString()}");
                }

                resp?.SendAsync(result);
            }
            else

            // message is subscription request
            if (subscriptionId != 0)
            {
                // Subscription response arrived.
                var result = json["params"] as JObject;

                IWebSocketMessageObserver existingObserver = null;

                lock (_subscriptionLock)
                {
                    if (!_subscriptions.TryGetValue(subscriptionId, out existingObserver))
                    {
                        // We may get here if subscription update arrives before we know subscription ID
                        // In this case, observer is not found here, pend this response for this subscription ID

                        _pendingSubscriptionUpdates.TryAdd(subscriptionId, result);
                    }
                }

                if (existingObserver != null)
                {
                    existingObserver.HandleWsMessage(subscriptionId, result);
                }
            }
        }