Implementation
struct MultiplexedClient {
outbound: mpsc::Sender<(KvMessage, oneshot::Sender<KvMessage>)>,
}
impl MultiplexedClient {
async fn send(&self, mut req: KvMessage) -> Result<KvMessage, Error> {
let (tx, rx) = oneshot::channel();
req.request_id = self.next_id();
self.outbound.send((req, tx)).await?;
rx.await.map_err(|_| Error::ConnectionClosed)
}
}
async fn writer_task(
mut rx: mpsc::Receiver<(KvMessage, oneshot::Sender<KvMessage>)>,
mut framed: FramedWrite<OwnedWriteHalf, KvCodec>,
pending: Arc<DashMap<u32, oneshot::Sender<KvMessage>>>,
) {
while let Some((msg, tx)) = rx.recv().await {
pending.insert(msg.request_id, tx);
framed.send(msg).await.unwrap();
}
}