diff --git a/crates/engine/src/events.rs b/crates/engine/src/events.rs index 05433412c..228602b34 100644 --- a/crates/engine/src/events.rs +++ b/crates/engine/src/events.rs @@ -7,10 +7,14 @@ use std::collections::VecDeque; use std::sync::{Condvar, Mutex, PoisonError}; -use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH}; +use std::time::Duration; use serde::Serialize; use serde_json::Value; +// The browser build has no `std` clock: `std::time::SystemTime::now()` panics on +// wasm32-unknown-unknown ("time not implemented on this platform"), and every `comment.*` command +// stamps an event. `web_time` is `std::time` on native targets and the JavaScript clock on wasm. +use web_time::{Instant, SystemTime, UNIX_EPOCH}; /// Most events kept; the oldest are dropped. pub const MAX_EVENTS: usize = 1024; diff --git a/crates/engine/src/events_tests.rs b/crates/engine/src/events_tests.rs index 9cdef52ca..2e8621716 100644 --- a/crates/engine/src/events_tests.rs +++ b/crates/engine/src/events_tests.rs @@ -44,6 +44,19 @@ fn events_keep_sequence_and_filter_topics() { assert_eq!(r.events[0].kind, "document.changed"); } +#[test] +fn events_are_stamped_with_the_wall_clock() { + // The stamp is read through `web_time`, the clock the browser build has as well: with + // `std::time::SystemTime` every comment posted on the web panicked (#1764). + let log = EventLog::default(); + log.push("comment.added", "Doc", None, json!({"commentId": 1})); + let r = log.poll(0, &comments(), 10, Duration::ZERO); + let now = web_time::SystemTime::now().duration_since(web_time::UNIX_EPOCH).unwrap().as_secs_f64(); + let time = r.events[0].time; + // Within a minute of the same clock read afterwards (not ordered: the wall clock can step). + assert!(time > 1_700_000_000.0 && (time - now).abs() < 60.0, "{time} is seconds since the Unix epoch, read next to {now}"); +} + #[test] fn a_poll_wakes_for_a_push() { let log = Arc::new(EventLog::default());