little_durable_objects/
clock.rs1use std::{
2 sync::OnceLock,
3 time::{Instant, SystemTime, UNIX_EPOCH},
4};
5
6use anyhow::Result;
7
8pub trait Clock: Send + Sync {
9 fn now_ms(&self) -> Result<u64>;
10}
11
12#[derive(Clone, Copy, Debug, Default)]
13pub struct SystemClock;
14
15static ANCHOR: OnceLock<(SystemTime, Instant)> = OnceLock::new();
16
17impl Clock for SystemClock {
18 fn now_ms(&self) -> Result<u64> {
19 let (wall, monotonic) = *ANCHOR.get_or_init(|| (SystemTime::now(), Instant::now()));
20 let now = wall + monotonic.elapsed();
21 Ok(u64::try_from(now.duration_since(UNIX_EPOCH)?.as_millis())?)
22 }
23}