RPCServer.cs 2.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using System.Reflection;
  2. using H.Pipes.Args;
  3. using InABox.API;
  4. using InABox.Clients;
  5. using InABox.Core;
  6. using InABox.IPC;
  7. namespace InABox.Rpc
  8. {
  9. public class RpcServer<TTransport> : IDisposable, IRpcServer where TTransport : IRpcServerTransport
  10. {
  11. private TTransport _transport;
  12. public event LogEvent? OnLog;
  13. public bool IsSecure() => _transport?.IsSecure() ?? false;
  14. public RpcServer(TTransport transport)
  15. {
  16. _transport = transport;
  17. _transport.OnOpen += Transport_OnOpen;
  18. _transport.OnClose += Transport_OnClose;
  19. _transport.OnException += Transport_OnException;
  20. _transport.BeforeMessage += Transport_BeforeMessage;
  21. _transport.AfterMessage += Transport_AfterMessage;
  22. _transport.AddHandler(new RpcPingHandler(this));
  23. _transport.AddHandler(new RpcInfoHandler(this));
  24. _transport.AddHandler(new RpcValidateHandler(this));
  25. _transport.AddHandler(new RpcCheck2FAHandler(this));
  26. _transport.AddHandler(new RpcQueryHandler(this));
  27. _transport.AddHandler(new RpcSaveHandler(this));
  28. _transport.AddHandler(new RpcDeleteHandler(this));
  29. }
  30. private void Transport_OnOpen(IRpcTransport transport, RpcTransportOpenArgs e)
  31. {
  32. // if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
  33. // OnLog?.Invoke(LogType.Information, "", $"Client Connected [{e.Session?.ID}]");
  34. }
  35. private void Transport_OnClose(IRpcTransport transport, RpcTransportCloseArgs e)
  36. {
  37. // if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
  38. // OnLog?.Invoke(LogType.Information, "", $"Client Disconnected({e.Type}) [{e.Session?.ID}]");
  39. }
  40. private void Transport_BeforeMessage(IRpcTransport transport, RpcTransportMessageArgs e)
  41. {
  42. //OnLog?.Invoke(LogType.Information, "", $"Request Received [{e.Session?.ID}]: {e.Message?.Command ?? "Unknown"}");
  43. }
  44. private void Transport_AfterMessage(IRpcTransport transport, RpcTransportMessageArgs e)
  45. {
  46. //OnLog?.Invoke(LogType.Information, "", $"Sending Response [{e.Session?.ID}]: {e.Message?.Command ?? "Unknown"}");
  47. }
  48. private void Transport_OnException(IRpcTransport transport, RpcTransportExceptionArgs e)
  49. {
  50. if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
  51. OnLog?.Invoke(LogType.Error, $"", $"Exception Occurred in {e.Session?.ID}: {e.Exception.Message}");
  52. }
  53. public void Start()
  54. {
  55. _transport.Start();
  56. }
  57. public void Stop()
  58. {
  59. _transport.Stop();
  60. }
  61. public void Dispose()
  62. {
  63. _transport?.Stop();
  64. }
  65. ~RpcServer()
  66. {
  67. Dispose();
  68. }
  69. }
  70. }