1use tokio::sync::{mpsc, oneshot};
2
3use crate::conn::{spawn_hrana_conn, ConnFut};
4use crate::error::{Error, Result};
5use crate::op::Op;
6use crate::Stream;
7
8#[derive(Clone)]
9pub struct Client {
10 conn_sender: mpsc::UnboundedSender<Op>,
11}
12
13impl Client {
14 pub async fn connect(url: &str, jwt: Option<String>) -> Result<(Self, ConnFut)> {
31 let (conn_sender, handle) = spawn_hrana_conn(url, jwt).await?;
32 Ok((Self { conn_sender }, handle))
33 }
34
35 pub async fn open_stream(&self) -> Result<Stream> {
37 let (ret, recv) = oneshot::channel();
38 let op = Op::OpenStream { ret };
39 self.conn_sender.send(op).map_err(|_| Error::Shutdown)?;
40 let stream = recv.await.map_err(|_| Error::Shutdown)?;
41
42 Ok(stream)
43 }
44
45 pub async fn shutdown(&self) -> Result<()> {
48 let (ret, recv) = oneshot::channel();
49 let op = Op::Shutdown { ret };
50 self.conn_sender.send(op).map_err(|_| Error::Shutdown)?;
51 recv.await.map_err(|_| Error::Shutdown)?;
52
53 Ok(())
54 }
55}