a
    ñ»j…3  ã                   @  sî  U d dl mZ 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 ddlmZmZ zddlmZ W n eyœ   ddlmZ Y n0 g d¢ZG d	d
„ d
ejƒZejZejZejZejZej Z!ej"Z#eeefZ$ee!e#fZ%G dd„ dejƒZ&e&j'de&j(de&j)de&j*de&j+de&j,de&j-de&j.de&j/de&j0de&j1de&j2de&j3de&j4de&j5diZ6de7d< e&j'e&j(e&j)e&j*e&j-e&j.e&j/e&j0e&j1e&j2e&j3e&j4hZ8e&j'e&j(e&j+hZ9e:e;e<fZ=ej>G dd„ dƒƒZ?ej>G d d!„ d!ƒƒZ@dd"lAmBZB dS )#é    )ÚannotationsN)Ú	GeneratorÚSequence)ÚCallableÚUnioné   )ÚPayloadTooBigÚProtocolError)Ú
apply_mask)ÚOpcodeÚOP_CONTÚOP_TEXTÚ	OP_BINARYÚOP_CLOSEÚOP_PINGÚOP_PONGÚDATA_OPCODESÚCTRL_OPCODESÚ	CloseCodeÚFrameÚClosec                   @  s$   e Zd ZdZd\ZZZd\ZZZ	dS )r   z#Opcode values for WebSocket frames.)r   r   é   )é   é	   é
   N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚCONTÚTEXTÚBINARYÚCLOSEÚPINGÚPONG© r%   r%   ú7E:\soccer\ml_env\Lib\site-packages\websockets/frames.pyr   %   s   
r   c                   @  sL   e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )r   z-Close code values for WebSocket close frames.iè  ié  iê  ië  ií  iî  iï  ið  iñ  iò  ió  iô  iõ  iö  i÷  N)r   r   r   r   ÚNORMAL_CLOSUREÚ
GOING_AWAYÚPROTOCOL_ERRORÚUNSUPPORTED_DATAÚNO_STATUS_RCVDÚABNORMAL_CLOSUREÚINVALID_DATAÚPOLICY_VIOLATIONÚMESSAGE_TOO_BIGÚMANDATORY_EXTENSIONÚINTERNAL_ERRORÚSERVICE_RESTARTÚTRY_AGAIN_LATERÚBAD_GATEWAYÚTLS_HANDSHAKEr%   r%   r%   r&   r   7   s    r   ÚOKz
going awayzprotocol errorzunsupported datazno status received [internal]zabnormal closure [internal]zinvalid frame payload datazpolicy violationzmessage too bigzmandatory extensionzinternal errorzservice restartztry again laterzbad gatewayz TLS handshake failure [internal]zdict[int, str]ÚCLOSE_CODE_EXPLANATIONSc                   @  sº   e Zd ZU dZded< ded< dZded< d	Zded
< d	Zded< d	Zded< e	e
j dd¡ƒZddœdd„Zedddœddddddœdd„ƒZddœddddœdd „Zd!dœd"d#„ZdS )$r   aN  
    WebSocket frame.

    Attributes:
        opcode: Opcode.
        data: Payload data.
        fin: FIN bit.
        rsv1: RSV1 bit.
        rsv2: RSV2 bit.
        rsv3: RSV3 bit.

    Only these fields are needed. The MASK bit, payload length and masking-key
    are handled on the fly when parsing and serializing frames.

    r   Úopcodez#Union[bytes, bytearray, memoryview]ÚdataTÚboolÚfinFÚrsv1Úrsv2Úrsv3ZWEBSOCKETS_MAX_LOG_SIZEZ75Ústr©Úreturnc              
   C  s   d}t | jƒ› dt | jƒdkr"dnd› �}| jr4dnd}| jtu rXtt| jƒ ¡ ƒ}�n8| jtu rÈ| j}t |ƒ| j	d kr²| j	d d d }d 
|dd	| … d
|| d… g¡}d 
dd„ |D ƒ¡}nÈ| jtu rätt | j¡ƒ}n¬| j�rŒztt| jƒ ¡ ƒ}d}W n‚ ttf�yˆ   | j}t |ƒ| j	d k�rl| j	d d d }d 
|dd	| … d
|| d… g¡}d 
dd„ |D ƒ¡}d}Y n0 nd}t |ƒ| j	k�rÐ| j	d d }|dd	| … d || d…  }d 
td|||gƒ¡}| jj› d|› d|› d�S )zE
        Return a human-readable representation of a frame.

        Nz byter   Ú ÚsÚ	continuedé   ó    r   s     ú c                 s  s   | ]}|d ›V  qdS ©Ú02xNr%   ©Ú.0Úbyter%   r%   r&   Ú	<genexpr>¬   rF   z Frame.__str__.<locals>.<genexpr>Útextc                 s  s   | ]}|d ›V  qdS rH   r%   rJ   r%   r%   r&   rM   ½   rF   Úbinaryz''z...z, z [ú])Úlenr9   r;   r8   r   ÚreprÚbytesÚdecoder   ÚMAX_LOG_SIZEÚjoinr   r?   r   ÚparseÚUnicodeDecodeErrorÚAttributeErrorÚfilterÚname)ÚselfZcodingÚlengthZ	non_finalr9   rO   ÚcutÚmetadatar%   r%   r&   Ú__str__˜   s<    &

&
&"zFrame.__str__N)Úmax_sizeÚ
extensionsz-Callable[[int], Generator[None, None, bytes]]z
int | Nonez%Sequence[extensions.Extension] | NonezGenerator[None, None, Frame])Ú
read_exactÚmaskra   rb   rA   c             
   c  s¨  |dƒE dH }t  d|¡\}}|d@ r*dnd}|d@ r:dnd}	|d@ rJdnd}
|d	@ rZdnd}zt|d
@ ƒ}W n. tyœ } ztdƒ|‚W Y d}~n
d}~0 0 |d@ rªdnd|krºtdƒ‚|d@ }|dkrè|dƒE dH }t  d|¡\}n&|dk�r|dƒE dH }t  d|¡\}|du�r,||k�r,t||ƒ‚|�r@|dƒE dH }||ƒE dH }|�r^t||ƒ}| ||||	|
|ƒ}|du �r~g }t|ƒD ]}|j||d�}�q†| 	¡  |S )aá  
        Parse a WebSocket frame.

        This is a generator-based coroutine.

        Args:
            read_exact: Generator-based coroutine that reads the requested
                bytes or raises an exception if there isn't enough data.
            mask: Whether the frame should be masked i.e. whether the read
                happens on the server side.
            max_size: Maximum payload size in bytes.
            extensions: List of extensions, applied in reverse order.

        Raises:
            EOFError: If the connection is closed without a full WebSocket frame.
            PayloadTooBig: If the frame's payload size exceeds ``max_size``.
            ProtocolError: If the frame contains incorrect values.

        r   Nú!BBé€   TFé@   é    é   é   zinvalid opcodezincorrect maskingé   é~   ú!Hr   z!Qé   )ra   )
ÚstructÚunpackr   Ú
ValueErrorr	   r   r
   ÚreversedrT   Úcheck)Úclsrc   rd   ra   rb   r9   Úhead1Úhead2r;   r<   r=   r>   r8   Úexcr]   Ú
mask_bytesÚframeÚ	extensionr%   r%   r&   rW   Ê   sB     



zFrame.parse©rb   rS   )rd   rb   rA   c          
      C  s(  |   ¡  |du rg }|D ]}| | ¡} qt ¡ }| jr:dnd| jrFdndB | jrTdndB | jrbdndB | jB }|rvdnd}t	| j
ƒ}|dk r¦| t d|||B ¡¡ n>|d	k rÊ| t d
||dB |¡¡ n| t d||dB |¡¡ |rüt d¡}| |¡ |�rt| j
|ƒ}	n| j
}	| |	¡ | ¡ S )aH  
        Serialize a WebSocket frame.

        Args:
            mask: Whether the frame should be masked i.e. whether the write
                happens on the client side.
            extensions: List of extensions, applied in order.

        Raises:
            ProtocolError: If the frame contains incorrect values.

        Nrf   r   rg   rh   ri   rl   re   i   z!BBHz!BBQrk   rn   )rs   ÚencodeÚioÚBytesIOr;   r<   r=   r>   r8   rQ   r9   Úwritero   ÚpackÚsecretsZtoken_bytesr
   Úgetvalue)
r\   rd   rb   rz   Úoutputru   rv   r]   rx   r9   r%   r%   r&   Ú	serialize  s>    ÿþýüÿ



zFrame.serializeÚNonec                 C  sL   | j s| js| jrtdƒ‚| jtv rHt| jƒdkr:tdƒ‚| jsHtdƒ‚dS )z¦
        Check that reserved bits and opcode have acceptable values.

        Raises:
            ProtocolError: If a reserved bit or the opcode is invalid.

        zreserved bits must be 0é}   zcontrol frame too longzfragmented control frameN)	r<   r=   r>   r	   r8   r   rQ   r9   r;   ©r\   r%   r%   r&   rs   O  s    
zFrame.check)r   r   r   r   Ú__annotations__r;   r<   r=   r>   ÚintÚosÚenvironÚgetrU   r`   ÚclassmethodrW   r„   rs   r%   r%   r%   r&   r   |   s    
2úMü;r   c                   @  s`   e Zd ZU dZded< ded< ddœdd„Zed	d d
œdd„ƒZd	dœdd„Zddœdd„Z	dS )r   z
    Code and reason for WebSocket close frames.

    Attributes:
        code: Close code.
        reason: Close reason.

    r‰   Úcoder?   Úreasonr@   c                 C  sz   d| j   krdk r n nd}n.d| j   kr6dk r@n nd}nt | j d¡}| j › d|› d�}| jrv|› d	| j› �}|S )
zU
        Return a human-readable representation of a close code and reason.

        é¸  i   Ú
registeredéˆ  zprivate useÚunknownz (ú)rG   )rŽ   r7   rŒ   r�   )r\   ZexplanationÚresultr%   r%   r&   r`   o  s    zClose.__str__rS   )r9   rA   c                 C  sl   t |ƒdkrHt d|dd… ¡\}|dd…  ¡ }| ||ƒ}| ¡  |S t |ƒdkr`| tjdƒS tdƒ‚dS )z÷
        Parse the payload of a close frame.

        Args:
            data: Payload of the close frame.

        Raises:
            ProtocolError: If data is ill-formed.
            UnicodeDecodeError: If the reason isn't valid UTF-8.

        r   rm   Nr   rB   zclose frame too short)rQ   ro   rp   rT   rs   r   r+   r	   )rt   r9   rŽ   r�   Úcloser%   r%   r&   rW   �  s    
zClose.parsec                 C  s    |   ¡  t d| j¡| j ¡  S )z:
        Serialize the payload of a close frame.

        rm   )rs   ro   r€   rŽ   r�   r|   r‡   r%   r%   r&   r„   ™  s    zClose.serializer…   c                 C  s.   | j tv s*d| j   kr dk s*n tdƒ‚dS )z›
        Check that the close code has a valid value for a close frame.

        Raises:
            ProtocolError: If the close code is invalid.

        r�   r’   zinvalid status codeN)rŽ   ÚEXTERNAL_CLOSE_CODESr	   r‡   r%   r%   r&   rs   ¡  s    "zClose.checkN)
r   r   r   r   rˆ   r`   r�   rW   r„   rs   r%   r%   r%   r&   r   a  s   
	r   r{   )CÚ
__future__r   ÚdataclassesÚenumr}   rŠ   r�   ro   Úcollections.abcr   r   Útypingr   r   Ú
exceptionsr   r	   Zspeedupsr
   ÚImportErrorÚutilsÚ__all__ÚIntEnumr   r   r   r    r   r!   r   r"   r   r#   r   r$   r   r   r   r   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r7   rˆ   r—   ZOK_CLOSE_CODESrS   Ú	bytearrayÚ
memoryviewZ	BytesLikeÚ	dataclassr   r   rB   rb   r%   r%   r%   r&   Ú<module>   s€   

ñôý
 eL