Ejemplo n.º 1
0
        void TestAppRpc()
        {
            var logger = new ConsoleLogger {
                Prefix = "TestAppRpc"
            };

            Dependency.Register <ILogger>(logger);

            var jsonRpc = new MessageBridge();

            jsonRpc.ObjectContext.PublishObject(AppModel);

            jsonRpc.ChangeMessageEvent += (bridge, msg) =>
            {
                Console.WriteLine($"Change msg: {msg.ResourceId}.{msg.PropertyName} ({msg.ListChanges?.Count ?? 1})");
            };

            var launchResult = jsonRpc.ProcessMessageAsync(new Message
            {
                MessageType = MessageType.Call,
                ResourceId  = "api",
                MethodName  = "LaunchAndHook",
                Arguments   = new List <object> {
                    "TestApp.exe"
                }
            }).Result;

            var procResId = ((dynamic)launchResult.Value).ResourceId;

            var readNewCallsResult = jsonRpc.ProcessMessageAsync(new Message
            {
                MessageType = MessageType.Call,
                ResourceId  = procResId,
                MethodName  = "ReadNewCallRecords",
                Arguments   = new List <object>()
            }).Result;
        }
Ejemplo n.º 2
0
        public static string RunTest(MessageBridge bridge, string testName, Message request)
        {
            var result = JsonConvert.DeserializeObject(bridge.ProcessMessageAsync(JsonConvert.SerializeObject(request)).Result);

            return(Assert($"test_{testName}", result));
        }
Ejemplo n.º 3
0
        static async Task WsPublishAsync(IPEndPoint endPoint, MessageBridge bridge, string[] allowedOrigins, ILogger logger = null, CancellationToken ct = default(CancellationToken))
        {
            try
            {
                var clients = new List <WebSocket>();

                bridge.ChangeMessageEvent += (_, changeMsg) =>
                {
                    WebSocket[] clientsCopy;
                    lock (clients)
                        clientsCopy = clients.ToArray();

                    var changeMsgStr = bridge.SerializeMessage(changeMsg);
                    foreach (var c in clientsCopy)
                    {
                        c.WriteStringAsync(changeMsgStr, ct);
                    }
                };

                var webSocket = new WebSocketListener(endPoint);
                webSocket.Standards.RegisterStandard(new WebSocketFactoryRfc6455(webSocket));
                webSocket.Start();

                logger?.Log("Started.");

                while (!ct.IsCancellationRequested)
                {
                    var client = await webSocket.AcceptWebSocketAsync(ct);

                    lock (clients)
                        clients.Add(client);

                    try
                    {
                        var origin = client.HttpRequest.Headers["Origin"];
                        if (!allowedOrigins.Contains(origin))
                        {
                            await client.WriteStringAsync(@"{ ""Error"": ""NotAllowedOrigin"" }", ct);

                            client.Close();
                            continue;
                        }

                        while (client.IsConnected)
                        {
                            var request = await client.ReadStringAsync(ct);

                            if (request == null)
                            {
                                break;
                            }
                            var response = await bridge.ProcessMessageAsync(request);

                            await client.WriteStringAsync(response, ct);
                        }
                    }
                    catch (Exception clientExc)
                    {
                        logger?.LogException(new Exception("WebSocket Client Exception", clientExc));
                    }

                    lock (clients)
                        clients.Remove(client);
                }

                logger?.Log("Stopped.");
            }
            catch (Exception e)
            {
                logger?.LogException(new Exception("WebSocket Client Exception", e));
            }
        }