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