1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
4pub enum ImEvent {
5 ConnectionStateChanged(ConnectionStateChanged),
6 MessageReceived(MessageReceivedEvent),
7 MessageUpdated(MessageUpdatedEvent),
8 GroupUpdated(GroupUpdatedEvent),
9 LocalNotification(LocalNotificationEvent),
10 HostNotification(HostNotificationEvent),
11 UnknownNotification(UnknownNotificationEvent),
12}
13
14#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
15pub struct ConnectionStateChanged {
16 pub state: super::RealtimeConnectionState,
17 pub reason: Option<String>,
18}
19
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
21pub struct MessageReceivedEvent {
22 pub message: crate::messages::Message,
23 #[serde(default, skip_serializing_if = "Option::is_none")]
24 pub attachment_summary: Option<AttachmentMessageSummary>,
25 #[serde(default, skip_serializing_if = "Option::is_none")]
26 pub download_action: Option<AttachmentDownloadAction>,
27 #[serde(default, skip_serializing_if = "Option::is_none")]
28 pub sync: Option<RealtimeSyncHint>,
29 #[serde(default, skip_serializing_if = "Vec::is_empty")]
30 pub warnings: Vec<String>,
31}
32
33#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
34pub struct AttachmentMessageSummary {
35 #[serde(default, skip_serializing_if = "Option::is_none")]
36 pub attachment_id: Option<String>,
37 #[serde(default, skip_serializing_if = "Option::is_none")]
38 pub filename: Option<String>,
39 #[serde(default, skip_serializing_if = "Option::is_none")]
40 pub mime_type: Option<String>,
41 #[serde(default, skip_serializing_if = "Option::is_none")]
42 pub size_bytes: Option<u64>,
43 #[serde(default, skip_serializing_if = "Option::is_none")]
44 pub content_type: Option<String>,
45}
46
47#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
48pub struct AttachmentDownloadAction {
49 pub thread: crate::messages::ThreadRef,
50 pub message_id: crate::ids::MessageId,
51 #[serde(default, skip_serializing_if = "Option::is_none")]
52 pub attachment_id: Option<String>,
53}
54
55#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
56pub struct MessageUpdatedEvent {
57 pub message_id: crate::ids::MessageId,
58 pub thread: crate::messages::ThreadRef,
59 pub update_kind: MessageUpdateKind,
60 #[serde(default, skip_serializing_if = "Option::is_none")]
61 pub sync: Option<RealtimeSyncHint>,
62}
63
64#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
65pub enum MessageUpdateKind {
66 Read,
67 DeliveryStateChanged,
68 Unknown,
69}
70
71#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
72pub struct GroupUpdatedEvent {
73 pub group: crate::ids::GroupRef,
74 pub update_kind: GroupUpdateKind,
75 #[serde(default, skip_serializing_if = "Option::is_none")]
76 pub event_type: Option<String>,
77 #[serde(default, skip_serializing_if = "Option::is_none")]
78 pub group_event_seq: Option<i64>,
79 #[serde(default, skip_serializing_if = "Option::is_none")]
80 pub group_state_version: Option<String>,
81 #[serde(default, skip_serializing_if = "Option::is_none")]
82 pub actor_did: Option<String>,
83 #[serde(default, skip_serializing_if = "Option::is_none")]
84 pub subject_did: Option<String>,
85 #[serde(default, skip_serializing_if = "Option::is_none")]
86 pub membership_status: Option<String>,
87 #[serde(default, skip_serializing_if = "Option::is_none")]
88 pub changed_at: Option<String>,
89 #[serde(default, skip_serializing_if = "Option::is_none")]
90 pub sync: Option<RealtimeSyncHint>,
91}
92
93#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
94pub enum GroupUpdateKind {
95 Created,
96 Updated,
97 MemberAdded,
98 MemberRemoved,
99 MessageAdded,
100 Unknown,
101}
102
103#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
104pub struct LocalNotificationEvent {
105 pub notification_id: Option<String>,
106 pub title: Option<String>,
107 pub body: Option<String>,
108 pub source: Option<String>,
109}
110
111#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
112pub struct HostNotificationEvent {
113 pub event_type: HostNotificationKind,
114 pub title: Option<String>,
115 pub body: Option<String>,
116 pub thread: Option<crate::messages::ThreadRef>,
117}
118
119#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
120pub enum HostNotificationKind {
121 DirectMessage,
122 GroupMessage,
123 GroupState,
124 Mail,
125 Unknown,
126}
127
128#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
129pub struct UnknownNotificationEvent {
130 pub content_type: Option<String>,
131 pub notification_type: Option<String>,
132 pub reason: String,
133 #[serde(default, skip_serializing_if = "Option::is_none")]
134 pub sync: Option<RealtimeSyncHint>,
135}
136
137#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
138pub struct RealtimeSyncHint {
139 #[serde(default, skip_serializing_if = "Option::is_none")]
140 pub event_id: Option<String>,
141 #[serde(default, skip_serializing_if = "Option::is_none")]
142 pub event_seq: Option<String>,
143 #[serde(default, skip_serializing_if = "Option::is_none")]
144 pub event_type: Option<String>,
145 pub sync_dirty: bool,
146 pub gap_detected: bool,
147}