Nicer log line on ws disconnect
This commit is contained in:
parent
4ca55768c5
commit
ebbececdc9
2 changed files with 31 additions and 27 deletions
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue