use serde::Serialize;
use std::sync::RwLock;
#[derive(Debug, Clone, Serialize, PartialEq)]
#[serde(rename_all = "snake_case")]
pub enum HeartbeatStatus {
Sent,
Ok,
Skipped,
Failed,
}
#[derive(Debug, Clone, Serialize)]
pub struct HeartbeatEvent {
pub ts: u64,
pub status: HeartbeatStatus,
pub duration_ms: u64,
#[serde(skip_serializing_if = "Option::is_none")]
pub preview: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub reason: Option<String>,
}
static LAST_HEARTBEAT: RwLock<Option<HeartbeatEvent>> = RwLock::new(None);
pub fn emit_heartbeat_event(event: HeartbeatEvent) {
if let Ok(mut guard) = LAST_HEARTBEAT.write() {
*guard = Some(event);
}
}
pub fn get_last_heartbeat_event() -> Option<HeartbeatEvent> {
LAST_HEARTBEAT.read().ok().and_then(|guard| guard.clone())
}
pub fn now_ms() -> u64 {
std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.map(|d| d.as_millis() as u64)
.unwrap_or(0)
}