#[cfg(feature = "net")]
use futures::{
stream::{SplitSink, SplitStream},
StreamExt,
};
#[cfg(feature = "net")]
use tokio::net::TcpStream;
#[cfg(feature = "net")]
use tokio_util::codec::{AnyDelimiterCodec, Framed};
#[cfg(feature = "net")]
pub type FrameSender<T> = SplitSink<Framed<TcpStream, AnyDelimiterCodec>, T>;
#[cfg(feature = "net")]
pub type FrameReceiver = SplitStream<Framed<TcpStream, AnyDelimiterCodec>>;
#[cfg(feature = "net")]
pub fn frame_stream_split<T>(stream: TcpStream, split: Vec<u8>) -> (FrameSender<T>, FrameReceiver)
where
T: AsRef<str>,
{
let codec = AnyDelimiterCodec::new(split.clone(), split);
let frame = Framed::new(stream, codec);
frame.split::<T>()
}
#[cfg(feature = "net")]
pub fn frame_stream_combined<T>(sender: FrameSender<T>, receiver: FrameReceiver) -> TcpStream
where
T: AsRef<str>,
{
sender.reunite(receiver).unwrap().into_parts().io
}
#[cfg(feature = "net")]
pub async fn proxy_tcpstream(
mut stream1: TcpStream,
mut stream2: TcpStream,
) -> Result<(u64, u64), std::io::Error> {
use tokio::io::copy_bidirectional;
let (s1, s2) = copy_bidirectional(&mut stream1, &mut stream2).await?;
Ok((s1, s2))
}
#[tokio::test]
#[cfg(feature = "net")]
async fn test_tokio() {
let stream = tokio::net::TcpStream::connect("127.0.0.1:8000")
.await
.unwrap();
let (sender, receiver) = frame_stream_split::<String>(stream, b"\0".to_vec());
let _stream = frame_stream_combined(sender, receiver);
}