RPCClientSocketTransport.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. using InABox.Core;
  2. using WebSocketSharp;
  3. using ErrorEventArgs = WebSocketSharp.ErrorEventArgs;
  4. namespace InABox.IPC
  5. {
  6. public class RPCClientSocketTransport : RPCClientTransport
  7. {
  8. private WebSocket _socket;
  9. public RPCClientSocketTransport(string url)
  10. {
  11. _socket = new WebSocket($"ws://{url}");
  12. _socket.OnOpen += Socket_OnOpen;
  13. _socket.OnError += Socket_OnError;
  14. _socket.OnClose += Socket_OnClose;
  15. _socket.OnMessage += Socket_OnMessage;
  16. // Time to wait before disconnect - the default meant that the client disconnected during debugging, since the ping would fail
  17. _socket.WaitTime = TimeSpan.FromMinutes(10);
  18. }
  19. private void Socket_OnOpen(object? sender, EventArgs e)
  20. {
  21. DoOpen();
  22. }
  23. private void Socket_OnMessage(object? sender, MessageEventArgs e)
  24. {
  25. RPCMessage? message = null;
  26. if ((e.IsBinary) && (e.RawData != null))
  27. message = Serialization.ReadBinary<RPCMessage>(e.RawData, BinarySerializationSettings.Latest);
  28. else if ((e.IsText) && !String.IsNullOrWhiteSpace(e.Data))
  29. message = Serialization.Deserialize<RPCMessage>(e.Data);
  30. Accept(message);
  31. }
  32. private void Socket_OnClose(object? sender, CloseEventArgs e)
  33. {
  34. DoClose(RPCTransportCloseEventType.Closed);
  35. }
  36. private void Socket_OnError(object? sender, ErrorEventArgs e)
  37. {
  38. DoException(e.Exception);
  39. }
  40. public override void Connect()
  41. {
  42. _socket.Connect();
  43. }
  44. public override void Disconnect()
  45. {
  46. _socket.Close();
  47. }
  48. public override void Send(RPCMessage message)
  49. {
  50. var buffer = Serialization.WriteBinary(message, BinarySerializationSettings.Latest);
  51. _socket.Send(buffer);
  52. }
  53. }
  54. }