xmtp_api_d14n/protocol/extractors/
data.rs

1//! Extractor for an MLS Data field
2//! useful for verifying a message has been read or maybe duplicates.
3use xmtp_common::sha256_bytes;
4use xmtp_proto::ConversionError;
5use xmtp_proto::mls_v1::group_message_input::V1 as GroupMessageV1;
6use xmtp_proto::mls_v1::welcome_message_input::V1 as WelcomeMessageV1;
7use xmtp_proto::xmtp::mls::api::v1::{
8    group_message::V1 as V3GroupMessage, welcome_message::V1 as V3WelcomeMessage,
9};
10
11use crate::protocol::{EnvelopeVisitor, Extractor};
12
13/// Extract Mls Data from Envelopes
14#[derive(Default, Clone, Debug)]
15pub struct MlsDataExtractor {
16    data: Option<Vec<u8>>,
17}
18
19impl MlsDataExtractor {
20    pub fn new() -> Self {
21        Default::default()
22    }
23
24    pub fn get_sha256(self) -> <Self as Extractor>::Output {
25        let data = self.get()?;
26        // should be a smallvec type, or a [u8; 32];
27        Ok(sha256_bytes(&data))
28    }
29}
30
31impl Extractor for MlsDataExtractor {
32    type Output = Result<Vec<u8>, ConversionError>;
33
34    fn get(self) -> Self::Output {
35        self.data.ok_or(ConversionError::Missing {
36            item: "MlsDataEnvelope",
37            r#type: std::any::type_name::<Vec<u8>>(),
38        })
39    }
40}
41
42impl EnvelopeVisitor<'_> for MlsDataExtractor {
43    type Error = ConversionError;
44
45    fn visit_welcome_message_v1(&mut self, message: &WelcomeMessageV1) -> Result<(), Self::Error> {
46        self.data = Some(message.data.clone());
47        Ok(())
48    }
49
50    fn visit_group_message_v1(&mut self, message: &GroupMessageV1) -> Result<(), Self::Error> {
51        self.data = Some(message.data.clone());
52        Ok(())
53    }
54
55    fn visit_v3_group_message(&mut self, message: &V3GroupMessage) -> Result<(), Self::Error> {
56        self.data = Some(message.data.clone());
57        Ok(())
58    }
59
60    fn visit_v3_welcome_message(&mut self, message: &V3WelcomeMessage) -> Result<(), Self::Error> {
61        self.data = Some(message.data.clone());
62        Ok(())
63    }
64}