o
    [h                     @  s   d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	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yG   ddlmZ Y nw G dd	 d	eZdd
lmZmZmZ dddZdddZdS )    )annotationsN)Any	AwaitableCallable
NamedTupleOptionalSequenceTuple   )
extensionsframes)PayloadTooBigProtocolError)
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opcodebytes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   /home/ubuntu/experiments/live_experiments/Pythonexperiments/Otree/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&   Optional[int]r   (Optional[Sequence[extensions.Extension]]c             
     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rtd| d| d|r|dI dH }||I dH }|rt||}t||||	|
|}|du rg }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!Qzover size limit (z > z bytes)   )r&   )structunpackr   Z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+   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   r?   r)   r   r   r   r   r?   z   s   zFrame.write)r   r   )r   r!   )r   r$   )
r'   r(   r)   r   r&   r*   r   r+   r   r   )r?   r@   r)   r   r   r+   r   r$   )__name__
__module____qualname____annotations__r   r   r   propertyr    r"   r%   classmethodr>   r?   r   r   r   r   r      s"   
 


Sr   )Closeprepare_ctrlprepare_datar   r   r   Tuple[int, str]c                 C  s   t t| S )z
    Parse the payload from a close frame.

    Returns:
        Tuple[int, str]: close code and reason.

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

    )dataclassesastuplerH   parse)r   r   r   r   parse_close   s   rO   codeintreasonr!   c                 C  s   t | | S )z3
    Serialize the payload for a close frame.

    )rH   rA   )rP   rR   r   r   r   serialize_close   s   rS   )r   r   r   rK   )rP   rQ   rR   r!   r   r   )
__future__r   rL   r5   typingr   r   r   r   r   r   r	    r   r   
exceptionsr   r   Zspeedupsr   ImportErrorutilsr   rH   rI   Zencode_datarJ   rO   rS   r   r   r   r   <module>   s     $ 
