a
    `gW                     @   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r`d 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< edddZdS )r*   okprotocolreturnc                 C   s   | j S N)r/   self r6   \/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/aiohttp/web_ws.py__bool__:   s    zWebSocketReady.__bool__N)__name__
__module____qualname__bool__annotations__r   strr8   r6   r6   r6   r7   r*   5   s   
r*   c                       sN  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	eee eeee e"e eeedd
 fddZ#ddddZ$ddd d!Z%ddd"d#Z&ddd$d%Z'd&dd'd(d)Z(ddd*d+Z)edd,d-d.Z*ddd/d0Z+e,e-d1 fd2d3Z.e,e/d4ee eef d1d5d6Z0e,e/ee e
f d1d7d8Z1e,ee e
dd9d:d;Z2e,e3d1d<d=Z4e5edd>d?Z6e5ee dd@dAZ7e5ee ddBdCZ8e5e9eef ddDdEZ:dee;e;dFdGdHZ<ee ddIdJZ=de>ddLdMdNZ?de>ddLdOdPZ@de>eAee ddQdRdSZBdeee ddTdUdVZCde>ee ddTdWdXZDdeEjFdYe;ee eGddZd[d\ZHddd]d^ZIeJjKdKdd_ee>eed`dadbZLeJddcdddeZMeJddcdfdgZNdddhdiZOdee ePdjdkdlZQddmee edjdndoZRddmee e>djdpdqZSeEjTddreUee e;dsdtduZVe>ddvdwdxZWd ddydzZXePdd{d|ZYedd,d}d~ZZ  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_limit)
rO   rP   rQ   rR   rS   rT   rU   rV   rW   r2   c       	   
         sZ   t  jdd || _|| _|| _|| _|| _|| _|d urD|d | _|| _	|| _
|	| _d S )Ne   )statusg       @)super__init__
_protocols_timeout_receive_timeout
_autoclose	_autoping
_heartbeat_pong_heartbeat	_compress_max_msg_size_writer_limit)
r5   rO   rP   rQ   rR   rS   rT   rU   rV   rW   	__class__r6   r7   r[   Q   s    
zWebSocketResponse.__init__r1   c                 C   s@   |    | jd ur"| j  d | _| jd ur<| j  d | _d S r3   )_cancel_pong_response_cbrL   cancelrN   r4   r6   r6   r7   _cancel_heartbeatk   s    



z#WebSocketResponse._cancel_heartbeatc                 C   s   | j d ur| j   d | _ d S r3   )rM   ri   r4   r6   r6   r7   rh   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sBJ | }t|| j |}|| _| j	d u rx|
|| j| _	d S )Nr+   )ra   rh   _req	_protocol_timeout_ceil_thresholdrG   timer   rK   rL   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 rJ|| j| j| _ d S | j}|d ur`|jj	nd}t
|| j|}|   ||| j| _| jdtj}tjdkrtj||dd}n
||}| s|| _|| j n
| | d S )Nr+       )r'      T)rs   Zeager_start)rL   rG   rA   rn   rK   ro   rp   rk   rl   rm   r   rb   rh   _pong_not_receivedrM   
send_framer   PINGsysversion_infoasyncioTaskcreate_taskdonerN   add_done_callback_ping_task_done)r5   rs   rt   rq   rr   ru   coroZ	ping_taskr6   r6   r7   rp      s.    


z!WebSocketResponse._send_heartbeatzasyncio.Task[None])taskr2   c                 C   s(   |  s|  }r| | d| _dS )z*Callback for when the ping task completes.N)	cancelled	exception_handle_ping_pong_exceptionrN   )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 S r3   )rk   	transportr   r~   TimeoutErrorr4   r6   r6   r7   ry      s    z$WebSocketResponse._pong_not_received)r   r2   c                 C   sV   | j r
dS |   | tj || _| jrR| jsR| jdurR| j	t
tj|dd dS )z5Handle exceptions raised during ping/pong processing.Nr   )rC   _set_closed_set_code_close_transportr   ABNORMAL_CLOSURErJ   rH   rD   rB   	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)rC   rj   r4   r6   r6   r7   r      s    zWebSocketResponse._set_closed)requestr2   c                    s\   | j d ur| j S | |\}}t |I d H }|d us<J | ||| | I d H  |S r3   )_payload_writer
_pre_startrZ   prepare_post_startdrain)r5   r   r0   writerZpayload_writerrf   r6   r7   r      s    
zWebSocketResponse.preparezCIMultiDict[str]c                 C   s  |j }d|tjd  kr8td|tjdd|tjd vrftd|tjdd }tj	|v rdd |tj	 
d	D }|D ]}|| jv r|} qqtd
|| j |tjd}|dvrtd| d|tj}z.|rtt|dkrtd|dW n( tjyB   td|dd Y n0 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>,u8   Client protocols %r don’t overlap server-known ones %r)Z1387zUnsupported version:    zHandshake error: Fr   T)isserver)rU   r   Zserver_notakeover)"headersgetr   UPGRADElowerr   r#   formatZ
CONNECTIONZSEC_WEBSOCKET_PROTOCOLsplitr\   r   warningZSEC_WEBSOCKET_VERSIONZSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder	   ZSEC_WEBSOCKET_ACCEPTrc   ZSEC_WEBSOCKET_EXTENSIONSr   r   )r5   r   r   r0   Zreq_protocolsr   versionkeyZ
accept_valresponse_headers
notakeoverrU   
extensionsZ
enabledextr6   r6   r7   
_handshake   s~    





zWebSocketResponse._handshakec                 C   sp   |j | _ | |\}}}}| d | j| |   || _|jj}|d usRJ t	|j|||| j
d}||fS )NrX   )rU   r   limit)rG   r   Z
set_statusr   updateZforce_closerc   rl   r   r   re   )r5   r   r   r0   rU   r   r   r   r6   r6   r7   r   .  s     
zWebSocketResponse._pre_start)r   r0   r   r2   c                 C   sh   || _ || _|   | j}|d us&J t|jd|d| _|jt	| j| j
t| jd |jd d S )Ni   )rs   rU   F)r@   rA   rv   rG   r   rl   rB   r0   
set_parserr   rd   r<   rc   
keep_alive)r5   r   r0   r   rs   r6   r6   r7   r   C  s    zWebSocketResponse._post_startc                 C   sT   | j d urtdz| |\}}}}W n tyD   tdd  Y S 0 td|S d S )NzAlready startedFT)rA   RuntimeErrorr   r$   r*   )r5   r   _r0   r6   r6   r7   can_prepareV  s    
zWebSocketResponse.can_preparec                 C   s   | j S r3   )rC   r4   r6   r6   r7   closed`  s    zWebSocketResponse.closedc                 C   s   | j S r3   )rF   r4   r6   r6   r7   
close_coded  s    zWebSocketResponse.close_codec                 C   s   | j S r3   )r@   r4   r6   r6   r7   ws_protocolh  s    zWebSocketResponse.ws_protocolc                 C   s   | j S r3   )rc   r4   r6   r6   r7   rU   l  s    zWebSocketResponse.compress)namedefaultr2   c                 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)rA   r   get_extra_info)r5   r   r   r   r   r6   r6   r7   r   p  s    z WebSocketResponse.get_extra_infoc                 C   s   | j S r3   )rJ   r4   r6   r6   r7   r   }  s    zWebSocketResponse.exceptionrw   )messager2   c                    s,   | j d u rtd| j |tjI d H  d S NCall .prepare() first)rA   r   rz   r   r{   r5   r   r6   r6   r7   ping  s    
zWebSocketResponse.pingc                    s,   | j d u rtd| j |tjI d H  d S r   )rA   r   rz   r   PONGr   r6   r6   r7   pong  s    
zWebSocketResponse.pong)r   opcoderU   r2   c                    s,   | j du rtd| j |||I dH  dS )z Send a frame over the websocket.Nr   )rA   r   rz   )r5   r   r   rU   r6   r6   r7   rz     s    
zWebSocketResponse.send_frame)datarU   r2   c                    sP   | 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   )
rA   r   
isinstancer>   	TypeErrortyperz   r   r   TEXTr5   r   rU   r6   r6   r7   send_str  s    

zWebSocketResponse.send_strc                    sP   | j d u rtdt|tttfs2tdt| | j j|t	j
|dI d H  d S )Nr   z#data argument must be byte-ish (%r)r   )rA   r   r   bytes	bytearray
memoryviewr   r   rz   r   BINARYr   r6   r6   r7   
send_bytes  s
    
zWebSocketResponse.send_bytes)dumps)r   rU   r   r2   c                   s   | j |||dI d H  d S )Nr   )r   )r5   r   rU   r   r6   r6   r7   	send_json  s    zWebSocketResponse.send_jsonc                    s4   | 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   r   r2   c             
      s  | j du rtd| jrdS |   z<| j ||I dH  | j}|dusLJ |r^| I dH  W n^ tjtj	fy   | 
tj  Y n8 ty } z || _| 
tj W Y d}~dS d}~0 0 | j}|dusJ | jr| jdusJ | jdu  sJ | j | _|td | jI dH  | jr0|   dS zt| j4 I dH \ | I dH }|jtju rH| 
|j W d  I dH  W dS qHW d  I dH  q1 I dH s0    Y  W n\ tjy   | 
tj  Y n: ty } z || _| 
tj W Y d}~dS d}~0 0 dS )zClose websocket connection.Nr   FTr   ) rA   r   rC   r   r   r   r   r~   CancelledErrorr   r   r   r   	ExceptionrJ   rB   rH   rG   rI   create_futurer   r   rD   _close_transportasync_timeoutrO   r]   readr   r   CLOSEr   )r5   r   r   r   r   r   readermsgr6   r6   r7   r     sT    
NzWebSocketResponse.close)r   r2   c                 C   s   d| _ || _|   dS )z6Set the close code and mark the connection as closing.TN)rD   rF   rj   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)rF   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 )zClose the transport.N)rk   r   r   r4   r6   r6   r7   r     s    z"WebSocketResponse._close_transport)rO   r2   c              
      s  | j d u rtd|p| j}| jr*td| jrT|  jd7  _| jtkrPtdtS | jr^t	S zd| _z|rt
|4 I d H & | j  I d H }W d   I d H  q1 I d H s0    Y  n| j  I d H }|   W d| _| jrt| jd  nd| _| jr
t| jd  0 W  n tjy(    Y n ty^   tj| _|  I d H  ttjd d  Y S  ty } z6|j| _| j|jdI d H  ttj|d W  Y d }~S d }~0  ty } z:|| _| tj  |  I d H  ttj|d W  Y d }~S d }~0 0 |j!t"vr|S |j!tj#u rN| |j$ | js| j%r| jddI d H  n`|j!tj&u rj| tj nD|j!tj'u r| j(r| )|j$I d H  qn|j!tj*u r| j(rq|S )	Nr   z+Concurrent call to receive() is not allowedr
   zWebSocket connection is closed.TF)r   )r   )+rB   r   r^   rH   rC   rE   r,   r   rD   r   r   rO   r   rv   rI   r   r~   r   r    r   OKrF   r   r   r   CLOSEDr   r   r   r   rJ   r   r   r   r   r   r   r_   CLOSINGr{   r`   r   r   )r5   rO   rP   r   r   r6   r6   r7   receive  sn    


<
"$zWebSocketResponse.receiverO   c                   sB   |  |I d H }|jtjur6t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   rO   r   r6   r6   r7   receive_strF  s    zWebSocketResponse.receive_strc                   sB   |  |I d H }|jtjur6td|j d|jdtt|jS )Nr   r   z is not WSMsgType.BINARY)r   r   r   r   r   r   r   r   r   r6   r6   r7   receive_bytesN  s    zWebSocketResponse.receive_bytes)loadsrO   )r   rO   r2   c                   s   | j |dI d H }||S )Nr   )r   )r5   r   rO   r   r6   r6   r7   receive_jsonV  s    zWebSocketResponse.receive_json)r   r2   c                    s   t dd S )Nz"Cannot call .write() for websocket)r   )r5   r   r6   r6   r7   write\  s    zWebSocketResponse.writec                 C   s   | S r3   r6   r4   r6   r6   r7   	__aiter___  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__b  s    zWebSocketResponse.__anext__c                 C   s(   d| _ |   | jd ur$t| j| d S )NT)rD   rj   rB   r   r   r6   r6   r7   _cancelh  s    
zWebSocketResponse._cancel)N)rw   )rw   )N)N)N)N)N)\r9   r:   r;   r?   r<   r=   r@   r   r>   rA   r   rB   r   rC   rD   rE   intrF   rG   r~   AbstractEventLooprH   rI   FuturerJ   BaseExceptionrK   floatrL   TimerHandlerM   rN   r   r   r   r[   rj   rh   rv   rp   r   ry   r   r   r%   r   r   r   r   r   r   r*   r   propertyr   r   r   r   rU   r   r   r   r   r   r   r   rz   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   rf   r7   r)   >   s   
	#
U

 
	
 	
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   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
