PollParameters is now a trait (#1177)

* PollParameters is now a trait

* Fix unused variable
This commit is contained in:
Pierre Krieger 2019-06-18 10:23:26 +02:00 committed by GitHub
parent 78d6f44e46
commit b6378ac526
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 93 additions and 40 deletions

View File

@ -47,5 +47,5 @@ mod registry;
pub mod toggle; pub mod toggle;
pub use crate::nodes::raw_swarm::ConnectedPoint; pub use crate::nodes::raw_swarm::ConnectedPoint;
pub use self::behaviour::{NetworkBehaviour, NetworkBehaviourAction, NetworkBehaviourEventProcess}; pub use self::behaviour::{NetworkBehaviour, NetworkBehaviourAction, NetworkBehaviourEventProcess, PollParameters};
pub use self::swarm::{PollParameters, ExpandedSwarm, Swarm, SwarmBuilder}; pub use self::swarm::{SwarmPollParameters, ExpandedSwarm, Swarm, SwarmBuilder};

View File

@ -22,7 +22,6 @@ use crate::{
Multiaddr, PeerId, Multiaddr, PeerId,
nodes::raw_swarm::ConnectedPoint, nodes::raw_swarm::ConnectedPoint,
protocols_handler::{IntoProtocolsHandler, ProtocolsHandler}, protocols_handler::{IntoProtocolsHandler, ProtocolsHandler},
swarm::PollParameters,
}; };
use futures::prelude::*; use futures::prelude::*;
use std::error; use std::error;
@ -129,10 +128,37 @@ pub trait NetworkBehaviour {
/// ///
/// This API mimics the API of the `Stream` trait. The method may register the current task in /// This API mimics the API of the `Stream` trait. The method may register the current task in
/// order to wake it up at a later point in time. /// order to wake it up at a later point in time.
fn poll(&mut self, params: &mut PollParameters<'_>) fn poll(&mut self, params: &mut impl PollParameters)
-> Async<NetworkBehaviourAction<<<Self::ProtocolsHandler as IntoProtocolsHandler>::Handler as ProtocolsHandler>::InEvent, Self::OutEvent>>; -> Async<NetworkBehaviourAction<<<Self::ProtocolsHandler as IntoProtocolsHandler>::Handler as ProtocolsHandler>::InEvent, Self::OutEvent>>;
} }
/// Parameters passed to `poll()`, that the `NetworkBehaviour` has access to.
pub trait PollParameters {
/// Iterator returned by [`supported_protocols`].
type SupportedProtocolsIter: ExactSizeIterator<Item = Vec<u8>>;
/// Iterator returned by [`listened_addresses`].
type ListenedAddressesIter: ExactSizeIterator<Item = Multiaddr>;
/// Iterator returned by [`external_addresses`].
type ExternalAddressesIter: ExactSizeIterator<Item = Multiaddr>;
/// Returns the list of protocol the behaviour supports when a remote negotiates a protocol on
/// an inbound substream.
///
/// The iterator's elements are the ASCII names as reported on the wire.
///
/// Note that the list is computed once at initialization and never refreshed.
fn supported_protocols(&self) -> Self::SupportedProtocolsIter;
/// Returns the list of the addresses we're listening on.
fn listened_addresses(&self) -> Self::ListenedAddressesIter;
/// Returns the list of the addresses nodes can use to reach us.
fn external_addresses(&self) -> Self::ExternalAddressesIter;
/// Returns the peer id of the local node.
fn local_peer_id(&self) -> &PeerId;
}
/// Used when deriving `NetworkBehaviour`. When deriving `NetworkBehaviour`, must be implemented /// Used when deriving `NetworkBehaviour`. When deriving `NetworkBehaviour`, must be implemented
/// for all the possible event types generated by the various fields. /// for all the possible event types generated by the various fields.
// TODO: document how the custom behaviour works and link this here // TODO: document how the custom behaviour works and link this here

View File

@ -27,7 +27,7 @@ use std::num::NonZeroUsize;
/// Every address has an associated score and iterating over addresses will return them /// Every address has an associated score and iterating over addresses will return them
/// in order from highest to lowest. When reaching the limit, addresses with the lowest /// in order from highest to lowest. When reaching the limit, addresses with the lowest
/// score will be dropped first. /// score will be dropped first.
#[derive(Debug)] #[derive(Debug, Clone)]
pub struct Addresses { pub struct Addresses {
/// Max. length of `registry`. /// Max. length of `registry`.
limit: NonZeroUsize, limit: NonZeroUsize,
@ -82,6 +82,13 @@ impl Addresses {
pub fn iter(&self) -> AddressIter<'_> { pub fn iter(&self) -> AddressIter<'_> {
AddressIter { items: &self.registry, offset: 0 } AddressIter { items: &self.registry, offset: 0 }
} }
/// Return an iterator over all [`Multiaddr`] values.
///
/// The iteration is ordered by descending score.
pub fn into_iter(self) -> AddressIntoIter {
AddressIntoIter { items: self.registry }
}
} }
/// An iterator over [`Multiaddr`] values. /// An iterator over [`Multiaddr`] values.
@ -111,6 +118,31 @@ impl<'a> Iterator for AddressIter<'a> {
impl<'a> ExactSizeIterator for AddressIter<'a> {} impl<'a> ExactSizeIterator for AddressIter<'a> {}
/// An iterator over [`Multiaddr`] values.
#[derive(Clone)]
pub struct AddressIntoIter {
items: SmallVec<[Record; 8]>,
}
impl Iterator for AddressIntoIter {
type Item = Multiaddr;
fn next(&mut self) -> Option<Self::Item> {
if !self.items.is_empty() {
Some(self.items.remove(0).addr)
} else {
None
}
}
fn size_hint(&self) -> (usize, Option<usize>) {
let n = self.items.len();
(n, Some(n))
}
}
impl ExactSizeIterator for AddressIntoIter {}
// Reverse insertion sort. // Reverse insertion sort.
fn isort(xs: &mut [Record]) { fn isort(xs: &mut [Record]) {
for i in 1 .. xs.len() { for i in 1 .. xs.len() {

View File

@ -28,7 +28,7 @@ use crate::{
raw_swarm::{self, RawSwarm, RawSwarmEvent} raw_swarm::{self, RawSwarm, RawSwarmEvent}
}, },
protocols_handler::{NodeHandlerWrapperBuilder, NodeHandlerWrapper, NodeHandlerWrapperError, IntoProtocolsHandler, ProtocolsHandler}, protocols_handler::{NodeHandlerWrapperBuilder, NodeHandlerWrapper, NodeHandlerWrapperError, IntoProtocolsHandler, ProtocolsHandler},
swarm::{NetworkBehaviour, NetworkBehaviourAction, registry::{Addresses, AddressIter}}, swarm::{PollParameters, NetworkBehaviour, NetworkBehaviourAction, registry::{Addresses, AddressIntoIter}},
transport::TransportError, transport::TransportError,
}; };
use futures::prelude::*; use futures::prelude::*;
@ -321,11 +321,11 @@ where TBehaviour: NetworkBehaviour<ProtocolsHandler = THandler>,
} }
let behaviour_poll = { let behaviour_poll = {
let mut parameters = PollParameters { let mut parameters = SwarmPollParameters {
local_peer_id: &mut self.raw_swarm.local_peer_id(), local_peer_id: &mut self.raw_swarm.local_peer_id(),
supported_protocols: &self.supported_protocols, supported_protocols: &self.supported_protocols,
listened_addrs: &self.listened_addrs, listened_addrs: &self.listened_addrs,
external_addrs: self.external_addrs.iter() external_addrs: &self.external_addrs
}; };
self.behaviour.poll(&mut parameters) self.behaviour.poll(&mut parameters)
}; };
@ -366,36 +366,31 @@ where TBehaviour: NetworkBehaviour<ProtocolsHandler = THandler>,
/// Parameters passed to `poll()`, that the `NetworkBehaviour` has access to. /// Parameters passed to `poll()`, that the `NetworkBehaviour` has access to.
// TODO: #[derive(Debug)] // TODO: #[derive(Debug)]
pub struct PollParameters<'a: 'a> { pub struct SwarmPollParameters<'a> {
local_peer_id: &'a PeerId, local_peer_id: &'a PeerId,
supported_protocols: &'a [Vec<u8>], supported_protocols: &'a [Vec<u8>],
listened_addrs: &'a [Multiaddr], listened_addrs: &'a [Multiaddr],
external_addrs: AddressIter<'a> external_addrs: &'a Addresses,
} }
impl<'a> PollParameters<'a> { impl<'a> PollParameters for SwarmPollParameters<'a> {
/// Returns the list of protocol the behaviour supports when a remote negotiates a protocol on type SupportedProtocolsIter = std::vec::IntoIter<Vec<u8>>;
/// an inbound substream. type ListenedAddressesIter = std::vec::IntoIter<Multiaddr>;
/// type ExternalAddressesIter = AddressIntoIter;
/// The iterator's elements are the ASCII names as reported on the wire.
/// fn supported_protocols(&self) -> Self::SupportedProtocolsIter {
/// Note that the list is computed once at initialization and never refreshed. self.supported_protocols.to_vec().into_iter()
pub fn supported_protocols(&self) -> impl ExactSizeIterator<Item = &[u8]> {
self.supported_protocols.iter().map(AsRef::as_ref)
} }
/// Returns the list of the addresses we're listening on. fn listened_addresses(&self) -> Self::ListenedAddressesIter {
pub fn listened_addresses(&self) -> impl ExactSizeIterator<Item = &Multiaddr> { self.listened_addrs.to_vec().into_iter()
self.listened_addrs.iter()
} }
/// Returns the list of the addresses nodes can use to reach us. fn external_addresses(&self) -> Self::ExternalAddressesIter {
pub fn external_addresses(&self) -> impl ExactSizeIterator<Item = &Multiaddr> { self.external_addrs.clone().into_iter()
self.external_addrs.clone()
} }
/// Returns the peer id of the local node. fn local_peer_id(&self) -> &PeerId {
pub fn local_peer_id(&self) -> &PeerId {
self.local_peer_id self.local_peer_id
} }
} }
@ -515,7 +510,7 @@ mod tests {
fn inject_node_event(&mut self, _: PeerId, fn inject_node_event(&mut self, _: PeerId,
_: <Self::ProtocolsHandler as ProtocolsHandler>::OutEvent) {} _: <Self::ProtocolsHandler as ProtocolsHandler>::OutEvent) {}
fn poll(&mut self, _: &mut PollParameters<'_>) -> fn poll(&mut self, _: &mut impl PollParameters) ->
Async<NetworkBehaviourAction<<Self::ProtocolsHandler as Async<NetworkBehaviourAction<<Self::ProtocolsHandler as
ProtocolsHandler>::InEvent, Self::OutEvent>> ProtocolsHandler>::InEvent, Self::OutEvent>>
{ {

View File

@ -123,7 +123,7 @@ where
} }
} }
fn poll(&mut self, params: &mut PollParameters<'_>) fn poll(&mut self, params: &mut impl PollParameters)
-> Async<NetworkBehaviourAction<<<Self::ProtocolsHandler as IntoProtocolsHandler>::Handler as ProtocolsHandler>::InEvent, Self::OutEvent>> -> Async<NetworkBehaviourAction<<<Self::ProtocolsHandler as IntoProtocolsHandler>::Handler as ProtocolsHandler>::InEvent, Self::OutEvent>>
{ {
if let Some(inner) = self.inner.as_mut() { if let Some(inner) = self.inner.as_mut() {

View File

@ -477,7 +477,7 @@ fn build_struct(ast: &DeriveInput, data_struct: &DataStruct) -> TokenStream {
} }
} }
fn poll(&mut self, poll_params: &mut #poll_parameters) -> ::libp2p::futures::Async<#network_behaviour_action<<<Self::ProtocolsHandler as #into_protocols_handler>::Handler as #protocols_handler>::InEvent, Self::OutEvent>> { fn poll(&mut self, poll_params: &mut impl #poll_parameters) -> ::libp2p::futures::Async<#network_behaviour_action<<<Self::ProtocolsHandler as #into_protocols_handler>::Handler as #protocols_handler>::InEvent, Self::OutEvent>> {
use libp2p::futures::prelude::*; use libp2p::futures::prelude::*;
#(#poll_stmts)* #(#poll_stmts)*
let f: ::libp2p::futures::Async<#network_behaviour_action<<<Self::ProtocolsHandler as #into_protocols_handler>::Handler as #protocols_handler>::InEvent, Self::OutEvent>> = #poll_method; let f: ::libp2p::futures::Async<#network_behaviour_action<<<Self::ProtocolsHandler as #into_protocols_handler>::Handler as #protocols_handler>::InEvent, Self::OutEvent>> = #poll_method;

View File

@ -172,7 +172,7 @@ where
fn poll( fn poll(
&mut self, &mut self,
params: &mut PollParameters<'_>, params: &mut impl PollParameters,
) -> Async< ) -> Async<
NetworkBehaviourAction< NetworkBehaviourAction<
<Self::ProtocolsHandler as ProtocolsHandler>::InEvent, <Self::ProtocolsHandler as ProtocolsHandler>::InEvent,
@ -214,7 +214,7 @@ where
MdnsPacket::Query(query) => { MdnsPacket::Query(query) => {
let _ = query.respond( let _ = query.respond(
params.local_peer_id().clone(), params.local_peer_id().clone(),
params.listened_addresses().cloned(), params.listened_addresses(),
Duration::from_secs(5 * 60) Duration::from_secs(5 * 60)
); );
}, },

View File

@ -337,7 +337,7 @@ where
fn poll( fn poll(
&mut self, &mut self,
_: &mut PollParameters<'_>, _: &mut impl PollParameters,
) -> Async< ) -> Async<
NetworkBehaviourAction< NetworkBehaviourAction<
<Self::ProtocolsHandler as ProtocolsHandler>::InEvent, <Self::ProtocolsHandler as ProtocolsHandler>::InEvent,

View File

@ -129,7 +129,7 @@ where
fn poll( fn poll(
&mut self, &mut self,
params: &mut PollParameters<'_>, params: &mut impl PollParameters,
) -> Async< ) -> Async<
NetworkBehaviourAction< NetworkBehaviourAction<
<Self::ProtocolsHandler as ProtocolsHandler>::InEvent, <Self::ProtocolsHandler as ProtocolsHandler>::InEvent,
@ -145,11 +145,11 @@ where
// There's not much we can do to solve this conflict except strip non-UTF-8 characters. // There's not much we can do to solve this conflict except strip non-UTF-8 characters.
let protocols = params let protocols = params
.supported_protocols() .supported_protocols()
.map(|p| String::from_utf8_lossy(p).to_string()) .map(|p| String::from_utf8_lossy(&p).to_string())
.collect(); .collect();
let mut listen_addrs: Vec<_> = params.external_addresses().cloned().collect(); let mut listen_addrs: Vec<_> = params.external_addresses().collect();
listen_addrs.extend(params.listened_addresses().cloned()); listen_addrs.extend(params.listened_addresses());
let send_back_info = IdentifyInfo { let send_back_info = IdentifyInfo {
public_key: self.local_public_key.clone(), public_key: self.local_public_key.clone(),

View File

@ -824,7 +824,7 @@ where
fn poll( fn poll(
&mut self, &mut self,
parameters: &mut PollParameters<'_>, parameters: &mut impl PollParameters,
) -> Async< ) -> Async<
NetworkBehaviourAction< NetworkBehaviourAction<
<Self::ProtocolsHandler as ProtocolsHandler>::InEvent, <Self::ProtocolsHandler as ProtocolsHandler>::InEvent,
@ -964,7 +964,7 @@ where
key: target.clone(), key: target.clone(),
provider_peer: KadPeer { provider_peer: KadPeer {
node_id: parameters.local_peer_id().clone(), node_id: parameters.local_peer_id().clone(),
multiaddrs: parameters.external_addresses().cloned().collect(), multiaddrs: parameters.external_addresses().collect(),
connection_ty: KadConnectionType::Connected, connection_ty: KadConnectionType::Connected,
} }
}, },

View File

@ -116,7 +116,7 @@ where
self.events.push_front(PingEvent { peer, result }) self.events.push_front(PingEvent { peer, result })
} }
fn poll(&mut self, _: &mut PollParameters<'_>) -> Async<NetworkBehaviourAction<Void, PingEvent>> fn poll(&mut self, _: &mut impl PollParameters) -> Async<NetworkBehaviourAction<Void, PingEvent>>
{ {
if let Some(e) = self.events.pop_back() { if let Some(e) = self.events.pop_back() {
Async::Ready(NetworkBehaviourAction::GenerateEvent(e)) Async::Ready(NetworkBehaviourAction::GenerateEvent(e))