You've already forked comprehensive-rust
mirror of
https://github.com/google/comprehensive-rust.git
synced 2025-06-16 22:27:34 +02:00
Update dependencies in chat-app exercise (#1195)
Hello there 👋 I'm the author of the `tokio-websockets` crate and today we published version `0.4.0` of the crate, which finally makes the public API consistent and aligns it with expectations. `WebsocketStream` now implements the `Stream` trait, so calling `next()` has to be done via `StreamExt` now. `connect()` returns a tuple of `(WebsocketStream, Response)`, so that has to be deconstructed now. And finally, `as_text()` now returns an `Option<&str>` instead of `Result<&str, Error>`. And, *very* importantly: The old `WebsocketStream::next` was **not** cancellation safe, the new `Stream` implementation is. The exercise uses `select!`, which very well might have caused misbehavior. Since we also emptied the default features, I've added the very minimal ones required to compile the exercise. This is my first contribution here, so feel free to point me to some things if I'm missing anything. I wasn't really sure what to do about the translations, I guess I should leave them as is and they'll be updated by translators in other PRs? Signed-off-by: Jens Reidel <adrian@travitia.xyz>
This commit is contained in:
@ -25,8 +25,8 @@ You are going to need the following functions from `tokio` and
|
||||
[`tokio_websockets`][2]. Spend a few minutes to familiarize yourself with the
|
||||
API.
|
||||
|
||||
- [WebsocketStream::next()][3]: for asynchronously reading messages from a
|
||||
Websocket Stream.
|
||||
- [StreamExt::next()][3] implemented by `WebsocketStream`: for asynchronously
|
||||
reading messages from a Websocket Stream.
|
||||
- [SinkExt::send()][4] implemented by `WebsocketStream`: for asynchronously
|
||||
sending messages on a Websocket Stream.
|
||||
- [Lines::next_line()][5]: for asynchronously reading user messages
|
||||
@ -101,8 +101,8 @@ cargo run --bin client
|
||||
clients, but the sender of the message.
|
||||
|
||||
[1]: https://docs.rs/tokio/latest/tokio/sync/broadcast/fn.channel.html
|
||||
[2]: https://docs.rs/tokio-websockets/0.3.2/tokio_websockets/
|
||||
[3]: https://docs.rs/tokio-websockets/0.3.2/tokio_websockets/proto/struct.WebsocketStream.html#method.next
|
||||
[2]: https://docs.rs/tokio-websockets/0.4.0/tokio_websockets/
|
||||
[3]: https://docs.rs/futures-util/0.3.28/futures_util/stream/trait.StreamExt.html#method.next
|
||||
[4]: https://docs.rs/futures-util/0.3.28/futures_util/sink/trait.SinkExt.html#method.send
|
||||
[5]: https://docs.rs/tokio/latest/tokio/io/struct.Lines.html#method.next_line
|
||||
[6]: https://docs.rs/tokio/latest/tokio/sync/broadcast/struct.Sender.html#method.subscribe
|
||||
|
@ -4,7 +4,7 @@ version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
futures-util = "0.3.28"
|
||||
futures-util = { version = "0.3.28", features = ["sink"] }
|
||||
http = "0.2.9"
|
||||
tokio = { version = "1.28.1", features = ["full"] }
|
||||
tokio-websockets = "0.3.2"
|
||||
tokio-websockets = { version = "0.4.0", features = ["client", "fastrand", "server", "sha1_smol"] }
|
||||
|
@ -13,6 +13,7 @@
|
||||
// limitations under the License.
|
||||
|
||||
// ANCHOR: setup
|
||||
use futures_util::stream::StreamExt;
|
||||
use futures_util::SinkExt;
|
||||
use http::Uri;
|
||||
use tokio::io::{AsyncBufReadExt, BufReader};
|
||||
@ -20,9 +21,10 @@ use tokio_websockets::{ClientBuilder, Message};
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() -> Result<(), tokio_websockets::Error> {
|
||||
let mut ws_stream = ClientBuilder::from_uri(Uri::from_static("ws://127.0.0.1:2000"))
|
||||
.connect()
|
||||
.await?;
|
||||
let (mut ws_stream, _) =
|
||||
ClientBuilder::from_uri(Uri::from_static("ws://127.0.0.1:2000"))
|
||||
.connect()
|
||||
.await?;
|
||||
|
||||
let stdin = tokio::io::stdin();
|
||||
let mut stdin = BufReader::new(stdin).lines();
|
||||
@ -33,7 +35,11 @@ async fn main() -> Result<(), tokio_websockets::Error> {
|
||||
tokio::select! {
|
||||
incoming = ws_stream.next() => {
|
||||
match incoming {
|
||||
Some(Ok(msg)) => println!("From server: {}", msg.as_text()?),
|
||||
Some(Ok(msg)) => {
|
||||
if let Some(text) = msg.as_text() {
|
||||
println!("From server: {}", text);
|
||||
}
|
||||
},
|
||||
Some(Err(err)) => return Err(err.into()),
|
||||
None => return Ok(()),
|
||||
}
|
||||
|
@ -14,6 +14,7 @@
|
||||
|
||||
// ANCHOR: setup
|
||||
use futures_util::sink::SinkExt;
|
||||
use futures_util::stream::StreamExt;
|
||||
use std::error::Error;
|
||||
use std::net::SocketAddr;
|
||||
use tokio::net::{TcpListener, TcpStream};
|
||||
@ -42,9 +43,10 @@ async fn handle_connection(
|
||||
incoming = ws_stream.next() => {
|
||||
match incoming {
|
||||
Some(Ok(msg)) => {
|
||||
let msg = msg.as_text()?;
|
||||
println!("From client {addr:?} {msg:?}");
|
||||
bcast_tx.send(msg.into())?;
|
||||
if let Some(text) = msg.as_text() {
|
||||
println!("From client {addr:?} {text:?}");
|
||||
bcast_tx.send(text.into())?;
|
||||
}
|
||||
}
|
||||
Some(Err(err)) => return Err(err.into()),
|
||||
None => return Ok(()),
|
||||
|
Reference in New Issue
Block a user