a
    $Df                   	   @  s  d Z ddlmZ ddlZddlmZ ddlZddlZddlZddl	Z	ddl
Z
ddlZddlmZmZmZmZmZmZmZmZmZmZmZ ddl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 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$ ddlm%Z% ddlm&Z& ddlm'Z' e(e)Z*dZ+dZ,dZ-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8d Z9d!d"d#d$d%Z:d&d'd(d)d*Z;d+d'd,d-d.Z<d+d'd'd/d0d1Z=d+d"d,d2d3Z>G d4d5 d5e?d5d6ej@ZAG d7d+ d+eBZCd+d8d,d9d:ZDd+d;d<d=d>d?ZEd+d;d@d=dAdBZFd+dCdCdDdEdFZGd+dCdGdDdHdIZHd+dJd'd"d8dKdLdMZId+d@d,dNdOZJd+dJdPd@dQdRdSZKd+d@d,dTdUZLd+d;d@d=dVdWZMG dXdY dYejNZOG dZd[ d[eBZPd!d+dPd\d]d^d_ZQdd!d+d`dadPdbdcdddedfZRd!d+dgdhdidjdkZSd!d+dadldmdndodpZTd+dqd,drdsZUd+d8d,dtduZVd!d+d"dvdwdxdyZWd!d+dmd8dwdzd{ZXd!d+d`d\dldld8d|d}d~ZYd!d+d`d\dPdld8d|ddZZd+dvd,ddZ[d!d+ddgd8dddZ\d`dddddZ]d!d+ddddddZ^d!d+ddddddZ_d!d+ddddddZ`d!d+ddddddZad!d+ddddddZbd!d+d'd"dddZcd!d+ddddddZdd!ddddvddddZeejfG dd dejgZhG dd deBZiddd8dddZjdd"ddddZkdd"dddddZldd8d,ddZmddvd,ddZndd8d,ddZodd!dvdddZpdd8d,ddZqdd8d,ddZrddddŜddǄZsdd8d,ddɄZtdd8dʜdd̄ZuddddϜddфZvG ddӄ dejwZxdddddddvddלddلZydS )z+Service-side implementation of gRPC Python.    )annotationsN)futures)AnyCallableIterableIteratorListMappingOptionalSequenceSetTupleUnion)_common)_compression)_interceptor)cygrpc)ArityAgnosticMethodHandler)ChannelArgumentType)DeserializingFunction)MetadataType)NullaryCallbackType)ResponseType)SerializingFunction)ServerCallbackTag)ServerTagCallbackTypeshutdownrequest_callreceive_close_on_serversend_initial_metadatareceive_messagesend_messagez$send_initial_metadata * send_messagesend_status_from_serverz/send_initial_metadata * send_status_from_serveropenclosed	cancelledg      ?g    eAcygrpc.BaseEventbytes)request_eventreturnc                 C  s   | j d  S Nr   )batch_operationsmessage)r(    r-   Y/nfs/NAS7/SABIOD/METHODE/ermites/ermites_venv/lib/python3.9/site-packages/grpc/_server.py_serialized_requestR   s    r/   grpc.StatusCodezcygrpc.StatusCodecoder)   c                 C  s    t j| }|d u rtjjS |S N)r   Z!STATUS_CODE_TO_CYGRPC_STATUS_CODEgetr   
StatusCodeunknown)r2   Zcygrpc_coder-   r-   r.   _application_codeV   s    r7   	_RPCState)stater)   c                 C  s    | j d u rtjjS t| j S d S r3   )r2   r   r5   okr7   r9   r-   r-   r.   _completion_code[   s    
r<   )r9   r2   r)   c                 C  s   | j d u r|S t| j S d S r3   )r2   r7   )r9   r2   r-   r-   r.   _abortion_codeb   s    
r=   c                 C  s   | j d u rdS | j S )N    )detailsr;   r-   r-   r.   _detailsk   s    r@   c                   @  s   e Zd ZdS )_HandlerCallDetailsN)__name__
__module____qualname__r-   r-   r-   r.   rA   o   s   
rA   )methodinvocation_metadatac                   @  s   e Zd ZU ded< ded< ee Zded< ded< d	ed
< ded< d	ed< ded< ded< ded< d	ed< ded< ded< d	ed< dd ZdS )r8   zcontextvars.Contextcontextzthreading.Condition	conditionr   requeststrclientboolinitial_metadata_allowedOptional[grpc.Compression]compression_algorithmdisable_next_compressionOptional[MetadataType]trailing_metadatazOptional[grpc.StatusCode]r2   Optional[bytes]r?   statusedzList[Exception]
rpc_errorsz#Optional[List[NullaryCallbackType]]	callbacksabortedc                 C  sh   t  | _t | _t | _d | _t	| _
d| _d | _d| _d | _d | _d | _d| _g | _g | _d| _d S NTF)contextvarsContextrG   	threading	ConditionrH   setduerI   _OPENrK   rM   rO   rP   rR   r2   r?   rT   rU   rV   rW   selfr-   r-   r.   __init__   s    

z_RPCState.__init__N)rB   rC   rD   __annotations__r   rJ   r^   rb   r-   r-   r-   r.   r8   |   s    
Nonec                 C  s   t  }| j| |d S r3   )grpcZRpcErrorrU   append)r9   Z	rpc_errorr-   r-   r.   _raise_rpc_error   s    rg   rJ   r   )r9   tokenr)   c                 C  s6   | j | t| s.| j s.| j}d | _| |fS dS d S )NNr-   )r^   remove_is_rpc_state_activerV   )r9   rh   rV   r-   r-   r.   _possibly_finish_call   s    rl   r   c                   s    fdd}|S )Nc                   s4    j  t W  d    S 1 s&0    Y  d S r3   )rH   rl   )Z$unused_send_status_from_server_eventr9   rh   r-   r.   r"      s    z9_send_status_from_server.<locals>.send_status_from_serverr-   )r9   rh   r"   r-   rm   r.   _send_status_from_server   s    rn   rQ   )r9   metadatar)   c                 C  s   | j l | jrRt| jf}|d u r6|W  d    S |t| W  d    S n|W  d    S W d    n1 sx0    Y  d S r3   )rH   rO   r   Z!compression_algorithm_to_metadatatuple)r9   ro   Zcompression_metadatar-   r-   r.   _get_initial_metadata   s    rq   zcygrpc.Operationc                 C  s   t t| |t}|S r3   )r   ZSendInitialMetadataOperationrq   _EMPTY_FLAGS)r9   ro   	operationr-   r-   r.   _get_initial_metadata_operation   s    
rt   cygrpc.Call)r9   callr2   r?   r)   c                 C  s   | j turt| |}| jd u r"|n| j}| jrPt| d t| j||t	f}t
}nt| j||t	f}t}||t| | d| _| j| d S NT)rK   
_CANCELLEDr=   r?   rM   rt   r   SendStatusFromServerOperationrR   rr   8_SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN_SEND_STATUS_FROM_SERVER_TOKENstart_server_batchrn   rT   r^   add)r9   rv   r2   r?   Zeffective_codeZeffective_details
operationsrh   r-   r-   r.   _abort   s4    

	
r   c                   s    fdd}|S )Nc                   sd    j J | jd  rt _n jtu r.t _ j   t t	W  d    S 1 sV0    Y  d S r*   )
rH   r+   r%   rx   rK   r_   _CLOSED
notify_allrl   _RECEIVE_CLOSE_ON_SERVER_TOKEN)Zreceive_close_on_server_eventr;   r-   r.   r      s    

z9_receive_close_on_server.<locals>.receive_close_on_serverr-   )r9   r   r-   r;   r.   _receive_close_on_server   s    	r   Optional[DeserializingFunction])r9   rv   request_deserializerr)   c                   s    fdd}|S )Nc                   s   t | }|d u r\j4 jtu r(t_j  ttW  d    S 1 sP0    Y  nht	|}jF |d u rt
 tjjd n|_j  ttW  d    S 1 s0    Y  d S )Ns    Exception deserializing request!)r/   rH   rK   r_   r   r   rl   _RECEIVE_MESSAGE_TOKENr   Zdeserializer   r   r5   internalrI   )Zreceive_message_eventZserialized_requestrI   rv   r   r9   r-   r.   r      s*    

*
z)_receive_message.<locals>.receive_messager-   )r9   rv   r   r    r-   r   r.   _receive_message  s    r   c                   s    fdd}|S )Nc                   s4    j  t tW  d    S 1 s&0    Y  d S r3   )rH   rl   _SEND_INITIAL_METADATA_TOKEN)Z"unused_send_initial_metadata_eventr;   r-   r.   r   %  s    z5_send_initial_metadata.<locals>.send_initial_metadatar-   )r9   r   r-   r;   r.   _send_initial_metadata$  s    r   c                   s    fdd}|S )Nc                   s>    j $  j   t W  d    S 1 s00    Y  d S r3   )rH   r   rl   )Zunused_send_message_eventrm   r-   r.   r!   -  s    
z#_send_message.<locals>.send_messager-   )r9   rh   r!   r-   rm   r.   _send_message,  s    r   c                   @  sp  e Zd ZU ded< ded< ded< dddddd	Zd
dddZddddZddddZdd
dddZddddZ	ddddZ
ddddZd dd!d"Zd#dd$d%Zd&dd'd(Zd)dd*d+d,Zd-dd.d/d0Zd-dd1d2d3Zddd4d5Zd6ddd7d8d9Zd:dd;d<d=Zd6dd>d?d@Zd6ddAdBZdddCdDdEZdFddGdHZdddIdJZdKS )L_Contextr&   
_rpc_eventr8   _stater   r   )	rpc_eventr9   r   c                 C  s   || _ || _|| _d S r3   )r   r   _request_deserializer)ra   r   r9   r   r-   r-   r.   rb   :  s    z_Context.__init__rL   r)   c                 C  s6   | j j t| j W  d    S 1 s(0    Y  d S r3   )r   rH   rk   r`   r-   r-   r.   	is_activeD  s    
z_Context.is_activefloatc                 C  s   t | jjjt  dS r*   )maxr   call_detailsdeadlinetimer`   r-   r-   r.   time_remainingH  s    z_Context.time_remainingrd   c                 C  s   | j j  d S r3   )r   rv   cancelr`   r-   r-   r.   r   K  s    z_Context.cancelr   )callbackr)   c                 C  sf   | j jJ | j jd u r&W d    dS | j j| W d    dS W d    n1 sX0    Y  d S )NFT)r   rH   rV   rf   )ra   r   r-   r-   r.   add_callbackN  s
    
z_Context.add_callbackc                 C  s4   | j j d| j _W d    n1 s&0    Y  d S rw   )r   rH   rP   r`   r-   r-   r.    disable_next_message_compressionV  s    
z)_Context.disable_next_message_compressionrQ   c                 C  s   | j jS r3   )r   rF   r`   r-   r-   r.   rF   Z  s    z_Context.invocation_metadatarJ   c                 C  s   t | jj S r3   )r   decoder   rv   peerr`   r-   r-   r.   r   ]  s    z_Context.peerzOptional[Sequence[bytes]]c                 C  s   t | jjS r3   )r   peer_identitiesr   rv   r`   r-   r-   r.   r   `  s    z_Context.peer_identitieszOptional[str]c                 C  s$   t | jj}|d u r|S t|S r3   )r   peer_identity_keyr   rv   r   r   )ra   Zid_keyr-   r-   r.   r   c  s    z_Context.peer_identity_keyzMapping[str, Sequence[bytes]]c                 C  s0   t | jj}|d u ri n|}dd | D S )Nc                 S  s   i | ]\}}t ||qS r-   )r   r   ).0keyvaluer-   r-   r.   
<dictcomp>j  s   z)_Context.auth_context.<locals>.<dictcomp>)r   auth_contextr   rv   items)ra   r   Zauth_context_dictr-   r-   r.   r   g  s
    z_Context.auth_contextzgrpc.Compression)compressionr)   c                 C  s4   | j j || j _W d    n1 s&0    Y  d S r3   )r   rH   rO   )ra   r   r-   r-   r.   set_compressiono  s    
z_Context.set_compressionr   )initial_metadatar)   c                 C  s   | j jt | j jtu r"t| j  nL| j jrft| j |}| jj	|ft
| j  d| j _| j jt ntdW d    n1 s0    Y  d S )NFz#Initial metadata no longer allowed!)r   rH   rK   rx   rg   rM   rt   r   rv   r|   r   r^   r}   r   
ValueError)ra   r   rs   r-   r-   r.   r   s  s    
z_Context.send_initial_metadata)rR   r)   c                 C  s4   | j j || j _W d    n1 s&0    Y  d S r3   )r   rH   rR   )ra   rR   r-   r-   r.   set_trailing_metadata  s    
z_Context.set_trailing_metadatac                 C  s   | j jS r3   )r   rR   r`   r-   r-   r.   rR     s    z_Context.trailing_metadatar0   )r2   r?   r)   c                 C  sr   |t jjkr"td t jj}d}| jj4 || j_t	
|| j_d| j_t W d    n1 sd0    Y  d S )Nz4abort() called with StatusCode.OK; returning UNKNOWN T)re   r5   OK_LOGGERerrorUNKNOWNr   rH   r2   r   encoder?   rW   	Exception)ra   r2   r?   r-   r-   r.   abort  s    
z_Context.abortzgrpc.Status)statusr)   c                 C  s   |j | j_ | |j|j d S r3   )rR   r   r   r2   r?   )ra   r   r-   r-   r.   abort_with_status  s    
z_Context.abort_with_statusr1   c                 C  s4   | j j || j _W d    n1 s&0    Y  d S r3   )r   rH   r2   )ra   r2   r-   r-   r.   set_code  s    
z_Context.set_codec                 C  s   | j jS r3   )r   r2   r`   r-   r-   r.   r2     s    z_Context.code)r?   r)   c                 C  s:   | j j t|| j _W d    n1 s,0    Y  d S r3   )r   rH   r   r   r?   )ra   r?   r-   r-   r.   set_details  s    
z_Context.set_detailsr'   c                 C  s   | j jS r3   )r   r?   r`   r-   r-   r.   r?     s    z_Context.detailsc                 C  s   d S r3   r-   r`   r-   r-   r.   _finalize_state  s    z_Context._finalize_stateN)rB   rC   rD   rc   rb   r   r   r   r   r   rF   r   r   r   r   r   r   r   rR   r   r   r   r2   r   r?   r   r-   r-   r-   r.   r   5  s2   

r   c                   @  s   e Zd ZU ded< ded< ded< dddddd	Zd
dddZddddZddddZd dddZddddZ	ddddZ
dS )_RequestIteratorr8   r   ru   _callr   r   )r9   rv   r   c                 C  s   || _ || _|| _d S r3   )r   r   r   )ra   r9   rv   r   r-   r-   r.   rb     s    z_RequestIterator.__init__rd   r   c                 C  s`   | j jtu rt| j  nDt| j s*t n2| jt	t
ft| j | j| j | j jt d S r3   )r   rK   rx   rg   rk   StopIterationr   r|   r   ReceiveMessageOperationrr   r   r   r^   r}   r   r`   r-   r-   r.   _raise_or_start_receive_message  s    

z0_RequestIterator._raise_or_start_receive_messager   c                 C  sV   | j jtu rt| j  n4| j jd u r8t| j jvr8t n| j j}d | j _|S t d S r3   )	r   rK   rx   rg   rI   r   r^   r   AssertionErrorra   rI   r-   r-   r.   _look_for_request  s    

z"_RequestIterator._look_for_requestc                 C  sd   | j jH |   | j j  |  }|d ur|W  d    S qW d    n1 sV0    Y  d S r3   )r   rH   r   waitr   r   r-   r-   r.   _next  s    
z_RequestIterator._nextc                 C  s   | S r3   r-   r`   r-   r-   r.   __iter__  s    z_RequestIterator.__iter__c                 C  s   |   S r3   r   r`   r-   r-   r.   __next__  s    z_RequestIterator.__next__c                 C  s   |   S r3   r   r`   r-   r-   r.   next  s    z_RequestIterator.nextN)rB   rC   rD   rc   rb   r   r   r   r   r   r   r-   r-   r-   r.   r     s   

	r   zCallable[[], Any])r   r9   r   r)   c                   s    fdd}|S )Nc                    s   j  ts W d    d S jttftj  j	t
 j   jd u rjtu rdjj} tjtjjt|  W d    d S jtu rW d    d S qLj}d _|W  d    S qLW d    n1 s0    Y  d S )Nz*"{}" requires exactly one request message.)rH   rk   rv   r|   r   r   rr   r   r^   r}   r   r   rI   rK   r   formatr   rE   r   r5   unimplementedr   r   rx   )r?   rI   r   r   r9   r-   r.   unary_request  s8    




z%_unary_request.<locals>.unary_requestr-   )r   r9   r   r   r-   r   r.   _unary_request  s    !r   r   r   z(Optional[Callable[[ResponseType], None]]z8Tuple[Union[ResponseType, Iterator[ResponseType]], bool])r   r9   behaviorargumentr   send_response_callbackr)   c                 C  sn  ddl m} || ||>}z<d }|d ur8||||}n
|||}|dfW W  d    S  tyH }	 z|j |jrt|| jtjj	d nx|	|j
vrzd|	}
W n8 ty   d}
ttt|	|	|	j t  Y n0 t|
 t|| jtjj	t|
 W d    n1 s0    Y  W Y d }	~	W d    dS d }	~	0 0 W d    n1 s`0    Y  d S )Nr   )_create_servicer_contextT   RPC Abortedz!Exception calling application: {}z1Calling application raised unprintable Exception!NF)re   r   r   rH   rW   r   rv   r   r5   r6   rU   r   r   	exception	tracebackformat_exceptiontype__traceback__	print_excr   r   )r   r9   r   r   r   r   r   rG   Zresponse_or_iteratorr   r?   r-   r-   r.   _call_behavior  s\    

$r   zIterator[ResponseType]zTuple[ResponseType, bool])r   r9   response_iteratorr)   c                 C  s   zt |dfW S  ty"   Y dS  ty } z|jd |jrTt|| jtjj	d n8||j
vrd|}t| t|| jtjj	t| W d    n1 s0    Y  W Y d }~dS d }~0 0 d S )NTrw   r   z!Exception iterating responses: {}r   )r   r   r   rH   rW   r   rv   r   r5   r6   rU   r   r   r   r   r   )r   r9   r   r   r?   r-   r-   r.   %_take_response_from_response_iteratorQ  s.    


"r   zOptional[SerializingFunction]rS   )r   r9   responseresponse_serializerr)   c                 C  sZ   t ||}|d u rR|j$ t|| jtjjd W d    n1 sD0    Y  d S |S d S )Ns   Failed to serialize response!)r   	serializerH   r   rv   r   r5   r   )r   r9   r   r   serialized_responser-   r-   r.   _serialize_responseo  s    "r   zUnion[int, cygrpc.WriteFlag]c                 C  s   | j rtjjS tS d S r3   )rP   r   Z	WriteFlagZno_compressrr   r;   r-   r-   r.   %_get_send_message_op_flags_from_state  s    r   c                 C  s0   | j  d| _W d    n1 s"0    Y  d S r   )rH   rP   r;   r-   r-   r.   _reset_per_message_state  s    r   rL   )r   r9   r   r)   c                 C  s   |j  t|s W d    dS |jrLt|d t|t|f}d|_t}nt|t|f}t}| j	
|t|| |j| t| |j   ||jvrt|W  d    S qW d    n1 s0    Y  d S r   )rH   rk   rM   rt   r   SendMessageOperationr   -_SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN_SEND_MESSAGE_TOKENrv   r|   r   r^   r}   r   r   )r   r9   r   r~   rh   r-   r-   r.   _send_response  s4    


r   c                 C  s   |j  |jturt|}t|}t|j||tg}|j	rL|
t|d  |d urj|
t|t| | j|t|t d|_t| |jt W d    n1 s0    Y  d S rw   )rH   rK   rx   r<   r@   r   ry   rR   rr   rM   rf   rt   r   r   rv   r|   rn   r{   rT   r   r^   r}   )r   r9   r   r2   r?   r~   r-   r-   r.   _status  s0    

r   )r   r9   r   argument_thunkr   r   r)   c           
      C  s   t |  ztzL| }|d urVt| ||||\}}|rVt| |||}	|	d urVt| ||	 W n tyr   t  Y n0 W t   n
t   0 d S r3   )	r   'install_context_from_request_call_eventr   r   r   r   r   r   uninstall_context)
r   r9   r   r   r   r   r   r   proceedr   r-   r-   r.   _unary_response_in_pool  s     

r   c           
        s   t  ddd fdd}zz^| }|d urt|drZ|jrZt||||d n&t|||\}}	|	rt|| W n ty   t  Y n0 W t 	  n
t 	  0 d S )Nr   rd   )r   r)   c                   s<   | d u rt d  n"t|  }|d ur8t| d S r3   )r   r   r   )r   r   r   r   r9   r-   r.   send_response  s    z/_stream_response_in_pool.<locals>.send_responseexperimental_non_blocking)r   )
r   r   hasattrr   r   3_send_message_callback_to_blocking_iterator_adapterr   r   r   r   )
r   r9   r   r   r   r   r   r   r   r   r-   r   r.   _stream_response_in_pool  s6    

	
r   c                 C  s   | j tuo| j S r3   )rK   rx   rT   r;   r-   r-   r.   rk   "  s    rk   zCallable[[ResponseType], None])r   r9   r   r   r)   c                 C  s0   t | ||\}}|r,|| t|s*q,q q,q d S r3   )r   rk   )r   r9   r   r   r   r   r-   r-   r.   r   &  s    r   futures.ThreadPoolExecutor)r   default_thread_poolr)   c                 C  s&   t | drt| jtjr| jS |S d S )Nexperimental_thread_pool)r   
isinstancer   r   ZThreadPoolExecutor)r   r   r-   r-   r.    _select_thread_pool_for_behavior8  s
    r   zgrpc.RpcMethodHandlerzfutures.Future)r   r9   method_handlerr   r)   c              
   C  s<   t | ||j}t|j|}||jjt| ||j||j|jS r3   )	r   r   r   Zunary_unarysubmitrG   runr   r   r   r9   r   r   r   thread_poolr-   r-   r.   _handle_unary_unaryD  s     r   c              
   C  s<   t | ||j}t|j|}||jjt| ||j||j|jS r3   )	r   r   r   Zunary_streamr   rG   r   r   r   r   r-   r-   r.   _handle_unary_stream\  s     r   c              
     sF   t || j|j t|j|}||jjt| ||j fdd|j|j	S )Nc                     s    S r3   r-   r-   Zrequest_iteratorr-   r.   <lambda>  r>   z&_handle_stream_unary.<locals>.<lambda>)
r   rv   r   r   Zstream_unaryr   rG   r   r   r   r   r9   r   r   r   r-   r   r.   _handle_stream_unaryt  s     

r  c              
     sF   t || j|j t|j|}||jjt| ||j fdd|j|j	S )Nc                     s    S r3   r-   r-   r   r-   r.   r     r>   z'_handle_stream_stream.<locals>.<lambda>)
r   rv   r   r   Zstream_streamr   rG   r   r   r   r  r-   r   r.   _handle_stream_stream  s     

r  List[grpc.GenericRpcHandler]'Optional[_interceptor._ServicePipeline]Optional[grpc.RpcMethodHandler])r   r9   generic_handlersinterceptor_pipeliner)   c                   sV   ddd fdd}t t| jj| j}|d urD|j|j||S |j||S d S )NrA   r  )handler_call_detailsr)   c                   s(    D ]}| | }|d ur|  S qd S r3   )service)r	  Zgeneric_handlerr   r  r-   r.   query_handlers  s
    

z,_find_method_handler.<locals>.query_handlers)	rA   r   r   r   rE   rF   rG   r   execute)r   r9   r  r  r  r	  r-   r  r.   _find_method_handler  s    	r  )r   	rpc_stater   r?   c                   s<   t  d tttd ||tf}| j| fdd d S )Nc                   s    dfS ri   r-   )Zignored_eventr  r-   r.   r     s    z_reject_rpc.<locals>.<lambda>)rt   r   ReceiveCloseOnServerOperationrr   ry   rv   r|   )r   r  r   r?   r~   r-   r  r.   _reject_rpc  s    
r  )r   r9   r   r   r)   c                 C  s   |j  | jttft| |jt	 |j
rt|jrVt| |||W  d    S t| |||W  d    S n>|jrt| |||W  d    S t| |||W  d    S W d    n1 s0    Y  d S r3   )rH   rv   r|   r   r  rr   r   r^   r}   r   Zrequest_streamingZresponse_streamingr  r  r   r   )r   r9   r   r   r-   r-   r.   _handle_with_method_handler  s*    
r  z4Tuple[Optional[_RPCState], Optional[futures.Future]])r   r  r  r   concurrency_exceededr)   c           	   
   C  s   | j s
dS | jjd urt }zt| |||}W nR ty } z:d|}t| t	| |t
jjd |d fW  Y d }~S d }~0 0 |d u rt	| |t
jjd |d fS |rt	| |t
jjd |d fS |t| |||fS ndS d S )N)NNzException servicing handler: {}s   Error in service handler!s   Method not found!s   Concurrent RPC limit exceeded!)successr   rE   r8   r  r   r   r   r   r  r   r5   r6   r   Zresource_exhaustedr  )	r   r  r  r   r  r  r   r   r?   r-   r-   r.   _handle_call  sP    

r  c                   @  s   e Zd ZdZdZdZdS )_ServerStagestoppedstartedgraceN)rB   rC   rD   STOPPEDSTARTEDGRACEr-   r-   r-   r.   r  *  s   r  c                   @  s   e Zd ZU ded< ded< ded< ded< d	ed
< ded< ded< ded< ded< ded< ded< ded< ded< ded< dddd	ddddd Zd!S )"_ServerStatezthreading.RLocklockzcygrpc.CompletionQueuecompletion_queuezcygrpc.Serverserverr  r  r  r  r   r   r  stagethreading.Eventtermination_eventzList[threading.Event]shutdown_eventsOptional[int]maximum_concurrent_rpcsintactive_rpc_countzSet[_RPCState]
rpc_stateszSet[str]r^   rL   server_deallocated Sequence[grpc.GenericRpcHandler])r   r!  r  r  r   r'  c                 C  sn   t  | _|| _|| _t|| _|| _|| _t	j
| _t  | _| jg| _|| _d| _t | _t | _d| _d S )Nr   F)r[   RLockr  r   r!  listr  r  r   r  r  r"  Eventr$  r%  r'  r)  r]   r*  r^   r+  )ra   r   r!  r  r  r   r'  r-   r-   r.   rb   B  s    	



z_ServerState.__init__N)rB   rC   rD   rc   rb   r-   r-   r-   r.   r  1  s   
r   Iterable[grpc.GenericRpcHandler])r9   r  r)   c                 C  s6   | j  | j| W d    n1 s(0    Y  d S r3   )r  r  extend)r9   r  r-   r-   r.   _add_generic_handlers_  s    r2  r(  )r9   addressr)   c                 C  s6   | j  | j|W  d    S 1 s(0    Y  d S r3   )r  r!  add_http2_port)r9   r3  r-   r-   r.   _add_insecure_portf  s    r5  grpc.ServerCredentials)r9   r3  server_credentialsr)   c                 C  s:   | j   | j||jW  d    S 1 s,0    Y  d S r3   )r  r!  r4  Z_credentials)r9   r3  r7  r-   r-   r.   _add_secure_portk  s    r8  c                 C  s$   | j | j| jt | jt d S r3   )r!  r   r   _REQUEST_CALL_TAGr^   r}   r;   r-   r-   r.   _request_callv  s    
r:  c                 C  s>   | j s6| js6| j  | jD ]}|  qtj| _dS dS d S rX   )	r*  r^   r!  destroyr%  r]   r  r  r"  )r9   shutdown_eventr-   r-   r.   _stop_serving~  s    


r=  c                 C  s8   | j  |  jd8  _W d    n1 s*0    Y  d S )N   )r  r)  r;   r-   r-   r.   _on_call_completed  s    r?  )r9   eventr)   c              	     s  d}|j tu rP j(  jt t r.d}W d    n1 sB0    Y  n`|j tu r  j  jt  jd uo j jk}t	| j
 j j|\}}|d ur j| |d ur܈  jd7  _| fdd  jtju rt  nt rd}W d    n1 s0    Y  n| |\}}|D ]0}z
|  W n ty^   td Y n0 q2|d ur j*  j| t rd}W d    n1 s0    Y  |S )NTFr>  c                   s   t  S r3   )r?  )Zunused_futurer;   r-   r.   r     r>   z-_process_event_and_continue.<locals>.<lambda>zException calling callback!)tag_SHUTDOWN_TAGr  r^   rj   r=  r9  r'  r)  r  r  r  r   r*  r}   Zadd_done_callbackr"  r  r  r:  r   r   r   )r9   r@  Zshould_continuer  r  Z
rpc_futurerV   r   r-   r;   r.   _process_event_and_continue  sT    
&



&


$rC  c                 C  sL   t   t }| j|}| jr&t|  |jtjj	krBt
| |sBd S d }q d S r3   )r   "_DEALLOCATED_SERVER_CHECK_PERIOD_Sr   pollr+  _begin_shutdown_oncecompletion_typer   ZCompletionTypeZqueue_timeoutrC  )r9   timeoutr@  r-   r-   r.   _serve  s    
rI  c                 C  sZ   | j @ | jtju r8| j| jt tj| _| j	
t W d    n1 sL0    Y  d S r3   )r  r"  r  r  r!  r   r   rB  r  r^   r}   r;   r-   r-   r.   rF    s
    rF  Optional[float]r#  )r9   r  r)   c                   s   j  jtju r6t   W  d    S t t j	  d u rfj
  n6 fdd}tj|d}|  W  d    S W d    n1 s0    Y    S )Nc                     s@   j  d j j  W d    n1 s20    Y  d S N)rH  )r   r  r!  cancel_all_callsr-   r  r<  r9   r-   r.   cancel_all_calls_after_grace  s    z+_stop.<locals>.cancel_all_calls_after_grace)target)r  r"  r  r  r[   r/  r]   rF  r%  rf   r!  rL  Threadstartr   )r9   r  rN  threadr-   rM  r.   _stop  s     0rS  c                 C  sv   | j \ | jtjurtd| j  tj| _t|  t	j
t| fd}d|_|  W d    n1 sh0    Y  d S )Nz$Cannot start already-started server!)rO  argsT)r  r"  r  r  r   r!  rQ  r  r:  r[   rP  rI  daemon)r9   rR  r-   r-   r.   _start  s    
rV  generic_rpc_handlersr)   c                 C  s0   | D ]&}t |dd }|d u rtd|qd S )Nr
  zT"{}" must conform to grpc.GenericRpcHandler type but does not have "service" method!)getattrAttributeErrorr   )rX  Zgeneric_rpc_handlerZservice_attributer-   r-   r.   _validate_generic_rpc_handlers  s    r[  Sequence[ChannelArgumentType]rN   )base_optionsr   r)   c                 C  s   t |}t| | S r3   )r   Zcreate_channel_optionrp   )r]  r   Zcompression_optionr-   r-   r.   _augment_options  s    
r^  c                   @  s   e Zd ZU ded< ddddddd	d
ddZdddddZdddddZddddddZddddZd)dd	d d!d"Z	dd#d$d%d&Z
d'd( ZdS )*_Serverr  r   r   r,   Sequence[grpc.ServerInterceptor]r\  r&  rN   rL   )r   r  interceptorsoptionsr'  r   xdsc           
      C  sB   t  }t t|||}	|	| t||	|t|||| _d S r3   )	r   ZCompletionQueueServerr^  Zregister_completion_queuer  r   Zservice_pipeliner   )
ra   r   r  ra  rb  r'  r   rc  r   r!  r-   r-   r.   rb     s    

z_Server.__init__r0  rd   rW  c                 C  s   t | t| j| d S r3   )r[  r2  r   )ra   rX  r-   r-   r.   add_generic_rpc_handlers*  s    z _Server.add_generic_rpc_handlersrJ   r(  )r3  r)   c                 C  s   t |t| jt |S r3   )r   validate_port_binding_resultr5  r   r   )ra   r3  r-   r-   r.   add_insecure_port0  s    z_Server.add_insecure_portr6  )r3  r7  r)   c                 C  s   t |t| jt ||S r3   )r   rf  r8  r   r   )ra   r3  r7  r-   r-   r.   add_secure_port5  s    z_Server.add_secure_portr   c                 C  s   t | j d S r3   )rV  r   r`   r-   r-   r.   rQ  ?  s    z_Server.startNrJ  )rH  r)   c                 C  s   t j| jjj| jjj|dS rK  )r   r   r   r$  is_set)ra   rH  r-   r-   r.   wait_for_terminationB  s
    z_Server.wait_for_terminationr#  )r  r)   c                 C  s   t | j|S r3   )rS  r   )ra   r  r-   r-   r.   stopL  s    z_Server.stopc                 C  s   t | drd| j_d S )Nr   T)r   r   r+  r`   r-   r-   r.   __del__O  s    
z_Server.__del__)N)rB   rC   rD   rc   rb   re  rg  rh  rQ  rj  rk  rl  r-   r-   r-   r.   r_    s   


r_  r,  r`  r&  )r   rX  ra  rb  r'  r   rc  r)   c                 C  s   t | t| ||||||S r3   )r[  r_  )r   rX  ra  rb  r'  r   rc  r-   r-   r.   create_serverV  s    	rm  )N)z__doc__
__future__r   collectionsZ
concurrentr   rY   enumloggingr[   r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   re   r   r   r   Zgrpc._cythonr   Zgrpc._typingr   r   r   r   r   r   r   r   r   	getLoggerrB   r   rB  r9  r   r   r   r   r   r{   rz   r_   r   rx   rr   rD  Z_INF_TIMEOUTr/   r7   r<   r=   r@   
namedtupleZHandlerCallDetailsrA   objectr8   rg   rl   rn   rq   rt   r   r   r   r   r   ZServicerContextr   r   r   r   r   r   r   r   r   r   r   r   rk   r   r   r   r   r  r  r  r  r  r  uniqueEnumr  r  r2  r5  r8  r:  r=  r?  rC  rI  rF  rS  rV  r[  r^  rd  r_  rm  r-   r-   r-   r.   <module>   s   4
	
#	"!	z?/ :	$ 1 4.1F