ClientMessageSorter

Struct ClientMessageSorter 

Source
pub struct ClientMessageSorter { /* private fields */ }
Expand description

Message sorting and pairing for remote client connectors.

In order to create reliable connections to remote systems, we need a way to maintain message coherence. We expect that whenever a client sends the server a request message, the server will always send back a response message.

For the [in-process][crate::connector::ButtplugInProcessClientConnector] case, where the client and server are in the same process, we can simply use execution flow to match the client message and server response. However, when going over IPC or network, we have to wait to hear back from the server. To match the outgoing client request message with the incoming server response message in the remote case, we use the id field of ButtplugMessage. The client’s request message will have a server response with a matching index. Any message that comes from the server without an originating client message ([DeviceAdded][crate::core::messages::DeviceAdded], [Log][crate::core::messages::Log], etc…) will have an id of 0 and is considered an event, meaning something happened on the server that was not directly tied to a client request.

The ClientConnectionMessageSorter does two things to facilitate this matching:

  • Creates and keeps track of the current message id, as a u32
  • Manages a HashMap of indexes to resolvable futures.

Whenever a remote connector sends a ButtplugMessage, it first puts it through its ClientMessageSorter to fill in the message id. Similarly, when a ButtplugMessage is received, it comes through the sorter, with one of 3 outcomes:

  • If there is a future with matching id waiting on a response, it resolves that future using the incoming message
  • If the message id is 0, the message is emitted as an event.
  • If the message id is not zero but there is no future waiting, the message is dropped and an error is emitted.

Implementations§

Source§

impl ClientMessageSorter

Source

pub fn register_future(&self, msg_fut: &mut ButtplugClientMessageFuturePair)

Registers a future to be resolved when we receive a response.

Given a message and its related future, set the message’s id, and match that id with the future to be resolved when we get a response back.

Source

pub fn maybe_resolve_result(&self, msg: &ButtplugServerMessageV3) -> bool

Given a response message from the server, resolve related future if we have one.

Returns true if the response message was resolved to a future via matching id, otherwise returns false. False returns mean the message should be considered as an event.

Trait Implementations§

Source§

impl Default for ClientMessageSorter

Source§

fn default() -> Self

Create a default implementation of the ClientConnectorMessageSorter

Sets the current_id to 1, since as a client we can’t send message id of 0 (0 is reserved for system incoming messages).

Auto Trait Implementations§

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
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

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

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

fn in_current_span(self) -> Instrumented<Self>

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

impl<T> Instrument for T

Source§

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

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

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.

Source§

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

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
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.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> WithSubscriber for T

Source§

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
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> ErasedDestructor for T
where T: 'static,