o
    bi                     @  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* ddl+m,Z, e	-e.Z/dZ0dZ1dZ2dZ3dZ4dZ5dZ6dZ7dZ8dZ9dZ:d Z;dZ<d!Z=d"Z>dd'd(Z?dd,d-Z@dd0d1ZAdd2d3ZBdd4d5ZCG d6d7 d7eDd7d8ejEZFG d9d: d:ejGZHG d;d< d<eHZIG d=d> d>eHZJG d?d/ d/eKZLddAdBZMddFdGZNddIdJZOddMdNZPddPdQZQddUdVZRddWdXZSdd[d\ZTdd]d^ZUdd_d`ZVG dadb dbejWZXG dcdd ddeKZYddgdhZZ	dd dpdqZ[ddudvZ\dd{d|Z]dd~dZ^dddZ_dddZ`dddZadddZbdddZcdddZdd	ddZed
ddZfdddZgdddZhdddZidddZjdddZkdddZldddZmdddZnejoG dd dejpZqG dd deKZrdddZsdddZtdddZudddńZvdddǄZwdddʄZxddd̄Zyddd΄ZzdddфZ{dddӄZ|dddՄZ}dddڄZ~ddd܄Zddd߄ZdddZG dd dejZd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)override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request_eventcygrpc.BaseEventreturnbytesc                 C  s   | j d  S Nr   )batch_operationsmessage)r)    r0   F/home/kim/smarthome/.venv/lib/python3.10/site-packages/grpc/_server.py_serialized_requestV      r2   codegrpc.StatusCodecygrpc.StatusCodec                 C  s    t j| }|d u rtjjS |S N)r   Z!STATUS_CODE_TO_CYGRPC_STATUS_CODEgetr   
StatusCodeunknown)r4   Zcygrpc_coder0   r0   r1   _application_codeZ   s   r;   state	_RPCStatec                 C  s   | j d u r	tjjS t| j S r7   )r4   r   r9   okr;   r<   r0   r0   r1   _completion_code_   s   

r@   c                 C  s   | j d u r|S t| j S r7   )r4   r;   )r<   r4   r0   r0   r1   _abortion_codee   s   

rA   c                 C  s   | j d u rdS | j S )N    )detailsr?   r0   r0   r1   _detailsm   s   rD   c                   @  s   e Zd ZdS )_HandlerCallDetailsN)__name__
__module____qualname__r0   r0   r0   r1   rE   q   s    
rE   )methodinvocation_metadatac                   @  s,   e Zd ZejdddZejddd	Zd
S )_Methodr+   Optional[str]c                 C     t  r7   NotImplementedErrorselfr0   r0   r1   name      z_Method.namehandler_call_detailsrE   Optional[grpc.RpcMethodHandler]c                 C  rM   r7   rN   rQ   rT   r0   r0   r1   handler      z_Method.handlerNr+   rL   rT   rE   r+   rU   )rF   rG   rH   abcabstractmethodrR   rW   r0   r0   r0   r1   rK   ~   s
    rK   c                   @  s2   e Zd ZdddZedd	d
ZedddZdS )_RegisteredMethodrR   strregistered_handlerrU   c                 C  s   || _ || _d S r7   )_name_registered_handler)rQ   rR   r_   r0   r0   r1   __init__   s   
z_RegisteredMethod.__init__r+   rL   c                 C     | j S r7   )r`   rP   r0   r0   r1   rR      rS   z_RegisteredMethod.namerT   rE   c                 C  rc   r7   )ra   rV   r0   r0   r1   rW      rX   z_RegisteredMethod.handlerN)rR   r^   r_   rU   rY   rZ   rF   rG   rH   rb   r   rR   rW   r0   r0   r0   r1   r]      s    
r]   c                   @  s2   e Zd ZdddZedddZedddZdS )_GenericMethodgeneric_handlersList[grpc.GenericRpcHandler]c                 C  s
   || _ d S r7   )_generic_handlers)rQ   rf   r0   r0   r1   rb      s   
z_GenericMethod.__init__r+   rL   c                 C     d S r7   r0   rP   r0   r0   r1   rR      s   z_GenericMethod.namerT   rE   rU   c                 C  s*   | j D ]}||}|d ur|  S qd S r7   )rh   service)rQ   rT   Zgeneric_handlermethod_handlerr0   r0   r1   rW      s   

z_GenericMethod.handlerN)rf   rg   rY   rZ   rd   r0   r0   r0   r1   re      s    
re   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   requestr^   clientboolinitial_metadata_allowedOptional[grpc.Compression]compression_algorithmdisable_next_compressionOptional[MetadataType]trailing_metadatazOptional[grpc.StatusCode]r4   Optional[bytes]rC   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Contextrl   	threading	Conditionrm   setduern   _OPENro   rq   rs   rt   rv   r4   rC   rx   ry   rz   r{   rP   r0   r0   r1   rb      s   


z_RPCState.__init__N)rF   rG   rH   __annotations__r   r^   r   rb   r0   r0   r0   r1   r=      s"   
 Nonec                 C  s   t  }| j| |r7   )grpcZRpcErrorry   append)r<   Z	rpc_errorr0   r0   r1   _raise_rpc_error   s   r   tokenr^   r   c                 C  s2   | j | t| s| j s| j}d | _| |fS dS )NNr0   )r   remove_is_rpc_state_activerz   )r<   r   rz   r0   r0   r1   _possibly_finish_call   s   r   r   c                       fdd}|S )Nc                   s4    j  t W  d    S 1 sw   Y  d S r7   )rm   r   )Z$unused_send_status_from_server_eventr<   r   r0   r1   r%         $z9_send_status_from_server.<locals>.send_status_from_serverr0   )r<   r   r%   r0   r   r1   _send_status_from_server   s   r   metadataru   c                 C  sv   | j . | jr(t| jf}|d u r|W  d    S |t| W  d    S |W  d    S 1 s4w   Y  d S r7   )rm   rs   r   Z!compression_algorithm_to_metadatatuple)r<   r   Zcompression_metadatar0   r0   r1   _get_initial_metadata   s   
	
$r   cygrpc.Operationc                 C  s   t t| |t}|S r7   )r   ZSendInitialMetadataOperationr   _EMPTY_FLAGS)r<   r   	operationr0   r0   r1   _get_initial_metadata_operation  s   
r   callcygrpc.CallrC   c                 C  s   | j turHt| |}| jd u r|n| j}| jr(t| d t| j||t	f}t
}nt| j||t	f}t}||t| | d| _| j| d S d S NT)ro   
_CANCELLEDrA   rC   rq   r   r   SendStatusFromServerOperationrv   r   8_SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN_SEND_STATUS_FROM_SERVER_TOKENstart_server_batchr   rx   r   add)r<   r   r4   rC   Zeffective_codeZeffective_details
operationsr   r0   r0   r1   _abort  s6   

	
r   c                       fdd}|S )Nc                   sd    j % | jd  rt _n jtu rt _ j   t t	W  d    S 1 s+w   Y  d S r-   )
rm   r.   r(   r   ro   r   _CLOSED
notify_allr   _RECEIVE_CLOSE_ON_SERVER_TOKEN)Zreceive_close_on_server_eventr?   r0   r1   r!   .  s   

$z9_receive_close_on_server.<locals>.receive_close_on_serverr0   )r<   r!   r0   r?   r1   _receive_close_on_server-  s   	r   request_deserializerOptional[DeserializingFunction]c                       fdd}|S )Nc                   s   t | }|d u r/j jtu rt_j  ttW  d    S 1 s(w   Y  d S t	|}j# |d u rGt
 tjjd n|_j  ttW  d    S 1 s^w   Y  d S )Ns    Exception deserializing request!)r2   rm   ro   r   r   r   r   _RECEIVE_MESSAGE_TOKENr   Zdeserializer   r   r9   internalrn   )Zreceive_message_eventZserialized_requestrn   r   r   r<   r0   r1   r#   ?  s.   

$
$z)_receive_message.<locals>.receive_messager0   )r<   r   r   r#   r0   r   r1   _receive_message:  s   r   c                   r   )Nc                   s4    j  t tW  d    S 1 sw   Y  d S r7   )rm   r   _SEND_INITIAL_METADATA_TOKEN)Z"unused_send_initial_metadata_eventr?   r0   r1   r"   \  r   z5_send_initial_metadata.<locals>.send_initial_metadatar0   )r<   r"   r0   r?   r1   _send_initial_metadata[  s   r   c                   r   )Nc                   s>    j   j   t W  d    S 1 sw   Y  d S r7   )rm   r   r   )Zunused_send_message_eventr   r0   r1   r$   d  s   
$z#_send_message.<locals>.send_messager0   )r<   r   r$   r0   r   r1   _send_messagec  s   r   c                   @  s  e Zd ZU ded< ded< ded< dLd	d
ZdMddZdNddZdOddZdPddZdOddZ	dQddZ
dRdd ZdSd"d#ZdTd%d&ZdUd(d)ZdVd,d-ZdWd0d1ZdXd3d4ZdQd5d6ZdYd:d;ZdZd>d?Zd[d@dAZd\dBdCZd]dDdEZd^dGdHZdOdIdJZdKS )__Contextr*   
_rpc_eventr=   _stater   r   	rpc_eventr<   c                 C     || _ || _|| _d S r7   )r   r   _request_deserializer)rQ   r   r<   r   r0   r0   r1   rb   q     
z_Context.__init__r+   rp   c                 C  s6   | j j t| j W  d    S 1 sw   Y  d S r7   )r   rm   r   rP   r0   r0   r1   	is_active{  s   
$z_Context.is_activefloatc                 C  s   t | jjjt  dS r-   )maxr   call_detailsdeadlinetimerP   r0   r0   r1   time_remaining  s   z_Context.time_remainingr   c                 C  s   | j j  d S r7   )r   r   cancelrP   r0   r0   r1   r     s   z_Context.cancelcallbackr   c                 C  s\   | j j  | j jd u r	 W d    dS | j j| 	 W d    dS 1 s'w   Y  d S )NFT)r   rm   rz   r   )rQ   r   r0   r0   r1   add_callback  s   
$z_Context.add_callbackc                 C  s6   | j j d| j _W d    d S 1 sw   Y  d S r   )r   rm   rt   rP   r0   r0   r1    disable_next_message_compression     

"z)_Context.disable_next_message_compressionru   c                 C     | j jS r7   )r   rJ   rP   r0   r0   r1   rJ        z_Context.invocation_metadatar^   c                 C  s   t | jj S r7   )r   decoder   r   peerrP   r0   r0   r1   r        z_Context.peerOptional[Sequence[bytes]]c                 C  s   t | jjS r7   )r   peer_identitiesr   r   rP   r0   r0   r1   r     r3   z_Context.peer_identitiesrL   c                 C  s$   t | jj}|d u r|S t|S r7   )r   peer_identity_keyr   r   r   r   )rQ   Zid_keyr0   r0   r1   r     s   z_Context.peer_identity_key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 r0   )r   r   ).0keyvaluer0   r0   r1   
<dictcomp>  s    
z)_Context.auth_context.<locals>.<dictcomp>)r   auth_contextr   r   items)rQ   r   Zauth_context_dictr0   r0   r1   r     s
   z_Context.auth_contextcompressiongrpc.Compressionc                 C  6   | j j || j _W d    d S 1 sw   Y  d S r7   )r   rm   rs   )rQ   r   r0   r0   r1   set_compression  r   z_Context.set_compressioninitial_metadatar   c                 C  s   | j j< | j jtu rt| j  | j jr2t| j |}| jj	|ft
| j  d| j _| j jt nd}t|W d    d S 1 sCw   Y  d S )NFz#Initial metadata no longer allowed!)r   rm   ro   r   r   rq   r   r   r   r   r   r   r   r   
ValueError)rQ   r   r   	error_msgr0   r0   r1   r"     s    

"z_Context.send_initial_metadatarv   c                 C  r   r7   )r   rm   rv   )rQ   rv   r0   r0   r1   set_trailing_metadata  r   z_Context.set_trailing_metadatac                 C  r   r7   )r   rv   rP   r0   r0   r1   rv     r   z_Context.trailing_metadatar4   r5   rC   c                 C  sd   |t jjkrtd t jj}d}| jj || j_t	
|| j_d| j_t 1 s+w   Y  d S )Nz4abort() called with StatusCode.OK; returning UNKNOWN T)r   r9   OK_LOGGERerrorUNKNOWNr   rm   r4   r   encoderC   r{   	Exception)rQ   r4   rC   r0   r0   r1   abort  s   
z_Context.abortstatusgrpc.Statusc                 C  s   |j | j_ | |j|j d S r7   )rv   r   r   r4   rC   )rQ   r   r0   r0   r1   abort_with_status  s   
z_Context.abort_with_statusc                 C  r   r7   )r   rm   r4   )rQ   r4   r0   r0   r1   set_code  r   z_Context.set_codec                 C  r   r7   )r   r4   rP   r0   r0   r1   r4     r   z_Context.codec                 C  s<   | j j t|| j _W d    d S 1 sw   Y  d S r7   )r   rm   r   r   rC   )rQ   rC   r0   r0   r1   set_details  s   
"z_Context.set_detailsr,   c                 C  r   r7   )r   rC   rP   r0   r0   r1   rC     r   z_Context.detailsc                 C  ri   r7   r0   rP   r0   r0   r1   _finalize_state     z_Context._finalize_stateN)r   r*   r<   r=   r   r   )r+   rp   )r+   r   r+   r   )r   r   r+   rp   )r+   ru   )r+   r^   )r+   r   rY   )r+   r   )r   r   r+   r   )r   r   r+   r   )rv   r   r+   r   )r4   r5   rC   r^   r+   r   )r   r   r+   r   )r4   r5   r+   r   )r+   r5   )rC   r^   r+   r   )r+   r,   )rF   rG   rH   r   rb   r   r   r   r   r   rJ   r   r   r   r   r   r"   r   rv   r   r   r   r4   r   rC   r   r0   r0   r0   r1   r   l  s4   
 





















r   c                   @  sl   e Zd ZU ded< ded< ded< dd
dZdddZdddZdddZdddZdddZ	dddZ
dS ) _RequestIteratorr=   r   r   _callr   r   r<   r   r   c                 C  r   r7   )r   r   r   )rQ   r<   r   r   r0   r0   r1   rb     r   z_RequestIterator.__init__r+   r   c                 C  s`   | j jtu rt| j  d S t| j st | jt	t
ft| j | j| j | j jt d S r7   )r   ro   r   r   r   StopIterationr   r   r   ReceiveMessageOperationr   r   r   r   r   r   rP   r0   r0   r1   _raise_or_start_receive_message  s   

z0_RequestIterator._raise_or_start_receive_messager   c                 C  sN   | j jtu rt| j  t | j jd u rt| j jvrt | j j}d | j _|S r7   )	r   ro   r   r   rn   r   r   r   AssertionErrorrQ   rn   r0   r0   r1   _look_for_request  s   
z"_RequestIterator._look_for_requestc                 C  sX   | j j |   	 | j j  |  }|d ur!|W  d    S q
1 s%w   Y  d S r7   )r   rm   r   waitr   r   r0   r0   r1   _next  s   
z_RequestIterator._nextc                 C  s   | S r7   r0   rP   r0   r0   r1   __iter__  r   z_RequestIterator.__iter__c                 C     |   S r7   r   rP   r0   r0   r1   __next__  r   z_RequestIterator.__next__c                 C  r   r7   r   rP   r0   r0   r1   next   r   z_RequestIterator.nextN)r<   r=   r   r   r   r   r   )r+   r   )r+   r   )rF   rG   rH   r   rb   r   r   r   r   r   r   r0   r0   r0   r1   r     s   
 





	
r   r   Callable[[], Any]c                   r   )Nc                    s   j p ts	 W d    d S jttftj  j	t
 	 j   jd u rcjtu rTdjj} tjtjjt|  	 W d    d S jtu rb	 W d    d S nj}d _|W  d    S q(1 svw   Y  d S )NTz*"{}" requires exactly one request message.)rm   r   r   r   r   r   r   r   r   r   r   r   rn   ro   r   formatr   rI   r   r9   unimplementedr   r   r   )rC   rn   r   r   r<   r0   r1   unary_request)  sF   




z%_unary_request.<locals>.unary_requestr0   )r   r<   r   r   r0   r   r1   _unary_request$  s    r  behaviorr   argumentr   send_response_callback(Optional[Callable[[ResponseType], None]]8Tuple[Union[ResponseType, Iterator[ResponseType]], bool]c                 C  sV  ddl m} || ||}zd }|d ur||||}n|||}|dfW W  d    S  ty }	 zi|jQ |jrEt|| jtjj	d n;|	|j
vrzd|	}
W n tym   d}
ttt|	|	|	j t  Y nw t|
 t|| jtjj	t|
 W d    n1 sw   Y  W Y d }	~	W d    dS d }	~	ww 1 sw   Y  d S )Nr   )_create_servicer_contextT   RPC Abortedz!Exception calling application: {}z1Calling application raised unprintable Exception!NF)r   r  r   rm   r{   r   r   r   r9   r:   ry   r   r   	exception	tracebackformat_exceptiontype__traceback__	print_excr   r   )r   r<   r  r  r   r  r  rl   Zresponse_or_iteratorr
  rC   r0   r0   r1   _call_behaviorL  sl   



 r  response_iteratorIterator[ResponseType]Tuple[ResponseType, bool]c                 C  s   zt |dfW S  ty   Y dS  ty` } zD|j2 |jr*t|| jtjj	d n||j
vrFd|}t| t|| jtjj	t| W d    n1 sPw   Y  W Y d }~dS d }~ww )NTr   r  z!Exception iterating responses: {}r	  )r   r   r   rm   r{   r   r   r   r9   r:   ry   r   r   r
  r   r   )r   r<   r  r
  rC   r0   r0   r1   %_take_response_from_response_iterator  s6   


r  responseresponse_serializerOptional[SerializingFunction]rw   c                 C  sX   t ||}|d u r*|j t|| jtjjd W d    d S 1 s#w   Y  d S |S )Ns   Failed to serialize response!)r   	serializerm   r   r   r   r9   r   )r   r<   r  r  serialized_responser0   r0   r1   _serialize_response  s   
r  Union[int, cygrpc.WriteFlag]c                 C  s   | j rtjjS tS r7   )rt   r   Z	WriteFlagZno_compressr   r?   r0   r0   r1   %_get_send_message_op_flags_from_state  s   r  c                 C  s2   | j  d| _W d    d S 1 sw   Y  d S r	  )rm   rt   r?   r0   r0   r1   _reset_per_message_state  s   "r  r  rp   c                 C  s   |j Z t|s	 W d    dS |jr't|d t|t|f}d|_t}nt|t|f}t}| j	
|t|| |j| t| 	 |j   ||jvr\t|W  d    S qG1 s`w   Y  d S r	  )rm   r   rq   r   r   SendMessageOperationr  -_SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN_SEND_MESSAGE_TOKENr   r   r   r   r   r  r   )r   r<   r  r   r   r0   r0   r1   _send_response  s>   


r!  c                 C  s   |j Y |jturTt|}t|}t|j||tg}|j	r&|
t|d  |d ur5|
t|t| | j|t|t d|_t| |jt W d    d S W d    d S 1 s_w   Y  d S r   )rm   ro   r   r@   rD   r   r   rv   r   rq   r   r   r  r  r   r   r   r   rx   r  r   r   )r   r<   r  r4   rC   r   r0   r0   r1   _status  s6   

"r"  argument_thunkc           
      C  s   t |  zBz&| }|d ur+t| ||||\}}|r+t| |||}	|	d ur+t| ||	 W n ty9   t  Y nw W t   d S W t   d S t   w r7   )	r   'install_context_from_request_call_eventr  r  r"  r   r  r  uninstall_context)
r   r<   r  r#  r   r  r  r  proceedr  r0   r0   r1   _unary_response_in_pool  s*   

r'  c           
        s   t  d	 fdd}zKz/| }|d ur=t|dr*|jr*t||||d nt|||\}}	|	r=t|| W n tyK   t  Y nw W t 	  d S W t 	  d S t 	  w )
Nr  r   r+   r   c                   sB   | d u rt d  d S t|  }|d urt| d S d S r7   )r"  r  r!  )r  r  r  r   r<   r0   r1   send_response-  s   z/_stream_response_in_pool.<locals>.send_responseexperimental_non_blocking)r  )r  r   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&  r0   r(  r1   _stream_response_in_pool#  s@   

	
r-  c                 C  s   | j tuo| j S r7   )ro   r   rx   r?   r0   r0   r1   r   T  r   r   Callable[[ResponseType], None]c                 C  s2   	 t | ||\}}|r|| t|sd S nd S qr7   )r  r   )r   r<   r  r  r  r&  r0   r0   r1   r,  X  s   r,  default_thread_poolfutures.ThreadPoolExecutorc                 C  s"   t | drt| jtjr| jS |S )Nexperimental_thread_pool)r+  
isinstancer1  r   ZThreadPoolExecutor)r  r/  r0   r0   r1    _select_thread_pool_for_behaviorj  s
   r3  rk   grpc.RpcMethodHandlerfutures.Futurec              
   C  <   t | ||j}t|j|}||jjt| ||j||j|jS r7   )	r  r   r3  Zunary_unarysubmitrl   runr'  r  r   r<   rk   r/  r   thread_poolr0   r0   r1   _handle_unary_unaryu      r;  c              
   C  r6  r7   )	r  r   r3  Zunary_streamr7  rl   r8  r-  r  r9  r0   r0   r1   _handle_unary_stream  r<  r=  c              
     F   t || j|j t|j|}||jjt| ||j fdd|j|j	S )Nc                         S r7   r0   r0   Zrequest_iteratorr0   r1   <lambda>      z&_handle_stream_unary.<locals>.<lambda>)
r   r   r   r3  Zstream_unaryr7  rl   r8  r'  r  r   r<   rk   r/  r:  r0   r@  r1   _handle_stream_unary      

rD  c              
     r>  )Nc                     r?  r7   r0   r0   r@  r0   r1   rA    rB  z'_handle_stream_stream.<locals>.<lambda>)
r   r   r   r3  Zstream_streamr7  rl   r8  r-  r  rC  r0   r@  r1   _handle_stream_stream  rE  rF  method_with_handlerinterceptor_pipeline'Optional[_interceptor._ServicePipeline]rU   c                   s\   d fdd}   }|st| jj}t|| j}|d ur'|j|j	||S |j||S )NrT   rE   r+   rU   c                   s
     | S r7   )rW   )rT   rG  r0   r1   query_handlers  s   
z,_find_method_handler.<locals>.query_handlersrZ   )
rR   r   r   r   rI   rE   rJ   rl   r8  execute)r   r<   rG  rH  rK  method_namerT   r0   rJ  r1   _find_method_handler  s   rN  	rpc_stater   c                   s<   t  d tttd ||tf}| j| fdd d S )Nc                   s    dfS r   r0   )Z_ignored_eventrO  r0   r1   rA    s   z_reject_rpc.<locals>.<lambda>)r   r   ReceiveCloseOnServerOperationr   r   r   r   )r   rO  r   rC   r   r0   rP  r1   _reject_rpc  s   
rR  r:  c                 C  s   |j U | jttft| |jt	 |j
r9|jr+t| |||W  d    S t| |||W  d    S |jrJt| |||W  d    S t| |||W  d    S 1 s[w   Y  d S r7   )rm   r   r   r   rQ  r   r   r   r   r   Zrequest_streamingZresponse_streamingrF  rD  r=  r;  )r   r<   rk   r:  r0   r0   r1   _handle_with_method_handler  s2   
$rS  concurrency_exceeded4Tuple[Optional[_RPCState], Optional[futures.Future]]c           	   
   C  s   | j sdS | jjs| rlt }z	t| |||}W n) tyB } zd|}t	| t
| |tjjd |dfW  Y d}~S d}~ww |du rTt
| |tjjd |dfS |rct
| |tjjd |dfS |t| |||f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   rI   rR   r=   rN  r   r   r   r
  rR  r   r9   r:   r   Zresource_exhaustedrS  )	r   rG  rH  r:  rT  rO  rk   r
  rC   r0   r0   r1   _handle_call#  sZ   


rW  c                   @  s   e Zd ZdZdZdZdS )_ServerStagestoppedstartedgraceN)rF   rG   rH   STOPPEDSTARTEDGRACEr0   r0   r0   r1   rX  c  s    rX  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!Zd"S )$_ServerStatezthreading.RLocklockcygrpc.CompletionQueuecompletion_queuecygrpc.Serverserverrg   rf    Dict[str, grpc.RpcMethodHandler]registered_method_handlersrI  rH  r0  r:  rX  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   rp   server_deallocated Sequence[grpc.GenericRpcHandler]c                 C  st   t  | _|| _|| _t|| _|| _|| _t	j
| _t  | _| jg| _|| _d| _i | _t | _t | _d| _d S )Nr   F)r   RLockr`  rb  rd  listrf   rH  r:  rX  r\  rg  Eventri  rj  rl  rn  rf  r   ro  r   rp  )rQ   rb  rd  rf   rH  r:  rl  r0   r0   r1   rb   |  s   
	



z_ServerState.__init__N)rb  ra  rd  rc  rf   rq  rH  rI  r:  r0  rl  rk  )rF   rG   rH   r   rb   r0   r0   r0   r1   r_  j  s"   
 r_  rf    Iterable[grpc.GenericRpcHandler]c                 C  8   | j  | j| W d    d S 1 sw   Y  d S r7   )r`  rf   extend)r<   rf   r0   r0   r1   _add_generic_handlers     "rx  method_handlersre  c                 C  rv  r7   )r`  rf  update)r<   rz  r0   r0   r1   _add_registered_method_handlers  ry  r|  addressrm  c                 C  s6   | j  | j|W  d    S 1 sw   Y  d S r7   )r`  rd  add_http2_port)r<   r}  r0   r0   r1   _add_insecure_port  s   
$r  server_credentialsgrpc.ServerCredentialsc                 C  s:   | j  | j||jW  d    S 1 sw   Y  d S r7   )r`  rd  r~  Z_credentials)r<   r}  r  r0   r0   r1   _add_secure_port  s
   $r  c                 C  s$   | j | j| jt | jt d S r7   )rd  r    rb  _REQUEST_CALL_TAGr   r   r?   r0   r0   r1   _request_call  s   
r  rI   c                 C  s*   |}| j | j| j|| | j| d S r7   )rd  Zrequest_registered_callrb  r   r   )r<   rI   Zregistered_call_tagr0   r0   r1   _request_registered_call  s   r  c                 C  s:   | j s| js| j  | jD ]}|  qtj| _dS dS r|   )	ro  r   rd  destroyrj  r   rX  r\  rg  )r<   shutdown_eventr0   r0   r1   _stop_serving  s   


r  c                 C  s:   | j  |  jd8  _W d    d S 1 sw   Y  d S )N   )r`  rn  r?   r0   r0   r1   _on_call_completed  s   "r  eventc           
   	     sZ  d}|j tu r1 j  jt t rd}W d    |S W d    |S 1 s*w   Y  |S |j tu s<|j  jv rd }|j  jv rR|j }t| j	|d }nt
 j} jy  j|j   jd uol j jk}t|| j j|\}}|d ur j| |d ur  jd7  _| fdd  jtju r| jv rt | n#t  nt rd}W d    |S W d    |S W d    |S W d    |S 1 sw   Y  |S | |\}}|D ]}	z|	  W q ty   td Y qw |d ur+ j  j| t rd}W d    |S W d    |S 1 s&w   Y  |S )NTFr  c                   s   t  S r7   )r  )Z_unused_futurer?   r0   r1   rA    s    z-_process_event_and_continue.<locals>.<lambda>zException calling callback!)tag_SHUTDOWN_TAGr`  r   r   r  r  rf  r]   r8   re   rf   rl  rn  rW  rH  r:  ro  r   Zadd_done_callbackrg  rX  r]  r  r  r   r   r
  )
r<   r  Zshould_continueZregistered_method_namerG  rT  rO  Z
rpc_futurerz   r   r0   r?   r1   _process_event_and_continue  s   

<
<<






'
'
'
''




r  c                 C  sN   	 t   t }| j|}| jrt|  |jtjj	k}|s$t
| |s$d S d }qr7   )r   "_DEALLOCATED_SERVER_CHECK_PERIOD_Srb  pollrp  _begin_shutdown_oncecompletion_typer   ZCompletionTypeZqueue_timeoutr  )r<   timeoutr  Z
is_timeoutr0   r0   r1   _serve  s   r  c                 C  sl   | j ) | jtju r$| j| jt tj| _| j	
t W d    d S W d    d S 1 s/w   Y  d S r7   )r`  rg  rX  r]  rd  r   rb  r  r^  r   r   r?   r0   r0   r1   r  0  s   "r  r[  Optional[float]rh  c                   s   j R jtju rt   W  d    S t t j	  d u r3j
  n fdd}tj|d}|  W  d    S W d    n1 sXw   Y    S )Nc                     sB   j  d j j  W d    d S 1 sw   Y  d S N)r  )r   r`  rd  cancel_all_callsr0   r[  r  r<   r0   r1   cancel_all_calls_after_graceE  s   "z+_stop.<locals>.cancel_all_calls_after_grace)target)r`  rg  rX  r\  r   rt  r   r  rj  r   rd  r  Threadstartr   )r<   r[  r  threadr0   r  r1   _stop8  s(   	r  c                 C  s   | j < | jtjurd}t|| j  tj| _| jD ]}t	| | qt
|  tjt| fd}d|_|  W d    d S 1 sBw   Y  d S )Nz$Cannot start already-started server!)r  argsT)r`  rg  rX  r\  r   rd  r  r]  rf  r  r  r   r  r  daemon)r<   r   rI   r  r0   r0   r1   _startQ  s   


"r  generic_rpc_handlersc                 C  s6   | D ]}t |dd }|d u rd| d}t|qd S )Nrj   "zP" must conform togrpc.GenericRpcHandler type but does not have "service" method!)getattrAttributeError)r  Zgeneric_rpc_handlerZservice_attributer   r0   r0   r1   _validate_generic_rpc_handlersb  s   
r  base_optionsSequence[ChannelArgumentType]r   rr   xdsc                 C  s$   t |}t|}t| | | S r7   )r   Zcreate_channel_optionr   Z(create_server_call_tracer_factory_optionr   )r  r   r  Zcompression_optionZ'maybe_server_call_tracer_factory_optionr0   r0   r1   _augment_optionso  s   
r  c                   @  sp   e Zd ZU ded< d4ddZd5ddZd6ddZd7d!d"Zd8d%d&Zd9d'd(Z	d:d;d,d-Z
d<d0d1Zd2d3 Zd)S )=_Serverr_  r   r:  r0  rf   rq  interceptors Sequence[grpc.ServerInterceptor]optionsr  rl  rk  r   rr   r  rp   c           
      C  sJ   t  }t t||||}	|	| t||	|t|||| _|	| _	d S r7   )
r   ZCompletionQueueServerr  Zregister_completion_queuer_  r   Zservice_pipeliner   
_cy_server)
rQ   r:  rf   r  r  rl  r   r  rb  rd  r0   r0   r1   rb     s   


z_Server.__init__r  ru  r+   r   c                 C  s   t | t| j| d S r7   )r  rx  r   )rQ   r  r0   r0   r1   add_generic_rpc_handlers  s   z _Server.add_generic_rpc_handlersservice_namer^   rz  re  c                   s   | j j | j jtju r	 W d    d S W d    n1 sw   Y   fdd| D }|D ]}| j| q1t| j | d S )Nc                   s   i | ]\}}t  ||qS r0   )r   fully_qualified_method)r   rI   rk   r  r0   r1   r     s    z:_Server.add_registered_method_handlers.<locals>.<dictcomp>)	r   r`  rg  rX  r]  r   r  Zregister_methodr|  )rQ   r  rz  Zmethod_to_handlersr  r0   r  r1   add_registered_method_handlers  s   

z&_Server.add_registered_method_handlersr}  rm  c                 C  s   t |t| jt |S r7   )r   validate_port_binding_resultr  r   r   )rQ   r}  r0   r0   r1   add_insecure_port  s   z_Server.add_insecure_portr  r  c                 C  s   t |t| jt ||S r7   )r   r  r  r   r   )rQ   r}  r  r0   r0   r1   add_secure_port  s   z_Server.add_secure_portc                 C  s   t | j d S r7   )r  r   rP   r0   r0   r1   r    r3   z_Server.startNr  r  c                 C  s   t j| jjj| jjj|dS r  )r   r   r   ri  is_set)rQ   r  r0   r0   r1   wait_for_termination  s
   z_Server.wait_for_terminationr[  rh  c                 C  s   t | j|S r7   )r  r   )rQ   r[  r0   r0   r1   stop  s   z_Server.stopc                 C  s   t | drd| j_d S d S )Nr   T)r+  r   rp  rP   r0   r0   r1   __del__  s   
z_Server.__del__)r:  r0  rf   rq  r  r  r  r  rl  rk  r   rr   r  rp   r  ru  r+   r   )r  r^   rz  re  r+   r   )r}  r^   r+   rm  )r}  r^   r  r  r+   rm  r   r7   )r  r  r+   rp   )r[  r  r+   rh  )rF   rG   rH   r   rb   r  r  r  r  r  r  r  r  r0   r0   r0   r1   r    s   
 








r  rq  r  r  r  rl  rk  c                 C  s   t | t| ||||||S r7   )r  r  )r:  r  r  r  rl  r   r  r0   r0   r1   create_server  s   	r  )r)   r*   r+   r,   )r4   r5   r+   r6   )r<   r=   r+   r6   )r<   r=   r4   r6   r+   r6   )r<   r=   r+   r,   )r<   r=   r+   r   )r<   r=   r   r^   r+   r   )r<   r=   r   r^   r+   r   )r<   r=   r   ru   r+   ru   )r<   r=   r   ru   r+   r   )
r<   r=   r   r   r4   r6   rC   r,   r+   r   )r<   r=   r+   r   )r<   r=   r   r   r   r   r+   r   )r   r*   r<   r=   r   r   r+   r   r7   )r   r*   r<   r=   r  r   r  r   r   r   r  r  r+   r  )r   r*   r<   r=   r  r  r+   r  )
r   r*   r<   r=   r  r   r  r  r+   rw   )r<   r=   r+   r  )r   r*   r<   r=   r  r,   r+   rp   )r   r*   r<   r=   r  rw   r+   r   )r   r*   r<   r=   r  r   r#  r   r   r  r  r  r+   r   )r   r*   r<   r=   r  r   r#  r   r   r   r  r  r+   r   )r<   r=   r+   rp   )
r   r*   r<   r=   r  r.  r  r  r+   r   )r  r   r/  r0  r+   r0  )
r   r*   r<   r=   rk   r4  r/  r0  r+   r5  )
r   r*   r<   r=   rG  rK   rH  rI  r+   rU   )r   r*   rO  r=   r   r6   rC   r,   )
r   r*   r<   r=   rk   r4  r:  r0  r+   r5  )r   r*   rG  rK   rH  rI  r:  r0  rT  rp   r+   rU  )r<   r_  rf   ru  r+   r   )r<   r_  rz  re  r+   r   )r<   r_  r}  r,   r+   rm  )r<   r_  r}  r,   r  r  r+   rm  )r<   r_  r+   r   )r<   r_  rI   r^   r+   r   )r<   r_  r+   rp   )r<   r_  r  r*   r+   rp   )r<   r_  r[  r  r+   rh  r  )r  r  r   rr   r  rp   r+   r  )r:  r0  r  rq  r  r  r  r  rl  rk  r   rr   r  rp   r+   r  )__doc__
__future__r   r[   collectionsZ
concurrentr   r}   enumloggingr   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   Ztyping_extensionsr   	getLoggerrF   r   r  r  r   r   r   r   r  r   r   r   r   r   r   r  Z_INF_TIMEOUTr2   r;   r@   rA   rD   
namedtupleZHandlerCallDetailsrE   ABCrK   r]   re   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,  r3  r;  r=  rD  rF  rN  rR  rS  rW  uniqueEnumrX  r_  rx  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r0   r0   r0   r1   <module>   s   8







#




	
"

!
	y
?.:
# 1@0
DZ