B
    ]b                 @  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 yddlmZ W n  ek
r   ddlmZ Y nX G dd	 d	eZdd
lmZmZmZ dddddZddd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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   8lib/python3.7/site-packages/websockets/legacy/framing.py	new_frame   s    zFrame.new_framestrc             C  s
   t | jS )N)r   r   )r   r   r   r   __str__%   s    zFrame.__str__Nonec             C  s
   | j  S )N)r   check)r   r   r   r   r!   (   s    zFrame.checkN)max_sizer   z!Callable[[int], Awaitable[bytes]]zOptional[int]z(Optional[Sequence[extensions.Extension]])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}yt|d
@ }W n, tk
r } ztd|W dd}~X Y nX |d@ rdnd|krtd|d@ }|dkr|dI dH }t d|\}n&|dkr|dI dH }t d|\}|dk	r8||kr8td| d| d|rL|dI dH }||I dH }|rjt||}t||||	|
|}|dkrg }x t	|D ]}|j
||d}qW |  | |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"   )structZ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+   sN    


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   r7   r$   r   r   r   r   r7   z   s    zFrame.write)__name__
__module____qualname____annotations__r   r   r   propertyr   r   r!   classmethodr6   r7   r   r   r   r   r      s   
Mr   )Closeprepare_ctrlprepare_datar   zTuple[int, str])r   r   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.

    )dataclassesZastupler?   parse)r   r   r   r   parse_close   s    rD   intr   )codereasonr   c             C  s   t | | S )z3
    Serialize the payload for a close frame.

    )r?   r8   )rF   rG   r   r   r   serialize_close   s    rH   )Z
__future__r   rB   r.   typingr   r   r   r   r   r   r	    r   r   
exceptionsr   r   Zspeedupsr   ImportErrorZutilsr   r?   r@   Zencode_datarA   rD   rH   r   r   r   r   <module>   s   $ 