#channel #single-producer #single-consumer #receiver #relay #sender

relay_channel

A single-producer, single-consumer channel where the sender waits for the receiver to receive the message before returning

2 releases

Uses new Rust 2024

0.1.1 Mar 7, 2025
0.1.0 Mar 7, 2025

#9 in #sender

Download history 149/week @ 2025-03-01 247/week @ 2025-03-08 487/week @ 2025-03-15

883 downloads per month
Used in orchestrator_lock

MIT license

10KB
176 lines

A single-producer, single-consumer "relay" channel wherein the send future doesn't return until the receiver task has received the sent value. This can be thought of as being like a mpsc::channel with capacity 0.

Note that to use this channel at all, some form of task parallelism (eg via join! or spawn) is required.

All provided async methods are cancel-safe.

Examples

use tokio::{join, time::Duration};

// This future will never return
async fn send_then_recv() {
    let (mut tx, mut rx) = relay_channel::channel();
    tx.send(42).await.unwrap();
    rx.recv().await.unwrap();
}

// This future will return
async fn join_send_and_recv() {
    let (mut tx, mut rx) = relay_channel::channel();
    let (sent, received) = join! {
        tx.send(42),
        rx.recv(),
    };
    assert_eq!(sent, Ok(()));
    assert_eq!(received, Some(42));
}

#[tokio::main(flavor = "current_thread")]
async fn main() {
    let result = tokio::time::timeout(
        Duration::from_millis(100),
        send_then_recv()
    ).await;
    assert!(result.is_err());
    join_send_and_recv().await;
}

Dependencies

~2.7–8.5MB
~71K SLoC