Skip to main content

tuwunel_router/serve/
plain.rs

1use 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}