pub async fn peer_to_tcp(
addr: &str,
send: iroh::endpoint::SendStream,
recv: iroh::endpoint::RecvStream,
) -> eyre::Result<()> {
let stream = tokio::net::TcpStream::connect(addr).await?;
let (tcp_recv, tcp_send) = tokio::io::split(stream);
pipe_tcp_stream_over_iroh(tcp_recv, tcp_send, send, recv).await
}
pub async fn pipe_tcp_stream_over_iroh(
mut tcp_recv: impl tokio::io::AsyncRead + Unpin + Send + 'static,
tcp_send: impl tokio::io::AsyncWrite + Unpin + Send + 'static,
mut send: iroh::endpoint::SendStream,
mut recv: iroh::endpoint::RecvStream,
) -> eyre::Result<()> {
tracing::trace!("pipe_tcp_stream_over_iroh");
let t = tokio::spawn(async move {
let mut t = tcp_send;
let r = tokio::io::copy(&mut recv, &mut t).await;
tracing::trace!("piping tcp stream, copy done");
r.map(|_| ())
});
tracing::trace!("copying tcp stream to iroh stream");
tokio::io::copy(&mut tcp_recv, &mut send).await?;
tracing::trace!("pipe_tcp_stream_over_iroh copy done");
send.finish()?;
tracing::trace!("closed send stream");
drop(send);
let r = Ok(t.await??);
tracing::trace!("pipe_tcp_stream_over_iroh done");
r
}
pub async fn tcp_to_peer(
header: crate::ProtocolHeader,
self_endpoint: iroh::Endpoint,
stream: tokio::net::TcpStream,
remote_node_id52: &str,
peer_connections: crate::PeerStreamSenders,
graceful: crate::Graceful,
) -> eyre::Result<()> {
tracing::info!("tcp_to_peer: {remote_node_id52}");
let (send, recv) = crate::get_stream(
self_endpoint,
header,
remote_node_id52.to_string(),
peer_connections.clone(),
graceful,
)
.await?;
tracing::info!("got stream");
let (tcp_recv, tcp_send) = tokio::io::split(stream);
pipe_tcp_stream_over_iroh(tcp_recv, tcp_send, send, recv).await
}