o
    ¡ØÆh18  ã                   @   sJ  d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZm	Z	 ddl
mZmZ ddlmZ 	 zd dlmZ de j d	e j d
efdd„ZW n ey]   ejZde j d	e j d
efdd„ZY nw g 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%eeeeeeee e!e"e#e$fZ&G dd„ dƒZ'G d d!„ d!ƒZ(G d"d#„ d#ƒZ)dS )$é    N)ÚLock)ÚCallableÚOptionalÚUnioné   )ÚWebSocketPayloadExceptionÚWebSocketProtocolException)Úvalidate_utf8)ÚXorMaskerSimpleÚ
mask_valueÚ
data_valueÚreturnc                 C   s   t | ƒ |¡}|S ©N)r
   Úprocess)r   r   Úmask_result© r   ú\/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/websocket/_abnf.pyÚ_mask%   s   r   c                 C   sH   t |ƒ}t |t¡}t | |d  | d |d …  t¡}||A  |t¡S )Né   )ÚlenÚintÚ
from_bytesÚnative_byteorderÚto_bytes)r   r   ÚdatalenÚint_data_valueÚint_mask_valuer   r   r   r   -   s   ÿ)ÚABNFÚcontinuous_frameÚframe_bufferÚSTATUS_NORMALÚSTATUS_GOING_AWAYÚSTATUS_PROTOCOL_ERRORÚSTATUS_UNSUPPORTED_DATA_TYPEÚSTATUS_STATUS_NOT_AVAILABLEÚSTATUS_ABNORMAL_CLOSEDÚSTATUS_INVALID_PAYLOADÚSTATUS_POLICY_VIOLATIONÚSTATUS_MESSAGE_TOO_BIGÚSTATUS_INVALID_EXTENSIONÚSTATUS_UNEXPECTED_CONDITIONÚSTATUS_BAD_GATEWAYÚSTATUS_TLS_HANDSHAKE_ERRORiè  ié  iê  ië  ií  iî  iï  ið  iñ  iò  ió  iô  iõ  iö  i÷  c                   @   sV  e Zd ZdZdZdZdZdZdZdZ	eeeeee	fZ
eded	ed
edede	diZdZdZdZddddeddfdededededededeeedf ddfdd„Zd/deddfdd „Zed!edefd"d#„ƒZdefd$d%„Zed0deeef dededd fd&d'„ƒZdefd(d)„Zd*eeef defd+d,„Zed*eeef deeef defd-d.„ƒZdS )1r   z}
    ABNF frame class.
    See http://tools.ietf.org/html/rfc5234
    and http://tools.ietf.org/html/rfc6455#section-5.2
    r   r   é   é   é	   é
   ÚcontÚtextÚbinaryÚcloseÚpingÚpongé~   i   l            Ú ÚfinÚrsv1Úrsv2Úrsv3Úopcoder   ÚdataNr   c                 C   sB   || _ || _|| _|| _|| _|| _|du rd}|| _tj| _	dS )zG
        Constructor for ABNF. Please check RFC for arguments.
        Nr8   )
r9   r:   r;   r<   r=   r   r>   ÚosÚurandomÚget_mask_key)Úselfr9   r:   r;   r<   r=   r   r>   r   r   r   Ú__init__’   s   zABNF.__init__FÚskip_utf8_validationc                 C   sä   | j s	| js	| jrtdƒ‚| jtjvrtd| jƒ‚| jtjkr&| js&tdƒ‚| jtj	krnt
| jƒ}|s5dS |dks=|dkrAtdƒ‚|dkrT|sTt| jdd… ƒsTtdƒ‚d	t| jd
 ƒ t| jd ƒ }|  |¡sptd|ƒ‚dS dS )z…
        Validate the ABNF frame.

        Parameters
        ----------
        skip_utf8_validation: skip utf8 validation.
        zrsv is not implemented, yetzInvalid opcode %rzInvalid ping frame.Nr   r7   zInvalid close frame.r-   é   r   zInvalid close opcode %r)r:   r;   r<   r   r=   r   ÚOPCODESÚOPCODE_PINGr9   ÚOPCODE_CLOSEr   r>   r	   r   Ú_is_valid_close_status)rB   rD   ÚlÚcoder   r   r   Úvalidateª   s&   
 

õ
zABNF.validaterK   c                 C   s    | t v pd|   kodk S   S )Ni¸  iˆ  )ÚVALID_CLOSE_STATUS)rK   r   r   r   rI   È   s    zABNF._is_valid_close_statusc                 C   s   d| j › d| j› d| j› �S )Nzfin=z opcode=z data=)r9   r=   r>   ©rB   r   r   r   Ú__str__Ì   s   zABNF.__str__c                 C   s2   |t jkrt| tƒr|  d¡} t |ddd|d| ƒS )aÚ  
        Create frame to send text, binary and other data.

        Parameters
        ----------
        data: str
            data to send. This is string value(byte array).
            If opcode is OPCODE_TEXT and this value is unicode,
            data value is converted into unicode string, automatically.
        opcode: int
            operation code. please see OPCODE_MAP.
        fin: int
            fin flag. if set to 0, create continue fragmentation.
        úutf-8r   r   )r   ÚOPCODE_TEXTÚ
isinstanceÚstrÚencode)r>   r=   r9   r   r   r   Úcreate_frameÏ   s   
zABNF.create_framec                 C   s`  t dd„ | j| j| j| jfD ƒƒrtdƒ‚| jtjvrtdƒ‚t	| j
ƒ}|tjkr-tdƒ‚t| jd> | jd> B | jd> B | jd	> B | jB ƒ d
¡}|tjk r]|t| jd> |B ƒ d
¡7 }n2|tjk ry|t| jd> dB ƒ d
¡7 }|t d|¡7 }n|t| jd> dB ƒ d
¡7 }|t d|¡7 }| js¤t| j
tƒrŸ| j
 d¡| _
|| j
 S |  d	¡}||  |¡ S )zR
        Format this object to string(byte array) to send data to server.
        c                 s   s   � | ]}|d vV  qdS ))r   r   Nr   )Ú.0Úxr   r   r   Ú	<genexpr>è   s   € zABNF.format.<locals>.<genexpr>z
not 0 or 1zInvalid OPCODEzdata is too longé   é   é   r   úlatin-1r7   ú!Hé   ú!QrP   )Úanyr9   r:   r;   r<   Ú
ValueErrorr=   r   rF   r   r>   Ú	LENGTH_63ÚchrrT   ÚLENGTH_7r   Ú	LENGTH_16ÚstructÚpackrR   rS   rA   Ú_get_masked)rB   ÚlengthÚframe_headerÚmask_keyr   r   r   Úformatä   sB   "

ÿþýüÿú



zABNF.formatrk   c                 C   s*   t  || j¡}t|tƒr| d¡}|| S )NrP   )r   Úmaskr>   rR   rS   rT   )rB   rk   Úsr   r   r   rh     s   

zABNF._get_maskedc                 C   sN   |du rd}t | tƒr|  d¡} t |tƒr| d¡}tt d| ¡t d|¡ƒS )zÛ
        Mask or unmask data. Just do xor for each byte

        Parameters
        ----------
        mask_key: bytes or str
            4 byte mask.
        data: bytes or str
            data to mask/unmask.
        Nr8   r\   ÚB)rR   rS   rT   r   Úarray)rk   r>   r   r   r   rm     s   



z	ABNF.mask)F)r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚOPCODE_CONTrQ   ÚOPCODE_BINARYrH   rG   ÚOPCODE_PONGrF   Ú
OPCODE_MAPrd   re   rb   r   r   rS   ÚbytesrC   ÚboolrL   ÚstaticmethodrI   rO   rU   rl   rh   rm   r   r   r   r   r   j   sv    úú
øþýüûúùø	
÷&#,r   c                   @   s¼   e Zd ZdZdZdeegef deddfdd„Zdd	d
„Z	defdd„Z
ddd„Zdeeef fdd„Zdefdd„Zddd„Zdefdd„Zddd„Zdefdd„Zdedefdd„ZdS )r   r[   rZ   Úrecv_fnrD   r   Nc                 C   s&   || _ || _g | _|  ¡  tƒ | _d S r   )ÚrecvrD   Úrecv_bufferÚclearr   Úlock)rB   r|   rD   r   r   r   rC   +  s
   zframe_buffer.__init__c                 C   s   d | _ d | _d | _d S r   )Úheaderri   r   rN   r   r   r   r   6  s   
zframe_buffer.clearc                 C   ó
   | j d u S r   )r�   rN   r   r   r   Úhas_received_header;  ó   
z frame_buffer.has_received_headerc                 C   s~   |   d¡}|d }|d? d@ }|d? d@ }|d? d@ }|d? d@ }|d@ }|d }|d? d@ }	|d	@ }
||||||	|
f| _d S )
Nr-   r   rY   r   rZ   r[   r   é   r^   )Úrecv_strictr�   )rB   r�   Úb1r9   r:   r;   r<   r=   Úb2Úhas_maskÚlength_bitsr   r   r   Úrecv_header>  s   
zframe_buffer.recv_headerc                 C   s   | j sdS | j tj }|S )NF)r�   r   Ú_HEADER_MASK_INDEX)rB   Ú
header_valr   r   r   r‰   L  s   zframe_buffer.has_maskc                 C   r‚   r   )ri   rN   r   r   r   Úhas_received_lengthR  r„   z frame_buffer.has_received_lengthc                 C   sn   | j tj }|d@ }|dkr|  d¡}t d|¡d | _d S |dkr2|  d¡}t d|¡d | _d S || _d S )Nr^   r7   r-   r]   r   r.   r_   )r�   r   Ú_HEADER_LENGTH_INDEXr†   rf   Úunpackri   )rB   ÚbitsrŠ   Úvr   r   r   Úrecv_lengthU  s   


zframe_buffer.recv_lengthc                 C   r‚   r   )r   rN   r   r   r   Úhas_received_maska  r„   zframe_buffer.has_received_maskc                 C   s"   |   ¡ r|  d¡| _d S d| _d S )Nr   r8   )r‰   r†   r   rN   r   r   r   Ú	recv_maskd  s   "zframe_buffer.recv_maskc              	   C   s¾   | j �R |  ¡ r|  ¡  | j\}}}}}}}|  ¡ r|  ¡  | j}|  ¡ r)|  ¡  | j	}	|  
|¡}
|r9t |	|
¡}
|  ¡  t|||||||
ƒ}| | j¡ W d   ƒ |S 1 sXw   Y  |S r   )r€   rƒ   r‹   r�   rŽ   r“   ri   r”   r•   r   r†   r   rm   r   rL   rD   )rB   r9   r:   r;   r<   r=   r‰   Ú_ri   r   ÚpayloadÚframer   r   r   Ú
recv_frameg  s(   

çåzframe_buffer.recv_frameÚbufsizec                 C   s†   |t tt| jƒƒ }|dkr&|  td|ƒ¡}| j |¡ |t|ƒ8 }|dksd | j¡}|dkr5g | _|S ||d … g| _|d |… S )Nr   i @  ó    )ÚsumÚmapr   r~   r}   ÚminÚappendÚjoin)rB   rš   ÚshortageÚbytes_Úunifiedr   r   r   r†   …  s   ÷zframe_buffer.recv_strict)r   N)rq   rr   rs   rŒ   r�   r   r   rz   rC   r   rƒ   r‹   r   r‰   rŽ   r“   r”   r•   r   r™   ry   r†   r   r   r   r   r   '  s(    ÿÿ
þ



r   c                   @   sr   e Zd Zdededdfdd„Zdeddfdd	„Zdeddfd
d„Zdedeee	f fdd„Z
dedefdd„ZdS )r   Úfire_cont_framerD   r   Nc                 C   s   || _ || _d | _d | _d S r   )r¤   rD   Ú	cont_dataÚrecving_frames)rB   r¤   rD   r   r   r   rC   �  s   
zcontinuous_frame.__init__r˜   c                 C   sB   | j s|jtjkrtdƒ‚| j r|jtjtjfv rtdƒ‚d S d S )NzIllegal frame)r¦   r=   r   ru   r   rQ   rv   ©rB   r˜   r   r   r   rL   £  s   
þüzcontinuous_frame.validatec                 C   sX   | j r| j d  |j7  < n|jtjtjfv r|j| _|j|jg| _ |jr*d | _d S d S )Nr   )r¥   r>   r=   r   rQ   rv   r¦   r9   r§   r   r   r   Úadd¬  s   
ÿzcontinuous_frame.addc                 C   s   |j p| jS r   )r9   r¤   r§   r   r   r   Úis_fire·  s   zcontinuous_frame.is_firec                 C   sZ   | j }d | _ |d |_| js'|d tjkr'| js't|jƒs'tdt|jƒ› �ƒ‚|d |fS )Nr   r   zcannot decode: )	r¥   r>   r¤   r   rQ   rD   r	   r   Úrepr)rB   r˜   r>   r   r   r   Úextractº  s   
ÿÿþzcontinuous_frame.extract)rq   rr   rs   rz   rC   r   rL   r¨   r   r   r©   Útupler«   r   r   r   r   r   œ  s    	r   )*rp   r?   rf   ÚsysÚ	threadingr   Útypingr   r   r   Ú_exceptionsr   r   Ú_utilsr	   Úwsaccel.xormaskr
   ry   r   ÚImportErrorÚ	byteorderr   Ú__all__r    r!   r"   r#   r$   r%   r&   r'   r(   r)   r*   ÚSTATUS_SERVICE_RESTARTÚSTATUS_TRY_AGAIN_LATERr+   r,   rM   r   r   r   r   r   r   r   Ú<module>   sb    üô >u