
    i                     f    S SK JrJr  S SKrS SKJr  SSKJr  SSKJ	r	  S SK
JrJr   " S S	\	5      rg)
    )DictOptionalN)WebSocketClientProtocol   )WSListenerState)ReconnectingWebsocket)BinanceAPIExceptionBinanceWebsocketUnableToConnectc            
          ^  \ rS rSrSS\S\S\S\\   4U 4S jjjr\S\	R                  4S j5       rU 4S	 jrSS
 jrS\S\S\4S jrU 4S jrSrU =r$ )WebsocketAPI   urltldtestnethttps_proxyc                 \   > X l         X0l        0 U l        S U l        [        TU ]  USSSUS9  g )N F)r   prefixpath	is_binaryr   )_tld_testnet
_responses_connection_locksuper__init__)selfr   r   r   r   	__class__s        S/var/www/html/trading/venv/lib/python3.13/site-packages/binance/ws/websocket_api.pyr   WebsocketAPI.__init__   s5    	578<S"S^_    returnc                     U R                   c/  [        R                  " 5       n[        R                  " 5       U l         U R                   $ )N)r   asyncioget_event_loopLock)r   loops     r   connection_lockWebsocketAPI.connection_lock   s6      ())+D$+LLND!$$$r!   c                   > [         TU ]  U5      nU R                  R                  SU 35        Uc  gSU;   a  SU;   a  US   $ Su  p4SU;   a  US   nSU;   a*  US   S:w  a!  [	        X"S   U R                  US	   5      5      nUbP  X0R                  ;   aA  Ub  U R                  U   R                  U5        gU R                  U   R                  U5        gUb  UeU R                  R                  S
U 35        g)z5Override message handling to support request-responsezReceived message: NsubscriptionIdevent)NNidstatus   errorz"WS api receieved unknown message: )
r   _handle_message_logdebugr	   
json_dumpsr   set_exception
set_resultwarning)r   msg
parsed_msgreq_id	exceptionr   s        r   r1   WebsocketAPI._handle_message   s   W,S1
		,ZL9: z)g.Cg&&&:%Fz!(#s*/8 4doojQXFY6Z	 &OO";$'55i@  '22:>"OII B:,OPr!   c                 :  #    U R                    ISh  vN    U R                  bY  [        U R                  [        5      (       a  U R                  R                  (       d  U R
                  [        R                  :w  Ga  U R                  5       I Sh  vN   SnU R
                  [        R                  :w  Ga  XR                  :  Ga
  U R
                  [        R                  :X  a4  U R                  R                  S5        U R                  5       I Sh  vN   O[U R                  b  U R                  R                  (       a3  U R                  R                  S5        U R                  5       I Sh  vN   US-  n[        R                  " U R                   5      I Sh  vN   U R
                  [        R                  :w  a  XR                  :  a  GM
  U R
                  [        R                  :w  a  [#        SU S35      eU R                  R%                  S5        SSS5      ISh  vN   g GN GN GN N N! [&         a:  nU R                  R)                  S	U 35        [#        S
[+        U5       35      eSnAff = f NY! , ISh  vN  (       d  f       g= f7f)zEnsure WebSocket connection is established and ready

This function will:
1. Check if connection exists and is streaming
2. Attempt to connect if not
3. Wait for connection to be ready
4. Handle reconnection if needed
Nr   z&Connection is reconnecting, waiting...z Connection lost, reconnecting...r   z%Failed to establish connection after z	 attemptsz WebSocket connection establishedz%Error ensuring WebSocket connection: zConnection failed: )r(   ws
isinstancer   closedws_stater   	STREAMINGconnectMAX_RECONNECTSRECONNECTINGr2   info_wait_for_reconnectr$   sleepMIN_RECONNECT_WAITr
   r3   	Exceptionr0   str)r   retrieses      r   _ensure_ws_connection"WebsocketAPI._ensure_ws_connection:   s     '''"VGGO"477,CDD}}(A(AA,,.((  G)B)BB#&9&99==O,H,HH IINN+ST"&":":"<<<!WW_ IINN+MN"&,,.001%mmD,C,CDDD )B)BB#&9&99 }}(A(AA=CG9IV  IIOO$FG? ('' ) = 1 E  V		"Gs KL58KCPQF86TUUVC ('''s   JH+JJA9H8H.BH8H1AH80H41,H8H61H8AH8J%I?&J.H81H84H86H88
I<5I77I<<J?JJJ
JJr-   payloadc                   #    U R                  5       I Sh  vN   [        R                  " 5       nX0R                  U'    U R                  c  [        S5      eU R                  R                  U R                  U5      5      I Sh  vN   [        R                  " X0R                  S9I Sh  vN nSU;   a  [        US   5      eUR                  SU5      U R                  R                  US5        $  N Nn NJ! [        R                   a    [        S5      e[         a  nUeSnAff = f! U R                  R                  US5        f = f7f)z"Send request and wait for responseNz7Trying to send request while WebSocket is not connected)timeoutr0   resultzRequest timed out)rN   r$   Futurer   r>   r
   sendr4   wait_forTIMEOUTgetpopTimeoutErrorrJ   )r   r-   rP   futureresponserM   s         r   requestWebsocketAPI.requesth   s    ((*** !$	*ww5M  '',,tw7888 %--fllKKH ("5hw6GHH<<(3 OOD)9 	+ 9 L ## 	G12EFF 	G	 OOD)sc   E
C1'E
AC7 C3%C7 *C5+)C7 E
3C7 5C7 7(D&D!!D&&D) )EE
c                 2  >#    [        U R                  R                  5       5      nU HO  nU R                  R                  U5      nUR	                  5       (       a  M5  UR                  [        S5      5        MQ     [        TU ]!  XU5      I Sh  vN   g N7f)z!Clean up responses before closingzWebSocket closingN)	listr   keysrY   doner5   r
   r   	__aexit__)r   exc_typeexc_valexc_tbresponse_idsr:   r[   r   s          r   rc   WebsocketAPI.__aexit__   st     DOO0023"F__((0F;;==$$34GH # g6:::s   AB1BBB)r   r   r   r   )comFN)r"   N)__name__
__module____qualname____firstlineno__rK   boolr   r   propertyr$   r&   r(   r1   rN   dictr]   rc   __static_attributes____classcell__)r   s   @r   r   r      s    `C `c `D `W_`cWd ` ` % % %@,V\* *d *t *@	; 	;r!   r   )typingr   r   r$   
websocketsr   	constantsr   reconnecting_websocketr   binance.exceptionsr	   r
   r    r!   r   <module>ry      s&    !  . & 9 SF;( F;r!   