o
    NK&h                     @  s~   d dl mZ d dlmZmZ d dlmZmZ d dl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 )    )annotations)CallableMapping)	dataclassfield)Any   )ClosedResourceErrorDelimiterNotFoundEndOfStreamIncompleteRead)AnyByteReceiveStreamByteReceiveStreamF)eqc                   @  s   e Zd ZU dZded< ededZded< edddZd	ed
< d!ddZ	e
d"ddZe
d#ddZd$d%ddZd&ddZd'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.
    r   receive_streamF)initdefault_factory	bytearray_buffer)r   defaultbool_closedreturnNonec                   s   | j  I d H  d| _d S )NT)r   acloser   self r   I/var/www/html/venv/lib/python3.10/site-packages/anyio/streams/buffered.pyr      s   
z BufferedByteReceiveStream.aclosebytesc                 C  s
   t | jS )z"The bytes currently in the buffer.)r    r   r   r   r   r   buffer   s   
z BufferedByteReceiveStream.bufferMapping[Any, Callable[[], Any]]c                 C  s   | j jS N)r   extra_attributesr   r   r   r   r$      s   z*BufferedByteReceiveStream.extra_attributes   	max_bytesintc                   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_exactly8   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   r2   r&   delimiter_sizeoffsetindexfounddatar0   r   r   r   receive_untilS   s(   z'BufferedByteReceiveStream.receive_untilN)r   r   )r   r    )r   r"   )r%   )r&   r'   r   r    )r-   r'   r   r    )r2   r    r&   r'   r   r    )__name__
__module____qualname____doc____annotations__r   r   r   r   r   propertyr!   r$   r)   r1   r;   r   r   r   r   r      s   
 

r   N)
__future__r   collections.abcr   r   dataclassesr   r   typingr    r	   r
   r   r   abcr   r   r   r   r   r   r   <module>   s    