11use super :: connection:: { BrowserConnection , MessageHandler } ;
22use super :: error:: { EventBusError , Result } ;
33use super :: global:: EnvConnectionPayload ;
4- use super :: message:: Message ;
4+ use super :: message:: { Message , MessageType } ;
55use super :: topics:: Topic ;
66use super :: transport:: PipeServer ;
77use crate :: infrastructure:: diagnostics:: { log_error, log_info, log_warn} ;
88use serde:: { Deserialize , Serialize } ;
99use std:: collections:: HashMap ;
1010use std:: sync:: Arc ;
11- use tokio:: sync:: { RwLock , mpsc} ;
11+ use tokio:: sync:: { RwLock , mpsc, oneshot } ;
1212
1313#[ derive( Debug , Clone , Serialize , Deserialize ) ]
1414pub struct FingerprintConfig {
@@ -110,6 +110,7 @@ type AuthInfoProvider = Arc<dyn Fn() -> AuthInfo + Send + Sync>;
110110
111111pub struct EventBusManager {
112112 connections : Arc < RwLock < HashMap < String , Arc < BrowserConnection > > > > ,
113+ pending_requests : Arc < RwLock < HashMap < String , HashMap < u32 , oneshot:: Sender < Message > > > > > ,
113114 message_handler : Arc < RwLock < Option < MessageHandler > > > ,
114115 disconnect_handler : Arc < RwLock < Option < DisconnectHandler > > > ,
115116 connection_status_handler : Arc < RwLock < Option < ConnectionStatusHandler > > > ,
@@ -122,6 +123,7 @@ impl EventBusManager {
122123 pub fn new ( ) -> Self {
123124 Self {
124125 connections : Arc :: new ( RwLock :: new ( HashMap :: new ( ) ) ) ,
126+ pending_requests : Arc :: new ( RwLock :: new ( HashMap :: new ( ) ) ) ,
125127 message_handler : Arc :: new ( RwLock :: new ( None ) ) ,
126128 disconnect_handler : Arc :: new ( RwLock :: new ( None ) ) ,
127129 connection_status_handler : Arc :: new ( RwLock :: new ( None ) ) ,
@@ -297,6 +299,7 @@ impl EventBusManager {
297299 let handler = self . message_handler . read ( ) . await . clone ( ) ;
298300 let disconnect_handler = self . disconnect_handler . read ( ) . await . clone ( ) ;
299301 let connections = self . connections . clone ( ) ;
302+ let pending_requests = self . pending_requests . clone ( ) ;
300303 let status_handler = self . connection_status_handler . clone ( ) ;
301304
302305 if let Some ( handler) = handler {
@@ -305,6 +308,25 @@ impl EventBusManager {
305308 loop {
306309 match browser_connection. recv ( ) . await {
307310 Ok ( msg) => {
311+ if msg. msg_type == MessageType :: Response {
312+ let mut pending = pending_requests. write ( ) . await ;
313+ if let Some ( waiters) = pending. get_mut ( & env_id_for_loop) {
314+ if let Some ( sender) = waiters. remove ( & msg. msg_id ) {
315+ let _ = sender. send ( msg) ;
316+ continue ;
317+ }
318+ }
319+
320+ log_warn (
321+ "eventbus" ,
322+ format ! (
323+ "[{}] Received unexpected response message: {}" ,
324+ env_id_for_loop, msg. msg_id
325+ ) ,
326+ ) ;
327+ continue ;
328+ }
329+
308330 if msg. topic == Topic :: AuthRequest {
309331 if let Err ( error) =
310332 Self :: handle_auth_request ( & browser_connection, msg) . await
@@ -333,6 +355,11 @@ impl EventBusManager {
333355 guard. remove ( & env_id_for_loop) ;
334356 }
335357
358+ {
359+ let mut pending = pending_requests. write ( ) . await ;
360+ pending. remove ( & env_id_for_loop) ;
361+ }
362+
336363 {
337364 let status = status_handler. read ( ) . await . clone ( ) ;
338365 if let Some ( status) = status {
@@ -393,7 +420,32 @@ impl EventBusManager {
393420 . clone ( ) ;
394421 drop ( connections) ;
395422
396- connection. send_request ( topic, data) . await
423+ let message = Message :: request ( topic, data) ;
424+ let msg_id = message. msg_id ;
425+ let ( tx, rx) = oneshot:: channel ( ) ;
426+
427+ {
428+ let mut pending = self . pending_requests . write ( ) . await ;
429+ pending
430+ . entry ( env_id. to_string ( ) )
431+ . or_default ( )
432+ . insert ( msg_id, tx) ;
433+ }
434+
435+ if let Err ( error) = connection. send ( & message) . await {
436+ let mut pending = self . pending_requests . write ( ) . await ;
437+ if let Some ( waiters) = pending. get_mut ( env_id) {
438+ waiters. remove ( & msg_id) ;
439+ }
440+ return Err ( error) ;
441+ }
442+
443+ rx. await . map_err ( |error| {
444+ EventBusError :: ReceiveFailed ( format ! (
445+ "failed to receive response for env {} msg {}: {}" ,
446+ env_id, msg_id, error
447+ ) )
448+ } )
397449 }
398450
399451 pub async fn broadcast ( & self , topic : Topic , data : Vec < u8 > ) -> Vec < ( String , Result < ( ) > ) > {
@@ -450,9 +502,11 @@ impl EventBusManager {
450502
451503 pub async fn disconnect_all ( & self ) {
452504 let mut connections = self . connections . write ( ) . await ;
505+ let mut pending_requests = self . pending_requests . write ( ) . await ;
453506 for ( env_id, connection) in connections. drain ( ) {
454507 let message = Message :: event ( Topic :: Disconnect , vec ! [ ] ) ;
455508 let _ = connection. send ( & message) . await ;
509+ pending_requests. remove ( & env_id) ;
456510 log_info ( "eventbus" , format ! ( "[{}] Disconnected" , env_id) ) ;
457511 }
458512 }
0 commit comments