async_helpers::hanging_get::async_server

Struct HangingGetBroker

Source
pub struct HangingGetBroker<S, O: Unpin + 'static, F: Fn(&S, O) -> bool> { /* private fields */ }
Expand description

A Send wrapper for a HangingGet that can receive messages via an async channel. The HangingGetBroker is the primary way of implementing server side hanging get using this library. It manages all state and reacts to inputs sent over channels.

§Example Usage:

Assuming some fidl protocol with a hanging get method:

protocol SheepCounter {
    /// Returns the current number of sheep that have jumped the fence
    /// when that number changes.
    WatchCount() -> (uint64 count);
}

A server implementation might include the following:

let broker = HangingGetBroker::new(
    0u64, // Initial state
    |s, o: SheepCounterWatchCountResponder| {
        o.send(s.clone()).unwrap();
        true
    }, // notify function with fidl auto-generated responder
    DEFAULT_CHANNEL_SIZE, // Size of channels used by Publishers and Subscribers
);

// Create a new publisher that can be used to publish updates to the state
let mut publisher = broker.new_publisher();
// Create a new registrar that can be used to register subscribers
let mut registrar = broker.new_registrar();

// Spawn broker as an async task that will run until there are not any more
// `SubscriptionRegistrar`, `Publisher`, or `Subscriber` objects that can update the system.
fuchsia_async::Task::spawn(broker.run()).detach();

// Spawn a background task to count sheep
fuchsia_async::Task::spawn(async move {
    let interval = fuchsia_async::Interval::new(1.second);
    loop {
        interval.next.await();
        publisher.update(|sheep_count| *sheep_count += 1);
    }
}).detach();

// Create a new `ServiceFs` and register SheepCounter fidl service
let mut fs = ServiceFs::new();
fs.dir("svc").add_fidl_service(|s: SheepCounterRequestStream| s);

// SubscriptionRegistrar new client connections sequentially
while let Some(mut stream) = fs.next().await {

    // Create a new subscriber associated with this client's request stream
    let mut subscriber = registrar.new_subscriber().await.unwrap();

    // SubscriptionRegistrar requests from this client by registering new observers
    fuchsia_async::Task::spawn(async move {
        while let Some(Ok(SheepCounterWatchCountRequest { responder })) = stream.next().await {
            subscriber.register(responder).await.unwrap();
        }
    }).detach();
}

Implementations§

Source§

impl<S, O, F> HangingGetBroker<S, O, F>
where S: Clone + Send, O: Send + Unpin + 'static, F: Fn(&S, O) -> bool,

Source

pub fn new(state: S, notify: F, channel_size: usize) -> Self

Create a new broker. state is the initial state of the HangingGet notify is a Fn that is used to notify observers of state. channel_size is the maximum queue size of unprocessed messages from an individual object.

Source

pub fn new_publisher(&self) -> Publisher<S>

Create a new Publisher that can be used to communicate state updates with this HangingGetBroker from another thread or async task.

Source

pub fn new_registrar(&self) -> SubscriptionRegistrar<O>

Create a new SubscriptionRegistrar that can be used to register new subscribers with this HangingGetBroker from another thread or async task.

Source

pub async fn run(self)

Consume HangingGetBroker, returning a Future object that can be polled to drive updates to the HangingGet object. The Future completes when there are no remaining SubscriptionRegistrars for this object.

Auto Trait Implementations§

§

impl<S, O, F> Freeze for HangingGetBroker<S, O, F>
where S: Freeze, F: Freeze,

§

impl<S, O, F> !RefUnwindSafe for HangingGetBroker<S, O, F>

§

impl<S, O, F> Send for HangingGetBroker<S, O, F>
where S: Send, F: Send, O: Send,

§

impl<S, O, F> Sync for HangingGetBroker<S, O, F>
where S: Sync, F: Sync, O: Sync + Send,

§

impl<S, O, F> Unpin for HangingGetBroker<S, O, F>
where S: Unpin, F: Unpin,

§

impl<S, O, F> !UnwindSafe for HangingGetBroker<S, O, F>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T, D> Encode<Ambiguous1, D> for T
where D: ResourceDialect,

§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
§

impl<T, D> Encode<Ambiguous2, D> for T
where D: ResourceDialect,

§

unsafe fn encode( self, _encoder: &mut Encoder<'_, D>, _offset: usize, _depth: Depth, ) -> Result<(), Error>

Encodes the object into the encoder’s buffers. Any handles stored in the object are swapped for Handle::INVALID. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

impl<St> WithTag for St

§

fn tagged<T>(self, tag: T) -> Tagged<T, St>

Produce a new stream from this one which yields item tupled with a constant tag