tuwunel_router/serve/
plain.rs1use std::net::{SocketAddr, TcpListener};
2
3use axum::Router;
4use axum_server::Handle;
5use futures::{FutureExt, future::BoxFuture};
6use tuwunel_core::{Result, itertools::Itertools};
7
8pub(super) fn serve<'a>(
9 router: &Router,
10 handle: &Handle<SocketAddr>,
11 listeners: impl Iterator<Item = TcpListener>,
12 addrs: &[SocketAddr],
13) -> Result<Vec<BoxFuture<'a, Result<(), std::io::Error>>>> {
14 let router = router
15 .clone()
16 .into_make_service_with_connect_info::<SocketAddr>();
17
18 let bound_servers = addrs
19 .iter()
20 .map(|addr| -> Result<_> { Ok(axum_server::bind(*addr)) });
21
22 let passed_servers = listeners.map(|listener| Ok(axum_server::from_tcp(listener)?));
23
24 let acceptors = bound_servers
25 .chain(passed_servers)
26 .map_ok(|server| {
27 server
28 .handle(handle.clone())
29 .serve(router.clone())
30 .boxed()
31 })
32 .collect::<Result<Vec<_>>>()?;
33
34 Ok(acceptors)
35}