o
    Įæi  ć                   @   s   d Z ddlZG dd dZdS )z¦
ASGI lifespan protocol manager.

Manages startup and shutdown events for ASGI applications,
enabling frameworks like FastAPI to run initialization and
cleanup code.
é    Nc                   @   sB   e Zd ZdZdddZdd Zdd Zd	d
 Zdd Zdd Z	dS )ŚLifespanManageraI  Manages ASGI lifespan events (startup/shutdown).

    The lifespan protocol allows ASGI applications to run code at
    startup and shutdown. This is essential for applications that
    need to initialize database connections, caches, or other
    resources.

    ASGI lifespan messages:
    - Server sends: {"type": "lifespan.startup"}
    - App responds: {"type": "lifespan.startup.complete"} or
                    {"type": "lifespan.startup.failed", "message": "..."}
    - Server sends: {"type": "lifespan.shutdown"}
    - App responds: {"type": "lifespan.shutdown.complete"}
    Nc                 C   s^   || _ || _|dur|ni | _t ” | _t ” | _d| _d| _d| _	t 
” | _d| _d| _dS )zĄInitialize the lifespan manager.

        Args:
            app: ASGI application callable
            logger: Logger instance
            state: Shared state dict for the application
        NF)ŚappŚloggerŚstateŚasyncioŚEventŚ_startup_completeŚ_shutdown_completeŚ_startup_failedŚ_startup_errorŚ_shutdown_errorŚQueueŚ_receive_queueŚ_taskŚ_app_finished)Śselfr   r   r   © r   śJ/home/ubuntu/.local/lib/python3.10/site-packages/gunicorn/asgi/lifespan.pyŚ__init__    s   



zLifespanManager.__init__c                 Ć   sÄ   dddd| j d}| j ddi”I dH  t |  |””| _ztj| j 	” d	d
I dH  W n tj
yB   | jr>| j ”  tdw | jrZ| jrN| j ”  | jpRd}td| | j d” dS )zRun lifespan startup and wait for completion.

        Raises:
            RuntimeError: If startup fails or app doesn't support lifespan
        Ślifespanz3.0z2.4)ŚversionŚspec_version)ŚtypeŚasgir   r   zlifespan.startupNē      >@©ŚtimeoutzLifespan startup timed outzUnknown errorzLifespan startup failed: zASGI lifespan startup complete)r   r   Śputr   Ścreate_taskŚ_run_lifespanr   Śwait_forr   ŚwaitŚTimeoutErrorŚcancelŚRuntimeErrorr
   r   r   Śdebug)r   ŚscopeŚmsgr   r   r   Śstartup5   s.   żž
ż

zLifespanManager.startupc                 Ć   sŌ   | j r| j d” dS | j ddi”I dH  ztj| j ” ddI dH  W n tj	y6   | j 
d” Y nw | jrB| j d| j” | jrb| j ” sb| j ”  z| jI dH  W n
 tjya   Y nw | j d	” dS )
zjSignal shutdown and wait for completion.

        This should be called during graceful shutdown.
        zASGI lifespan already finishedNr   zlifespan.shutdownr   r   zLifespan shutdown timed outzLifespan shutdown error: %szASGI lifespan shutdown complete)r   r   r%   r   r   r   r    r	   r!   r"   Śwarningr   Śerrorr   Śdoner#   ŚCancelledError©r   r   r   r   ŚshutdownZ   s.   ž’
’zLifespanManager.shutdownc              
   Ć   s*  ztz|   || j| j”I dH  W nC tjy     tyS } z/| j d|” | j 	” s:d| _
t|| _| j ”  n| j 	” sIt|| _| j ”  W Y d}~nd}~ww W d| _| j 	” shd| _
d| _| j ”  | j 	” st| j ”  dS dS d| _| j 	” sd| _
d| _| j ”  | j 	” s| j ”  w w )zRun the ASGI lifespan protocol.NzLifespan application raised: %sTz*Application exited before startup complete)r   Ś_receiveŚ_sendr   r,   Ś	Exceptionr   r%   r   Śis_setr
   Śstrr   Śsetr	   r   r   )r   r&   Śer   r   r   r   |   sB   




ö


’ś


’zLifespanManager._run_lifespanc                 Ć   s   | j  ” I dH S )z#ASGI receive callable for lifespan.N)r   Śgetr-   r   r   r   r/      s   zLifespanManager._receivec                 Ć   sĄ   |d }|dkr| j  ”  | j d” dS |dkr3d| _| dd”| _| j  ”  | j d| j” dS |d	krD| j ”  | j d
” dS |dkr^| dd”| _| j ”  | j d| j” dS dS )z ASGI send callable for lifespan.r   zlifespan.startup.completez"Received lifespan.startup.completezlifespan.startup.failedTŚmessageŚ z$Received lifespan.startup.failed: %szlifespan.shutdown.completez#Received lifespan.shutdown.completezlifespan.shutdown.failedz%Received lifespan.shutdown.failed: %sN)	r   r4   r   r%   r
   r6   r   r	   r   )r   r7   Śmsg_typer   r   r   r0      s,   

’

’żzLifespanManager._send)N)
Ś__name__Ś
__module__Ś__qualname__Ś__doc__r   r(   r.   r   r/   r0   r   r   r   r   r      s    
%"r   )r=   r   r   r   r   r   r   Ś<module>   s   