RPCClientPipeTransport.cs 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. using System;
  2. using System.Threading;
  3. using InABox.Formatters;
  4. using H.Pipes;
  5. using InABox.Core;
  6. namespace InABox.Rpc
  7. {
  8. public class RpcClientPipeTransport : RpcClientTransport, IDisposable
  9. {
  10. private PipeClient<RpcMessage> _pipe;
  11. private string _name;
  12. public RpcClientPipeTransport(string name)
  13. {
  14. _name = name;
  15. _pipe = new PipeClient<RpcMessage>(_name, new CoreFormatter<RpcMessage>());
  16. _pipe.Connected += PipeConnected;
  17. _pipe.Disconnected += PipeDisconnected;
  18. _pipe.MessageReceived += PipeMessageReceived;
  19. _pipe.ExceptionOccurred += PipeExceptionOccurred;
  20. }
  21. public override bool Connect(CancellationToken ct = default)
  22. {
  23. _pipe.ConnectAsync(ct).Wait(10000, ct);
  24. return _pipe.IsConnected;
  25. }
  26. public override bool IsConnected() => _pipe?.IsConnected == true;
  27. public override bool IsSecure() => false;
  28. public override string? ServerName() => _name;
  29. public override void Disconnect()
  30. {
  31. _pipe.DisconnectAsync();
  32. }
  33. public override void Send(RpcMessage message)
  34. {
  35. _pipe.WriteAsync(message).ContinueWith(task =>
  36. {
  37. if(task.Exception != null)
  38. {
  39. PipeExceptionOccurred(this, new H.Pipes.Args.ExceptionEventArgs(task.Exception));
  40. Fail(message, task.Exception);
  41. }
  42. });
  43. }
  44. private void PipeConnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage> e)
  45. {
  46. DoOpen();
  47. }
  48. private void PipeDisconnected(object? sender, H.Pipes.Args.ConnectionEventArgs<RpcMessage> e)
  49. {
  50. DoClose(RpcTransportCloseEventType.Closed);
  51. }
  52. private void PipeExceptionOccurred(object? sender, H.Pipes.Args.ExceptionEventArgs e)
  53. {
  54. Logger.Send(LogType.Error, "", $"Exception occured: {e.Exception.Message}");
  55. }
  56. private void PipeMessageReceived(object? sender, H.Pipes.Args.ConnectionMessageEventArgs<RpcMessage?> e)
  57. {
  58. Accept(e.Message);
  59. }
  60. public void Dispose()
  61. {
  62. _pipe.DisposeAsync().AsTask().Wait();
  63. }
  64. ~RpcClientPipeTransport()
  65. {
  66. Dispose();
  67. }
  68. protected override RpcClientTransport Clone() => new RpcClientPipeTransport(_name);
  69. }
  70. }