ln.skyscanner/http/WebSocketInterface.cs

87 lines
2.4 KiB
C#

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<WebSocket> currentWebSockets = new HashSet<WebSocket>();
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<RPCCall>();
RPCResult rpcResult = SkyScannerService.RPCContainer.Invoke(rpcCall);
requestContext.WebSocket.Send(
JSONObject.From(rpcResult).ToString()
);
}
catch (Exception e)
{
Logging.Log(e);
}
}
}
}