keri_controller/identifier/mechanics/
watcher_configuration.rs1use 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 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 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 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}