U
    )–€hË+  ã                   @   sh   d Z ddlZddlmZmZmZ ddlmZmZm	Z	m
Z
mZ G dd„ dƒZG dd	„ d	eƒZejeiZdS )
z>
wsproto/extensions
~~~~~~~~~~~~~~~~~~

WebSocket extensions.
é    N)ÚOptionalÚTupleÚUnioné   )ÚCloseReasonÚFrameDecoderÚFrameProtocolÚOpcodeÚRsvBitsc                   @   sú   e Zd ZU eed< edœdd„Zeeef dœdd„Zee	eeef  dœdd	„Z
ed
dœdd„Zeeef eeeeeef dœdd„Zeeef eeeef dœdd„Zeeef eeeed
f dœdd„Zeeef eeeeeeef dœdd„Zd
S )Ú	ExtensionÚname©Úreturnc                 C   s   dS ©NF© ©Úselfr   r   ú6/tmp/pip-unpacked-wheel-apvau60e/wsproto/extensions.pyÚenabled   s    zExtension.enabledc                 C   s   d S ©Nr   r   r   r   r   Úoffer   s    zExtension.offer©r   r   c                 C   s   d S r   r   ©r   r   r   r   r   Úaccept   s    zExtension.acceptNc                 C   s   d S r   r   r   r   r   r   Úfinalize   s    zExtension.finalize©ÚprotoÚopcodeÚrsvÚpayload_lengthr   c                 C   s   t dddƒS r   )r
   )r   r   r   r   r   r   r   r   Úframe_inbound_header   s    zExtension.frame_inbound_header©r   Údatar   c                 C   s   |S r   r   ©r   r   r"   r   r   r   Úframe_inbound_payload_data&   s    z$Extension.frame_inbound_payload_data©r   Úfinr   c                 C   s   d S r   r   )r   r   r&   r   r   r   Úframe_inbound_complete+   s    z Extension.frame_inbound_complete©r   r   r   r"   r&   r   c                 C   s   ||fS r   r   )r   r   r   r   r"   r&   r   r   r   Úframe_outbound0   s    zExtension.frame_outbound)Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__Úboolr   r   r   r   r   r   r   r   r	   r
   Úintr   r    Úbytesr$   r'   r   r)   r   r   r   r   r      s4   


ú

 
þ
 þ

ùr   c                   @   s¨  e Zd ZdZdZdZd-eee eee ddœdd„Z	e
edœd	d
„ƒZejeddœdd
„ƒZe
edœdd„ƒZejeddœdd„ƒZeedœdd„Zedœdd„Zeeef dœdd„Zeddœdd„Zeeee ee f dœdd„Zeeedef dœdd„Zeeef eeeeeef dœd d!„Zeeef eeeef d"œd#d$„Zeeef eeeedf d%œd&d'„Zeeef eeeeeeef d(œd)d*„Z edœd+d,„Z!dS ).ÚPerMessageDeflatezpermessage-deflateé   FN)Úclient_no_context_takeoverÚclient_max_window_bitsÚserver_no_context_takeoverÚserver_max_window_bitsr   c                 C   sZ   || _ || _| j| _| j| _|d k	r*|| _|d k	r8|| _d | _d | _	d | _
d | _d| _d S r   )r4   r6   ÚDEFAULT_CLIENT_MAX_WINDOW_BITSÚ_client_max_window_bitsÚDEFAULT_SERVER_MAX_WINDOW_BITSÚ_server_max_window_bitsr5   r7   Ú_compressorÚ_decompressorÚ_inbound_is_compressibleÚ_inbound_compressedÚ_enabled)r   r4   r5   r6   r7   r   r   r   Ú__init__A   s    zPerMessageDeflate.__init__r   c                 C   s   | j S r   )r9   r   r   r   r   r5   \   s    z(PerMessageDeflate.client_max_window_bits)Úvaluer   c                 C   s"   |dk s|dkrt dƒ‚|| _d S ©Né	   r3   z.Window size must be between 9 and 15 inclusive)Ú
ValueErrorr9   ©r   rB   r   r   r   r5   `   s    c                 C   s   | j S r   )r;   r   r   r   r   r7   f   s    z(PerMessageDeflate.server_max_window_bitsc                 C   s"   |dk s|dkrt dƒ‚|| _d S rC   )rE   r;   rF   r   r   r   r7   j   s    )r   r   c                 C   s   |t jt jt jfkS r   )r	   ZTEXTZBINARYÚCONTINUATION)r   r   r   r   r   Ú_compressible_opcodep   s    z&PerMessageDeflate._compressible_opcodec                 C   s   | j S r   )r@   r   r   r   r   r   s   s    zPerMessageDeflate.enabledc                 C   s>   d| j  d| j g}| jr$| d¡ | jr4| d¡ d |¡S )Núclient_max_window_bits=%dúserver_max_window_bits=%dr4   r6   ú; )r5   r7   r4   Úappendr6   Újoin)r   Ú
parametersr   r   r   r   v   s    þ

zPerMessageDeflate.offerr   c                 C   sž   dd„ |  d¡D ƒ}|dd … D ]r}| d¡r6d| _q | d¡rHd| _q | d¡rnt|  d	d¡d  ¡ ƒ| _q | d
¡r t|  d	d¡d  ¡ ƒ| _q d| _d S )Nc                 S   s   g | ]}|  ¡ ‘qS r   ©Ústrip©Ú.0Úbr   r   r   Ú
<listcomp>„   s     z.PerMessageDeflate.finalize.<locals>.<listcomp>ú;r   r4   Tr6   r5   ú=r7   )	ÚsplitÚ
startswithr4   r6   r0   rP   r5   r7   r@   )r   r   ÚbitsÚbitr   r   r   r   ƒ   s    



zPerMessageDeflate.finalize)Úparamsr   c                 C   sÀ   d }d }dd„ |  d¡D ƒ}|dd … D ]Ž}| d¡r>d| _q(| d¡rPd| _q(| d¡r„d	|kr|t|  d	d¡d  ¡ ƒ}q¶| j}q(| d
¡r(d	|kr°t|  d	d¡d  ¡ ƒ}q(| j}q(||fS )Nc                 S   s   g | ]}|  ¡ ‘qS r   rO   rQ   r   r   r   rT   •   s     z3PerMessageDeflate._parse_params.<locals>.<listcomp>rU   r   r4   Tr6   r5   rV   r7   )rW   rX   r4   r6   r0   rP   r5   r7   )r   r[   r5   r7   rY   rZ   r   r   r   Ú_parse_params‘   s"    



zPerMessageDeflate._parse_paramsc                 C   sš   |   |¡\}}g }| jr"| d¡ | jr2| d¡ z<|d k	rP| d| ¡ || _|d k	rl| d| ¡ || _W n tk
r„   Y d S X d| _d |¡S d S )Nr4   r6   rI   rJ   TrK   )	r\   r4   rL   r6   r5   r7   rE   r@   rM   )r   r   r5   r7   rN   r   r   r   r   ¨   s"    


zPerMessageDeflate.acceptr   c                 C   s”   |j r| ¡ rtjS |j r*|tjkr*tjS |  |¡| _| jd krˆ|j | _| jrˆ| jsXt	‚|j
rf| j}n| j}| jd krˆt t|ƒ ¡| _tdddƒS )NTF)Zrsv1Z	iscontrolr   ZPROTOCOL_ERRORr	   rG   rH   r>   r?   ÚAssertionErrorÚclientr7   r5   r=   ÚzlibÚdecompressobjr0   r
   )r   r   r   r   r   rY   r   r   r   r    ¾   s    


z&PerMessageDeflate.frame_inbound_headerr!   c                 C   sR   | j r| js|S | jd k	st‚z| j t|ƒ¡W S  tjk
rL   tj	 Y S X d S r   )
r?   r>   r=   r]   Ú
decompressr1   r_   Úerrorr   ÚINVALID_FRAME_PAYLOAD_DATAr#   r   r   r   r$   Ù   s    z,PerMessageDeflate.frame_inbound_payload_datar%   c                 C   sš   |sd S | j sd | _d S | js(d | _d S | jd k	s6t‚z| j d¡}|| j ¡ 7 }W n tjk
rp   tj	 Y S X |j
r€| j}n| j}|r�d | _d | _|S )Ns     ÿÿ)r>   r?   r=   r]   ra   Úflushr_   rb   r   rc   r^   r6   r4   )r   r   r&   r"   Úno_context_takeoverr   r   r   r'   å   s*    z(PerMessageDeflate.frame_inbound_completer(   c                 C   sÎ   |   |¡s||fS |tjk	r0td|dd … žŽ }| jd krv|tjk	sHt‚|jrV| j}n| j}t	 
t	jt	jt|ƒ ¡| _| j t|ƒ¡}|rÆ|| j t	j¡7 }|d d… }|jr¶| j}n| j}|rÆd | _||fS )NTr   éüÿÿÿ)T)rH   r	   rG   r
   r<   r]   r^   r5   r7   r_   ÚcompressobjÚZ_DEFAULT_COMPRESSIONÚDEFLATEDr0   Úcompressr1   rd   ÚZ_SYNC_FLUSHr4   r6   )r   r   r   r   r"   r&   rY   re   r   r   r   r)     s0    


  ÿz PerMessageDeflate.frame_outboundc                 C   sR   d| j  g}| jr| d¡ | d| j ¡ | jr<| d¡ d | jjd |¡¡S )NrI   r4   rJ   r6   z<{} {}>rK   )	r5   r4   rL   r7   r6   ÚformatÚ	__class__r*   rM   )r   Údescrr   r   r   Ú__repr__,  s    

zPerMessageDeflate.__repr__)FNFN)"r*   r+   r,   r   r8   r:   r/   r   r0   rA   Úpropertyr5   Úsetterr7   r	   rH   r   r   r-   r   r   r   r\   r   r   r   r
   r   r    r1   r$   r'   r)   ro   r   r   r   r   r2   ;   sd       ûú 

ú
 
þ
 þ!

ù(r2   )Ú__doc__r_   Útypingr   r   r   Zframe_protocolr   r   r   r	   r
   r   r2   r   ÚSUPPORTED_EXTENSIONSr   r   r   r   Ú<module>   s   -  