From 8eafe81aa9d153a2275ace673546b90d7d476417 Mon Sep 17 00:00:00 2001 From: Sam Wilson <57262657+SamWilsn@users.noreply.github.com> Date: Fri, 15 Jan 2021 04:33:38 -0500 Subject: [PATCH] Handle ping/pong messages for Ws provider (#163) --- ethers-providers/src/transports/ws.rs | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) 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