o
    4ήcH                     @   s   d dl Z d dlZd dl mZ d dlmZmZ d dlmZ er>d dlm	Z	m
Z
mZmZmZmZmZ eeef Zeeeee
f ZdZG dd dZdS )	    N)Queue)TYPE_CHECKINGUnion)Config)LifespanScopeLifespanShutdownCompleteEventLifespanShutdownEventLifespanShutdownFailedEventLifespanStartupCompleteEventLifespanStartupEventLifespanStartupFailedEventz2Got invalid state transition on lifespan protocol.c                   @   sP   e Zd ZdeddfddZdddZddd	Zdd
dZdddZdddZ	dS )
LifespanOnconfigreturnNc                 C   sZ   |j s|  || _td| _t | _t | _	t
 | _d| _d| _d| _d| _d S )Nzuvicorn.errorF)loadedloadr   logging	getLoggerloggerasyncioEventstartup_eventshutdown_eventr   receive_queueerror_occuredstartup_failedshutdown_failedshould_exit)selfr    r   :/tmp/pip-target-vg8gfxp4/lib/python/uvicorn/lifespan/on.py__init__    s   



zLifespanOn.__init__c                    s   | j d t }||  }ddi}| j|I d H  | j	 I d H  | j
s3| jr>| jjdkr>| j d d| _d S | j d d S )Nz Waiting for application startup.typezlifespan.startuponz$Application startup failed. Exiting.TzApplication startup complete.)r   infor   get_event_loopcreate_taskmainr   putr   waitr   r   r   lifespanerrorr   )r   loopmain_lifespan_taskr   r   r   r    startup.   s   
zLifespanOn.startupc                    s   | j rd S | jd ddi}| j|I d H  | j I d H  | js-| j r8| jj	dkr8| j
d d| _d S | jd d S )Nz!Waiting for application shutdown.r"   zlifespan.shutdownr#   z%Application shutdown failed. Exiting.TzApplication shutdown complete.)r   r   r$   r   r(   r   r)   r   r   r*   r+   r   )r   r   r   r   r    shutdown?   s   

zLifespanOn.shutdownc              
      s  zz| j j}d| j jddd}||| j| jI d H  W nI tyf } z=d | _d| _| js1| j	rCW Y d }~W | j
  | j  d S | j jdkrRd}| j| n
d}| jj||d	 W Y d }~nd }~ww W | j
  | j  d S W | j
  | j  d S | j
  | j  w )
Nr*   z2.0)versionspec_version)r"   asgiTautoz-ASGI 'lifespan' protocol appears unsupported.z!Exception in 'lifespan' protocol
)exc_info)r   
loaded_appasgi_versionreceivesendBaseExceptionr2   r   r   r   r   setr   r*   r   r$   r+   )r   appscopeexcmsgr   r   r    r'   O   s:   



zLifespanOn.mainmessageLifespanSendMessagec                    sV  |d dv s	J |d dkr(| j  rJ t| j r!J t| j   d S |d dkrY| j  r7J t| j r@J t| j   d| _|drW| j|d  d S d S |d dkrx| j  shJ t| j rqJ t| j  d S |d dkr| j  sJ t| j rJ t| j  d| _	|dr| j|d  d S d S d S )	Nr"   )lifespan.startup.completelifespan.startup.failedlifespan.shutdown.completelifespan.shutdown.failedrA   rB   Tr?   rC   rD   )
r   is_setSTATE_TRANSITION_ERRORr   r:   r   getr   r+   r   )r   r?   r   r   r    r8   f   s6   



zLifespanOn.sendLifespanReceiveMessagec                    s   | j  I d H S )N)r   rG   )r   r   r   r    r7      s   zLifespanOn.receive)r   N)r?   r@   r   N)r   rH   )
__name__
__module____qualname__r   r!   r.   r/   r'   r8   r7   r   r   r   r    r      s    



"r   )r   r   r   typingr   r   uvicornr   asgiref.typingr   r   r   r	   r
   r   r   rH   r@   rF   r   r   r   r   r    <module>   s"    $
