
    mh1                    p   U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlZd dlm	Z	m
Z
mZ ddlmZmZ 	 ddlmZ n# e$ r	 ddlmZ Y nw xY wg dZ G d d	ej                  Zej        Zej        Zej        Zej        Zej        Zej         Z!eeefZ"eee!fZ# G d
 dej                  Z$e$j%        de$j&        de$j'        de$j(        de$j)        de$j*        de$j+        de$j,        de$j-        de$j.        de$j/        de$j0        de$j1        de$j2        de$j3        diZ4de5d<   e$j%        e$j&        e$j'        e$j(        e$j+        e$j,        e$j-        e$j.        e$j/        e$j0        e$j1        e$j2        hZ6e$j%        e$j&        e$j)        hZ7e8e9e:fZ;ej<         G d d                      Z=ej<         G d d                       Z>dd!l?m@Z@ dS )"    )annotationsN)Callable	GeneratorSequence   )PayloadTooBigProtocolError)
apply_mask)OpcodeOP_CONTOP_TEXT	OP_BINARYOP_CLOSEOP_PINGOP_PONGDATA_OPCODESCTRL_OPCODESFrameClosec                  *    e Zd ZdZd\  ZZZd\  ZZZ	dS )r   z#Opcode values for WebSocket frames.)r   r      )   	   
   N)
__name__
__module____qualname____doc__CONTTEXTBINARYCLOSEPINGPONG     </usr/local/lib/python3.11/site-packages/websockets/frames.pyr   r   #   s,        --)D$(E4r&   r   c                  N    e Zd ZdZdZdZdZdZdZdZ	dZ
d	Zd
ZdZdZdZdZdZdZdS )	CloseCodez-Close code values for WebSocket close frames.i  i  i  i  i  i  i  i  i  i  i  i  i  i  i  N)r   r   r   r   NORMAL_CLOSURE
GOING_AWAYPROTOCOL_ERRORUNSUPPORTED_DATANO_STATUS_RCVDABNORMAL_CLOSUREINVALID_DATAPOLICY_VIOLATIONMESSAGE_TOO_BIGMANDATORY_EXTENSIONINTERNAL_ERRORSERVICE_RESTARTTRY_AGAIN_LATERBAD_GATEWAYTLS_HANDSHAKEr%   r&   r'   r)   r)   5   sc        77NJNNLONOOKMMMr&   r)   OKz
going awayzprotocol errorzunsupported datazno status received [internal]zabnormal closure [internal]zinvalid frame payload datazpolicy violationzmessage too bigzmandatory extensionzinternal errorzservice restartztry again laterzbad gatewayz TLS handshake failure [internal]zdict[int, str]CLOSE_CODE_EXPLANATIONSc                      e Zd ZU dZded<   ded<   dZded<   d	Zded
<   d	Zded<   d	Zded<    e	e
j                            dd                    Zd!dZedddd"d            Zddd#dZd$d ZdS )%r   aN  
    WebSocket frame.

    Attributes:
        opcode: Opcode.
        data: Payload data.
        fin: FIN bit.
        rsv1: RSV1 bit.
        rsv2: RSV2 bit.
        rsv3: RSV3 bit.

    Only these fields are needed. The MASK bit, payload length and masking-key
    are handled on the fly when parsing and serializing frames.

    r   opcodebytesdataTboolfinFrsv1rsv2rsv3WEBSOCKETS_MAX_LOG_SIZE75returnstrc                   d}t          | j                   dt          | j                  dk    rdnd }| j        rdnd}| j        t          u r(t          | j                                                  }n| j        t          u r| j        }t          |          | j        dz  k    r<| j        dz  dz
  dz  }d	                    |dd	|z           d
|| d         g          }d	                    d |D                       }n| j        t          u r-t          t                              | j                            }n| j        r	 t          | j                                                  }d}n# t          t          f$ r | j        }t          |          | j        dz  k    r<| j        dz  dz
  dz  }d	                    |dd	|z           d
|| d         g          }d	                    d |D                       }d}Y nw xY wd}t          |          | j        k    r)| j        dz  dz
  }|dd	|z           dz   || d         z   }d	                    t!          d|||g                    }| j        j         d| d| dS )zE
        Return a human-readable representation of a frame.

        Nz byter    s	continued   r&   r   s      c              3     K   | ]}|d V  	dS 02xNr%   .0bytes     r'   	<genexpr>z Frame.__str__.<locals>.<genexpr>   s&      ==dtMM======r&   textc              3     K   | ]}|d V  	dS rO   r%   rQ   s     r'   rT   z Frame.__str__.<locals>.<genexpr>   s&      AA$4AAAAAAr&   binaryz''z...z, z [])lenr>   r@   r<   r   reprdecoder   MAX_LOG_SIZEjoinr   rG   r   parseUnicodeDecodeErrorAttributeErrorfiltername)selfcodinglength	non_finalr>   rW   cutmetadatas           r'   __str__zFrame.__str__   s   
 	NNMMs49~~/B/BMM(3BB	;'!! 	((**++DD[I%% YF6{{T.!333(A-1a76)AG)#4k63$%%="QRR88==f=====DD[H$$u{{49--..DDY 		"DI,,..//&7 " " "v;;!2a!777,1A5!;C XXviCi'8+vsdee}&UVVFxxAA&AAAAA!" Dt99t(((#q(1,C	!c'	?U*T3$%%[8D99VD669*EFFGG+"88T88X8888s   (E0 0BHHN)max_size
extensions
read_exact-Callable[[int], Generator[None, None, bytes]]maskrj   
int | Nonerk   %Sequence[extensions.Extension] | NoneGenerator[None, None, Frame]c             #  V  K    |d          E d{V }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          |d
z            }n"# t          $ r}t	          d          |d}~ww xY w|dz  rdnd|k    rt	          d          |dz  }|dk    r) |d          E d{V }t          j        d|          \  }n.|dk    r( |d          E d{V }t          j        d|          \  }|||k    rt          d| d| d          |r |d          E d{V } ||          E d{V }|rt          ||          } | ||||	|
|          }|g }t          |          D ]}|                    ||          }|	                                 |S )a&  
        Parse a WebSocket frame.

        This is a generator-based coroutine.

        Args:
            read_exact: Generator-based coroutine that reads the requested
                bytes or raises an exception if there isn't enough data.
            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:
            EOFError: If the connection is closed without a full WebSocket frame.
            UnicodeDecodeError: If the frame contains invalid UTF-8.
            PayloadTooBig: If the frame's payload size exceeds ``max_size``.
            ProtocolError: If the frame contains incorrect values.

        r   N!BB   TF@             zinvalid opcodezincorrect masking   ~   !Hr   z!Qzover size limit (z > z bytes)   )rj   )
structunpackr   
ValueErrorr	   r   r
   reversedr[   check)clsrl   rn   rj   rk   r>   head1head2r@   rA   rB   rC   r<   excre   
mask_bytesframe	extensions                     r'   r^   zFrame.parse   sy     < %*Q--''''''}UD11u j(3ddez)4ttuz)4ttuz)4ttu	;EJ.//FF 	; 	; 	; 011s:	; J&1DDEd:: 3444#S==(jmm++++++DdD11IVVs]](jmm++++++DdD11IVFX$5$5 PF P Px P P PQQQ 	2$.JqMM111111J %*V,,,,,,,, 	0dJ//DFD#tT488J!*-- 	? 	?I$$UX$>>EEs   A$ $
B.A>>Brk   c               <   |                                   |g }|D ]}|                    |           } t          j                    }| j        rdnd| j        rdndz  | j        rdndz  | j        rdndz  | j        z  }|rdnd}t          | j
                  }|dk     r-|                    t          j        d|||z                       na|d	k     r.|                    t          j        d
||dz  |                     n-|                    t          j        d||dz  |                     |r)t          j        d          }|                    |           |rt!          | j
        |          }	n| j
        }	|                    |	           |                                S )aH  
        Serialize a WebSocket frame.

        Args:
            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.

        Nrt   r   ru   rv   rw   rz   rs   i   z!BBHz!BBQry   r|   )r   encodeioBytesIOr@   rA   rB   rC   r<   rY   r>   writer}   packsecretstoken_bytesr
   getvalue)
rc   rn   rk   r   outputr   r   re   r   r>   s
             r'   	serializezFrame.serialize  s   $ 	

J# 	* 	*I##D))DD  8*ZZ!Y-zzA/!Y-zzA/ "Y-zzA/ k	 	 #)

TYC<<LLUE56>BBCCCCe^^LLVUECKHHIIIILLVUECKHHIII 	% ,Q//JLL$$$  	di44DD9DT   r&   Nonec                    | j         s| j        s| j        rt          d          | j        t
          v r=t          | j                  dk    rt          d          | j        st          d          dS dS )z
        Check that reserved bits and opcode have acceptable values.

        Raises:
            ProtocolError: If a reserved bit or the opcode is invalid.

        zreserved bits must be 0}   zcontrol frame too longzfragmented control frameN)	rA   rB   rC   r	   r<   r   rY   r>   r@   rc   s    r'   r   zFrame.checkN  s     9 	;	 	;TY 	; 9:::;,&&49~~###$<===8 @#$>???	 '&@ @r&   rF   rG   )
rl   rm   rn   r?   rj   ro   rk   rp   rF   rq   )rn   r?   rk   rp   rF   r=   rF   r   )r   r   r   r   __annotations__r@   rA   rB   rC   intosenvirongetr\   ri   classmethodr^   r   r   r%   r&   r'   r   r   z   s'           NNNKKKCDDD 3rz~~&?FFGGL09 09 09 09d   $<@H H H H H [H\ =A	9! 9! 9! 9! 9! 9!v@ @ @ @ @ @r&   r   c                  X    e Zd ZU dZded<   ded<   ddZedd
            ZddZddZ	dS )r   z
    Code and reason for WebSocket close frames.

    Attributes:
        code: Close code.
        reason: Close reason.

    r   coderG   reasonrF   c                    d| j         cxk    rdk     rn nd}n8d| j         cxk    rdk     rn nd}n t                              | j         d          }| j          d| d}| j        r| d	| j         }|S )
zU
        Return a human-readable representation of a close code and reason.

          i  
registered  zprivate useunknownz ()rM   )r   r:   r   r   )rc   explanationresults      r'   ri   zClose.__str__n  s    
 49####t#####&KKTY%%%%%%%%%'KK155diKKKI/////; 	/....Fr&   r>   r=   c                R   t          |          dk    r]t          j        d|dd                   \  }|dd                                         } | ||          }|                                 |S t          |          dk    r | t
          j        d          S t          d          )z
        Parse the payload of a close frame.

        Args:
            data: Payload of the close frame.

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

        r   r{   Nr   rI   zclose frame too short)rY   r}   r~   r[   r   r)   r.   r	   )r   r>   r   r   closes        r'   r^   zClose.parse  s     t99>>mD$rr(33GT!""X__&&FCf%%EKKMMMLYY!^^3y/444 7888r&   c                    |                                   t          j        d| j                  | j                                        z   S )z:
        Serialize the payload of a close frame.

        r{   )r   r}   r   r   r   r   r   s    r'   r   zClose.serialize  s8    
 	

{4++dk.@.@.B.BBBr&   r   c                l    | j         t          v s#d| j         cxk    rdk     sn t          d          dS dS )z
        Check that the close code has a valid value for a close frame.

        Raises:
            ProtocolError: If the close code is invalid.

        r   r   zinvalid status codeN)r   EXTERNAL_CLOSE_CODESr	   r   s    r'   r   zClose.check  sO     	111TTY5M5M5M5M5M5M5M5M 5666 215M5Mr&   Nr   )r>   r=   rF   r   )rF   r=   r   )
r   r   r   r   r   ri   r   r^   r   r   r%   r&   r'   r   r   `  s           IIIKKK   $ 9 9 9 [9.C C C C	7 	7 	7 	7 	7 	7r&   r   r   )A
__future__r   dataclassesenumr   r   r   r}   typingr   r   r   
exceptionsr   r	   speedupsr
   ImportErrorutils__all__IntEnumr   r   r   r    r   r!   r   r"   r   r#   r   r$   r   r   r   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r:   r   r   OK_CLOSE_CODESr=   	bytearray
memoryview	BytesLike	dataclassr   r   rI   rk   r%   r&   r'   <module>r      sD   " " " " " " "      				 				   0 0 0 0 0 0 0 0 0 0 4 4 4 4 4 4 4 4"$$$$$$$ " " "!!!!!!!!"  ) ) ) ) )T\ ) ) ) +
+M	<
+
+*')       . d,. 2= =8 20!#8.00=?+     , ! "  9j(	 b@ b@ b@ b@ b@ b@ b@ b@J H7 H7 H7 H7 H7 H7 H7 H7X        s   : AA