diff --git a/sync-server/src/app_state/websocket/utils.rs b/sync-server/src/app_state/websocket/utils.rs index e72a3775..770f34e2 100644 --- a/sync-server/src/app_state/websocket/utils.rs +++ b/sync-server/src/app_state/websocket/utils.rs @@ -9,6 +9,7 @@ use crate::{ errors::{SyncServerError, server_error, unauthenticated_error}, server::auth::auth, }; +use crate::consts::WEBSOCKET_SEND_TIMEOUT; pub struct AuthenticatedWebSocketHandshake { pub handshake: WebSocketHandshake, @@ -49,9 +50,13 @@ pub async fn send_update_over_websocket( .context("Failed to serialize update") .map_err(server_error)?; - sender - .send(Message::Text(serialized_update)) - .await - .context("Failed to send message over websocket") - .map_err(server_error) + tokio::time::timeout( + WEBSOCKET_SEND_TIMEOUT, + sender.send(Message::Text(serialized_update)), + ) + .await + .context("WebSocket send deadline expired") + .map_err(server_error)? + .context("Failed to send message over websocket") + .map_err(server_error) } diff --git a/sync-server/src/consts.rs b/sync-server/src/consts.rs index 83d99a82..71047092 100644 --- a/sync-server/src/consts.rs +++ b/sync-server/src/consts.rs @@ -17,6 +17,7 @@ pub const DEFAULT_MAX_CLIENTS_PER_VAULT: usize = 256; pub const DEFAULT_LOG_DIRECTORY: &str = "logs"; pub const DEFAULT_LOG_ROTATION_INTERVAL: Duration = Duration::from_secs(60 * 60 * 24); // 1 day pub const DEFAULT_LOG_LEVEL: LogLevel = LogLevel::Info; +pub const WEBSOCKET_SEND_TIMEOUT: Duration = Duration::from_secs(10); pub const DEFAULT_MERGEABLE_FILE_EXTENSIONS: &[&str] = &["md", "txt"];