Skip to main content

keri_controller/identifier/mechanics/
notify_witness.rs

1use futures::future::join_all;
2
3use crate::identifier::Identifier;
4
5use super::MechanicsError;
6
7impl Identifier {
8    pub async fn notify_witnesses(&mut self) -> Result<usize, MechanicsError> {
9        let mut n = 0;
10        let to_notify = self.to_notify.iter().filter_map(|ev| {
11            // Elect the leader
12            // Leader is identifier with minimal index among all participants who
13            // sign event. He will send message to witness.
14            let id_idx = self.get_index(&ev.event_message.data).unwrap_or_default();
15            let min_sig_idx =
16                ev.signatures
17                    .iter()
18                    .map(|at| at.index.current())
19                    .min()
20                    .expect("event should have at least one signature") as usize;
21            if min_sig_idx == id_idx {
22                let witnesses = self
23                    .known_events
24                    .find_witnesses_at_event(&ev.event_message)
25                    .expect("Can't find witnesses");
26                n += 1;
27                Some(self.communication.publish(witnesses, &ev))
28            } else {
29                None
30            }
31        });
32        join_all(to_notify).await;
33        self.to_notify.clear();
34
35        Ok(n)
36    }
37}