a
    ñ»j¿  ã                   @  s  d dl mZ d dlZd dlmZmZ d dlmZmZm	Z	 ddl
mZmZ ddlmZmZ ddlmZ dd	lmZ zdd
lmZ W n eyž   dd
lmZ Y n0 G dd„ de	ƒZdddœdd„Zdddœdd„ZeZddlmZ dddœdd„Zddddœdd„ZdS )é    )ÚannotationsN)Ú	AwaitableÚSequence)ÚAnyÚCallableÚ
NamedTupleé   )Ú
extensionsÚframes)ÚPayloadTooBigÚProtocolError)Ú	BytesLike)ÚData)Ú
apply_maskc                   @  s´   e Zd ZU ded< ded< ded< dZded< dZded	< dZded
< eddœdd„ƒZddœ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 d!„ZdS )"ÚFrameÚboolÚfinzframes.OpcodeÚopcodeÚbytesÚdataFÚrsv1Úrsv2Úrsv3zframes.Frame)Úreturnc                 C  s    t  | j| j| j| j| j| j¡S ©N)r
   r   r   r   r   r   r   r   ©Úself© r   ú?E:\soccer\ml_env\Lib\site-packages\websockets/legacy/framing.pyÚ	new_frame   s    úzFrame.new_frameÚstrc                 C  s
   t | jƒS r   )r    r   r   r   r   r   Ú__str__&   s    zFrame.__str__ÚNonec                 C  s
   | j  ¡ S r   )r   Úcheckr   r   r   r   r#   )   s    zFrame.checkN)Úmax_sizer	   z!Callable[[int], Awaitable[bytes]]z
int | Nonez%Sequence[extensions.Extension] | None)ÚreaderÚmaskr$   r	   r   c             
   Ã  sÆ  |dƒI 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ƒI dH }t  d|¡\}n&|dk�r|dƒI dH }t  d|¡\}|du�r.||k�r.t||ƒ‚|�rB|dƒI dH }||ƒI dH }|�r`t||ƒ}t ||||	|
|¡}|du �r‚g }t	|ƒD ]}|j
||d�}�qŠ| ¡  | |j|j|j|j|j|jƒS )a@  
        Read a WebSocket frame.

        Args:
            reader: Coroutine that reads exactly the requested number of
                bytes, unless the end of file is reached.
            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:
            PayloadTooBig: If the frame exceeds ``max_size``.
            ProtocolError: If the frame contains incorrect values.

        r   Nz!BBé€   TFé@   é    é   é   zinvalid opcodezincorrect maskingé   é~   z!Hé   z!Qé   )r$   )ÚstructÚunpackr
   ÚOpcodeÚ
ValueErrorr   r   r   r   ÚreversedÚdecoder#   r   r   r   r   r   r   )Úclsr%   r&   r$   r	   r   Zhead1Zhead2r   r   r   r   r   ÚexcÚlengthZ	mask_bitsr   Ú	extensionr   r   r   Úread,   sP     



úz
Frame.read)r	   zCallable[[bytes], Any])Úwriter&   r	   r   c                C  s   || j j||d�ƒ dS )a–  
        Write a WebSocket frame.

        Args:
            frame: Frame to write.
            write: Function that writes bytes.
            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.

        )r&   r	   N)r   Ú	serialize)r   r;   r&   r	   r   r   r   r;   {   s    zFrame.write)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r   Úpropertyr   r!   r#   Úclassmethodr:   r;   r   r   r   r   r      s    

úSûr   r   ztuple[int, bytes])r   r   c                 C  s<   t | tƒrtjj|  ¡ fS t | tƒr0tjj| fS tdƒ‚dS )až  
    Convert a string or byte-like object to an opcode and a bytes-like object.

    This function is designed for data frames.

    If ``data`` is a :class:`str`, return ``OP_TEXT`` and a :class:`bytes`
    object encoding ``data`` in UTF-8.

    If ``data`` is a bytes-like object, return ``OP_BINARY`` and a bytes-like
    object.

    Raises:
        TypeError: If ``data`` doesn't have a supported type.

    údata must be str or bytes-likeN)	Ú
isinstancer    r
   r2   ZTEXTÚencoder   ÚBINARYÚ	TypeError©r   r   r   r   Úprepare_data–   s
    

rI   r   c                 C  s0   t | tƒr|  ¡ S t | tƒr$t| ƒS tdƒ‚dS )ai  
    Convert a string or byte-like object to bytes.

    This function is designed for ping and pong frames.

    If ``data`` is a :class:`str`, return a :class:`bytes` object encoding
    ``data`` in UTF-8.

    If ``data`` is a bytes-like object, return a :class:`bytes` object.

    Raises:
        TypeError: If ``data`` doesn't have a supported type.

    rC   N)rD   r    rE   r   r   rG   rH   r   r   r   Úprepare_ctrl®   s
    

rJ   )ÚCloseztuple[int, str]c                 C  s   t  | ¡}|j|jfS )zÕ
    Parse the payload from a close frame.

    Returns:
        Close code and reason.

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

    )rK   ÚparseÚcodeÚreason)r   Úcloser   r   r   Úparse_closeÌ   s    
rP   Úintr    )rM   rN   r   c                 C  s   t | |ƒ ¡ S )z3
    Serialize the payload for a close frame.

    )rK   r<   )rM   rN   r   r   r   Úserialize_closeÜ   s    rR   )Ú
__future__r   r0   Úcollections.abcr   r   Útypingr   r   r   Ú r	   r
   Ú
exceptionsr   r   r   r   Zspeedupsr   ÚImportErrorÚutilsr   rI   rJ   Zencode_datarK   rP   rR   r   r   r   r   Ú<module>   s&    