#pubsub #futures #concurrency

flo_stream

Pubsub and related streams for Rust futures

8 releases (5 breaking)

0.6.0 Feb 8, 2021
0.5.0 Jan 31, 2021
0.4.0 Dec 29, 2019
0.3.0 Dec 15, 2018
0.1.1 Aug 7, 2018

#39 in Concurrency

Download history 91/week @ 2021-05-30 158/week @ 2021-06-06 88/week @ 2021-06-13 321/week @ 2021-06-20 133/week @ 2021-06-27 447/week @ 2021-07-04 216/week @ 2021-07-11 329/week @ 2021-07-18 381/week @ 2021-07-25 411/week @ 2021-08-01 388/week @ 2021-08-08 229/week @ 2021-08-15 181/week @ 2021-08-22 266/week @ 2021-08-29 257/week @ 2021-09-05 190/week @ 2021-09-12

1,372 downloads per month
Used in 6 crates (4 directly)

Apache-2.0

79KB
1K SLoC

flo_stream = "0.6"

flo_stream

flo_stream is a crate providing some extra utilities for streams in Rust's futures library. The primary new feature it provides is a "pubsub" mechanism - a way to subscribe to updates sent to a futures Sink. This differs from the Sender/Receiver mechanism provided in the main futures library in two key ways: it's possible to have multiple receivers, and messages sent when there is no subscriber connected will be ignored.

PubSub

The sink type provided is Publisher. You can create one with let publisher = Publisher::new(10). This implements the Sink trait so can be used in a very similar way to send messages. The number passed in is the maximum number of waiting messages allowed for any given subscriber.

A subscription can be created using let subscription = publisher.subscribe(). Any messages sent to the sink after this is called is relayed to all subscriptions. A subscription is a Stream so can interact with other parts of the futures library in the usual way.

Here's a full worked example with a single subscriber:

let mut publisher       = Publisher::new(10);
let mut subscriber      = publisher.subscribe();

executor::block_on(async {
    publisher.publish(1).await;
    publisher.publish(2).await;
    publisher.publish(3).await;

    assert!(subscriber.next().await == Some(1));
    assert!(subscriber.next().await == Some(2));
    assert!(subscriber.next().await == Some(3));
});

It's also possible to call subscriber.clone() to create a new subscription from an existing one without needing to keep a reference to the publisher. This can be used to reduce the amount of effort needed in passing objects around, and to hide implementation details from the caller.

Dependencies

~1MB
~18K SLoC