aboutsummaryrefslogtreecommitdiff
path: root/src/api/event_hub.rs
diff options
context:
space:
mode:
authorOgulcan Celik <ogulcancelik@gmail.com>2026-05-21 20:19:54 +0300
committerOgulcan Celik <ogulcancelik@gmail.com>2026-05-21 20:22:57 +0300
commit866aaf740e10fcfce169aaf81380ea0257fbe272 (patch)
treef815392b7c6b24a7c0de14e655bd635656383813 /src/api/event_hub.rs
parentca579c402d5668560ca13059f82c03178be18b2a (diff)
refactor: separate server client boundaries
Diffstat (limited to 'src/api/event_hub.rs')
-rw-r--r--src/api/event_hub.rs39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/api/event_hub.rs b/src/api/event_hub.rs
new file mode 100644
index 00000000..b66a2157
--- /dev/null
+++ b/src/api/event_hub.rs
@@ -0,0 +1,39 @@
+#[derive(Clone, Default)]
+pub struct EventHub {
+ inner: std::sync::Arc<std::sync::Mutex<EventHubState>>,
+}
+
+#[derive(Default)]
+struct EventHubState {
+ next_sequence: u64,
+ events: Vec<(u64, crate::api::schema::EventEnvelope)>,
+}
+
+impl EventHub {
+ const MAX_EVENTS: usize = 512;
+
+ pub fn push(&self, event: crate::api::schema::EventEnvelope) {
+ let Ok(mut state) = self.inner.lock() else {
+ return;
+ };
+ state.next_sequence += 1;
+ let sequence = state.next_sequence;
+ state.events.push((sequence, event));
+ let overflow = state.events.len().saturating_sub(Self::MAX_EVENTS);
+ if overflow > 0 {
+ state.events.drain(0..overflow);
+ }
+ }
+
+ pub fn events_after(&self, sequence: u64) -> Vec<(u64, crate::api::schema::EventEnvelope)> {
+ let Ok(state) = self.inner.lock() else {
+ return Vec::new();
+ };
+ state
+ .events
+ .iter()
+ .filter(|(event_sequence, _)| *event_sequence > sequence)
+ .cloned()
+ .collect()
+ }
+}