acceptor.rs 3.4 KB

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