@@ -288,6 +288,14 @@ def unsubscribe() -> None:
288288
289289 return unsubscribe
290290
291+ def is_initialized (self ) -> bool :
292+ """Check if the client has finished initialization.
293+
294+ Returns:
295+ True if the client has received initial configs from the server.
296+ """
297+ return self ._initialized .is_set ()
298+
291299 def close (self ) -> None :
292300 """Close the client and stop the SSE connection."""
293301 logger .debug ("close() called" )
@@ -425,13 +433,22 @@ def _process_stream(self, response: http.client.HTTPResponse) -> None:
425433
426434 while not self ._stop_event .is_set ():
427435 try :
428- chunk = response .read (buffer_size )
436+ # Use read1() to get available data without blocking for full buffer.
437+ # This is essential for SSE where data arrives in small chunks.
438+ # read1() returns data as soon as it's available from the socket.
439+ if hasattr (response .fp , "read1" ):
440+ chunk = response .fp .read1 (buffer_size ) # type: ignore[union-attr]
441+ else :
442+ # Fallback for environments where read1 isn't available
443+ chunk = response .read (buffer_size )
444+
429445 if not chunk :
430446 logger .debug ("SSE stream ended" )
431447 break
432448
433449 last_event_time = time .monotonic ()
434450 text = chunk .decode ("utf-8" , errors = "replace" )
451+ logger .debug ("Received chunk: %d bytes" , len (chunk ))
435452
436453 for event in parser .feed (text ):
437454 self ._handle_event (event )
@@ -449,13 +466,19 @@ def _process_stream(self, response: http.client.HTTPResponse) -> None:
449466
450467 def _handle_event (self , event : Any ) -> None :
451468 """Handle a parsed SSE event."""
452- logger .debug ("SSE event received: type=%s" , event .event )
453- if event .event == "init" :
469+ # Event type can be in SSE 'event:' field or in data.type
470+ event_type = event .event
471+ if event_type is None and isinstance (event .data , dict ):
472+ event_type = event .data .get ("type" )
473+
474+ logger .debug ("SSE event received: type=%s" , event_type )
475+
476+ if event_type == "init" :
454477 self ._handle_init (event .data )
455- elif event . event == "config_change" :
478+ elif event_type == "config_change" :
456479 self ._handle_config_change (event .data )
457480 else :
458- logger .debug ("Unknown event type: %s, data=%s" , event . event , event .data )
481+ logger .debug ("Unknown event type: %s, data=%s" , event_type , event .data )
459482
460483 def _handle_init (self , data : dict [str , Any ]) -> None :
461484 """Handle the init event with all configs."""
0 commit comments