Skip to content

Commit

Permalink
feat: Allow to create tarpc on existing UDS listener
Browse files Browse the repository at this point in the history
  • Loading branch information
SabatierBoris authored and tikue committed Jan 2, 2024
1 parent a6758fd commit b92dd15
Showing 1 changed file with 34 additions and 1 deletion.
35 changes: 34 additions & 1 deletion tarpc/src/serde_transport.rs
Original file line number Diff line number Diff line change
Expand Up @@ -364,7 +364,19 @@ pub mod unix {
Codec: Serializer<SinkItem> + Deserializer<Item>,
CodecFn: Fn() -> Codec,
{
let listener = UnixListener::bind(path)?;
listen_on(UnixListener::bind(path)?, codec_fn).await
}

/// Wrap accepted connections from `listener` in Unix Domain Socket transports.
pub async fn listen_on<Item, SinkItem, Codec, CodecFn>(
listener: UnixListener,
codec_fn: CodecFn,
) -> io::Result<Incoming<Item, SinkItem, Codec, CodecFn>>
where
Item: for<'de> Deserialize<'de>,
Codec: Serializer<SinkItem> + Deserializer<Item>,
CodecFn: Fn() -> Codec,
{
let local_addr = listener.local_addr()?;
Ok(Incoming {
listener,
Expand Down Expand Up @@ -669,4 +681,25 @@ mod tests {
assert_matches!(transport.next().await, None);
Ok(())
}

#[cfg(all(unix, feature = "unix"))]
#[tokio::test]
async fn uds_on_existing_transport() -> io::Result<()> {
use super::unix;
use super::*;

let sock = unix::TempPathBuf::with_random("uds");
let transport = tokio::net::UnixListener::bind(&sock)?;
let mut listener = unix::listen_on(transport, SymmetricalJson::<String>::default).await?;
tokio::spawn(async move {
let mut transport = listener.next().await.unwrap().unwrap();
let message = transport.next().await.unwrap().unwrap();
transport.send(message).await.unwrap();
});
let mut transport = unix::connect(&sock, SymmetricalJson::<String>::default).await?;
transport.send(String::from("test")).await?;
assert_matches!(transport.next().await, Some(Ok(s)) if s == "test");
assert_matches!(transport.next().await, None);
Ok(())
}
}

0 comments on commit b92dd15

Please sign in to comment.