]> git.lizzy.rs Git - connect-rs.git/blob - src/tcp/server.rs
09c51d1f03f9739787dff8c3a676a375e9a4891a
[connect-rs.git] / src / tcp / server.rs
1 use crate::Connection;
2 use async_std::net::{SocketAddr, TcpListener, ToSocketAddrs};
3 use async_std::pin::Pin;
4 use async_std::task;
5 use futures::task::{Context, Poll};
6 use futures::{Stream, StreamExt};
7 use log::*;
8
9 #[allow(dead_code)]
10 pub struct TcpServer {
11     local_addrs: SocketAddr,
12     listener: TcpListener,
13 }
14
15 impl TcpServer {
16     pub fn new<A: ToSocketAddrs + std::fmt::Display>(ip_addrs: A) -> anyhow::Result<Self> {
17         let listener = task::block_on(TcpListener::bind(&ip_addrs))?;
18         info!("Started TCP server at {}", &ip_addrs);
19
20         Ok(Self {
21             local_addrs: listener.local_addr()?,
22             listener,
23         })
24     }
25 }
26
27 impl Stream for TcpServer {
28     type Item = Connection;
29
30     fn poll_next(self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll<Option<Self::Item>> {
31         if let Some(Ok(conn)) = futures::executor::block_on(self.listener.incoming().next()) {
32             debug!(
33                 "Received connection attempt from {}",
34                 conn.peer_addr()
35                     .expect("Peer address could not be retrieved")
36             );
37             Poll::Ready(Some(Connection::from(conn)))
38         } else {
39             info!("Shutting TCP server down at {}", self.local_addrs);
40             Poll::Ready(None)
41         }
42     }
43 }