Skip to main content

im_core/secure/
dto.rs

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}