o
    ;i0                     @   s  d dl Z d dlmZmZmZmZmZmZmZ d dl	m
Z
 ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZ erJddlmZ ddlmZ ded ddfddZdee j dee jdf dee jdf fddZG dd dZe Zeded f ZG dd deZ dS )    N)TYPE_CHECKINGSet
CollectionMappingDictAnyOptional)chain   )Status)_service_name)Stream   )HealthCheckRequestHealthCheckResponse)
HealthBase)	CheckBase)
ICheckablechecksr   returnz+HealthCheckResponse.ServingStatus.ValueTypec                 C   s4   dd | D }|d hkrt jS |dhkrt jS t jS )Nc                 S   s   h | ]}|  qS  )
__status__).0checkr   r   J/home/ubuntu/.local/lib/python3.10/site-packages/grpclib/health/service.py	<setcomp>   s    z_status.<locals>.<setcomp>T)r   UNKNOWNSERVINGNOT_SERVING)r   statusesr   r   r   _status   s   

r    eventswaitszasyncio.Task[bool]c                 C   sJ   i }| D ]}| |}|d u s| r|  t| }|||< q|S N)getdoneclearasyncioensure_futurewait)r!   r"   	new_waitseventr)   r   r   r   _reset_waits   s   

r,   c                   @   s"   e Zd Zdeeef fddZdS )_Overallr   c                 C   s   dd iS )Nz//r   )selfr   r   r   __mapping__/   s   z_Overall.__mapping__N)__name__
__module____qualname__r   strr   r/   r   r   r   r   r-   -   s    r-   r   c                   @   s\   e Zd ZdZddee ddfddZdeee	f ddfdd	Z
deee	f ddfd
dZdS )HealthaW  Health-checking service

    Example:

    .. code-block:: python3

        from grpclib.health.service import Health

        auth = AuthService()
        billing = BillingService()

        health = Health({
            auth: [redis_status],
            billing: [db_check],
        })

        server = Server([auth, billing, health])

    Nr   r   c                 C   sP   |d u r	t g i}nt |vrt|}tt| |t < dd | D | _d S )Nc                 S   s   i | ]\}}t |t|qS r   )r   set)r   s
check_listr   r   r   
<dictcomp>T   s    z#Health.__init__.<locals>.<dictcomp>)OVERALLdictlistr	   from_iterablevaluesitems_checks)r.   r   r   r   r   __init__M   s   
zHealth.__init__streamc                    s   |  I dH }|dusJ | j|j}|du r%|jtjdI dH  dS t|dkr9|t	t	j
dI dH  dS |D ]	}| I dH  q;|t	t|dI dH  dS )z&Implements synchronous periodic checksNstatusr   )recv_messager?   r$   servicesend_trailing_metadatar   	NOT_FOUNDlensend_messager   r   	__check__r    )r.   rA   requestr   r   r   r   r   CheckW   s   zHealth.Checkc           	   
      sd  |  I d H }|d usJ | j|j}|d u r/|ttjdI d H  	 tdI d H  q&t	|dkrK|ttj
dI d H  	 tdI d H  qBg }|D ]}|| I d H  qOt|i }z.|tt|dI d H  	 tj| tjdI d H  t||}|tt|dI d H  qpt||D ]\}}||I d H  q| D ]
}| s|  qw )NrB   Ti  r   )return_when)rD   r?   r$   rE   rI   r   SERVICE_UNKNOWNr'   sleeprH   r   append__subscribe__r,   r    r)   r=   FIRST_COMPLETEDzip__unsubscribe__r%   cancel)	r.   rA   rK   r   r!   r   r"   r+   r)   r   r   r   Watchl   sT   


zHealth.Watchr#   )r0   r1   r2   __doc__r   _ChecksConfigr@   r   r   r   rL   rV   r   r   r   r   r4   9   s    



r4   )!r'   typingr   r   r   r   r   r   r   	itertoolsr	   constr   utilsr   serverr   v1.health_pb2r   r   v1.health_grpcr   r   r   _typingr   r    Eventr,   r-   r9   rX   r4   r   r   r   r   <module>   s6    $

