pub(crate) const DEVICE_STALE_HEARTBEAT_MS: i64 = 300_000;
pub(crate) const DEVICE_OFFLINE_RETENTION_MS: i64 = 30 * 24 * 60 * 60 * 1000;
pub(crate) fn parse_millis(value: Option<&serde_json::Value>) -> Option<i64> {
match value {
Some(serde_json::Value::Number(number)) => number.as_i64(),
Some(serde_json::Value::String(raw)) => parse_millis_string(raw),
_ => None,
}
}
fn parse_millis_string(raw: &str) -> Option<i64> {
if let Ok(parsed) = raw.parse::<i64>() {
return Some(parsed);
}
#[cfg(target_arch = "wasm32")]
{
let millis = js_sys::Date::parse(raw);
if millis.is_finite() {
return Some(millis as i64);
}
}
#[cfg(not(target_arch = "wasm32"))]
{
if let Ok(parsed) = chrono::DateTime::parse_from_rfc3339(raw) {
return Some(parsed.timestamp_millis());
}
}
None
}