U
    ½){fÒ  ã                   @  s†   d dl mZ d dlZ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ZG d	d
„ d
ƒZG dd„ deƒZG dd„ deƒZeZdS )é    )ÚannotationsN)Úpartial)ÚCallableÚDicté   )Ú	TaskGroup)ÚASGIFrameworkÚScopeé
   c                   @  sD   e Zd Zdddœdd„Zdddddœd	d
„Zdddddœdd„ZdS )Ú_DispatcherMiddlewarezDict[str, ASGIFramework]ÚNone)ÚmountsÚreturnc                 C  s
   || _ d S ©N)r   )Úselfr   © r   ú^/var/www/html/Darija-Ai-API/env/lib/python3.8/site-packages/hypercorn/middleware/dispatcher.pyÚ__init__   s    z_DispatcherMiddleware.__init__r	   r   ©ÚscopeÚreceiveÚsendr   c                 Ã  s¤   |d dkr"|   |||¡I d H  n~| j ¡ D ]H\}}|d  |¡r,|d t|ƒd … pXd|d< ||||ƒI d H   S q,|dddgdœƒI d H  |dd	iƒI d H  d S )
NÚtypeZlifespanÚpathú/zhttp.response.starti”  )s   content-lengthó   0)r   ÚstatusÚheaderszhttp.response.body)Ú_handle_lifespanr   ÚitemsÚ
startswithÚlen)r   r   r   r   r   Úappr   r   r   Ú__call__   s    ýÿ
z_DispatcherMiddleware.__call__c                 Ã  s   d S r   r   )r   r   r   r   r   r   r   r   "   s    z&_DispatcherMiddleware._handle_lifespanN)Ú__name__Ú
__module__Ú__qualname__r   r#   r   r   r   r   r   r      s   r   c                   @  s4   e Zd Zdddddœdd„Zddddd	œd
d„ZdS )ÚAsyncioDispatcherMiddlewarer	   r   r   r   c           	      Ã  sÒ   dd„ | j D ƒ| _dd„ | j D ƒ| _dd„ | j D ƒ| _tt ¡ ƒ4 I d H šx}| j  ¡ D ]*\}}| ||| j| j	t
| j||ƒ¡ qV|ƒ I d H }| j ¡ D ]}| |¡I d H  q˜|d dkr‚q¾q‚W 5 Q I d H R X d S )Nc                 S  s   i | ]}|t  t¡“qS r   )ÚasyncioÚQueueÚMAX_QUEUE_SIZE©Ú.0r   r   r   r   Ú
<dictcomp>(   s     z@AsyncioDispatcherMiddleware._handle_lifespan.<locals>.<dictcomp>c                 S  s   i | ]
}|d “qS ©Fr   r+   r   r   r   r-   +   s      c                 S  s   i | ]
}|d “qS r.   r   r+   r   r   r   r-   ,   s      r   úlifespan.shutdown)r   Ú
app_queuesÚstartup_completeÚshutdown_completer   r(   Úget_event_loopr   ÚspawnÚgetr   r   ÚvaluesÚput)	r   r   r   r   Z
task_groupr   r"   ÚmessageÚqueuer   r   r   r   '   s$    ÿ
üz,AsyncioDispatcherMiddleware._handle_lifespanÚstrÚdict©r   r   r8   r   c                 Ã  sr   |d dkr8d| j |< t| j  ¡ ƒrn|ddiƒI d H  n6|d dkrnd| j|< t| j ¡ ƒrn|ddiƒI d H  d S ©Nr   zlifespan.startup.completeTzlifespan.shutdown.complete©r1   Úallr6   r2   ©r   r   r   r8   r   r   r   r   >   s    

z AsyncioDispatcherMiddleware.sendN©r$   r%   r&   r   r   r   r   r   r   r'   &   s   r'   c                   @  s4   e Zd Zdddddœdd„Zddddd	œd
d„ZdS )ÚTrioDispatcherMiddlewarer	   r   r   r   c           	      ƒ  sâ   dd l ‰ ‡ fdd„| jD ƒ| _dd„ | jD ƒ| _dd„ | jD ƒ| _ˆ  ¡ 4 I d H š€}| j ¡ D ].\}}| ||| j| d jt	| j
||ƒ¡ q^|ƒ I d H }| j ¡ D ]}|d  
|¡I d H  q¤|d dkrŽqÎqŽW 5 Q I d H R X d S )	Nr   c                   s   i | ]}|ˆ   t¡“qS r   )Zopen_memory_channelr*   r+   ©Útrior   r   r-   M   s      z=TrioDispatcherMiddleware._handle_lifespan.<locals>.<dictcomp>c                 S  s   i | ]
}|d “qS r.   r   r+   r   r   r   r-   N   s      c                 S  s   i | ]
}|d “qS r.   r   r+   r   r   r   r-   O   s      é   r   r/   )rD   r   r0   r1   r2   Zopen_nurseryr   Z
start_soonr   r   r   r6   )	r   r   r   r   Znurseryr   r"   r8   Zchannelsr   rC   r   r   J   s"    üz)TrioDispatcherMiddleware._handle_lifespanr:   r;   r<   c                 Ã  sr   |d dkr8d| j |< t| j  ¡ ƒrn|ddiƒI d H  n6|d dkrnd| j|< t| j ¡ ƒrn|ddiƒI d H  d S r=   r>   r@   r   r   r   r   a   s    

zTrioDispatcherMiddleware.sendNrA   r   r   r   r   rB   I   s   rB   )Ú
__future__r   r(   Ú	functoolsr   Útypingr   r   Zasyncio.task_groupr   r   r	   r*   r   r'   rB   ZDispatcherMiddlewarer   r   r   r   Ú<module>   s   ##