o
    {gi[                     @   s  d Z ddlZddl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mZ er2ddlmZ dd	 ed
D ZG dd dZG dd dZdZdZdZdZdZeZdZdZdZdZdZ dZ!dZ"G dd deZ#G dd deZ$e$j%e$j&e$j'fZ(dZ)dZ*dZ+dZ,d Z-d!Z.d"Z/d"Z0e1d#dZ2G d$d% d%e3Z4G d&d' d'eZ5G d(d) d)eZ6G d*d+ d+eZ7d,e8d-e9d.e8fd/d0Z:G d1d2 d2Z;G d3d4 d4Z<G d5d6 d6Z=G d7d8 d8Z>dS )9zY
wsproto/frame_protocol
~~~~~~~~~~~~~~~~~~~~~~

WebSocket frame protocol implementation.
    N)getincrementaldecoderIncrementalDecoder)IntEnum)	GeneratorList
NamedTupleOptionalTupleTYPE_CHECKINGUnion   )	Extensionc                    s&   g | ] t  fd dtdD qS )c                 3   s    | ]}| A V  qd S N ).0abr   s/var/www/bot.gig.net.ua/public_html/telegram/P1/HellBot/venv/lib/python3.10/site-packages/wsproto/frame_protocol.py	<genexpr>       z<listcomp>.<genexpr>   )bytesrange)r   r   r   r   
<listcomp>   s   & r   r   c                   @   s0   e Zd ZdeddfddZdedefddZdS )	XorMaskerSimplemasking_keyreturnNc                 C   s
   || _ d S r   )_masking_key)selfr   r   r   r   __init__      
zXorMaskerSimple.__init__datac                 C   s   |rgt |}dd | jD \}}}}|d d d ||d d d< |dd d ||dd d< |dd d ||dd d< |dd d ||dd d< t|d }| j|d  | jd |  | _t|S |S )Nc                 s   s    | ]}t | V  qd S r   )
_XOR_TABLE)r   nr   r   r   r      r   z*XorMaskerSimple.process.<locals>.<genexpr>   r         )	bytearrayr   	translatelenr   )r   r"   
data_arrayr   r   cdkey_rotationr   r   r   process   s   zXorMaskerSimple.process)__name__
__module____qualname__r   r    r/   r   r   r   r   r      s    r   c                   @   s   e Zd ZdedefddZdS )XorMaskerNullr"   r   c                 C   s   |S r   r   r   r"   r   r   r   r/   .   s   zXorMaskerNull.processN)r0   r1   r2   r   r/   r   r   r   r   r3   -   s    r3   ~      }   i  l       @             c                   @   s6   e Zd ZdZdZdZdZdZdZdZ	de
fd	d
ZdS )Opcodez7
    RFC 6455, Section 5.2 - Base Framing Protocol
    r   r   r&      	   
   r   c                 C   s   t | d@ S )Nr>   )boolr   r   r   r   	iscontrol_   s   zOpcode.iscontrolN)r0   r1   r2   __doc__CONTINUATIONTEXTBINARYCLOSEPINGPONGrA   rC   r   r   r   r   r=   H   s    r=   c                   @   sH   e 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dZdS )CloseReasonz8
    RFC 6455, Section 7.4.1 - Defined Status Codes
      i  i  i  i  i  i  i  i  i  i  i  i  i  N)r0   r1   r2   rD   NORMAL_CLOSURE
GOING_AWAYPROTOCOL_ERRORUNSUPPORTED_DATANO_STATUS_RCVDABNORMAL_CLOSUREINVALID_FRAME_PAYLOAD_DATAPOLICY_VIOLATIONMESSAGE_TOO_BIGMANDATORY_EXTINTERNAL_ERRORSERVICE_RESTARTTRY_AGAIN_LATERTLS_HANDSHAKE_FAILEDr   r   r   r   rK   c   s     		rK   rL   i  i  i  i  i  z!Ic                       s0   e Zd Zejfdededdf fddZ  ZS )ParseFailedmsgcoder   Nc                    s   t  | || _d S r   )superr    r]   )r   r\   r]   	__class__r   r   r       s   
zParseFailed.__init__)r0   r1   r2   rK   rO   strr    __classcell__r   r   r_   r   r[      s    r[   c                   @   s&   e Zd ZU eed< eed< eed< dS )RsvBitsrsv1rsv2rsv3N)r0   r1   r2   rA   __annotations__r   r   r   r   rc      s   
 rc   c                   @   s:   e Zd ZU eed< eed< eed< eed< ee	 ed< dS )Headerfinrsvopcodepayload_lenr   N)
r0   r1   r2   rA   rg   rc   r=   intr   r   r   r   r   r   rh      s   
 rh   c                   @   s@   e Zd ZU eed< eeeee	ef f ed< e
ed< e
ed< dS )Framerk   payloadframe_finishedmessage_finishedN)r0   r1   r2   r=   rg   r   r   ra   r	   rm   rA   r   r   r   r   rn      s
   
 rn   r"   nbytesr   c                 C   s4   t | |kr| S | d | } | jdddd} | S )Nutf-8ignore)errors)r*   decodeencode)r"   rr   r   r   r   _truncate_utf8   s
   rx   c                   @   s   e Zd Zddee ddfddZdeddfddZd	edefd
dZd	edee fddZ	dddZ
dddZdefddZdS )BufferNinitial_bytesr   c                 C   s$   t  | _d| _|r| | d S d S Nr   )r(   buffer
bytes_usedfeed)r   rz   r   r   r   r       s
   zBuffer.__init__	new_bytesc                 C   s   |  j |7  _ d S r   )r|   )r   r   r   r   r   r~     s   zBuffer.feedrr   c                 C   s6   |st  S | j| j| j|  }|  jt|7  _|S r   )r(   r|   r}   r*   )r   rr   r"   r   r   r   consume_at_most  s
   zBuffer.consume_at_mostc                 C   s"   t | j| j |k rd S | |S r   )r*   r|   r}   r   )r   rr   r   r   r   consume_exactly  s   
zBuffer.consume_exactlyc                 C   s   | j d | j= d| _d S r{   )r|   r}   rB   r   r   r   commit  s   
zBuffer.commitc                 C   s
   d| _ d S r{   )r}   rB   r   r   r   rollback  r!   zBuffer.rollbackc                 C   s
   t | jS r   )r*   r|   rB   r   r   r   __len__  r!   zBuffer.__len__r   r   N)r0   r1   r2   r   r   r    r~   rm   r   r   r   r   r   r   r   r   r   ry      s    

ry   c                   @   s(   e Zd ZdddZdedefddZdS )	MessageDecoderr   Nc                 C   s   d | _ d | _d S r   )rk   decoderrB   r   r   r   r    "  s   
zMessageDecoder.__init__framec              
   C   s   |j  rJ | j d u r|j tju rtd|j | _ n|j tjur(td|j  |j tju r4td | _|jo9|j	}| jd u rC|j
}n)t|j
ttfsMJ z
| j|j
|}W n tyk } ztt|tjd }~ww t| j ||j|}|r}d | _ d | _|S )Nzunexpected CONTINUATIONzexpected CONTINUATION, got %rrs   )rk   rC   r=   rE   r[   rF   r   r   rp   rq   ro   
isinstancer   r(   rv   UnicodeDecodeErrorra   rK   rS   rn   )r   r   finishedr"   excr   r   r   process_frame&  s0   


zMessageDecoder.process_framer   )r0   r1   r2   r    rn   r   r   r   r   r   r   !  s    
r   c                   @   s   e Zd Z	ddedeed  ddfddZdeddfd	d
Zdee	 fddZ
defddZdededee fddZdedededdfddZdS )FrameDecoderNclient
extensionsr   r   c                 C   s:   || _ |pg | _t | _d | _d | _d | _d| _d| _d S r{   )	r   r   ry   r|   headereffective_opcodemaskerpayload_requiredpayload_consumedr   r   r   r   r   r   r    H  s   

zFrameDecoder.__init__r"   c                 C      | j | d S r   )r|   r~   r4   r   r   r   receive_bytesV     zFrameDecoder.receive_bytesc           	      C   sp  | j s	|  s	d S | j d usJ | jd usJ | jd usJ t| j| jk r(d S | j j| j }| j	|}|s?| j jdkr?d S | j
  |  jt|7  _| j| j jk}| j|}| jD ]}|| |}t|trotd||}q]|rt }| jD ]}|| | j j}t|trtd||d ur||7 }qz||7 }t| j||| j j}|rd | _ d | _d | _|S tj| _|S )Nr   error in extension)r   parse_headerr   r   r*   r|   r   rl   r   r   r   r/   r   frame_inbound_payload_datar   rK   r[   r(   frame_inbound_completeri   rn   r=   rE   )	r   payload_remainingro   r   	extensionpayload_finalresultr   r   r   r   process_bufferY  sN   






zFrameDecoder.process_bufferc           	      C   s  | j d}|d u r| j   dS t|d t@ }tt|d t@ t|d t@ t|d t@ }|d t	@ }zt
|}W n tyL   td|dw | rW|sWtdt|d t@ }|d t@ }| ||}|d u rv| j   dS | ||| |r| jrtd|s| jstd	|r| j d
}|d u r| j   dS t|| _nt | _| j   t||||d | _| jj| _| jj r|| _nd| _d| _dS )Nr&   Fr   zInvalid opcode z#xz)Invalid attempt to fragment control framer   z'client received unexpected masked framez)server received unexpected unmasked framer%   T)r|   r   r   rA   FIN_MASKrc   	RSV1_MASK	RSV2_MASK	RSV3_MASKOPCODE_MASKr=   
ValueErrorr[   rC   	MASK_MASKPAYLOAD_LEN_MASKparse_extended_payload_lengthextension_processingr   r   r   r3   r   rh   r   rk   r   r   r   )	r   r"   ri   rj   rk   has_maskpayload_len_shortrl   r   r   r   r   r     sX   






zFrameDecoder.parse_headerrk   rl   c                 C   s   |  r|tkrtd|tkr-| jd}|d u rd S td|\}|tkr+td|S |tkrT| jd}|d u r=d S td|\}|t	krLtd|d? rTtd	|S )
Nz$Control frame with payload len > 125r&   !Hz6Payload length used 2 bytes when 1 would have sufficedr>   !Qz6Payload length used 8 bytes when 2 would have sufficed?   z'8-byte payload length with non-zero MSB)
rC   MAX_PAYLOAD_NORMALr[   PAYLOAD_LENGTH_TWO_BYTEr|   r   structunpackPAYLOAD_LENGTH_EIGHT_BYTEMAX_PAYLOAD_TWO_BYTE)r   rk   rl   r"   r   r   r   r     s0   z*FrameDecoder.parse_extended_payload_lengthrj   c                 C   s~   g d}| j D ]#}|| |||}t|trtd|t|D ]
\}}|r)d||< qqt||D ]\}	}
|
r<|	s<tdq0d S )N)FFFr   TzReserved bit set unexpectedly)r   frame_inbound_headerr   rK   r[   	enumeratezip)r   rk   rj   rl   rsv_usedr   r   bitusedexpectedfoundr   r   r   r     s   


z!FrameDecoder.extension_processingr   )r0   r1   r2   rA   r   r   r    r   r   rn   r   r   r=   rm   r   rc   r   r   r   r   r   r   G  s8    

25
r   c                	   @   s"  e Zd Zdeded ddfddZdedefd	d
Zdee	e ddf fddZ
deddfddZdeeddf fddZd&de	e de	e defddZd'dedefddZd'dedefddZ	d(deeeef dedefddZded ed!edefd"d#Z	d(d!edededefd$d%ZdS ))FrameProtocolr   r   r   r   Nc                 C   sB   || _ dd |D | _t| j | j| _t | _|  | _d | _d S )Nc                 S      g | ]}|  r|qS r   enabledr   extr   r   r   r         z*FrameProtocol.__init__.<locals>.<listcomp>)	r   r   r   _frame_decoderr   _message_decoder_parse_more_gen_parse_more_outbound_opcoder   r   r   r   r      s   

zFrameProtocol.__init__r   c              
   C   s  |j }t|ttfsJ |stjdf}nlt|dkrtdt	d|d d \}|t
k s1|tkr5tdzt|}W n	 tyD   Y nw |tv rMtdt|tsZ|tkrZtdz|dd  d	}W n ty{ } z
td
t| tjd }~ww ||f}t|j||j|jS )N r   zCLOSE with 1 byte payloadr   r&   zCLOSE with invalid codez#remote CLOSE with local-only reasonz CLOSE with unknown reserved coders   zError decoding CLOSE reason: )ro   r   r   r(   rK   rQ   r*   r[   r   r   MIN_CLOSE_REASONMAX_CLOSE_REASONr   LOCAL_ONLY_CLOSE_REASONSMAX_PROTOCOL_CLOSE_REASONrv   r   ra   rS   rn   rk   rp   rq   )r   r   r"   r]   reasonr   r   r   r   _process_close  s:   
zFrameProtocol._process_closec                 c   sr    dd | j D | _ d}|s7| j }|d ur0|j s#| j|}n|jtjkr0| 	|}d}|V  |rd S d S )Nc                 S   r   r   r   r   r   r   r   r   !  r   z1FrameProtocol._parse_more_gen.<locals>.<listcomp>FT)
r   r   r   rk   rC   r   r   r=   rH   r   )r   closedr   r   r   r   r     s   


zFrameProtocol._parse_more_genr"   c                 C   r   r   )r   r   r4   r   r   r   r   0  r   zFrameProtocol.receive_bytesc                 c   s&    | j D ]}|d u r d S |V  qd S r   )r   )r   eventr   r   r   received_frames3  s   
zFrameProtocol.received_framesr]   r   c                 C   s   t  }|tju r
d }|d u r|rtd|tv rtj}|d ur9|t td|7 }|d ur9|t|	dt
d 7 }| tj|S )Nz&cannot specify a reason without a coder   rs   r&   )r(   rK   rQ   	TypeErrorr   rM   r   packrx   rw   r   _serialize_framer=   rH   )r   r]   r   ro   r   r   r   close:  s   
zFrameProtocol.close    ro   c                 C      |  tj|S r   )r   r=   rI   r   ro   r   r   r   pingK     zFrameProtocol.pingc                 C   r   r   )r   r=   rJ   r   r   r   r   pongN  r   zFrameProtocol.pongTri   c                 C   s~   t |tttfrtj}nt |trtj}|d}nt	d| j
d u r'|| _
n| j
|ur0tdtj}|r8d | _
| |||S )Nrs   zMust provide bytes or textz!Data type mismatch inside message)r   r   r(   
memoryviewr=   rG   ra   rF   rw   r   r   r   rE   r   )r   ro   ri   rk   r   r   r   	send_dataQ  s   


zFrameProtocol.send_datarj   rk   c                 C   sJ   t |d> }t |jd> t |jd>  t |jd>  }t |}||B |B S )N         r%   )rm   rd   re   rf   )r   ri   rj   rk   fin_bitsrsv_bitsopcode_bitsr   r   r   _make_fin_rsv_opcodeh  s   *z"FrameProtocol._make_fin_rsv_opcodec                 C   s  t ddd}t| jD ]}|| ||||\}}q| |||}t|}d}|tkr/|}	d }
n|tkr8t}	|}
nt	}	|}
d}| j
rE|	dO }	t||	g}|
d urn| rWtd|rd|ttd|
7 }n
|ttd|
7 }| j
rtd}t|}|| || S || S )NFTr8   z"payload too long for control framer   r   r%   )rc   reversedr   frame_outboundr   r*   r   r   r   r   r   r(   rC   r   r   r   osurandomr   r/   )r   rk   ro   ri   rj   r   fin_rsv_opcodepayload_lengthquad_payloadfirst_payloadsecond_payloadr   r   r   r   r   r   r   o  s:   
zFrameProtocol._serialize_frame)NN)r   )r   T)r0   r1   r2   rA   r   r    rn   r   r   r   r   r   r   r   rm   ra   r   r   r   r   r(   r   rc   r=   r   r   r   r   r   r   r     s8    ! 
r   )?rD   r   r   codecsr   r   enumr   typingr   r   r   r   r	   r
   r   r   r   r   r#   r   r3   r   r   r   r   MAX_PAYLOAD_EIGHT_BYTEMAX_FRAME_PAYLOADr   r   r   r   r   r   r   r=   rK   rQ   rR   rZ   r   r   MIN_PROTOCOL_CLOSE_REASONr   MIN_LIBRARY_CLOSE_REASONMAX_LIBRARY_CLOSE_REASONMIN_PRIVATE_CLOSE_REASONMAX_PRIVATE_CLOSE_REASONr   r   	NULL_MASK	Exceptionr[   rc   rh   rn   r   rm   rx   ry   r   r   r   r   r   r   r   <module>   sb    $Y$& (