{L ioddlmZddlZddlZddlmZddlmZddlm Z m Z ddl m Z ddl m Z mZmZmZmZmZmZddlZddlmZd d lmZmZd d lmZmZmZmZd d lm Z m!Z!d dl"m#Z#m$Z$d dl%m&Z&m'Z'e rkddl(m)Z)d dlm*Z*d dlm+Z+d dl,m-Z-d dl.m/Z/d dl0m1Z1m2Z2m3Z3d dl4m5Z5m6Z6edZ7ede8e+gdfZ9edee8e:fgdfZ;ede!gdfZe:gdfZ?ee dZ GddeZ@Gdde!ZAGdd eAe#ZBGd!d"eAe$ZC d+dd# d,d$ZDGd%d&ZEed'ZFGd(deEZGGd)d*eEZHy)-) annotationsN)IntEnum)partial)dumpsloads)select) TYPE_CHECKINGAnyCallableLiteralOptionalTypeVarUnion)CurlCffiWarning)CURL_SOCKET_BAD get_selector) CurlECodeCurlInfoCurlOpt CurlWsFlag)Curl CurlError) SessionClosedTimeout)not_setset_curl_options)Self)CurlHttpVersion) CurlWsFrame) CookieTypes) HeaderTypes)BrowserTypeLiteralExtraFingerprints ExtraFpDict) AsyncSession ProxySpecT WebSocket),:) separatorscXeZdZdZdZdZdZdZdZdZ dZ d Z d Z d Z d Zd ZdZdZdZdZdZdZy) WsCloseCodez?See: https://www.iana.org/assignments/websocket/websocket.xhtmliiiiiiiiiiiiiiii i i N)__name__ __module__ __qualname____doc__OK GOING_AWAYPROTOCOL_ERRORUNSUPPORTED_DATAUNKNOWNABNORMAL_CLOSURE INVALID_DATAPOLICY_VIOLATIONMESSAGE_TOO_BIGMANDATORY_EXTENSIONINTERNAL_ERRORSERVICE_RESTARTTRY_AGAIN_LATER BAD_GATEWAY TLS_HANDSHAKE UNAUTHORIZED FORBIDDENTIMEOUTc/mnt/ssd/data/python-lab/Trading/venv/lib/python3.12/site-packages/curl_cffi/requests/websockets.pyr/r/3scI BJNGLONOOKMLIGrGr/c.eZdZdZ d dfd ZxZS)WebSocketErrorzWebSocket-specific error.c&t|||yN)super__init__)selfmessagecode __class__s rHrNzWebSocketError.__init__Ms $'rG)r)rPstrrQz)Union[WsCloseCode, CurlECode, Literal[0]])r0r1r2r3rN __classcell__rRs@rHrJrJJs'#OP(("K((rGrJceZdZdZy)WebSocketClosedzWebSocket is already closed.Nr0r1r2r3rFrGrHrWrWSs&rGrWceZdZdZy)WebSocketTimeoutzWebSocket operation timed out.NrXrFrGrHrZrZWs(rGrZtimeoutcKj}|dk(r3j|jd|jfdnG|dk(r3j |jd|jfdnt d|d t j||d{y7#t j$rYywxYww) Nreadc&jSrL) remove_reader_fdloops rHzaselect..f4+=+=b+ArGwritec&jSrL) remove_writerras rHrezaselect..irfrGzInvalid mode: z. Must be 'read' or 'write'FT) create_future add_reader set_resultadd_done_callback add_writer ValueErrorasynciowait_for TimeoutError)rcmoderdr\futures` ` rHaselectru[s   !F v~ F--t4  !AB  F--t4  !AB>$/JKLLvw///  0   s<BCB6.B4/B63C4B66C  C C  CczeZdZdddd dZedZed dZeddZeddZ edd Z d Z y ) BaseWebSocketTF autoclosedebugcX||_||_d|_d|_||_d|_y)NF)_curlry _close_code _close_reasonrzclosed)rOcurlryrzs rHrNzBaseWebSocket.__init__us. (*.,0  rGct|jturt|j|_|jS)N)rz)r|rrrzrOs rHrzBaseWebSocket.curl}s( :: DJJ/DJzzrGc|jS)zThe WebSocket close reason, if the connection has been closed.)r~rs rH close_reasonzBaseWebSocket.close_reasons!!!rGc4tjd||zS)N!H)structpack)rQreasons rH_pack_close_framezBaseWebSocket._pack_close_frames{{4&//rGct|dkrtj}d}||fS tjd|d}|ddj }|tj vs|tjk(rtd|tj||fS#t$r }tdtj|d}~wt$r }tdtj|d}~wwxYw)NrrrzInvalid close code: zInvalid close messagezInvalid close frame) lenr/r8r unpack_fromdecode_value2member_map_rJr6UnicodeDecodeErrorr: Exception)framerQres rH_unpack_close_framez!BaseWebSocket._unpack_close_frames u:>&&DF*V|' ))$6q9qr))+ > >>{222(.tf5{7Q7QV|!& $+[-E-E $);+E+E s#,B C(!B<< C(C##C(cFd|_|jjy)$Terminate the underlying connection.TN)rrclosers rH terminatezBaseWebSocket.terminates  rGN)rrryboolrzr)returnz Optional[int])r Optional[str])rQintrbytesrr)rrrztuple[int, str]) r0r1r2rNpropertyrrr staticmethodrrrrFrGrHrwrwtsu8>%%j1  %%  !%!3!3G!<!"4+MM.zl(C'#$, s * B ABB zgzip, deflate, brrrcF|j}tdid|ddd|dd|gdd|gdd|gd |d |d |d |d d| gd| d| dd| gd| d|d|d|d|d|d|d|d|d|d|d|d||jtjd|j |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. rmethodGETurl params_listN headers_list cookies_listauthr\allow_redirects max_redirects proxies_listproxy proxy_auth verify_listrefereraccept_encoding impersonateja3akamaiextra_fpdefault_headersquote http_version interfacemax_recv_speedcert curl_optionsrrF)rrsetoptr CONNECT_ONLYperform)rOrparamsheaderscookiesrr\rrproxiesrrverifyrrrrrrrrrrrrrrs rHconnectzWebSocket.connectsXPyy    v        , (   " v  ,! "$# $% &' () *,+ ,- .&/ 0 1 2*3 45 6&7 > G((!,  rGc|jr td|jj\}}|jt j zr; |j|\|_|_ |jr|j||fS#t$r2}|j|_|j|jd}~wwxYw)z2Receive a single curl websocket fragment as bytes.WebSocket is already closedN)rrWrws_recvrrrrr}r~rJrQrry)rOchunkrrs rH recv_fragmentzWebSocket.recv_fragmentis ;;!"?@ @yy((* u ;;)) ) 7;7O7OPU7V4 $"4~~ e|" $%66  166"  sB C -CC c g}d}|jjtj}|tk(rt dt j |j\}}|j}|j||jdk(r|tjzdk(rnXdj%||fS#t$r<}|jt j k(rt#|gggd\}}}nYd}~Td}~wwxYw)z Receive a frame as bytes. libcurl splits frames into fragments, so we have to collect all the chunks for a frame. rInvalid active socket?NrG)rgetinfor ACTIVESOCKETrrJrNO_CONNECTION_AVAILABLErrappend bytesleftrCONTrrQAGAINrjoin)rOchunksrsock_fdrrrrbs rHrzWebSocket.recvs ))##H$9$9: o % ')J)J  #113 u  e$??a'EJOO,Cq,H xx&& 66Y__,%gYB5A f Fs7|#  66Y__,&,R'B&DOAy!$,-CD!K  s4C&& D8/>D32D33D8cB|j|tjS)VSend a binary frame. Args: payload: binary data to send. rrBINARYrOr s rH send_binaryzWebSocket.send_binary yy*"3"344rGcB|j|tjS)tSend a binary frame, alias of :meth:`send_binary`. Args: payload: binary data to send. rrs rH send_byteszWebSocket.send_bytesrrGcB|j|tjS)RSend a text frame. Args: payload: text data to send. rrrrs rHsend_strzWebSocket.send_str yy*//22rGrc0|j||S)Send a JSON frame. Args: payload: data to send. dumps: JSON encoder, default is json.dumps. rrOr rs rH send_jsonzWebSocket.send_jsons}}U7^,,rGcB|j|tjS)MSend a ping frame. Args: payload: data to send. rrPINGrs rHpingzWebSocket.pingrrGc |r|j|fi||jjtj}|t k(rt dtj|jdg}d|_ |jrK |j\}}|j}|jd|||j||jdk(r|tj zdk(swd|j"vrydj%|}|tj&zr|j(s |j+}|tj6zs|tj&zr|jd|g}|tj8zr6d |_ |jd |j2xsd|j:xsd |jrJy y #t,$rT} t.j0|_|j5t.j0t dt.j0| d } ~ wwxYw#t<$r} | j>tj@k(rtC|gggd \} } } n\|jd| |jDs=t.jF} tI| t r | j>} |j5| Yd } ~  d } ~ wwxYw)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 rrTrrrPrG Invalid UTF-8NFrrrr)%rrrrrrrJrrrrrrrrrrrrrrrrr/r:r}rrrr~rrQrrrr8r) rOrkwargsrrrrrrrrbrQs rH run_foreverzWebSocket.run_foreversY  DLL ' '))##H$9$9: o % ')J)J  6 + #113 u  65%0 e$1,1HA1M.((6*C /9R9R%"%**,C 1 11uz7N 9c2:+++(-D%JJw(8(8(=At?Q?Q?WUWXA$ 2%/:/G/GD, JJ{'?'?@"0 /1I1I##$%%  66Y__,$gYBH52GBH5 H2AH--H22H55 K>B KKrGc|jtury|j||}|j|tj |j yznClose the connection. Args: code: close code. message: close reason. N)rrrrrrrrOrQrPrs rHrzWebSocket.closeGsE 99  $$T73 #z''( rG)rzUnion[Curl, Any]ryrrrrzrrzOptional[ON_OPEN_T]rzOptional[ON_CLOSE_T]rzOptional[ON_DATA_T]rzOptional[ON_MESSAGE_T]rzOptional[ON_ERROR_T])rr*rr)rEventTypeLiteralrNone)2rrSrz"Optional[Union[dict, list, tuple]]rzOptional[HeaderTypes]rzOptional[CookieTypes]rOptional[tuple[str, str]]r\z3Optional[Union[float, tuple[float, float], object]]rrrrrzOptional[ProxySpec]rrrr5rzOptional[bool]rrrrrzOptional[BrowserTypeLiteral]rrrrrz/Optional[Union[ExtraFingerprints, ExtraFpDict]]rrrzUnion[str, Literal[False]]rzOptional[CurlHttpVersion]rrrz%Optional[Union[str, tuple[str, str]]]rrrzOptional[dict[CurlOpt, str]])rtuple[bytes, CurlWsFrame])rtuple[bytes, int])rrS)rCallable[[str], T]rr)r Union[str, bytes]rrr rr rSr r rzCallable[[Any], str]r r:)r)rrSrQrrPr)r0r1r2r3rrNrrrrrrrrrrrrrrrrr%r*r.r/r4rrTrUs@rHr*r*sd3")'/%*'+)-'+-1)-'/'/ '/ # '/  '/%'/''/%'/+'/''/R  &6:)-)-*.GN $'+#04!%!%)<48! $DH $,.26#'6:595k k3k' k ' k ( kEkkk%kk.kkk'k 2!k"#k$%k&B'k()k**+k,0-k.!/k041k23k435kZ,'@8=DNCTCT)V553HM-3BH!,rGc$eZdZdZddd dfdZedZddZddZd d  dd Z d d dd Z d d dd Z e d d d dZ ejf d!dZd"dZd"dZd#dZedd$dZd%dZej0dfd&dZfdZxZS)'AsyncWebSocketz0An async WebSocket implementation using libcurl.TFrxct||||||_d|_t j |_t j |_y)Nr)rMrNsession_looprpLock _recv_lock _send_lock)rOrCrryrzrRs rHrNzAsyncWebSocket.__init__\sA diuE :> !,,.!,,.rGcv|j"ttj|_|jSrL)rDrrpget_running_looprs rHrdzAsyncWebSocket.loopjs+ :: %g&>&>&@ADJzzrGc4|jr td|S)NzWebSocket has been closedrrs rH __aiter__zAsyncWebSocket.__aiter__ps ;;!"=> > rGczK|jd{\}}|tjzrt|S7"wrL)rrrStopAsyncIterationrs rH __anext__zAsyncWebSocket.__anext__us699;& U :## #$ $ 's ;9#;Nr[czK|jr td|jjr t d|j4d{ t j |jjd|jj|d{\}}|jtjzrX |j!|x\}}\|_|_|j,r(|j+||j/d{dddd{||fS77#t j$r}td|d}~wwxYw#t&$r;}|j(|_|j+|j(d{7d}~wwxYw77|#1d{7swYfSxYww)zxReceive a single frame as bytes. Args: timeout: how many seconds to wait before giving up. rz1Concurrent call to recv_fragment() is not allowedNz#WebSocket recv_fragment() timed out)rrWrFlocked TypeErrorrprqrdrun_in_executorrrrrrZrrrrr}r~rJrQrryr )rOr\rrrrQrPs rHrzAsyncWebSocket.recv_fragment{s ;;!"78 8 ?? ! ! #OP P?? = = U%,%5%5II--dDII4E4EF&  u {{Z--- 007MD'$HD$4d6H>>**T7>>+;<<<' = =*e|+ = '' U&'LMSTT U&()vvD$**QVV,,, =' = = = =*e|sA F;D-F;F#AD1D/D1$F##E%/F#FF# F;$F!% F;/D11E EEF# F!/FFFFF#!F;#F8)F, *F81 F;cvK|j}g}d}|jd|jjtj d{}|t k(rtdtj |j|d{\}}|j}|j||jdk(r|tjzdk(rnbdj)||fS77`#t $r@}|j"tj$k(rt'|||d{7nYd}~\d}~wwxYww)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. rNrr[)rdr\rG)rdrRrrrrrrJrrrrrrrrrrQrrur) rOr\rdrrrrrrs rHrzAsyncWebSocket.recvs$yy,, $))##X%:%:   o % ')J)J  %)%7%7%7%HH u  e$??a'EJOO,Cq,H xx&&)  I  66Y__,!'gFFFG s[A D9 C) (D95C- C+ A C-D9+C-- D66.D1$D'%D1,D91D66D9cK|j|d{\}}|tjzstdtj |j S7Dw)zmReceive a text frame. Args: timeout: how many seconds to wait before giving up. r[Nr,r)rOr\rrs rHrzAsyncWebSocket.recv_strsO !IIgI66 e ' +2J2JK K{{}7sAAAA)rr\cRK|j|d{}||S7 w)zReceive a JSON frame. Args: loads: JSON decoder, default is json.loads. timeout: how many seconds to wait before giving up. r[Nr)rOrr\rs rHrzAsyncWebSocket.recv_jsons*]]7]33T{4s '% 'cfK|jr tdt|tr|j }|j j d|jjtjd{}|tk(rtdtj|j4d{d}|t!|krT||d} |j j d|jj"||d{}||z }|t!|krTdddd{|S77|7.#t$$rX}|j&tj(k(r5t+|d|j dd{7}|s td|Yd}~Ղd}~wwxYw7p#1d{7swYSxYww) rrNrrrgr)rsrdr\r)rrWrrSr rdrRrrrrrrJrrrGrr rrQrru) rOr rrr r rrrs rHrzAsyncWebSocket.sends ;;!"78 8 gs #nn&G 11 $))##X%:%:   o % ')J)J  ?? ! !F3w<'!(!1 #'99#<#<dii//$F& #3w<'  ! !0 C  !!vv0*1#' 3+%%  )"01G"HaO  ! ! ! !0 sA:F1<D/=7F14D15F18F5D5D3D5 F F1(F)F11F13D55 F>9F7E:8F FFFFF1F.!F$ "F.)F1c^K|j|tjd{S7w)rNrrs rHrzAsyncWebSocket.send_binary % YYw (9(9:::: $-+-c^K|j|tjd{S7w)rNrrs rHrzAsyncWebSocket.send_bytesrXrYc^K|j|tjd{S7w)rNrrs rHrzAsyncWebSocket.send_str# YYw 8888rYr cLK|j||d{S7w)r"Nr#r$s rHr%zAsyncWebSocket.send_json#s!]]5>2222s $"$c^K|j|tjd{S7w)r'Nr(rs rHr*zAsyncWebSocket.ping,r\rYrGcK|j||}|j|tjd{|j y7wr0)rrrrrr1s rHrzAsyncWebSocket.close4sC$$T73iiZ--...  /s6AAAct||jjs|jj dyy)rN)rMrrC_closed push_curl)rOrRs rHrzAsyncWebSocket.terminateBs2 ||## LL " "4 ($rG)rCr'rrryrrzr)rrr2)r\Optional[float]rr6)r\rcrr7)r\rcrrS)rr8r\rcrr)r9r;r<r=r>r?)r0r1r2r3rNrrdrKrNrrrrrrrrrrrrr%r*r/r4rrrTrUs@rHrArAYs: ) ) )  )  )  -1")" ""H8< 'D<@ .3t * =L   ?I>O>O1(11;1f;;9NS39'2nns ))rGrA)r^)rszLiteral['read', 'write']rdzasyncio.AbstractEventLoopr\rcrr)I __future__rrprenumr functoolsrjsonrrrtypingr r r r r rrrcurl_cffi.utilsraiorrconstrrrrrrr exceptionsrrutilsrrtyping_extensionsrr r!rr"rr#rr$r%r&rCr'r(r)r ON_DATA_TrS ON_MESSAGE_T ON_ERROR_T ON_OPEN_Tr ON_CLOSE_Tr/rJrWrZrurwr3r*rArFrGrHrts" +/<<".,&'"$$OO0 A+uk:D@AI[%s *;