o
    m=8j                  	   @   s  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mZ ddl	m
Z
 dd	lmZ ed
jZedjZedjZedjZedjZedjZedjZdZee ed< dZee ed< dZee ed< ejdee fddZdede ddfddZ!ese
re!Z"nz
ddl#m$Z$ e$Z"W n e%y   e!Z"Y nw e&dZ'eee(  ed< e&d Z)eee(  ed!< d,d#e(dB d$e*de+ee*f fd%d&Z,	"d-d(ed$e*d)e*de(fd*d+Z-dS ).z1Helpers for WebSocket protocol versions 13 and 8.    N)Pattern)Struct)TYPE_CHECKINGFinal   )NO_EXTENSIONS   )WSHandshakeErrorz!Qz!Hz!BBz!BBHz!BBQz!Li @  MSG_SIZE   MASK_LENs$   258EAFA5-E914-47DA-95CA-C5AB0DC85B11WS_KEYreturnc                   C   s   dd t dD S )Nc                    s&   g | ] t  fd dtdD qS )c                 3   s    | ]}| A V  qd S N ).0abr   a/home/nk/hobo-godmode/plappi-mvp/.venv/lib/python3.10/site-packages/aiohttp/_websocket/helpers.py	<genexpr>       z(_xor_table.<locals>.<listcomp>.<genexpr>   )bytesrange)r   r   r   r   
<listcomp>   s   & z_xor_table.<locals>.<listcomp>r   )r   r   r   r   r   
_xor_table   s   r   maskdatac                    s   t |ts	J |t| dksJ | |rct   fdd| D \}}}}|ddd ||ddd< |ddd ||ddd< |ddd ||ddd< |ddd ||ddd< dS dS )aw  Websocket masking function.

    `mask` is a `bytes` object of length 4; `data` is a `bytearray`
    object of any length. The contents of `data` are masked with `mask`,
    as specified in section 5.3 of RFC 6455.

    Note that this function mutates the `data` argument.

    This pure-python implementation may be replaced by an optimized
    version when available.

    r   c                 3   s    | ]} | V  qd S r   r   )r   n
_XOR_TABLEr   r   r   1   r   z)_websocket_mask_python.<locals>.<genexpr>Nr   r      )
isinstance	bytearraylenr   	translate)r   r   r   r   cdr   r    r   _websocket_mask_python   s   "r)   )_websocket_mask_cythonz^(?:;\s*(?:(server_no_context_takeover)|(client_no_context_takeover)|(server_max_window_bits(?:=(\d+))?)|(client_max_window_bits(?:=(\d+))?)))*$
_WS_EXT_REzpermessage-deflate([^,]+)?_WS_EXT_RE_SPLITFextstrisserverc                 C   s   | sdS d}d}t | D ]m}|d}|sd} ||fS t|}|rod}|rK|dr?t|d}|dks<|dk r?d}q|drFd} ||fS |d	rct|d	}|dks_|dk rctd
|drjd} ||fS |sztd|d q||fS )N)r   Fr   Fr      r   	   T   zInvalid window sizer   z#Extension for deflate not supported)r,   finditergroupr+   matchintr	   )r-   r.   compress
notakeoverextdefextr4   r   r   r   ws_ext_parseN   sF   
%




r:   r/   r6   server_notakeoverc                 C   s^   | dk s| dkrt ddg}|s|d | dk r#|dt|   |r*|d d|S )	Nr0   r/   zCCompress wbits must between 9 and 15, zlib does not support wbits=8zpermessage-deflateclient_max_window_bitszserver_max_window_bits=server_no_context_takeoverz; )
ValueErrorappendstrjoin)r6   r.   r;   
enabledextr   r   r   
ws_ext_gen   s   


rC   )F)r/   FF).__doc__	functoolsrer   structr   typingr   r   helpersr   modelsr	   unpack_fromUNPACK_LEN3unpackUNPACK_CLOSE_CODEpack	PACK_LEN1	PACK_LEN2	PACK_LEN3PACK_CLOSE_CODEPACK_RANDBITSr
   r5   __annotations__r   r   r   	lru_cachelistr   r$   r)   websocket_maskr   r*   ImportErrorcompiler+   r@   r,   booltupler:   rC   r   r   r   r   <module>   sX    






$4