mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-17 03:51:22 +00:00
feat(transport): allow ListenerId
to be user-controlled
`Transport::listen_on` is an asynchronous operation. It returns immediately but the actual process of establishing a listening socket happens as part of `Transport::poll` which will return one or more `TransportEvent`s related to a particular `listen_on` call. Currently, `listen_on` returns a `ListenerId` which allows the user of the `Transport` interface to correlate the events with a particular `listen_on` call. This "user" is the `Swarm` runtime. Currently, a user of libp2p establishes a new listening socket by talking to the `Swarm::listen_on` interface and it is not possible to do the same thing via the `NetworkBehaviour` trait. Within the `NetworkBehaviour` trait, we emit _commands_ to the `Swarm` like `ToSwarm::Dial`. These commands don't have a "return value" like a synchronous function does and thus, if we were to add a `ToSwarm::ListenOn` command, it could not receive the `ListenerId` from the `Transport`. To fix this and to be consistent with our [coding guidelines](https://github.com/libp2p/rust-libp2p/blob/master/docs/coding-guidelines.md#allow-correlating-asynchronous-responses-to-their-requests) we change the interface of `Transport::listen_on` to require the user to pass in a `ListenerId`. This will allow us to construct a command in a `NetworkBehaviour` that remembers this ID which enables precise tracking of which events containing a `ListenerId` correlate which a particular `listen_on` command. This is especially important in the context of listening on wildcard addresses like `0.0.0.0` because we end up binding to multiple network interfaces and thus emit multiple events for a single `listen_on` call. Pull-Request: #3567.
This commit is contained in:
@ -474,7 +474,8 @@ where
|
||||
/// Listeners report their new listening addresses as [`SwarmEvent::NewListenAddr`].
|
||||
/// Depending on the underlying transport, one listener may have multiple listening addresses.
|
||||
pub fn listen_on(&mut self, addr: Multiaddr) -> Result<ListenerId, TransportError<io::Error>> {
|
||||
let id = self.transport.listen_on(addr)?;
|
||||
let id = ListenerId::next();
|
||||
self.transport.listen_on(id, addr)?;
|
||||
self.behaviour
|
||||
.on_swarm_event(FromSwarm::NewListener(behaviour::NewListener {
|
||||
listener_id: id,
|
||||
@ -2222,7 +2223,9 @@ mod tests {
|
||||
let mut transports = Vec::new();
|
||||
for _ in 0..num_listen_addrs {
|
||||
let mut transport = transport::MemoryTransport::default().boxed();
|
||||
transport.listen_on("/memory/0".parse().unwrap()).unwrap();
|
||||
transport
|
||||
.listen_on(ListenerId::next(), "/memory/0".parse().unwrap())
|
||||
.unwrap();
|
||||
|
||||
match transport.select_next_some().await {
|
||||
TransportEvent::NewAddress { listen_addr, .. } => {
|
||||
|
Reference in New Issue
Block a user