o
    Ð­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mZ zdd	lmZ W n eyK   dd	lmZ Y nw G d
d„ de	ƒZddd„Zd dd„ZeZddlmZ d!dd„Zd"dd„ZdS )#é    )ÚannotationsN)Ú	AwaitableÚSequence)ÚAnyÚCallableÚ
NamedTupleé   )Ú
extensionsÚframes)ÚPayloadTooBigÚProtocolError)Ú	BytesLikeÚDataLike)Ú
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„ƒZd&dd„Z	d'dd„Z
edddœd(dd„ƒZdd œd)d#d$„ZdS )*ÚFrameÚboolÚfinzframes.OpcodeÚopcoder   ÚdataFÚrsv1Úrsv2Úrsv3Úreturnúframes.Framec                 C  s    t  | j| j| j| j| j| j¡S ©N)r
   r   r   r   r   r   r   r   ©Úself© r   úV/var/www/html/CropPilot/venv/lib/python3.10/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__%   ó   
zFrame.__str__ÚNonec                 C  s
   | j  ¡ S r   )r   Úcheckr   r   r   r   r$   (   r"   zFrame.checkN)Úmax_sizer	   Úreaderú!Callable[[int], Awaitable[bytes]]Úmaskr%   ú
int | Noner	   ú%Sequence[extensions.Extension] | Nonec             
   Ã  s®  �|dƒI dH }t  d|¡\}}|d@ rdnd}|d@ rdnd}	|d@ r&dnd}
|d	@ r.dnd}z	t |d
@ ¡}W n tyJ } ztdƒ|‚d}~ww |d@ rQdnd|krYtdƒ‚|d@ }|dkrp|dƒI dH }t  d|¡\}n|dkr‚|dƒI dH }t  d|¡\}|dur�||kr�t||ƒ‚|r˜|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   Úhead1Úhead2r   r   r   r   r   ÚexcÚlengthÚ	mask_bitsr   Ú	extensionr   r   r   Úread+   sV   €
€ÿ

úz
Frame.read)r	   ÚwriteúCallable[[bytes], Any]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   rB   r(   r	   r   r   r   rB   z   s   zFrame.write)r   r   )r   r    )r   r#   )
r&   r'   r(   r   r%   r)   r	   r*   r   r   )rB   rC   r(   r   r	   r*   r   r#   )Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r   r   r   Úpropertyr   r!   r$   ÚclassmethodrA   rB   r   r   r   r   r      s"   
 


úSûr   r   r   r   útuple[int, BytesLike]c                 C  s8   t | tƒrtjj|  ¡ fS t | tƒrtjj| fS tdƒ‚)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-like)	Ú
isinstancer    r
   r6   ÚTEXTÚencoder   ÚBINARYÚ	TypeError©r   r   r   r   Úprepare_data•   s
   

rS   Úbytesc                 C  s,   t | tƒr	|  ¡ S t | tƒrt| ƒS tdƒ‚)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.

    rL   )rM   r    rO   r   rT   rQ   rR   r   r   r   Úprepare_ctrl­   s
   

rU   )ÚCloseú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.

    )rV   ÚparseÚcodeÚreason)r   Úcloser   r   r   Úparse_closeË   s   
r\   rY   ÚintrZ   r    c                 C  s   t | |ƒ ¡ S )z3
    Serialize the payload for a close frame.

    )rV   rD   )rY   rZ   r   r   r   Úserialize_closeÛ   s   r^   )r   r   r   rK   )r   r   r   rT   )r   rT   r   rW   )rY   r]   rZ   r    r   rT   )Ú
__future__r   r4   Úcollections.abcr   r   Útypingr   r   r   Ú r	   r
   Ú
exceptionsr   r   r   r   Úspeedupsr   ÚImportErrorÚutilsr   rS   rU   Úencode_datarV   r\   r^   r   r   r   r   Ú<module>   s(    ÿ 


