From e1ef1951980d679c59768c6117112059c1d60e9e Mon Sep 17 00:00:00 2001 From: Joscha Date: Thu, 30 Jun 2022 15:16:27 +0200 Subject: [PATCH] Fix ping pong --- src/euph/api/types.rs | 12 +++++++++++- src/euph/conn.rs | 8 ++++++-- src/vault/euph.rs | 2 +- 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/euph/api/types.rs b/src/euph/api/types.rs index 5e01760..95bc1d8 100644 --- a/src/euph/api/types.rs +++ b/src/euph/api/types.rs @@ -8,7 +8,7 @@ use std::fmt; -use chrono::{DateTime, Utc}; +use chrono::{DateTime, TimeZone, Utc}; use serde::{de, ser, Deserialize, Serialize}; use serde_json::Value; @@ -329,6 +329,16 @@ impl<'de> Deserialize<'de> for Snowflake { #[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)] pub struct Time(#[serde(with = "chrono::serde::ts_seconds")] pub DateTime); +impl Time { + pub fn new(timestamp: i64) -> Self { + Self(Utc.timestamp(timestamp, 0)) + } + + pub fn now() -> Self { + Self::new(Utc::now().timestamp()) + } +} + /// Identifies a user. /// /// The prefix of this value (up to the colon) indicates a type of session, diff --git a/src/euph/conn.rs b/src/euph/conn.rs index 6daf407..a175f07 100644 --- a/src/euph/conn.rs +++ b/src/euph/conn.rs @@ -7,10 +7,10 @@ use std::convert::Infallible; use std::time::Duration; use anyhow::bail; -use chrono::Utc; use futures::channel::oneshot; use futures::stream::{SplitSink, SplitStream}; use futures::{SinkExt, StreamExt}; +use log::warn; use rand::Rng; use tokio::net::TcpStream; use tokio::sync::mpsc; @@ -344,23 +344,27 @@ impl State { async fn do_pings(&mut self, event_tx: &mpsc::UnboundedSender) -> anyhow::Result<()> { // Check old ws ping if self.last_ws_ping.is_some() && self.last_ws_ping != self.last_ws_pong { + warn!("server missed ws ping"); bail!("server missed ws ping") } // Send new ws ping let mut ws_payload = [0_u8; 8]; rand::thread_rng().fill(&mut ws_payload); + self.last_ws_ping = Some(ws_payload.to_vec()); self.ws_tx .send(tungstenite::Message::Ping(ws_payload.to_vec())) .await?; // Check old euph ping if self.last_euph_ping.is_some() && self.last_euph_ping != self.last_euph_pong { + warn!("server missed euph ping"); bail!("server missed euph ping") } // Send new euph ping - let euph_payload = Time(Utc::now()); + let euph_payload = Time::now(); + self.last_euph_ping = Some(euph_payload); let (tx, _) = oneshot::channel(); event_tx.send(Event::send_cmd(Ping { time: euph_payload }, tx))?; diff --git a/src/vault/euph.rs b/src/vault/euph.rs index 4121e7e..0fe494e 100644 --- a/src/vault/euph.rs +++ b/src/vault/euph.rs @@ -33,7 +33,7 @@ impl ToSql for Time { impl FromSql for Time { fn column_result(value: ValueRef<'_>) -> rusqlite::types::FromSqlResult { let timestamp = i64::column_result(value)?; - Ok(Self(Utc.timestamp(timestamp, 0))) + Ok(Self::new(timestamp)) } }