
    F2jt                        d dl mZ ddlmZmZ ddlmZ ddl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dS )    )annotations   )QuicStreamSenderRangeSet   )events)QuicErrorCodeQuicStopSendingFrame)QuicDeliveryStatec                      e Zd ZdS )FinalSizeErrorN__name__
__module____qualname__     W/home/thesage/.hermes/hermes-agent/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                  x    e Zd ZdZdZd d	Zd!dZd"dZ	 d#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| _        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__*   sY      (<! {{'+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_frame;   s,    !#,o
 
 
 	
r   intc                    | j         S N)r   r0   s    r   starting_offsetz"QuicStreamReceiver.starting_offsetB   s    !!r   Fframe_offset
frame_databytes	frame_fin events.StreamDataReceived | Nonec                6   || j         z
  }t          |          }||z   }| j        6|| j        k    rt          d          |r|| j        k    rt          d          |r|| _        || j        k    r|| _        |dk    r>|r<| j        s5| xj         |z  c_         |rd| _        t          j        ||| j	                  S |dk     r!|| d         }||z  }d}t          |          }||k    r| j
                            ||           |t          | j                  z
  }|dk    r| xj        t          |          z  c_        || 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#   )r   lenr   r   r   r   r   r   StreamDataReceivedr!   r    addr*   
_pull_data)
r+   r6   r7   r9   poscount	frame_endgapr=   r>   s
             r   handle_framezQuicStreamReceiver.handle_frameE   s    T//J 5(	 '4+++$%FGGG AyD,<<<$%?@@@ 	)(Dt***"+D !888dl8%' (#' ,I   
 77#SDEE*JCLC
OOE |##L\9555 C%%%77LLIcNN*LL*4S3;&'   '4+;;
 	$#D 	: 	,jDO    4r   )r/   
final_sizer/   events.StreamReset | Nonec                   | j         || j         k    rt          d          || j        k     rt          d          || _         || j        k    r|| _        d| _        t	          j        || j                  S )zX
        Handle an abrupt termination of the receiving part of the QUIC stream.
        Nr<   z3RESET_STREAM final size below already-received dataTr.   )r   r   r   r   r   StreamResetr!   )r+   rH   r/   s      r   handle_resetzQuicStreamReceiver.handle_reset   s     'J$:J,J,J !;<<<
 +++ !VWWW &+++",D!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+   r/   s     r   stopzQuicStreamReceiver.stop   s     !+ r   c                (   	 | 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shiftr8   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'   r2   )F)r6   r2   r7   r8   r9   r&   r'   r:   )rH   r2   r/   r2   r'   rI   )rM   r   r'   r(   )r/   r2   r'   r(   )r'   r8   )r   r   r   __doc__	__slots__r,   r1   r5   rG   r	   NO_ERRORrL   rP   rR   rB   r   r   r   r   r      s         
I1 1 1 1"
 
 
 
" " " " GL; ; ; ; ;| 5B4JT T T T T T,% % % % &3%; ! ! ! ! !     r   r   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^   r2   r`   r%   r&   writabler'   r(   c                    d| _         || _        || _        || _        t	          ||          | _        t          ||          | _        || _        d S )NF)r#   r%   )r#   rc   )	r]   r^   r_   r`   r   ra   r   rb   r#   )r+   r#   r^   r`   r%   rc   s         r   r,   zQuicStream.__init__   sV      %:"*?'&<#*YRRR&XNNN"r   c                2    | j         j        o| j        j        S r4   )ra   r   rb   r0   s    r   r   zQuicStream.is_finished   s    }(DT[-DDr   )Nr   r   TT)r#   r$   r^   r2   r`   r2   r%   r&   rc   r&   r'   r(   )r'   r&   )r   r   r   rY   r,   propertyr   r   r   r   r\   r\      sk        I !%%&&'# # # # #  E E E XE E Er   r\   N)
__future__r   _hazmatr   r    r   packetr	   r
   packet_builderr   	Exceptionr   r   r   r\   r   r   r   <module>rm      s>   " " " " " " 0 0 0 0 0 0 0 0              . - - - - -	 	 	 	 	Y 	 	 		 	 	 	 	) 	 	 	b b b b b b b bJE E E E E E E E E Er   