I want to use linq to process events received via a websocket connection. This is what I have so far:
private static void Main()
{
string WsEndpoint = "wss://push.planetside2.com/streaming?environment=ps2&service-id=s:quicktesting";
using (WebSocket ws = new WebSocket(WsEndpoint))
{
ws.OnMessage += Ws_OnMessage;
ws.Connect();
Console.ReadKey();
ws.Close();
}
}
private static void Ws_OnMessage(object sender, MessageEventArgs e)
{
Console.WriteLine(e.Data);
}
The first think that stumps me is how to turn ws.OnMessage
into some sort of event stream. I cannot find any examples online for observing an external event source with reactive extensions. I intend to parse the messages into json objects, then filter and aggregate them.
Could someone provide an example of creating an observable from the websocket messages, and subscribing to it?
Edit: Final Working Code
The only difference from the chosen answer is that I initialized the websocket before passing it into Observable.Using
//-------------------------------------------------------
// Create websocket connection
//-------------------------------------------------------
const string wsEndpoint = "wss://push.planetside2.com/streaming?environment=ps2&service-id=s:quicktesting";
WebSocket socket = new WebSocket(wsEndpoint);
//-------------------------------------------------------
// Create an observable by wrapping ws.OnMessage
//-------------------------------------------------------
var globalEventStream = Observable
.Using(
() => socket,
ws =>
Observable
.FromEventPattern<EventHandler<MessageEventArgs>, MessageEventArgs>(
handler => ws.OnMessage += handler,
handler => ws.OnMessage -= handler));
//---------------------------------------------------------
// Subscribe to globalEventStream
//---------------------------------------------------------
IDisposable subscription = globalEventStream.Subscribe(ep =>
{
Console.WriteLine("Event Recieved");
Console.WriteLine(ep.EventArgs.Data);
});
//----------------------------------------------------------
// Send message over websocket
//----------------------------------------------------------
socket.Connect();
socket.Send("test message");
// When finished, close the connection.
socket.Close();