o
    m=8j?k                     @   sF  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 d dl	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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+m,Z,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5m6Z6m7Z7 ddl8m9Z9m:Z: ddl;m<Z< ddl=m>Z> ej?dkrd dl	m@Z@ nd dlAm@Z@ ej?dkrd dlmBZB nd dl	mCZC eCeDeEddf ZBej?dkrd dl ZFd dl	mGZG n
d dlFZFd dlAmGZG dZHdZIeeJ eKd< e@deLd ed  d!ZMejNd d d d"G d#d$ d$ZOG d%d& d&e>eeM ZPdS )'    N)CallableIterable)AnyFinalGenericLiteralcastoverload)CIMultiDict   )hdrs)WebSocketDataQueue)AbstractStreamWriter)WSMessageTypeError)DEFAULT_CHUNK_SIZEcalculate_timeout_whenset_exception
set_result)WS_CLOSED_MESSAGEWS_CLOSING_MESSAGEWS_KEYWebSocketErrorWebSocketReaderWebSocketWriterWSCloseCode	WSMessageWSMessageDecodeTextWSMessageNoDecodeText	WSMsgType
ws_ext_genws_ext_parse)_INTERNAL_RECEIVE_TYPES)	ws_logger)	EofStream)JSONBytesEncoderJSONDecoderJSONEncoder)HTTPBadRequestHTTPException)BaseRequest)StreamResponse)      )TypeVarr+      )Buffer)Unionzmemoryview[int]zmemoryview[bytes])r+      )Self)WebSocketResponseWebSocketReadyr      THRESHOLD_CONNLOST_ACCESS_DecodeTextT)bound	covariantdefault)auto_attribsfrozenslotsc                   @   s0   e Zd ZU eed< edB ed< defddZdS )r5   okNprotocolreturnc                 C      | j S N)r?   self rF   U/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/aiohttp/web_ws.py__bool__R      zWebSocketReady.__bool__)__name__
__module____qualname__bool__annotations__strrH   rF   rF   rF   rG   r5   M   s   
 r5   c                       s  e Zd ZU dZeed< dZedB ed< dZe	dB ed< dZ
edB ed< dZeed< dZeed< d	Zeed
< dZedB ed< dZejdB ed< dZeed< dZejd dB ed< dZedB ed< dZeed< dZejdB ed< dZejdB ed< dZejd dB ed< dZ eed< dZ!ej"dB ed< dddddddde#dd
dededB deded edB d!e$e d"ed#ed$ed%ed&df fd'd(Z%dd)d*Z&dd+d,Z'dd-d.Z(dd/d0Z)dd1d2Z*dd3d4Z+dd7d8Z,dd9d:Z-d;ed&dfd<d=Z.dd>d?Z/d@e0d&e1f fdAdBZ2d@e0d&e3dCedB eef fdDdEZ4d@e0d&e3edB e	f fdFdGZ5d@e0dHedB dIe	d&dfdJdKZ6d@e0d&e7fdLdMZ8e9d&efdNdOZ:e9d&efdPdQZ;e9d&edB fdRdSZ<e9d&edB fdTdUZ=e9d&eeB fdVdWZ>ddXedYe?d&e?fdZd[Z@d&edB fd\d]ZAdd_eBd&dfd`daZCdd_eBd&dfdbdcZD	dd_eBddeEd"edB d&dfdedfZFddged"edB d&dfdhdiZGddgeBd"edB d&dfdjdkZH	deIjJdldge?d"edB dmeKd&dfdndoZL	ddge?d"edB dmeMd&dfdpdqZNddrdsZOePjQd^ddtdued_eBdved&efdwdxZRduePd&dfdydzZSduePd&dfd{d|ZTdd}d~ZUeV	ddddedB d&eWfddZXeV	ddddedB d&eYfddZXeV	ddddedB d&eWeYB fddZX	ddedB d&eWeYB fddZXeVdddddedB d&efddZZeVdddddedB d&eBfddZZeVdddddedB d&eeBB fddZZdddedB d&eeBB fddZZdddedB d&eBfddZ[eVdddddde\dedB d&e?fddZ]eVdddddde^eBge?f dedB d&e?fddZ]eVdddddde\e^eBge?f B dedB d&e?fddZ]eIj_ddde\e^eBge?f B dedB d&e?fddZ]dge`d&dfddZad&ebfddZceVddd&eWfddZdeVddd&eYfddZdeVddd&eWeYB fddZdd&eWeYB fddZdd;ed&dfddZe  ZfS )r4   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_task_need_heartbeat_reset_heartbeat_reset_handleg      $@TrF   i  @ )
timeoutreceive_timeout	autocloseautoping	heartbeat	protocolscompressmax_msg_sizewriter_limitdecode_textrb   rc   rd   re   rf   rg   rh   ri   rj   rk   rA   c       
            sl   t  jdd || _|| _|| _|| _|| _|| _|d ur"|d | _|| _	|| _
|	| _|
| _d| _d | _d S )Ne   )statusg       @F)super__init__
_protocols_timeout_receive_timeout
_autoclose	_autoping
_heartbeat_pong_heartbeat	_compress_max_msg_size_writer_limit_decode_textr`   ra   )rE   rb   rc   rd   re   rf   rg   rh   ri   rj   rk   	__class__rF   rG   ro   k   s   

zWebSocketResponse.__init__c                 C   sd   |    | jd ur| j  d | _d| _| jd ur!| j  d | _| jd ur0| j  d | _d S d S NF)_cancel_pong_response_cbra   cancelr`   r]   r_   rD   rF   rF   rG   _cancel_heartbeat   s   






z#WebSocketResponse._cancel_heartbeatc                 C   s"   | j d ur| j   d | _ d S d S rC   )r^   r   rD   rF   rF   rG   r~      s   


z*WebSocketResponse._cancel_pong_response_cbc                 C   s>   | j d u s| jr
d S | j}|d usJ d| _|| j| _d S NT)ru   r`   rX   	call_soon_flush_heartbeat_resetra   )rE   looprF   rF   rG   _on_data_received   s   z#WebSocketResponse._on_data_receivedc                 C   s"   d | _ | jsd S |   d| _d S r}   )ra   r`   _reset_heartbeatrD   rF   rF   rG   r      s
   
z(WebSocketResponse._flush_heartbeat_resetc                 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 )Nr6   )ru   r~   _req	_protocol_timeout_ceil_thresholdrX   timer   r\   r]   call_at_send_heartbeat)rE   reqtimeout_ceil_thresholdr   nowwhenrF   rF   rG   r      s   

z"WebSocketResponse._reset_heartbeatc                 C   s   d | _ | jrd S | j}|d ur| jd usJ | }|| jk r*|| j| j| _ d S | j}|d ur5|j	j
nd}t|| j|}|   ||| j| _| jdtj}tjdkr`tj||dd}n||}| st|| _|| j d S | | d S )Nr6       r.   T)r   eager_start)r]   r`   rX   rR   r   r\   r   r   r   r   r   r   rv   r~   _pong_not_receivedr^   
send_framer   PINGsysversion_infoasyncioTaskcreate_taskdoner_   add_done_callback_ping_task_done)rE   r   r   r   r   r   coro	ping_taskrF   rF   rG   r      s2   


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)	cancelled	exception_handle_ping_pong_exceptionr_   )rE   r   excrF   rF   rG   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)r   	transportr   r   TimeoutErrorrv   rD   rF   rF   rG   r      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   )rT   _set_closed_set_code_close_transportr   ABNORMAL_CLOSUREr[   rY   rU   rS   	feed_datar   r   ERRORrE   r   rF   rF   rG   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)rT   r   rD   rF   rF   rG   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 rC   )_payload_writer
_pre_startrn   prepare_post_startdrain)rE   r   r@   writerpayload_writerr{   rF   rG   r   
  s   
zWebSocketResponse.preparezCIMultiDict[str]c                 C   s  |j }d|tjd  krtd|tj dd|jjs-td|tj	 dd }tj
|v rYdd |tj
 d	D }|D ]}|| jv rN|} nqCtd
|j|| j |tjd}|dvrltd| d|tj}z|r~t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 )N	websocket zNo WebSocket UPGRADE hdr: z$
 Can "Upgrade" only to "WebSocket".)textzNo CONNECTION upgrade hdr: c                 S   s   g | ]}t | qS rF   )rO   strip).0protorF   rF   rG   
<listcomp>*  s    
z0WebSocketResponse._handshake.<locals>.<listcomp>,u<   %s: Client protocols %r don’t overlap server-known ones %r)1387zUnsupported version:    zHandshake error: upgradeFr   T)isserver)rh   r   server_notakeover)$headersgetr   UPGRADElowerr   r'   _messager   
CONNECTIONSEC_WEBSOCKET_PROTOCOLsplitrp   r"   warningremoteSEC_WEBSOCKET_VERSIONSEC_WEBSOCKET_KEYlenbase64	b64decodebinasciiError	b64encodehashlibsha1encoder   digestdecoder
   SEC_WEBSOCKET_ACCEPTrw   SEC_WEBSOCKET_EXTENSIONSr    r   )rE   r   r   r@   req_protocolsr   versionkey
accept_valresponse_headers
notakeoverrh   
extensions
enabledextrF   rF   rG   
_handshake  s   



zWebSocketResponse._handshakec                 C   st   |j | _ | |\}}}}| d | j| |   || _|jj}|d u r+t	dt
|j|||| jd}||fS )Nrl   zConnection lost)rh   r   limit)rX   r   
set_statusr   updateforce_closerw   r   r   ConnectionResetErrorr   ry   )rE   r   r   r@   rh   r   r   r   rF   rF   rG   r   j  s"   
zWebSocketResponse._pre_startr@   r   c                 C   s   || _ || _|   | j}|d usJ t|jt|d| _t| j| j	t
| j| jd}| jd u r1d n| j}|jj||d |jd d S )N)r   )rh   rk   )data_received_cbF)rQ   rR   r   rX   r   r   r   rS   r   rx   rM   rw   rz   ru   r   r@   
set_parser
keep_alive)rE   r   r@   r   r   parsercbrF   rF   rG   r     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)rR   RuntimeErrorr   r(   r5   )rE   r   _r@   rF   rF   rG   can_prepare  s   

zWebSocketResponse.can_preparec                 C   s
   | j d uS rC   )rR   rD   rF   rF   rG   prepared  s   
zWebSocketResponse.preparedc                 C   rB   rC   )rT   rD   rF   rF   rG   closed     zWebSocketResponse.closedc                 C   rB   rC   )rW   rD   rF   rF   rG   
close_code  r   zWebSocketResponse.close_codec                 C   rB   rC   )rQ   rD   rF   rF   rG   ws_protocol  r   zWebSocketResponse.ws_protocolc                 C   rB   rC   )rw   rD   rF   rF   rG   rh     r   zWebSocketResponse.compressnamer;   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)rR   r   get_extra_info)rE   r   r;   r   r   rF   rF   rG   r     s   z WebSocketResponse.get_extra_infoc                 C   rB   rC   )r[   rD   rF   rF   rG   r     rI   zWebSocketResponse.exceptionr   messagec                    .   | j d u r
td| j |tjI d H  d S NCall .prepare() first)rR   r   r   r   r   rE   r   rF   rF   rG   ping  s   
zWebSocketResponse.pingc                    r   r   )rR   r   r   r   PONGr   rF   rF   rG   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   )rR   r   r   )rE   r   r  rh   rF   rF   rG   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-8rh   )
rR   r   
isinstancerO   	TypeErrortyper   r   r   TEXTrE   r  rh   rF   rF   rG   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  )rR   r   r  bytes	bytearray
memoryviewr  r  r   r   BINARYr
  rF   rF   rG   
send_bytes  s   
zWebSocketResponse.send_bytes)dumpsr  c                   s   | j |||dI d H  d S )Nr  )r  rE   r  rh   r  rF   rF   rG   	send_json  s   zWebSocketResponse.send_jsonc                   s   | j |||dI dH  dS )zSend JSON data using a bytes-returning encoder as a binary frame.

        Use this when your JSON encoder (like orjson) returns bytes
        instead of str, avoiding the encode/decode overhead.
        r  N)r  r  rF   rF   rG   send_json_bytes  s   z!WebSocketResponse.send_json_bytesc                    s6   | j rd S | jd u rtd|  I d H  d| _ d S )NzResponse has not been startedT)	_eof_sentr   r   closerD   rF   rF   rG   	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   ) rR   r   rT   r   r  r   r   r   CancelledErrorr   r   r   r   	Exceptionr[   rS   rY   rX   rZ   create_futurer   r   rU   _close_transportasync_timeoutrb   rq   readr  r   CLOSEr  )rE   r  r   r   r   r   readermsgrF   rF   rG   r  	  sh   
zWebSocketResponse.closec                 C   s   d| _ || _|   dS )z6Set the close code and mark the connection as closing.TN)rU   rW   r   rE   r  rF   rF   rG   _set_closing@  s   zWebSocketResponse._set_closingc                 C   s   || _ |   dS )z+Set the close code and close the transport.N)rW   r  r"  rF   rF   rG   r   F  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)r   r   r  rD   rF   rF   rG   r  K  s   z"WebSocketResponse._close_transportrE   z WebSocketResponse[Literal[True]]c                       d S rC   rF   rE   rb   rF   rF   rG   receiveP     zWebSocketResponse.receivez!WebSocketResponse[Literal[False]]c                    r$  rC   rF   r%  rF   rF   rG   r&  U  r'  zWebSocketResponse[_DecodeText]c                    r$  rC   rF   r%  rF   rF   rG   r&  Z  r'  c              
      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 zTd| _z@|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rut| 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 r-| tj |S |j tj&u rB| j'rB| (|j#I d H  q|j tj)u rN| j'rNq|S )	Nr   Tz+Concurrent call to receive() is not allowedr   zWebSocket connection is closed.F)r  )r   )*rS   r   rr   rY   rT   rV   r7   r   rU   r   r  rb   r  rZ   r   r   r   r#   r   OKrW   r  r   r   CLOSEDr   r  r   r  r[   r#  r   r  r!   r  r  rs   CLOSINGr   rt   r  r  )rE   rb   rc   r!  r   rF   rF   rG   r&  _  s   


(
	rb   c                   r$  rC   rF   r%  rF   rF   rG   receive_str  r'  zWebSocketResponse.receive_strc                   r$  rC   rF   r%  rF   rF   rG   r,    r'  c                   r$  rC   rF   r%  rF   rF   rG   r,    r'  c                   sD   |  |I dH }|jtjurtd|j d|jdtt|jS )zrReceive TEXT message.

        Returns str when decode_text=True (default), bytes when decode_text=False.
        NReceived message :z is not WSMsgType.TEXT)r&  r  r   r	  r   r  r   rO   rE   rb   r!  rF   rF   rG   r,    s   c                   sD   |  |I d H }|jtjurt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/  rF   rF   rG   receive_bytes  s   zWebSocketResponse.receive_bytes.)loadsrb   r1  c                   r$  rC   rF   rE   r1  rb   rF   rF   rG   receive_json     zWebSocketResponse.receive_jsonc                   r$  rC   rF   r2  rF   rF   rG   r3    r4  c                   r$  rC   rF   r2  rF   rF   rG   r3    r4  c                   s   | j |dI d H }||S )Nr+  )r,  )rE   r1  rb   r  rF   rF   rG   r3    s   c                    s
   t d)Nz"Cannot call .write() for websocket)r   )rE   r  rF   rF   rG   write  s   zWebSocketResponse.writec                 C   s   | S rC   rF   rD   rF   rF   rG   	__aiter__  s   zWebSocketResponse.__aiter__c                    r$  rC   rF   rD   rF   rF   rG   	__anext__  r'  zWebSocketResponse.__anext__c                    r$  rC   rF   rD   rF   rF   rG   r7    r'  c                    r$  rC   rF   rD   rF   rF   rG   r7    r'  c                    s.   |   I d H }|jtjtjtjfv rt|S rC   )r&  r  r   r  r*  r)  StopAsyncIteration)rE   r!  rF   rF   rG   r7    s
   c                 C   s,   d| _ |   | jd urt| j| d S d S r   )rU   r   rS   r   r   rF   rF   rG   _cancel	  s
   
zWebSocketResponse._cancel)rA   N)r   r   rA   NrC   )r   )grJ   rK   rL   rP   rM   rN   rQ   rO   rR   r   rS   r   rT   rU   rV   intrW   rX   r   AbstractEventLooprY   rZ   Futurer[   BaseExceptionr\   floatr]   TimerHandler^   r_   r   r`   ra   Handler   r   ro   r   r~   r   r   r   r   r   r   r   r   r)   r   r   tupler   r   r   r5   r   propertyr   r   r   r   rh   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,  r0  r%   r3  r   r1  r0   r5  r3   r6  r7  r9  __classcell__rF   rF   r{   rG   r4   V   s  
 	








)



T


	





7

K 

	r4   )Qr   r   r   r   rC  r   collections.abcr   r   typingr   r   r   r   r   r	   attr	multidictr
   r   r   _websocket.readerr   abcr   client_exceptionsr   helpersr   r   r   r   httpr   r   r   r   r   r   r   r   r   r   r   r   r    http_websocketr!   logr"   streamsr#   typedefsr$   r%   r&   web_exceptionsr'   r(   web_requestr)   web_responser*   r   r-   typing_extensionsr0   r1   r  r  r  r3   __all__r7   r:  rN   rM   r8   sr5   r4   rF   rF   rF   rG   <module>   sR   
  <


