a
    !f                  	   @  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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Z/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7d Z8d!d"d#d$d%Z9d&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?Z@G d7d+ d+eAZBd+d8d,d9d:ZCd+d;d<d=d>d?ZDd+d;d@d=dAdBZEd+dCdCdDdEdFZFd+dCdGdDdHdIZGd+dJd'd"d8dKdLdMZHd+d@d,dNdOZId+dJdPd@dQdRdSZJd+d@d,dTdUZKd+d;d@d=dVdWZLG dXdY dYejMZNG dZd[ d[eAZOd!d+dPd\d]d^d_ZPdd!d+d`dadPdbdcdddedfZQd!d+dgdhdidjdkZRd!d+dadldmdndodpZSd+dqd,drdsZTd+d8d,dtduZUd!d+d"dvdwdxdyZVd!d+dmd8dwdzd{ZWd!d+d`d\dldld8d|d}d~ZXd!d+d`d\dPdld8d|ddZYd+dvd,ddZZd!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Z`d!ddddddZad!d'd"d+dddZbd!ddddddZcd!ddddvddddZdejeG dd dejfZgG dd deAZhddd8dddZidd"ddddZjdd"dddddZkdd8d,ddZlddvd,ddZmdd8d,ddZndd!dvdddZodd8d,ddZpdd8d,ddÄZqddddƜddȄZrdd8d,ddʄZsdd8d˜dd̈́ZtddddМdd҄ZuG ddԄ dejvZwdddddddvdd؜ddڄZxd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-   M/var/www/html/python-backend/venv/lib/python3.9/site-packages/grpc/_server.py_serialized_requestD   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_codeH   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_codeM   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_codeT   s    
r=   c                 C  s   | j d u rdS | j S )N    )detailsr;   r-   r-   r.   _details\   s    r@   c                   @  s   e Zd ZdS )_HandlerCallDetailsN)__name__
__module____qualname__r-   r-   r-   r.   rA   `   s   rA   )methodinvocation_metadatac                   @  s   e Zd ZU 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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  s^   t  | _t | _d | _t| _d| _d | _	d| _
d | _d | _d | _d| _g | _g | _d| _d S NTF)	threading	ConditionrG   setduerH   _OPENrJ   rL   rN   rO   rQ   r2   r?   rS   rT   rU   rV   selfr-   r-   r.   __init__x   s    
z_RPCState.__init__N)rB   rC   rD   __annotations__r   rI   r[   r_   r-   r-   r-   r.   r8   h   s   
Nonec                 C  s   t  }| j| |d S r3   )grpcZRpcErrorrT   append)r9   Z	rpc_errorr-   r-   r.   _raise_rpc_error   s    rd   rI   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_activerU   )r9   re   rU   r-   r-   r.   _possibly_finish_call   s    ri   r   c                   s    fdd}|S )Nc                   s4    j  t W  d    S 1 s&0    Y  d S r3   )rG   ri   )Z$unused_send_status_from_server_eventr9   re   r-   r.   r"      s    z9_send_status_from_server.<locals>.send_status_from_serverr-   )r9   re   r"   r-   rj   r.   _send_status_from_server   s    rk   rP   )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   )rG   rN   r   Z!compression_algorithm_to_metadatatuple)r9   rl   Zcompression_metadatar-   r-   r.   _get_initial_metadata   s    rn   zcygrpc.Operationc                 C  s   t t| |t}|S r3   )r   ZSendInitialMetadataOperationrn   _EMPTY_FLAGS)r9   rl   	operationr-   r-   r.   _get_initial_metadata_operation   s    
rq   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)rJ   
_CANCELLEDr=   r?   rL   rq   r   SendStatusFromServerOperationrQ   ro   8_SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN_SEND_STATUS_FROM_SERVER_TOKENstart_server_batchrk   rS   r[   add)r9   rs   r2   r?   Zeffective_codeZeffective_details
operationsre   r-   r-   r.   _abort   s,    

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*   )
rG   r+   r%   ru   rJ   r\   _CLOSED
notify_allri   _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   rs   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/   rG   rJ   r\   r}   r~   ri   _RECEIVE_MESSAGE_TOKENr   Zdeserializer|   r   r5   internalrH   )Zreceive_message_eventZserialized_requestrH   rs   r   r9   r-   r.   r       s$    

*
z)_receive_message.<locals>.receive_messager-   )r9   rs   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   )rG   ri   _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   )rG   r~   ri   )Zunused_send_message_eventrj   r-   r.   r!     s    
z#_send_message.<locals>.send_messager-   )r9   re   r!   r-   rj   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)r^   r   r9   r   r-   r-   r.   r_     s    z_Context.__init__rK   r)   c                 C  s6   | j j t| j W  d    S 1 s(0    Y  d S r3   )r   rG   rh   r]   r-   r-   r.   	is_active  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_remaining  s    z_Context.time_remainingra   c                 C  s   | j j  d S r3   )r   rs   cancelr]   r-   r-   r.   r   "  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   rG   rU   rc   )r^   r   r-   r-   r.   add_callback%  s
    
z_Context.add_callbackc                 C  s4   | j j d| j _W d    n1 s&0    Y  d S rt   )r   rG   rO   r]   r-   r-   r.    disable_next_message_compression-  s    
z)_Context.disable_next_message_compressionrP   c                 C  s   | j jS r3   )r   rF   r]   r-   r-   r.   rF   1  s    z_Context.invocation_metadatarI   c                 C  s   t | jj S r3   )r   decoder   rs   peerr]   r-   r-   r.   r   4  s    z_Context.peerzOptional[Sequence[bytes]]c                 C  s   t | jjS r3   )r   peer_identitiesr   rs   r]   r-   r-   r.   r   7  s    z_Context.peer_identitieszOptional[str]c                 C  s$   t | jj}|d u r|S t|S r3   )r   peer_identity_keyr   rs   r   r   )r^   Zid_keyr-   r-   r.   r   :  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>A  s   z)_Context.auth_context.<locals>.<dictcomp>)r   auth_contextr   rs   items)r^   r   Zauth_context_dictr-   r-   r.   r   >  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   rG   rN   )r^   r   r-   r-   r.   set_compressionF  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   rG   rJ   ru   rd   rL   rq   r   rs   ry   r   r[   rz   r   
ValueError)r^   r   rp   r-   r-   r.   r   J  s    
z_Context.send_initial_metadata)rQ   r)   c                 C  s4   | j j || j _W d    n1 s&0    Y  d S r3   )r   rG   rQ   )r^   rQ   r-   r-   r.   set_trailing_metadataY  s    
z_Context.set_trailing_metadatac                 C  s   | j jS r3   )r   rQ   r]   r-   r-   r.   rQ   ]  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)rb   r5   OK_LOGGERerrorUNKNOWNr   rG   r2   r   encoder?   rV   	Exception)r^   r2   r?   r-   r-   r.   abort`  s    
z_Context.abortzgrpc.Status)statusr)   c                 C  s   |j | j_ | |j|j d S r3   )rQ   r   r   r2   r?   )r^   r   r-   r-   r.   abort_with_statusm  s    
z_Context.abort_with_statusr1   c                 C  s4   | j j || j _W d    n1 s&0    Y  d S r3   )r   rG   r2   )r^   r2   r-   r-   r.   set_codeq  s    
z_Context.set_codec                 C  s   | j jS r3   )r   r2   r]   r-   r-   r.   r2   u  s    z_Context.code)r?   r)   c                 C  s:   | j j t|| j _W d    n1 s,0    Y  d S r3   )r   rG   r   r   r?   )r^   r?   r-   r-   r.   set_detailsx  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   r`   r_   r   r   r   r   r   rF   r   r   r   r   r   r   r   rQ   r   r   r   r2   r   r?   r   r-   r-   r-   r.   r     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   rr   _callr   r   )r9   rs   r   c                 C  s   || _ || _|| _d S r3   )r   r   r   )r^   r9   rs   r   r-   r-   r.   r_     s    z_RequestIterator.__init__ra   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   rJ   ru   rd   rh   StopIterationr   ry   r   ReceiveMessageOperationro   r   r   r[   rz   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   rJ   ru   rd   rH   r   r[   r   AssertionErrorr^   rH   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   rG   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   r`   r_   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.)rG   rh   rs   ry   r   r   ro   r   r[   rz   r   r   rH   rJ   r}   formatr   rE   r|   r5   unimplementedr   r   ru   )r?   rH   r   r   r9   r-   r.   unary_request  s4    




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  sR  ddl m} || ||"}z<d }|d ur8||||}n
|||}|dfW W  d    S  ty, }	 z|j |jrt|| jtjj	d n\|	|j
vrzd|	}
W n ty   d}
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 sD0    Y  d S )Nr   )_create_servicer_contextT   RPC Abortedz!Exception calling application: {}z1Calling application raised unprintable Exception!NF)rb   r   r   rG   rV   r|   rs   r   r5   r6   rT   r   	traceback	print_excr   	exceptionr   r   )r   r9   r   r   r   r   r   contextZ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 )NTrt   r   z!Exception iterating responses: {}r   )r   r   r   rG   rV   r|   rs   r   r5   r6   rT   r   r   r   r   r   )r   r9   r   r   r?   r-   r-   r.   %_take_response_from_response_iterator  s"    


"r   zOptional[SerializingFunction]rR   )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   	serializerG   r|   rs   r   r5   r   )r   r9   r   r   serialized_responser-   r-   r.   _serialize_response  s    "r   zUnion[int, cygrpc.WriteFlag]c                 C  s   | j rtjjS tS d S r3   )rO   r   Z	WriteFlagZno_compressro   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   )rG   rO   r;   r-   r-   r.   _reset_per_message_state+  s    r   rK   )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   )rG   rh   rL   rq   r   SendMessageOperationr   -_SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN_SEND_MESSAGE_TOKENrs   ry   r   r[   rz   r   r   )r   r9   r   r{   re   r-   r-   r.   _send_response0  s2    

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 rt   )rG   rJ   ru   r<   r@   r   rv   rQ   ro   rL   rc   rq   r   r   rs   ry   rk   rx   rS   r   r[   rz   )r   r9   r   r2   r?   r{   r-   r-   r.   _statusN  s2    
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_poolh  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   ra   )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~  s2    



r   c                 C  s   | j tuo| j S r3   )rJ   ru   rS   r;   r-   r-   r.   rh     s    rh   zCallable[[ResponseType], None])r   r9   r   r   r)   c                 C  s0   t | ||\}}|r,|| t|s*q,q q,q d S r3   )r   rh   )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   ThreadPoolExecutor)r   r   r-   r-   r.    _select_thread_pool_for_behavior  s
    r   zgrpc.RpcMethodHandlerzfutures.Future)r   r9   method_handlerr   r)   c              	   C  s6   t | ||j}t|j|}|t| ||j||j|jS r3   )r   r   r   Zunary_unarysubmitr   r   r   r9   r   r   r   thread_poolr-   r-   r.   _handle_unary_unary  s    
r   c              	   C  s6   t | ||j}t|j|}|t| ||j||j|jS r3   )r   r   r   Zunary_streamr   r   r   r   r-   r-   r.   _handle_unary_stream  s    
r   c              	     s@   t || j|j t|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   rs   r   r   Zstream_unaryr   r   r   r   r9   r   r   r   r-   r   r.   _handle_stream_unary  s    

r   c              	     s@   t || j|j t|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   rs   r   r   Zstream_streamr   r   r   r   r-   r   r.   _handle_stream_stream  s    

r   List[grpc.GenericRpcHandler]'Optional[_interceptor._ServicePipeline]Optional[grpc.RpcMethodHandler])r   generic_handlersinterceptor_pipeliner)   c                   sJ   ddd fdd}t t| jj| j}|d ur>|||S ||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   execute)r   r  r  r  r  r-   r  r.   _find_method_handler  s    	r	  )r   r   r?   r)   c                   sB   t   t d tttd ||tf}| j| fdd  S )Nc                   s    dfS rf   r-   )Zignored_event	rpc_stater-   r.   r      s    z_reject_rpc.<locals>.<lambda>)r8   rq   r   ReceiveCloseOnServerOperationro   rv   rs   ry   )r   r   r?   r{   r-   r
  r.   _reject_rpc  s    
r  z Tuple[_RPCState, futures.Future])r   r   r   r)   c                 C  s   t  }|j | jttft| |j	t
 |jr|jr`|t| |||fW  d    S |t| |||fW  d    S nF|jr|t| |||fW  d    S |t| |||fW  d    S W d    n1 s0    Y  d S r3   )r8   rG   rs   ry   r   r  ro   r   r[   rz   r   Zrequest_streamingZresponse_streamingr   r   r   r   )r   r   r   r9   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rzt| ||}W nL tyr } z4d|}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| ||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   r	  r   r   r   r   r  r   r5   r6   r   Zresource_exhaustedr  )r   r  r  r   r  r   r   r?   r-   r-   r.   _handle_callA  s>    




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[   rK   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)rX   RLockr  r  r  listr  r  r   r  r  r  Eventr  r   r"  r$  rZ   r%  r[   r&  )r^   r  r  r  r  r   r"  r-   r-   r.   r_   v  s    



z_ServerState.__init__N)rB   rC   rD   r`   r_   r-   r-   r-   r.   r  e  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    r-  r#  )r9   addressr)   c                 C  s6   | j  | j|W  d    S 1 s(0    Y  d S r3   )r  r  add_http2_port)r9   r.  r-   r-   r.   _add_insecure_port  s    r0  grpc.ServerCredentials)r9   r.  server_credentialsr)   c                 C  s:   | j   | j||jW  d    S 1 s,0    Y  d S r3   )r  r  r/  Z_credentials)r9   r.  r2  r-   r-   r.   _add_secure_port  s    r3  c                 C  s$   | j | j| jt | jt d S r3   )r  r   r  _REQUEST_CALL_TAGr[   rz   r;   r-   r-   r.   _request_call  s    r5  c                 C  s>   | j s6| js6| j  | jD ]}|  qtj| _dS dS d S rW   )	r%  r[   r  destroyr   rZ   r  r  r  )r9   shutdown_eventr-   r-   r.   _stop_serving  s    


r8  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 )NTFr9  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[   rg   r8  r4  r"  r$  r  r  r  r   r%  rz   add_done_callbackr  r  r  r5  r   r   r   )r9   r;  Zshould_continuer  r  Z
rpc_futurerU   r   r-   r;   r.   _process_event_and_continue  sP    
&



&


$r?  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_timeoutr?  )r9   timeoutr;  r-   r-   r.   _serve  s    
rE  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  r=  r  r[   rz   r;   r-   r-   r.   rB    s
    rB  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)rD  )r   r  r  cancel_all_callsr-   r  r7  r9   r-   r.   cancel_all_calls_after_grace
  s    z+_stop.<locals>.cancel_all_calls_after_grace)target)r  r  r  r  rX   r*  rZ   rB  r   rc   r  rH  Threadstartr   )r9   r  rJ  threadr-   rI  r.   _stop  s     0rO  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!)rK  argsT)r  r  r  r  r   r  rM  r  r5  rX   rL  rE  daemon)r9   rN  r-   r-   r.   _start  s    
rR  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   )rT  Zgeneric_rpc_handlerZservice_attributer-   r-   r.   _validate_generic_rpc_handlers#  s    rW  Sequence[ChannelArgumentType]rM   )base_optionsr   r)   c                 C  s   t |}t| | S r3   )r   Zcreate_channel_optionrm   )rY  r   Zcompression_optionr-   r-   r.   _augment_options-  s    
rZ  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]rX  r!  rM   rK   )r   r  interceptorsoptionsr"  r   xdsc           
      C  sB   t  }t t|||}	|	| t||	|t|||| _d S r3   )	r   ZCompletionQueueServerrZ  Zregister_completion_queuer  r   Zservice_pipeliner   )
r^   r   r  r]  r^  r"  r   r_  r  r  r-   r-   r.   r_   9  s    
z_Server.__init__r+  ra   rS  c                 C  s   t | t| j| d S r3   )rW  r-  r   )r^   rT  r-   r-   r.   add_generic_rpc_handlersF  s    z _Server.add_generic_rpc_handlersrI   r#  )r.  r)   c                 C  s   t |t| jt |S r3   )r   validate_port_binding_resultr0  r   r   )r^   r.  r-   r-   r.   add_insecure_portL  s    z_Server.add_insecure_portr1  )r.  r2  r)   c                 C  s   t |t| jt ||S r3   )r   rb  r3  r   r   )r^   r.  r2  r-   r-   r.   add_secure_portP  s    z_Server.add_secure_portr   c                 C  s   t | j d S r3   )rR  r   r]   r-   r-   r.   rM  W  s    z_Server.startNrF  )rD  r)   c                 C  s   t j| jjj| jjj|dS rG  )r   r   r   r  is_set)r^   rD  r-   r-   r.   wait_for_terminationZ  s    z_Server.wait_for_terminationr  )r  r)   c                 C  s   t | j|S r3   )rO  r   )r^   r  r-   r-   r.   stopb  s    z_Server.stopc                 C  s   t | drd| j_d S )Nr   T)r   r   r&  r]   r-   r-   r.   __del__e  s    
z_Server.__del__)N)rB   rC   rD   r`   r_   ra  rc  rd  rM  rf  rg  rh  r-   r-   r-   r.   r[  5  s   
r[  r'  r\  r!  )r   rT  r]  r^  r"  r   r_  r)   c                 C  s   t | t| ||||||S r3   )rW  r[  )r   rT  r]  r^  r"  r   r_  r-   r-   r.   create_serverl  s    
ri  )N)y__doc__
__future__r   collections
concurrentr   enumloggingrX   r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   rb   r   r   r   Zgrpc._cythonr   Zgrpc._typingr   r   r   r   r   r   r   r   r   	getLoggerrB   r   r=  r4  r   r   r   r   r   rx   rw   r\   r}   ru   ro   r@  Z_INF_TIMEOUTr/   r7   r<   r=   r@   
namedtupleZHandlerCallDetailsrA   objectr8   rd   ri   rk   rn   rq   r|   r   r   r   r   ZServicerContextr   r   r   r   r   r   r   r   r   r   r   r   rh   r   r   r   r   r   r   r	  r  r  r  uniqueEnumr  r  r-  r0  r3  r5  r8  r:  r?  rE  rB  rO  rR  rW  rZ  r`  r[  ri  r-   r-   r-   r.   <module>   s   4


!		
s7) %(++
7