
    mbi.                        d dl mZ ddlmZ ddlmZ ddlmZmZm	Z	m
Z
 ddlmZ  G d d	e          Z G d
 de          Z G d d          Z G d d          Z G d d          ZdS )    )annotations   )RangeSet   )events)QuicErrorCodeQuicResetStreamFrameQuicStopSendingFrameQuicStreamFrame)QuicDeliveryStatec                      e Zd ZdS )FinalSizeErrorN__name__
__module____qualname__     _/var/www/html/mdtn/previsions/meteo_cartes/venv/lib/python3.11/site-packages/qh3/quic/stream.pyr   r              Dr   r   c                      e Zd ZdS )StreamFinishedErrorNr   r   r   r   r   r      r   r   r   c                  t    e Zd ZdZdZdd	ZddZd dZd!dZe	j
        dd"dZd#dZe	j
        fd$dZd%dZdS )&QuicStreamReceiverz
    The receive part of a QUIC stream.

    It finishes:
    - immediately for a send-only stream
    - upon reception of a STREAM_RESET frame
    - upon reception of a data frame with the FIN bit set
    )	highest_offsetis_finishedstop_pending_buffer_buffer_start_final_size_ranges
_stream_id_stop_error_code	stream_id
int | NonereadableboolreturnNonec                    d| _         d| _        d| _        t                      | _        d| _        d | _        t                      | _        || _	        d | _
        d S )Nr   F)r   r   r   	bytearrayr   r   r    r   r!   r"   r#   )selfr$   r&   s      r   __init__zQuicStreamReceiver.__init__,   sU     ! {{'+zz#,0r   r
   c                F    d| _         t          | j        | j                  S )NF
error_coder$   )r   r
   r#   r"   r,   s    r   get_stop_framez!QuicStreamReceiver.get_stop_frame8   s,    !#,o
 
 
 	
r   intc                    | j         S N)r   r1   s    r   starting_offsetz"QuicStreamReceiver.starting_offset?   s    !!r   framer    events.StreamDataReceived | Nonec                   |j         | j        z
  }t          |j                  }|j         |z   }| j        ;|| j        k    rt          d          |j        r|| j        k    rt          d          |j        r|| _        || j        k    r|| _        |dk    rM|rK| j        sD| xj        |z  c_        |j        rd| _	        t          j        |j        |j        | j                  S |dk     r;|j        | d         |_        |xj         |z  c_         d}t          |j                  }||j         k    r | j                            |j         |           |t          | j                  z
  }|dk    r| xj        t          |          z  c_        |j        | j        |||z   <   |                                 }| j        | j        k    }|rd| _	        |s|rt          j        ||| j                  S dS )z2
        Handle a frame of received data.
        NzData received beyond final sizeCannot change final sizer   T)data
end_streamr$   )offsetr   lenr;   r    r   finr   r   r   r   StreamDataReceivedr"   r!   addr+   
_pull_data)r,   r7   poscount	frame_endgapr;   r<   s           r   handle_framezQuicStreamReceiver.handle_frameB   s%    lT//EJL5(	 '4+++$%FGGG AyD,<<<$%?@@@9 	)(Dt***"+D !888dl8%'y (#' ,ZEI   
 77SDEE*EJLLCLLC
OOE u|##LU\9555 C%%%77LLIcNN*LL*/*S3;&'   '4+;;
 	$#D 	: 	,jDO    4r   )r0   
final_sizer0   events.StreamReset | Nonec                   | j         || j         k    rt          d          || _         d| _        t          j        || j                  S )zX
        Handle an abrupt termination of the receiving part of the QUIC stream.
        Nr:   Tr/   )r    r   r   r   StreamResetr"   )r,   rH   r0   s      r   handle_resetzQuicStreamReceiver.handle_reset}   sS     'J$:J,J,J !;<<< &!Z4?SSSSr   deliveryr   c                8    |t           j        k    r	d| _        dS dS )z8
        Callback when a STOP_SENDING is ACK'd.
        TN)r   ACKEDr   r,   rM   s     r   on_stop_sending_deliveryz+QuicStreamReceiver.on_stop_sending_delivery   s)     (... $D /.r   c                "    || _         d| _        dS )zH
        Request the peer stop sending data on the QUIC stream.
        TN)r#   r   r,   r0   s     r   stopzQuicStreamReceiver.stop   s     !+ r   bytesc                (   	 | j         d         d         | j        k    }n# t          $ r d}Y nw xY w|sdS | j                                         }|d         |d         z
  }t	          | j        d|                   }| j        d|= |d         | _        |S )z;
        Remove data from the front of the buffer.
        r   Fr   r   N)r!   r   
IndexErrorshiftrU   r   )r,   has_data_to_readrrC   r;   s        r   rB   zQuicStreamReceiver._pull_data   s    	%#|Aq1T5GG 	% 	% 	%$	% 	3L  dQqTkT\$3$'((L#qTs    ..N)r$   r%   r&   r'   r(   r)   )r(   r
   r(   r3   )r7   r   r(   r8   )rH   r3   r0   r3   r(   rI   rM   r   r(   r)   r0   r3   r(   r)   )r(   rU   )r   r   r   __doc__	__slots__r-   r2   r6   rG   r   NO_ERRORrL   rQ   rT   rB   r   r   r   r   r      s         
I
1 
1 
1 
1
 
 
 
" " " "9 9 9 9x 5B4JT T T T T T% % % % &3%; ! ! ! ! !     r   r   c                  l    e Zd ZdZdZd d	Zed!d            Z	 d"d#dZd$dZ	d%dZ
d&dZd'dZd(d)dZdS )*QuicStreamSenderz
    The send part of a QUIC stream.

    It finishes:
    - immediately for a receive-only stream
    - upon acknowledgement of a STREAM_RESET frame
    - upon acknowledgement of a data frame with the FIN bit set
    )buffer_is_emptyr   r   reset_pending_ackedr   _buffer_finr   _buffer_stop_pending_pending_eof_reset_error_coder"   send_buffer_emptyr$   r%   writabler'   r(   r)   c                   d| _         d| _        | | _        d| _        t	                      | _        t                      | _        d | _        d| _	        d| _
        t	                      | _        d| _        d | _        || _        d S )NTr   F)rc   r   r   rd   r   re   r+   r   rf   r   rg   rh   ri   rj   r"   )r,   r$   rl   s      r   r-   zQuicStreamSender.__init__   sx    #'<"jj {{'+ 

!-1#r   r3   c                X    	 | j         d         d         S # t          $ r
 | j        cY S w xY w)z
        The offset for the next frame to send.

        This is used to determine the space needed for the frame's `offset` field.
        r   )rh   rW   rg   r1   s    r   next_offsetzQuicStreamSender.next_offset   sC    	%=#A&& 	% 	% 	%$$$$	%s    ))Nmax_size
max_offsetQuicStreamFrame | Nonec                   	 | j         d         }n># t          $ r1 | j        rd| _        t          d| j                  cY S d| _        Y dS w xY w|d         }t          |d         ||z             }|||k    r|}||k    rdS t          t          | j        || j	        z
  || j	        z
                     |          }| j         
                    ||           || j        k    r|| _        | j        |k    rd|_        d| _        |S )z.
        Get a frame of data to send.
        r   FT)r?   r=   Nr   )r;   r=   )rh   rW   ri   r   rf   rc   minrU   r   r   subtractr   r?   )r,   rp   rq   rZ   startrT   r7   s          r   	get_framezQuicStreamSender.get_frame   sR   		a AA 	 	 	  J$)!&48HIIIIII#'D 44	 !1Q4)**!dZ&7&7D5==4  UT%77$AS:SST  	
 
 
 	ud+++ $%%%"&D t##EI %Ds    .A A
Ar	   c                R    d| _         t          | j        | j        | j                  S )NF)r0   rH   r$   )rd   r	   rj   r   r"   r1   s    r   get_reset_framez QuicStreamSender.get_reset_frame  s2    "#-*o
 
 
 	
r   rM   r   rv   rT   c                   d| _         |t          j        k    r||k    r}| j                            ||           | j        d         }|d         | j        k    rD|d         |d         z
  }| j                                         | xj        |z  c_        | j        d|= | j        | j        k    r	d| _	        dS dS ||k    r| j
                            ||           || j        k    rd| _        d| _        dS dS )z3
        Callback when sent data is ACK'd.
        Fr   r   NT)rc   r   rO   re   rA   r   rX   r   rf   r   rh   rk   ri   )r,   rM   rv   rT   first_rangesizes         r   on_data_deliveryz!QuicStreamSender.on_data_delivery  s     %(...e||t,,,"k!nq>T%777&q>KN:DK%%'''&&$.&&UdU+!T%555#'    65 e||!!%...t''').&$(!!! ('r   c                F    |t           j        k    r	d| _        dS d| _        dS )z1
        Callback when a reset is ACK'd.
        TN)r   rO   r   rd   rP   s     r   on_reset_deliveryz"QuicStreamSender.on_reset_delivery4  s/     (...#D!%Dr   r0   c                B    | j         || _         d| _        d| _        dS dS )z
        Abruptly terminate the sending part of the QUIC stream.

        Once this method has been called, any further calls to it
        will have no effect.
        NT)rj   rd   rc   rS   s     r   resetzQuicStreamSender.reset>  s5     !)%/D"!%D $(D    *)r   Fr;   rU   r<   c                F   | j         
J d            | j        
J d            t          |          }|rOd| _        | j                            | j        | j        |z              | xj        |z  c_        | xj        |z  c_        |rd| _        | j        | _         d| _        dS dS )z;
        Write some data bytes to the QUIC stream.
        Nzcannot call write() after FINz!cannot call write() after reset()FT)	rf   rj   r>   rc   rh   rA   rg   r   ri   )r,   r;   r<   r|   s       r   writezQuicStreamSender.writeL  s     '')H'''%--/R---4yy 	&#(D Md/1BT1IJJJLLD LL% 	%#(D #0D $D	% 	%r   )r$   r%   rl   r'   r(   r)   r[   r5   )rp   r3   rq   r%   r(   rr   )r(   r	   )rM   r   rv   r3   rT   r3   r(   r)   r\   r]   )F)r;   rU   r<   r'   r(   r)   )r   r   r   r^   r_   r-   propertyro   rw   ry   r}   r   r   r   r   r   r   rb   rb      s         I"$ $ $ $  	% 	% 	% X	% 7;, , , , ,\
 
 
 
) ) ) )6& & & &( ( ( (% % % % % % %r   rb   c                  >    e Zd ZdZ	 	 	 	 	 dddZedd            ZdS )
QuicStream)
is_blockedmax_stream_data_localmax_stream_data_local_sentmax_stream_data_remotereceiversenderr$   Nr   Tr$   r%   r   r3   r   r&   r'   rl   r(   r)   c                    d| _         || _        || _        || _        t	          ||          | _        t          ||          | _        || _        d S )NF)r$   r&   )r$   rl   )	r   r   r   r   r   r   rb   r   r$   )r,   r$   r   r   r&   rl   s         r   r-   zQuicStream.__init__j  sV      %:"*?'&<#*YRRR&XNNN"r   c                2    | j         j        o| j        j        S r5   )r   r   r   r1   s    r   r   zQuicStream.is_finishedz  s    }(DT[-DDr   )Nr   r   TT)r$   r%   r   r3   r   r3   r&   r'   rl   r'   r(   r)   )r(   r'   )r   r   r   r_   r-   r   r   r   r   r   r   r   _  sk        I !%%&&'# # # # #  E E E XE E Er   r   N)
__future__r   _hazmatr    r   packetr   r	   r
   r   packet_builderr   	Exceptionr   r   r   rb   r   r   r   r   <module>r      s}   " " " " " "                        . - - - - -	 	 	 	 	Y 	 	 		 	 	 	 	) 	 	 	S S S S S S S Slp% p% p% p% p% p% p% p%fE E E E E E E E E Er   