p2p/channels/signaling/
mod.rs1pub mod discovery;
19pub mod exchange;
20
21mod p2p_channels_signaling_state;
22pub use p2p_channels_signaling_state::*;
23
24use std::collections::BTreeSet;
25
26use discovery::P2pChannelsSignalingDiscoveryAction;
27
28impl crate::P2pState {
29 pub(super) fn webrtc_discovery_respond_with_availble_peers<Action, State>(
30 &self,
31 dispatcher: &mut redux::Dispatcher<Action, State>,
32 time: redux::Timestamp,
33 ) where
34 State: crate::P2pStateTrait,
35 Action: crate::P2pActionTrait<State>,
36 {
37 let (mut available_peers, requests) = self.ready_peers_iter().fold(
38 (BTreeSet::new(), BTreeSet::new()),
39 |(mut available, mut requests), (peer_id, peer)| {
40 if peer.channels.signaling.is_looking_for_incoming_peer() {
41 available.insert(peer_id);
42 }
43 if peer.channels.signaling.is_looking_for_peer() {
44 requests.insert(peer_id);
45 } else if let Some(peer_id) = peer.channels.signaling.sent_discovered_peer_id() {
46 available.remove(&peer_id);
47 }
48 (available, requests)
49 },
50 );
51
52 use rand::prelude::*;
54 let mut rng = rand::rngs::StdRng::seed_from_u64(time.into());
55 let mut available_peers_ordered = available_peers.iter().copied().collect::<Vec<_>>();
56 available_peers_ordered.shuffle(&mut rng);
57
58 for &requester in requests {
59 if available_peers.is_empty() {
60 break;
61 }
62 for &&target_peer_id in &available_peers_ordered {
63 if target_peer_id == requester || !available_peers.contains(&target_peer_id) {
64 continue;
65 }
66 let action = P2pChannelsSignalingDiscoveryAction::DiscoveredSend {
67 peer_id: requester,
68 target_public_key: target_peer_id.to_public_key().unwrap(),
69 };
70 if redux::EnablingCondition::is_enabled(&action, self, time) {
71 dispatcher.push(action);
72 available_peers.remove(&target_peer_id);
73 }
74 }
75 }
76 }
77}