o
    ߥi2                     @   s   d dl Z d dlZd dlmZmZmZmZmZmZ ddl	m
Z
 ddlmZmZmZmZmZ ddlmZ ddlmZmZ G d	d
 d
ee ZG dd deeeef ZG dd deZdeeeegee f gee f deegef fddZdS )    N)AnyAsyncGeneratorAsyncIterator	AwaitableCallableMutableMapping   )Headers)ASGIAppScopeReceiveSendMessage   )Request)ResponseStreamingResponsec                   @   s@   e Zd ZdddZdeddfddZddd	Zdefd
dZdS )
PipeStreamreturnNc                 C   s   t jdd| _d| _d S )Nr   )maxsizeF)asyncioQueue_queue_pushed_eofself r   I/home/ubuntu/.local/lib/python3.10/site-packages/baize/asgi/middleware.py__init__   s   
zPipeStream.__init__chunkc                    s&   | j rtd| j|I d H  d S )Nz!Cannot push chunk after push EOF.)r   RuntimeErrorr   putr   r   r   r   r   push   s   zPipeStream.pushc                    s   d| _ d S )NT)r   r   r   r   r   push_eof   s   
zPipeStream.push_eofc                    s&   | j r| j rt| j I d H S N)r   r   emptyStopAsyncIterationgetr   r   r   r   	__anext__   s   zPipeStream.__anext__)r   N)__name__
__module____qualname__r   bytesr#   r$   r)   r   r   r   r   r      s
    

r   c                   @   sF   e Zd ZdededdfddZdeddfddZdee fd	d
Z	dS )NextRequestnamevaluer   Nc                 C   s   || j |< d S r%   _scope)r   r/   r0   r   r   r   __setitem__&   s   zNextRequest.__setitem__c                 C   s   | j |= d S r%   r1   )r   r/   r   r   r   __delitem__)   s   zNextRequest.__delitem__c                 C   s   t d)Nz'Cannot read request body in middleware.)r    r   r   r   r   stream,   s   zNextRequest.stream)
r*   r+   r,   strr   r3   r4   r   r-   r5   r   r   r   r   r.   %   s    r.   c                   @   s@   e Zd ZdZdeedf fddZedede	dd fdd	Z
dS )
NextResponsez3
    This is a response object for middleware.
    r   Nc                 C  s"   | j 2 z	3 d H W }|V  q6 d S r%   )iterabler"   r   r   r   render_stream5   s   zNextResponse.render_streamapprequestc                    sL   dt  t  dtddf fdd}|||j|I dH  t S )zc
        This is a helper method to convert a ASGI application into a NextResponse object.
           messager   Nc                    s~   | d dkr| d t dd | dg D d S | d dkr; | dd	I d H  | d
ds=  I d H  d S d S d S )Ntypezhttp.response.startstatusc                 S   s$   g | ]\}}| d | d fqS )zlatin-1)decode).0kvr   r   r   
<listcomp>H   s    z7NextResponse.from_app.<locals>.send.<locals>.<listcomp>headerszhttp.response.bodybody    	more_bodyF)r	   r(   r#   r$   )r=   rF   rE   status_coder   r   sendB   s   
z#NextResponse.from_app.<locals>.send)r	   r   r   _receiver7   )clsr:   r;   rK   r   rI   r   from_app9   s   zNextResponse.from_app)r*   r+   r,   __doc__r   r-   r9   classmethodr
   r.   rN   r   r   r   r   r7   0   s
    r7   handlerr   c                    s$   t  dtdtf fdd}|S )a  
    This can turn a callable object into a middleware for ASGI application.

    ```python
    @middleware
    async def m(
        request: NextRequest, next_call: Callable[[NextRequest], Awaitable[NextResponse]]
    ) -> Response:
        ...
        response = await next_call(request)
        ...
        return response

    @m
    @request_response
    async def v(request: Request) -> Response:
        ...

    # OR

    @m
    async def asgi(scope: Scope, receive: Receive, send: Send) -> None:
        ...
    ```
    r:   r   c              	      s.   t  dtdtdtddf fdd}|S )z0
        This is the actual middleware.
        scopereceiverK   r   Nc                    sJ   t | ||}dt dtf fdd}||I d H }|| ||I d H  d S )Nr;   r   c                    s   t  | I d H S r%   )r7   rN   )r;   r:   r   r   	next_call   s   z6middleware.<locals>.d.<locals>.asgi.<locals>.next_call)r.   r7   )rR   rS   rK   r;   rU   response)r:   rQ   r   r   asgi|   s
   z#middleware.<locals>.d.<locals>.asgi)	functoolswrapsr   r   r   )r:   rW   rQ   rT   r   dv   s   "	zmiddleware.<locals>.d)rX   rY   r
   )rQ   r[   r   rZ   r   
middlewareV   s    r\   )r   rX   typingr   r   r   r   r   r   datastructuresr	   r
   r   r   r   r   requestsr   	responsesr   r   r-   r   r6   r.   r7   r\   r   r   r   r   <module>   s&     	&