summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLeo K <crowlkats@toaxl.com>2021-10-19 18:21:15 +0200
committerGitHub <noreply@github.com>2021-10-19 18:21:15 +0200
commitd6062b265331b88efcbe740741bd93714ec11026 (patch)
treee43eee055f38b8f1fb50381d7c5034a0ee115cd2
parentf83c756aa0754d8507d6df1b4afc6fd516396c98 (diff)
fix(ext/websocket): prevent 'closed normally' panic (#12437)
-rw-r--r--ext/websocket/01_websocket.js1
-rw-r--r--ext/websocket/02_websocketstream.js1
-rw-r--r--ext/websocket/lib.rs15
3 files changed, 12 insertions, 5 deletions
diff --git a/ext/websocket/01_websocket.js b/ext/websocket/01_websocket.js
index 200bb8659..e11a2c55f 100644
--- a/ext/websocket/01_websocket.js
+++ b/ext/websocket/01_websocket.js
@@ -417,6 +417,7 @@
});
break;
}
+ case "closed":
case "close": {
this[_readyState] = CLOSED;
diff --git a/ext/websocket/02_websocketstream.js b/ext/websocket/02_websocketstream.js
index 82f306333..246ddb1e3 100644
--- a/ext/websocket/02_websocketstream.js
+++ b/ext/websocket/02_websocketstream.js
@@ -261,6 +261,7 @@
});
break;
}
+ case "closed":
case "close": {
if (this[_closing]) {
this[_closed].resolve(value);
diff --git a/ext/websocket/lib.rs b/ext/websocket/lib.rs
index 32ac4cf03..d469b5aaf 100644
--- a/ext/websocket/lib.rs
+++ b/ext/websocket/lib.rs
@@ -82,7 +82,8 @@ pub struct WsStreamResource {
impl WsStreamResource {
async fn send(self: &Rc<Self>, message: Message) -> Result<(), AnyError> {
- match self.stream {
+ use tokio_tungstenite::tungstenite::Error;
+ let res = match self.stream {
WebSocketStreamType::Client { .. } => {
let mut tx = RcRef::map(self, |r| match &r.stream {
WebSocketStreamType::Client { tx, .. } => tx,
@@ -90,7 +91,7 @@ impl WsStreamResource {
})
.borrow_mut()
.await;
- tx.send(message).await?;
+ tx.send(message).await
}
WebSocketStreamType::Server { .. } => {
let mut tx = RcRef::map(self, |r| match &r.stream {
@@ -99,11 +100,15 @@ impl WsStreamResource {
})
.borrow_mut()
.await;
- tx.send(message).await?;
+ tx.send(message).await
}
- }
+ };
- Ok(())
+ match res {
+ Ok(()) => Ok(()),
+ Err(Error::ConnectionClosed) => Ok(()),
+ Err(err) => Err(err.into()),
+ }
}
async fn next_message(