1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
4pub struct SecureOutboxId(String);
5
6impl SecureOutboxId {
7 pub fn parse(input: impl AsRef<str>) -> crate::ImResult<Self> {
8 let value = input.as_ref().trim();
9 if value.is_empty() {
10 return Err(crate::ImError::invalid_input(
11 Some("outbox_id".to_owned()),
12 "outbox_id must not be empty",
13 ));
14 }
15 Ok(Self(value.to_owned()))
16 }
17
18 pub fn as_str(&self) -> &str {
19 &self.0
20 }
21}
22
23#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
24pub struct DirectSecureStatus {
25 pub peer: crate::ids::PeerRef,
26 pub resolved_peer: Option<crate::ids::Did>,
27 pub state: DirectSecureState,
28 pub can_send_secure: bool,
29 pub pending_outbox_count: u32,
30 pub problem: Option<SecureProblem>,
31 pub warnings: Vec<String>,
32}
33
34#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
35pub enum DirectSecureState {
36 Ready,
37 Preparing,
38 WaitingForPeer,
39 NeedsRepair,
40 Unavailable,
41 Unknown,
42}
43
44#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
45pub struct DirectSecurePrepareResult {
46 pub peer: crate::ids::PeerRef,
47 pub state: DirectSecureState,
48 pub can_send_secure: bool,
49 pub warnings: Vec<String>,
50}
51
52#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
53pub struct DirectSecureRepairResult {
54 pub peer: crate::ids::PeerRef,
55 pub state: DirectSecureState,
56 pub repaired: bool,
57 pub problem: Option<SecureProblem>,
58 pub prepared_local_send_state: bool,
59 pub warnings: Vec<String>,
60}
61
62#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
63pub struct GroupSecureStatus {
64 pub group: crate::ids::GroupRef,
65 pub state: GroupSecureState,
66 pub can_send_secure: bool,
67 pub local_readiness: GroupSecureLocalReadiness,
68 pub pending_work: GroupSecurePendingWork,
69 pub problem: Option<SecureProblem>,
70 pub warnings: Vec<String>,
71}
72
73#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
74pub enum GroupSecureState {
75 Ready,
76 Syncing,
77 NeedsRepair,
78 WaitingForMembershipUpdate,
79 MissingLocalState,
80 Unavailable,
81 Unknown,
82}
83
84#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
85pub struct GroupSecureLocalReadiness {
86 pub has_local_state: bool,
87 pub has_active_membership: bool,
88}
89
90#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize, Default)]
91pub struct GroupSecurePendingWork {
92 pub pending_notices: u32,
93 pub pending_commits: u32,
94}
95
96#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
97pub struct GroupSecurePrepareResult {
98 pub group: crate::ids::GroupRef,
99 pub state: GroupSecureState,
100 pub can_send_secure: bool,
101 pub warnings: Vec<String>,
102}
103
104#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
105pub struct GroupSecureRepairResult {
106 pub group: crate::ids::GroupRef,
107 pub state: GroupSecureState,
108 pub repaired: bool,
109 pub problem: Option<SecureProblem>,
110 pub warnings: Vec<String>,
111}
112
113#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
114pub struct SecureOutboxEntry {
115 pub id: SecureOutboxId,
116 pub target: crate::messages::MessageTarget,
117 pub message_kind: String,
118 pub status: SecureOutboxStatus,
119 pub attempt_count: u32,
120 pub last_error: Option<SecureProblem>,
121 pub created_at: Option<String>,
122 pub updated_at: Option<String>,
123}
124
125#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
126pub enum SecureOutboxStatus {
127 Queued,
128 Sending,
129 Failed,
130 Sent,
131 Dropped,
132}
133
134#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
135pub struct SecureOutboxResult {
136 pub id: SecureOutboxId,
137 pub status: SecureOutboxStatus,
138 pub delivery: Option<SecureDelivery>,
139 pub warnings: Vec<String>,
140}
141
142#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
143pub struct SecureDelivery {
144 pub message_id: Option<crate::ids::MessageId>,
145 pub state: crate::messages::DeliveryState,
146}
147
148#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
149pub struct SecureProblem {
150 pub code: SecureProblemCode,
151 pub message: String,
152 pub retryable: bool,
153}
154
155impl SecureProblem {
156 pub(crate) fn peer_not_found() -> Self {
157 Self {
158 code: SecureProblemCode::PeerNotFound,
159 message: "peer did is not available in local directory cache".to_owned(),
160 retryable: true,
161 }
162 }
163
164 pub(crate) fn peer_keys_unavailable(message: impl Into<String>, retryable: bool) -> Self {
165 Self {
166 code: SecureProblemCode::PeerKeysUnavailable,
167 message: message.into(),
168 retryable,
169 }
170 }
171}
172
173#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
174pub enum SecureProblemCode {
175 IdentityNotReady,
176 PeerNotFound,
177 PeerKeysUnavailable,
178 SessionNeedsRepair,
179 GroupStateUnavailable,
180 LocalStateUnavailable,
181 TransportUnavailable,
182 Unsupported,
183 Unknown,
184}