diff --git a/ethers-providers/src/transports/ws.rs b/ethers-providers/src/transports/ws.rs index 89138a20..a4165bbe 100644 --- a/ethers-providers/src/transports/ws.rs +++ b/ethers-providers/src/transports/ws.rs @@ -251,12 +251,20 @@ where } async fn handle_ws(&mut self, resp: Message) -> Result<(), ClientError> { - // Get the inner text received from the websocket - let inner = match resp { - Message::Text(inner) => inner, - _ => return Err(ClientError::NoResponse), - }; + match resp { + Message::Text(inner) => self.handle_text(inner).await, + Message::Ping(inner) => self.handle_ping(inner).await, + Message::Pong(_) => Ok(()), // Server is allowed to send unsolicited pongs. + _ => Err(ClientError::NoResponse), + } + } + async fn handle_ping(&mut self, inner: Vec) -> Result<(), ClientError> { + self.ws.send(Message::Pong(inner)).await?; + Ok(()) + } + + async fn handle_text(&mut self, inner: String) -> Result<(), ClientError> { if let Ok(resp) = serde_json::from_str::>(&inner) { if let Some(request) = self.pending.remove(&resp.id) { request