keri_core/database/
mod.rs

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}