
    ho                       d dl mZ d dlZd dlZd dlmZ d dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZmZmZmZmZ d dlZd dlmZ d	d
lmZmZ d	dlmZmZmZmZ d	dlm Z m!Z! ddl"m#Z#m$Z$ ddl%m&Z&m'Z' erd dl(m)Z) d	dlm*Z* d	dlm+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5m6Z6  ed          Z7ede8e+gdf         Z9edee8e:f         gdf         Z;ede!gdf         Z<edgdf         Z=ede>e:gdf         Z? ee	d          Z	 G d de          Z@ G d de!          ZA G d d eAe#          ZB G d! d"eAe$          ZC	 d4dd$d5d-ZD G d. d/          ZEed0         ZF G d1 deE          ZG G d2 d3eE          ZHdS )6    )annotationsN)IntEnum)partial)dumpsloads)select)TYPE_CHECKINGAnyCallableLiteralOptionalTypeVarUnion)CurlCffiWarning   )CURL_SOCKET_BADget_selector)	CurlECodeCurlInfoCurlOpt
CurlWsFlag)Curl	CurlError   )SessionClosedTimeout)not_setset_curl_options)Self)CurlHttpVersion)CurlWsFrame)CookieTypes)HeaderTypes)BrowserTypeLiteralExtraFingerprintsExtraFpDict)AsyncSession	ProxySpecT	WebSocket),:)
separatorsc                  Z    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdZdZdZdS )WsCloseCodez?See: https://www.iana.org/assignments/websocket/websocket.xhtmli  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  N)__name__
__module____qualname____doc__OK
GOING_AWAYPROTOCOL_ERRORUNSUPPORTED_DATAUNKNOWNABNORMAL_CLOSUREINVALID_DATAPOLICY_VIOLATIONMESSAGE_TOO_BIGMANDATORY_EXTENSIONINTERNAL_ERRORSERVICE_RESTARTTRY_AGAIN_LATERBAD_GATEWAYTLS_HANDSHAKEUNAUTHORIZED	FORBIDDENTIMEOUT     [/var/www/html/marketdash/venv/lib/python3.11/site-packages/curl_cffi/requests/websockets.pyr/   r/   3   sr        II	BJNGLONOOKMLIGGGrG   r/   c                  (     e Zd ZdZ	 dd	 fdZ xZS )
WebSocketErrorzWebSocket-specific error.r   messagestrcode)Union[WsCloseCode, CurlECode, Literal[0]]c                L    t                                          ||           d S N)super__init__)selfrK   rM   	__class__s      rH   rR   zWebSocketError.__init__M   s%     	$'''''rG   )r   )rK   rL   rM   rN   )r0   r1   r2   r3   rR   __classcell__rT   s   @rH   rJ   rJ   J   sO        ## OP( ( ( ( ( ( ( ( ( ( (rG   rJ   c                      e Zd ZdZdS )WebSocketClosedzWebSocket is already closed.Nr0   r1   r2   r3   rF   rG   rH   rX   rX   S   s        &&&&rG   rX   c                      e Zd ZdZdS )WebSocketTimeoutzWebSocket operation timed out.NrY   rF   rG   rH   r[   r[   W   s        ((((rG   r[   readtimeoutmodeLiteral['read', 'write']loopasyncio.AbstractEventLoopr^   Optional[float]returnboolc                  K                                    }|dk    r6                     |j        d            |                     fd           nO|dk    r6                     |j        d            |                     fd           nt          d| d          	 t          j        ||           d {V  n# t          j        $ r Y dS w xY wdS )	Nr\   c                .                                   S rP   )remove_reader_fdra   s    rH   <lambda>zaselect.<locals>.<lambda>f       4+=+=b+A+A rG   writec                .                                   S rP   )remove_writerri   s    rH   rl   zaselect.<locals>.<lambda>i   rm   rG   zInvalid mode: z. Must be 'read' or 'write'FT)	create_future
add_reader
set_resultadd_done_callback
add_writer
ValueErrorasynciowait_forTimeoutError)rk   r_   ra   r^   futures   ` `  rH   aselectr{   [   s      !!Fv~~F-t444  !A!A!A!A!ABBBB	F-t444  !A!A!A!A!ABBBBK$KKKLLLvw//////////   uu4s   %C CCc                      e Zd Zddddd	Zed
             Zedd            Zedd            Zedd            Z	edd            Z
d ZdS )BaseWebSocketTF	autoclosedebugcurlr   r   re   r   c               Z    || _         || _        d | _        d | _        || _        d| _        d S )NF)_curlr   _close_code_close_reasonr   closed)rS   r   r   r   s       rH   rR   zBaseWebSocket.__init__u   s2    
(*.,0
rG   c                `    | j         t          u rt          | j                  | _         | j         S )N)r   )r   r   r   r   rS   s    rH   r   zBaseWebSocket.curl}   s+    :  DJ///DJzrG   rd   Optional[int]c                    | j         S )z<The WebSocket close code, if the connection has been closed.)r   r   s    rH   
close_codezBaseWebSocket.close_code   s     rG   Optional[str]c                    | j         S )z>The WebSocket close reason, if the connection has been closed.)r   r   s    rH   close_reasonzBaseWebSocket.close_reason   s     !!rG   rM   intreasonbytesc                2    t          j        d|           |z   S )N!H)structpack)rM   r   s     rH   _pack_close_framezBaseWebSocket._pack_close_frame   s    {4&&//rG   frametuple[int, str]c                   t          |           dk     rt          j        }d}n	 t          j        d|           d         }| dd                                          }|t          j        vs|t          j        k    rt          d| t          j                  nU# t          $ r }t          dt          j
                  |d }~wt          $ r }t          dt          j                  |d }~ww xY w||fS )Nr    r   r   zInvalid close code: zInvalid close messagezInvalid close frame)lenr/   r8   r   unpack_fromdecode_value2member_map_rJ   r6   UnicodeDecodeErrorr:   	Exception)r   rM   r   es       rH   _unpack_close_framez!BaseWebSocket._unpack_close_frame   s   u::>>&DFF)$66q9qrr))++  >>>{222(5t55{7Q   3 &   $+[-E     $);+E  V|s#   7B 
C)!B<<C)	C$$C)c                F    d| _         | j                                         dS )$Terminate the underlying connection.TN)r   r   closer   s    rH   	terminatezBaseWebSocket.terminate   s!    	rG   N)r   r   r   re   r   re   )rd   r   )rd   r   )rM   r   r   r   rd   r   )r   r   rd   r   )r0   r1   r2   rR   propertyr   r   r   staticmethodr   r   r   rF   rG   rH   r}   r}   t   s        8<E         X
       X  " " " X" 0 0 0 \0    \4    rG   r}   )openr   datarK   errorc                      e Zd ZdZefddddddddddj fdZdkdZdldZdmdZddddedddddddd dddddd!dddd"dfdndLZ	dodNZ
dpdPZdqdQZedRdrdVZej        fdsd[Zdtd\Zdtd]Zdud^Zed_dvdcZdwddZdxdydeZej        dffdzdiZ xZS ){r*   z)A WebSocket implementation using libcurl.TFN)r   skip_utf8_validationr   on_openon_closeon_data
on_messageon_errorr   Union[Curl, Any]r   re   r   r   r   Optional[ON_OPEN_T]r   Optional[ON_CLOSE_T]r   Optional[ON_DATA_T]r   Optional[ON_MESSAGE_T]r   Optional[ON_ERROR_T]c                   t                                          |||           || _        i | _        |r
|| j        d<   |r
|| j        d<   |r
|| j        d<   |r
|| j        d<   |	r|	| j        d<   dS dS )a|  
        Args:
            autoclose: whether to close the WebSocket after receiving a close frame.
            skip_utf8_validation: whether to skip UTF-8 validation for text frames in
                run_forever().
            debug: print extra curl debug info.

            on_open: open callback, ``def on_open(ws)``
            on_close: close callback, ``def on_close(ws, code, reason)``
            on_data: raw data receive callback, ``def on_data(ws, data, frame)``
            on_message: message receive callback, ``def on_message(ws, message)``
            on_error: error callback, ``def on_error(ws, exception)``
        r   r   r   r   r   r   rK   r   N)rQ   rR   r   	_emitters)rS   r   r   r   r   r   r   r   r   r   rT   s             rH   rR   zWebSocket.__init__   s    4 	diuEEE$8!;= 	-%,DN6" 	/&.DN7# 	-%,DN6" 	3(2DN9% 	/&.DN7###	/ 	/rG   rd   c                2    | j         rt          d          | S )NWebSocket is closedr   rX   r   s    rH   __iter__zWebSocket.__iter__   s     ; 	9!"7888rG   r   c                `    |                                  \  }}|t          j        z  rt          |S rP   )recvr   CLOSEStopIterationrS   msgflagss      rH   __next__zWebSocket.__next__   s.    YY[[
U:## 	 
rG   
event_typeEventTypeLiteralNonec                $   | j                             |          }|rs	  || g|R   d S # t          $ rZ}| j                             d          }|r || |           n&t          j        d| dt
          d           Y d }~d S Y d }~d S d }~ww xY wd S )Nr   zWebSocket callback 'z' failedr   )
stacklevel)r   getr   warningswarnr   )rS   r   argscallbackr   error_callbacks         rH   _emitzWebSocket._emit   s    >%%j11 	%%%%%%% 	 	 	!%!3!3G!<!<! "N4++++MCzCCC'#$          ,+++++		 	s   	) 
BA	BB   zgzip, deflate, brr   r   urlrL   params"Optional[Union[dict, list, tuple]]headersOptional[HeaderTypes]cookiesOptional[CookieTypes]authOptional[tuple[str, str]]r^   3Optional[Union[float, tuple[float, float], object]]allow_redirectsmax_redirectsr   proxiesOptional[ProxySpec]proxyr   
proxy_authverifyOptional[bool]refereraccept_encodingimpersonateOptional[BrowserTypeLiteral]ja3akamaiextra_fp/Optional[Union[ExtraFingerprints, ExtraFpDict]]default_headersquoteUnion[str, Literal[False]]http_versionOptional[CurlHttpVersion]	interfacecert%Optional[Union[str, tuple[str, str]]]max_recv_speedcurl_optionsOptional[dict[CurlOpt, str]]c                F   | j         }t          di d|ddd|dd|gdd|gdd|gd	|d
|d|d|dd|	gd|
d|dd|gd|d|d|d|d|d|d|d|d|d|d|d|d| |                    t          j        d           |                                 | S ) a	  Connect to the WebSocket.

        libcurl automatically handles pings and pongs.
        ref: https://curl.se/libcurl/c/libcurl-ws.html

        Args:
            url: url for the requests.
            params: query string for the requests.
            headers: headers to send.
            cookies: cookies to use.
            auth: HTTP basic auth, a tuple of (username, password), only basic auth is
                supported.
            timeout: how many seconds to wait before giving up.
            allow_redirects: whether to allow redirection.
            max_redirects: max redirect counts, default 30, use -1 for unlimited.
            proxies: dict of proxies to use, prefer to use ``proxy`` if they are the
                same. format: ``{"http": proxy_url, "https": proxy_url}``.
            proxy: proxy to use, format: "http://user@pass:proxy_url".
                Can't be used with `proxies` parameter.
            proxy_auth: HTTP basic auth for proxy, a tuple of (username, password).
            verify: whether to verify https certs.
            referer: shortcut for setting referer header.
            accept_encoding: shortcut for setting accept-encoding header.
            impersonate: which browser version to impersonate.
            ja3: ja3 string to impersonate.
            akamai: akamai string to impersonate.
            extra_fp: extra fingerprints options, in complement to ja3 and akamai str.
            default_headers: whether to set default browser headers.
            default_encoding: encoding for decoding response content if charset is not
                found in headers. Defaults to "utf-8". Can be set to a callable for
                automatic detection.
            quote: Set characters to be quoted, i.e. percent-encoded. Default safe
                string is ``!#$%&'()*+,/:;=?@[]~``. If set to a sting, the character
                will be removed from the safe string, thus quoted. If set to False, the
                url will be kept as is, without any automatic percent-encoding, you must
                encode the URL yourself.
            curl_options: extra curl options to use.
            http_version: limiting http version, defaults to http2.
            interface: which interface to use.
            cert: a tuple of (cert, key) filenames for client cert.
            max_recv_speed: maximum receive speed, bytes per second.
            curl_options: extra curl options to use.
        r   methodGETr   params_listNheaders_listcookies_listr   r^   r   r   proxies_listr   r   verify_listr   r   r   r   r   r   r   r   r   r   r   r   r   r   rF   )r   r   setoptr   CONNECT_ONLYperform)rS   r   r   r   r   r   r^   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s                              rH   connectzWebSocket.connect   s   P y 	
 	
 	
	
5	
 	
 v		

 	
 	
 	
 G	
 ,O	
 (-	
 	
 %	
 "z	
 v	
 G	
  ,O!	
" $#	
$ %	
& 6'	
( X)	
* ,O+	
, %-	
. &/	
0  i1	
2 *>3	
4 5	
6 &7	
 	
> 	G(!,,,rG   tuple[bytes, CurlWsFrame]c                   | j         rt          d          | j                                        \  }}|j        t
          j        z  rx	 |                     |          \  | _        | _	        n9# t          $ r,}|j        | _        |                     |j                    d}~ww xY w| j        r|                                  ||fS )z2Receive a single curl websocket fragment as bytes.WebSocket is already closedN)r   rX   r   ws_recvr   r   r   r   r   r   rJ   rM   r   r   )rS   chunkr   r   s       rH   recv_fragmentzWebSocket.recv_fragmenti  s     ; 	A!"?@@@y((**u;)) 
	7;7O7OPU7V7V4 $"4"4!    $%6 

16""" ~ 

e|s   "A+ +
B!5'BB!tuple[bytes, int]c                    g }d}| j                             t          j                  }|t          k    rt          dt          j                  	 	 |                                 \  }}|j	        }|
                    |           |j        dk    r|t          j        z  dk    rnGnE# t          $ r8}|j        t          j        k    rt#          |gg g d          \  }}}n Y d}~nd}~ww xY wd                    |          |fS )z
        Receive a frame as bytes. libcurl splits frames into fragments, so we have to
        collect all the chunks for a frame.
        r   Invalid active socketT      ?NrG   )r   getinfor   ACTIVESOCKETr   rJ   r   NO_CONNECTION_AVAILABLEr  r   append	bytesleftr   CONTr   rM   AGAINr   join)rS   chunksr   sock_fdr
  r   r   rj   s           rH   r   zWebSocket.recv  s    
 )##H$9::o%% ')J  	#1133ue$$$?a''EJO,Cq,H,H   6Y_,, %gYB<<GAq!! !!!!		  xx&&s   AB# #
C%-.C  C%c                    |                                  \  }}|t          j        z  st          dt          j                  |                                S )zReceive a text frame.zNot valid text framer   r   TEXTrJ   r/   r:   r   )rS   r   r   s      rH   recv_strzWebSocket.recv_str  sE    iikke
' 	S !79QRRR{{}}rG   )r   r   Callable[[str], T]r)   c               @    |                                  } ||          S )zeReceive a JSON frame.

        Args:
            loads: JSON decoder, default is json.loads.
        r  )rS   r   r   s      rH   	recv_jsonzWebSocket.recv_json  s     }}uT{{rG   payloadUnion[str, bytes]r   r   c                   |t           j        z  rd| _        | j        rt	          d          t          |t                    r|                                }| j        	                    t          j                  }|t          k    rt          dt          j                  d}|t!          |          k     r||d         }	 | j                            ||          }nV# t$          $ rI}|j        t          j        k    r.t+          g |gg d          \  }}	}|	st          d          |Y d}~ d}~ww xY w||z  }|t!          |          k     |S )uSend a data frame.

        Args:
            payload: data to send.
            flags: flags for the frame.
        Fr  r  r   Nr  Socket write timeout)r   r   keep_runningr   rX   
isinstancerL   encoder   r  r   r  r   rJ   r   r  r   ws_sendr   rM   r  r   )
rS   r"  r   r  offsetcurrent_buffern_sentr   rj   	writeables
             rH   sendzWebSocket.send  sq    :## 	& %D; 	A!"?@@@ gs## 	'nn&&G)##H$9::o%% ')J   s7||##$VWW-N**>5AA   6Y_,,&,R'B&D&DOAy!$ L,-CDD!KHHHH fF s7||## s   ?C 
D.%>D)(D))D.c                B    |                      |t          j                  S )VSend a binary frame.

        Args:
            payload: binary data to send.
        r/  r   BINARYrS   r"  s     rH   send_binaryzWebSocket.send_binary       yy*"3444rG   c                B    |                      |t          j                  S )tSend a binary frame, alias of :meth:`send_binary`.

        Args:
            payload: binary data to send.
        r2  r4  s     rH   
send_byteszWebSocket.send_bytes  r6  rG   c                B    |                      |t          j                  S )RSend a text frame.

        Args:
            payload: text data to send.
        r/  r   r  r4  s     rH   send_strzWebSocket.send_str       yy*/222rG   r   r
   r   Callable[[Any], str]c               >    |                       ||                    S )Send a JSON frame.

        Args:
            payload: data to send.
            dumps: JSON encoder, default is json.dumps.
        r=  rS   r"  r   s      rH   	send_jsonzWebSocket.send_json  s     }}UU7^^,,,rG   c                B    |                      |t          j                  S )MSend a ping frame.

        Args:
            payload: data to send.
        r/  r   PINGr4  s     rH   pingzWebSocket.ping  r>  rG   c                \   |r | j         |fi | | j                            t          j                  }|t
          k    rt          dt          j                  | 	                    d           g }d| _
        | j
        r,	 |                                 \  }}|j        }| 	                    d||           |                    |           |j        dk    r|t          j        z  dk    srd| j        v rd                    |          }|t          j        z  rz| j        ss	 |                                }n]# t,          $ rP}	t.          j        | _        |                     t.          j                   t          dt.          j                  |	d	}	~	ww xY w|t          j        z  s|t          j        z  r| 	                    d|           g }|t          j        z  r,d
| _
        | 	                    d| j        pd| j        pd           n# t<          $ r}	|	j        t          j         k    rtC          |gg g d          \  }
}
}
n[| 	                    d|	           | j"        s=t.          j#        }tI          |	t                    r|	j        }|                     |            Y d	}	~	nd	}	~	ww xY w| j
        *d	S d	S )zRun the WebSocket forever. See :meth:`connect` for details on parameters.

        libcurl automatically handles pings and pongs.
        ref: https://curl.se/libcurl/c/libcurl-ws.html
        r  r   Tr   r   rK   rG   Invalid UTF-8NFr   r   r  r   )%r  r   r  r   r  r   rJ   r   r  r   r'  r  r   r  r  r   r  r   r  r  r   r   r   r/   r:   r   r   r3  r   r   r   rM   r  r   r   r8   r(  )rS   r   kwargsr  r  r
  r   r   r   r   rj   rM   s               rH   run_foreverzWebSocket.run_forever  s     	(DL''''')##H$9::o%% ')J   	

6   ,	+#1133u

65%000e$$$1,,1HA1M1M ..((6**C
/ %9R %%"%**,,CC1 % % %/:/GD, JJ{'?@@@"0 /1I# ##$%% 
 11 3uz7N 3

9c222:++ Y(-D%JJw(8(=At?Q?WUWXXX 
 
 
6Y_,,$gYB<<GAq!!JJw***; )*2%a88 *#$6D

4((( !!!!
E  ,	 ,	 ,	 ,	 ,	sF   A(H *4H D4 3H 4
F>AF		FA4H 
JBJJrG   rM   rK   c                    | j         t          u rdS |                     ||          }|                     |t          j                   |                                  dS znClose the connection.

        Args:
            code: close code.
            message: close reason.
        N)r   r   r   r/  r   r   r   rS   rM   rK   r   s       rH   r   zWebSocket.closeG  sZ     9F $$T733		#z'(((rG   )r   r   r   re   r   re   r   re   r   r   r   r   r   r   r   r   r   r   )rd   r*   rd   r   )r   r   rd   r   )2r   rL   r   r   r   r   r   r   r   r   r^   r   r   re   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   re   r   r   r   r   r   r   r   r   r   r   r   r   )rd   r  )rd   r  )rd   rL   )r   r  rd   r)   r"  r#  r   r   r"  r   r"  rL   r"  r
   r   r@  r"  r#  )r   )r   rL   rM   r   rK   r   )r0   r1   r2   r3   r   rR   r   r   r   r  r  r   r  r   r!  r   r3  r/  r5  r9  r=  r   rE  rJ  rN  r/   r4   r   rU   rV   s   @rH   r*   r*      sQ       33 ")'/ %*'+)-'+-1)-'/ '/ '/ '/ '/ '/ '/ '/R   
      & 6:)-)-*.GN $'+#04!%!%)<48! $DH $,.26#'6:595k k k k kZ   ,' ' ' '@    8=       DNCT ) ) ) ) )V5 5 5 55 5 5 53 3 3 3 HM - - - - - -3 3 3 3B B B B BH !,         rG   c                       e Zd ZdZdddd6 fdZed             Zd7dZd8dZddd9dZ	ddd:dZ
ddd;dZeddd<d!Zej        fd=d&Zd>d'Zd>d(Zd?d)Zed*d@d.ZdAd/Zej        d0fdBd4Z fd5Z xZS )CAsyncWebSocketz0An async WebSocket implementation using libcurl.TFr~   sessionr'   r   r   r   re   r   c                   t                                          |||           || _        d | _        t	          j                    | _        t	          j                    | _        d S )Nr   )rQ   rR   r[  _looprw   Lock
_recv_lock
_send_lock)rS   r[  r   r   r   rT   s        rH   rR   zAsyncWebSocket.__init__\  sP     	diuEEE:>
!,..!,..rG   c                h    | j         %t          t          j                              | _         | j         S rP   )r]  r   rw   get_running_loopr   s    rH   ra   zAsyncWebSocket.loopj  s*    :%g&>&@&@AADJzrG   rd   r   c                2    | j         rt          d          | S )NzWebSocket has been closedr   r   s    rH   	__aiter__zAsyncWebSocket.__aiter__p  s     ; 	?!"=>>>rG   r   c                p   K   |                                   d {V \  }}|t          j        z  rt          |S rP   )r   r   r   StopAsyncIterationr   s      rH   	__anext__zAsyncWebSocket.__anext__u  sD      99;;&&&&&&
U:## 	%$$
rG   Nr]   r^   rc   r  c               "  K   | j         rt          d          | j                                        rt	          d          | j        4 d{V  	 t          j        | j                            d| j	        j
                  |           d{V \  }}n'# t
          j        $ r}t          d          |d}~ww xY w|j        t          j        z  r	 |                     |          x\  }}\  | _        | _        n?# t&          $ r2}|j        | _        |                     |j                   d{V   d}~ww xY w| j        r.|                     ||                                           d{V  ddd          d{V  n# 1 d{V swxY w Y   ||fS )zxReceive a single frame as bytes.

        Args:
            timeout: how many seconds to wait before giving up.
        r   z1Concurrent call to recv_fragment() is not allowedNz#WebSocket recv_fragment() timed out)r   rX   r_  locked	TypeErrorrw   rx   ra   run_in_executorr   r	  ry   r[   r   r   r   r   r   r   rJ   rM   r   r   r)  )rS   r^   r
  r   r   rM   rK   s          rH   r  zAsyncWebSocket.recv_fragment{  sq      ; 	9!"7888?!!## 	QOPPP? 	= 	= 	= 	= 	= 	= 	= 	=U%,%5I--dDI4EFF& &            uu ' U U U&'LMMSTTU{Z-- =	0077MD'$HD$4d6H6H &    ()vD$**QV,,,,,,,,, > =**T7>>+;+;<<<<<<<<<'	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=* e|s[   E<ABE<B6!B11B66E<'C65E<6
D2 -D--D228E<<
F	Fr  c               >  K   | j         }g }d}|                    d| j        j        t          j                   d{V }|t          k    rt          dt          j	                  	 	 | 
                    |           d{V \  }}|j        }|                    |           |j        dk    r|t          j        z  dk    rnHnF# t           $ r9}|j        t          j        k    rt'          |||           d{V  n Y d}~nd}~ww xY wd                    |          |fS )z
        Receive a frame as bytes. libcurl splits frames into fragments, so we have to
        collect all the chunks for a frame.

        Args:
            timeout: how many seconds to wait before giving up.
        r   Nr  Tr]   )ra   r^   rG   )ra   rk  r   r  r   r  r   rJ   r   r  r  r   r  r  r   r  r   rM   r  r{   r  )	rS   r^   ra   r  r   r  r
  r   r   s	            rH   r   zAsyncWebSocket.recv  s~      y,,$)#X%:
 
 
 
 
 
 
 
 o%% ')J  	
%)%7%7%7%H%HHHHHHHue$$$?a''EJO,Cq,H,H   6Y_,,!'gFFFFFFFFFFF GFFFF	 xx&&s   &AC 
D/C??DrL   c                  K   |                      |           d{V \  }}|t          j        z  st          dt          j                  |                                S )zmReceive a text frame.

        Args:
            timeout: how many seconds to wait before giving up.
        r]   NrL  r  )rS   r^   r   r   s       rH   r  zAsyncWebSocket.recv_str  sb       !IIgI66666666e
' 	L +2JKKK{{}}rG   )r   r^   r   r  r)   c               T   K   |                      |           d{V } ||          S )zReceive a JSON frame.

        Args:
            loads: JSON decoder, default is json.loads.
            timeout: how many seconds to wait before giving up.
        r]   Nr   )rS   r   r^   r   s       rH   r!  zAsyncWebSocket.recv_json  s;       ]]7]33333333uT{{rG   r"  r#  r   r   c                (  K   | j         rt          d          t          |t                    r|                                }| j                            d| j        j        t          j
                   d{V }|t          k    rt          dt          j                  | j        4 d{V  d}|t!          |          k     r||d         }	 | j                            d| j        j        ||           d{V }n]# t$          $ rP}|j        t          j        k    r5t+          |d| j        d           d{V }|st          d          |Y d}~ d}~ww xY w||z  }|t!          |          k     	 ddd          d{V  n# 1 d{V swxY w Y   |S )	r%  r   Nr  r   rn   r  )r_   ra   r^   r&  )r   rX   r(  rL   r)  ra   rk  r   r  r   r  r   rJ   r   r  r`  r   r*  r   rM   r  r{   )	rS   r"  r   r  r+  r,  r-  r   r.  s	            rH   r/  zAsyncWebSocket.send  s      ; 	9!"7888 gs## 	'nn&&G	11$)#X%:
 
 
 
 
 
 
 
 o%% ')J  
 ? 	! 	! 	! 	! 	! 	! 	! 	!F 3w<<''!(!1#'9#<#<di/$ $      FF !   v00*1#'	3+ + + % % % % % %	  ) P"01G"H"HaO  & # 3w<<'''	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	! 	!0 sC   * F-C98F9
EAEFEEF
FFc                R   K   |                      |t          j                   d{V S )r1  Nr2  r4  s     rH   r5  zAsyncWebSocket.send_binary  1       YYw
(9:::::::::rG   c                R   K   |                      |t          j                   d{V S )r8  Nr2  r4  s     rH   r9  zAsyncWebSocket.send_bytes  rq  rG   c                R   K   |                      |t          j                   d{V S )r;  Nr<  r4  s     rH   r=  zAsyncWebSocket.send_str  0       YYw
888888888rG   r?  r
   r   r@  c               N   K   |                       ||                     d{V S )rB  NrC  rD  s      rH   rE  zAsyncWebSocket.send_json#  s4       ]]55>>222222222rG   c                R   K   |                      |t          j                   d{V S )rG  NrH  r4  s     rH   rJ  zAsyncWebSocket.ping,  rt  rG   rG   rM   r   rK   c                   K   |                      ||          }|                     |t          j                   d{V  |                                  dS rP  )r   r/  r   r   r   rQ  s       rH   r   zAsyncWebSocket.close4  s\       $$T733iiZ-.........rG   c                    t                                                       | j        j        s| j                            d           dS dS )r   N)rQ   r   r[  _closed	push_curl)rS   rT   s    rH   r   zAsyncWebSocket.terminateB  sL    |# 	)L""4(((((	) 	)rG   )r[  r'   r   r   r   re   r   re   )rd   r   rR  )r^   rc   rd   r  )r^   rc   rd   r  )r^   rc   rd   rL   )r   r  r^   rc   rd   r)   rS  rT  rU  rV  rW  rX  )r0   r1   r2   r3   rR   r   ra   rd  rg  r  r   r  r   r!  r   r3  r/  r5  r9  r=  r   rE  rJ  r/   r4   r   r   rU   rV   s   @rH   rZ  rZ  Y  s       :: ) ) ) ) ) ) ) )   X
   
    -1" " " " " "H 8<  '  '  '  '  '  'D <@ 	 	 	 	 	 	 .3t
 
 
 
 
 
 ?I>O1 1 1 1 1f; ; ; ;; ; ; ;9 9 9 9 NS 3 3 3 3 3 39 9 9 9 '2ns     ) ) ) ) ) ) ) ) )rG   rZ  )r\   )r_   r`   ra   rb   r^   rc   rd   re   )I
__future__r   rw   r   enumr   	functoolsr   jsonr   r   r   typingr	   r
   r   r   r   r   r   r   curl_cffi.utilsr   aior   r   constr   r   r   r   r   r   r   
exceptionsr   r   utilsr   r   typing_extensionsr   r    r!   r   r"   r   r#   r   r$   r%   r&   r[  r'   r(   r)   r   	ON_DATA_TrL   ON_MESSAGE_T
ON_ERROR_T	ON_OPEN_Tr   
ON_CLOSE_Tr/   rJ   rX   r[   r{   r}   r   r*   rZ  rF   rG   rH   <module>r     s   " " " " " "                                               + + + + + + / / / / / / / / < < < < < < < < < < < < " " " " " " " " . . . . . . . . , , , , , , , , 9&&&&&&''''''""""""$$$$$$$$$$$$OOOOOOOOOO00000000A+uk:D@AI[%s
*;<dBCL;	2D89J+,-I;S1478J 	*---    '   .( ( ( ( (Y ( ( (' ' ' ' 'nm ' ' ') ) ) ) )~w ) ) ) &,
  $     2; ; ; ; ; ; ; ;| FG a a a a a a a aHn) n) n) n) n)] n) n) n) n) n)rG   