o
    :ÊÆh„5  ã                   @  sö  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 zddlmZ W n eyN   ddlmZ Y nw g d¢ZG d	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„ 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&j0de&j1de&j2de&j3de&j4de&j5diZ6de7d< e&j'e&j(e&j)e&j*e&j-e&j.e&j/e&j0e&j1e&j2e&j3e&j4hZ8e&j'e&j(e&j+hZ9e:e;e<fZ=ej>G dd„ dƒƒZ?d+d$d%„Z@d,d'd(„ZAej>G d)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                   @  s$   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© r(   r(   ú^/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/websockets/frames.pyr   %   s    
r   c                   @  sL   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   s"    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                   @  sŒ   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d„Z	e
dddœd$dd„ƒZddœd%dd„Zd&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              
   C  sš  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 rR| j}t |ƒdkrGd |dd	… d
|dd… g¡}d dd„ |D ƒ¡}nO| jt	u r`t
t | j¡ƒ}nA| jrŸzt| j ¡ ƒ}d}W n2 ttfyž   | j}t |ƒdkr�d |dd	… d
|dd… g¡}d dd„ |D ƒ¡}d}Y nw d}t |ƒdkrµ|dd… d |dd…  }d td|||gƒ¡}| jj› d|› d|› d�S )zE
        Return a human-readable representation of a frame.

        Nz byter   Ú ÚsÚ	continuedé   ó    é   s     iøÿÿÿÚ c                 s  ó   � | ]}|d ›V  qdS ©Ú02xNr(   ©Ú.0Úbyter(   r(   r)   Ú	<genexpr>¨   ó   € z Frame.__str__.<locals>.<genexpr>Útextc                 s  rM   rN   r(   rP   r(   r(   r)   rS   ¸   rT   Úbinaryz''éK   é0   z...ièÿÿÿz, z [ú])Úlenr>   r@   r<   r   ÚreprÚdecoder   Újoinr   rE   r   ÚparseÚUnicodeDecodeErrorÚAttributeErrorÚfilterÚname)ÚselfÚcodingÚlengthÚ	non_finalr>   rV   Úmetadatar(   r(   r)   Ú__str__•   s8   &

 
 ûzFrame.__str__N)Úmax_sizer
   Ú
read_exactú-Callable[[int], Generator[None, None, bytes]]Úmaskri   úOptional[int]r
   ú(Optional[Sequence[extensions.Extension]]úGenerator[None, None, Frame]c             
   c  s¢  � |dƒE dH }t  d|¡\}}|d@ rdnd}|d@ rdnd}	|d@ r&dnd}
|d	@ r.dnd}zt|d
@ ƒ}W n tyJ } zt d¡|‚d}~ww |d@ rQdnd|krZt d¡‚|d@ }|dkrq|dƒE dH }t  d|¡\}n|dkrƒ|dƒE dH }t  d|¡\}|dur—||kr—t d|› d|› d�¡‚|r |dƒE dH }||ƒE dH }|r®t||ƒ}| ||||	|
|ƒ}|du r½g }t|ƒD ]	}|j	||d�}qÁ| 
¡  |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é@   é    rK   é   zinvalid opcodezincorrect maskingé   é~   ú!Hr   z!Qzover size limit (z > z bytes)é   )ri   )ÚstructÚunpackr   Ú
ValueErrorr	   ÚProtocolErrorÚPayloadTooBigr   Úreversedr\   Úcheck)Úclsrj   rl   ri   r
   r>   Úhead1Úhead2r@   rA   rB   rC   r<   Úexcre   Ú
mask_bytesÚframeÚ	extensionr(   r(   r)   r^   Ä   sL   €€ÿ
ÿ
zFrame.parse)r
   c          
      C  s&  |   ¡  |du r
g }|D ]}| | ¡} qt ¡ }| jrdnd| jr#dndB | jr*dndB | jr1dndB | jB }|r;dnd}t	| j
ƒ}|dk rS| t d|||B ¡¡ n|d	k re| t d
||dB |¡¡ n| t d||dB |¡¡ |r~t 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.

        Nrq   r   rr   rs   rK   rv   rp   i   z!BBHz!BBQru   rx   )r   ÚencodeÚioÚBytesIOr@   rA   rB   rC   r<   rZ   r>   Úwritery   ÚpackÚsecretsÚtoken_bytesr   Úgetvalue)
rc   rl   r
   r†   Úoutputr�   r‚   re   r„   r>   r(   r(   r)   Ú	serialize  s>   ÿþýüÿ



zFrame.serializeÚNonec                 C  sV   | 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<   r   rZ   r>   r@   ©rc   r(   r(   r)   r   L  s   



üzFrame.check©rD   rE   )
rj   rk   rl   r?   ri   rm   r
   rn   rD   ro   )rl   r?   r
   rn   rD   r=   ©rD   r‘   )r   r   r    r!   Ú__annotations__r@   rA   rB   rC   rh   Úclassmethodr^   r�   r   r(   r(   r(   r)   r   |   s    
 
/úPü;r   r>   r   rD   úTuple[int, bytes]c                 C  s2   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)Ú
isinstancerE   r   r‡   Ú	BytesLiker   Ú	TypeError©r>   r(   r(   r)   r   ^  s
   

r   r=   c                 C  s.   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›   rE   r‡   rœ   r=   r�   rž   r(   r(   r)   r   v  s
   


r   c                   @  sN   e Zd ZU dZded< ded< ddd„Zeddd„ƒZddd„Zddd„Z	dS )r   z
    Code and reason for WebSocket close frames.

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

    ÚintÚcoderE   ÚreasonrD   c                 C  sz   d| j   krdk rn nd}nd| j   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 (ú)rL   )r    r;   Úgetr¡   )rc   ÚexplanationÚresultr(   r(   r)   rh   ›  s   zClose.__str__r>   r=   c                 C  sl   t |ƒdkr%t d|dd… ¡\}|dd…  d¡}| ||ƒ}| ¡  |S t |ƒdkr1| 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   rw   Nr™   r   rF   zclose frame too short)	rZ   ry   rz   r\   r   r*   r/   r	   r|   )r€   r>   r    r¡   Úcloser(   r(   r)   r^   ­  s   

zClose.parsec                 C  s"   |   ¡  t d| j¡| j d¡ S )z:
        Serialize the payload of a close frame.

        rw   r™   )r   ry   r‹   r    r¡   r‡   r“   r(   r(   r)   r�   Å  s   zClose.serializer‘   c                 C  s4   | j tv sd| j   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|   r“   r(   r(   r)   r   Í  s   "
ÿzClose.checkNr”   )r>   r=   rD   r   )rD   r=   r•   )
r   r   r    r!   r–   rh   r—   r^   r�   r   r(   r(   r(   r)   r   �  s   
 	

r   )r>   r   rD   r˜   )r>   r   rD   r=   )CÚ
__future__r   ÚdataclassesÚenumrˆ   rŒ   ry   Útypingr   r   r   r   r   rF   r	   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_CODESr=   Ú	bytearrayÚ
memoryviewrœ   Ú	dataclassr   r   r   r   r(   r(   r(   r)   Ú<module>   s„    ÿ

ñôý
 
b
