diff --git a/crates/zx_document_core/src/events.rs b/crates/zx_document_core/src/events.rs index 56f4a93..7b9fed6 100644 --- a/crates/zx_document_core/src/events.rs +++ b/crates/zx_document_core/src/events.rs @@ -4,12 +4,19 @@ use serde::{Deserialize, Serialize}; use crate::progress::ReadingPosition; +/// Maximum number of events before oldest are dropped to prevent unbounded memory growth. +const MAX_BUFFER_SIZE: usize = 1000; + // Global event buffer, protected by a Mutex for thread safety. static EVENT_BUFFER: Mutex> = Mutex::new(Vec::new()); /// Push a reading event into the global buffer. +/// If the buffer exceeds MAX_BUFFER_SIZE, the oldest event is dropped. pub fn push_reading_event(event: ReadingEvent) { if let Ok(mut buf) = EVENT_BUFFER.lock() { + if buf.len() >= MAX_BUFFER_SIZE { + buf.remove(0); + } buf.push(event); } } @@ -45,7 +52,7 @@ fn now_ms() -> i64 { .unwrap_or(0) } -#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize, uniffi::Enum)] #[serde(tag = "type")] pub enum ReadingEvent { MaterialOpened {