
    bjA                       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
 d dlmZ ddlmZmZ ddl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&j0        de&j1        de&j2        de&j3        de&j4        de&j5        diZ6de7d<   e&j'        e&j(        e&j)        e&j*        e&j-        e&j.        e&j/        e&j0        e&j1        e&j2        e&j3        e&j4        hZ8e&j'        e&j(        e&j+        hZ9ej:         G d d                       Z;ej:         G d! d"                      Z<	 	 d,d-d*Z=dd+l>m?Z? dS ).    )annotationsN)	GeneratorSequence)Callable   )PayloadTooBigProtocolError)	BytesLike)
apply_mask)OpcodeOP_CONTOP_TEXT	OP_BINARYOP_CLOSEOP_PINGOP_PONGDATA_OPCODESCTRL_OPCODES	CloseCode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     E/home/drrone/.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 )r   z-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   8   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eded	ediZ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   opcoder
   dataTboolfinFrsv1rsv2rsv3WEBSOCKETS_MAX_LOG_SIZE75returnstrc                |   | j                             | j                  }|                                 \  }}||k    rdn|rdnd}t	          | j                   dt	          | j                  dk    rdnd }| j        rdnd}d                    t          d	|||g                    }| j        j	         d
| d| dS )ax  
        Return a human-readable representation of a frame.

        This function is intended for logging and debugging. It doesn't aim to
        support round-tripping because payloads can be too long for displaying
        conveniently. Instead, it shows the beginning and the end. It's robust
        to incorrect data.

        It attempts to decode UTF-8 payloads whenever possible, even for binary
        frames and control frames, because those frequently contain UTF-8 data.
        It applies the same logic to continuation frames, because we don't know
        if they continue a text frame or a binary frame.

         textbinaryz byter   s	continuedz, N z [])
DEFAULT_IS_TEXTgetr=   
_data_reprlenr>   r@   joinfiltername)selfexpect_text	data_repris_text	data_typelength	non_finalmetadatas           r)   __str__zFrame.__str__   s     *..t{;;!__..	7%00BB7Vvvh		NNMMs49~~/B/BMM(3BB	99VD9fi*HIIJJ+"==Y==(====r(   tuple[str, bool | None]c                   | j         s!d| j                            | j                  fS | j        t          u rF	 t          t                              | j                             dfS # t          t          f$ r Y nw xY wt          | j                   d| j        z  k    rt          | j         dd| j        z  dz                     }t          | j         d| j        z  dz  d                   }t          || j        t          k              ot          || j        	          }|r&t!          ||z                       d
                    }n^t          | j                   }t          || j        t          k    | j                  }|r#t!          |                    d
                    }|s}| j         }t          |          | j        dz  k    r<| j        dz  dz
  dz  }d                    |dd|z           d|| d         g          }d                    d |D                       }t          |          | j        k    r)| j        dz  dz
  }|dd|z           dz   || d         z   }||fS )z
        Return a human-readable representation of the payload.

        Also returns whether the payload is text.

        The representation is elided to fit ``MAX_LOG_SIZE``.

        This is a helper for the __str__ method.

        z''T   Nr      )must_start_clean)must_end_cleanreplace)errors)re   rf   r   r(   r   s     rN   c              3     K   | ]}|d V  	dS )02xNr'   ).0bytes     r)   	<genexpr>z#Frame._data_repr.<locals>.<genexpr>   s&       B B4D B B B B B Br(   z...)r>   rP   rQ   r=   r   rG   r   parser	   UnicodeDecodeErrorrS   MAX_LOG_SIZEbytesis_utf8_fragmentr   r@   reprdecoderT   )rW   
data_startdata_endrZ   rY   r>   rK   cuts           r)   rR   zFrame._data_repr   s    y 	?-11$+>>>>
 ;(""5;;ty1122D88!#56    ty>>A 1111 ty)E1t/@+@A+E)EFGGJTYrD,='='B'D'DEFFH&!%!7    ##x     S *x"7!?!?y!?!Q!QRR	 ##D&!%!7#x  G
  @ I!>!>??	
  	CYF6{{T.!333(A-1a76)AG)#4k63$%%="QRR B B6 B B BBBI y>>D---#q(1,C!)AG),u4y#7GGI'!!s   -A& &A:9A:N)max_size
extensions
read_exact9Callable[[int], Generator[None, None, bytes | bytearray]]maskrx   
int | Nonery   %Sequence[extensions.Extension] | NoneGenerator[None, None, Frame]c             #  J  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          ||          |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.
            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!Qrb   )rx   )
structunpackr   
ValueErrorr	   r   r   reversedrt   check)clsrz   r|   rx   ry   r>   head1head2r@   rA   rB   rC   r=   excr\   
mask_bytesframe	extensions                     r)   rn   zFrame.parse   sg     : %*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111 	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ry   rq   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.

        Nr   r   r   r   r   r   r   i   z!BBHz!BBQr   rb   )r   encodeioBytesIOr@   rA   rB   rC   r=   rS   r>   writer   packsecretstoken_bytesr   getvalue)
rW   r|   ry   r   outputr   r   r\   r   r>   s
             r)   	serializezFrame.serializeC  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   rS   r>   r@   rW   s    r)   r   zFrame.check  s     9 	;	 	;TY 	; 9:::;,&&49~~###$<===8 @#$>???	 '&@ @r(   rF   rG   )rF   r`   )
rz   r{   r|   r?   rx   r}   ry   r~   rF   r   )r|   r?   ry   r~   rF   rq   rF   r   )r   r   r   r    __annotations__r@   rA   rB   rC   intosenvironrQ   rp   r   r   r   rP   r_   rR   classmethodrn   r   r   r'   r(   r)   r   r   z   sQ           NNNOOOCDDD 3rz~~&?FFGGLi$GO> > > >2F" F" F" F"P   $<@G G G G G [GZ =A	:! :! :! :! :! :!x@ @ @ @ @ @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.

    zCloseCode | int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 ()rN   )r   r;   rQ   r   )rW   explanationresults      r)   r_   zClose.__str__  s    
 49####t#####&KKTY%%%%%%%%%'KK155diKKKI/////; 	/....Fr(   r>   r
   c                   t          |t                    rt          d          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.

        z.only compressed outgoing frames use memoryviewr   r   Nr   rI   zclose frame too short)
isinstance
memoryviewAssertionErrorrS   r   r   rt   r   r   r/   r	   )r   r>   r   r   closes        r)   rn   zClose.parse  s     dJ'' 	S !QRRRt99>>mD$rr(33GT!""X__&&FCf%%EKKMMMLYY!^^3y/444 7888r(   rq   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   rq   r   )
r   r   r   r    r   r_   r   rn   r   r   r'   r(   r)   r   r     s           KKK   $ 9 9 9 [92C C C C	7 	7 	7 	7 	7 	7r(   r   Fr>   rq   re   r?   rf   rF   c                T   dt          |           }}|s;t          dt          |                     }||k     r| |         }|dz  dk    r|dz  }	 |s|dz  }t          t          |           dz
  |          }||k    ro| |         }|dz  dk    r|dz  }|dz  dk    rd}n&|dz  dk    rd}n|d	z  dk    rd}n|d
z  d	k    rd}nd}|t          |           |z
  k    rt          |           }	 	 | ||                                         }	dt	          |	          vS # t
          $ r Y dS w xY w)z*Guess if data is a fragment of UTF-8 text.r   rc      r   r   rb      r         z\xF)rS   minmaxrt   rs   ro   )
r>   re   rf   startend	max_startrl   min_endseq_lenrJ   s
             r)   rr   rr     s    CII3E 3t99%%	i;D j J..
 qc$ii!mU++Wnn9Dj J..q j J..
"j00
"j00
"j00  #d))c/))$ii'E#I%%''
 DJJ&&	    uus   ,D 
D'&D'r   )FF)r>   rq   re   r?   rf   r?   rF   r?   )@
__future__r   dataclassesenumr   r   r   r   collections.abcr   r   typingr   
exceptionsr   r	   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/   r0   r1   r2   r3   r4   r5   r6   r7   r8   r9   r;   r   r   OK_CLOSE_CODES	dataclassr   r   rr   rI   ry   r'   r(   r)   <module>r      s{   " " " " " " "      				 				   / / / / / / / /       4 4 4 4 4 4 4 4      "$$$$$$$ " " "!!!!!!!!"   ) ) ) ) )T\ ) ) ) +
+M	<
+
+*')       . d,. 2= =8 20!#8.00=?+     , ! "  S@ S@ S@ S@ S@ S@ S@ S@l J7 J7 J7 J7 J7 J7 J7 J7^ # E' E' E' E' E'R        s   A AA