
    6i1                     f    d dl mZmZ d dlZd dlmZ ddlmZ ddlm	Z	 d dl
mZmZ  G d d	e	      Zy)
    )DictOptionalN)WebSocketClientProtocol   )WSListenerState)ReconnectingWebsocket)BinanceAPIExceptionBinanceWebsocketUnableToConnectc            
            e Zd Zddedededee   f fdZdedej                  d	dfd
Z	ded	dfdZ
ed	ej                  fd       Z fdZddZdeded	efdZ fdZ xZS )WebsocketAPINurltldtestnethttps_proxyc                 t    || _         || _        i | _        d | _        i | _        t
        |   |ddd|       y )N F)r   prefixpath	is_binaryr   )_tld_testnet
_responses_connection_lock_subscription_queuessuper__init__)selfr   r   r   r   	__class__s        V/var/www/app/trading-bot/venv/lib/python3.12/site-packages/binance/ws/websocket_api.pyr   zWebsocketAPI.__init__   sA    	578<>@!S"S^_    subscription_idqueuereturnc                 "    || j                   |<   y)z?Register a queue to receive events for a specific subscription.N)r   )r   r!   r"   s      r   register_subscription_queuez(WebsocketAPI.register_subscription_queue   s    5:!!/2r    c                 <    | j                   j                  |d       y)z Unregister a subscription queue.N)r   pop)r   r!   s     r   unregister_subscription_queuez*WebsocketAPI.unregister_subscription_queue   s    !!%%ot<r    c                     | j                   -t        j                         }t        j                         | _         | j                   S )N)r   asyncioget_event_loopLock)r   loops     r   connection_lockzWebsocketAPI.connection_lock   s6      ())+D$+LLND!$$$r    c                    t         	|   |      }| j                  j                  d|        |yd|v r@d|v r<|d   }|d   }|| j                  v r"| j                  |   }	 |j                  |       y|S d	\  }}d
|v r|d
   }d|v r*|d   dk7  r"t        ||d   | j                  |d               }|N|| j                  v r@|| j                  |   j                  |       y| j                  |   j                  |       y||| j                  j                  d|        y# t        j                  $ r" | j                  j                  d| d       Y yt        $ r+}| j                  j                  d| d|        Y d}~yd}~ww xY w)z5Override message handling to support request-responsezReceived message: NsubscriptionIdeventzSubscription queue full for z, dropping eventz.Error putting event in subscription queue for z: )NNidstatus   errorz"WS api receieved unknown message: )r   _handle_message_logdebugr   
put_nowaitr*   	QueueFullr5   	Exceptionr	   
json_dumpsr   set_exception
set_resultwarning)
r   msg
parsed_msgr!   r1   r"   ereq_id	exceptionr   s
            r   r6   zWebsocketAPI._handle_message$   s   W,S1
		,ZL9: z)g.C()9:Ow'E$";";;11/Bm$$U+
  &	:%Fz!(#s*/
8 4doojQXFY6Z	 &DOO";$'55i@  '22:>"OII B:,OP7 (( fIIOO&B?BSSc$de  ! mIIOO&TUdTeeghigj$kllms   "D% %2FF!!FFc                   K   | j                   4 d{    	 | j                  Nt        | j                  t              r| j                  j                  s| j
                  t        j                  k7  r| j                          d{    d}| j
                  t        j                  k7  r|| j                  k  r| j
                  t        j                  k(  r4| j                  j                  d       | j                          d{    nU| j                  | j                  j                  r3| j                  j                  d       | j                          d{    |dz  }t        j                  | j                          d{    | j
                  t        j                  k7  r|| j                  k  r| j
                  t        j                  k7  rt#        d| d      | j                  j%                  d       ddd      d{    y7 7 7 7 7 # t&        $ r:}| j                  j)                  d	|        t#        d
t+        |             d}~ww xY w7 X# 1 d{  7  sw Y   yxY ww)a
  Ensure 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RECONNECTINGr7   info_wait_for_reconnectr*   sleepMIN_RECONNECT_WAITr
   r8   r;   r5   str)r   retriesrB   s      r   _ensure_ws_connectionz"WebsocketAPI._ensure_ws_connectionR   s     '' #	V #	V"VGGO"477,CD}}(A(AA,,.((  G)B)BB#d&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#d&9&99 }}(A(AA=CG9IV  IIOO$FG?#	V #	V #	V ) = 1 E  V		"Gs KL58KCPQF86TUUVC#	V #	V #	V #	Vs   I;HI;I&A-HHA>HHAHH+HH0H9AH I;I$I;HHHH	I!'5II!!I&$I;&I8,I/-I84I;r2   payloadc                   K   | j                          d{    t        j                         }|| j                  |<   	 | j                  t        d      | j                  j                  | j                  |             d{    t        j                  || j                         d{   }d|v rt        |d         |j                  d|      | j                  j                  |d       S 7 7 o7 H# t        j                  $ r t        d      t        $ r}|d}~ww xY w# | j                  j                  |d       w xY ww)z"Send request and wait for responseNz7Trying to send request while WebSocket is not connected)timeoutr5   resultzRequest timed out)rT   r*   Futurer   rF   r
   sendr<   wait_forTIMEOUTgetr'   TimeoutErrorr;   )r   r2   rU   futureresponserB   s         r   requestzWebsocketAPI.request   s&    ((*** !$	*ww5M  '',,tw7888 %--fdll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                 $  K   t        | j                  j                               }|D ]H  }| j                  j                  |      }|j	                         r/|j                  t        d             J t        | !  |||       d{    y7 w)z!Clean up responses before closingzWebSocket closingN)	listr   keysr'   doner=   r
   r   	__aexit__)r   exc_typeexc_valexc_tbresponse_idsrC   r_   r   s          r   rf   zWebsocketAPI.__aexit__   sz     DOO0023" 	F__((0F;;=$$34GH	 g'6:::s   AB0BB	B)comFN)r#   N)__name__
__module____qualname__rR   boolr   r   r*   Queuer%   r(   propertyr,   r.   r6   rT   dictra   rf   __classcell__)r   s   @r   r   r      s    `C `c `D `W_`cWd `;3 ;w}} ;Y] ;=S =T = % % %,\,V\* *d *t *@	; 	;r    r   )typingr   r   r*   
websocketsr   	constantsr   reconnecting_websocketr   binance.exceptionsr	   r
   r    r    r   <module>rz      s&    !  . & 9 S^;( ^;r    