
    gW                        U d dl Z d dlZd dlZd dlZd dlZd dl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 ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZ ddlm Z m!Z!m"Z"m#Z#m$Z$m%Z%m&Z&m'Z'm(Z(m)Z)m*Z* ddl+m,Z, ddl-m.Z. ddl/m0Z0 ddl1m2Z2m3Z3 ddl4m5Z5m6Z6 ddl7m8Z8 ddl9m:Z: ejv                  dk\  rd dl Z<nd dl<Z<dZ=dZ>ee?   e@d<    ej                  ddd       G d d             ZB G d de:      ZCy)    N)AnyFinalIterableOptionalTupleUnioncast)CIMultiDict   )hdrs)WebSocketDataQueue)DEFAULT_LIMIT)AbstractStreamWriter)WSMessageTypeError)calculate_timeout_whenset_exception
set_result)WS_CLOSED_MESSAGEWS_CLOSING_MESSAGEWS_KEYWebSocketErrorWebSocketReaderWebSocketWriterWSCloseCode	WSMessage	WSMsgType
ws_ext_genws_ext_parse)_INTERNAL_RECEIVE_TYPES)	ws_logger)	EofStream)JSONDecoderJSONEncoder)HTTPBadRequestHTTPException)BaseRequest)StreamResponse)      )WebSocketResponseWebSocketReadyr      THRESHOLD_CONNLOST_ACCESST)auto_attribsfrozenslotsc                   4    e Zd ZU eed<   ee   ed<   defdZy)r+   okprotocolreturnc                     | j                   S N)r2   selfs    C/var/www/openai/venv/lib/python3.12/site-packages/aiohttp/web_ws.py__bool__zWebSocketReady.__bool__:   s    ww    N)__name__
__module____qualname__bool__annotations__r   strr:    r;   r9   r+   r+   5   s    Hsm$ r;   r+   c                   <    e Zd ZU dZeed<   dZee   ed<   dZ	ee
   ed<   dZee   ed<   dZeed<   dZeed<   d	Zeed
<   dZee   ed<   dZeej(                     ed<   dZeed<   dZeej.                  d      ed<   dZee   ed<   dZeed<   dZeej:                     ed<   dZeej:                     ed<   dZeej@                  d      ed<   dddddddde!d	dedee   dededee   de"e   d ed!ed"ed#df fd$Z#d^d%Z$d^d&Z%d^d'Z&d^d(Z'd_d)Z(d^d*Z)d+ed#dfd,Z*d^d-Z+d.e,d#e-f fd/Z.d.e,d#e/d0ee   eef   fd1Z0d.e,d#e/ee   e
f   fd2Z1d.e,d3ee   d4e
d#dfd5Z2d.e,d#e3fd6Z4e5d#efd7       Z6e5d#ee   fd8       Z7e5d#ee   fd9       Z8e5d#e9eef   fd:       Z:d`d;ed<e;d#e;fd=Z<d#ee   fd>Z=dad@e>d#dfdAZ?dad@e>d#dfdBZ@	 d`d@e>dCeAd ee   d#dfdDZBd`dEed ee   d#dfdFZCd`dEe>d ee   d#dfdGZD	 d`eEj                  dHdEe;d ee   dIeGd#dfdJZHd^dKZIeJj                  d?ddLdMed@e>dNed#efdOZLdMeJd#dfdPZMdMeJd#dfdQZNd^dRZOd`dee   d#ePfdSZQddTdee   d#efdUZRddTdee   d#e>fdVZSeEj                  ddWdXeUdee   d#e;fdYZVdEe>d#dfdZZWdbd[ZXd#ePfd\ZYd+ed#dfd]ZZ xZ[S )cr*   F_length_checkN_ws_protocol_writer_reader_closed_closingr   
_conn_lost_close_code_loop_waiting_close_wait
_exceptiong        _heartbeat_when_heartbeat_cb_pong_response_cb
_ping_taskg      $@TrB   i  @ )	timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_sizewriter_limitrT   rU   rV   rW   rX   rY   rZ   r[   r\   r4   c       	             t         
|   d       || _        || _        || _        || _        || _        || _        |
|dz  | _        || _	        || _
        |	| _        y )Ne   )statusg       @)super__init__
_protocols_timeout_receive_timeout
_autoclose	_autoping
_heartbeat_pong_heartbeat	_compress_max_msg_size_writer_limit)r8   rT   rU   rV   rW   rX   rY   rZ   r[   r\   	__class__s             r9   ra   zWebSocketResponse.__init__Q   si     	$# /#!# #,s?D +3))r;   c                     | j                          | j                  !| j                  j                          d | _        | j                  "| j                  j                          d | _        y y r6   )_cancel_pong_response_cbrQ   cancelrS   r7   s    r9   _cancel_heartbeatz#WebSocketResponse._cancel_heartbeatk   sZ    %%')%%'!%D??&OO""$"DO 'r;   c                 `    | j                   "| j                   j                          d | _         y y r6   )rR   ro   r7   s    r9   rn   z*WebSocketResponse._cancel_pong_response_cbt   s-    !!-""))+%)D" .r;   c                 b   | j                   y | j                          | j                  }||j                  j                  nd}| j
                  }|J |j                         }t        || j                   |      }|| _        | j                  "|j                  || j                        | _	        y y )Nr,   )rg   rn   _req	_protocol_timeout_ceil_thresholdrL   timer   rP   rQ   call_at_send_heartbeat)r8   reqtimeout_ceil_thresholdloopnowwhens         r9   _reset_heartbeatz"WebSocketResponse._reset_heartbeaty   s    ??"%%'ii58_CMM11! 	 zziik%c4??<RS#% "&dD4H4H!ID &r;   c                    d | _         | j                  }|| j                  J |j                         }|| j                  k  r,|j                  | j                  | j                        | _         y | j                  }||j                  j                  nd}t        || j                  |      }| j                          |j                  || j                        | _        | j                  j                  dt         j"                        }t$        j&                  dk\  rt)        j*                  ||d      }n|j-                  |      }|j/                         s#|| _        |j3                  | j4                         y | j5                  |       y )Nr,   r;   )r(      T)r{   eager_start)rQ   rL   rF   rv   rP   rw   rx   rs   rt   ru   r   rh   rn   _pong_not_receivedrR   
send_framer   PINGsysversion_infoasyncioTaskcreate_taskdonerS   add_done_callback_ping_task_done)r8   r{   r|   ry   rz   r}   coro	ping_tasks           r9   rx   z!WebSocketResponse._send_heartbeat   sD   !zzDLL$<<<iik%%%!%$$d&:&:"D ii58_CMM11! 	 &c4+?+?AWX%%'!%dD4K4K!L||&&sINN;w&  T$GI((.I~~'DO''(<(<=  +r;   c                 x    |j                         s#|j                         x}r| j                  |       d| _        y)z*Callback for when the ping task completes.N)	cancelled	exception_handle_ping_pong_exceptionrS   )r8   taskexcs      r9   r   z!WebSocketResponse._ping_task_done   s2    ~~DNN,<%<S%<,,S1r;   c                     | j                   ;| j                   j                  $| j                  t        j                                y y y r6   )rs   	transportr   r   TimeoutErrorr7   s    r9   r   z$WebSocketResponse._pong_not_received   s;    99 TYY%8%8%D,,W-A-A-CD &E r;   r   c                 B   | j                   ry| j                          | j                  t        j                         || _        | j                  rP| j                  sC| j                  6| j                  j                  t        t        j                  |d      d       yyyy)z5Handle exceptions raised during ping/pong processing.Nr   )rH   _set_closed_set_code_close_transportr   ABNORMAL_CLOSURErO   rM   rI   rG   	feed_datar   r   ERRORr8   r   s     r9   r   z-WebSocketResponse._handle_ping_pong_exception   st    <<&&{'C'CD==4<<3KLL""9Y__c4#H!L 4L=r;   c                 2    d| _         | j                          y)zdSet the connection to closed.

        Cancel any heartbeat timers and set the closed flag.
        TN)rH   rp   r7   s    r9   r   zWebSocketResponse._set_closed   s    
  r;   requestc                    K   | j                   | j                   S | j                  |      \  }}t        |   |       d {   }|J | j	                  |||       |j                          d {    |S 7 57 wr6   )_payload_writer
_pre_startr`   prepare_post_startdrain)r8   r   r3   writerpayload_writerrl   s        r9   r   zWebSocketResponse.prepare   s     +'''??73&$ww77)))(F3""$$$	 8 	%s#   ?A<A8.A<1A:2A<:A<zCIMultiDict[str]c                    |j                   }d|j                  t        j                  d      j	                         j                         k7  r8t        dj                  |j                  t        j                                    d|j                  t        j                  d      j	                         vr8t        dj                  |j                  t        j                                    d }t        j                  |v r|t        j                     j                  d      D cg c]  }t        |j                                }}|D ]  }|| j                  v s|} n" t        j                  d|| j                         |j                  t        j                  d      }|d	vrt        d
|       |j                  t        j                         }	 |r!t#        t%        j&                  |            dk7  rt        d|      	 t%        j,                  t/        j0                  |j3                         t4        z         j7                               j9                         }t;        t        j                  dt        j                  dt        j<                  |i      }	d}
d}| j>                  rR|j                  t        j@                        }tC        |d      \  }}
|r!tE        |d|
      }||	t        j@                  <   |r||	t        j                  <   |	|||
fS c c}w # t(        j*                  $ r t        d|      d w xY w)N	websocket z@No WebSocket UPGRADE hdr: {}
 Can "Upgrade" only to "WebSocket".)textupgradezNo CONNECTION upgrade hdr: {},u8   Client protocols %r don’t overlap server-known ones %r)1387zUnsupported version:    zHandshake error: Fr   T)isserver)rZ   r   server_notakeover)#headersgetr   UPGRADElowerstripr$   format
CONNECTIONSEC_WEBSOCKET_PROTOCOLsplitrA   rb   r    warningSEC_WEBSOCKET_VERSIONSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder
   SEC_WEBSOCKET_ACCEPTri   SEC_WEBSOCKET_EXTENSIONSr   r   )r8   r   r   r3   protoreq_protocolsversionkey
accept_valresponse_headers
notakeoverrZ   
extensions
enabledexts                 r9   
_handshakezWebSocketResponse._handshake   s    //'++dllB7==?EEGG 5&T\\23	  GKK<BBDD 4;;KK0  #'&&'1 %T%@%@AGGLLE EKKM"L  
 'DOO+$H ' !!N!OO ++d88"=** (=gY&GHH kk$001	M#f..s34:$,=cW*EFF ;
 %%LL./668

&( 	 'k)):
 
>> T%B%BCJ $0
T#J Hj'%

 CM !>!>?<DT889	
 	
q6 ~~ 	M (9#&ABL	Ms   $ L2L $M c                 Z   |j                   | _         | j                  |      \  }}}}| j                  d       | j                  j	                  |       | j                          || _        |j                  j                  }|J t        |j                  |||| j                        }||fS )Nr^   )rZ   r   limit)rL   r   
set_statusr   updateforce_closeri   rt   r   r   rk   )r8   r   r   r3   rZ   r   r   r   s           r9   r   zWebSocketResponse._pre_start.  s    ]]
26//'2J/8ZG$!%%//	$$$ !$$
 r;   r3   r   c           	      l   || _         || _        | j                          | j                  }|J t	        |j
                  d|      | _        |j                  j                  t        | j                  | j                  t        | j                                     |j                  j                  d       y )Ni   )r{   rZ   F)rE   rF   r~   rL   r   rt   rG   r3   
set_parserr   rj   r?   ri   
keep_alive)r8   r   r3   r   r{   s        r9   r   zWebSocketResponse._post_startC  s     %zz)'*;*;UN##d004;O	
 	##E*r;   c                     | j                   t        d      	 | j                  |      \  }}}}t        d|      S # t        $ r t        dd       cY S w xY w)NzAlready startedTF)rF   RuntimeErrorr   r+   r%   )r8   r   _r3   s       r9   can_preparezWebSocketResponse.can_prepareV  sa    <<#011	2 $ 8AxA "$11  	/!%..	/s   ; AAc                     | j                   S r6   )rH   r7   s    r9   closedzWebSocketResponse.closed`  s    ||r;   c                     | j                   S r6   )rK   r7   s    r9   
close_codezWebSocketResponse.close_coded  s    r;   c                     | j                   S r6   )rE   r7   s    r9   ws_protocolzWebSocketResponse.ws_protocolh  s       r;   c                     | j                   S r6   )ri   r7   s    r9   rZ   zWebSocketResponse.compressl  s    ~~r;   namedefaultc                 f    | j                   }||S |j                  }||S |j                  ||      S )z}Get optional transport information.

        If no value associated with ``name`` is found, ``default`` is returned.
        )rF   r   get_extra_info)r8   r   r   r   r   s        r9   r   z WebSocketResponse.get_extra_infop  s@    
 >N$$	N''g66r;   c                     | j                   S r6   )rO   r7   s    r9   r   zWebSocketResponse.exception}  s    r;   r;   messagec                    K   | j                   t        d      | j                   j                  |t        j                         d {    y 7 wNCall .prepare() first)rF   r   r   r   r   r8   r   s     r9   pingzWebSocketResponse.ping  s:     <<677ll%%gy~~>>>   AAAAc                    K   | j                   t        d      | j                   j                  |t        j                         d {    y 7 wr   )rF   r   r   r   PONGr   s     r9   pongzWebSocketResponse.pong  s:     <<677ll%%gy~~>>>r   opcodec                    K   | j                   t        d      | j                   j                  |||       d{    y7 w)z Send a frame over the websocket.Nr   )rF   r   r   )r8   r   r   rZ   s       r9   r   zWebSocketResponse.send_frame  s:      <<677ll%%gvx@@@s   8AA Adatac                   K   | j                   t        d      t        |t              st	        dt        |      z        | j                   j                  |j                  d      t        j                  |       d {    y 7 w)Nr   zdata argument must be str (%r)zutf-8r   )
rF   r   
isinstancerA   	TypeErrortyper   r   r   TEXTr8   r   rZ   s      r9   send_strzWebSocketResponse.send_str  sp     <<677$$<tDzIJJll%%KK )..8 & 
 	
 	
s   A=B?B Bc                 
  K   | j                   t        d      t        |t        t        t
        f      st        dt        |      z        | j                   j                  |t        j                  |       d {    y 7 w)Nr   z#data argument must be byte-ish (%r)r   )rF   r   r   bytes	bytearray
memoryviewr   r  r   r   BINARYr  s      r9   
send_byteszWebSocketResponse.send_bytes  sg     <<677$	: >?ADJNOOll%%dI,<,<x%PPPs   A9B;B<B)dumpsr  c                R   K   | j                   ||      |       d {    y 7 w)Nr   )r  )r8   r   rZ   r  s       r9   	send_jsonzWebSocketResponse.send_json  s"      mmE$K(m;;;s   '%'c                    K   | j                   ry | j                  t        d      | j                          d {    d| _         y 7 w)NzResponse has not been startedT)	_eof_sentr   r   closer7   s    r9   	write_eofzWebSocketResponse.write_eof  sC     >>'>??jjl 	s   8A	AA	)coder   r   r  r   c                  K   | j                   t        d      | j                  ry| j                          	 | j                   j	                  ||       d{    | j
                  }|J |r|j                          d{    | j                  }|J | j                   re| j"                  J | j$                  J | j"                  j'                         | _        |j)                  t*        d       | j$                   d{    | j,                  r| j/                          y	 t1        j2                  | j4                        4 d{    	 |j7                          d{   }|j8                  t:        j<                  u r-| j                  |j>                         	 ddd      d{    yb7 Y7 2# t        j                  t        j                  f$ r! | j                  t        j                          t        $ r0}|| _        | j                  t        j                         Y d}~yd}~ww xY w7 27 7 7 # 1 d{  7  sw Y   yxY w# t        j                  $ r! | j                  t        j                          t        $ r0}|| _        | j                  t        j                         Y d}~yd}~ww xY ww)zClose websocket connection.Nr   FTr   ) rF   r   rH   r   r  r   r   r   CancelledErrorr   r   r   r   	ExceptionrO   rG   rM   rL   rN   create_futurer   r   rI   _close_transportasync_timeoutrT   rc   readr  r   CLOSEr   )r8   r  r   r   r   r   readermsgs           r9   r  zWebSocketResponse.close  sC     <<677<<	,,$$T7333))F%%%lln$$ !!! ==::)))##+++#zz779D/3""""==!!#	$,,T]];; &-Cxx9??266sxx@# <;;= 4 %&&(<(<= 	**;+G+GH 	!DO**;+G+GH	 # <- <;;; %% 	**;+G+GH 	!DO**;+G+GH	s   5K F6 F0)F6 F3F6 A<K H4!K %#I H7	I H=!H9"<H=I )H;*I .K /H=0F6 3F6 6AH1&H,'K ,H11K 7I 9H=;I =IIII K I ;J=&J83K 8J==K c                 @    d| _         || _        | j                          y)z6Set the close code and mark the connection as closing.TN)rI   rK   rp   r8   r  s     r9   _set_closingzWebSocketResponse._set_closing  s     r;   c                 2    || _         | j                          y)z+Set the close code and close the transport.N)rK   r  r  s     r9   r   z+WebSocketResponse._set_code_close_transport  s    r;   c                     | j                   <| j                   j                  %| j                   j                  j                          yyy)zClose the transport.N)rs   r   r  r7   s    r9   r  z"WebSocketResponse._close_transport  s:    99 TYY%8%8%DII%%' &E r;   c                 .  K   | j                   t        d      |xs | j                  }	 | j                  rt        d      | j                  r9| xj
                  dz  c_        | j
                  t        k\  rt        d      t        S | j                  rt        S 	 d| _        	 |rQt        j                  |      4 d {    | j                   j                          d {   }d d d       d {    n"| j                   j                          d {   }| j                          d| _        | j                  rt        | j                  d        	 jB                  tD        vr|S |jB                  t0        jF                  u rO| j?                  |jH                         | j                  s&| jJ                  r| j-                  d       d {    |S |jB                  t0        jL                  u r!| j?                  t&        j(                         |S |jB                  t0        jN                  u r1| jP                  r%| jS                  |jH                         d {    0|jB                  t0        jT                  u r| jP                  rZ|S 7 7 7 # 1 d {  7  sw Y   xY w7 # d| _        | j                  rt        | j                  d        w w xY w# t         j"                  $ r  t$        $ rL t&        j(                  | _        | j-                          d {  7   t/        t0        j2                  d d       cY S t4        $ r[}|j6                  | _        | j-                  |j6                         d {  7   t/        t0        j8                  |d       cY d }~S d }~wt:        $ rd}|| _        | j?                  t&        j@                         | j-                          d {  7   t/        t0        j8                  |d       cY d }~S d }~ww xY w7 F7 w)	Nr   Tz+Concurrent call to receive() is not allowedr   zWebSocket connection is closed.F)r  )r   )+rG   r   rd   rM   rH   rJ   r-   r   rI   r   r  rT   r  r~   rN   r   r   r   r!   r   OKrK   r  r   r   CLOSEDr   r  r   r  rO   r  r   r  r   r  r   re   CLOSINGr   rf   r   r   )r8   rT   rU   r  r   s        r9   receivezWebSocketResponse.receive  s    <<677!:T%:%:}}"#PQQ||1$??&??&'HII(())= $;&
 $1#8#8#I#I(,(9(9(;";C $J#I#I %)LL$5$5$77))+$)DM''"4#3#3T:" xx66 
xx9??*!!#((+||
 **5*111 J Y...!!+..1 J Y^^+ii)))Y^^+J_ $J"; $J#I#I#I 8 %*DM''"4#3#3T: (''  ?#.>> jjl"" !1!14>>! =#&88 jjchhj/// #t<< ="%!!+">">?jjl"" #t<<	=& 2 *s  BPK "J( =J>J( JJ	 J$J( /J0"J( J%J( '*K A8P	P
B	PP2PJ( 	JJ( J"JJ"	J( (,KK APL P<P>P0N6M97NPPP(9P!O$"PPPPPPrT   c                   K   | j                  |       d {   }|j                  t        j                  ur&t	        d|j                   d|j
                  d      t        t        |j
                        S 7 `w)NReceived message :z is not WSMsgType.TEXT)r&  r  r   r  r   r   r	   rA   r8   rT   r  s      r9   receive_strzWebSocketResponse.receive_strF  sg     LL))889>>)$#CHH:Qsxxl:PQ  C"" *   A:A8A!A:c                   K   | j                  |       d {   }|j                  t        j                  ur&t	        d|j                   d|j
                  d      t        t        |j
                        S 7 `w)Nr)  r*  z is not WSMsgType.BINARY)r&  r  r   r	  r   r   r	   r  r+  s      r9   receive_byteszWebSocketResponse.receive_bytesN  si     LL))889+++$#CHH:Qsxxl:RS  E388$$ *r-  )loadsrT   r0  c                R   K   | j                  |       d {   } ||      S 7 w)Nr'  )r,  )r8   r0  rT   r   s       r9   receive_jsonzWebSocketResponse.receive_jsonV  s-      %%g%66T{ 7s   '%'c                     K   t        d      w)Nz"Cannot call .write() for websocket)r   )r8   r   s     r9   writezWebSocketResponse.write\  s     ?@@s   c                     | S r6   rB   r7   s    r9   	__aiter__zWebSocketResponse.__aiter___  s    r;   c                    K   | j                          d {   }|j                  t        j                  t        j                  t        j
                  fv rt        |S 7 Gwr6   )r&  r  r   r  r%  r$  StopAsyncIteration)r8   r  s     r9   	__anext__zWebSocketResponse.__anext__b  sG     LLN"88	):):I<L<LMM$$
 #s   A AAA c                 x    d| _         | j                          | j                  t        | j                  |       y y )NT)rI   rp   rG   r   r   s     r9   _cancelzWebSocketResponse._cancelh  s4      <<#$,,, $r;   )r4   N)r   zasyncio.Task[None]r4   Nr6   )r;   )r4   r*   )\r<   r=   r>   rD   r?   r@   rE   r   rA   rF   r   rG   r   rH   rI   rJ   intrK   rL   r   AbstractEventLooprM   rN   FuturerO   BaseExceptionrP   floatrQ   TimerHandlerR   rS   r   r   r   ra   rp   rn   r~   rx   r   r   r   r   r&   r   r   r   r   r   r   r+   r   propertyr   r   r   r   rZ   r   r   r   r  r   r   r   r   r  r
  jsonr  r#   r  r  r   r#  r  r  r   r  r   r&  r,  r/  r0  r"   r2  r4  r6  r9  r;  __classcell__)rl   s   @r9   r*   r*   >   s	   M4"&L(3-&)-GXo&-,0GX()0GTHdJ!%K#%15E8G--.5Hd26K'.../6*.J'. OU 37M8G//077;x 3 34;/3Jd+,3
 +/%)#%+)* * "%	*
 * * E?* C=* * * * 
*4#*
J*!,FEM} M M!
[ 
5I 
S
"S
	!8C=#t;	<S
j +  %8V2W  *+"+.6sm+ET+	+&2; 2> 2     HSM     !Xc] ! ! %T	*  73 7 7 78M2 ?% ?$ ?
?% ?$ ? LPAA&/A;CC=A	A
3 
(3- 
4 
QU Qhsm Qt Q #'<
 "ZZ<< 3-<
 < 
< )^^cQU556;5JN5	5n! ! ! k  d  
(
HXe_ H	 HT ?C #HUO #s # AE %huo % % '+jjT#;CE?	A A$ A -= -T -r;   r*   )Dr   r   r   r   rC  r   typingr   r   r   r   r   r   r	   attr	multidictr
   r   r   _websocket.readerr   _websocket.writerr   abcr   client_exceptionsr   helpersr   r   r   httpr   r   r   r   r   r   r   r   r   r   r   http_websocketr   logr    streamsr!   typedefsr"   r#   web_exceptionsr$   r%   web_requestr&   web_responser'   r   r  __all__r-   r<  r@   sr+   r*   rB   r;   r9   <module>rW     s         
 E E E  !  1 , % 1 F F    4   . 9 $ (w# )* 5: ) T$d3  4p- p-r;   