private void onTickerUpdateReceived(RealtimeMessage message) { if (message is RealtimeMatch) { CurrentPrice = message.Price; TickerMessage priceData = new TickerMessage(message.Price); NotifyListener(priceData); } }
public RealtimeMessage ParseMessage(byte[] message) { var jsonResponse = Encoding.UTF8.GetString(message, 0, message.Length); var jToken = JToken.Parse(jsonResponse); var type = jToken["type"]?.Value <string>(); RealtimeMessage realtimeMessage = null; switch (type) { case "received": realtimeMessage = JsonConvert.DeserializeObject <RealtimeReceived>(jsonResponse); break; case "open": realtimeMessage = JsonConvert.DeserializeObject <RealtimeOpen>(jsonResponse); break; case "done": realtimeMessage = JsonConvert.DeserializeObject <RealtimeDone>(jsonResponse); break; case "match": realtimeMessage = JsonConvert.DeserializeObject <RealtimeMatch>(jsonResponse); break; case "change": realtimeMessage = JsonConvert.DeserializeObject <RealtimeChange>(jsonResponse); break; case "error": var error = JsonConvert.DeserializeObject <RealtimeError>(jsonResponse); throw new Exception(error.message); default: break; } return(realtimeMessage); }
public static Task <HttpWebResponse> SendRealtimeMessage(CloudFunctionContext context, string receiverId, RealtimeMessage realtimeMessage) { if (ablyBasicAuthString == null) { ablyBasicAuthString = Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(context.AblyServerKey)); } return(HttpUtil.SendJsonPost( $"https://rest.ably.io/channels/{receiverId}/messages", JsonUtil.Serialize(new Dictionary <string, object> { { "data", realtimeMessage } }), ablyBasicAuthString)); }
private async void Subscribe(string product, Action <RealtimeMessage> onMessageReceived) { //Logger.WriteLog("Subscribe method thread ID: " + Thread.CurrentThread.ManagedThreadId.ToString()); if (String.IsNullOrWhiteSpace(product)) { throw new ArgumentNullException("product"); } if (onMessageReceived == null) { throw new ArgumentNullException("onMessageReceived", "Message received callback must not be null."); } JArray aj = new JArray(); tempProduct = product; tempOnMessageReceived = onMessageReceived; var uri = new Uri("wss://ws-feed.gdax.com"); webSocketClient = new ClientWebSocket(); var cancellationToken = new CancellationToken(); //jStr.Append() var requestString = string.Format(""); JObject jObj = new JObject(); jObj.Add(new JProperty("type", "subscribe")); jObj.Add(new JProperty("product_ids", new JArray(product))); jObj.Add(new JProperty("channels", new JArray("matches"))); //Console.WriteLine(jObj.ToString()); try { var requestBytes = UTF8Encoding.UTF8.GetBytes(jObj.ToString()); await webSocketClient.ConnectAsync(uri, cancellationToken); if (webSocketClient.State == WebSocketState.Open) { Logger.WriteLog("Websocket connected"); var subscribeRequest = new ArraySegment <byte>(requestBytes); var sendCancellationToken = new CancellationToken(); await webSocketClient.SendAsync(subscribeRequest, WebSocketMessageType.Text, true, sendCancellationToken); if (!tickerConnectedNotified) { tickerConnectedNotified = true; //TickerConnectedEvent?.Invoke(null, EventArgs.Empty); await Task.Run(() => { TickerConnectedEvent?.Invoke(null, EventArgs.Empty); }); } TickerClientConnected = true; tickerDisconnectNotified = false; while (webSocketClient.State == WebSocketState.Open) { var receiveCancellationToken = new CancellationToken(); var receiveBuffer = new ArraySegment <byte>(new byte[1024 * 1024 * 1]); // 5MB buffer 1024 * 1024 * 5 var webSocketReceiveResult = await webSocketClient.ReceiveAsync(receiveBuffer, receiveCancellationToken); if (webSocketReceiveResult.Count == 0) { continue; } var jsonResponse = Encoding.UTF8.GetString(receiveBuffer.Array, 0, webSocketReceiveResult.Count); //var jToken = JToken.Parse(jsonResponse); JObject jToken = null; try { jToken = JObject.Parse(jsonResponse); } catch (Exception) { Logger.WriteLog("Json parse error occured in websocket data"); continue; } var typeToken = jToken["type"]; if (typeToken == null) { continue; } var type = typeToken.Value <string>(); RealtimeMessage realtimeMessage = null; //Console.WriteLine("MSG TYPE: {0}", type); //look for only match messages if (type == "match") { realtimeMessage = new RealtimeMatch(jToken); //Logger.WriteLog("Ticker thread ID: " + Thread.CurrentThread.ManagedThreadId.ToString()); } if (realtimeMessage == null) { continue; } onMessageReceived(realtimeMessage); } } } catch (Exception ex) { Logger.WriteLog("Error in ticker websocket: " + ex.Message); TickerClientConnected = false; tickerConnectedNotified = false; if (!tickerDisconnectNotified) { tickerDisconnectNotified = true; //TickerDisconnectedEvent?.Invoke(null,EventArgs.Empty); //notify ticker connected on a new thread await Task.Run(() => { TickerDisconnectedEvent?.Invoke(null, EventArgs.Empty); }); } } Reconnect(product, onMessageReceived); }