Skip to content

Commit d4c13ee

Browse files
authored
Remove event filtering on client's side (#66)
1 parent 9909a1d commit d4c13ee

File tree

11 files changed

+34
-380
lines changed

11 files changed

+34
-380
lines changed

backend/src/bin/client.rs

Lines changed: 3 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,8 @@ use alloy_primitives::B256;
22
use clap::Parser;
33
use execution_events_example::event_listener::EventName;
44
use execution_events_example::serializable_event::SerializableExecEvent;
5-
use execution_events_example::{
6-
event_filter::{ClientMessage, EventFilterSpec},
7-
server::ServerMessage,
8-
};
9-
use execution_events_example::event_filter::load_restricted_filters;
10-
use futures_util::{SinkExt, StreamExt};
5+
use execution_events_example::server::ServerMessage;
6+
use futures_util::StreamExt;
117
use std::collections::HashMap;
128
use tokio_tungstenite::{connect_async, tungstenite::Message};
139

@@ -22,14 +18,6 @@ struct Cli {
2218
#[arg(short, long, default_value = "ws://127.0.0.1:3000")]
2319
url: String,
2420

25-
/// Filter events by type (comma-separated).
26-
/// If not specified, all events are received.
27-
#[arg(short, long, value_delimiter = ',')]
28-
events: Option<Vec<String>>,
29-
30-
#[arg(long, default_value = "false")]
31-
restricted: bool,
32-
3321
#[arg(long, default_value = "false")]
3422
verbose_events: bool,
3523

@@ -79,45 +67,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
7967
let (ws_stream, _) = connect_async(&cli.url).await?;
8068
info!("Connected!");
8169

82-
let (mut write, mut read) = ws_stream.split();
83-
84-
// Build event filter specs for subscription
85-
let event_filters: Vec<EventFilterSpec> = if cli.restricted {
86-
info!("Loading restricted filters");
87-
let restricted_filters = load_restricted_filters();
88-
restricted_filters.get_filter_specs()
89-
} else {
90-
let event_strings = cli.events.clone().unwrap_or_default();
91-
if event_strings.is_empty() {
92-
Vec::new()
93-
} else {
94-
let events: Vec<EventName> = event_strings
95-
.iter()
96-
.map(|s| {
97-
serde_json::from_value(serde_json::Value::String(s.clone()))
98-
.map_err(|_| format!("Invalid event name: {}", s))
99-
})
100-
.collect::<Result<Vec<_>, _>>()?;
101-
events
102-
.iter()
103-
.map(|event_name| EventFilterSpec {
104-
event_name: *event_name,
105-
field_filters: Vec::new(),
106-
})
107-
.collect()
108-
}
109-
};
110-
111-
// Send subscription message
112-
let subscribe_msg = ClientMessage::Subscribe { event_filters: event_filters.clone() };
113-
let subscribe_json = serde_json::to_string(&subscribe_msg)?;
114-
write.send(Message::Text(subscribe_json)).await?;
115-
116-
if event_filters.is_empty() {
117-
info!("Subscribed to all events");
118-
} else {
119-
info!("Subscribed to {} event filters", event_filters.len());
120-
}
70+
let (_, mut read) = ws_stream.split();
12171

12272
// Read messages from the server
12373
let mut events_per_sec_interval = tokio::time::interval(tokio::time::Duration::from_secs(1));

backend/src/lib/event_filter.rs

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -139,33 +139,6 @@ impl EventFilterSpec {
139139
}
140140
}
141141

142-
/// Message sent by client to subscribe to specific event types
143-
#[derive(Debug, Clone, Serialize, Deserialize)]
144-
#[serde(tag = "type")]
145-
pub enum ClientMessage {
146-
/// Subscribe to events with filter specs.
147-
/// Empty event_filters means subscribe to all events.
148-
/// OR logic between specs: event passes if it matches ANY spec.
149-
///
150-
/// Example: Subscribe to all BlockStart OR TxnLog with address=0xABC:
151-
/// ```json
152-
/// {
153-
/// "type": "subscribe",
154-
/// "event_filters": [
155-
/// { "event_name": "BlockStart" },
156-
/// { "event_name": "TxnLog", "field_filters": [
157-
/// { "field": "Address", "filter": { "values": ["0xABC"] } }
158-
/// ]}
159-
/// ]
160-
/// }
161-
/// ```
162-
#[serde(rename = "subscribe")]
163-
Subscribe {
164-
#[serde(default)]
165-
event_filters: Vec<EventFilterSpec>,
166-
},
167-
}
168-
169142
fn is_native_transfer(event: &SerializableEventData) -> bool {
170143
if let SerializableExecEvent::TxnCallFrame {
171144
value,

backend/src/lib/server.rs

Lines changed: 9 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use crate::event_filter::{is_restricted_mode, load_restricted_filters};
1414
use crate::event_listener::EventName;
1515
use crate::top_k_tracker::{AccessEntry, TopKTracker};
1616

17-
use super::event_filter::{ClientMessage, EventFilter};
17+
use super::event_filter::EventFilter;
1818
use super::event_listener::EventData;
1919
use super::serializable_event::SerializableEventData;
2020

@@ -67,61 +67,6 @@ impl TPSTracker {
6767
}
6868
}
6969

70-
/// Wait for the client to send a subscription message, with a timeout.
71-
/// Returns the filter, or None if the client disconnects or times out.
72-
async fn wait_for_subscription(
73-
ws_receiver: &mut SplitStream<WebSocketStream<TcpStream>>,
74-
addr: SocketAddr,
75-
restricted_filters: Option<EventFilter>,
76-
) -> Option<EventFilter> {
77-
let timeout = tokio::time::Duration::from_secs(10);
78-
79-
match tokio::time::timeout(timeout, ws_receiver.next()).await {
80-
Ok(Some(Ok(Message::Text(text)))) => match serde_json::from_str::<ClientMessage>(&text) {
81-
Ok(ClientMessage::Subscribe { event_filters }) => {
82-
let filter = EventFilter::new(event_filters.clone());
83-
if let Some(restricted_filters) = restricted_filters {
84-
if filter != restricted_filters {
85-
warn!(
86-
"Client {} subscription does not match restricted filters, closing connection",
87-
addr
88-
);
89-
return None;
90-
}
91-
}
92-
if filter.accepts_all() {
93-
info!("Client {} subscribed to all events", addr);
94-
} else {
95-
info!("Client {} subscribed with {} event filters", addr, event_filters.len());
96-
}
97-
Some(filter)
98-
}
99-
Err(e) => {
100-
warn!(
101-
"Client {} sent invalid subscription: {} - {}",
102-
addr, e, text
103-
);
104-
None
105-
}
106-
},
107-
Ok(Some(Ok(_))) => {
108-
warn!("Client {} sent non-text message before subscribing", addr);
109-
None
110-
}
111-
Ok(Some(Err(e))) => {
112-
warn!("WebSocket error from {} before subscription: {}", addr, e);
113-
None
114-
}
115-
Ok(None) => {
116-
warn!("Client {} disconnected before subscribing", addr);
117-
None
118-
}
119-
Err(_) => {
120-
warn!("Client {} timed out waiting for subscription", addr);
121-
None
122-
}
123-
}
124-
}
12570

12671
// Helper function to process events into buffers
12772
fn process_event(
@@ -352,7 +297,7 @@ async fn handle_connection(
352297
stream: TcpStream,
353298
addr: SocketAddr,
354299
event_broadcast_receiver: broadcast::Receiver<EventDataOrMetrics>,
355-
restricted_filters: Option<EventFilter>,
300+
filter: EventFilter,
356301
) {
357302
info!("New WebSocket connection from: {}", addr);
358303

@@ -364,13 +309,7 @@ async fn handle_connection(
364309
}
365310
};
366311

367-
let (ws_sender, mut ws_receiver) = ws_stream.split();
368-
369-
// Wait for subscription message before streaming events
370-
let filter = match wait_for_subscription(&mut ws_receiver, addr, restricted_filters).await {
371-
Some(f) => f,
372-
None => return,
373-
};
312+
let (ws_sender, ws_receiver) = ws_stream.split();
374313

375314
// Spawn a task to receive events from the broadcast channel and send batches to this client
376315
let mut send_task = tokio::spawn(client_write_task(
@@ -381,7 +320,7 @@ async fn handle_connection(
381320
));
382321

383322
// Spawn a task to handle incoming messages from the client (mostly for ping/pong)
384-
let mut recv_task = tokio::spawn(client_read_task(addr.clone(), ws_receiver));
323+
let mut recv_task = tokio::spawn(client_read_task(addr, ws_receiver));
385324

386325
// Wait for either task to finish
387326
tokio::select! {
@@ -420,20 +359,20 @@ pub async fn run_websocket_server(
420359
let listener = TcpListener::bind(&server_addr).await?;
421360
info!("WebSocket server listening on: {}", server_addr);
422361

423-
let restricted_filters: Option<EventFilter> = if is_restricted_mode() {
362+
let filter: EventFilter = if is_restricted_mode() {
424363
info!("Running in restricted mode");
425-
Some(load_restricted_filters())
364+
load_restricted_filters()
426365
} else {
427366
info!("Running in unrestricted mode");
428-
None
367+
EventFilter::default()
429368
};
430369

431370
// Accept incoming connections
432371
loop {
433372
match listener.accept().await {
434-
Ok((stream, client_addr)) => {
373+
Ok((stream, client_addr)) => {
435374
let event_broadcast_receiver = event_broadcast_sender.subscribe();
436-
tokio::spawn(handle_connection(stream, client_addr, event_broadcast_receiver, restricted_filters.clone()));
375+
tokio::spawn(handle_connection(stream, client_addr, event_broadcast_receiver, filter.clone()));
437376
}
438377
Err(e) => {
439378
error!("Error accepting connection: {}", e);

0 commit comments

Comments
 (0)