
    i5                       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mZm	Z	m
Z
mZ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:e;e<fZ=ej>         G d d                      Z?d)d$Z@d*d&ZAej>         G d' d(                      ZBdS )+    )annotationsN)Callable	GeneratorOptionalSequenceTuple   )
exceptions
extensions)Data)
apply_mask)OpcodeOP_CONTOP_TEXT	OP_BINARYOP_CLOSEOP_PINGOP_PONGDATA_OPCODESCTRL_OPCODESFrameprepare_dataprepare_ctrl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     W/var/www/html/crypto-bot/backend/venv/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.   7   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<   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returnstrc                j   d}t          | j                   dt          | j                  dk    rdnd }| j        rdnd}| j        t          u r(t          | j                                                  }nX| j        t          u rb| j        }t          |          dk    r(d                    |dd	         d
|dd         g          }d                    d |D                       }n| j        t          u r-t          t                              | j                            }n| j        r	 t          | j                                                  }d}n|# t          t          f$ rf | j        }t          |          dk    r(d                    |dd	         d
|dd         g          }d                    d |D                       }d}Y nw xY wd}t          |          dk    r|dd         dz   |d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+      s     i 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 rS   r*   rU   s     r,   rX   z Frame.__str__.<locals>.<genexpr>   s&      AA$4AAAAAAr+   binaryz''K   0   z...iz, z [])lenrC   rE   rA   r   reprdecoder   joinr   rJ   r   parseUnicodeDecodeErrorAttributeErrorfiltername)selfcodinglength	non_finalrC   r[   metadatas          r,   __str__zFrame.__str__   sF   
 	NNMMs49~~/B/BMM(3BB	;'!! 	((**++DD[I%% YF6{{R6#2#;VBCC["IJJ88==f=====DD[H$$u{{49--..DDY 	"DI,,..//&7 " " "v;;## XXvcrc{K&MNNFxxAA&AAAAA!" Dt99r>>9u$tCDDz1D99VD669*EFFGG+"88T88X8888s   *(E A4G
	G
N)max_sizer   
read_exact-Callable[[int], Generator[None, None, bytes]]maskrn   Optional[int]r   (Optional[Sequence[extensions.Extension]]Generator[None, None, Frame]c             #  t  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	          j        d          |d}~ww xY w|dz  rdnd|k    rt	          j        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	          j        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@       rP      zinvalid opcodezincorrect masking   ~   !Hr   z!Qzover size limit (z > z bytes)   )rn   )structunpackr   
ValueErrorr
   ProtocolErrorPayloadTooBigr   reversedra   check)clsro   rq   rn   r   rC   head1head2rE   rF   rG   rH   rA   excrj   
mask_bytesframe	extensions                     r,   rc   zFrame.parse   s     < %*Q--''''''}UD11u j(3ddez)4ttuz)4ttuz)4ttu	FEJ.//FF 	F 	F 	F*+;<<#E	F J&1DDEd::*+>???#S==(jmm++++++DdD11IVVs]](jmm++++++DdD11IVFX$5$5*@F@@x@@@    	2$.JqMM111111J %*V,,,,,,,, 	0dJ//DFD#tT488J!*-- 	? 	?I$$UX$>>EEs   A$ $
B.BB)r   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.

        Nrw   r   rx   ry   rP   r|   rv   i   z!BBHz!BBQr{   r~   )r   encodeioBytesIOrE   rF   rG   rH   rA   r_   rC   writer   packsecretstoken_bytesr   getvalue)
rh   rq   r   r   outputr   r   rj   r   rC   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          j        d          | j        t          v rGt          | j                  dk    rt          j        d          | j	        st          j        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)
rF   rG   rH   r
   r   rA   r   r_   rC   rE   rh   s    r,   r   zFrame.checkL  s     9 	F	 	FTY 	F*+DEEE;,&&49~~## ./GHHH8 K ./IJJJ	 '&K Kr+   rI   rJ   )
ro   rp   rq   rD   rn   rr   r   rs   rI   rt   )rq   rD   r   rs   rI   rB   rI   r   )r    r!   r"   r#   __annotations__rE   rF   rG   rH   rm   classmethodrc   r   r   r*   r+   r,   r   r   |   s           NNNKKKCDDD-9 -9 -9 -9^  #'?CJ J J J J [J` @D	9! 9! 9! 9! 9! 9!vK K K K K Kr+   r   rC   r   rI   Tuple[int, bytes]c                    t          | t                    rt          |                     d          fS t          | t                    r	t
          | 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.

    utf-8data must be str or bytes-like)
isinstancerJ   r   r   	BytesLiker   	TypeErrorrC   s    r,   r   r   ^  sX      $ :G,,,,	D)	$	$ :$8999r+   rB   c                    t          | t                    r|                     d          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.

    r   r   )r   rJ   r   r   rB   r   r   s    r,   r   r   v  sU     $ :{{7###	D)	$	$ :T{{8999r+   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.

    intcoderJ   reasonrI   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 ()rQ   )r   r?   getr   )rh   explanationresults      r,   rm   zClose.__str__  s    
 49####t#####&KKTY%%%%%%%%%'KK155diKKKI/////; 	/....Fr+   rC   rB   c                ^   t          |          dk    r^t          j        d|dd                   \  }|dd                             d          } | ||          }|                                 |S t          |          dk    r | t
          j        d          S t          j        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   r   rL   zclose frame too short)	r_   r   r   ra   r   r.   r3   r
   r   )r   rC   r   r   closes        r,   rc   zClose.parse  s     t99>>mD$rr(33GT!""X__W--FCf%%EKKMMMLYY!^^3y/444*+BCCCr+   c                    |                                   t          j        d| j                  | j                            d          z   S )z:
        Serialize the payload of a close frame.

        r}   r   )r   r   r   r   r   r   r   s    r,   r   zClose.serialize  s:    
 	

{4++dk.@.@.I.IIIr+   r   c                v    | j         t          v s(d| j         cxk    rdk     sn t          j        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   r   s    r,   r   zClose.check  sR     	111TTY5M5M5M5M5M5M5M5M*+@AAA 215M5Mr+   Nr   )rC   rB   rI   r   )rI   rB   r   )
r    r!   r"   r#   r   rm   r   rc   r   r   r*   r+   r,   r   r     s           IIIKKK   $ D D D [D.J J J J	B 	B 	B 	B 	B 	Br+   r   )rC   r   rI   r   )rC   r   rI   rB   )C
__future__r   dataclassesenumr   r   r   typingr   r   r   r   r   rL   r
   r   r   speedupsr   ImportErrorutils__all__IntEnumr   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<   r=   r?   r   r   OK_CLOSE_CODESrB   	bytearray
memoryviewr   	dataclassr   r   r   r   r*   r+   r,   <module>r      s|   " " " " " " "      				   A A A A A A A A A A A A A A $ $ $ $ $ $ $ $      "$$$$$$$ " " "!!!!!!!!"  ") ) ) ) )T\ ) ) ) +
+M	<
+
+*')       . d,. 2= =8 20!#8.00=?+     , ! "  9j(	 ^K ^K ^K ^K ^K ^K ^K ^KB: : : :0: : : :. HB HB HB HB HB HB HB HB HB HBs   A   AA