a
    ñ»j(g  ã                   @  s  d dl mZ d dlZd dlmZ d dlmZmZ ddlm	Z	 ddl
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mZ g d¢ZdZdd„ eddƒD ƒZG dd„ deƒZddddddœdd„Zddddœdd„ZG dd „ d eƒZd!d"d#œd$d%„ZG d&d'„ d'eƒZ d(d)d#œd*d+„Z!dS ),é    )ÚannotationsN)ÚSequence)ÚAnyÚLiteralé   )Úframes)ÚDuplicateParameterÚInvalidParameterNameÚInvalidParameterValueÚNegotiationErrorÚPayloadTooBigÚProtocolError)Ú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   úNE:\soccer\ml_env\Lib\site-packages\websockets/extensions/permessage_deflate.pyÚ
<listcomp>   ó    r   é   é   c                   @  sh   e Zd ZdZedƒZddddddddœd	d
„Zddœdd„Zddœddddœdd„Zdddœdd„Z	dS )r   z)
    Per-Message Deflate extension.

    úpermessage-deflateNÚboolÚintzdict[Any, Any] | NoneÚNone)Úremote_no_context_takeoverÚlocal_no_context_takeoverÚremote_max_window_bitsÚlocal_max_window_bitsÚcompress_settingsÚreturnc                 C  sÆ   |du ri }|dv sJ ‚|dv s$J ‚d|  kr8dks>n J ‚d|  krRdksXn J ‚d|vsdJ ‚|| _ || _|| _|| _|| _| j sštj| j d�| _| js¼tjf d| j i| j¤Ž| _	d| _
dS )z?
        Configure the Per-Message Deflate extension.

        N)FTr    é   Úwbits©r-   F)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   ©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)   ©r5   r   r   r   Ú__repr__S   s    ÿþýüÿzPerMessageDeflate.__repr__)Úmax_sizezframes.Frameú
int | None)Úframer;   r+   c             
   C  sP  |j tjv r|S |j tju r4| js&|S |jrbd| _n.|js>|S |jsJd| _| jrbtj	| j
 d�| _|jr†t|jƒdk r†t|jƒt }n|j}|du r˜dn|}zP| j ||¡}| jjrÊ|dusÀJ ‚td|ƒ‚|jrêt|jƒdkrê| j t¡ W n2 tj�y } ztdƒ|‚W Y d}~n
d}~0 0 |j�r4| j�r4| `t |j ||jd|j|j¡S )z,
        Decode an incoming frame.

        FTr.   iü  Nr   zdecompression failed)Úopcoder   ÚCTRL_OPCODESÚOP_CONTr4   ÚfinZrsv1r&   r/   r0   r(   r1   ÚlenÚdataÚbytesÚ_EMPTY_UNCOMPRESSED_BLOCKÚ
decompressÚunconsumed_tailr   Úerrorr   ÚFrameÚrsv2Úrsv3)r5   r=   r;   rC   Ú
max_lengthÚexcr   r   r   Údecode\   sH    
 ùzPerMessageDeflate.decode)r=   r+   c                 C  sÒ   |j tjv r|S |j tjur>| jr>tjf d| j i| j¤Ž| _	| j	 
|j¡| j	 tj¡ }|jrž|dd… tkstJ ‚t|ƒdk rŽ|dd… }nt|ƒdd… }|jr®| jr®| `	t |j ||j|j tju|j|j¡S )z,
        Encode an outgoing frame.

        r-   éüÿÿÿNi   )r>   r   r?   r@   r'   r/   r2   r)   r*   r3   ÚcompressrC   ÚflushÚZ_SYNC_FLUSHrA   rE   rB   Ú
memoryviewrI   rJ   rK   )r5   r=   rC   r   r   r   Úencode¤   s2    ÿþ
ùzPerMessageDeflate.encode)N)
Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Únamer6   r:   rN   rT   r   r   r   r   r   !   s    ú*üHr   r#   r<   úint | Literal[True] | Nonezlist[ExtensionParameter])Úserver_no_context_takeoverÚclient_no_context_takeoverÚserver_max_window_bitsÚclient_max_window_bitsr+   c                 C  sd   g }| r|  d¡ |r |  d¡ |r6|  dt|ƒf¡ |du rJ|  d¡ n|r`|  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    


ra   úSequence[ExtensionParameter]z9tuple[bool, bool, int | None, int | Literal[True] | None])r`   Ú	is_serverr+   c                C  s  d}d}d}d}| D ]ê\}}|dkrJ|r0t |ƒ‚|du r>d}qþt||ƒ‚q|dkrx|r^t |ƒ‚|du rld}qþt||ƒ‚q|dkr®|dur�t |ƒ‚|tv r¢t|ƒ}qþt||ƒ‚q|dkrö|durÆt |ƒ‚|rØ|du rØd}qþ|tv rêt|ƒ}qþt||ƒ‚qt|ƒ‚q||||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   r
   Ú_MAX_WINDOW_BITS_VALUESr$   r	   )r`   rc   r[   r\   r]   r^   rY   Úvaluer   r   r   Ú_extract_parametersë   sJ    



ürf   c                   @  sR   e Zd ZdZedƒZdddddd	d
dœdd„Zddœdd„Zddd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://datatracker.ietf.org/doc/html/rfc7692#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<   rZ   údict[str, Any] | Noner%   )r[   r\   r]   r^   r*   r+   c                 C  sŽ   |du s&d|  krdks&n t dƒ‚|du sT|du sTd|  krJdksTn t dƒ‚|durld|v rlt 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*   )r5   r[   r\   r]   r^   r*   r   r   r   r6   B  s(    ÿþýýÿz'ClientPerMessageDeflateFactory.__init__rb   r7   c                 C  s   t | j| j| j| jƒS )z,
        Build request parameters.

        )ra   r[   r\   r]   r^   r9   r   r   r   Úget_request_paramsb  s    üz1ClientPerMessageDeflateFactory.get_request_paramsúSequence[Extension]r   ©r`   Úaccepted_extensionsr+   c                   sî   t ‡ fdd„|D ƒƒr&tdˆ j› �ƒ‚t|dd�\}}}}ˆ jrL|sLtdƒ‚ˆ jrZ|sZd}ˆ jdu rfn$|du rxtd	ƒ‚n|ˆ jkrŠtd
ƒ‚ˆ jdu r¦|durÔtdƒ‚n.ˆ jdu r²n"|du rÂˆ j}n|ˆ jkrÔtdƒ‚t|||pàd|pædˆ j	ƒS )zV
        Process response parameters.

        Return an extension instance.

        c                 3  s   | ]}|j ˆ j kV  qd S ©N©rY   ©r   Úotherr9   r   r   Ú	<genexpr>y  r   zIClientPerMessageDeflateFactory.process_response_params.<locals>.<genexpr>zreceived duplicate F©rc   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   rY   rf   r[   r\   r]   r^   r   r*   ©r5   r`   ro   r[   r\   r]   r^   r   r9   r   Úprocess_response_paramsn  sH    

û






ûz6ClientPerMessageDeflateFactory.process_response_params)FFNTN)	rU   rV   rW   rX   r   rY   r6   rl   rx   r   r   r   r   r   (  s        ú r   z'Sequence[ClientExtensionFactory] | Nonez Sequence[ClientExtensionFactory])Ú
extensionsr+   c                 C  s:   | du rg } t dd„ | D ƒƒs6t| ƒ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  s   | ]}|j tj kV  qd S rp   )rY   r   )r   Zextension_factoryr   r   r   rt   ä  s   ÿz3enable_client_permessage_deflate.<locals>.<genexpr>ÚmemLevelé   )r*   )rv   Úlistr   ©ry   r   r   r   r   Ø  s    
þÿÿr   c                	   @  sF   e Zd ZdZedƒZddddddddd	œd
d„Zddd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://datatracker.ietf.org/doc/html/rfc7692#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<   rg   r%   )r[   r\   r]   r^   r*   Úrequire_client_max_window_bitsr+   c                 C  s    |du s&d|  krdks&n t dƒ‚|du sLd|  krBdksLn t dƒ‚|durdd|v rdt dƒ‚|du rx|rxt dƒ‚|| _|| _|| _|| _|| _|| _dS )	rh   Nr    r,   ri   rj   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)rk   r[   r\   r]   r^   r*   r~   )r5   r[   r\   r]   r^   r*   r~   r   r   r   r6     s$    ÿÿz'ServerPerMessageDeflateFactory.__init__rb   rm   z2tuple[list[ExtensionParameter], PerMessageDeflate]rn   c                   sü   t ‡ fdd„|D ƒƒr&tdˆ j› �ƒ‚t|dd�\}}}}ˆ jrH|sHd}ˆ jrV|sVd}ˆ jdu rbn |du rrˆ j}n|ˆ jkr‚ˆ j}ˆ jdu rœ|du rÔˆ j}n8|du r´ˆ jrÔtdƒ‚n |du rÄˆ j}nˆ j|k rÔˆ j}t	||||ƒt
|||pìd|pòdˆ jƒfS )	zi
        Process request parameters.

        Return response params and an extension instance.

        c                 3  s   | ]}|j ˆ j kV  qd S rp   rq   rr   r9   r   r   rt   ;  r   zHServerPerMessageDeflateFactory.process_request_params.<locals>.<genexpr>zskipped duplicate Tru   Nzrequired client_max_window_bitsr,   )rv   r   rY   rf   r[   r\   r]   r^   r~   ra   r   r*   rw   r   r9   r   Úprocess_request_params0  sX    
û




üûùz5ServerPerMessageDeflateFactory.process_request_params)FFNNNF)rU   rV   rW   rX   r   rY   r6   r   r   r   r   r   r   ð  s         ù#r   z'Sequence[ServerExtensionFactory] | Nonez 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  s   | ]}|j tj kV  qd S rp   )rY   r   )r   Zext_factoryr   r   r   rt   ®  s   ÿz3enable_server_permessage_deflate.<locals>.<genexpr>é   rz   r{   )r]   r^   r*   )rv   r|   r   r}   r   r   r   r   ¢  s    
þýÿr   )"Ú
__future__r   r/   Úcollections.abcr   Útypingr   r   Ú r   Ú
exceptionsr   r	   r
   r   r   r   r   r   Úbaser   r   r   Ú__all__rE   Úrangerd   r   ra   rf   r   r   r   r   r   r   r   r   Ú<module>   s(     3= 1 3