minetest_protocol/services/
server.rs1use std::net::SocketAddr;
8use std::time::Duration;
9use tokio::sync::mpsc::unbounded_channel;
10use tokio::sync::mpsc::UnboundedReceiver;
11use tokio::sync::mpsc::UnboundedSender;
12
13use super::conn::MinetestConnection;
14use super::socket::MinetestSocket;
15
16pub struct MinetestServer {
17 accept_rx: UnboundedReceiver<MinetestConnection>,
18}
19
20impl MinetestServer {
21 pub fn new(bind_addr: SocketAddr) -> Self {
22 let (accept_tx, accept_rx) = unbounded_channel();
23 let runner = MinetestServerRunner {
24 bind_addr: bind_addr,
25 accept_tx: accept_tx,
26 };
27 tokio::spawn(async move {
28 runner.run().await;
29 });
30 Self {
31 accept_rx: accept_rx,
32 }
33 }
34
35 pub async fn accept(&mut self) -> MinetestConnection {
36 self.accept_rx.recv().await.unwrap()
37 }
38}
39
40struct MinetestServerRunner {
41 bind_addr: SocketAddr,
42 accept_tx: UnboundedSender<MinetestConnection>,
43}
44
45impl MinetestServerRunner {
46 async fn run(self) {
47 println!("MinetestServer starting on {}", self.bind_addr.to_string());
48 let mut socket = loop {
49 match MinetestSocket::new(self.bind_addr, true).await {
50 Ok(socket) => break socket,
51 Err(err) => {
52 println!("MinetestServer: bind failed: {}", err);
53 println!("Retrying in 5 seconds");
54 tokio::time::sleep(Duration::from_millis(5000)).await;
55 }
56 };
57 };
58 println!("MinetestServer started");
59 loop {
60 let t = socket.accept().await.unwrap();
61 println!("MinetestServer accepted connection");
62 let conn = MinetestConnection::new(t);
63 match self.accept_tx.send(conn) {
64 Ok(_) => (),
65 Err(_) => println!("Unexpected send fail in MinetestServer"),
66 }
67 }
68 }
69}