RPCServer.cs 3.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  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<IRpcServer, RpcPingCommand, RpcPingParameters, RpcPingResult>(new RpcPingHandler(this));
  23. _transport.AddHandler<IRpcServer, RpcInfoCommand, RpcInfoParameters, RpcInfoResult>(new RpcInfoHandler(this));
  24. _transport.AddHandler<IRpcServer, RpcValidateCommand, RpcValidateParameters, RpcValidateResult>(new RpcValidateHandler(this));
  25. _transport.AddHandler<IRpcServer, RpcCheck2FACommand, RpcCheck2FAParameters, RpcCheck2FAResult>(new RpcCheck2FAHandler(this));
  26. _transport.AddHandler<IRpcServer, RpcQueryCommand, RpcQueryParameters, RpcQueryResult>(new RpcQueryHandler(this));
  27. _transport.AddHandler<IRpcServer, RpcSaveCommand, RpcSaveParameters, RpcSaveResult>(new RpcSaveHandler(this));
  28. _transport.AddHandler<IRpcServer, RpcDeleteCommand, RpcDeleteParameters, RpcDeleteResult>(new RpcDeleteHandler(this));
  29. }
  30. private void Transport_OnOpen(IRpcTransport transport, RpcTransportOpenArgs e)
  31. {
  32. OnLog?.Invoke(LogType.Information, "", $"Client Connected [{e.Session?.ID}]");
  33. }
  34. private void Transport_OnClose(IRpcTransport transport, RpcTransportCloseArgs e)
  35. {
  36. OnLog?.Invoke(LogType.Information, "", $"Client Disconnected({e.Type}) [{e.Session?.ID}]");
  37. }
  38. private void Transport_BeforeMessage(IRpcTransport transport, RpcTransportMessageArgs e)
  39. {
  40. OnLog?.Invoke(LogType.Information, "", $"Request Received [{e.Session?.ID}]: {e.Message?.Command ?? "Unknown"}");
  41. }
  42. private void Transport_AfterMessage(IRpcTransport transport, RpcTransportMessageArgs e)
  43. {
  44. OnLog?.Invoke(LogType.Information, "", $"Sending Response [{e.Session?.ID}]: {e.Message?.Command ?? "Unknown"}");
  45. }
  46. private void Transport_OnException(IRpcTransport transport, RpcTransportExceptionArgs e)
  47. {
  48. OnLog?.Invoke(LogType.Error, $"", $"Exception Occurred in {e.Session?.ID}: {e.Exception.Message}");
  49. }
  50. public void Start()
  51. {
  52. _transport.Start();
  53. }
  54. public void Stop()
  55. {
  56. _transport.Stop();
  57. }
  58. public void Dispose()
  59. {
  60. _transport?.Stop();
  61. }
  62. ~RpcServer()
  63. {
  64. Dispose();
  65. }
  66. }
  67. }