use super::{PooledBuffer, Sender};
use crate::IggyError;
use compio::buf::IoBufMut;
use compio::io::AsyncWrite;
use compio::net::TcpStream;
use compio::tls::TlsStream;
use err_trail::ErrContext;
const COMPONENT: &str = "TCP";
#[derive(Debug)]
pub struct TcpTlsSender {
pub(crate) stream: TlsStream<TcpStream>,
}
impl Sender for TcpTlsSender {
async fn read<B: IoBufMut>(&mut self, buffer: B) -> (Result<(), IggyError>, B) {
super::read(&mut self.stream, buffer).await
}
async fn send_empty_ok_response(&mut self) -> Result<(), IggyError> {
super::send_empty_ok_response(&mut self.stream).await?;
self.stream
.flush()
.await
.error(|e: &std::io::Error| {
format!("failed to flush TCP stream after sending response: {e}")
})
.map_err(|_| IggyError::TcpError)
}
async fn send_ok_response(&mut self, payload: &[u8]) -> Result<(), IggyError> {
super::send_ok_response(&mut self.stream, payload).await?;
self.stream
.flush()
.await
.error(|e: &std::io::Error| {
format!("failed to flush TCP stream after sending response: {e}")
})
.map_err(|_| IggyError::TcpError)
}
async fn send_error_response(&mut self, error: IggyError) -> Result<(), IggyError> {
super::send_error_response(&mut self.stream, error).await?;
self.stream
.flush()
.await
.error(|e: &std::io::Error| {
format!("failed to flush TCP stream after sending response: {e}")
})
.map_err(|_| IggyError::TcpError)
}
async fn shutdown(&mut self) -> Result<(), IggyError> {
self.stream
.shutdown()
.await
.error(|e: &std::io::Error| {
format!("{COMPONENT} (error: {e}) - failed to shutdown TCP TLS stream")
})
.map_err(|e| IggyError::IoError(e.to_string()))
}
async fn send_ok_response_vectored(
&mut self,
length: &[u8],
slices: Vec<PooledBuffer>,
) -> Result<(), IggyError> {
super::send_ok_response_vectored(&mut self.stream, length, slices).await?;
self.stream
.flush()
.await
.error(|e: &std::io::Error| {
format!("failed to flush TCP stream after sending response: {e}")
})
.map_err(|_| IggyError::TcpError)
}
}