o
    .jt                     @  s   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	 d	eZG d
d deZG dd dZG dd dZdS )    )annotations   )QuicStreamSenderRangeSet   )events)QuicErrorCodeQuicStopSendingFrame)QuicDeliveryStatec                   @     e Zd ZdS )FinalSizeErrorN__name__
__module____qualname__ r   r   D/home/thesage/.local/lib/python3.10/site-packages/qh3/quic/stream.pyr          r   c                   @  r   )StreamFinishedErrorNr   r   r   r   r   r      r   r   c                   @  sv   e Zd ZdZdZd(d	d
Zd)ddZd*ddZ	d+d,ddZe	j
dd-ddZd.d!d"Ze	j
fd/d#d$Zd0d%d&Zd'S )1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                 C  s@   d| _ | | _d| _t | _d| _d | _t | _|| _	d | _
d S )Nr   F)r   r   r   	bytearrayr   r   r   r   r   r   r   )selfr   r!   r   r   r   __init__*   s   
zQuicStreamReceiver.__init__r	   c                 C  s   d| _ t| j| jdS )NF
error_coder   )r   r	   r   r   r&   r   r   r   get_stop_frame;   s
   z!QuicStreamReceiver.get_stop_frameintc                 C  s   | j S N)r   r*   r   r   r   starting_offsetB   s   z"QuicStreamReceiver.starting_offsetFframe_offset
frame_databytes	frame_fin events.StreamDataReceived | Nonec           
      C  sX  || j  }t|}|| }| jdur&|| jkrtd|r&|| jkr&td|r+|| _|| jkr3|| _|dkrQ|rQ| jsQ|  j |7  _ |rHd| _tj||| j	dS |dk rf|| d }||8 }d}t|}||krq| j
|| |t| j }|dkr|  jt|7  _|| j||| < |  }| j | jk}	|	rd| _|s|	rtj||	| j	d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&   r/   r0   r2   poscount	frame_endgapr5   r6   r   r   r   handle_frameE   sN   



zQuicStreamReceiver.handle_frame)r)   
final_sizer)   events.StreamReset | Nonec                C  sZ   | j dur|| j krtd|| jk rtd|| _ || jkr"|| _d| _tj|| jdS )zX
        Handle an abrupt termination of the receiving part of the QUIC stream.
        Nr4   z3RESET_STREAM final size below already-received dataTr(   )r   r   r   r   r   StreamResetr   )r&   r@   r)   r   r   r   handle_reset   s   

zQuicStreamReceiver.handle_resetdeliveryr
   c                 C  s   |t jkr
d| _dS dS )z8
        Callback when a STOP_SENDING is ACK'd.
        TN)r
   ACKEDr   )r&   rD   r   r   r   on_stop_sending_delivery   s   

z+QuicStreamReceiver.on_stop_sending_deliveryc                 C  s   || _ d| _dS )zH
        Request the peer stop sending data on the QUIC stream.
        TN)r   r   )r&   r)   r   r   r   stop   s   
zQuicStreamReceiver.stopc                 C  s~   z| j d d | jk}W n ty   d}Y nw |sdS | j  }|d |d  }t| jd| }| jd|= |d | _|S )z;
        Remove data from the front of the buffer.
        r   F    r   N)r   r   
IndexErrorshiftr1   r   )r&   has_data_to_readrr;   r5   r   r   r   r:      s   

zQuicStreamReceiver._pull_dataN)r   r    r!   r"   r#   r$   )r#   r	   )r#   r,   )F)r/   r,   r0   r1   r2   r"   r#   r3   )r@   r,   r)   r,   r#   rA   )rD   r
   r#   r$   )r)   r,   r#   r$   )r#   r1   )r   r   r   __doc__	__slots__r'   r+   r.   r?   r   NO_ERRORrC   rF   rG   r:   r   r   r   r   r      s    	


>
r   c                   @  s4   e Zd ZdZ					ddddZed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    rR   r,   rT   r!   r"   writabler#   r$   c                 C  s>   d| _ || _|| _|| _t||d| _t||d| _|| _d S )NF)r   r!   )r   rW   )	rQ   rR   rS   rT   r   rU   r   rV   r   )r&   r   rR   rT   r!   rW   r   r   r   r'      s   
zQuicStream.__init__c                 C  s   | j jo| jjS r-   )rU   r   rV   r*   r   r   r   r      s   zQuicStream.is_finished)Nr   r   TT)r   r    rR   r,   rT   r,   r!   r"   rW   r"   r#   r$   )r#   r"   )r   r   r   rN   r'   propertyr   r   r   r   r   rP      s    rP   N)
__future__r   _hazmatr   r    r   packetr   r	   packet_builderr
   	Exceptionr   r   r   rP   r   r   r   r   <module>   s     &