xmtp_api_d14n/protocol/extractors/
timestamp.rs

1//! Extractor for an MLS Data field
2//! useful for verifying a message has been read or maybe duplicates.
3use chrono::Utc;
4use xmtp_proto::ConversionError;
5use xmtp_proto::mls_v1::welcome_message::WelcomePointer;
6use xmtp_proto::xmtp::mls::api::v1::{
7    group_message::V1 as V3GroupMessage, welcome_message::V1 as V3WelcomeMessage,
8};
9use xmtp_proto::xmtp::xmtpv4::envelopes::UnsignedOriginatorEnvelope;
10
11use crate::protocol::{EnvelopeVisitor, Extractor};
12
13/// Extract Mls Data from Envelopes
14#[derive(Default, Clone, Debug)]
15pub struct TimestampExtractor {
16    time: Option<i64>,
17}
18
19impl TimestampExtractor {
20    pub fn new() -> Self {
21        Default::default()
22    }
23}
24
25impl Extractor for TimestampExtractor {
26    type Output = Option<chrono::DateTime<Utc>>;
27
28    fn get(self) -> Self::Output {
29        self.time.map(chrono::DateTime::from_timestamp_nanos)
30    }
31}
32
33impl EnvelopeVisitor<'_> for TimestampExtractor {
34    type Error = ConversionError;
35
36    fn visit_unsigned_originator(
37        &mut self,
38        e: &UnsignedOriginatorEnvelope,
39    ) -> Result<(), Self::Error> {
40        self.time = Some(e.originator_ns);
41        Ok(())
42    }
43
44    fn visit_v3_group_message(&mut self, message: &V3GroupMessage) -> Result<(), Self::Error> {
45        self.time = Some(message.created_ns as i64);
46        Ok(())
47    }
48
49    fn visit_v3_welcome_message(&mut self, message: &V3WelcomeMessage) -> Result<(), Self::Error> {
50        self.time = Some(message.created_ns as i64);
51        Ok(())
52    }
53    fn visit_v3_welcome_pointer(&mut self, ptr: &WelcomePointer) -> Result<(), Self::Error> {
54        self.time = Some(ptr.created_ns as i64);
55        Ok(())
56    }
57}