use std::time::Duration;
use bytes::BytesMut;
use crate::ipc::error::IpcError;
use super::IpcConnection;
const UNIX_CONNECT_TIMEOUT: Duration = Duration::from_secs(30);
pub async fn connect(endpoint: &str) -> Result<IpcConnection, IpcError> {
let stream = match tokio::time::timeout(
UNIX_CONNECT_TIMEOUT,
tokio::net::UnixStream::connect(endpoint),
)
.await
{
Ok(result) => result?,
Err(_) => {
return Err(IpcError::Io(std::io::Error::new(
std::io::ErrorKind::TimedOut,
format!(
"cannot connect to daemon at {endpoint}: connect timed out after {UNIX_CONNECT_TIMEOUT:?}"
),
)));
}
};
Ok(IpcConnection::from_unix_stream(stream))
}
impl IpcConnection {
pub fn from_unix_stream(stream: tokio::net::UnixStream) -> Self {
let (reader, writer) = tokio::io::split(stream);
IpcConnection {
reader,
writer,
read_buf: BytesMut::with_capacity(4096),
recv_timeout: None,
next_frame_request_id: 1,
}
}
}