1mod 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#[derive(thiserror::Error, Debug)]
19pub enum StartServerError {
20 #[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#[derive(Debug, Clone, smart_default::SmartDefault, typed_builder::TypedBuilder)]
30pub struct Config {
31 #[default(DEFAULT_MAX_CONNECTIONS)]
33 #[builder(default = DEFAULT_MAX_CONNECTIONS)]
34 pub max_connections: usize,
35
36 #[default(DEFAULT_UDP_HEARTBEAT_INTERVAL)]
38 #[builder(default = DEFAULT_UDP_HEARTBEAT_INTERVAL)]
39 pub udp_heartbeat_interval: std::time::Duration,
40}
41
42pub 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}