U
    g+                     @   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-u83us8q9/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rd	|kr|t| d	dd  }q| j}q(|d
r(d	|krt| 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rt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}|rd | _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}|rd | _||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   -  