
    :"ri                        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 	 dd	lmZ  G d
 de	      ZddZddZeZddlmZ ddZddZy# e$ r	 dd	lmZ Y 1w xY w)    )annotationsN)	AwaitableSequence)AnyCallable
NamedTuple   )
extensionsframes)PayloadTooBigProtocolError)	BytesLikeDataLike)
apply_maskc                      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       ZddZ	ddZ
eddd	 	 	 	 	 	 	 	 	 dd       Zdd	 	 	 	 	 	 	 ddZy)Frameboolfinzframes.Opcodeopcoder   dataFrsv1rsv2rsv3c                    t        j                  | j                  | j                  | j                  | j
                  | j                  | j                        S N)r   r   r   r   r   r   r   r   selfs    a/var/www/fortnox.pascalinesoft.com/venv/lib/python3.12/site-packages/websockets/legacy/framing.py	new_framezFrame.new_frame   s=    ||KKIIHHIIIIII
 	
    c                ,    t        | j                        S r   )strr   r   s    r   __str__zFrame.__str__%   s    4>>""r    c                6    | j                   j                         S r   )r   checkr   s    r   r%   zFrame.check(   s    ~~##%%r    N)max_sizer
   c                 K    |d       d{   }t        j                  d|      \  }}|dz  rdnd}|dz  rdnd}	|dz  rdnd}
|d	z  rdnd}	 t        j                  |d
z        }|dz  rdnd|k7  rt        d      |dz  }|dk(  r) |d       d{   }t        j                  d|      \  }n-|dk(  r( |d       d{   }t        j                  d|      \  }|||kD  rt        ||      |r |d       d{   } ||       d{   }|rt        |      }t        j                  ||||	|
|      }|g }t        |      D ]  }|j                  ||      } |j                           | |j                  |j                  |j                  |j                  |j                   |j"                        S 7 # t        $ r}t        d      |d}~ww xY w7 H7 7 7 ԭw)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   )clsreadermaskr&   r
   r   head1head2r   r   r   r   r   exclength	mask_bitsr   	extensions                     r   readz
Frame.read+   s    6 AY}}UD1u j(dez)tuz)tuz)tu	;]]5:#56F J&DEd: 344#S=?DdD1IVs]?DdD1IVFX$511$QiI F^#dI.DLLsD$E	J!*- 	GI!((X(FI	G 	MMNNNNNNNN
 	
W   	; 01s:	; # #
 ( $sw   G'F=AG'G  ),G'G-G'G <G' G#G'G%B-G' 	G	GGG' G'#G'%G')r
   c               J     || j                   j                  ||             y)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.

        )r9   r
   N)r   	serialize)r   writer9   r
   s       r   rC   zFrame.writez   s     0 	dnn&&DZ&HIr    )returnzframes.Frame)rD   r"   )rD   None)
r8   z!Callable[[int], Awaitable[bytes]]r9   r   r&   z
int | Noner
   %Sequence[extensions.Extension] | NonerD   r   )rC   zCallable[[bytes], Any]r9   r   r
   rF   rD   rE   )__name__
__module____qualname____annotations__r   r   r   propertyr   r#   r%   classmethodr@   rC    r    r   r   r      s    	I
OD$D$D$
 
#&   $<@L
1L
 	L

 L
 :L
 
L
 L
f =AJ%J 	J
 :J 
Jr    r   c                    t        | t              r*t        j                  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   r3   TEXTencoder   BINARY	TypeErrorr   s    r   prepare_datarV      sT      $}}!!4;;=00	D)	$}}##T))899r    c                    t        | t              r| j                         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.

    rO   )rP   r"   rR   r   bytesrT   rU   s    r   prepare_ctrlrY      s:     ${{}	D)	$T{899r    )Closec                \    t        j                  |       }|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.

    )rZ   parsecodereason)r   closes     r   parse_closer`      s%     KKE::u||##r    c                6    t        | |      j                         S )z3
    Serialize the payload for a close frame.

    )rZ   rB   )r]   r^   s     r   serialize_closerb      s    
 v((**r    )r   r   rD   ztuple[int, BytesLike])r   r   rD   rX   )r   rX   rD   ztuple[int, str])r]   intr^   r"   rD   rX   )
__future__r   r1   collections.abcr   r   typingr   r   r    r
   r   
exceptionsr   r   r   r   speedupsr   ImportErrorutilsr   rV   rY   encode_datarZ   r`   rb   rM   r    r   <module>rm      sk    "  / , , ! 5 (#%
@JJ @JF:0:0  $ +[  #"#s   A   A.-A.