1use std::sync::Arc;
2
3use timestamped::TimestampedSignedEventMessage;
4
5#[cfg(feature = "query")]
6use crate::query::reply_event::SignedReply;
7use crate::{
8 event::KeyEvent,
9 event_message::{
10 msg::KeriEvent,
11 signature::{Nontransferable, Transferable},
12 signed_event_message::{
13 SignedEventMessage, SignedNontransferableReceipt, SignedTransferableReceipt,
14 },
15 },
16 prefix::{IdentifierPrefix, IndexedSignature},
17 state::IdentifierState,
18};
19
20#[cfg(feature = "mailbox")]
21pub mod mailbox;
22pub mod redb;
23pub mod timestamped;
24
25pub enum QueryParameters<'a> {
26 BySn {
27 id: IdentifierPrefix,
28 sn: u64,
29 },
30 Range {
31 id: IdentifierPrefix,
32 start: u64,
33 limit: u64,
34 },
35 All {
36 id: &'a IdentifierPrefix,
37 },
38}
39
40pub trait EventDatabase {
41 type Error;
42 type LogDatabaseType: LogDatabase<'static>;
43
44 fn get_log_db(&self) -> Arc<Self::LogDatabaseType>;
45
46 fn add_kel_finalized_event(
47 &self,
48 event: SignedEventMessage,
49 id: &IdentifierPrefix,
50 ) -> Result<(), Self::Error>;
51
52 fn add_receipt_t(
53 &self,
54 receipt: SignedTransferableReceipt,
55 id: &IdentifierPrefix,
56 ) -> Result<(), Self::Error>;
57
58 fn add_receipt_nt(
59 &self,
60 receipt: SignedNontransferableReceipt,
61 id: &IdentifierPrefix,
62 ) -> Result<(), Self::Error>;
63
64 fn get_key_state(&self, id: &IdentifierPrefix) -> Option<IdentifierState>;
65
66 fn get_kel_finalized_events(
67 &self,
68 params: QueryParameters,
69 ) -> Option<impl DoubleEndedIterator<Item = TimestampedSignedEventMessage>>;
70
71 fn get_receipts_t(
72 &self,
73 params: QueryParameters,
74 ) -> Option<impl DoubleEndedIterator<Item = Transferable>>;
75
76 fn get_receipts_nt(
77 &self,
78 params: QueryParameters,
79 ) -> Option<impl DoubleEndedIterator<Item = SignedNontransferableReceipt>>;
80
81 fn accept_to_kel(&self, event: &KeriEvent<KeyEvent>) -> Result<(), Self::Error>;
82
83 #[cfg(feature = "query")]
84 fn save_reply(&self, reply: SignedReply) -> Result<(), Self::Error>;
85 #[cfg(feature = "query")]
86 fn get_reply(&self, id: &IdentifierPrefix, from_who: &IdentifierPrefix) -> Option<SignedReply>;
87}
88
89pub trait LogDatabase<'db>: Send + Sync {
90 type DatabaseType;
91 type Error;
92 type TransactionType;
93
94 fn new(db: Arc<Self::DatabaseType>) -> Result<Self, Self::Error>
95 where
96 Self: Sized;
97
98 fn log_event(
99 &self,
100 txn: &Self::TransactionType,
101 signed_event: &SignedEventMessage,
102 ) -> Result<(), Self::Error>;
103
104 fn log_event_with_new_transaction(
105 &self,
106 signed_event: &SignedEventMessage,
107 ) -> Result<(), Self::Error>;
108
109 fn log_receipt(
110 &self,
111 txn: &Self::TransactionType,
112 signed_receipt: &SignedNontransferableReceipt,
113 ) -> Result<(), Self::Error>;
114
115 fn log_receipt_with_new_transaction(
116 &self,
117 signed_receipt: &SignedNontransferableReceipt,
118 ) -> Result<(), Self::Error>;
119
120 fn get_signed_event(
121 &self,
122 said: &said::SelfAddressingIdentifier,
123 ) -> Result<Option<TimestampedSignedEventMessage>, Self::Error>;
124
125 fn get_event(
126 &self,
127 said: &said::SelfAddressingIdentifier,
128 ) -> Result<Option<KeriEvent<KeyEvent>>, Self::Error>;
129
130 fn get_signatures(
131 &self,
132 said: &said::SelfAddressingIdentifier,
133 ) -> Result<Option<impl Iterator<Item = IndexedSignature>>, Self::Error>;
134
135 fn get_nontrans_couplets(
136 &self,
137 said: &said::SelfAddressingIdentifier,
138 ) -> Result<Option<impl Iterator<Item = Nontransferable>>, Self::Error>;
139
140 fn get_trans_receipts(
141 &self,
142 said: &said::SelfAddressingIdentifier,
143 ) -> Result<impl DoubleEndedIterator<Item = Transferable>, Self::Error>;
144
145 fn remove_nontrans_receipt(
146 &self,
147 txn_mode: &Self::TransactionType,
148 said: &said::SelfAddressingIdentifier,
149 nontrans: impl IntoIterator<Item = Nontransferable>,
150 ) -> Result<(), Self::Error>;
151
152 fn remove_nontrans_receipt_with_new_transaction(
153 &self,
154 said: &said::SelfAddressingIdentifier,
155 nontrans: impl IntoIterator<Item = Nontransferable>,
156 ) -> Result<(), Self::Error>;
157}
158
159pub trait SequencedEventDatabase: Send + Sync {
160 type DatabaseType;
161 type Error;
162 type DigestIter: Iterator<Item = said::SelfAddressingIdentifier>;
163
164 fn new(db: Arc<Self::DatabaseType>, table_name: &'static str) -> Result<Self, Self::Error>
165 where
166 Self: Sized;
167
168 fn insert(
169 &self,
170 identifier: &IdentifierPrefix,
171 sn: u64,
172 digest: &said::SelfAddressingIdentifier,
173 ) -> Result<(), Self::Error>;
174
175 fn get(&self, identifier: &IdentifierPrefix, sn: u64) -> Result<Self::DigestIter, Self::Error>;
176
177 fn get_greater_than(
178 &self,
179 identifier: &IdentifierPrefix,
180 sn: u64,
181 ) -> Result<Self::DigestIter, Self::Error>;
182
183 fn remove(
184 &self,
185 identifier: &IdentifierPrefix,
186 sn: u64,
187 said: &said::SelfAddressingIdentifier,
188 ) -> Result<(), Self::Error>;
189}
190
191pub trait EscrowCreator {
192 type EscrowDatabaseType: EscrowDatabase;
193 fn create_escrow_db(&self, table_name: &'static str) -> Self::EscrowDatabaseType;
194}
195
196pub trait EscrowDatabase: Send + Sync {
197 type EscrowDatabaseType;
198 type LogDatabaseType;
199 type Error;
200 type EventIter: Iterator<Item = SignedEventMessage>;
201
202 fn new(
203 escrow: Arc<
204 dyn SequencedEventDatabase<
205 DatabaseType = Self::EscrowDatabaseType,
206 Error = Self::Error,
207 DigestIter = Box<dyn Iterator<Item = said::SelfAddressingIdentifier>>,
208 >,
209 >,
210 log: Arc<Self::LogDatabaseType>,
211 ) -> Self
212 where
213 Self: Sized;
214
215 fn save_digest(
216 &self,
217 id: &IdentifierPrefix,
218 sn: u64,
219 event_digest: &said::SelfAddressingIdentifier,
220 ) -> Result<(), Self::Error>;
221
222 fn insert(&self, event: &SignedEventMessage) -> Result<(), Self::Error>;
223
224 fn insert_key_value(
225 &self,
226 id: &IdentifierPrefix,
227 sn: u64,
228 event: &SignedEventMessage,
229 ) -> Result<(), Self::Error>;
230
231 fn get(&self, identifier: &IdentifierPrefix, sn: u64) -> Result<Self::EventIter, Self::Error>;
232
233 fn get_from_sn(
234 &self,
235 identifier: &IdentifierPrefix,
236 sn: u64,
237 ) -> Result<Self::EventIter, Self::Error>;
238
239 fn remove(&self, event: &KeriEvent<KeyEvent>);
240
241 fn contains(
242 &self,
243 id: &IdentifierPrefix,
244 sn: u64,
245 digest: &said::SelfAddressingIdentifier,
246 ) -> Result<bool, Self::Error>;
247}