U
    j7g27                     @   s   d Z ddlZddlZddl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 ddlmZmZ dd	lmZmZmZmZmZmZ dd
lmZ ddlmZmZ ddlmZm Z m!Z!m"Z" ej#dkrddlZ$nddl$Z$G dd dZ%dS )zWebSocket client for asyncio.    N)TracebackType)AnyOptionalTypecast   )ClientErrorServerTimeoutError)ClientResponse)calculate_timeout_when
set_result)WS_CLOSED_MESSAGEWS_CLOSING_MESSAGEWebSocketErrorWSCloseCode	WSMessage	WSMsgType)WebSocketWriter)	EofStreamFlowControlDataQueue)DEFAULT_JSON_DECODERDEFAULT_JSON_ENCODERJSONDecoderJSONEncoder)      c                   @   s  e Zd Zddddddeee eeeee	j
ee ee eedd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dZdd	ddZeed	dd Zeee d	d!d"Zeee d	d#d$Zeed	d%d&Zeed	d'd(ZdVeeed)d*d+Zee d	d,d-ZdWe dd/d0d1Z!dXe dd/d2d3Z"dYeee dd4d5d6Z#dZe ee dd4d7d8Z$d[e%d9eee e&dd:d;d<Z'e(j)d.d=ee ed>d?d@Z*d\ee e+dAdBdCZ,ddDee edAdEdFZ-ddDee e dAdGdHZ.e/ddIe0ee edJdKdLZ1d d	dMdNZ2e+d	dOdPZ3d d	dQdRZ4ee5e  ee ee6 ddSdTdUZ7dS )]ClientWebSocketResponseNr   F)receive_timeout	heartbeatcompressclient_notakeoverzFlowControlDataQueue[WSMessage])readerwriterprotocolresponsetimeout	autocloseautopingloopr   r   r   r    returnc	                C   s   || _ |j| _|| _|| _|| _d| _d| _d | _|| _	|	| _
|| _|| _|
| _d | _d| _|
d k	rn|
d | _d | _|| _d| _d | _d | _|| _|| _d | _|   d S )NFg        g       @)	_response
connection_conn_writer_reader	_protocol_closed_closing_close_code_timeout_receive_timeout
_autoclose	_autoping
_heartbeat_heartbeat_cb_heartbeat_when_pong_heartbeat_pong_response_cb_loop_waiting_close_wait
_exception	_compress_client_notakeover
_ping_task_reset_heartbeat)selfr!   r"   r#   r$   r%   r&   r'   r(   r   r   r   r     rE   5/tmp/pip-unpacked-wheel-cme3dcq2/aiohttp/client_ws.py__init__#   s4    
z ClientWebSocketResponse.__init__)r)   c                 C   s@   |    | jd k	r"| j  d | _| jd k	r<| j  d | _d S N)_cancel_pong_response_cbr8   cancelrB   rD   rE   rE   rF   _cancel_heartbeatP   s    



z)ClientWebSocketResponse._cancel_heartbeatc                 C   s   | j d k	r| j   d | _ d S rH   )r;   rJ   rK   rE   rE   rF   rI   Y   s    

z0ClientWebSocketResponse._cancel_pong_response_cbc                 C   s|   | j d krd S |   | j}|d k	s(t| j}|d k	r>|jjnd}| }t|| j |}|| _	| j
d krx||| j| _
d S )N   )r7   rI   r<   AssertionErrorr,   
_connector_timeout_ceil_thresholdtimer   r9   r8   call_at_send_heartbeat)rD   r(   conntimeout_ceil_thresholdnowwhenrE   rE   rF   rC   ^   s    

z(ClientWebSocketResponse._reset_heartbeatc                 C   s   d | _ | j}| }|| jk r4|| j| j| _ d S | j}|d k	rJ|jjnd}t	|| j
|}|   ||| j| _tjdkrtj| j |dd}n|| j }| s|| _|| j n
| | d S )NrM   )r      T)r(   Zeager_start)r8   r<   rQ   r9   rR   rS   r,   rO   rP   r   r:   rI   _pong_not_receivedr;   sysversion_infoasyncioZTaskr-   pingZcreate_taskdonerB   Zadd_done_callback_ping_task_done)rD   r(   rV   rT   rU   rW   Z	ping_taskrE   rE   rF   rS   s   s,    
 
z'ClientWebSocketResponse._send_heartbeatzasyncio.Task[None])taskr)   c                 C   s(   |  s|  }r| | d| _dS )z*Callback for when the ping task completes.N)Z	cancelled	exception_handle_ping_pong_exceptionrB   )rD   r`   excrE   rE   rF   r_      s    
z'ClientWebSocketResponse._ping_task_donec                 C   s   |  t  d S rH   )rb   r	   rK   rE   rE   rF   rY      s    z*ClientWebSocketResponse._pong_not_received)rc   r)   c                 C   sP   | j r
dS |   tj| _|| _| j  | jrL| j	sL| j
ttj|d dS )z5Handle exceptions raised during ping/pong processing.N)r0   _set_closedr   ABNORMAL_CLOSUREr2   r?   r*   closer=   r1   r.   	feed_datar   r   ERROR)rD   rc   rE   rE   rF   rb      s    
z3ClientWebSocketResponse._handle_ping_pong_exceptionc                 C   s   d| _ |   dS )zdSet the connection to closed.

        Cancel any heartbeat timers and set the closed flag.
        TN)r0   rL   rK   rE   rE   rF   rd      s    z#ClientWebSocketResponse._set_closedc                 C   s   d| _ |   dS )zfSet the connection to closing.

        Cancel any heartbeat timers and set the closing flag.
        TN)r1   rL   rK   rE   rE   rF   _set_closing   s    z$ClientWebSocketResponse._set_closingc                 C   s   | j S rH   )r0   rK   rE   rE   rF   closed   s    zClientWebSocketResponse.closedc                 C   s   | j S rH   )r2   rK   rE   rE   rF   
close_code   s    z"ClientWebSocketResponse.close_codec                 C   s   | j S rH   )r/   rK   rE   rE   rF   r#      s    z ClientWebSocketResponse.protocolc                 C   s   | j S rH   )r@   rK   rE   rE   rF   r      s    z ClientWebSocketResponse.compressc                 C   s   | j S rH   )rA   rK   rE   rE   rF   r       s    z)ClientWebSocketResponse.client_notakeover)namedefaultr)   c                 C   s2   | j j}|dkr|S |j}|dkr&|S |||S )z$extra info from connection transportN)r*   r+   	transportget_extra_info)rD   rl   rm   rT   rn   rE   rE   rF   ro      s    z&ClientWebSocketResponse.get_extra_infoc                 C   s   | j S rH   )r?   rK   rE   rE   rF   ra      s    z!ClientWebSocketResponse.exception    )messager)   c                    s   | j |I d H  d S rH   )r-   r]   rD   rq   rE   rE   rF   r]      s    zClientWebSocketResponse.pingc                    s   | j |I d H  d S rH   )r-   pongrr   rE   rE   rF   rs      s    zClientWebSocketResponse.pong)datar   r)   c                    s6   t |tstdt| | jj|d|dI d H  d S )Nzdata argument must be str (%r)Fbinaryr   )
isinstancestr	TypeErrortyper-   sendrD   rt   r   rE   rE   rF   send_str   s    
z ClientWebSocketResponse.send_strc                    s<   t |tttfs tdt| | jj|d|dI d H  d S )Nz#data argument must be byte-ish (%r)Tru   )rw   bytes	bytearray
memoryviewry   rz   r-   r{   r|   rE   rE   rF   
send_bytes   s    z"ClientWebSocketResponse.send_bytes)dumps)rt   r   r   r)   c                   s   | j |||dI d H  d S )N)r   )r}   )rD   rt   r   r   rE   rE   rF   	send_json   s    z!ClientWebSocketResponse.send_json)coderq   )r   rq   r)   c             
      s  | j rH| jsH| jd k	st| j | _|   | jt	d | jI d H  | j
rRdS |   z| j||I d H  W nh tjk
r   tj| _| j   Y n@ tk
r } z"tj| _|| _| j  W Y dS d }~X Y nX | jr| j  dS z:t| j4 I d H  | j I d H }W 5 Q I d H R X W nl tjk
rV   tj| _| j   Y nB tk
r } z"tj| _|| _| j  W Y dS d }~X Y nX |jtjkr|j| _| j  dS qd S )Nr   FT)r=   r1   r<   rN   Zcreate_futurer>   ri   r.   rg   r   r0   rd   r-   rf   r\   CancelledErrorr   re   r2   r*   	Exceptionr?   async_timeoutr%   r3   readrz   r   CLOSErt   )rD   r   rq   rc   msgrE   rE   rF   rf      sN    


$


zClientWebSocketResponse.close)r%   r)   c              
      s  |p| j }| jrtd| jr"tS | jr:|  I d H  tS z~d| _zV|r~t	
|4 I d H  | j I d H }W 5 Q I d H R X n| j I d H }|   W 5 d| _| jrt| jd  X W n0 tjtjfk
r   tj| _ Y n
 tk
r   tj| _|  I d H  ttjd d  Y S  tk
r@   |   tj| _t Y S  tk
r } z2|j| _| j|jdI d H  ttj|d  W Y S d }~X Y nZ tk
r } z:|| _|    tj| _|  I d H  ttj|d  W Y S d }~X Y nX |j!tj"kr(|    |j#| _| js| j$r|  I d H  n\|j!tj%kr@|    nD|j!tj&krl| j'rl| (|j#I d H  q
n|j!tj)kr| j'rq
|S )Nz+Concurrent call to receive() is not allowedTF)r   )*r4   r=   RuntimeErrorr0   r   r1   rf   r>   r   r   r%   r.   r   rC   r\   r   TimeoutErrorr   re   r2   r   OKr   r   CLOSEDr   rd   r   r   rh   r   r?   ri   rz   r   rt   r5   CLOSINGZPINGr6   rs   ZPONG)rD   r%   r   r   rc   rE   rE   rF   receive#  sj    
""$
zClientWebSocketResponse.receiver%   c                   sB   |  |I d H }|jtjk	r6td|j d|jdtt|jS )NReceived message :z is not str)r   rz   r   ZTEXTry   rt   r   rx   rD   r%   r   rE   rE   rF   receive_strg  s    z#ClientWebSocketResponse.receive_strc                   sB   |  |I d H }|jtjk	r6td|j d|jdtt|jS )Nr   r   z is not bytes)r   rz   r   ZBINARYry   rt   r   r~   r   rE   rE   rF   receive_bytesm  s    z%ClientWebSocketResponse.receive_bytes)loadsr%   )r   r%   r)   c                   s   | j |dI d H }||S )Nr   )r   )rD   r   r%   rt   rE   rE   rF   receive_jsons  s    z$ClientWebSocketResponse.receive_jsonc                 C   s   | S rH   rE   rK   rE   rE   rF   	__aiter__|  s    z!ClientWebSocketResponse.__aiter__c                    s,   |   I d H }|jtjtjtjfkr(t|S rH   )r   rz   r   r   r   r   StopAsyncIteration)rD   r   rE   rE   rF   	__anext__  s    z!ClientWebSocketResponse.__anext__c                    s   | S rH   rE   rK   rE   rE   rF   
__aenter__  s    z"ClientWebSocketResponse.__aenter__)exc_typeexc_valexc_tbr)   c                    s   |   I d H  d S rH   )rf   )rD   r   r   r   rE   rE   rF   	__aexit__  s    z!ClientWebSocketResponse.__aexit__)N)rp   )rp   )N)N)N)N)8__name__
__module____qualname__r   r   rx   r
   floatboolr\   ZAbstractEventLoopintrG   rL   rI   rC   rS   r_   rY   BaseExceptionrb   rd   ri   propertyrj   rk   r#   r   r    r   ro   ra   r~   r]   rs   r}   r   r   r   r   r   r   rf   r   r   r   r   r   r   r   r   r   r   r   r   r   rE   rE   rE   rF   r   "   s   -	!
 	1D		
r   )&__doc__r\   rZ   typesr   typingr   r   r   r   Zclient_exceptionsr   r	   Zclient_reqrepr
   Zhelpersr   r   httpr   r   r   r   r   r   Zhttp_websocketr   Zstreamsr   r   Ztypedefsr   r   r   r   r[   r   r   rE   rE   rE   rF   <module>   s    

