turn_server/server/
mod.rs1pub 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 if let Some(res) = servers.join_next().await {
71 servers.abort_all();
72
73 return res?;
74 }
75
76 Ok(())
77}