U
    ڲg                  	   @  s,  d Z ddlmZ ddl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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) ddl!m*Z* e	+e,Z-dZ.dZ/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:d Z;d!Z<d"d#d$d%d&Z=d'd(d)d*d+Z>d,d(d-d.d/Z?d,d(d(d0d1d2Z@d,d#d-d3d4ZAG d5d6 d6eBd6d7ejCZDG d8d9 d9ejEZFG d:d; d;eFZGG d<d= d=eFZHG d>d, d,eIZJd,d?d-d@dAZKd,dBdCdDdEdFZLd,dBdGdDdHdIZMd,dJdJdKdLdMZNd,dJdNdKdOdPZOd,dQd(d#d?dRdSdTZPd,dGd-dUdVZQd,dQdWdGdXdYdZZRd,dGd-d[d\ZSd,dBdGdDd]d^ZTG d_d` d`ejUZVG dadb dbeIZWd"d,dWdcdddedfZXdd"d,dgdhdWdidjdkdldmZYd"d,dndodpdqdrZZd"d,dhdsdtdudvdwZ[d,dxd-dydzZ\d,d?d-d{d|Z]d"d,d#d}d~ddZ^d"d,dtd?d~ddZ_d"d,dgdcdsdsd?dddZ`d"d,dgdcdWdsd?dddZad,d}d-ddZbd"d,ddnd?dddZcdgdddddZdd"d,ddddddZed"d,ddddddZfd"d,ddddddZgd"d,ddddddZhd"d,d9dddddZid"d,d(d#dddZjd"d,ddddddZkd"d9ddd}ddddZlejmG dd dejnZoG dd deIZpddd?dddZqddd?dddZrdd#ddddZsdd#dddddZtdd?d-ddZuddBd?dddĄZvdd}d-ddƄZwdd?d-ddȄZxdd"d}dɜdd˄Zydd?d-dd̈́Zzdd?d-ddτZ{ddddҜddԄZ|dd?d-ddքZ}dd?dלddلZ~ddd}ddܜddބZG dd dejZddddddd}ddddZdS )z+Service-side implementation of gRPC Python.    )annotationsN)futures)AnyCallableDictIterableIteratorListMappingOptionalSequenceSetTupleUnion)_common)_compression)_interceptor)_observability)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/   0/tmp/pip-unpacked-wheel-8poujhl6/grpc/_server.py_serialized_requestU   s    r1   grpc.StatusCodezcygrpc.StatusCodecoder+   c                 C  s    t j| }|d krtjjS |S N)r   Z!STATUS_CODE_TO_CYGRPC_STATUS_CODEgetr   
StatusCodeunknown)r4   Zcygrpc_coder/   r/   r0   _application_codeY   s    r9   	_RPCState)stater+   c                 C  s    | j d krtjjS t| j S d S r5   )r4   r   r7   okr9   r;   r/   r/   r0   _completion_code^   s    
r>   )r;   r4   r+   c                 C  s   | j d kr|S t| j S d S r5   )r4   r9   )r;   r4   r/   r/   r0   _abortion_codee   s    
r?   c                 C  s   | j d krdS | j S )N    )detailsr=   r/   r/   r0   _detailsn   s    rB   c                   @  s   e Zd ZdS )_HandlerCallDetailsN)__name__
__module____qualname__r/   r/   r/   r0   rC   r   s   
rC   )methodinvocation_metadatac                   @  s6   e Zd ZejddddZejddddd	Zd
S )_MethodOptional[str]r+   c                 C  s
   t  d S r5   NotImplementedErrorselfr/   r/   r0   name   s    z_Method.namerC   Optional[grpc.RpcMethodHandler]handler_call_detailsr+   c                 C  s
   t  d S r5   rL   rO   rS   r/   r/   r0   handler   s    z_Method.handlerN)rD   rE   rF   abcabstractmethodrP   rU   r/   r/   r/   r0   rI      s   rI   c                   @  s:   e Zd ZdddddZdddd	Zd
ddddZdS )_RegisteredMethodstrrQ   )rP   registered_handlerc                 C  s   || _ || _d S r5   )_name_registered_handler)rO   rP   rZ   r/   r/   r0   __init__   s    z_RegisteredMethod.__init__rJ   rK   c                 C  s   | j S r5   )r[   rN   r/   r/   r0   rP      s    z_RegisteredMethod.namerC   rR   c                 C  s   | j S r5   )r\   rT   r/   r/   r0   rU      s    z_RegisteredMethod.handlerNrD   rE   rF   r]   rP   rU   r/   r/   r/   r0   rX      s   rX   c                   @  s8   e Zd ZddddZddddZd	d
dddZdS )_GenericMethodList[grpc.GenericRpcHandler])generic_handlersc                 C  s
   || _ d S r5   )_generic_handlers)rO   ra   r/   r/   r0   r]      s    z_GenericMethod.__init__rJ   rK   c                 C  s   d S r5   r/   rN   r/   r/   r0   rP      s    z_GenericMethod.namerC   rQ   rR   c                 C  s*   | j D ]}||}|d k	r|  S qd S r5   )rb   service)rO   rS   Zgeneric_handlermethod_handlerr/   r/   r0   rU      s
    


z_GenericMethod.handlerNr^   r/   r/   r/   r0   r_      s   r_   c                   @  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 )r:   zcontextvars.Contextcontextzthreading.Condition	conditionr   requestrY   clientboolinitial_metadata_allowedOptional[grpc.Compression]compression_algorithmdisable_next_compressionOptional[MetadataType]trailing_metadatazOptional[grpc.StatusCode]r4   Optional[bytes]rA   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Contextre   	threading	Conditionrf   setduerg   _OPENrh   rj   rl   rm   ro   r4   rA   rq   rr   rs   rt   rN   r/   r/   r0   r]      s    

z_RPCState.__init__N)rD   rE   rF   __annotations__r   rY   r{   r]   r/   r/   r/   r0   r:      s    
Nonec                 C  s   t  }| j| |d S r5   )grpcZRpcErrorrr   append)r;   Z	rpc_errorr/   r/   r0   _raise_rpc_error   s    r   rY   r   )r;   tokenr+   c                 C  s6   | j | t| s.| j s.| j}d | _| |fS dS d S )NNr/   )r{   remove_is_rpc_state_activers   )r;   r   rs   r/   r/   r0   _possibly_finish_call   s    r   r   c                   s    fdd}|S )Nc              
     s(    j  t W  5 Q R  S Q R X d S r5   )rf   r   )Z$unused_send_status_from_server_eventr;   r   r/   r0   r$      s    z9_send_status_from_server.<locals>.send_status_from_serverr/   )r;   r   r$   r/   r   r0   _send_status_from_server   s    r   rn   )r;   metadatar+   c              
   C  sl   | j \ | jrNt| jf}|d kr4|W  5 Q R  S |t| W  5 Q R  S n|W  5 Q R  S W 5 Q R X d S r5   )rf   rl   r   Z!compression_algorithm_to_metadatatuple)r;   r   Zcompression_metadatar/   r/   r0   _get_initial_metadata   s    r   zcygrpc.Operationc                 C  s   t t| |t}|S r5   )r   ZSendInitialMetadataOperationr   _EMPTY_FLAGS)r;   r   	operationr/   r/   r0   _get_initial_metadata_operation  s
     r   cygrpc.Call)r;   callr4   rA   r+   c                 C  s   | j tk	rt| |}| jd kr"|n| j}| jrPt| d t| j||t	f}t
}nt| j||t	f}t}||t| | d| _| j| d S NT)rh   
_CANCELLEDr?   rA   rj   r   r   SendStatusFromServerOperationro   r   8_SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN_SEND_STATUS_FROM_SERVER_TOKENstart_server_batchr   rq   r{   add)r;   r   r4   rA   Zeffective_codeZeffective_details
operationsr   r/   r/   r0   _abort  s6    

	 r   c                   s    fdd}|S )Nc              
     sX    j H | jd  rt _n jtkr.t _ j   t t	W  5 Q R  S Q R X d S r,   )
rf   r-   r'   r   rh   r|   _CLOSED
notify_allr   _RECEIVE_CLOSE_ON_SERVER_TOKEN)Zreceive_close_on_server_eventr=   r/   r0   r    .  s    

z9_receive_close_on_server.<locals>.receive_close_on_serverr/   )r;   r    r/   r=   r0   _receive_close_on_server-  s    	r   Optional[DeserializingFunction])r;   r   request_deserializerr+   c                   s    fdd}|S )Nc              
     s   t | }|d krPj2 jtkr(t_j  ttW  5 Q R  S Q R X n\t	|}jD |d krt
 tjjd n|_j  ttW  5 Q R  S Q R X d S )Ns    Exception deserializing request!)r1   rf   rh   r|   r   r   r   _RECEIVE_MESSAGE_TOKENr   Zdeserializer   r   r7   internalrg   )Zreceive_message_eventZserialized_requestrg   r   r   r;   r/   r0   r"   ?  s,    

 
z)_receive_message.<locals>.receive_messager/   )r;   r   r   r"   r/   r   r0   _receive_message:  s    r   c                   s    fdd}|S )Nc              
     s(    j  t tW  5 Q R  S Q R X d S r5   )rf   r   _SEND_INITIAL_METADATA_TOKEN)Z"unused_send_initial_metadata_eventr=   r/   r0   r!   \  s    z5_send_initial_metadata.<locals>.send_initial_metadatar/   )r;   r!   r/   r=   r0   _send_initial_metadata[  s    r   c                   s    fdd}|S )Nc              
     s2    j "  j   t W  5 Q R  S Q R X d S r5   )rf   r   r   )Zunused_send_message_eventr   r/   r0   r#   d  s    
z#_send_message.<locals>.send_messager/   )r;   r   r#   r/   r   r0   _send_messagec  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_eventr:   _stater   r   )	rpc_eventr;   r   c                 C  s   || _ || _|| _d S r5   )r   r   _request_deserializer)rO   r   r;   r   r/   r/   r0   r]   q  s    z_Context.__init__ri   rK   c              
   C  s*   | j j t| j W  5 Q R  S Q R X d S r5   )r   rf   r   rN   r/   r/   r0   	is_active{  s    
z_Context.is_activefloatc                 C  s   t | jjjt  dS r,   )maxr   call_detailsdeadlinetimerN   r/   r/   r0   time_remaining  s    z_Context.time_remainingr~   c                 C  s   | j j  d S r5   )r   r   cancelrN   r/   r/   r0   r     s    z_Context.cancelr   )callbackr+   c              	   C  sN   | j j< | j jd kr$W 5 Q R  dS | j j| W 5 Q R  dS W 5 Q R X d S )NFT)r   rf   rs   r   )rO   r   r/   r/   r0   add_callback  s
    
z_Context.add_callbackc              	   C  s    | j j d| j _W 5 Q R X d S r   )r   rf   rm   rN   r/   r/   r0    disable_next_message_compression  s    
z)_Context.disable_next_message_compressionrn   c                 C  s   | j jS r5   )r   rH   rN   r/   r/   r0   rH     s    z_Context.invocation_metadatarY   c                 C  s   t | jj S r5   )r   decoder   r   peerrN   r/   r/   r0   r     s    z_Context.peerzOptional[Sequence[bytes]]c                 C  s   t | jjS r5   )r   peer_identitiesr   r   rN   r/   r/   r0   r     s    z_Context.peer_identitiesrJ   c                 C  s$   t | jj}|d kr|S t|S r5   )r   peer_identity_keyr   r   r   r   )rO   Zid_keyr/   r/   r0   r     s    z_Context.peer_identity_keyzMapping[str, Sequence[bytes]]c                 C  s0   t | jj}|d kri n|}dd | D S )Nc                 S  s   i | ]\}}t ||qS r/   )r   r   ).0keyvaluer/   r/   r0   
<dictcomp>  s    z)_Context.auth_context.<locals>.<dictcomp>)r   auth_contextr   r   items)rO   r   Zauth_context_dictr/   r/   r0   r     s
    z_Context.auth_contextzgrpc.Compression)compressionr+   c              	   C  s    | j j || j _W 5 Q R X d S r5   )r   rf   rl   )rO   r   r/   r/   r0   set_compression  s    
z_Context.set_compressionr   )initial_metadatar+   c              	   C  s|   | j jj | j jtkr"t| j  nL| j jrft| j |}| jj	|ft
| j  d| j _| j jt ntdW 5 Q R X d S )NFz#Initial metadata no longer allowed!)r   rf   rh   r   r   rj   r   r   r   r   r   r{   r   r   
ValueError)rO   r   r   r/   r/   r0   r!     s    
  z_Context.send_initial_metadata)ro   r+   c              	   C  s    | j j || j _W 5 Q R X d S r5   )r   rf   ro   )rO   ro   r/   r/   r0   set_trailing_metadata  s    
z_Context.set_trailing_metadatac                 C  s   | j jS r5   )r   ro   rN   r/   r/   r0   ro     s    z_Context.trailing_metadatar2   )r4   rA   r+   c              	   C  s^   |t jjkr"td t jj}d}| jj* || j_t	
|| j_d| j_t W 5 Q R X d S )Nz4abort() called with StatusCode.OK; returning UNKNOWN T)r   r7   OK_LOGGERerrorUNKNOWNr   rf   r4   r   encoderA   rt   	Exception)rO   r4   rA   r/   r/   r0   abort  s    
z_Context.abortzgrpc.Status)statusr+   c                 C  s   |j | j_ | |j|j d S r5   )ro   r   r   r4   rA   )rO   r   r/   r/   r0   abort_with_status  s    
z_Context.abort_with_statusr3   c              	   C  s    | j j || j _W 5 Q R X d S r5   )r   rf   r4   )rO   r4   r/   r/   r0   set_code  s    
z_Context.set_codec                 C  s   | j jS r5   )r   r4   rN   r/   r/   r0   r4     s    z_Context.code)rA   r+   c              	   C  s&   | j j t|| j _W 5 Q R X d S r5   )r   rf   r   r   rA   )rO   rA   r/   r/   r0   set_details  s    
z_Context.set_detailsr)   c                 C  s   | j jS r5   )r   rA   rN   r/   r/   r0   rA     s    z_Context.detailsc                 C  s   d S r5   r/   rN   r/   r/   r0   _finalize_state  s    z_Context._finalize_stateN)rD   rE   rF   r}   r]   r   r   r   r   r   rH   r   r   r   r   r   r!   r   ro   r   r   r   r4   r   rA   r   r/   r/   r/   r0   r   l  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 )_RequestIteratorr:   r   r   _callr   r   )r;   r   r   c                 C  s   || _ || _|| _d S r5   )r   r   r   )rO   r;   r   r   r/   r/   r0   r]     s    z_RequestIterator.__init__r~   rK   c                 C  s`   | j jtkrt| j  nDt| j s*t n2| jt	t
ft| j | j| j | j jt d S r5   )r   rh   r   r   r   StopIterationr   r   r   ReceiveMessageOperationr   r   r   r{   r   r   rN   r/   r/   r0   _raise_or_start_receive_message  s    

  z0_RequestIterator._raise_or_start_receive_messager   c                 C  sV   | j jtkrt| j  n4| j jd kr8t| j jkr8t n| j j}d | j _|S t d S r5   )	r   rh   r   r   rg   r   r{   r   AssertionErrorrO   rg   r/   r/   r0   _look_for_request  s    

z"_RequestIterator._look_for_requestc              
   C  sN   | j j< |   | j j  |  }|d k	r|W  5 Q R  S qW 5 Q R X d S r5   )r   rf   r   waitr   r   r/   r/   r0   _next  s    
z_RequestIterator._nextc                 C  s   | S r5   r/   rN   r/   r/   r0   __iter__  s    z_RequestIterator.__iter__c                 C  s   |   S r5   r   rN   r/   r/   r0   __next__  s    z_RequestIterator.__next__c                 C  s   |   S r5   r   rN   r/   r/   r0   next!  s    z_RequestIterator.nextN)rD   rE   rF   r}   r]   r   r   r   r   r   r   r/   r/   r/   r0   r     s   

	r   zCallable[[], Any])r   r;   r   r+   c                   s    fdd}|S )Nc               
     s   j  tsW 5 Q R  d S jttftj  j	t
 j   jd krjtkrdjj} tjtjjt|  W 5 Q R  d S jtkrW 5 Q R  d S qJj}d _|W  5 Q R  S qJW 5 Q R X d S )Nz*"{}" requires exactly one request message.)rf   r   r   r   r   r   r   r   r{   r   r   r   rg   rh   r   formatr   rG   r   r7   unimplementedr   r   r   )rA   rg   r   r   r;   r/   r0   unary_request*  s<    
  



z%_unary_request.<locals>.unary_requestr/   )r   r;   r   r   r/   r   r0   _unary_request%  s    !r   r   r   z(Optional[Callable[[ResponseType], None]]z8Tuple[Union[ResponseType, Iterator[ResponseType]], bool])r   r;   behaviorargumentr   send_response_callbackr+   c                 C  sB  ddl m} || ||}z:d }|d k	r8||||}n
|||}|dfW W  5 Q R  S  tk
r2 }	 z|j |jrt|| jtjj	d nz|	|j
krzd|	}
W n: tk
r   d}
ttt|	|	|	j t  Y nX t|
 t|| jtjj	t|
 W 5 Q R X W Y W 5 Q R  dS d }	~	X Y nX W 5 Q R X d S )Nr   )_create_servicer_contextT   RPC Abortedz!Exception calling application: {}z1Calling application raised unprintable Exception!NF)r   r   r   rf   rt   r   r   r   r7   r8   rr   r   r   	exception	tracebackformat_exceptiontype__traceback__	print_excr   r   )r   r;   r   r   r   r   r   re   Zresponse_or_iteratorr   rA   r/   r/   r0   _call_behaviorN  sd        

r   zIterator[ResponseType]zTuple[ResponseType, bool])r   r;   response_iteratorr+   c                 C  s   zt |dfW S  tk
r$   Y dS  tk
r } zp|jZ |jrXt|| jtjj	d n8||j
krd|}t| t|| jtjj	t| W 5 Q R X W Y dS d }~X Y nX d S )NTr   r   z!Exception iterating responses: {}r   )r   r   r   rf   rt   r   r   r   r7   r8   rr   r   r   r   r   r   )r   r;   r   r   rA   r/   r/   r0   %_take_response_from_response_iterator  s.    


r   zOptional[SerializingFunction]rp   )r   r;   responseresponse_serializerr+   c              	   C  sF   t ||}|d kr>|j t|| jtjjd W 5 Q R X d S |S d S )Ns   Failed to serialize response!)r   	serializerf   r   r   r   r7   r   )r   r;   r   r   serialized_responser/   r/   r0   _serialize_response  s    r   zUnion[int, cygrpc.WriteFlag]c                 C  s   | j rtjjS tS d S r5   )rm   r   Z	WriteFlagZno_compressr   r=   r/   r/   r0   %_get_send_message_op_flags_from_state  s    r   c              	   C  s   | j  d| _W 5 Q R X d S r   )rf   rm   r=   r/   r/   r0   _reset_per_message_state  s    r   ri   )r   r;   r   r+   c              
   C  s   |j  t|sW 5 Q R  dS |jrJt|d t|t|f}d|_t}nt|t|f}t}| j	
|t|| |j| t| |j   ||jkrt|W  5 Q R  S qW 5 Q R X d S r   )rf   r   rj   r   r   SendMessageOperationr   -_SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN_SEND_MESSAGE_TOKENr   r   r   r{   r   r   r   )r   r;   r   r   r   r/   r/   r0   _send_response  s6     

r   c              	   C  s   |j  |jtk	rt|}t|}t|j||tg}|j	rL|
t|d  |d k	rj|
t|t| | j|t|t d|_t| |jt W 5 Q R X d S r   )rf   rh   r   r>   rB   r   r   ro   r   rj   r   r   r   r   r   r   r   r   rq   r   r{   r   )r   r;   r   r4   rA   r   r/   r/   r0   _status  s6    
   r   )r   r;   r   argument_thunkr   r   r+   c           
      C  s   t |  znzL| }|d k	rVt| ||||\}}|rVt| |||}	|	d k	rVt| ||	 W n tk
rt   t  Y nX W 5 t   X d S r5   )	r   'install_context_from_request_call_eventuninstall_contextr   r   r   r   r   r   )
r   r;   r   r  r   r   r   r   proceedr   r/   r/   r0   _unary_response_in_pool  s.    
       r  c           
        s   t  ddd fdd}zz^| }|d k	rt|drZ|jrZt||||d n&t|||\}}	|	rt|| W n tk
r   t	  Y nX W 5 t   X d S )Nr   r~   )r   r+   c                   s<   | d krt d  n"t|  }|d k	r8t| d S r5   )r   r   r   )r   r   r   r   r;   r/   r0   send_response2  s       z/_stream_response_in_pool.<locals>.send_responseexperimental_non_blocking)r   )
r   r  r  hasattrr  r   3_send_message_callback_to_blocking_iterator_adapterr   r   r   )
r   r;   r   r  r   r   r  r   r   r  r/   r  r0   _stream_response_in_pool(  sD    

	       r  c                 C  s   | j tk	o| j S r5   )rh   r   rq   r=   r/   r/   r0   r   Y  s    r   zCallable[[ResponseType], None])r   r;   r   r   r+   c                 C  s0   t | ||\}}|r,|| t|s*q,q q,q d S r5   )r   r   )r   r;   r   r   r   r  r/   r/   r0   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/   r0    _select_thread_pool_for_behavioro  s     r  zgrpc.RpcMethodHandlerzfutures.Future)r   r;   rd   r  r+   c              
   C  s<   t | ||j}t|j|}||jjt| ||j||j|jS r5   )	r   r   r  Zunary_unarysubmitre   runr  r   r   r;   rd   r  r   thread_poolr/   r/   r0   _handle_unary_unary{  s&       r  c              
   C  s<   t | ||j}t|j|}||jjt| ||j||j|jS r5   )	r   r   r  Zunary_streamr  re   r  r  r   r  r/   r/   r0   _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 r5   r/   r/   Zrequest_iteratorr/   r0   <lambda>  r@   z&_handle_stream_unary.<locals>.<lambda>)
r   r   r   r  Zstream_unaryr  re   r  r  r   r   r;   rd   r  r  r/   r  r0   _handle_stream_unary  s&       
r  c              
     sF   t || j|j t|j|}||jjt| ||j fdd|j|j	S )Nc                     s    S r5   r/   r/   r  r/   r0   r    r@   z'_handle_stream_stream.<locals>.<lambda>)
r   r   r   r  Zstream_streamr  re   r  r  r   r  r/   r  r0   _handle_stream_stream  s&       
r  'Optional[_interceptor._ServicePipeline]rQ   )r   r;   method_with_handlerinterceptor_pipeliner+   c                   sf   ddd fdd}   }|s.t| jj}t|| j}|d k	rT|j|j	||S |j||S d S )NrC   rQ   rR   c                   s
     | S r5   )rU   )rS   r  r/   r0   query_handlers  s    z,_find_method_handler.<locals>.query_handlers)
rP   r   r   r   rG   rC   rH   re   r  execute)r   r;   r  r  r   method_namerS   r/   r  r0   _find_method_handler  s      r#  )r   	rpc_stater   rA   c                   s<   t  d tttd ||tf}| j| fdd d S )Nc                   s    dfS r   r/   )Zignored_eventr$  r/   r0   r    s    z_reject_rpc.<locals>.<lambda>)r   r   ReceiveCloseOnServerOperationr   r   r   r   )r   r$  r   rA   r   r/   r%  r0   _reject_rpc  s       
r'  )r   r;   rd   r  r+   c              
   C  s   |j  | jttft| |jt	 |j
rp|jrTt| |||W  5 Q R  S t| |||W  5 Q R  S n:|jrt| |||W  5 Q R  S t| |||W  5 Q R  S W 5 Q R X d S r5   )rf   r   r   r   r&  r   r   r{   r   r   Zrequest_streamingZresponse_streamingr  r  r  r  )r   r;   rd   r  r/   r/   r0   _handle_with_method_handler  sB    
            r(  z4Tuple[Optional[_RPCState], Optional[futures.Future]])r   r  r  r  concurrency_exceededr+   c           	   
   C  s   | j s
dS | jjs| rt }zt| |||}W nT tk
r } z6d|}t	| t
| |tjjd |df W Y S d}~X Y nX |dkrt
| |tjjd |dfS |rt
| |tjjd |dfS |t| |||fS ndS dS )a  Handles RPC based on provided handlers.

      When receiving a call event from Core, registered method will have its
    name as tag, we pass the tag as registered_method_name to this method,
    then we can find the handler in registered_method_handlers based on
    the method name.

      For call event with unregistered method, the method name will be included
    in rpc_event.call_details.method and we need to query the generics handlers
    to find the actual handler.
    )NNzException servicing handler: {}s   Error in service handler!Ns   Method not found!s   Concurrent RPC limit exceeded!)successr   rG   rP   r:   r#  r   r   r   r   r'  r   r7   r8   r   Zresource_exhaustedr(  )	r   r  r  r  r)  r$  rd   r   rA   r/   r/   r0   _handle_call-  s\    

   r+  c                   @  s   e Zd ZdZdZdZdS )_ServerStagestoppedstartedgraceN)rD   rE   rF   STOPPEDSTARTEDGRACEr/   r/   r/   r0   r,  o  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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`   ra    Dict[str, grpc.RpcMethodHandler]registered_method_handlersr  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{   ri   server_deallocated Sequence[grpc.GenericRpcHandler])r5  r6  ra   r  r  r>  c                 C  st   t  | _|| _|| _t|| _|| _|| _t	j
| _t  | _| jg| _|| _d| _i | _t | _t | _d| _d S )Nr   F)rx   RLockr4  r5  r6  listra   r  r  r,  r0  r9  Eventr;  r<  r>  r@  r8  rz   rA  r{   rB  )rO   r5  r6  ra   r  r  r>  r/   r/   r0   r]     s    	



z_ServerState.__init__N)rD   rE   rF   r}   r]   r/   r/   r/   r0   r3  v  s    
r3   Iterable[grpc.GenericRpcHandler])r;   ra   r+   c              	   C  s"   | j  | j| W 5 Q R X d S r5   )r4  ra   extend)r;   ra   r/   r/   r0   _add_generic_handlers  s    rI  r7  )r;   method_handlersr+   c              	   C  s"   | j  | j| W 5 Q R X d S r5   )r4  r8  update)r;   rJ  r/   r/   r0   _add_registered_method_handlers  s    rL  r?  )r;   addressr+   c              
   C  s*   | j  | j|W  5 Q R  S Q R X d S r5   )r4  r6  add_http2_port)r;   rM  r/   r/   r0   _add_insecure_port  s    rO  grpc.ServerCredentials)r;   rM  server_credentialsr+   c              
   C  s.   | j  | j||jW  5 Q R  S Q R X d S r5   )r4  r6  rN  Z_credentials)r;   rM  rQ  r/   r/   r0   _add_secure_port  s
     rR  c                 C  s$   | j | j| jt | jt d S r5   )r6  r   r5  _REQUEST_CALL_TAGr{   r   r=   r/   r/   r0   _request_call  s      rT  )r;   rG   r+   c                 C  s*   |}| j | j| j|| | j| d S r5   )r6  Zrequest_registered_callr5  r{   r   )r;   rG   Zregistered_call_tagr/   r/   r0   _request_registered_call  s    rU  c                 C  s>   | j s6| js6| j  | jD ]}|  qtj| _dS dS d S ru   )	rA  r{   r6  destroyr<  rz   r,  r0  r9  )r;   shutdown_eventr/   r/   r0   _stop_serving  s    


rX  c              	   C  s$   | j  |  jd8  _W 5 Q R X d S )N   )r4  r@  r=   r/   r/   r0   _on_call_completed  s    rZ  )r;   eventr+   c           
   	     s  d}|j tkr< j  jt t r.d}W 5 Q R X n|j tksX|j  j krbd }|j  j kr|j }t	| j
|d }n
t j} j  j|j   jd k	o j jk}t|| j j|\}}|d k	r j| |d k	r  jd7  _| fdd  jtjkrH| j kr>t | nt  nt rVd}W 5 Q R X n|| |\}}|D ]2}	z
|	  W n  tk
r   td Y nX qt|d k	rވ j   j| t rd}W 5 Q R X |S )NTFrY  c                   s   t  S r5   )rZ  )Zunused_futurer=   r/   r0   r    r@   z-_process_event_and_continue.<locals>.<lambda>zException calling callback!)tag_SHUTDOWN_TAGr4  r{   r   rX  rS  r8  keysrX   r6   r_   ra   r>  r@  r+  r  r  rA  r   Zadd_done_callbackr9  r,  r1  rU  rT  r   r   r   )
r;   r[  Zshould_continueZregistered_method_namer  r)  r$  Z
rpc_futurers   r   r/   r=   r0   _process_event_and_continue  s~    
 








r_  c                 C  sL   t   t }| j|}| jr&t|  |jtjj	krBt
| |sBd S d }q d S r5   )r   "_DEALLOCATED_SERVER_CHECK_PERIOD_Sr5  pollrB  _begin_shutdown_oncecompletion_typer   ZCompletionTypeZqueue_timeoutr_  )r;   timeoutr[  r/   r/   r0   _serve/  s    
re  c              	   C  sF   | j 6 | jtjkr8| j| jt tj| _| j	
t W 5 Q R X d S r5   )r4  r9  r,  r1  r6  r   r5  r]  r2  r{   r   r=   r/   r/   r0   rb  >  s
    rb  Optional[float]r:  )r;   r/  r+   c              
     s   j  jtjkr4t   W  5 Q R  S t t j	  d krdj
  n4 fdd}tj|d}|  W  5 Q R  S W 5 Q R X   S )Nc                	     s,   j  d j j  W 5 Q R X d S N)rd  )r   r4  r6  cancel_all_callsr/   r/  rW  r;   r/   r0   cancel_all_calls_after_graceT  s    z+_stop.<locals>.cancel_all_calls_after_grace)target)r4  r9  r,  r0  rx   rF  rz   rb  r<  r   r6  rh  Threadstartr   )r;   r/  rj  threadr/   ri  r0   _stopF  s     ro  c              	   C  s|   | j l | jtjk	rtd| j  tj| _| j	 D ]}t
| | q8t|  tjt| fd}d|_|  W 5 Q R X d S )Nz$Cannot start already-started server!)rk  argsT)r4  r9  r,  r0  r   r6  rm  r1  r8  r^  rU  rT  rx   rl  re  daemon)r;   rG   rn  r/   r/   r0   _start`  s    
rr  generic_rpc_handlersr+   c                 C  s0   | D ]&}t |dd }|d krtd|qd S )Nrc   zT"{}" must conform to grpc.GenericRpcHandler type but does not have "service" method!)getattrAttributeErrorr   )rt  Zgeneric_rpc_handlerZservice_attributer/   r/   r0   _validate_generic_rpc_handlersp  s    rw  Sequence[ChannelArgumentType]rk   )base_optionsr   xdsr+   c                 C  s$   t |}t|}t| | | S r5   )r   Zcreate_channel_optionr   Z(create_server_call_tracer_factory_optionr   )ry  r   rz  Zcompression_optionZ'maybe_server_call_tracer_factory_optionr/   r/   r0   _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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 )._Serverr3  r   r  rC   Sequence[grpc.ServerInterceptor]rx  r=  rk   ri   )r  ra   interceptorsoptionsr>  r   rz  c           
      C  sJ   t  }t t||||}	|	| t||	|t|||| _|	| _	d S r5   )
r   ZCompletionQueueServerr{  Zregister_completion_queuer3  r   Zservice_pipeliner   
_cy_server)
rO   r  ra   r~  r  r>  r   rz  r5  r6  r/   r/   r0   r]     s    

z_Server.__init__rG  r~   rs  c                 C  s   t | t| j| d S r5   )rw  rI  r   )rO   rt  r/   r/   r0   add_generic_rpc_handlers  s    z _Server.add_generic_rpc_handlersrY   r7  )service_namerJ  r+   c              	     sp   | j j" | j jtjkr&W 5 Q R  d S W 5 Q R X  fdd| D }| D ]}| j| qNt	| j | d S )Nc                   s   i | ]\}}t  ||qS r/   )r   fully_qualified_method)r   rG   rd   r  r/   r0   r     s   
 z:_Server.add_registered_method_handlers.<locals>.<dictcomp>)
r   r4  r9  r,  r1  r   r^  r  Zregister_methodrL  )rO   r  rJ  Zmethod_to_handlersr  r/   r  r0   add_registered_method_handlers  s    

z&_Server.add_registered_method_handlersr?  )rM  r+   c                 C  s   t |t| jt |S r5   )r   validate_port_binding_resultrO  r   r   )rO   rM  r/   r/   r0   add_insecure_port  s     z_Server.add_insecure_portrP  )rM  rQ  r+   c                 C  s   t |t| jt ||S r5   )r   r  rR  r   r   )rO   rM  rQ  r/   r/   r0   add_secure_port  s      z_Server.add_secure_portrK   c                 C  s   t | j d S r5   )rr  r   rN   r/   r/   r0   rm    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)rO   rd  r/   r/   r0   wait_for_termination  s
    z_Server.wait_for_terminationr:  )r/  r+   c                 C  s   t | j|S r5   )ro  r   )rO   r/  r/   r/   r0   stop  s    z_Server.stopc                 C  s   t | drd| j_d S )Nr   T)r	  r   rB  rN   r/   r/   r0   __del__  s    
z_Server.__del__)N)rD   rE   rF   r}   r]   r  r  r  r  rm  r  r  r  r/   r/   r/   r0   r|    s   


r|  rC  r}  r=  )r  rt  r~  r  r>  r   rz  r+   c                 C  s   t | t| ||||||S r5   )rw  r|  )r  rt  r~  r  r>  r   rz  r/   r/   r0   create_server  s    	r  )N)__doc__
__future__r   rV   collectionsZ
concurrentr   rv   enumloggingrx   r   r   typingr   r   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   Zgrpc._cythonr   Zgrpc._typingr   r   r   r   r   r   r   r   r   	getLoggerrD   r   r]  rS  r   r   r   r   r   r   r   r|   r   r   r   r`  Z_INF_TIMEOUTr1   r9   r>   r?   rB   
namedtupleZHandlerCallDetailsrC   ABCrI   rX   r_   objectr:   r   r   r   r   r   r   r   r   r   r   ZServicerContextr   r   r   r   r   r   r   r   r   r   r  r  r   r
  r  r  r  r  r  r#  r'  r(  r+  uniqueEnumr,  r3  rI  rL  rO  rR  rT  rU  rX  rZ  r_  re  rb  ro  rr  rw  r{  r  r|  r  r/   r/   r/   r0   <module>   s   8
	
#	"!	z?/ :	$ 1 B0GZ