using System; using ln.http.resources.websocket; using ln.http.resources; using Newtonsoft.Json.Linq; using ln.logging; using System.Collections.Generic; using ln.http.websocket; using System.Linq; using ln.types.rpc; using Newtonsoft.Json; namespace ln.skyscanner.http { public class WebSocketInterface : WebsocketResource { SkyScanner.Service SkyScannerService { get; } public WebSocket[] CurrentWebSockets { get { lock (currentWebSockets) { return currentWebSockets.ToArray(); } } } HashSet currentWebSockets = new HashSet(); public WebSocketInterface(Resource container,SkyScanner.Service skyscannerService) :base(container,"socket") { SkyScannerService = skyscannerService; Connection += WebSocketInterface_Connection; } void WebSocketInterface_Connection(WebsocketResource webSocketResource, ln.http.websocket.WebSocket webSocket, WSREvent ev) { lock (currentWebSockets) { switch (ev) { case WSREvent.CONNECT: currentWebSockets.Add(webSocket); break; case WSREvent.CLOSE: currentWebSockets.Remove(webSocket); break; } } } public void Broadcast(JObject json) { Broadcast(json.ToString()); } public void Broadcast(String text) { foreach (WebSocket webSocket in CurrentWebSockets) { webSocket.Send(text); } } public override void MessageReceived(WebSocketResourceRequestContext requestContext, string textMessage) { try { JObject json = JObject.Parse(textMessage); RPCCall rpcCall = new RPCCall(json); RPCResult rpcResult = SkyScannerService.RPCContainer.Invoke(rpcCall); requestContext.WebSocket.Send( rpcResult.ToJSON().ToString() ); } catch (Exception e) { Logging.Log(e); } } } }