Nicer log line on ws disconnect

This commit is contained in:
Andras Schmelczer 2025-06-07 17:15:56 +01:00
parent 4ca55768c5
commit ebbececdc9
No known key found for this signature in database
GPG key ID: FC8F2C3D3D1A718C
2 changed files with 31 additions and 27 deletions

View file

@ -1,13 +1,11 @@
use std::fmt::Display; use std::fmt::Display;
use aide::OperationOutput;
use axum::{ use axum::{
Json, Json,
http::StatusCode, http::StatusCode,
response::{IntoResponse, Response}, response::{IntoResponse, Response},
}; };
use log::{error, info}; use log::{debug, error};
use schemars::JsonSchema;
use serde::Serialize; use serde::Serialize;
use thiserror::Error; use thiserror::Error;
@ -45,7 +43,7 @@ impl SyncServerError {
} }
} }
#[derive(Debug, Clone, Serialize, JsonSchema)] #[derive(Debug, Clone, Serialize)]
pub struct SerializedError { pub struct SerializedError {
pub message: String, pub message: String,
pub causes: Vec<String>, pub causes: Vec<String>,
@ -96,35 +94,32 @@ impl From<&anyhow::Error> for SerializedError {
} }
} }
impl OperationOutput for SyncServerError { pub fn init_error(error: anyhow::Error) -> SyncServerError {
type Inner = Self; debug!("Initialization error: {error:?}");
}
pub const fn init_error(error: anyhow::Error) -> SyncServerError {
SyncServerError::InitError(error) SyncServerError::InitError(error)
} }
pub fn server_error(error: anyhow::Error) -> SyncServerError { pub fn server_error(error: anyhow::Error) -> SyncServerError {
error!("Server error: {error:?}"); debug!("Server error: {error:?}");
SyncServerError::ServerError(error) SyncServerError::ServerError(error)
} }
pub fn client_error(error: anyhow::Error) -> SyncServerError { pub fn client_error(error: anyhow::Error) -> SyncServerError {
info!("Client error: {error:?}"); debug!("Client error: {error:?}");
SyncServerError::ClientError(error) SyncServerError::ClientError(error)
} }
pub fn not_found_error(error: anyhow::Error) -> SyncServerError { pub fn not_found_error(error: anyhow::Error) -> SyncServerError {
info!("Not found: {error:?}"); debug!("Not found: {error:?}");
SyncServerError::NotFound(error) SyncServerError::NotFound(error)
} }
pub fn unauthenticated_error(error: anyhow::Error) -> SyncServerError { pub fn unauthenticated_error(error: anyhow::Error) -> SyncServerError {
info!("Unauthenticated user: {error:?}"); debug!("Unauthenticated user: {error:?}");
SyncServerError::Unauthenticated(error) SyncServerError::Unauthenticated(error)
} }
pub fn permission_denied_error(error: anyhow::Error) -> SyncServerError { pub fn permission_denied_error(error: anyhow::Error) -> SyncServerError {
info!("Permission denied: {error:?}"); debug!("Permission denied: {error:?}");
SyncServerError::PermissionDeniedError(error) SyncServerError::PermissionDeniedError(error)
} }

View file

@ -7,8 +7,7 @@ use axum::{
response::Response, response::Response,
}; };
use futures::stream::StreamExt; use futures::stream::StreamExt;
use log::{error, info, warn}; use log::{debug, info};
use schemars::JsonSchema;
use serde::Deserialize; use serde::Deserialize;
use crate::{ use crate::{
@ -29,8 +28,7 @@ use crate::{
utils::normalize::normalize, utils::normalize::normalize,
}; };
// This is required for aide to infer the path parameter types and names #[derive(Deserialize)]
#[derive(Deserialize, JsonSchema)]
pub struct WebSocketPathParams { pub struct WebSocketPathParams {
#[serde(deserialize_with = "normalize")] #[serde(deserialize_with = "normalize")]
vault_id: VaultId, vault_id: VaultId,
@ -50,10 +48,8 @@ async fn websocket_wrapped(state: AppState, stream: WebSocket, vault_id: VaultId
let result = websocket(state, stream, vault_id.clone()).await; let result = websocket(state, stream, vault_id.clone()).await;
if let Err(err) = result { if let Err(err) = result {
error!("WebSocket connection error on vault '{vault_id}': {err}"); debug!("WebSocket connection error on vault '{vault_id}': {err}");
} }
warn!("WebSocket connection closed on vault '{vault_id}'");
} }
async fn websocket( async fn websocket(
@ -73,6 +69,11 @@ async fn websocket(
.unwrap_or_default(), .unwrap_or_default(),
)?; )?;
info!(
"WebSocket handshake successful for vault '{vault_id}' for '{}'",
handshake.device_id
);
let mut broadcast_receiver = state.broadcasts.get_receiver(vault_id.clone()).await; let mut broadcast_receiver = state.broadcasts.get_receiver(vault_id.clone()).await;
send_update_over_websocket( send_update_over_websocket(
@ -141,26 +142,34 @@ async fn websocket(
_ = &mut receive_task => send_task.abort(), _ = &mut receive_task => send_task.abort(),
}; };
let result = { let result: Result<(), SyncServerError> = (async {
send_task send_task
.await .await
.context("WebSocket send task failed") .context("WebSocket send task failed")
.map_err(server_error) .map_err(client_error)
.and_then(|x| x)?; .and_then(|err| err)?;
receive_task receive_task
.await .await
.context("WebSocket receive task failed") .context("WebSocket receive task failed")
.map_err(server_error) .map_err(client_error)
.and_then(|x| x)?; .and_then(|err| err)?;
Ok(()) Ok(())
}; })
.await;
state state
.cursors .cursors
.remove_cursors_of_device(&vault_id, &handshake.device_id) .remove_cursors_of_device(&vault_id, &handshake.device_id)
.await; .await;
if result.is_err() {
info!(
"WebSocket disconnected on vault '{vault_id}' for '{}'",
handshake.device_id
);
}
result result
} }