acceptor.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. use log::*;
  2. use smol::{Async, Executor};
  3. use std::net::{SocketAddr, TcpListener};
  4. use std::sync::Arc;
  5. use crate::net::error::{NetError, NetResult};
  6. use crate::net::{Channel, ChannelPtr, SettingsPtr};
  7. use crate::system::{StoppableTask, StoppableTaskPtr, Subscriber, SubscriberPtr, Subscription};
  8. pub type AcceptorPtr = Arc<Acceptor>;
  9. pub struct Acceptor {
  10. channel_subscriber: SubscriberPtr<NetResult<ChannelPtr>>,
  11. task: StoppableTaskPtr,
  12. settings: SettingsPtr,
  13. }
  14. impl Acceptor {
  15. pub fn new(settings: SettingsPtr) -> Arc<Self> {
  16. Arc::new(Self {
  17. channel_subscriber: Subscriber::new(),
  18. task: StoppableTask::new(),
  19. settings,
  20. })
  21. }
  22. pub fn start(
  23. self: Arc<Self>,
  24. accept_addr: SocketAddr,
  25. executor: Arc<Executor<'_>>,
  26. ) -> NetResult<()> {
  27. let listener = Self::setup(accept_addr)?;
  28. // Start detached task and return instantly
  29. self.accept(listener, executor);
  30. Ok(())
  31. }
  32. pub async fn stop(&self) {
  33. // Send stop signal
  34. self.task.stop().await;
  35. }
  36. pub async fn subscribe(self: Arc<Self>) -> Subscription<NetResult<ChannelPtr>> {
  37. self.channel_subscriber.clone().subscribe().await
  38. }
  39. fn setup(accept_addr: SocketAddr) -> NetResult<Async<TcpListener>> {
  40. let listener = match Async::<TcpListener>::bind(accept_addr) {
  41. Ok(l) => l,
  42. Err(err) => {
  43. error!("Bind listener failed: {}", err);
  44. return Err(NetError::OperationFailed);
  45. }
  46. };
  47. let local_addr = match listener.get_ref().local_addr() {
  48. Ok(a) => a,
  49. Err(err) => {
  50. error!("Failed to get local address: {}", err);
  51. return Err(NetError::OperationFailed);
  52. }
  53. };
  54. info!("Listening on {}", local_addr);
  55. Ok(listener)
  56. }
  57. fn accept(self: Arc<Self>, listener: Async<TcpListener>, executor: Arc<Executor<'_>>) {
  58. self.task.clone().start(
  59. self.clone().run_accept_loop(listener),
  60. |result| self.handle_stop(result),
  61. NetError::ServiceStopped,
  62. executor,
  63. );
  64. }
  65. async fn run_accept_loop(self: Arc<Self>, listener: Async<TcpListener>) -> NetResult<()> {
  66. loop {
  67. let channel = self.tick_accept(&listener).await?;
  68. let channel_result = Arc::new(Ok(channel));
  69. self.channel_subscriber.notify(channel_result).await;
  70. }
  71. }
  72. async fn handle_stop(self: Arc<Self>, result: NetResult<()>) {
  73. match result {
  74. Ok(()) => panic!("Acceptor task should never complete without error status"),
  75. Err(err) => {
  76. // Send this error to all channel subscribers
  77. let result = Arc::new(Err(err));
  78. self.channel_subscriber.notify(result).await;
  79. }
  80. }
  81. }
  82. async fn tick_accept(&self, listener: &Async<TcpListener>) -> NetResult<ChannelPtr> {
  83. let (stream, peer_addr) = match listener.accept().await {
  84. Ok((s, a)) => (s, a),
  85. Err(err) => {
  86. error!("Error listening for connections: {}", err);
  87. return Err(NetError::ServiceStopped);
  88. }
  89. };
  90. info!("Accepted client: {}", peer_addr);
  91. let channel = Channel::new(stream, peer_addr, self.settings.clone());
  92. Ok(channel)
  93. }
  94. }