mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-23 23:01:33 +00:00
feat(mdns): change mdns::Event
to hold Vec
In previous PR #3606 we've made `mdns::Event` `Clone`, but cloning single-use iterators doesn't sound right. Also you have to create an iterator from the actual data returned before putting it into events. So in this PR the iterators are replaced by `Vec`, as it's the type the data originally come from. Related #3612. Pull-Request: #3621.
This commit is contained in:
@ -285,7 +285,7 @@ where
|
||||
}
|
||||
}
|
||||
// Emit discovered event.
|
||||
let mut discovered = SmallVec::<[(PeerId, Multiaddr); 4]>::new();
|
||||
let mut discovered = Vec::new();
|
||||
for iface_state in self.iface_states.values_mut() {
|
||||
while let Poll::Ready((peer, addr, expiration)) =
|
||||
iface_state.poll(cx, &self.listen_addresses)
|
||||
@ -304,15 +304,13 @@ where
|
||||
}
|
||||
}
|
||||
if !discovered.is_empty() {
|
||||
let event = Event::Discovered(DiscoveredAddrsIter {
|
||||
inner: discovered.into_iter(),
|
||||
});
|
||||
let event = Event::Discovered(discovered);
|
||||
return Poll::Ready(ToSwarm::GenerateEvent(event));
|
||||
}
|
||||
// Emit expired event.
|
||||
let now = Instant::now();
|
||||
let mut closest_expiration = None;
|
||||
let mut expired = SmallVec::<[(PeerId, Multiaddr); 4]>::new();
|
||||
let mut expired = Vec::new();
|
||||
self.discovered_nodes.retain(|(peer, addr, expiration)| {
|
||||
if *expiration <= now {
|
||||
log::info!("expired: {} {}", peer, addr);
|
||||
@ -323,9 +321,7 @@ where
|
||||
true
|
||||
});
|
||||
if !expired.is_empty() {
|
||||
let event = Event::Expired(ExpiredAddrsIter {
|
||||
inner: expired.into_iter(),
|
||||
});
|
||||
let event = Event::Expired(expired);
|
||||
return Poll::Ready(ToSwarm::GenerateEvent(event));
|
||||
}
|
||||
if let Some(closest_expiration) = closest_expiration {
|
||||
@ -342,67 +338,11 @@ where
|
||||
#[derive(Debug, Clone)]
|
||||
pub enum Event {
|
||||
/// Discovered nodes through mDNS.
|
||||
Discovered(DiscoveredAddrsIter),
|
||||
Discovered(Vec<(PeerId, Multiaddr)>),
|
||||
|
||||
/// The given combinations of `PeerId` and `Multiaddr` have expired.
|
||||
///
|
||||
/// Each discovered record has a time-to-live. When this TTL expires and the address hasn't
|
||||
/// been refreshed, we remove it from the list and emit it as an `Expired` event.
|
||||
Expired(ExpiredAddrsIter),
|
||||
}
|
||||
|
||||
/// Iterator that produces the list of addresses that have been discovered.
|
||||
#[derive(Clone)]
|
||||
pub struct DiscoveredAddrsIter {
|
||||
inner: smallvec::IntoIter<[(PeerId, Multiaddr); 4]>,
|
||||
}
|
||||
|
||||
impl Iterator for DiscoveredAddrsIter {
|
||||
type Item = (PeerId, Multiaddr);
|
||||
|
||||
#[inline]
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
self.inner.next()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
self.inner.size_hint()
|
||||
}
|
||||
}
|
||||
|
||||
impl ExactSizeIterator for DiscoveredAddrsIter {}
|
||||
|
||||
impl fmt::Debug for DiscoveredAddrsIter {
|
||||
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fmt.debug_struct("DiscoveredAddrsIter").finish()
|
||||
}
|
||||
}
|
||||
|
||||
/// Iterator that produces the list of addresses that have expired.
|
||||
#[derive(Clone)]
|
||||
pub struct ExpiredAddrsIter {
|
||||
inner: smallvec::IntoIter<[(PeerId, Multiaddr); 4]>,
|
||||
}
|
||||
|
||||
impl Iterator for ExpiredAddrsIter {
|
||||
type Item = (PeerId, Multiaddr);
|
||||
|
||||
#[inline]
|
||||
fn next(&mut self) -> Option<Self::Item> {
|
||||
self.inner.next()
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn size_hint(&self) -> (usize, Option<usize>) {
|
||||
self.inner.size_hint()
|
||||
}
|
||||
}
|
||||
|
||||
impl ExactSizeIterator for ExpiredAddrsIter {}
|
||||
|
||||
impl fmt::Debug for ExpiredAddrsIter {
|
||||
fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||
fmt.debug_struct("ExpiredAddrsIter").finish()
|
||||
}
|
||||
Expired(Vec<(PeerId, Multiaddr)>),
|
||||
}
|
||||
|
Reference in New Issue
Block a user