o
    :ÊÆhÎ`  ã                   @  sð   d dl mZ d dlZd dlZd dlmZmZmZmZm	Z	m
Z
mZ ddlmZmZ ddlmZmZ ddlmZmZmZ g d	¢Zd
Zdd„ eddƒD ƒZG dd„ deƒZd/dd„Zd0d d!„ZG d"d#„ d#eƒZd1d'd(„ZG d)d*„ d*eƒZd2d-d.„ZdS )3é    )ÚannotationsN)ÚAnyÚDictÚListÚOptionalÚSequenceÚTupleÚUnioné   )Ú
exceptionsÚframes)ÚExtensionNameÚExtensionParameteré   )ÚClientExtensionFactoryÚ	ExtensionÚServerExtensionFactory)ÚPerMessageDeflateÚClientPerMessageDeflateFactoryÚ enable_client_permessage_deflateÚServerPerMessageDeflateFactoryÚ enable_server_permessage_deflates     ÿÿc                 C  s   g | ]}t |ƒ‘qS © )Ústr)Ú.0Úbitsr   r   úu/var/www/html/HyperOracle/crypto_trader/venv/lib/python3.10/site-packages/websockets/extensions/permessage_deflate.pyÚ
<listcomp>   s    r   é   é   c                   @  sJ   e Zd ZdZedƒZ	dddd„Zddd„Zddœddd„Zd dd„Z	dS )!r   z)
    Per-Message Deflate extension.

    úpermessage-deflateNÚremote_no_context_takeoverÚboolÚlocal_no_context_takeoverÚremote_max_window_bitsÚintÚlocal_max_window_bitsÚcompress_settingsúOptional[Dict[Any, Any]]ÚreturnÚNonec                 C  sÊ   |du ri }|dv sJ ‚|dv sJ ‚d|  krdks J ‚ J ‚d|  kr+dks.J ‚ J ‚d|vs4J ‚|| _ || _|| _|| _|| _| j sOtj| j d�| _| js`tjdd| j i| j¤Ž| _	d| _
dS )	z?
        Configure the Per-Message Deflate extension.

        N)FTr   é   Úwbits©r,   Fr   )r!   r#   r$   r&   r'   ÚzlibÚdecompressobjÚdecoderÚcompressobjÚencoderÚdecode_cont_data)Úselfr!   r#   r$   r&   r'   r   r   r   Ú__init__!   s*   ÿÿ
zPerMessageDeflate.__init__r   c              	   C  s&   d| j › d| j› d| j› d| j› d�	S )Nz-PerMessageDeflate(remote_no_context_takeover=z, local_no_context_takeover=z, remote_max_window_bits=z, local_max_window_bits=ú))r!   r#   r$   r&   ©r4   r   r   r   Ú__repr__J   s   ÿþýüÿzPerMessageDeflate.__repr__)Úmax_sizeÚframeúframes.Framer9   úOptional[int]c             
   C  s  |j tjv r|S |j tju r| js|S |jrd| _n|js|S tj|dd�}|js,d| _| j	r8t
j| j d�| _|j}|jrB|t7 }|du rHdn|}z	| j ||¡}W n t
jyf } zt d¡|‚d}~ww | jjrtt d|› d	�¡‚|jr|| j	r|| `tj||d
�S )z,
        Decode an incoming frame.

        F©Úrsv1Tr-   Nr   zdecompression failedzover size limit (? > z bytes)©Údata)Úopcoder   ÚCTRL_OPCODESÚOP_CONTr3   Úfinr>   ÚdataclassesÚreplacer!   r.   r/   r$   r0   r@   Ú_EMPTY_UNCOMPRESSED_BLOCKÚ
decompressÚerrorr   ÚProtocolErrorÚunconsumed_tailÚPayloadTooBig)r4   r:   r9   r@   Ú
max_lengthÚexcr   r   r   ÚdecodeS   s<   €€ÿzPerMessageDeflate.decodec                 C  s¢   |j tjv r|S |j tjur&tj|dd�}| jr&tjdd| j	 i| j
¤Ž| _| j |j¡| j tj¡ }|jrB| t¡rB|dd… }|jrJ| jrJ| `tj||d�S )z,
        Encode an outgoing frame.

        Tr=   r,   Néüÿÿÿr?   r   )rA   r   rB   rC   rE   rF   r#   r.   r1   r&   r'   r2   Úcompressr@   ÚflushÚZ_SYNC_FLUSHrD   ÚendswithrG   )r4   r:   r@   r   r   r   Úencode�   s    ÿÿzPerMessageDeflate.encode©N)r!   r"   r#   r"   r$   r%   r&   r%   r'   r(   r)   r*   )r)   r   )r:   r;   r9   r<   r)   r;   )r:   r;   r)   r;   )
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Únamer5   r8   rO   rU   r   r   r   r   r      s    ú
)ü:r   Úserver_no_context_takeoverr"   Úclient_no_context_takeoverÚserver_max_window_bitsr<   Úclient_max_window_bitsúOptional[Union[int, bool]]r)   úList[ExtensionParameter]c                 C  sf   g }| r	|  d¡ |r|  d¡ |r|  dt|ƒf¡ |du r&|  d¡ |S |r1|  dt|ƒf¡ |S )zS
    Build a list of ``(name, value)`` pairs for some compression parameters.

    )r\   N)r]   Nr^   T)r_   Nr_   )Úappendr   )r\   r]   r^   r_   Úparamsr   r   r   Ú_build_parameters®   s   



þrd   rc   úSequence[ExtensionParameter]Ú	is_serverú<Tuple[bool, bool, Optional[int], Optional[Union[int, bool]]]c                C  s  d}d}d}d}| D ]y\}}|dkr&|rt  |¡‚|du r d}q
t  ||¡‚|dkr>|r1t  |¡‚|du r8d}q
t  ||¡‚|dkrZ|durKt  |¡‚|tv rTt|ƒ}q
t  ||¡‚|dkr|durgt  |¡‚|rp|du rpd}q
|tv ryt|ƒ}q
t  ||¡‚t  |¡‚||||fS )zã
    Extract compression parameters from a list of ``(name, value)`` pairs.

    If ``is_server`` is :obj:`True`, ``client_max_window_bits`` may be
    provided without a value. This is only allowed in handshake requests.

    FNr\   Tr]   r^   r_   )r   ÚDuplicateParameterÚInvalidParameterValueÚ_MAX_WINDOW_BITS_VALUESr%   ÚInvalidParameterName)rc   rf   r\   r]   r^   r_   r[   Úvaluer   r   r   Ú_extract_parametersÆ   sJ   







ürm   c                   @  sB   e Zd ZdZedƒZ					dddd„Zddd„Zd dd„ZdS )!r   aØ  
    Client-side extension factory for the Per-Message Deflate extension.

    Parameters behave as described in `section 7.1 of RFC 7692`_.

    .. _section 7.1 of RFC 7692: https://www.rfc-editor.org/rfc/rfc7692.html#section-7.1

    Set them to :obj:`True` to include them in the negotiation offer without a
    value or to an integer value to include them with this value.

    Args:
        server_no_context_takeover: prevent server from using context takeover.
        client_no_context_takeover: prevent client from using context takeover.
        server_max_window_bits: maximum size of the server's LZ77 sliding window
            in bits, between 8 and 15.
        client_max_window_bits: maximum size of the client's LZ77 sliding window
            in bits, between 8 and 15, or :obj:`True` to indicate support without
            setting a limit.
        compress_settings: additional keyword arguments for :func:`zlib.compressobj`,
            excluding ``wbits``.

    r    FNTr\   r"   r]   r^   r<   r_   r`   r'   úOptional[Dict[str, Any]]r)   r*   c                 C  sš   |du sd|  krdkst dƒ‚ t dƒ‚|du s0|du s0d|  kr+dks0t dƒ‚ t dƒ‚|dur<d|v r<t dƒ‚|| _|| _|| _|| _|| _dS )	úG
        Configure the Per-Message Deflate extension factory.

        Nr   r+   ú/server_max_window_bits must be between 8 and 15Tú/client_max_window_bits must be between 8 and 15r,   zLcompress_settings must not include wbits, set client_max_window_bits instead)Ú
ValueErrorr\   r]   r^   r_   r'   )r4   r\   r]   r^   r_   r'   r   r   r   r5     s&   ÿþÿ
z'ClientPerMessageDeflateFactory.__init__ra   c                 C  s   t | j| j| j| jƒS )z,
        Build request parameters.

        )rd   r\   r]   r^   r_   r7   r   r   r   Úget_request_params=  s   üz1ClientPerMessageDeflateFactory.get_request_paramsrc   re   Úaccepted_extensionsúSequence[Extension]r   c                   sø   t ‡ fdd„|D ƒƒrt dˆ j› �¡‚t|dd�\}}}}ˆ jr(|s(t d¡‚ˆ jr/|s/d}ˆ jdu r5n|du r>t d	¡‚|ˆ jkrHt d
¡‚ˆ jdu rW|durVt d¡‚nˆ jdu r]n|du reˆ j}n
|ˆ jkrot d¡‚t	|||pud|pxdˆ j
ƒS )zV
        Process response parameters.

        Return an extension instance.

        c                 3  ó   � | ]	}|j ˆ j kV  qd S rV   ©r[   ©r   Úotherr7   r   r   Ú	<genexpr>T  ó   € zIClientPerMessageDeflateFactory.process_response_params.<locals>.<genexpr>zreceived duplicate F©rf   z#expected server_no_context_takeoverTNzexpected server_max_window_bitsz"unsupported server_max_window_bitsz!unexpected client_max_window_bitsz"unsupported client_max_window_bitsr+   )Úanyr   ÚNegotiationErrorr[   rm   r\   r]   r^   r_   r   r'   ©r4   rc   rt   r\   r]   r^   r_   r   r7   r   Úprocess_response_paramsI  sJ   

û






ÿ


ûz6ClientPerMessageDeflateFactory.process_response_params)FFNTN)r\   r"   r]   r"   r^   r<   r_   r`   r'   rn   r)   r*   )r)   ra   )rc   re   rt   ru   r)   r   )	rW   rX   rY   rZ   r   r[   r5   rs   r€   r   r   r   r   r     s    ú
 r   Ú
extensionsú*Optional[Sequence[ClientExtensionFactory]]ú Sequence[ClientExtensionFactory]c                 C  s:   | du rg } t dd„ | D ƒƒst| ƒtddid�g } | S )zÃ
    Enable Per-Message Deflate with default settings in client extensions.

    If the extension is already present, perhaps with non-default settings,
    the configuration isn't changed.

    Nc                 s  ó   � | ]	}|j tj kV  qd S rV   )r[   r   )r   Úextension_factoryr   r   r   rz   ¿  ó
   € 
ÿ
ÿz3enable_client_permessage_deflate.<locals>.<genexpr>ÚmemLevelé   )r'   )r}   Úlistr   ©r�   r   r   r   r   ³  s   
þÿÿr   c                   @  s:   e Zd ZdZedƒZ						dddd„Zddd„ZdS )r   a�  
    Server-side extension factory for the Per-Message Deflate extension.

    Parameters behave as described in `section 7.1 of RFC 7692`_.

    .. _section 7.1 of RFC 7692: https://www.rfc-editor.org/rfc/rfc7692.html#section-7.1

    Set them to :obj:`True` to include them in the negotiation offer without a
    value or to an integer value to include them with this value.

    Args:
        server_no_context_takeover: prevent server from using context takeover.
        client_no_context_takeover: prevent client from using context takeover.
        server_max_window_bits: maximum size of the server's LZ77 sliding window
            in bits, between 8 and 15.
        client_max_window_bits: maximum size of the client's LZ77 sliding window
            in bits, between 8 and 15.
        compress_settings: additional keyword arguments for :func:`zlib.compressobj`,
            excluding ``wbits``.
        require_client_max_window_bits: do not enable compression at all if
            client doesn't advertise support for ``client_max_window_bits``;
            the default behavior is to enable compression without enforcing
            ``client_max_window_bits``.

    r    FNr\   r"   r]   r^   r<   r_   r'   rn   Úrequire_client_max_window_bitsr)   r*   c                 C  s¬   |du sd|  krdkst dƒ‚ t dƒ‚|du s,d|  kr'dks,t dƒ‚ t dƒ‚|dur8d|v r8t dƒ‚|du rB|rBt dƒ‚|| _|| _|| _|| _|| _|| _dS )	ro   Nr   r+   rp   rq   r,   zLcompress_settings must not include wbits, set server_max_window_bits insteadzVrequire_client_max_window_bits is enabled, but client_max_window_bits isn't configured)rr   r\   r]   r^   r_   r'   r‹   )r4   r\   r]   r^   r_   r'   r‹   r   r   r   r5   è  s,   ÿÿÿÿ
z'ServerPerMessageDeflateFactory.__init__rc   re   rt   ru   ú2Tuple[List[ExtensionParameter], PerMessageDeflate]c                   s   t ‡ fdd„|D ƒƒrt dˆ j› �¡‚t|dd�\}}}}ˆ jr%|s%d}ˆ jr,|s,d}ˆ jdu r2n|du r:ˆ j}n|ˆ jkrBˆ j}ˆ jdu rO|du rNˆ j}n|du r\ˆ j	r[t d¡‚n|du rdˆ j}nˆ j|k rlˆ j}t
||||ƒt|||pxd|p{dˆ jƒfS )	zi
        Process request parameters.

        Return response params and an extension instance.

        c                 3  rv   rV   rw   rx   r7   r   r   rz     r{   zHServerPerMessageDeflateFactory.process_request_params.<locals>.<genexpr>zskipped duplicate Tr|   Nzrequired client_max_window_bitsr+   )r}   r   r~   r[   rm   r\   r]   r^   r_   r‹   rd   r   r'   r   r   r7   r   Úprocess_request_params  s\   
û


€
ÿ
üûùz5ServerPerMessageDeflateFactory.process_request_params)FFNNNF)r\   r"   r]   r"   r^   r<   r_   r<   r'   rn   r‹   r"   r)   r*   )rc   re   rt   ru   r)   rŒ   )rW   rX   rY   rZ   r   r[   r5   r�   r   r   r   r   r   Ë  s    ù#r   ú*Optional[Sequence[ServerExtensionFactory]]ú Sequence[ServerExtensionFactory]c                 C  s>   | du rg } t dd„ | D ƒƒst| ƒtddddid�g } | S )zÃ
    Enable Per-Message Deflate with default settings in server extensions.

    If the extension is already present, perhaps with non-default settings,
    the configuration isn't changed.

    Nc                 s  r„   rV   )r[   r   )r   Úext_factoryr   r   r   rz   ‰  r†   z3enable_server_permessage_deflate.<locals>.<genexpr>é   r‡   rˆ   )r^   r_   r'   )r}   r‰   r   rŠ   r   r   r   r   }  s   
þýÿr   )
r\   r"   r]   r"   r^   r<   r_   r`   r)   ra   )rc   re   rf   r"   r)   rg   )r�   r‚   r)   rƒ   )r�   rŽ   r)   r�   ) Ú
__future__r   rE   r.   Útypingr   r   r   r   r   r   r	   Ú r   r   r   r   Úbaser   r   r   Ú__all__rG   Úrangerj   r   rd   rm   r   r   r   r   r   r   r   r   Ú<module>   s(    $ 

= 
1 3