a
    h                     @  s   d dl mZ d dlZd dlmZmZmZ d dlmZm	Z	 d dl
mZmZ ddlmZmZmZmZ ddlmZmZmZmZmZmZ ejd	krd d
l
mZ nd d
lmZ eddG dd deZG dd deeZG dd deZdS )    )annotationsN)CallableIterableMapping)	dataclassfield)AnySupportsIndex   )ClosedResourceErrorDelimiterNotFoundEndOfStreamIncompleteRead)AnyByteReceiveStreamAnyByteStreamAnyByteStreamConnectableByteReceiveStream
ByteStreamByteStreamConnectable)      )overrideF)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dZ	e
ddddZe
ddddZdddddZd%dddddZddddd Zddd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Nonereturnc                   s   | j  I d H  d| _d S )NT)r   acloser!   self r(   R/var/www/html/assistant/venv/lib/python3.9/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.bufferzMapping[Any, Callable[[], Any]]c                 C  s   | j jS N)r   extra_attributesr&   r(   r(   r)   r-   ,   s    z*BufferedByteReceiveStream.extra_attributeszIterable[SupportsIndex])datar$   c                C  s   | j | dS )a;  
        Append data directly into the buffer.

        Any data in the buffer will be consumed by receive operations before receiving
        anything from the wrapped stream.

        :param data: the data to append to the buffer (can be bytes or anything else
            that supports ``__index__()``)

        N)r   extend)r'   r.   r(   r(   r)   	feed_data0   s    z#BufferedByteReceiveStream.feed_data   int)	max_bytesr$   c                   s   | j r
t| jr2t| jd | }| jd |= |S t| jtrP| j|I d H S | j I d H }t||kr| j	||d   |d | S |S d S r,   )
r!   r   r   r*   
isinstancer   r   receivelenr/   )r'   r3   chunkr(   r(   r)   r5   =   s    z!BufferedByteReceiveStream.receive)nbytesr$   c              
     s   |t | j }|dkr8| jd| }| jd|= t|S z4t| jtrZ| j|I dH }n| j I dH }W n* ty } zt|W Y d}~n
d}~0 0 | j	| q dS )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

        r   N)
r6   r   r*   r4   r   r   r5   r   r   r/   )r'   r8   	remainingretvalr7   excr(   r(   r)   receive_exactlyR   s    z)BufferedByteReceiveStream.receive_exactly)	delimiterr3   r$   c           	   
     s   t |}d}| j||}|dkrL| jd| }| jd|t | = t|S t | j|krbt|z| j I dH }W n* ty } zt|W Y d}~n
d}~0 0 t	t | j| d d}| j
| qdS )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   N   )r6   r   findr*   r   r   r5   r   r   maxr/   )	r'   r=   r3   Zdelimiter_sizeoffsetindexfoundr.   r;   r(   r(   r)   receive_untilm   s    z'BufferedByteReceiveStream.receive_untilN)r1   )__name__
__module____qualname____doc____annotations__r   r   r   r!   r%   propertyr+   r-   r0   r5   r<   rD   r(   r(   r(   r)   r      s   
r   c                      sL   e Zd ZdZdd fddZedddd	Zed
ddddZ  ZS )BufferedByteStreamz
    A full-duplex variant of :class:`BufferedByteReceiveStream`. All writes are passed
    through to the wrapped stream as-is.
    r   )streamc                   s   t  | || _dS )z:
        :param stream: the stream to be wrapped

        N)super__init___streamr'   rL   	__class__r(   r)   rN      s    zBufferedByteStream.__init__r"   r#   c                   s   | j  I d H  d S r,   )rO   send_eofr&   r(   r(   r)   rS      s    zBufferedByteStream.send_eofr*   )itemr$   c                   s   | j |I d H  d S r,   )rO   send)r'   rT   r(   r(   r)   rU      s    zBufferedByteStream.send)	rE   rF   rG   rH   rN   r   rS   rU   __classcell__r(   r(   rQ   r)   rK      s   rK   c                   @  s,   e Zd ZddddZeddddZd	S )
BufferedConnectabler   connectablec                 C  s
   || _ dS )z>
        :param connectable: the connectable to wrap

        NrX   )r'   rY   r(   r(   r)   rN      s    zBufferedConnectable.__init__rK   r#   c                   s   | j  I d H }t|S r,   )rY   connectrK   rP   r(   r(   r)   rZ      s    zBufferedConnectable.connectN)rE   rF   rG   rN   r   rZ   r(   r(   r(   r)   rW      s   rW   )
__future__r   syscollections.abcr   r   r   Zdataclassesr   r   typingr   r	    r   r   r   r   abcr   r   r   r   r   r   version_infor   Ztyping_extensionsr   rK   rW   r(   r(   r(   r)   <module>   s    	
{