o
    m=8jiN                     @   sB  U d Z ddl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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 dd eD Zeee  ed< d
ZdZdZ dZ!ej"Z#ej$Z%dZ&ej'j(Z)ej$j(Z*ej"j(Z+ej,j(Z-ej.j(Z/ej0j(Z1dZ2dZ3dZ4dZ5d
Z6e7j8Z9eZ:G dd dZ;G dd dZ<dS )z0Reader for WebSocket protocol versions 13 and 8.    N)deque)Final   )BaseProtocol)ZLibDecompressor)_EXC_SENTINELset_exception)	EofStream   )UNPACK_CLOSE_CODEUNPACK_LEN3websocket_mask)WS_DEFLATE_TRAILINGWebSocketErrorWSCloseCode	WSMessageWSMessageTextBytes	WSMsgTypec                 C   s   h | ]}t |qS  )int).0ir   r   b/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/aiohttp/_websocket/reader_c.py	<setcomp>   s    r   ALLOWED_CLOSE_CODES      )T    )Fr   c                   @   s   e Zd ZdZdededejddfddZde	fd	d
Z
dedB fddZefdedejddfddZdddZdddZ						d ddZdeeB fddZdeeB fddZdS )!WebSocketDataQueuezmWebSocketDataQueue resumes and pauses an underlying stream.

    It is a destination for WebSocket data.
    protocollimitloopreturnNc                C   sN   d| _ || _|d | _|| _d| _d | _d | _t | _| jj	| _
| jj| _d S )Nr   r   F)_size	_protocol_limit_loop_eof_waiter
_exceptionr   _bufferpopleft_get_bufferappend_put_buffer)selfr    r!   r"   r   r   r   __init__=   s   

zWebSocketDataQueue.__init__c                 C      | j S N)r(   r0   r   r   r   is_eofK      zWebSocketDataQueue.is_eofc                 C   r2   r3   )r*   r4   r   r   r   	exceptionN   r6   zWebSocketDataQueue.exceptionexc	exc_causec                 C   s4   d| _ || _| j }d urd | _t||| d S d S NT)r(   r*   r)   r   )r0   r8   r9   waiterr   r   r   r   Q   s   z WebSocketDataQueue.set_exceptionc                 C   s2   | j  }d u r	d S d | _ | s|d  d S d S r3   )r)   done
set_result)r0   r;   r   r   r   _release_waiter\   s   z"WebSocketDataQueue._release_waiterc                 C   s   d| _ |   d | _d S r:   )r(   r>   r*   r4   r   r   r   feed_eofc   s   
zWebSocketDataQueue.feed_eofdataWSMessage | WSMessageTextBytessize
cython_intc                 C   sN   |  j |7  _ | ||f |   | j | jkr#| jjs%| j  d S d S d S r3   )r$   r/   r>   r&   r%   _reading_pausedpause_readingr0   r@   rB   r   r   r   	feed_datah   s   zWebSocketDataQueue.feed_datac              	      sb   | j s-| js-| jrJ | j | _z| jI d H  W |  S  tjtjfy,   d | _ w |  S r3   )	r+   r(   r)   r'   create_futureasyncioCancelledErrorTimeoutError_read_from_bufferr4   r   r   r   readq   s   
zWebSocketDataQueue.readc                 C   sV   | j r!|  \}}|  j|8  _| j| jk r| jjr| j  |S | jd ur)| jtr3   )	r+   r-   r$   r&   r%   rD   resume_readingr*   r	   rF   r   r   r   rL   |   s   

z$WebSocketDataQueue._read_from_bufferr#   N)r@   rA   rB   rC   r#   N)__name__
__module____qualname____doc__r   r   rI   AbstractEventLoopr1   boolr5   BaseExceptionr7   r   builtinsr   r>   r?   rG   r   r   rM   rL   r   r   r   r   r   7   s@    




	r   c                   @   s   e Zd Z		ddededededdf
dd	Zdd
dZdee	B e
B deeef fddZdedeeB dee	B deeB ddf
ddZdeddfddZdS )WebSocketReaderTqueuemax_msg_sizecompressdecode_textr#   Nc                 C   sx   || _ || _|| _d | _t | _t| _t| _	d| _
t| _g | _d| _d| _d| _d | _d| _d| _t| _d | _|| _d S )NFr   r   )rY   _max_msg_size_decode_text_exc	bytearray_partialREAD_HEADER_stateOP_CODE_NOT_SET_opcode
_frame_fin_frame_opcode_payload_fragments_frame_payload_len_tail	_has_mask_frame_mask_payload_bytes_to_read_payload_len_flagCOMPRESSED_NOT_SET_compressed_decompressobj	_compress)r0   rY   rZ   r[   r\   r   r   r   r1      s&   
zWebSocketReader.__init__c                 C   s   | j   d S r3   )rY   r?   r4   r   r   r   r?      s   zWebSocketReader.feed_eofr@   c              
   C   sr   t |tur
t|}| jd urd|fS z| | W tS  ty8 } z|| _t| j| tW  Y d }~S d }~ww r:   )	typebytesr_   
_feed_data	Exceptionr   rY   EMPTY_FRAME_ERROREMPTY_FRAME)r0   r@   r8   r   r   r   rG      s   
zWebSocketReader.feed_datafinopcodepayload
compressedc              
   C   s0  |t tthv r|tkr| jtkrttjd|s(|tkr|| _|  j|7  _d S t	| j}|tkr8| j}t| _n|rCttjd||rP| j| }| j
  n|}|r| js]tdd| _| j|t | jrk| jd n| j}| jrt|| jkrttjd| j nt|tu r|}nt|}|t kr| jrz|d}W n ty }	 zttjd|	d }	~	ww | jttt|d	ft| d S | jttt|d	ft| d S | jttt|d	ft| d S |tkr]t|d
kr9t |d d
 d }
|
dk r|
t!vrttjd|
 z|d
d  d}W n ty. }	 zttjd|	d }	~	ww ttt"j#|
|f}n|rKttjd| d| d|ttt"j#dd	f}| j|d d S |t$krvttt"j%|d	f}| j|t| d S |t&krttt"j'|d	f}| j|t| d S ttjd|)Nz*Continuation frame for non started messagez8The opcode in non-fin frame is expected to be zero, got T)suppress_deflate_headerr
   z(Decompressed message exceeds size limit zutf-8zInvalid UTF-8 text message r   r   i  zInvalid close code: zInvalid close frame:  Unexpected opcode=)(OP_CODE_TEXTOP_CODE_BINARYOP_CODE_CONTINUATIONre   rd   r   r   PROTOCOL_ERRORra   rU   clearrq   r   decompress_syncr   r]   lenMESSAGE_TOO_BIGrs   rt   r^   decodeUnicodeDecodeErrorINVALID_TEXTrY   rG   	TUPLE_NEWr   WS_MSG_TYPE_TEXTr   WS_MSG_TYPE_BINARYOP_CODE_CLOSEr   r   r   CLOSEOP_CODE_PINGPINGOP_CODE_PONGPONG)r0   ry   rz   r{   r|   has_partialassembled_payloadpayload_mergedtextr8   
close_codeclose_messagemsgr   r   r   _handle_frame   s   


	



zWebSocketReader._handle_framec                 C   s@  | j r| j | d}| _ d}t|}|}	 | jtkr|| dk r"n|| }||d  }|d7 }|d? d@ }|d? d@ }|d? d@ }	|d	? d@ }
|d
@ }|	sU|
sU|r[| js[ttjd|tt	t
ttthvrnttjd||dkr||dkr|ttjd|d? d@ }|d@ }|dkr|dkrttjd| js| jtkr|rtnt| _n|rttjdt|| _|| _t|| _|| _t| _| jtkr8| j}|dkr|| dk rԐn9|| }||d  }|d7 }|d> |B | _n|dkr|| dk rnt||d | _|d7 }n|| _| jr/| jt	t
thv r/| jt| j }|| jkr/ttjd| d| j | jr5tnt| _| jtkrV|| d	k rFn|||d	  | _|d	7 }t| _| jtkr|| }| j|krp|}|  j|8  _n|| j }d| _| j }|  j || 7  _ |}|}| jdkr| j!"|||  nt|r| j!"|||  | jr| jdusJ t#d$| j!}t%| j| |}nd$| j!}| j!&  n,| jr| jdusJ ||| }t'|t#urt#|}t%| j| |}n||| }| (| j| j|| j d| _ t| _q||k r||| | _ dS d| _ dS )z&Return the next frame from the socket.r   r   Tr   r
            r      z*Received frame with non-zero reserved bitsr   z!Received fragmented control frame   }   z5Control frame payload cannot be larger than 125 bytes~      zMessage size z exceeds limit N))rj   r   rc   rb   rr   r   r   r   r   r   r   r   r   r   rf   rp   ro   COMPRESSED_TRUECOMPRESSED_FALSErU   rg   rk   rn   READ_PAYLOAD_LENGTHrm   r   r]   ra   r   READ_PAYLOAD_MASKREAD_PAYLOADrl   ri   rh   r.   r`   joinr   r   rs   r   )r0   r@   	start_posdata_len	data_cstr
first_bytesecond_bytery   rsv1rsv2rsv3rz   has_masklengthlen_flagprojected_size	chunk_len	f_end_poshad_fragmentsf_start_pospayload_bytearrayr{   r   r   r   ru   F  s
  





  &/zWebSocketReader._feed_data)TTrO   )rP   rQ   rR   r   r   rU   r1   r?   rt   r`   
memoryviewtuplerG   rC   r   ru   r   r   r   r   rX      s:    

"
 
rX   )=rS   rI   rW   collectionsr   typingr   base_protocolr   compression_utilsr   helpersr   r   streamsr	   r   r   r   modelsr   r   r   r   r   r   r   setr   __annotations__rb   r   r   r   BINARYr   TEXTr   rd   CONTINUATIONvaluer   r   r   r   r   r   r   r   r   rw   rx   ro   r   r   r   __new__r   rC   r   rX   r   r   r   r   <module>   sD     	Q