o
    iX                     @   s  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j;dkrd dl Z<nd dl<Z<dZ=dZ>ee? e@d< ejAddddG dd dZBG dd de:ZCdS )    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)Zauto_attribsfrozenslotsc                   @   s0   e Zd ZU eed< ee ed< defddZdS )r*   okprotocolreturnc                 C      | j S N)r/   self r6   H/home/kim/smarthome/.venv/lib/python3.10/site-packages/aiohttp/web_ws.py__bool__:      zWebSocketReady.__bool__N)__name__
__module____qualname__bool__annotations__r   strr8   r6   r6   r6   r7   r*   5   s   
 r*   c                       s  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$d%Z#dd&d'Z$dd(d)Z%dd*d+Z&dd,d-Z'dd0d1Z(dd2d3Z)d4ed#dfd5d6Z*dd7d8Z+d9e,d#e-f fd:d;Z.d9e,d#e/d<ee eef fd=d>Z0d9e,d#e/ee e
f fd?d@Z1d9e,dAee dBe
d#dfdCdDZ2d9e,d#e3fdEdFZ4e5d#efdGdHZ6e5d#efdIdJZ7e5d#ee fdKdLZ8e5d#ee fdMdNZ9e5d#e:eef fdOdPZ;ddQedRe<d#e<fdSdTZ=d#ee fdUdVZ>ddXe?d#dfdYdZZ@ddXe?d#dfd[d\ZA	ddXe?d]eBd ee d#dfd^d_ZCdd`ed ee d#dfdadbZDdd`e?d ee d#dfdcddZE	deFjGded`e<d ee dfeHd#dfdgdhZIddidjZJeKjLdWddkdledXe?dmed#efdndoZMdleKd#dfdpdqZNdleKd#dfdrdsZOddtduZPddee d#eQfdvdwZRddxdee d#efdydzZSddxdee d#e?fd{d|ZTeFjUdd}d~eVdee d#e<fddZWd`e?d#dfddZXdddZYd#eQfddZZd4ed#dfddZ[  Z\S )r)   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      $@Tr6   i  @ )	timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_sizewriter_limitrP   rQ   rR   rS   rT   rU   rV   rW   rX   r1   c       	   
         sZ   t  jdd || _|| _|| _|| _|| _|| _|d ur"|d | _|| _	|| _
|	| _d S )Ne   )statusg       @)super__init__
_protocols_timeout_receive_timeout
_autoclose	_autoping
_heartbeat_pong_heartbeat	_compress_max_msg_size_writer_limit)
r5   rP   rQ   rR   rS   rT   rU   rV   rW   rX   	__class__r6   r7   r\   Q   s   

zWebSocketResponse.__init__c                 C   sD   |    | jd ur| j  d | _| jd ur | j  d | _d S d S r3   )_cancel_pong_response_cbrM   cancelrO   r4   r6   r6   r7   _cancel_heartbeatk   s   




z#WebSocketResponse._cancel_heartbeatc                 C   s"   | j d ur| j   d | _ d S d S r3   )rN   rj   r4   r6   r6   r7   ri   t   s   


z*WebSocketResponse._cancel_pong_response_cbc                 C   s   | j d u rd S |   | j}|d ur|jjnd}| j}|d us!J | }t|| j |}|| _| j	d u r>|
|| j| _	d S d S )Nr+   )rb   ri   _req	_protocol_timeout_ceil_thresholdrH   timer   rL   rM   call_at_send_heartbeat)r5   reqtimeout_ceil_thresholdloopnowwhenr6   r6   r7   _reset_heartbeaty   s   

z"WebSocketResponse._reset_heartbeatc                 C   s   d | _ | j}|d ur| jd usJ | }|| jk r%|| j| j| _ d S | j}|d ur0|jj	nd}t
|| j|}|   ||| j| _| jdtj}tjdkr[tj||dd}n||}| so|| _|| j d S | | d S )Nr+       )r'      T)rt   Zeager_start)rM   rH   rB   ro   rL   rp   rq   rl   rm   rn   r   rc   ri   _pong_not_receivedrN   
send_framer   PINGsysversion_infoasyncioTaskZcreate_taskdonerO   Zadd_done_callback_ping_task_done)r5   rt   ru   rr   rs   rv   coroZ	ping_taskr6   r6   r7   rq      s.   


z!WebSocketResponse._send_heartbeattaskasyncio.Task[None]c                 C   s(   |  s|  }r| | d| _dS )z*Callback for when the ping task completes.N)Z	cancelled	exception_handle_ping_pong_exceptionrO   )r5   r   excr6   r6   r7   r      s   

z!WebSocketResponse._ping_task_donec                 C   s<   | j d ur| j jd ur| td| j d d S d S d S )NzNo PONG received after z seconds)rl   	transportr   r   TimeoutErrorrc   r4   r6   r6   r7   rz      s   z$WebSocketResponse._pong_not_receivedr   c                 C   sb   | j rdS |   | tj || _| jr+| js-| jdur/| j	t
tj|dd dS dS dS dS )z5Handle exceptions raised during ping/pong processing.Nr   )rD   _set_closed_set_code_close_transportr   ABNORMAL_CLOSURErK   rI   rE   rC   	feed_datar   r   ERRORr5   r   r6   r6   r7   r      s   z-WebSocketResponse._handle_ping_pong_exceptionc                 C   s   d| _ |   dS )zdSet the connection to closed.

        Cancel any heartbeat timers and set the closed flag.
        TN)rD   rk   r4   r6   r6   r7   r      s   zWebSocketResponse._set_closedrequestc                    s^   | j d ur	| j S | |\}}t |I d H }|d usJ | ||| | I d H  |S r3   )_payload_writer
_pre_startr[   prepare_post_startdrain)r5   r   r0   writerZpayload_writerrg   r6   r7   r      s   
zWebSocketResponse.preparezCIMultiDict[str]c                 C   s  |j }d|tjd  krtd|tjdd|tjd vr3td|tjdd }tj	|v r_dd |tj	 
d	D }|D ]}|| jv rT|} nqItd
|j|| j |tjd}|dvrrtd| d|tj}z|rtt|dkrtd|dW n tjy   td|dd w tt| t   }ttjdtjdtj|i}	d}
d}| jr|tj }t!|dd\}}
|rt"|d|
d}||	tj < |r||	tj	< |	|||
fS )NZ	websocket z@No WebSocket UPGRADE hdr: {}
 Can "Upgrade" only to "WebSocket".)textupgradezNo CONNECTION upgrade hdr: {}c                 S   s   g | ]}t | qS r6   )r?   strip).0protor6   r6   r7   
<listcomp>   s    
z0WebSocketResponse._handshake.<locals>.<listcomp>,u<   %s: Client protocols %r don’t overlap server-known ones %r)Z1387zUnsupported version:    zHandshake error: Fr   T)isserver)rV   r   Zserver_notakeover)#headersgetr   UPGRADElowerr   r#   formatZ
CONNECTIONZSEC_WEBSOCKET_PROTOCOLsplitr]   r   warningremoteZSEC_WEBSOCKET_VERSIONZSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder	   ZSEC_WEBSOCKET_ACCEPTrd   ZSEC_WEBSOCKET_EXTENSIONSr   r   )r5   r   r   r0   Zreq_protocolsr   versionkeyZ
accept_valresponse_headers
notakeoverrV   
extensionsZ
enabledextr6   r6   r7   
_handshake   s   




zWebSocketResponse._handshakec                 C   sp   |j | _ | |\}}}}| d | j| |   || _|jj}|d us)J t	|j|||| j
d}||fS )NrY   )rV   r   limit)rH   r   Z
set_statusr   updateZforce_closerd   rm   r   r   rf   )r5   r   r   r0   rV   r   r   r   r6   r6   r7   r   3  s    
zWebSocketResponse._pre_startr0   r   c                 C   sh   || _ || _|   | j}|d usJ t|jd|d| _|jt	| j| j
t| jd |jd d S )Ni   )rt   rV   F)rA   rB   rw   rH   r   rm   rC   r0   
set_parserr   re   r=   rd   
keep_alive)r5   r   r0   r   rt   r6   r6   r7   r   H  s   zWebSocketResponse._post_startc                 C   sP   | j d ur	tdz| |\}}}}W n ty"   tdd  Y S w td|S )NzAlready startedFT)rB   RuntimeErrorr   r$   r*   )r5   r   _r0   r6   r6   r7   can_prepare[  s   

zWebSocketResponse.can_preparec                 C   s
   | j d uS r3   )rB   r4   r6   r6   r7   preparede  s   
zWebSocketResponse.preparedc                 C   r2   r3   )rD   r4   r6   r6   r7   closedi     zWebSocketResponse.closedc                 C   r2   r3   )rG   r4   r6   r6   r7   
close_codem  r   zWebSocketResponse.close_codec                 C   r2   r3   )rA   r4   r6   r6   r7   ws_protocolq  r   zWebSocketResponse.ws_protocolc                 C   r2   r3   )rd   r4   r6   r6   r7   rV   u  r   zWebSocketResponse.compressnamedefaultc                 C   s0   | j }|du r	|S |j}|du r|S |||S )z}Get optional transport information.

        If no value associated with ``name`` is found, ``default`` is returned.
        N)rB   r   get_extra_info)r5   r   r   r   r   r6   r6   r7   r   y  s   z WebSocketResponse.get_extra_infoc                 C   r2   r3   )rK   r4   r6   r6   r7   r     r9   zWebSocketResponse.exceptionrx   messagec                    .   | j d u r
td| j |tjI d H  d S NCall .prepare() first)rB   r   r{   r   r|   r5   r   r6   r6   r7   ping  s   
zWebSocketResponse.pingc                    r   r   )rB   r   r{   r   PONGr   r6   r6   r7   pong  s   
zWebSocketResponse.pongopcodec                    s.   | j du r
td| j |||I dH  dS )z Send a frame over the websocket.Nr   )rB   r   r{   )r5   r   r   rV   r6   r6   r7   r{     s   
zWebSocketResponse.send_framedatac                    sR   | j d u r
tdt|tstdt| | j j|dtj	|dI d H  d S )Nr   zdata argument must be str (%r)zutf-8r   )
rB   r   
isinstancer?   	TypeErrortyper{   r   r   TEXTr5   r   rV   r6   r6   r7   send_str  s   

zWebSocketResponse.send_strc                    sR   | j d u r
tdt|tttfstdt| | j j|t	j
|dI d H  d S )Nr   z#data argument must be byte-ish (%r)r   )rB   r   r   bytes	bytearray
memoryviewr   r   r{   r   BINARYr   r6   r6   r7   
send_bytes  s   
zWebSocketResponse.send_bytes)dumpsr   c                   s   | j |||dI d H  d S )Nr   )r   )r5   r   rV   r   r6   r6   r7   	send_json  s   zWebSocketResponse.send_jsonc                    s6   | j rd S | jd u rtd|  I d H  d| _ d S )NzResponse has not been startedT)Z	_eof_sentr   r   closer4   r6   r6   r7   	write_eof  s   

zWebSocketResponse.write_eof)coder   r   r   r   c             
      s  | j du r
td| jrdS |   z| j ||I dH  | j}|dus'J |r0| I dH  W n- tjtj	fyC   | 
tj   ty^ } z|| _| 
tj W Y d}~dS d}~ww | j}|dushJ | jr| jdusrJ | jdu syJ | j | _|td | jI dH  | jr|   dS z;t| j4 I dH # 	 | I dH }|jtju r| 
|j 	 W d  I dH  W dS q1 I dH sw   Y  W dS  tjy   | 
tj   ty } z|| _| 
tj W Y d}~dS d}~ww )zClose websocket connection.Nr   FTr   ) rB   r   rD   r   r   r   r   r   ZCancelledErrorr   r   r   r   	ExceptionrK   rC   rI   rH   rJ   Zcreate_futurer   r   rE   _close_transportasync_timeoutrP   r^   readr   r   CLOSEr   )r5   r   r   r   r   r   readermsgr6   r6   r7   r     sh   
zWebSocketResponse.closec                 C   s   d| _ || _|   dS )z6Set the close code and mark the connection as closing.TN)rE   rG   rk   r5   r   r6   r6   r7   _set_closing  s   zWebSocketResponse._set_closingc                 C   s   || _ |   dS )z+Set the close code and close the transport.N)rG   r   r   r6   r6   r7   r     s   z+WebSocketResponse._set_code_close_transportc                 C   s.   | j dur| j jdur| j j  dS dS dS )zClose the transport.N)rl   r   r   r4   r6   r6   r7   r      s   z"WebSocketResponse._close_transportc              
      s  | j d u r
td|p| j}	 | jrtd| jr,|  jd7  _| jtkr*tdtS | jr1t	S zXd| _zD|r`t
|4 I d H  | j  I d H }W d   I d H  n1 I d H sZw   Y  n| j  I d H }|   W d| _| jryt| jd  nd| _| jrt| jd  w w W nq tjy     ty   tj| _|  I d H  ttjd d  Y S  ty } z|j| _| j|jdI d H  ttj|d W  Y d }~S d }~w ty } z|| _| tj  |  I d H  ttj|d W  Y d }~S d }~ww |j!t"vr|S |j!tj#u r#| |j$ | js!| j%r!| jddI d H  |S |j!tj&u r2| tj |S |j!tj'u rG| j(rG| )|j$I d H  q|j!tj*u rS| j(rSq|S )	Nr   Tz+Concurrent call to receive() is not allowedr
   zWebSocket connection is closed.F)r   )r   )+rC   r   r_   rI   rD   rF   r,   r   rE   r   r   rP   r   rw   rJ   r   r   r   r    r   OKrG   r   r   r   CLOSEDr   r   r   r   rK   r   r   r   r   r   r   r`   CLOSINGr|   ra   r   r   )r5   rP   rQ   r   r   r6   r6   r7   receive  s   


(
	zWebSocketResponse.receiverP   c                   D   |  |I d H }|jtjurtd|j d|jdtt|jS )NReceived message :z is not WSMsgType.TEXT)r   r   r   r   r   r   r   r?   r5   rP   r   r6   r6   r7   receive_strO     zWebSocketResponse.receive_strc                   r   )Nr   r   z is not WSMsgType.BINARY)r   r   r   r   r   r   r   r   r   r6   r6   r7   receive_bytesW  r   zWebSocketResponse.receive_bytes)loadsrP   r   c                   s   | j |dI d H }||S )Nr   )r   )r5   r   rP   r   r6   r6   r7   receive_json_  s   zWebSocketResponse.receive_jsonc                    s
   t d)Nz"Cannot call .write() for websocket)r   )r5   r   r6   r6   r7   writee  s   zWebSocketResponse.writec                 C   s   | S r3   r6   r4   r6   r6   r7   	__aiter__h  s   zWebSocketResponse.__aiter__c                    s.   |   I d H }|jtjtjtjfv rt|S r3   )r   r   r   r   r   r   StopAsyncIteration)r5   r   r6   r6   r7   	__anext__k  s
   zWebSocketResponse.__anext__c                 C   s,   d| _ |   | jd urt| j| d S d S )NT)rE   rk   rC   r   r   r6   r6   r7   _cancelq  s
   
zWebSocketResponse._cancel)r1   N)r   r   r1   Nr3   )rx   )r1   r)   )]r:   r;   r<   r@   r=   r>   rA   r   r?   rB   r   rC   r   rD   rE   rF   intrG   rH   r   ZAbstractEventLooprI   rJ   FuturerK   BaseExceptionrL   floatrM   ZTimerHandlerN   rO   r   r   r   r\   rk   ri   rw   rq   r   rz   r   r   r%   r   r   r   r   r   r   r*   r   propertyr   r   r   r   r   rV   r   r   r   r   r   r   r   r{   r   r   jsonr   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r!   r   r   r   r  r  __classcell__r6   r6   rg   r7   r)   >   s  
 	


	


#



V


	


	

7
J	

r)   )Dr   r   r   r   r  r}   typingr   r   r   r   r   r   r   attrZ	multidictr	   r   r   Z_websocket.readerr   Z_websocket.writerr   abcr   Zclient_exceptionsr   Zhelpersr   r   r   httpr   r   r   r   r   r   r   r   r   r   r   Zhttp_websocketr   logr   streamsr    Ztypedefsr!   r"   Zweb_exceptionsr#   r$   Zweb_requestr%   Zweb_responser&   r~   r   __all__r,   r  r>   sr*   r)   r6   r6   r6   r7   <module>   s>   
 $4

