Skip to main content

turn_server/server/
mod.rs

1pub mod provider;
2
3mod exchanger;
4mod memory_pool;
5
6use anyhow::Result;
7use tokio::task::JoinSet;
8
9use self::exchanger::Exchanger;
10use crate::{
11    Service,
12    config::{Config, Interface},
13    server::provider::{ProviderServer, ServerOptions, tcp::TcpServer, udp::UdpServer},
14    service::Transport,
15    statistics::Statistics,
16};
17
18pub async fn start_server(config: Config, service: Service, statistics: Statistics) -> Result<()> {
19    let exchanger = Exchanger::default();
20
21    let mut servers = JoinSet::new();
22
23    for interface in config.server.interfaces {
24        match interface {
25            Interface::Udp {
26                listen,
27                external,
28                idle_timeout,
29                mtu,
30            } => {
31                servers.spawn(UdpServer::start(
32                    ServerOptions {
33                        transport: Transport::Udp,
34                        idle_timeout,
35                        ssl: None,
36                        external,
37                        listen,
38                        mtu,
39                    },
40                    service.clone(),
41                    statistics.clone(),
42                    exchanger.clone(),
43                ));
44            }
45            Interface::Tcp {
46                listen,
47                external,
48                idle_timeout,
49                ssl,
50            } => {
51                servers.spawn(TcpServer::start(
52                    ServerOptions {
53                        transport: Transport::Tcp,
54                        idle_timeout,
55                        external,
56                        listen,
57                        mtu: 0,
58                        ssl,
59                    },
60                    service.clone(),
61                    statistics.clone(),
62                    exchanger.clone(),
63                ));
64            }
65        };
66    }
67
68    // As soon as one server exits, all servers will be exited to ensure the
69    // availability of all servers.
70    if let Some(res) = servers.join_next().await {
71        servers.abort_all();
72
73        return res?;
74    }
75
76    Ok(())
77}