use arbiter_proto::proto::{ client::{ClientRequest, ClientResponse}, }; use std::sync::atomic::{AtomicI32, Ordering}; use tokio::sync::mpsc; pub(crate) const BUFFER_LENGTH: usize = 16; static NEXT_REQUEST_ID: AtomicI32 = AtomicI32::new(1); pub(crate) fn next_request_id() -> i32 { NEXT_REQUEST_ID.fetch_add(1, Ordering::Relaxed) } #[derive(Debug, thiserror::Error)] pub(crate) enum ClientSignError { #[error("Transport channel closed")] ChannelClosed, #[error("Connection closed by server")] ConnectionClosed, } pub(crate) struct ClientTransport { pub(crate) sender: mpsc::Sender, pub(crate) receiver: tonic::Streaming, } impl ClientTransport { pub(crate) async fn send( &mut self, request: ClientRequest, ) -> std::result::Result<(), ClientSignError> { self.sender .send(request) .await .map_err(|_| ClientSignError::ChannelClosed) } pub(crate) async fn recv( &mut self, ) -> std::result::Result { match self.receiver.message().await { Ok(Some(resp)) => Ok(resp), Ok(None) => Err(ClientSignError::ConnectionClosed), Err(_) => Err(ClientSignError::ConnectionClosed), } } }