35 lines
962 B
Rust
35 lines
962 B
Rust
use std::time::{SystemTime, UNIX_EPOCH};
|
|
|
|
pub fn now_us() -> u128 {
|
|
SystemTime::now()
|
|
.duration_since(UNIX_EPOCH)
|
|
.expect("Time went backwards")
|
|
.as_micros()
|
|
}
|
|
|
|
pub struct ClockSync {
|
|
pub offset: i128, // server_time - client_time
|
|
}
|
|
|
|
impl ClockSync {
|
|
pub fn new() -> Self {
|
|
Self { offset: 0 }
|
|
}
|
|
|
|
pub fn update(&mut self, client_send_ts: u128, server_ts: u128, client_recv_ts: u128) {
|
|
let rtt = (client_recv_ts - client_send_ts) as i128;
|
|
// Estimated server time when client_recv_ts occurred: server_ts + rtt/2
|
|
let estimated_server_now = server_ts as i128 + rtt / 2;
|
|
self.offset = estimated_server_now - client_recv_ts as i128;
|
|
}
|
|
|
|
pub fn to_server_time(&self, client_time: u128) -> u128 {
|
|
(client_time as i128 + self.offset) as u128
|
|
}
|
|
|
|
pub fn to_client_time(&self, server_time: u128) -> u128 {
|
|
(server_time as i128 - self.offset) as u128
|
|
}
|
|
}
|
|
|