Skip to main content

little_durable_objects/
clock.rs

1use 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}