relay_server/services/buffer/stack_provider/
memory.rs

1use crate::EnvelopeStack;
2use crate::services::buffer::common::ProjectKeyPair;
3use crate::services::buffer::envelope_stack::memory::MemoryEnvelopeStack;
4use crate::services::buffer::stack_provider::{
5    InitializationState, StackCreationType, StackProvider,
6};
7use crate::utils::MemoryChecker;
8
9#[derive(Debug)]
10pub struct MemoryStackProvider {
11    memory_checker: MemoryChecker,
12}
13
14impl MemoryStackProvider {
15    /// Creates a new [`MemoryStackProvider`] with a given [`MemoryChecker`] that is used to
16    /// estimate the capacity.
17    pub fn new(memory_checker: MemoryChecker) -> Self {
18        Self { memory_checker }
19    }
20}
21
22impl StackProvider for MemoryStackProvider {
23    type Stack = MemoryEnvelopeStack;
24
25    async fn initialize(&self) -> InitializationState {
26        InitializationState::empty()
27    }
28
29    fn create_stack(&self, _: StackCreationType, _: ProjectKeyPair) -> Self::Stack {
30        MemoryEnvelopeStack::new()
31    }
32
33    fn has_store_capacity(&self) -> bool {
34        self.memory_checker.check_memory().has_capacity()
35    }
36
37    async fn store_total_count(&self) -> u64 {
38        // The memory implementation doesn't have a store, so the count is 0.
39        0
40    }
41
42    fn total_size(&self) -> Option<u64> {
43        // We can't reliably tell how much memory is used so just return None.
44        None
45    }
46
47    fn stack_type<'a>(&self) -> &'a str {
48        "memory"
49    }
50
51    async fn flush(&mut self, envelope_stacks: impl IntoIterator<Item = Self::Stack>) {
52        for envelope_stack in envelope_stacks {
53            // The flushed envelopes will be immediately dropped.
54            envelope_stack.flush().await;
55        }
56    }
57}