pub async fn drive<TBehaviour1, const NUM_EVENTS_SWARM_1: usize, Out1, TBehaviour2, const NUM_EVENTS_SWARM_2: usize, Out2>(
swarm1: &mut Swarm<TBehaviour2>,
swarm2: &mut Swarm<TBehaviour1>,
) -> ([Out1; NUM_EVENTS_SWARM_1], [Out2; NUM_EVENTS_SWARM_2])where
TBehaviour2: NetworkBehaviour + Send,
TBehaviour2::ToSwarm: Debug,
TBehaviour1: NetworkBehaviour + Send,
TBehaviour1::ToSwarm: Debug,
SwarmEvent<TBehaviour2::ToSwarm>: TryIntoOutput<Out1>,
SwarmEvent<TBehaviour1::ToSwarm>: TryIntoOutput<Out2>,
Out1: Debug,
Out2: Debug,
Expand description
Drives two Swarm
s until a certain number of events are emitted.
§Usage
§Number of events
The number of events is configured via const generics based on the array size of the return
type. This allows the compiler to infer how many events you are expecting based on how you use
this function. For example, if you expect the first Swarm
to emit 2 events, you should
assign the first variable of the returned tuple value to an array of size 2. This works
especially well if you directly pattern-match on the return value.
§Type of event
This function utilizes the TryIntoOutput
trait.
Similar as to the number of expected events, the type of event is inferred based on your usage.
If you match against a SwarmEvent
, the first SwarmEvent
will be returned.
If you match against your NetworkBehaviour::ToSwarm
type, SwarmEvent
s which are not
SwarmEvent::Behaviour
will be skipped until the Swarm
returns a behaviour event.
You can implement the TryIntoOutput
for any other type to further customize this behaviour.
§Difference to futures::future::join
This function is similar to joining two futures with two crucial differences:
- As described above, it allows you to obtain more than a single event.
- More importantly, it will continue to poll the
Swarm
s even if they already has emitted all expected events.
Especially (2) is crucial for our usage of this function.
If a Swarm
is not polled, nothing within it makes progress.
This can “starve” the other swarm which for example may wait for another message to be sent on a
connection.
Using drive
instead of futures::future::join
ensures that a Swarm
continues to be
polled, even after it emitted its events.