use super::duplex_stream::DuplexStream;
use crate::{
HysteriaError,
protocol::{TCPRequest, TCPResponseStatus, read_tcp_response},
};
pub struct HysteriaClient {
pub(crate) quic_connection: quinn::Connection,
}
impl HysteriaClient {
pub async fn tcp_connect(&self, address: &str) -> Result<DuplexStream, HysteriaError> {
let (mut send, mut recv) = self.quic_connection.open_bi().await?;
let req = TCPRequest {
address: address.to_string(),
padding_len: 0, };
send.write_all(&req.encode()).await?;
let (status, msg) = read_tcp_response(&mut recv).await?;
if status != TCPResponseStatus::Ok {
return Err(HysteriaError::TcpConnectError(msg));
}
Ok(DuplexStream { send, recv })
}
}