From 04f7ab3cde9fad9ede58d9c224f8dcd1db3c50d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Th=C3=A9odore=20Pr=C3=A9vot?= Date: Tue, 25 Jun 2024 13:55:09 +0200 Subject: [PATCH] fix(socketio/packet): generic ns path to avoid .into() everywhere (#340) --- socketioxide/src/ack.rs | 16 ++-- socketioxide/src/packet.rs | 133 ++++++++++++++----------------- socketioxide/src/socket.rs | 3 +- socketioxide/tests/connect.rs | 2 +- socketioxide/tests/extractors.rs | 2 +- 5 files changed, 72 insertions(+), 84 deletions(-) diff --git a/socketioxide/src/ack.rs b/socketioxide/src/ack.rs index ec6e21e2..75588037 100644 --- a/socketioxide/src/ack.rs +++ b/socketioxide/src/ack.rs @@ -327,12 +327,12 @@ mod test { async fn broadcast_ack() { let socket = create_socket(); let socket2 = create_socket(); - let mut packet = Packet::event("/".into(), "test", "test".into()); + let mut packet = Packet::event("/", "test", "test".into()); packet.inner.set_ack_id(1); let socks = vec![socket.clone().into(), socket2.clone().into()]; let stream: AckStream = AckInnerStream::broadcast(packet, socks, None).into(); - let res_packet = Packet::ack("test".into(), "test".into(), 1); + let res_packet = Packet::ack("test", "test".into(), 1); socket.recv(res_packet.inner.clone()).unwrap(); socket2.recv(res_packet.inner).unwrap(); @@ -383,12 +383,12 @@ mod test { async fn broadcast_ack_with_deserialize_error() { let socket = create_socket(); let socket2 = create_socket(); - let mut packet = Packet::event("/".into(), "test", "test".into()); + let mut packet = Packet::event("/", "test", "test".into()); packet.inner.set_ack_id(1); let socks = vec![socket.clone().into(), socket2.clone().into()]; let stream: AckStream = AckInnerStream::broadcast(packet, socks, None).into(); - let res_packet = Packet::ack("test".into(), 132.into(), 1); + let res_packet = Packet::ack("test", 132.into(), 1); socket.recv(res_packet.inner.clone()).unwrap(); socket2.recv(res_packet.inner).unwrap(); @@ -447,12 +447,12 @@ mod test { async fn broadcast_ack_with_closed_socket() { let socket = create_socket(); let socket2 = create_socket(); - let mut packet = Packet::event("/".into(), "test", "test".into()); + let mut packet = Packet::event("/", "test", "test".into()); packet.inner.set_ack_id(1); let socks = vec![socket.clone().into(), socket2.clone().into()]; let stream: AckStream = AckInnerStream::broadcast(packet, socks, None).into(); - let res_packet = Packet::ack("test".into(), "test".into(), 1); + let res_packet = Packet::ack("test", "test".into(), 1); socket.clone().recv(res_packet.inner.clone()).unwrap(); futures_util::pin_mut!(stream); @@ -502,14 +502,14 @@ mod test { async fn broadcast_ack_with_timeout() { let socket = create_socket(); let socket2 = create_socket(); - let mut packet = Packet::event("/".into(), "test", "test".into()); + let mut packet = Packet::event("/", "test", "test".into()); packet.inner.set_ack_id(1); let socks = vec![socket.clone().into(), socket2.clone().into()]; let stream: AckStream = AckInnerStream::broadcast(packet, socks, Some(Duration::from_millis(10))).into(); socket - .recv(Packet::ack("test".into(), "test".into(), 1).inner) + .recv(Packet::ack("test", "test".into(), 1).inner) .unwrap(); futures_util::pin_mut!(stream); diff --git a/socketioxide/src/packet.rs b/socketioxide/src/packet.rs index e72751da..f5e65507 100644 --- a/socketioxide/src/packet.rs +++ b/socketioxide/src/packet.rs @@ -24,7 +24,7 @@ pub struct Packet<'a> { impl<'a> Packet<'a> { /// Send a connect packet with a default payload for v5 and no payload for v4 pub fn connect( - ns: Str, + ns: impl Into, #[allow(unused_variables)] sid: Sid, #[allow(unused_variables)] protocol: ProtocolVersion, ) -> Self { @@ -36,8 +36,8 @@ impl<'a> Packet<'a> { #[cfg(feature = "v4")] { match protocol { - ProtocolVersion::V4 => Self::connect_v4(ns), - ProtocolVersion::V5 => Self::connect_v5(ns, sid), + ProtocolVersion::V4 => Self::connect_v4(ns.into()), + ProtocolVersion::V5 => Self::connect_v5(ns.into(), sid), } } } @@ -61,59 +61,64 @@ impl<'a> Packet<'a> { } /// Create a disconnect packet for the given namespace - pub fn disconnect(ns: Str) -> Self { + pub fn disconnect(ns: impl Into) -> Self { Self { inner: PacketData::Disconnect, - ns, + ns: ns.into(), } } } impl<'a> Packet<'a> { /// Create a connect error packet for the given namespace with a message - pub fn connect_error(ns: Str, message: &str) -> Self { + pub fn connect_error(ns: impl Into, message: &str) -> Self { let message = serde_json::to_string(message).unwrap(); let packet = format!(r#"{{"message":{}}}"#, message); Self { inner: PacketData::ConnectError(packet), - ns, + ns: ns.into(), } } /// Create an event packet for the given namespace - pub fn event(ns: Str, e: impl Into>, data: Value) -> Self { + pub fn event(ns: impl Into, e: impl Into>, data: Value) -> Self { Self { inner: PacketData::Event(e.into(), data, None), - ns, + ns: ns.into(), } } /// Create a binary event packet for the given namespace - pub fn bin_event(ns: Str, e: impl Into>, data: Value, bin: Vec) -> Self { + pub fn bin_event( + ns: impl Into, + e: impl Into>, + data: Value, + bin: Vec, + ) -> Self { debug_assert!(!bin.is_empty()); let packet = BinaryPacket::outgoing(data, bin); Self { inner: PacketData::BinaryEvent(e.into(), packet, None), - ns, + ns: ns.into(), } } /// Create an ack packet for the given namespace - pub fn ack(ns: Str, data: Value, ack: i64) -> Self { + pub fn ack(ns: impl Into, data: Value, ack: i64) -> Self { Self { inner: PacketData::EventAck(data, ack), - ns, + ns: ns.into(), } } /// Create a binary ack packet for the given namespace - pub fn bin_ack(ns: Str, data: Value, bin: Vec, ack: i64) -> Self { + pub fn bin_ack(ns: impl Into, data: Value, bin: Vec, ack: i64) -> Self { debug_assert!(!bin.is_empty()); let packet = BinaryPacket::outgoing(data, bin); Self { inner: PacketData::BinaryAck(packet, ack), - ns, + ns: ns.into(), } } @@ -542,31 +547,25 @@ mod test { let payload = format!("0{}", json!({ "sid": sid })); let packet = Packet::try_from(payload).unwrap(); - assert_eq!( - Packet::connect("/".into(), sid, ProtocolVersion::V5), - packet - ); + assert_eq!(Packet::connect("/", sid, ProtocolVersion::V5), packet); let payload = format!("0/admin™,{}", json!({ "sid": sid })); let packet = Packet::try_from(payload).unwrap(); - assert_eq!( - Packet::connect("/admin™".into(), sid, ProtocolVersion::V5), - packet - ); + assert_eq!(Packet::connect("/admin™", sid, ProtocolVersion::V5), packet); } #[test] fn packet_encode_connect() { let sid = Sid::new(); let payload = format!("0{}", json!({ "sid": sid })); - let packet: String = Packet::connect("/".into(), sid, ProtocolVersion::V5) + let packet: String = Packet::connect("/", sid, ProtocolVersion::V5) .try_into() .unwrap(); assert_eq!(packet, payload); let payload = format!("0/admin™,{}", json!({ "sid": sid })); - let packet: String = Packet::connect("/admin™".into(), sid, ProtocolVersion::V5) + let packet: String = Packet::connect("/admin™", sid, ProtocolVersion::V5) .try_into() .unwrap(); assert_eq!(packet, payload); @@ -578,21 +577,21 @@ mod test { fn packet_decode_disconnect() { let payload = "1".to_string(); let packet = Packet::try_from(payload).unwrap(); - assert_eq!(Packet::disconnect("/".into()), packet); + assert_eq!(Packet::disconnect("/"), packet); let payload = "1/admin™,".to_string(); let packet = Packet::try_from(payload).unwrap(); - assert_eq!(Packet::disconnect("/admin™".into()), packet); + assert_eq!(Packet::disconnect("/admin™"), packet); } #[test] fn packet_encode_disconnect() { let payload = "1".to_string(); - let packet: String = Packet::disconnect("/".into()).try_into().unwrap(); + let packet: String = Packet::disconnect("/").try_into().unwrap(); assert_eq!(packet, payload); let payload = "1/admin™,".to_string(); - let packet: String = Packet::disconnect("/admin™".into()).try_into().unwrap(); + let packet: String = Packet::disconnect("/admin™").try_into().unwrap(); assert_eq!(packet, payload); } @@ -603,7 +602,7 @@ mod test { let packet = Packet::try_from(payload).unwrap(); assert_eq!( - Packet::event("/".into(), "event", json!([{"data": "value"}])), + Packet::event("/", "event", json!([{"data": "value"}])), packet ); @@ -611,7 +610,7 @@ mod test { let payload = format!("21{}", json!(["event", { "data": "value" }])); let packet = Packet::try_from(payload).unwrap(); - let mut comparison_packet = Packet::event("/".into(), "event", json!([{"data": "value"}])); + let mut comparison_packet = Packet::event("/", "event", json!([{"data": "value"}])); comparison_packet.inner.set_ack_id(1); assert_eq!(packet, comparison_packet); @@ -620,7 +619,7 @@ mod test { let packet = Packet::try_from(payload).unwrap(); assert_eq!( - Packet::event("/admin™".into(), "event", json!([{"data": "value™"}])), + Packet::event("/admin™", "event", json!([{"data": "value™"}])), packet ); @@ -629,8 +628,7 @@ mod test { let mut packet = Packet::try_from(payload).unwrap(); packet.inner.set_ack_id(1); - let mut comparison_packet = - Packet::event("/admin™".into(), "event", json!([{"data": "value™"}])); + let mut comparison_packet = Packet::event("/admin™", "event", json!([{"data": "value™"}])); comparison_packet.inner.set_ack_id(1); assert_eq!(packet, comparison_packet); @@ -639,7 +637,7 @@ mod test { #[test] fn packet_encode_event() { let payload = format!("2{}", json!(["event", { "data": "value™" }])); - let packet: String = Packet::event("/".into(), "event", json!({ "data": "value™" })) + let packet: String = Packet::event("/", "event", json!({ "data": "value™" })) .try_into() .unwrap(); @@ -647,15 +645,13 @@ mod test { // Encode empty data let payload = format!("2{}", json!(["event", []])); - let packet: String = Packet::event("/".into(), "event", json!([])) - .try_into() - .unwrap(); + let packet: String = Packet::event("/", "event", json!([])).try_into().unwrap(); assert_eq!(packet, payload); // Encode with ack ID let payload = format!("21{}", json!(["event", { "data": "value™" }])); - let mut packet = Packet::event("/".into(), "event", json!({ "data": "value™" })); + let mut packet = Packet::event("/", "event", json!({ "data": "value™" })); packet.inner.set_ack_id(1); let packet: String = packet.try_into().unwrap(); @@ -663,7 +659,7 @@ mod test { // Encode with NS let payload = format!("2/admin™,{}", json!(["event", { "data": "value™" }])); - let packet: String = Packet::event("/admin™".into(), "event", json!({"data": "value™"})) + let packet: String = Packet::event("/admin™", "event", json!({"data": "value™"})) .try_into() .unwrap(); @@ -671,7 +667,7 @@ mod test { // Encode with NS and ack ID let payload = format!("2/admin™,1{}", json!(["event", { "data": "value™" }])); - let mut packet = Packet::event("/admin™".into(), "event", json!([{"data": "value™"}])); + let mut packet = Packet::event("/admin™", "event", json!([{"data": "value™"}])); packet.inner.set_ack_id(1); let packet: String = packet.try_into().unwrap(); assert_eq!(packet, payload); @@ -683,24 +679,22 @@ mod test { let payload = "354[\"data\"]".to_string(); let packet = Packet::try_from(payload).unwrap(); - assert_eq!(Packet::ack("/".into(), json!(["data"]), 54), packet); + assert_eq!(Packet::ack("/", json!(["data"]), 54), packet); let payload = "3/admin™,54[\"data\"]".to_string(); let packet = Packet::try_from(payload).unwrap(); - assert_eq!(Packet::ack("/admin™".into(), json!(["data"]), 54), packet); + assert_eq!(Packet::ack("/admin™", json!(["data"]), 54), packet); } #[test] fn packet_encode_event_ack() { let payload = "354[\"data\"]".to_string(); - let packet: String = Packet::ack("/".into(), json!("data"), 54) - .try_into() - .unwrap(); + let packet: String = Packet::ack("/", json!("data"), 54).try_into().unwrap(); assert_eq!(packet, payload); let payload = "3/admin™,54[\"data\"]".to_string(); - let packet: String = Packet::ack("/admin™".into(), json!("data"), 54) + let packet: String = Packet::ack("/admin™", json!("data"), 54) .try_into() .unwrap(); assert_eq!(packet, payload); @@ -709,13 +703,13 @@ mod test { #[test] fn packet_encode_connect_error() { let payload = format!("4{}", json!({ "message": "Invalid namespace" })); - let packet: String = Packet::connect_error("/".into(), "Invalid namespace") + let packet: String = Packet::connect_error("/", "Invalid namespace") .try_into() .unwrap(); assert_eq!(packet, payload); let payload = format!("4/admin™,{}", json!({ "message": "Invalid namespace" })); - let packet: String = Packet::connect_error("/admin™".into(), "Invalid namespace") + let packet: String = Packet::connect_error("/admin™", "Invalid namespace") .try_into() .unwrap(); assert_eq!(packet, payload); @@ -728,7 +722,7 @@ mod test { let payload = format!("51-{}", json); let packet: String = Packet::bin_event( - "/".into(), + "/", "event", json!({ "data": "value™" }), vec![Bytes::from_static(&[1])], @@ -741,7 +735,7 @@ mod test { // Encode with ack ID let payload = format!("51-254{}", json); let mut packet = Packet::bin_event( - "/".into(), + "/", "event", json!({ "data": "value™" }), vec![Bytes::from_static(&[1])], @@ -754,7 +748,7 @@ mod test { // Encode with NS let payload = format!("51-/admin™,{}", json); let packet: String = Packet::bin_event( - "/admin™".into(), + "/admin™", "event", json!([{"data": "value™"}]), vec![Bytes::from_static(&[1])], @@ -767,7 +761,7 @@ mod test { // Encode with NS and ack ID let payload = format!("51-/admin™,254{}", json); let mut packet = Packet::bin_event( - "/admin™".into(), + "/admin™", "event", json!([{"data": "value™"}]), vec![Bytes::from_static(&[1])], @@ -839,7 +833,7 @@ mod test { let payload = format!("61-54{}", json); let packet: String = Packet::bin_ack( - "/".into(), + "/", json!({ "data": "value™" }), vec![Bytes::from_static(&[1])], 54, @@ -852,7 +846,7 @@ mod test { // Encode with NS let payload = format!("61-/admin™,54{}", json); let packet: String = Packet::bin_ack( - "/admin™".into(), + "/admin™", json!({ "data": "value™" }), vec![Bytes::from_static(&[1])], 54, @@ -902,35 +896,35 @@ mod test { fn packet_size_hint() { let sid = Sid::new(); let len = serde_json::to_string(&ConnectPacket { sid }).unwrap().len(); - let packet = Packet::connect("/".into(), sid, ProtocolVersion::V5); + let packet = Packet::connect("/", sid, ProtocolVersion::V5); assert_eq!(packet.get_size_hint(), len + 1); - let packet = Packet::connect("/admin".into(), sid, ProtocolVersion::V5); + let packet = Packet::connect("/admin", sid, ProtocolVersion::V5); assert_eq!(packet.get_size_hint(), len + 8); - let packet = Packet::connect("admin".into(), sid, ProtocolVersion::V4); + let packet = Packet::connect("admin", sid, ProtocolVersion::V4); assert_eq!(packet.get_size_hint(), 8); - let packet = Packet::disconnect("/".into()); + let packet = Packet::disconnect("/"); assert_eq!(packet.get_size_hint(), 1); - let packet = Packet::disconnect("/admin".into()); + let packet = Packet::disconnect("/admin"); assert_eq!(packet.get_size_hint(), 8); - let packet = Packet::event("/".into(), "event", json!({ "data": "value™" })); + let packet = Packet::event("/", "event", json!({ "data": "value™" })); assert_eq!(packet.get_size_hint(), 1); - let packet = Packet::event("/admin".into(), "event", json!({ "data": "value™" })); + let packet = Packet::event("/admin", "event", json!({ "data": "value™" })); assert_eq!(packet.get_size_hint(), 8); - let packet = Packet::ack("/".into(), json!("data"), 54); + let packet = Packet::ack("/", json!("data"), 54); assert_eq!(packet.get_size_hint(), 3); - let packet = Packet::ack("/admin".into(), json!("data"), 54); + let packet = Packet::ack("/admin", json!("data"), 54); assert_eq!(packet.get_size_hint(), 10); let packet = Packet::bin_event( - "/".into(), + "/", "event", json!({ "data": "value™" }), vec![Bytes::from_static(&[1])], @@ -938,19 +932,14 @@ mod test { assert_eq!(packet.get_size_hint(), 3); let packet = Packet::bin_event( - "/admin".into(), + "/admin", "event", json!({ "data": "value™" }), vec![Bytes::from_static(&[1])], ); assert_eq!(packet.get_size_hint(), 10); - let packet = Packet::bin_ack( - "/".into(), - json!("data"), - vec![Bytes::from_static(&[1])], - 54, - ); + let packet = Packet::bin_ack("/", json!("data"), vec![Bytes::from_static(&[1])], 54); assert_eq!(packet.get_size_hint(), 5); } } diff --git a/socketioxide/src/socket.rs b/socketioxide/src/socket.rs index 7470e243..459985ec 100644 --- a/socketioxide/src/socket.rs +++ b/socketioxide/src/socket.rs @@ -844,7 +844,6 @@ impl Socket { #[cfg(test)] mod test { use super::*; - use engineioxide::Str; #[tokio::test] async fn send_with_ack_error() { @@ -854,7 +853,7 @@ mod test { // Saturate the channel for _ in 0..1024 { socket - .send(Packet::event(Str::from("test"), "test", Value::Null)) + .send(Packet::event("test", "test", Value::Null)) .unwrap(); } diff --git a/socketioxide/tests/connect.rs b/socketioxide/tests/connect.rs index c2b2a3ee..7f59e97b 100644 --- a/socketioxide/tests/connect.rs +++ b/socketioxide/tests/connect.rs @@ -12,7 +12,7 @@ fn create_msg( event: &str, data: impl Into, ) -> engineioxide::Packet { - let packet: String = Packet::event(ns.into(), event, data.into()).into(); + let packet: String = Packet::event(ns, event, data.into()).into(); Message(packet.into()) } async fn timeout_rcv(srx: &mut tokio::sync::mpsc::Receiver) -> T { diff --git a/socketioxide/tests/extractors.rs b/socketioxide/tests/extractors.rs index 5d9b47cf..296d5fdd 100644 --- a/socketioxide/tests/extractors.rs +++ b/socketioxide/tests/extractors.rs @@ -26,7 +26,7 @@ async fn timeout_rcv_err(srx: &mut tokio::sync::mpsc::Receiv } fn create_msg(ns: &'static str, event: &str, data: impl Into) -> EioPacket { - let packet: String = Packet::event(ns.into(), event, data.into()).into(); + let packet: String = Packet::event(ns, event, data.into()).into(); EioPacket::Message(packet.into()) }