o
     dU                     @   sj   d dl mZmZ d dlmZmZmZ ddlmZm	Z	m
Z
mZ ddlmZmZ eddG dd	 d	eZd
S )    )	dataclassfield)AnyCallableMapping   )ClosedResourceErrorDelimiterNotFoundEndOfStreamIncompleteRead)AnyByteReceiveStreamByteReceiveStreamF)eqc                   @   s   e Zd ZU dZeed< ededZeed< edddZ	e
ed< dd
dZedefddZedeeeg ef f fddZddedefddZdedefddZdededefddZd	S )BufferedByteReceiveStreamz
    Wraps any bytes-based receive stream and uses a buffer to provide sophisticated receiving
    capabilities in the form of a byte stream.
    receive_streamF)initdefault_factory_buffer)r   default_closedreturnNc                    s   | j  I d H  d| _d S )NT)r   acloser   self r   A/usr/local/lib/python3.10/dist-packages/anyio/streams/buffered.pyr      s   
z BufferedByteReceiveStream.aclosec                 C   s
   t | jS )z"The bytes currently in the buffer.)bytesr   r   r   r   r   buffer   s   
z BufferedByteReceiveStream.bufferc                 C   s   | j jS N)r   extra_attributesr   r   r   r   r      s   z*BufferedByteReceiveStream.extra_attributes   	max_bytesc                    s   | j rt| jrt| jd | }| jd |= |S t| jtr)| j|I d H S | j I d H }t||krG| j	||d   |d | S |S r   )
r   r   r   r   
isinstancer   r   receivelenextend)r   r!   chunkr   r   r   r#       s   z!BufferedByteReceiveStream.receivenbytesc              
      s   	 |t | j }|dkr| jd| }| jd|= t|S zt| jtr/| j|I dH }n| j I dH }W n tyG } zt|d}~ww | j	| q)a-  
        Read exactly the given amount of bytes from the stream.

        :param nbytes: the number of bytes to read
        :return: the bytes read
        :raises ~anyio.IncompleteRead: if the stream was closed before the requested
            amount of bytes could be read from the stream

        Tr   N)
r$   r   r   r"   r   r   r#   r
   r   r%   )r   r'   	remainingretvalr&   excr   r   r   receive_exactly5   s$   
z)BufferedByteReceiveStream.receive_exactly	delimiterc           	   
      s   t |}d}	 | j||}|dkr(| jd| }| jd|t | = t|S t | j|kr3t|z
| j I dH }W n tyL } zt|d}~ww t	t | j| d d}| j
| q)aM  
        Read from the stream until the delimiter is found or max_bytes have been read.

        :param delimiter: the marker to look for in the stream
        :param max_bytes: maximum number of bytes that will be read before raising
            :exc:`~anyio.DelimiterNotFound`
        :return: the bytes read (not including the delimiter)
        :raises ~anyio.IncompleteRead: if the stream was closed before the delimiter
            was found
        :raises ~anyio.DelimiterNotFound: if the delimiter is not found within the
            bytes read up to the maximum allowed

        r   TN   )r$   r   findr   r	   r   r#   r
   r   maxr%   )	r   r,   r!   delimiter_sizeoffsetindexfounddatar*   r   r   r   receive_untilP   s(   z'BufferedByteReceiveStream.receive_until)r   N)r    )__name__
__module____qualname____doc__r   __annotations__r   	bytearrayr   r   boolr   propertyr   r   r   r   r   r   intr#   r+   r5   r   r   r   r   r      s   
 
 r   N)dataclassesr   r   typingr   r   r    r   r	   r
   r   abcr   r   r   r   r   r   r   <module>   s    