using System; using ln.http.resources.websocket; using ln.http.resources; using ln.logging; using System.Collections.Generic; using ln.http.websocket; using System.Linq; using ln.types.rpc; using ln.json; using ln.json.mapping; 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(JSONObject 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 { JSONObject json = (JSONObject)JSONParser.Parse(textMessage); RPCCall rpcCall = json.ToObject(); RPCResult rpcResult = SkyScannerService.RPCContainer.Invoke(rpcCall); requestContext.WebSocket.Send( JSONObject.From(rpcResult).ToString() ); } catch (Exception e) { Logging.Log(e); } } } }