X-Git-Url: https://git.nmode.ca/signal-cli/blobdiff_plain/edbf803a987a4959d72a644e2fb3afc370a79cff..8037fb2d66e52fa65333e4b176c430118f59e89c:/client/src/transports/mod.rs diff --git a/client/src/transports/mod.rs b/client/src/transports/mod.rs new file mode 100644 index 00000000..04f4390f --- /dev/null +++ b/client/src/transports/mod.rs @@ -0,0 +1,64 @@ +use futures_util::{stream::StreamExt, Sink, SinkExt, Stream}; +use jsonrpsee::core::{ + async_trait, + client::{ReceivedMessage, TransportReceiverT, TransportSenderT}, +}; +use thiserror::Error; + +pub mod ipc; +mod stream_codec; +pub mod tcp; + +#[derive(Debug, Error)] +enum Errors { + #[error("Other: {0}")] + Other(String), + #[error("Closed")] + Closed, +} + +struct Sender> { + inner: T, +} + +#[async_trait] +impl + Unpin + 'static> TransportSenderT + for Sender +{ + type Error = Errors; + + async fn send(&mut self, body: String) -> Result<(), Self::Error> { + self.inner + .send(body) + .await + .map_err(|e| Errors::Other(format!("{:?}", e)))?; + Ok(()) + } + + async fn close(&mut self) -> Result<(), Self::Error> { + self.inner + .close() + .await + .map_err(|e| Errors::Other(format!("{:?}", e)))?; + Ok(()) + } +} + +struct Receiver { + inner: T, +} + +#[async_trait] +impl> + Unpin + 'static> TransportReceiverT + for Receiver +{ + type Error = Errors; + + async fn receive(&mut self) -> Result { + match self.inner.next().await { + None => Err(Errors::Closed), + Some(Ok(msg)) => Ok(ReceivedMessage::Text(msg)), + Some(Err(e)) => Err(Errors::Other(format!("{:?}", e))), + } + } +}