Esempio n. 1
0
        public async Task Send(object message)
        {
            try
            {
                string message_string = JsonConvert.SerializeObject(message);
                string topicID        = "";


                if (message.GetType() == typeof(QuantApp.Kernel.RTDMessage) && ((QuantApp.Kernel.RTDMessage)message).Type == QuantApp.Kernel.RTDMessage.MessageType.CRUD)
                {
                    QuantApp.Kernel.RTDMessage.CRUDMessage content = (QuantApp.Kernel.RTDMessage.CRUDMessage)((QuantApp.Kernel.RTDMessage)message).Content;
                    topicID = content.TopicID;
                }
                else if (message.GetType() == typeof(QuantApp.Kernel.RTDMessage) && ((QuantApp.Kernel.RTDMessage)message).Type == QuantApp.Kernel.RTDMessage.MessageType.UpdateQueue)
                {
                    topicID = ((QuantApp.Kernel.RTDMessage)message).Content.ToString();
                }

                if (manager != null && subscriptions.ContainsKey(topicID))
                {
                    foreach (WebSocket connection in subscriptions[topicID].Values)
                    {
                        string ckey = manager.GetId(connection);
                        InternalSend(connection, topicID, message_string, ckey);
                    }
                }
                else if (_socket != null)
                {
                    InternalSend(_socket, topicID, message_string, null);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }
Esempio n. 2
0
        public static void appServer_NewMessageReceived(WebSocket session, string message_string, string path, List <KeyValuePair <string, string> > headers)
        {
            try
            {
                string skey = manager == null ? null : manager.GetId(session);
                if (!string.IsNullOrWhiteSpace(message_string))
                {
                    DateTime t1 = DateTime.Now;

                    QuantApp.Kernel.RTDMessage message = null;

                    if (path.StartsWith("/lab/"))
                    {
                        var sessionID = session.GetHashCode() + path;
                        if (RTDSocketMiddleware._proxies.ContainsKey(sessionID))
                        {
                            var _client = RTDSocketMiddleware._proxies[sessionID];
                            _client.Send(message_string);
                        }
                        else
                        {
                            Console.WriteLine("Socket Not Found(" + path + "): " + message_string);
                        }
                    }

                    else
                    {
                        try
                        {
                            message = JsonConvert.DeserializeObject <QuantApp.Kernel.RTDMessage>(message_string);
                        }
                        catch {}

                        if (message != null)
                        {
                            if (message.Type == QuantApp.Kernel.RTDMessage.MessageType.Subscribe)
                            {
                                try
                                {
                                    string contract = message.Content.ToString();

                                    if (contract.StartsWith("$"))
                                    {
                                        contract = contract.Substring(1, contract.Length - 1);
                                        if (!traders.ContainsKey(contract))
                                        {
                                            traders.TryAdd(contract, skey);
                                            Send(session, message_string);
                                        }
                                    }



                                    if (!subscriptions.ContainsKey(contract))
                                    {
                                        subscriptions.TryAdd(contract, new ConcurrentDictionary <string, WebSocket>());
                                    }

                                    if (!subscriptions[contract].ContainsKey(skey))
                                    {
                                        subscriptions[contract].TryAdd(skey, session);
                                    }

                                    if (!users.ContainsKey(contract))
                                    {
                                        users.TryAdd(contract, new ConcurrentDictionary <string, QuantApp.Kernel.UserData>());
                                    }

                                    if (!users[contract].ContainsKey(skey))
                                    {
                                        users[contract].TryAdd(skey, QuantApp.Kernel.User.ContextUser);
                                    }

                                    // Console.WriteLine("Subscribed: " + skey + " -- " + contract);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine("Subsribe Exception: " + e + " " + skey);
                                }
                            }

                            else if (message.Type == QuantApp.Kernel.RTDMessage.MessageType.SaveM)
                            {
                                try
                                {
                                    string mid = message.Content.ToString();

                                    M m = M.Base(mid);
                                    m.Save();
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine("SaveM Exception: " + e + " " + skey);
                                }
                            }
                            else if (message.Type == QuantApp.Kernel.RTDMessage.MessageType.PING)
                            {
                                try
                                {
                                    DateTime stamp = (DateTime)message.Content;

                                    var response = JsonConvert.SerializeObject(new QuantApp.Kernel.RTDMessage()
                                    {
                                        Type = QuantApp.Kernel.RTDMessage.MessageType.PING, Content = DateTime.Now
                                    });
                                    Send(session, response);
                                }
                                catch (Exception e)
                                {
                                    Console.WriteLine("MarketData Exception: " + e + " " + skey);
                                }
                            }
                            else if (message.Type == QuantApp.Kernel.RTDMessage.MessageType.UpdateQueue)
                            {
                                QuantApp.Kernel.QueueMessage qm = JsonConvert.DeserializeObject <QuantApp.Kernel.QueueMessage>(message.Content.ToString());

                                QuantApp.Kernel.RTDEngine.UpdateQueue(qm);

                                Share(session, qm.TopicID, message_string);
                            }
                            else if (message.Type == QuantApp.Kernel.RTDMessage.MessageType.CRUD)
                            {
                                QuantApp.Kernel.RTDMessage.CRUDMessage qm = JsonConvert.DeserializeObject <QuantApp.Kernel.RTDMessage.CRUDMessage>(message.Content.ToString());

                                try
                                {
                                    var type = Type.GetType(qm.ValueType);
                                    if (type == null)
                                    {
                                        Assembly assembly = QuantApp.Kernel.M._systemAssemblies.ContainsKey(qm.ValueType) ? QuantApp.Kernel.M._systemAssemblies[qm.ValueType] : (QuantApp.Kernel.M._compiledAssemblies.ContainsKey(qm.ValueType) ? QuantApp.Kernel.M._compiledAssemblies[qm.ValueType] : System.Reflection.Assembly.Load(qm.ValueAssembly));
                                        type = assembly.GetType(QuantApp.Kernel.M._systemAssemblyNames.ContainsKey(qm.ValueType) ? QuantApp.Kernel.M._systemAssemblyNames[qm.ValueType] : (QuantApp.Kernel.M._compiledAssemblyNames.ContainsKey(qm.ValueType) ? QuantApp.Kernel.M._compiledAssemblyNames[qm.ValueType] : qm.ValueType));
                                    }

                                    string filtered_string = qm.Value.ToString().Replace((char)27, '"').Replace((char)26, '\'');
                                    if (filtered_string.StartsWith("\"") && filtered_string.EndsWith("\""))
                                    {
                                        filtered_string = filtered_string.Substring(1, filtered_string.Length - 2).Replace("\\\"", "\"");
                                    }

                                    if (type == typeof(string) || qm.ValueType == null || type == typeof(Nullable))
                                    {
                                        qm.Value = filtered_string;
                                    }

                                    else if (type != null)
                                    {
                                        qm.Value = JsonConvert.DeserializeObject(filtered_string, type);
                                    }
                                }
                                catch {}

                                if (qm.Class == QuantApp.Kernel.M.CRUDClass)
                                {
                                    QuantApp.Kernel.M.Base(qm.TopicID).Process(qm);
                                }

                                Share(session, qm.TopicID, message_string);
                            }

                            else if (message.Type == QuantApp.Kernel.RTDMessage.MessageType.ProxyOpen)
                            {
                                var pd     = JsonConvert.DeserializeObject <HttpProxyRequest>(message.Content.ToString());
                                var client = ProxyConnection.Client(session, pd.Url);
                                client.Connect(pd.Content, pd.Headers);
                            }
                            else if (message.Type == QuantApp.Kernel.RTDMessage.MessageType.ProxyContent)
                            {
                                var pd = JsonConvert.DeserializeObject <HttpProxyRequest>(message.Content.ToString());

                                var sessionId = session.GetHashCode() + pd.Url;
                                if (RTDSocketMiddleware._proxies.ContainsKey(sessionId))
                                {
                                    var client = RTDSocketMiddleware._proxies[sessionId];
                                    client.Send(pd.Content);
                                }
                                else
                                {
                                    var client = ProxyConnection.Client(session, pd.Url);
                                    client.Send(pd.Content);
                                }
                            }

                            else if (RTDMessageFunction != null)
                            {
                                var mess = RTDMessageFunction(message_string);
                                if (mess != null)
                                {
                                    Share(session, mess.Item1, mess.Item2);
                                }
                            }
                        }

                        else
                        {
                            Console.WriteLine("UNKNOWN(" + path + "): " + message_string);
                        }
                    }

                    counter++;
                }
                else
                {
                    Console.WriteLine("--------------EMPTY STRING: " + path);
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Server Receive Message Exception: " + e);
            }
        }