Skip to main content

keri_controller/identifier/mechanics/
watcher_configuration.rs

1use keri_core::{
2    actor::event_generator,
3    event_message::cesr_adapter::{parse_event_type, EventType},
4    oobi::{Role, Scheme},
5    prefix::{IdentifierPrefix, SelfSigningPrefix},
6    query::reply_event::{ReplyEvent, ReplyRoute},
7};
8
9use crate::identifier::Identifier;
10
11use super::MechanicsError;
12
13impl Identifier {
14    /// Generates reply event with `end_role_add` route.
15    pub fn add_watcher(&self, watcher_id: IdentifierPrefix) -> Result<String, MechanicsError> {
16        String::from_utf8(
17            event_generator::generate_end_role(&self.id, &watcher_id, Role::Watcher, true)
18                .encode()?,
19        )
20        .map_err(|_e| MechanicsError::EventFormatError)
21    }
22
23    /// Generates reply event with `end_role_cut` route.
24    pub fn remove_watcher(&self, watcher_id: IdentifierPrefix) -> Result<String, MechanicsError> {
25        String::from_utf8(
26            event_generator::generate_end_role(&self.id, &watcher_id, Role::Watcher, false)
27                .encode()?,
28        )
29        .map_err(|_e| MechanicsError::EventFormatError)
30    }
31
32    async fn finalize_add_role(
33        &self,
34        signer_prefix: &IdentifierPrefix,
35        event: ReplyEvent,
36        sig: Vec<SelfSigningPrefix>,
37    ) -> Result<(), MechanicsError> {
38        let (dest_identifier, messages_to_send) =
39            self.known_events
40                .finalize_add_role(signer_prefix, event, sig)?;
41        // TODO: send in one request
42        for ev in messages_to_send {
43            self.communication
44                .send_message_to(dest_identifier.clone(), Scheme::Http, ev)
45                .await?;
46        }
47        Ok(())
48    }
49
50    pub async fn finalize_add_watcher(
51        &self,
52        event: &[u8],
53        sig: SelfSigningPrefix,
54    ) -> Result<(), MechanicsError> {
55        let parsed_event =
56            parse_event_type(event).map_err(|_e| MechanicsError::EventFormatError)?;
57        match parsed_event {
58            EventType::Rpy(rpy) => match rpy.get_route() {
59                ReplyRoute::EndRoleAdd(_) => {
60                    Ok(self.finalize_add_role(&self.id, rpy, vec![sig]).await?)
61                }
62                ReplyRoute::EndRoleCut(_) => todo!(),
63                _ => Err(MechanicsError::WrongEventTypeError),
64            },
65            _ => Err(MechanicsError::WrongEventTypeError),
66        }
67    }
68}