RPCServer.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  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. _transport.AddHandler(new RpcVersionHandler(this));
  30. _transport.AddHandler(new RpcInstallerHandler(this));
  31. _transport.AddHandler(new RpcReleaseNotesHandler(this));
  32. }
  33. private void Transport_OnOpen(IRpcTransport transport, RpcTransportOpenArgs e)
  34. {
  35. if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
  36. OnLog?.Invoke(LogType.Information, "", $"Client Connected [{e.Session?.ID}]");
  37. }
  38. private void Transport_OnClose(IRpcTransport transport, RpcTransportCloseArgs e)
  39. {
  40. if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
  41. OnLog?.Invoke(LogType.Information, "", $"Client Disconnected({e.Type}) [{e.Session?.ID}]");
  42. }
  43. private void Transport_BeforeMessage(IRpcTransport transport, RpcTransportMessageArgs e)
  44. {
  45. //OnLog?.Invoke(LogType.Information, "", $"Request Received [{e.Session?.ID}]: {e.Message?.Command ?? "Unknown"}");
  46. }
  47. private void Transport_AfterMessage(IRpcTransport transport, RpcTransportMessageArgs e)
  48. {
  49. //OnLog?.Invoke(LogType.Information, "", $"Sending Response [{e.Session?.ID}]: {e.Message?.Command ?? "Unknown"}");
  50. }
  51. private void Transport_OnException(IRpcTransport transport, RpcTransportExceptionArgs e)
  52. {
  53. if ((e.Session?.ID ?? Guid.Empty) != Guid.Empty)
  54. OnLog?.Invoke(LogType.Error, $"", $"Exception Occurred in {e.Session?.ID}: {e.Exception.Message}");
  55. }
  56. public void Start()
  57. {
  58. _transport.Start();
  59. }
  60. public void Stop()
  61. {
  62. _transport.Stop();
  63. }
  64. public void Dispose()
  65. {
  66. _transport?.Stop();
  67. }
  68. ~RpcServer()
  69. {
  70. Dispose();
  71. }
  72. }
  73. }