mirror of
https://github.com/fluencelabs/rust-libp2p
synced 2025-06-29 01:31:33 +00:00
* Addressing #473 ... if I understood the ticket right, we want to pass through whatever the application provides as a topic identifier, leaving hashing (or not hashing) up to the application. * Remove TopicDescriptor and use Topic newtype everywhere * PR feedback Use From<Topic> instead of Into<String> Use impl Into<Topic> instead of Topic in public API Co-authored-by: Peat Bakke <peat@peat.org>
This commit is contained in:
committed by
Pierre Krieger
parent
2ef7c40cda
commit
3b50cbd1b8
@ -19,7 +19,7 @@
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
|
||||
use crate::protocol::{FloodsubConfig, FloodsubMessage, FloodsubRpc, FloodsubSubscription, FloodsubSubscriptionAction};
|
||||
use crate::topic::{Topic, TopicHash};
|
||||
use crate::topic::Topic;
|
||||
use cuckoofilter::CuckooFilter;
|
||||
use fnv::FnvHashSet;
|
||||
use futures::prelude::*;
|
||||
@ -52,7 +52,7 @@ pub struct Floodsub<TSubstream> {
|
||||
/// List of peers the network is connected to, and the topics that they're subscribed to.
|
||||
// TODO: filter out peers that don't support floodsub, so that we avoid hammering them with
|
||||
// opened substreams
|
||||
connected_peers: HashMap<PeerId, SmallVec<[TopicHash; 8]>>,
|
||||
connected_peers: HashMap<PeerId, SmallVec<[Topic; 8]>>,
|
||||
|
||||
// List of topics we're subscribed to. Necessary to filter out messages that we receive
|
||||
// erroneously.
|
||||
@ -85,13 +85,13 @@ impl<TSubstream> Floodsub<TSubstream> {
|
||||
pub fn add_node_to_partial_view(&mut self, peer_id: PeerId) {
|
||||
// Send our topics to this node if we're already connected to it.
|
||||
if self.connected_peers.contains_key(&peer_id) {
|
||||
for topic in self.subscribed_topics.iter() {
|
||||
for topic in self.subscribed_topics.iter().cloned() {
|
||||
self.events.push_back(NetworkBehaviourAction::SendEvent {
|
||||
peer_id: peer_id.clone(),
|
||||
event: FloodsubRpc {
|
||||
messages: Vec::new(),
|
||||
subscriptions: vec![FloodsubSubscription {
|
||||
topic: topic.hash().clone(),
|
||||
topic,
|
||||
action: FloodsubSubscriptionAction::Subscribe,
|
||||
}],
|
||||
},
|
||||
@ -116,7 +116,7 @@ impl<TSubstream> Floodsub<TSubstream> {
|
||||
///
|
||||
/// Returns true if the subscription worked. Returns false if we were already subscribed.
|
||||
pub fn subscribe(&mut self, topic: Topic) -> bool {
|
||||
if self.subscribed_topics.iter().any(|t| t.hash() == topic.hash()) {
|
||||
if self.subscribed_topics.iter().any(|t| t.id() == topic.id()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -126,7 +126,7 @@ impl<TSubstream> Floodsub<TSubstream> {
|
||||
event: FloodsubRpc {
|
||||
messages: Vec::new(),
|
||||
subscriptions: vec![FloodsubSubscription {
|
||||
topic: topic.hash().clone(),
|
||||
topic: topic.clone(),
|
||||
action: FloodsubSubscriptionAction::Subscribe,
|
||||
}],
|
||||
},
|
||||
@ -139,12 +139,11 @@ impl<TSubstream> Floodsub<TSubstream> {
|
||||
|
||||
/// Unsubscribes from a topic.
|
||||
///
|
||||
/// Note that this only requires a `TopicHash` and not a full `Topic`.
|
||||
/// Note that this only requires the topic name.
|
||||
///
|
||||
/// Returns true if we were subscribed to this topic.
|
||||
pub fn unsubscribe(&mut self, topic: impl AsRef<TopicHash>) -> bool {
|
||||
let topic = topic.as_ref();
|
||||
let pos = match self.subscribed_topics.iter().position(|t| t.hash() == topic) {
|
||||
pub fn unsubscribe(&mut self, topic: Topic) -> bool {
|
||||
let pos = match self.subscribed_topics.iter().position(|t| *t == topic) {
|
||||
Some(pos) => pos,
|
||||
None => return false
|
||||
};
|
||||
@ -168,12 +167,12 @@ impl<TSubstream> Floodsub<TSubstream> {
|
||||
}
|
||||
|
||||
/// Publishes a message to the network, if we're subscribed to the topic only.
|
||||
pub fn publish(&mut self, topic: impl Into<TopicHash>, data: impl Into<Vec<u8>>) {
|
||||
pub fn publish(&mut self, topic: impl Into<Topic>, data: impl Into<Vec<u8>>) {
|
||||
self.publish_many(iter::once(topic), data)
|
||||
}
|
||||
|
||||
/// Publishes a message to the network, even if we're not subscribed to the topic.
|
||||
pub fn publish_any(&mut self, topic: impl Into<TopicHash>, data: impl Into<Vec<u8>>) {
|
||||
pub fn publish_any(&mut self, topic: impl Into<Topic>, data: impl Into<Vec<u8>>) {
|
||||
self.publish_many_any(iter::once(topic), data)
|
||||
}
|
||||
|
||||
@ -181,16 +180,16 @@ impl<TSubstream> Floodsub<TSubstream> {
|
||||
///
|
||||
///
|
||||
/// > **Note**: Doesn't do anything if we're not subscribed to any of the topics.
|
||||
pub fn publish_many(&mut self, topic: impl IntoIterator<Item = impl Into<TopicHash>>, data: impl Into<Vec<u8>>) {
|
||||
pub fn publish_many(&mut self, topic: impl IntoIterator<Item = impl Into<Topic>>, data: impl Into<Vec<u8>>) {
|
||||
self.publish_many_inner(topic, data, true)
|
||||
}
|
||||
|
||||
/// Publishes a message with multiple topics to the network, even if we're not subscribed to any of the topics.
|
||||
pub fn publish_many_any(&mut self, topic: impl IntoIterator<Item = impl Into<TopicHash>>, data: impl Into<Vec<u8>>) {
|
||||
pub fn publish_many_any(&mut self, topic: impl IntoIterator<Item = impl Into<Topic>>, data: impl Into<Vec<u8>>) {
|
||||
self.publish_many_inner(topic, data, false)
|
||||
}
|
||||
|
||||
fn publish_many_inner(&mut self, topic: impl IntoIterator<Item = impl Into<TopicHash>>, data: impl Into<Vec<u8>>, check_self_subscriptions: bool) {
|
||||
fn publish_many_inner(&mut self, topic: impl IntoIterator<Item = impl Into<Topic>>, data: impl Into<Vec<u8>>, check_self_subscriptions: bool) {
|
||||
let message = FloodsubMessage {
|
||||
source: self.local_peer_id.clone(),
|
||||
data: data.into(),
|
||||
@ -198,10 +197,10 @@ impl<TSubstream> Floodsub<TSubstream> {
|
||||
// with packets with the predetermined sequence numbers and absorb our legitimate
|
||||
// messages. We therefore use a random number.
|
||||
sequence_number: rand::random::<[u8; 20]>().to_vec(),
|
||||
topics: topic.into_iter().map(|t| t.into().clone()).collect(),
|
||||
topics: topic.into_iter().map(Into::into).collect(),
|
||||
};
|
||||
|
||||
let self_subscribed = self.subscribed_topics.iter().any(|t| message.topics.iter().any(|u| t.hash() == u));
|
||||
let self_subscribed = self.subscribed_topics.iter().any(|t| message.topics.iter().any(|u| t == u));
|
||||
if self_subscribed {
|
||||
self.received.add(&message);
|
||||
}
|
||||
@ -246,13 +245,13 @@ where
|
||||
fn inject_connected(&mut self, id: PeerId, _: ConnectedPoint) {
|
||||
// We need to send our subscriptions to the newly-connected node.
|
||||
if self.target_peers.contains(&id) {
|
||||
for topic in self.subscribed_topics.iter() {
|
||||
for topic in self.subscribed_topics.iter().cloned() {
|
||||
self.events.push_back(NetworkBehaviourAction::SendEvent {
|
||||
peer_id: id.clone(),
|
||||
event: FloodsubRpc {
|
||||
messages: Vec::new(),
|
||||
subscriptions: vec![FloodsubSubscription {
|
||||
topic: topic.hash().clone(),
|
||||
topic,
|
||||
action: FloodsubSubscriptionAction::Subscribe,
|
||||
}],
|
||||
},
|
||||
@ -323,7 +322,7 @@ where
|
||||
}
|
||||
|
||||
// Add the message to be dispatched to the user.
|
||||
if self.subscribed_topics.iter().any(|t| message.topics.iter().any(|u| t.hash() == u)) {
|
||||
if self.subscribed_topics.iter().any(|t| message.topics.iter().any(|u| t == u)) {
|
||||
let event = FloodsubEvent::Message(message.clone());
|
||||
self.events.push_back(NetworkBehaviourAction::GenerateEvent(event));
|
||||
}
|
||||
@ -408,7 +407,7 @@ pub enum FloodsubEvent {
|
||||
/// Remote that has subscribed.
|
||||
peer_id: PeerId,
|
||||
/// The topic it has subscribed to.
|
||||
topic: TopicHash,
|
||||
topic: Topic,
|
||||
},
|
||||
|
||||
/// A remote unsubscribed from a topic.
|
||||
@ -416,6 +415,6 @@ pub enum FloodsubEvent {
|
||||
/// Remote that has unsubscribed.
|
||||
peer_id: PeerId,
|
||||
/// The topic it has subscribed from.
|
||||
topic: TopicHash,
|
||||
topic: Topic,
|
||||
},
|
||||
}
|
||||
|
Reference in New Issue
Block a user