0.3.4-alpha.3.fix.1
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
# file: crates/common/game-realtime-websocket-lib/Cargo.toml
|
||||
# version: 1
|
||||
# version: 2
|
||||
|
||||
[package]
|
||||
name = "game-realtime-websocket-lib"
|
||||
@@ -11,10 +11,10 @@ authors.workspace = true
|
||||
publish.workspace = true
|
||||
|
||||
[dependencies]
|
||||
futures-util = { workspace = true, default-features = false, features = ["sink", "std"] }
|
||||
futures-util = { workspace = true, features = ["sink", "std"] }
|
||||
game-realtime-transport-lib = { path = "../game-realtime-transport-lib" }
|
||||
tokio = { workspace = true, features = ["net"] }
|
||||
tokio-tungstenite = { workspace = true, default-features = false, features = ["connect", "handshake"] }
|
||||
tokio-tungstenite = { workspace = true, features = ["connect", "handshake"] }
|
||||
tracing.workspace = true
|
||||
|
||||
[dev-dependencies]
|
||||
|
||||
@@ -9,13 +9,13 @@
|
||||
|
||||
mod websocket;
|
||||
|
||||
/// Re-export of the WebSocket client connection constructor.
|
||||
pub use self::websocket::connect;
|
||||
/// Re-export of an established WebSocket transport connection.
|
||||
pub use self::websocket::WebSocketConnection;
|
||||
/// Re-export of the receive half of an established WebSocket connection.
|
||||
pub use self::websocket::WebSocketReceiver;
|
||||
/// Re-export of a bound WebSocket server listener.
|
||||
pub use self::websocket::WebSocketListener;
|
||||
/// Re-export of the receive half of an established WebSocket connection.
|
||||
pub use self::websocket::WebSocketReceiver;
|
||||
/// Re-export of the send half of an established WebSocket connection.
|
||||
pub use self::websocket::WebSocketSender;
|
||||
/// Re-export of the WebSocket client connection constructor.
|
||||
pub use self::websocket::connect;
|
||||
|
||||
@@ -73,8 +73,14 @@ pub struct WebSocketSender {
|
||||
}
|
||||
|
||||
impl game_realtime_transport_lib::RealtimeSender for WebSocketSender {
|
||||
type SendFuture<'a> = futures_util::future::LocalBoxFuture<'a, Result<(), game_realtime_transport_lib::TransportError>> where Self: 'a;
|
||||
type CloseFuture<'a> = futures_util::future::LocalBoxFuture<'a, Result<(), game_realtime_transport_lib::TransportError>> where Self: 'a;
|
||||
type SendFuture<'a>
|
||||
= futures_util::future::LocalBoxFuture<'a, Result<(), game_realtime_transport_lib::TransportError>>
|
||||
where
|
||||
Self: 'a;
|
||||
type CloseFuture<'a>
|
||||
= futures_util::future::LocalBoxFuture<'a, Result<(), game_realtime_transport_lib::TransportError>>
|
||||
where
|
||||
Self: 'a;
|
||||
|
||||
fn send(&mut self, message: game_realtime_transport_lib::TransportMessage) -> Self::SendFuture<'_> {
|
||||
return Box::pin(async move {
|
||||
@@ -125,8 +131,8 @@ pub struct WebSocketReceiver {
|
||||
}
|
||||
|
||||
impl game_realtime_transport_lib::RealtimeReceiver for WebSocketReceiver {
|
||||
type ReceiveFuture<'a> =
|
||||
futures_util::future::LocalBoxFuture<'a, Result<game_realtime_transport_lib::TransportReceive, game_realtime_transport_lib::TransportError>>
|
||||
type ReceiveFuture<'a>
|
||||
= futures_util::future::LocalBoxFuture<'a, Result<game_realtime_transport_lib::TransportReceive, game_realtime_transport_lib::TransportError>>
|
||||
where
|
||||
Self: 'a;
|
||||
|
||||
@@ -140,16 +146,13 @@ impl game_realtime_transport_lib::RealtimeReceiver for WebSocketReceiver {
|
||||
match next_message {
|
||||
Some(Ok(tokio_tungstenite::tungstenite::Message::Binary(bytes))) => {
|
||||
tracing::trace!(target: TRACING_TARGET, payload_len = bytes.len(), "binary WebSocket payload received");
|
||||
return Ok(game_realtime_transport_lib::TransportReceive::Message(
|
||||
game_realtime_transport_lib::TransportMessage::new(bytes.to_vec()),
|
||||
));
|
||||
return Ok(game_realtime_transport_lib::TransportReceive::Message(game_realtime_transport_lib::TransportMessage::new(bytes.to_vec())));
|
||||
},
|
||||
Some(Ok(tokio_tungstenite::tungstenite::Message::Close(_))) => {
|
||||
tracing::debug!(target: TRACING_TARGET, "remote WebSocket close observed");
|
||||
return Ok(game_realtime_transport_lib::TransportReceive::Closed);
|
||||
},
|
||||
Some(Ok(tokio_tungstenite::tungstenite::Message::Ping(_)))
|
||||
| Some(Ok(tokio_tungstenite::tungstenite::Message::Pong(_))) => {},
|
||||
Some(Ok(tokio_tungstenite::tungstenite::Message::Ping(_))) | Some(Ok(tokio_tungstenite::tungstenite::Message::Pong(_))) => {},
|
||||
Some(Ok(tokio_tungstenite::tungstenite::Message::Text(_))) => {
|
||||
let error = game_realtime_transport_lib::TransportError::new(
|
||||
game_realtime_transport_lib::TransportErrorKind::Protocol,
|
||||
@@ -193,10 +196,7 @@ impl WebSocketListener {
|
||||
let listener = match tokio::net::TcpListener::bind(address).await {
|
||||
Ok(value) => value,
|
||||
Err(error) => {
|
||||
let mapped = game_realtime_transport_lib::TransportError::new(
|
||||
game_realtime_transport_lib::TransportErrorKind::Bind,
|
||||
error.to_string(),
|
||||
);
|
||||
let mapped = game_realtime_transport_lib::TransportError::new(game_realtime_transport_lib::TransportErrorKind::Bind, error.to_string());
|
||||
tracing::warn!(target: TRACING_TARGET, address = %address, detail = mapped.detail(), "WebSocket listener bind failed");
|
||||
return Err(mapped);
|
||||
},
|
||||
@@ -204,10 +204,7 @@ impl WebSocketListener {
|
||||
let local_addr = match listener.local_addr() {
|
||||
Ok(value) => value,
|
||||
Err(error) => {
|
||||
let mapped = game_realtime_transport_lib::TransportError::new(
|
||||
game_realtime_transport_lib::TransportErrorKind::Bind,
|
||||
error.to_string(),
|
||||
);
|
||||
let mapped = game_realtime_transport_lib::TransportError::new(game_realtime_transport_lib::TransportErrorKind::Bind, error.to_string());
|
||||
tracing::warn!(target: TRACING_TARGET, detail = mapped.detail(), "bound WebSocket listener address lookup failed");
|
||||
return Err(mapped);
|
||||
},
|
||||
@@ -227,10 +224,7 @@ impl WebSocketListener {
|
||||
let (stream, peer_addr) = match self.listener.accept().await {
|
||||
Ok(value) => value,
|
||||
Err(error) => {
|
||||
let mapped = game_realtime_transport_lib::TransportError::new(
|
||||
game_realtime_transport_lib::TransportErrorKind::Accept,
|
||||
error.to_string(),
|
||||
);
|
||||
let mapped = game_realtime_transport_lib::TransportError::new(game_realtime_transport_lib::TransportErrorKind::Accept, error.to_string());
|
||||
tracing::warn!(target: TRACING_TARGET, detail = mapped.detail(), "WebSocket TCP accept failed");
|
||||
return Err(mapped);
|
||||
},
|
||||
@@ -238,10 +232,7 @@ impl WebSocketListener {
|
||||
let websocket = match tokio_tungstenite::accept_async(stream).await {
|
||||
Ok(value) => value,
|
||||
Err(error) => {
|
||||
let mapped = game_realtime_transport_lib::TransportError::new(
|
||||
game_realtime_transport_lib::TransportErrorKind::Accept,
|
||||
error.to_string(),
|
||||
);
|
||||
let mapped = game_realtime_transport_lib::TransportError::new(game_realtime_transport_lib::TransportErrorKind::Accept, error.to_string());
|
||||
tracing::warn!(target: TRACING_TARGET, peer = %peer_addr, detail = mapped.detail(), "WebSocket server handshake failed");
|
||||
return Err(mapped);
|
||||
},
|
||||
|
||||
@@ -45,10 +45,9 @@ async fn binary_round_trip_and_clean_close_work_on_loopback() {
|
||||
assert!(matches!(server_send, Ok(Ok(()))));
|
||||
let client_receive = tokio::time::timeout(TEST_TIMEOUT, client_receiver.receive()).await;
|
||||
match client_receive {
|
||||
Ok(Ok(received)) => assert_eq!(
|
||||
received,
|
||||
game_realtime_transport_lib::TransportReceive::Message(game_realtime_transport_lib::TransportMessage::new(vec![9, 8, 7, 6]))
|
||||
),
|
||||
Ok(Ok(received)) => {
|
||||
assert_eq!(received, game_realtime_transport_lib::TransportReceive::Message(game_realtime_transport_lib::TransportMessage::new(vec![9, 8, 7, 6])))
|
||||
},
|
||||
Ok(Err(error)) => panic!("client receive failed: {error}"),
|
||||
Err(_) => panic!("client receive timed out"),
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user