opentalk_types_signaling_e2ee/
lib.rs1use bytes::Bytes;
6use opentalk_types_common::modules::{ModuleId, module_id};
7use opentalk_types_signaling::ParticipantId;
8
9pub const MODULE_ID: ModuleId = module_id!("e2ee");
10
11#[derive(Debug, Clone)]
12#[cfg_attr(
13 feature = "serde",
14 derive(serde::Deserialize),
15 serde(rename_all = "snake_case", tag = "action")
16)]
17pub enum E2eeCommand {
18 Invite(Invite),
19 Message(MlsMessages),
20}
21
22#[derive(Debug, Clone)]
23#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
24pub struct Invite {
25 pub invitee: ParticipantId,
26 pub welcome_message: WelcomeMessage,
27 pub mls_messages: MlsMessages,
29}
30
31#[derive(Debug, Clone, PartialEq, Eq)]
33#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
34pub struct MlsMessages {
35 pub payload: Vec<Bytes>,
36}
37
38impl MlsMessages {
39 pub fn is_valid(&self) -> bool {
40 !self.payload.is_empty()
41 }
42}
43
44#[derive(Debug, Clone, PartialEq, Eq)]
46#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
47pub struct WelcomeMessage {
48 pub welcome: Bytes,
49 pub ratchet_tree: Bytes,
50}
51
52impl WelcomeMessage {
53 pub fn is_valid(&self) -> bool {
54 !self.welcome.is_empty() && !self.ratchet_tree.is_empty()
55 }
56}
57
58#[cfg_attr(
59 feature = "serde",
60 derive(serde::Serialize, serde::Deserialize),
61 serde(rename_all = "snake_case", tag = "message")
62)]
63#[derive(Debug, Clone, PartialEq, Eq)]
64pub enum E2eeEvent {
65 Welcome(WelcomeMessage),
66 MlsMessages(MlsMessages),
67 ParticipantLeft { participant_id: ParticipantId },
70 Error(Error),
71}
72
73#[derive(Debug, Clone, PartialEq, Eq)]
74#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
75pub enum Error {
76 InvalidParticipantTarget,
78 InvalidInvite,
80}