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); }
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); } } }