diff --git a/Cargo.lock b/Cargo.lock index 269a345d60..71ed0c038f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -661,18 +661,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "async-native-tls" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e9e7a929bd34c68a82d58a4de7f86fffdaf97fb2af850162a7bb19dd7269b33" -dependencies = [ - "async-std", - "native-tls", - "thiserror", - "url", -] - [[package]] name = "async-native-tls" version = "0.5.0" @@ -876,17 +864,17 @@ dependencies = [ [[package]] name = "async-tungstenite" -version = "0.16.1" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5682ea0913e5c20780fe5785abacb85a411e7437bf52a1bedb93ddb3972cb8dd" +checksum = "a1e9efbe14612da0a19fb983059a0b621e9cf6225d7018ecab4f9988215540dc" dependencies = [ - "async-native-tls 0.3.3", + "async-native-tls", "async-std", "futures-io", "futures-util", "log", "pin-project-lite", - "tungstenite 0.16.0", + "tungstenite", ] [[package]] @@ -2316,7 +2304,7 @@ name = "client" version = "0.1.0" dependencies = [ "anyhow", - "async-native-tls 0.5.0", + "async-native-tls", "async-recursion 0.3.2", "async-tungstenite", "chrono", @@ -9639,19 +9627,6 @@ dependencies = [ "workspace", ] -[[package]] -name = "sha-1" -version = "0.9.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99cd6713db3cf16b6c84e06321e049a9b9f699826e16096d23bbcc44d15d51a6" -dependencies = [ - "block-buffer 0.9.0", - "cfg-if", - "cpufeatures", - "digest 0.9.0", - "opaque-debug", -] - [[package]] name = "sha1" version = "0.10.6" @@ -11220,7 +11195,7 @@ dependencies = [ "futures-util", "log", "tokio", - "tungstenite 0.20.1", + "tungstenite", ] [[package]] @@ -11693,26 +11668,6 @@ version = "0.21.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" -[[package]] -name = "tungstenite" -version = "0.16.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ad3713a14ae247f22a728a0456a545df14acf3867f905adff84be99e23b3ad1" -dependencies = [ - "base64 0.13.1", - "byteorder", - "bytes 1.5.0", - "http 0.2.9", - "httparse", - "log", - "native-tls", - "rand 0.8.5", - "sha-1", - "thiserror", - "url", - "utf-8", -] - [[package]] name = "tungstenite" version = "0.20.1" @@ -11725,6 +11680,7 @@ dependencies = [ "http 0.2.9", "httparse", "log", + "native-tls", "rand 0.8.5", "sha1", "thiserror", diff --git a/crates/client/Cargo.toml b/crates/client/Cargo.toml index fcc59a2578..579e3297f6 100644 --- a/crates/client/Cargo.toml +++ b/crates/client/Cargo.toml @@ -18,7 +18,7 @@ test-support = ["clock/test-support", "collections/test-support", "gpui/test-sup [dependencies] anyhow.workspace = true async-recursion = "0.3" -async-tungstenite = { version = "0.16", features = ["async-std", "async-native-tls"] } +async-tungstenite = { version = "0.23", features = ["async-std", "async-native-tls"] } chrono = { workspace = true, features = ["serde"] } clock.workspace = true collections.workspace = true diff --git a/crates/collab/Cargo.toml b/crates/collab/Cargo.toml index 7d429fb689..a0f3cdc294 100644 --- a/crates/collab/Cargo.toml +++ b/crates/collab/Cargo.toml @@ -20,7 +20,7 @@ test-support = ["sqlite"] [dependencies] anthropic.workspace = true anyhow.workspace = true -async-tungstenite = "0.16" +async-tungstenite = "0.23" aws-config = { version = "1.1.5" } aws-sdk-s3 = { version = "1.15.0" } axum = { version = "0.6", features = ["json", "headers", "ws"] } diff --git a/crates/collab/src/rpc.rs b/crates/collab/src/rpc.rs index 4960eaa213..0ee3b8d64b 100644 --- a/crates/collab/src/rpc.rs +++ b/crates/collab/src/rpc.rs @@ -12,7 +12,7 @@ use crate::{ executor::Executor, AppState, Error, RateLimit, RateLimiter, Result, }; -use anyhow::{anyhow, Context as _}; +use anyhow::{anyhow, bail, Context as _}; use async_tungstenite::tungstenite::{ protocol::CloseFrame as TungsteniteCloseFrame, Message as TungsteniteMessage, }; @@ -1392,7 +1392,13 @@ pub async fn handle_websocket_request( let socket = socket .map_ok(to_tungstenite_message) .err_into() - .with(|message| async move { Ok(to_axum_message(message)) }); + .with(|message| async move { + if let Some(message) = to_axum_message(message) { + Ok(message) + } else { + bail!("Could not convert a tungstenite message to axum message"); + } + }); let connection = Connection::new(Box::pin(socket)); async move { server @@ -5154,16 +5160,21 @@ async fn get_private_user_info( Ok(()) } -fn to_axum_message(message: TungsteniteMessage) -> AxumMessage { +fn to_axum_message(message: TungsteniteMessage) -> Option { match message { - TungsteniteMessage::Text(payload) => AxumMessage::Text(payload), - TungsteniteMessage::Binary(payload) => AxumMessage::Binary(payload), - TungsteniteMessage::Ping(payload) => AxumMessage::Ping(payload), - TungsteniteMessage::Pong(payload) => AxumMessage::Pong(payload), - TungsteniteMessage::Close(frame) => AxumMessage::Close(frame.map(|frame| AxumCloseFrame { - code: frame.code.into(), - reason: frame.reason, - })), + TungsteniteMessage::Text(payload) => Some(AxumMessage::Text(payload)), + TungsteniteMessage::Binary(payload) => Some(AxumMessage::Binary(payload)), + TungsteniteMessage::Ping(payload) => Some(AxumMessage::Ping(payload)), + TungsteniteMessage::Pong(payload) => Some(AxumMessage::Pong(payload)), + TungsteniteMessage::Close(frame) => { + Some(AxumMessage::Close(frame.map(|frame| AxumCloseFrame { + code: frame.code.into(), + reason: frame.reason, + }))) + } + // we can ignore `Frame` frames as recommended by the tungstenite maintainers + // https://github.com/snapview/tungstenite-rs/issues/268 + TungsteniteMessage::Frame(_) => None, } } diff --git a/crates/rpc/Cargo.toml b/crates/rpc/Cargo.toml index 3ba2cb2dd5..1872eaebf1 100644 --- a/crates/rpc/Cargo.toml +++ b/crates/rpc/Cargo.toml @@ -18,7 +18,7 @@ test-support = ["collections/test-support", "gpui/test-support", "proto/test-sup [dependencies] anyhow.workspace = true -async-tungstenite = "0.16" +async-tungstenite = "0.23" base64.workspace = true chrono.workspace = true collections.workspace = true