From 8f9b18444ae2deabbdfe3c16af3fdfdcf5cc5130 Mon Sep 17 00:00:00 2001 From: Bob Bobs Date: Tue, 13 Feb 2024 16:26:08 -0700 Subject: [PATCH] chore(bonfire): log errors from websocket stream --- crates/bonfire/src/websocket.rs | 37 +++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/crates/bonfire/src/websocket.rs b/crates/bonfire/src/websocket.rs index 6fd5aa08..eed79e79 100644 --- a/crates/bonfire/src/websocket.rs +++ b/crates/bonfire/src/websocket.rs @@ -118,7 +118,7 @@ pub async fn client(db: &'static Database, stream: TcpStream, addr: SocketAddr) // Create a PubSub connection to poll on. let listener = listener(db, &mut state, addr, &config, &write).fuse(); // Read from WebSocket stream. - let worker = worker(user_id.clone(), &config, read, &write).fuse(); + let worker = worker(addr, user_id.clone(), &config, read, &write).fuse(); // Pin both tasks. pin_mut!(listener, worker); @@ -186,7 +186,7 @@ async fn listener( // Handle incoming events. let Ok(message) = message_rx.recv().await.map_err(|e| { - info!("Error while consuming pub/sub messages: {e:?}"); + warn!("Error while consuming pub/sub messages: {e:?}"); sentry::capture_error(&e); }) else { return; @@ -210,27 +210,42 @@ async fn listener( return; }; let should_send = state.handle_incoming_event_v1(db, &mut event).await; + if !should_send { + continue; + } - if should_send - && write - .lock() - .await - .send(config.encode(&event)) - .await - .is_err() - { + let result = write.lock().await.send(config.encode(&event)).await; + if let Err(e) = result { + use async_tungstenite::tungstenite::Error; + if !matches!(e, Error::AlreadyClosed | Error::ConnectionClosed) { + warn!("Error while sending an event to {addr:?}: {e:?}"); + } return; } } } async fn worker( + addr: SocketAddr, user_id: String, config: &ProtocolConfiguration, mut read: WsReader, write: &Mutex, ) { - while let Ok(Some(msg)) = read.try_next().await { + loop { + let result = read.try_next().await; + let msg = match result { + Ok(Some(msg)) => msg, + Ok(None) => return, + Err(e) => { + use async_tungstenite::tungstenite::Error; + if !matches!(e, Error::AlreadyClosed | Error::ConnectionClosed) { + warn!("Error while reading an event from {addr:?}: {e:?}"); + } + return; + } + }; + let Ok(payload) = config.decode(&msg) else { continue; };