@@ -74,7 +74,7 @@ def __init__(
7474 self ._on_message_cb : Callable [[dict ], None ] | None = None
7575 self ._on_error_cb : Callable [[Exception ], None ] | None = None
7676 self ._on_open_cb : Callable [[], None ] | None = None
77- self ._on_close_cb : Callable [[int , str ], None ] | None = None
77+ self ._on_close_cb : Callable [[int | None , str | None ], None ] | None = None
7878
7979 # ------------------------------------------------------------------
8080 # Auth / URL helpers
@@ -141,7 +141,7 @@ def on_open(self, callback: Callable[[], None]) -> None:
141141 """Register a callback invoked when the connection is established."""
142142 self ._on_open_cb = callback
143143
144- def on_close (self , callback : Callable [[int , str ], None ]) -> None :
144+ def on_close (self , callback : Callable [[int | None , str | None ], None ]) -> None :
145145 """Register a callback invoked when the connection closes."""
146146 self ._on_close_cb = callback
147147
@@ -176,8 +176,8 @@ def _handle_error(self, ws: websocket.WebSocketApp, error: Exception) -> None:
176176 def _handle_close (
177177 self ,
178178 ws : websocket .WebSocketApp ,
179- close_status_code : int ,
180- close_msg : str ,
179+ close_status_code : int | None ,
180+ close_msg : str | None ,
181181 ) -> None :
182182 self ._connected .clear ()
183183 self ._last_close_code = close_status_code
@@ -208,7 +208,7 @@ def connect(self, run_in_background: bool = True) -> None:
208208 If True, runs the WebSocket loop in a daemon thread (non-blocking).
209209 If False, blocks the calling thread until disconnected.
210210 """
211- if self ._thread is not None and self ._thread .is_alive ():
211+ if self ._connected . is_set () or ( self . _thread is not None and self ._thread .is_alive () ):
212212 raise RuntimeError ("Already connected; call disconnect() first" )
213213 self ._user_disconnect .clear ()
214214 self ._reconnect_attempts = 0
@@ -270,10 +270,7 @@ def _run_forever_safe(self) -> None:
270270 # Final close: put sentinel and call callback
271271 self ._queue .put (None )
272272 if self ._on_close_cb :
273- # websocket-client may provide None for close code/message; normalize
274- code = self ._last_close_code if self ._last_close_code is not None else - 1
275- msg = self ._last_close_msg if self ._last_close_msg is not None else ""
276- self ._on_close_cb (code , msg )
273+ self ._on_close_cb (self ._last_close_code , self ._last_close_msg )
277274
278275 def disconnect (self ) -> None :
279276 """Close the WebSocket connection."""
@@ -291,7 +288,12 @@ def receive(self) -> Generator[dict, None, None]:
291288
292289 Intended for use after connect(run_in_background=True).
293290 """
294- if not self ._connected .wait (timeout = 10 ):
291+ if self ._auto_reconnect :
292+ while not self ._connected .is_set () and not self ._user_disconnect .is_set ():
293+ self ._connected .wait (timeout = 1 )
294+ if self ._user_disconnect .is_set () and not self ._connected .is_set ():
295+ return
296+ elif not self ._connected .wait (timeout = 10 ):
295297 return
296298 while True :
297299 try :
0 commit comments