1mod error;
2mod redb_store;
3
4pub use error::StoreError;
5pub use redb_store::RedbMessageStore;
6
7use hermes_proto::EventEnvelope;
8
9#[derive(Debug, Clone)]
11pub struct StoredMessage {
12 pub envelope: EventEnvelope,
13 pub attempt: u32,
14}
15
16#[derive(Debug, Clone, Copy, PartialEq, Eq)]
18pub enum DeliveryState {
19 Pending,
21 Delivered,
23 Acked,
25 DeadLettered,
27}
28
29impl DeliveryState {
30 fn as_u8(self) -> u8 {
31 match self {
32 Self::Pending => 0,
33 Self::Delivered => 1,
34 Self::Acked => 2,
35 Self::DeadLettered => 3,
36 }
37 }
38
39 fn from_u8(v: u8) -> Option<Self> {
40 match v {
41 0 => Some(Self::Pending),
42 1 => Some(Self::Delivered),
43 2 => Some(Self::Acked),
44 3 => Some(Self::DeadLettered),
45 _ => None,
46 }
47 }
48}
49
50pub trait MessageStore: Send + Sync + 'static {
52 fn persist(&self, envelope: &EventEnvelope) -> Result<(), StoreError>;
54
55 fn register_consumer(
57 &self,
58 consumer_name: &str,
59 subject: &[u8],
60 queue_groups: &[String],
61 ) -> Result<(), StoreError>;
62
63 fn fetch_pending(
65 &self,
66 consumer_name: &str,
67 limit: u32,
68 ) -> Result<Vec<StoredMessage>, StoreError>;
69
70 fn mark_delivered(
72 &self,
73 message_id: &str,
74 consumer_name: &str,
75 ack_deadline_ms: u64,
76 ) -> Result<(), StoreError>;
77
78 fn ack(&self, message_id: &str, consumer_name: &str) -> Result<(), StoreError>;
80
81 fn nack(&self, message_id: &str, consumer_name: &str, requeue: bool) -> Result<(), StoreError>;
84
85 fn fetch_expired(
87 &self,
88 consumer_name: &str,
89 now_ms: u64,
90 limit: u32,
91 ) -> Result<Vec<StoredMessage>, StoreError>;
92
93 fn gc_acked(&self, older_than_ms: u64) -> Result<u64, StoreError>;
96
97 fn list_consumers(&self) -> Result<Vec<String>, StoreError>;
99}