use tokio::sync::mpsc;
use crate::error::KnafehError;
pub struct RpcStreamReceiver {
rx: mpsc::Receiver<Result<Vec<u8>, KnafehError>>,
}
pub struct RpcStreamSender {
tx: mpsc::Sender<Result<Vec<u8>, KnafehError>>,
}
pub struct RpcStreamResponse {
pub metadata: super::message::Metadata,
pub receiver: RpcStreamReceiver,
}
pub struct RpcStreamRequest {
pub metadata: super::message::Metadata,
pub receiver: RpcStreamReceiver,
}
pub fn rpc_stream_channel(buffer: usize) -> (RpcStreamSender, RpcStreamReceiver) {
let (tx, rx) = mpsc::channel(buffer);
(RpcStreamSender { tx }, RpcStreamReceiver { rx })
}
impl RpcStreamReceiver {
pub async fn next(&mut self) -> Option<Result<Vec<u8>, KnafehError>> {
self.rx.recv().await
}
}
impl RpcStreamSender {
pub async fn send(&self, data: Vec<u8>) -> Result<(), KnafehError> {
self.tx
.send(Ok(data))
.await
.map_err(|_| KnafehError::ConnectionClosed)
}
pub async fn send_error(&self, err: KnafehError) -> Result<(), KnafehError> {
self.tx
.send(Err(err))
.await
.map_err(|_| KnafehError::ConnectionClosed)
}
pub fn close(self) {
drop(self);
}
}