use std::time::Duration;
use super::*;
const DRAIN_TIMEOUT: Duration = Duration::from_secs(5);
pub(super) async fn bridge(
mut send: SendStream,
mut recv: RecvStream,
tcp: TcpStream,
) -> crate::Result<()> {
let (mut tcp_read, mut tcp_write) = tcp.into_split();
tokio::select! {
r = tokio::io::copy(&mut tcp_read, &mut send) => {
let _ = send.finish();
r.map_err(|e| crate::error::TunnelError::BridgeTcpToQuic(e.into()))?;
let _ = tokio::time::timeout(
DRAIN_TIMEOUT,
tokio::io::copy(&mut recv, &mut tcp_write),
).await;
}
r = tokio::io::copy(&mut recv, &mut tcp_write) => {
r.map_err(|e| crate::error::TunnelError::BridgeQuicToTcp(e.into()))?;
let drain = tokio::time::timeout(
DRAIN_TIMEOUT,
tokio::io::copy(&mut tcp_read, &mut send),
).await;
let _ = send.finish();
let _ = drain;
}
}
Ok(())
}