refactor(tests): reformat code and update dependency management
- Reorganized import statements in adapter tests for better readability - Replaced or_insert_with(Vec::new) with or_default() in test closures - Updated Cargo.lock with new dependency versions and checksums - Added TLS features to tonic dependency configuration - Included sqlx, chrono, and uuid dependencies with specific features - Added jsonwebtoken and arc-swap as project dependencies - Reformatted assertion statements to comply with line length limits - Adjusted base64 import order in engine codec module - Updated protobuf include statement formatting
This commit is contained in:
+55
-41
@@ -103,8 +103,14 @@ impl SocketServerBuilder {
|
||||
let adapter = adapter_clone.clone();
|
||||
tokio::spawn(async move {
|
||||
handle_engine_message(
|
||||
sid, engine_packet, &namespaces, &socket_txs, &engine_store, &adapter,
|
||||
).await;
|
||||
sid,
|
||||
engine_packet,
|
||||
&namespaces,
|
||||
&socket_txs,
|
||||
&engine_store,
|
||||
&adapter,
|
||||
)
|
||||
.await;
|
||||
});
|
||||
},
|
||||
));
|
||||
@@ -136,10 +142,18 @@ async fn handle_engine_message(
|
||||
adapter: &Arc<dyn Adapter>,
|
||||
) {
|
||||
if let EnginePacketData::Text(ref text) = engine_packet.data {
|
||||
if let Ok(socket_packet) = parser::decode(text) {
|
||||
match socket_packet.packet_type {
|
||||
match parser::decode(text) {
|
||||
Ok(socket_packet) => match socket_packet.packet_type {
|
||||
PacketType::Connect => {
|
||||
handle_connect(&engine_sid, &socket_packet, namespaces, socket_txs, engine_store, adapter).await;
|
||||
handle_connect(
|
||||
&engine_sid,
|
||||
&socket_packet,
|
||||
namespaces,
|
||||
socket_txs,
|
||||
engine_store,
|
||||
adapter,
|
||||
)
|
||||
.await;
|
||||
}
|
||||
PacketType::Disconnect => {
|
||||
handle_disconnect(&engine_sid, &socket_packet, namespaces, socket_txs);
|
||||
@@ -151,6 +165,9 @@ async fn handle_engine_message(
|
||||
handle_ack(&engine_sid, &socket_packet);
|
||||
}
|
||||
_ => {}
|
||||
},
|
||||
Err(e) => {
|
||||
tracing::warn!(engine_sid = %engine_sid, error = %e, "Invalid Socket.IO packet");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -166,22 +183,21 @@ async fn handle_connect(
|
||||
) {
|
||||
// Validate namespace path to prevent DoS via arbitrary namespace creation
|
||||
if !crate::socket::namespace::is_valid_namespace(&packet.namespace) {
|
||||
tracing::warn!("Rejected connect with invalid namespace: {}", packet.namespace);
|
||||
tracing::warn!(
|
||||
"Rejected connect with invalid namespace: {}",
|
||||
packet.namespace
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
let namespace = namespaces.get_or_create_namespace(&packet.namespace);
|
||||
|
||||
// Ensure newly created namespaces get the shared adapter
|
||||
// Ensure newly created namespaces get the shared adapter before registration.
|
||||
{
|
||||
let ns_adapter = namespace.adapter.read().await;
|
||||
if ns_adapter.is_none() {
|
||||
drop(ns_adapter);
|
||||
let adapter_ref = adapter.clone();
|
||||
let ns_clone = namespace.clone();
|
||||
tokio::spawn(async move {
|
||||
ns_clone.set_adapter(adapter_ref).await;
|
||||
});
|
||||
namespace.set_adapter(adapter.clone()).await;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -198,7 +214,10 @@ async fn handle_connect(
|
||||
|
||||
// Run connect handler and add to namespace.
|
||||
// If the handler rejects, clean up and do NOT send a Connect response.
|
||||
if let Err(msg) = namespace.add_socket(socket.clone()).await {
|
||||
if let Err(msg) = namespace
|
||||
.add_socket(socket.clone(), packet.data.as_ref())
|
||||
.await
|
||||
{
|
||||
tracing::warn!("Socket {} connection rejected: {}", socket_sid, msg);
|
||||
socket_txs.remove(&socket_sid);
|
||||
return;
|
||||
@@ -227,7 +246,9 @@ async fn handle_connect(
|
||||
}
|
||||
// Forwarding task ended — ensure socket is cleaned up from namespace
|
||||
socket_txs_clone.remove(&socket_sid_clone);
|
||||
namespace_clone.remove_socket_by_sid(&socket_sid_clone).await;
|
||||
namespace_clone
|
||||
.remove_socket_by_sid(&socket_sid_clone)
|
||||
.await;
|
||||
});
|
||||
|
||||
// Send Connect response (only after handler passed)
|
||||
@@ -260,34 +281,27 @@ fn handle_disconnect(
|
||||
}
|
||||
}
|
||||
|
||||
fn handle_event(
|
||||
engine_sid: &str,
|
||||
packet: &Packet,
|
||||
namespaces: &Arc<NamespaceManager>,
|
||||
) {
|
||||
if let Some(namespace) = namespaces.get_namespace(&packet.namespace) {
|
||||
if let Some(socket) = namespace.get_socket_by_engine_sid(engine_sid) {
|
||||
if let Some(ref data) = packet.data {
|
||||
if let Some(arr) = data.as_array() {
|
||||
if let Some(event) = arr.first().and_then(|v| v.as_str()) {
|
||||
let event_data = if arr.len() > 1 {
|
||||
serde_json::Value::Array(arr[1..].to_vec())
|
||||
} else {
|
||||
serde_json::Value::Null
|
||||
};
|
||||
fn handle_event(engine_sid: &str, packet: &Packet, namespaces: &Arc<NamespaceManager>) {
|
||||
if let Some(namespace) = namespaces.get_namespace(&packet.namespace)
|
||||
&& let Some(socket) = namespace.get_socket_by_engine_sid(engine_sid)
|
||||
&& let Some(ref data) = packet.data
|
||||
&& let Some(arr) = data.as_array()
|
||||
&& let Some(event) = arr.first().and_then(|v| v.as_str())
|
||||
{
|
||||
let event_data = if arr.len() > 1 {
|
||||
serde_json::Value::Array(arr[1..].to_vec())
|
||||
} else {
|
||||
serde_json::Value::Null
|
||||
};
|
||||
|
||||
let namespace_clone = namespace.clone();
|
||||
let event = event.to_string();
|
||||
let socket_clone = socket.clone();
|
||||
tokio::spawn(async move {
|
||||
namespace_clone
|
||||
.handle_event(&socket_clone, &event, &event_data)
|
||||
.await;
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
let namespace_clone = namespace.clone();
|
||||
let event = event.to_string();
|
||||
let socket_clone = socket.clone();
|
||||
tokio::spawn(async move {
|
||||
namespace_clone
|
||||
.handle_event(socket_clone, &event, &event_data)
|
||||
.await;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user