RPCServerSocketTransport.cs 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. using System.Security.Cryptography.X509Certificates;
  2. using InABox.Core;
  3. using WebSocketSharp;
  4. using WebSocketSharp.Server;
  5. namespace InABox.Rpc
  6. {
  7. public class RpcServerSocketTransport : RpcServerTransport<RpcServerSocketConnection>
  8. {
  9. private WebSocketServer? _server;
  10. public static X509Certificate2? Certificate { get; set; }
  11. //public static void InitCertificate(string certificateFile) => Certificate = new X509Certificate2(certificateFile);
  12. public override bool IsSecure() => Certificate != null;
  13. public RpcServerSocketTransport(int port, string? certificatefile = null)
  14. {
  15. if (File.Exists(certificatefile))
  16. {
  17. try
  18. {
  19. var certificate = new X509Certificate2(certificatefile);
  20. if (certificate.NotAfter > DateTime.Now)
  21. Certificate = certificate;
  22. }
  23. catch
  24. {
  25. }
  26. }
  27. _server = new WebSocketServer(port, Certificate != null);
  28. _server.SslConfiguration.ServerCertificate = Certificate;
  29. _server?.AddWebSocketService("/", () => new RpcServerSocketConnection() { Transport = this } );
  30. }
  31. public override void Start()
  32. {
  33. _server?.Start();
  34. }
  35. public override void Send(RpcServerSocketConnection connection, RpcMessage message)
  36. {
  37. connection.Send(message);
  38. }
  39. public override void Stop()
  40. {
  41. _server?.Stop();
  42. }
  43. public void ConnectionOpened(RpcServerSocketConnection connection)
  44. => DoOpen(connection);
  45. public void ConnectionException(RpcServerSocketConnection connection, Exception e)
  46. => DoException(connection, e);
  47. public void ConnectionClosed(RpcServerSocketConnection connection, CloseEventArgs e)
  48. => DoClose(connection, (e.Code == 1000) ? RpcTransportCloseEventType.Closed : RpcTransportCloseEventType.Error);
  49. }
  50. }