minetest_protocol/services/
server.rs

1//!
2//! For now, the MinetestServer is just a wrapper around a MinetestSocket,
3//! and a MinetestConnection is just a wrapper around a SocketPeer.
4//!
5//! In the future it may provide its own abstraction above the Minetest Commands.
6
7use 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}