net_stream/
server.rs

1//! Server.
2
3mod actor;
4mod actor_handle;
5pub mod event;
6mod peer_uid;
7
8use self::event::Event;
9use crate::message_types::MessageTypes;
10pub use actor_handle::ActorHandle;
11use futures::channel::mpsc;
12pub use peer_uid::PeerUid;
13use std::net::SocketAddr;
14use tokio::net::TcpListener;
15use tokio::net::UdpSocket;
16
17/// Error starting server.
18#[derive(thiserror::Error, Debug)]
19pub enum StartServerError {
20    /// IO error
21    #[error("IO Error")]
22    Io(#[from] ::std::io::Error),
23}
24
25const DEFAULT_MAX_CONNECTIONS: usize = 2;
26const DEFAULT_UDP_HEARTBEAT_INTERVAL: std::time::Duration = std::time::Duration::from_secs(5);
27
28/// Server configuration
29#[derive(Debug, Clone, smart_default::SmartDefault, typed_builder::TypedBuilder)]
30pub struct Config {
31    /// Limit number of concurrently connected clients.
32    #[default(DEFAULT_MAX_CONNECTIONS)]
33    #[builder(default = DEFAULT_MAX_CONNECTIONS)]
34    pub max_connections: usize,
35
36    /// Interval between each UDP heartbeat message being emitted to connected peers.
37    #[default(DEFAULT_UDP_HEARTBEAT_INTERVAL)]
38    #[builder(default = DEFAULT_UDP_HEARTBEAT_INTERVAL)]
39    pub udp_heartbeat_interval: std::time::Duration,
40}
41
42/// Start server.
43///
44/// This returns a handle to the server actor task and an event stream.
45/// The [ActorHandle] is used to command the server.
46/// The event stream receiver is used to listen to server events.
47///
48/// The actor handles can be freely cloned. When the last handle to the server actor is
49/// dropped, or the receiver is closed or dropped, the server task will begin graceful
50/// shut down.
51pub async fn start<M: MessageTypes>(
52    tcp_socket_addr: SocketAddr,
53    udp_socket_addr: SocketAddr,
54    config: Config,
55) -> Result<(ActorHandle<M>, mpsc::UnboundedReceiver<Event<M>>), StartServerError> {
56    let tcp_listener = TcpListener::bind(tcp_socket_addr).await?;
57    let udp_socket = UdpSocket::bind(udp_socket_addr).await?;
58
59    let (actor_msg_sender, actor_msg_receiver) = mpsc::unbounded::<actor::Message<M>>();
60    let (event_sender, event_receiver) = mpsc::unbounded::<Event<M>>();
61
62    let join_handle = tokio::spawn(actor::actor(actor_msg_receiver, tcp_listener, udp_socket, event_sender, config));
63    let actor_handle = ActorHandle::new(join_handle, actor_msg_sender);
64
65    Ok((actor_handle, event_receiver))
66}