o
    c                     @   s  d 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	 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ZdZdZdZdZdZdZdZdZdd Z dd Z!dd Z"dd Z#dd Z$G d d! d!e%d!d"ej&Z'G d#d$ d$e(Z)d%d& Z*d'd( Z+d)d* Z,d+d, Z-d-d. Z.d/d0 Z/d1d2 Z0d3d4 Z1d5d6 Z2d7d8 Z3G d9d: d:ej4Z5G d;d< d<e(Z6d=d> Z7	dd?d@Z8dAdB Z9dCdD Z:dEdF Z;dGdH Z<dIdJ Z=dKdL Z>dMdN Z?dOdP Z@dQdR ZAdSdT ZBdUdV ZCdWdX ZDdYdZ ZEd[d\ ZFd]d^ ZGd_d` ZHdadb ZIdcdd ZJdedf ZKejLG dgdh dhejMZNG didj dje(ZOdkdl ZPdmdn ZQdodp ZRdqdr ZSdsdt ZTdudv ZUdwdx ZVdydz ZWd{d| ZXd}d~ ZYdd ZZdd Z[dd Z\G dd dej]Z^dd Z_dS )z+Service-side implementation of gRPC Python.    N)futures)_common)_compression)_interceptor)cygrpc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    eAc                 C   s   | j d  S Nr   )batch_operationsmessage)Zrequest_event r   ,lib/python3.10/site-packages/grpc/_server.py_serialized_request6      r   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)codeZcygrpc_coder   r   r   _application_code:   s   r   c                 C   s   | j d u r	tjjS t| j S r   )r   r   r   okr   stater   r   r   _completion_code?   s   

r!   c                 C   s   | j d u r|S t| j S r   )r   r   )r    r   r   r   r   _abortion_codeF   s   

r"   c                 C   s   | j d u rdS | j S )N    )detailsr   r   r   r   _detailsM   s   r%   c                   @   s   e Zd ZdS )_HandlerCallDetailsN)__name__
__module____qualname__r   r   r   r   r&   Q   s    r&   )methodinvocation_metadatac                   @      e Zd Zdd ZdS )	_RPCStatec                 C   s^   t  | _t | _d | _t| _d| _d | _	d| _
d | _d | _d | _d| _g | _g | _d| _d S NTF)	threadingZ	Condition	conditionsetduerequest_OPENclientinitial_metadata_allowedcompression_algorithmdisable_next_compressiontrailing_metadatar   r$   statused
rpc_errors	callbacksabortedselfr   r   r   __init__[   s   

z_RPCState.__init__Nr'   r(   r)   r@   r   r   r   r   r-   Y   s    r-   c                 C   s   t  }| j| |r   )grpcZRpcErrorr;   append)r    Z	rpc_errorr   r   r   _raise_rpc_errorl   s   rD   c                 C   s2   | j | t| s| j s| j}d | _| |fS dS )NNr   )r2   remove_is_rpc_state_activer<   )r    tokenr<   r   r   r   _possibly_finish_callr   s   rI   c                        fdd}|S )Nc                    s4    j  t W  d    S 1 sw   Y  d S r   )r0   rI   )Z$unused_send_status_from_server_eventr    rH   r   r   r   ~      $z9_send_status_from_server.<locals>.send_status_from_serverr   )r    rH   r   r   rK   r   _send_status_from_server|   s   rM   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 r   )r0   r7   r   Z!compression_algorithm_to_metadatatuple)r    metadataZcompression_metadatar   r   r   _get_initial_metadata   s   

$rP   c                 C   s   t t| |t}|S r   )r   ZSendInitialMetadataOperationrP   _EMPTY_FLAGS)r    rO   	operationr   r   r   _get_initial_metadata_operation   s   
rS   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)r5   
_CANCELLEDr"   r$   r6   rS   r   SendStatusFromServerOperationr9   rQ   8_SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN_SEND_STATUS_FROM_SERVER_TOKENstart_server_batchrM   r:   r2   add)r    callr   r$   Zeffective_codeZeffective_details
operationsrH   r   r   r   _abort   s.   

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   )
r0   r   r   rU   r5   r4   _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   )r    r	   r   r   r   _receive_close_on_server   s   	rb   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!)r   r0   r5   r4   r_   r`   rI   _RECEIVE_MESSAGE_TOKENr   Zdeserializer]   r   r   internalr3   )Zreceive_message_eventZserialized_requestr3   r[   request_deserializerr    r   r   r      s(   

$
$z)_receive_message.<locals>.receive_messager   )r    r[   rg   r   r   rf   r   _receive_message   s   rh   c                    r^   )Nc                    s4    j  t tW  d    S 1 sw   Y  d S r   )r0   rI   _SEND_INITIAL_METADATA_TOKEN)Z"unused_send_initial_metadata_eventr   r   r   r
      rL   z5_send_initial_metadata.<locals>.send_initial_metadatar   )r    r
   r   r   r   _send_initial_metadata   s   rj   c                    rJ   )Nc                    s>    j   j   t W  d    S 1 sw   Y  d S r   )r0   r`   rI   )Zunused_send_message_eventrK   r   r   r      s   
$z#_send_message.<locals>.send_messager   )r    rH   r   r   rK   r   _send_message   s   rk   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%d& Zd'd( Zd)d* Zd+d, Zd-S )._Contextc                 C      || _ || _|| _d S r   )
_rpc_event_state_request_deserializer)r?   	rpc_eventr    rg   r   r   r   r@         
z_Context.__init__c                 C   s6   | j j t| j W  d    S 1 sw   Y  d S r   )ro   r0   rG   r>   r   r   r   	is_active   s   
$z_Context.is_activec                 C   s   t | jjjt  dS r   )maxrn   call_detailsZdeadlinetimer>   r   r   r   time_remaining   s   z_Context.time_remainingc                 C   s   | j j  d S r   )rn   r[   cancelr>   r   r   r   rx      s   z_Context.cancelc                 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)ro   r0   r<   rC   )r?   callbackr   r   r   add_callback   s   
$z_Context.add_callbackc                 C   s6   | j j d| j _W d    d S 1 sw   Y  d S rT   )ro   r0   r8   r>   r   r   r    disable_next_message_compression     

"z)_Context.disable_next_message_compressionc                 C      | j jS r   )rn   r+   r>   r   r   r   r+        z_Context.invocation_metadatac                 C   s   t | jj S r   )r   decodern   r[   peerr>   r   r   r   r        z_Context.peerc                 C   s   t | jjS r   )r   peer_identitiesrn   r[   r>   r   r   r   r     r   z_Context.peer_identitiesc                 C   s$   t | jj}|d u r|S t|S r   )r   peer_identity_keyrn   r[   r   r   )r?   Zid_keyr   r   r   r     s   z_Context.peer_identity_keyc                 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>  s    
z)_Context.auth_context.<locals>.<dictcomp>)r   auth_contextrn   r[   items)r?   r   Zauth_context_dictr   r   r   r     s
   z_Context.auth_contextc                 C   6   | j j || j _W d    d S 1 sw   Y  d S r   )ro   r0   r7   )r?   compressionr   r   r   set_compression  r|   z_Context.set_compressionc                 C   s   | j jC | j jtu rt| j  n&| j jr3t| j |}| jj	|ft
| j  d| j _| j jt ntdW d    d S W d    d S 1 sJw   Y  d S )NFz#Initial metadata no longer allowed!)ro   r0   r5   rU   rD   r6   rS   rn   r[   rY   rj   r2   rZ   ri   
ValueError)r?   Zinitial_metadatarR   r   r   r   r
   !  s"   

"z_Context.send_initial_metadatac                 C   r   r   )ro   r0   r9   )r?   r9   r   r   r   set_trailing_metadata0  r|   z_Context.set_trailing_metadatac                 C   r}   r   )ro   r9   r>   r   r   r   r9   4  r~   z_Context.trailing_metadatac                 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)rB   r   ZOK_LOGGERerrorZUNKNOWNro   r0   r   r   encoder$   r=   	Exception)r?   r   r$   r   r   r   abort7  s   
z_Context.abortc                 C   s   |j | j_ | |j|j d S r   )r9   ro   r   r   r$   )r?   statusr   r   r   abort_with_statusD  s   
z_Context.abort_with_statusc                 C   r   r   )ro   r0   r   )r?   r   r   r   r   set_codeH  r|   z_Context.set_codec                 C   r}   r   )ro   r   r>   r   r   r   r   L  r~   z_Context.codec                 C   s<   | j j t|| j _W d    d S 1 sw   Y  d S r   )ro   r0   r   r   r$   )r?   r$   r   r   r   set_detailsO  s   
"z_Context.set_detailsc                 C   r}   r   )ro   r$   r>   r   r   r   r$   S  r~   z_Context.detailsc                 C   s   d S r   r   r>   r   r   r   _finalize_stateV     z_Context._finalize_stateN)r'   r(   r)   r@   rs   rw   rx   rz   r{   r+   r   r   r   r   r   r
   r   r9   r   r   r   r   r   r$   r   r   r   r   r   rl      s.    rl   c                   @   sD   e Zd Zdd Zdd Zdd Zdd Zd	d
 Zdd Zdd Z	dS )_RequestIteratorc                 C   rm   r   )ro   _callrp   )r?   r    r[   rg   r   r   r   r@   \  rr   z_RequestIterator.__init__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 r   )ro   r5   rU   rD   rG   StopIterationr   rY   r   ReceiveMessageOperationrQ   rh   rp   r2   rZ   rd   r>   r   r   r   _raise_or_start_receive_messagea  s   


z0_RequestIterator._raise_or_start_receive_messagec                 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 r   )	ro   r5   rU   rD   r3   rd   r2   r   AssertionErrorr?   r3   r   r   r   _look_for_requestm  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 r   )ro   r0   r   waitr   r   r   r   r   _nextz  s   
z_RequestIterator._nextc                 C   s   | S r   r   r>   r   r   r   __iter__  r   z_RequestIterator.__iter__c                 C      |   S r   r   r>   r   r   r   __next__  r~   z_RequestIterator.__next__c                 C   r   r   r   r>   r   r   r   next  r~   z_RequestIterator.nextN)
r'   r(   r)   r@   r   r   r   r   r   r   r   r   r   r   r   Z  s    	r   c                    rc   )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.)r0   rG   r[   rY   r   r   rQ   rh   r2   rZ   rd   r   r3   r5   r_   formatru   r*   r]   r   unimplementedr   r   rU   )r$   r3   rg   rq   r    r   r   unary_request  sD   




	z%_unary_request.<locals>.unary_requestr   )rq   r    rg   r   r   r   r   _unary_request  s   r   c                 C   s  ddl m} || ||v}zd }|d ur||||}n|||}|dfW W  d    S  ty }	 zJ|j2 |jrEt|| jtjj	d n|	|j
vrad|	}
t|
 t|| jtjj	t|
 W d    n1 skw   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: {}NF)rB   r   r   r0   r=   r]   r[   r   r   r   r;   r   r   	exceptionr   r   )rq   r    behaviorargumentrg   send_response_callbackr   contextZresponse_or_iteratorr   r$   r   r   r   _call_behavior  sF   






r   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 )NTrT   r   z!Exception iterating responses: {}r   )r   r   r   r0   r=   r]   r[   r   r   r   r;   r   r   r   r   r   )rq   r    response_iteratorr   r$   r   r   r   %_take_response_from_response_iterator  s*   


	r   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   Z	serializer0   r]   r[   r   r   re   )rq   r    responseresponse_serializerserialized_responser   r   r   _serialize_response  s   
r   c                 C   s   | j rtjjS tS r   )r8   r   Z	WriteFlagZno_compressrQ   r   r   r   r   %_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   )r0   r8   r   r   r   r   _reset_per_message_state  s   "r   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   )r0   rG   r6   rS   r   SendMessageOperationr   -_SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN_SEND_MESSAGE_TOKENr[   rY   rk   r2   rZ   r   r   )rq   r    r   r\   rH   r   r   r   _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 rT   )r0   r5   rU   r!   r%   r   rV   r9   rQ   r6   rC   rS   r   r   r[   rY   rM   rX   r:   r   r2   rZ   )rq   r    r   r   r$   r\   r   r   r   _status  s8   
"r   c           
      C   s   t |  z@| }|d ur1t| ||||\}}|r8t| |||}	|	d ur?t| ||	 W t   d S W t   d S W t   d S W t   d S t   w r   )r   'install_context_from_request_call_eventr   r   r   uninstall_context)
rq   r    r   argument_thunkrg   r   r   r   proceedr   r   r   r   _unary_response_in_pool+  s(   
	r   c           
         s   t   fdd}zI| }|d urBt|dr(|jr(t||||d n(t|||\}}	|	rIt|| W t   d S W t   d S W t   d S W t   d S t   w )Nc                    sB   | d u rt d  d S t|  }|d urt| d S d S r   )r   r   r   )r   r   r   rq   r    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   )
rq   r    r   r   rg   r   r   r   r   r   r   r   r   _stream_response_in_pool<  s:   



r   c                 C   s   | j tuo| j S r   )r5   rU   r:   r   r   r   r   rG   _  r   rG   c                 C   s2   	 t | ||\}}|r|| t|sd S nd S qr   )r   rG   )rq   r    r   r   r   r   r   r   r   r   c  s   r   c                 C   s"   t | drt| jtjr| jS |S )Nexperimental_thread_pool)r   
isinstancer   r   ZThreadPoolExecutor)r   default_thread_poolr   r   r    _select_thread_pool_for_behaviorq  s
   r   c              	   C   6   t | ||j}t|j|}|t| ||j||j|jS r   )r   rg   r   Zunary_unarysubmitr   r   rq   r    method_handlerr   r   thread_poolr   r   r   _handle_unary_unaryy     
r   c              	   C   r   r   )r   rg   r   Zunary_streamr   r   r   r   r   r   r   _handle_unary_stream  r   r   c              	      @   t || j|j t|j|}|t| ||j fdd|j|jS )Nc                          S r   r   r   Zrequest_iteratorr   r   <lambda>      z&_handle_stream_unary.<locals>.<lambda>)r   r[   rg   r   Zstream_unaryr   r   r   rq   r    r   r   r   r   r   r   _handle_stream_unary  s   

r   c              	      r   )Nc                      r   r   r   r   r   r   r   r     r   z'_handle_stream_stream.<locals>.<lambda>)r   r[   rg   r   Zstream_streamr   r   r   r   r   r   r   _handle_stream_stream  s   

r   c                    s>    fdd}t t| jj| j}|d ur|||S ||S )Nc                    s(    D ]}| | }|d ur|  S qd S r   )service)handler_call_detailsZgeneric_handlerr   generic_handlersr   r   query_handlers  s   
z,_find_method_handler.<locals>.query_handlers)r&   r   r   ru   r*   r+   Zexecute)rq   r   interceptor_pipeliner   r   r   r   r   _find_method_handler  s   r   c                    sB   t   t d tttd ||tf}| j| fdd  S )Nc                    s    dfS rE   r   )Zignored_event	rpc_stater   r   r     s   z_reject_rpc.<locals>.<lambda>)r-   rS   r   ReceiveCloseOnServerOperationrQ   rV   r[   rY   )rq   r   r$   r\   r   r   r   _reject_rpc  s   
r   c                 C   s   t  }|j] | jttft| |j	t
 |jr@|jr0|t| |||fW  d    S |t| |||fW  d    S |jrS|t| |||fW  d    S |t| |||fW  d    S 1 sfw   Y  d S r   )r-   r0   r[   rY   r   r   rQ   rb   r2   rZ   ra   Zrequest_streamingZresponse_streamingr   r   r   r   )rq   r   r   r    r   r   r   _handle_with_method_handler  s4   

$r   c              
   C   s   | j sdS | jjd urZzt| ||}W n& ty9 } zd|}t| t| t	j
jdd fW  Y d }~S d }~ww |d u rHt| t	j
jdd fS |rTt| t	j
jdd fS t| ||S dS )N)NNzException servicing handler: {}s   Error in service handler!s   Method not found!s   Concurrent RPC limit exceeded!)Zsuccessru   r*   r   r   r   r   r   r   r   r   r   r   Zresource_exhaustedr   )rq   r   r   r   concurrency_exceededr   r   r$   r   r   r   _handle_call  sB   




r   c                   @   s   e Zd ZdZdZdZdS )_ServerStageZstoppedZstartedgraceN)r'   r(   r)   STOPPEDSTARTEDGRACEr   r   r   r   r     s    r   c                   @   r,   )_ServerStatec                 C   sn   t  | _|| _|| _t|| _|| _|| _t	j
| _t  | _| jg| _|| _d| _t | _t | _d| _d S )Nr   F)r/   RLocklockcompletion_queueserverlistr   r   r   r   r   stageEventtermination_eventshutdown_eventsmaximum_concurrent_rpcsactive_rpc_countr1   
rpc_statesr2   server_deallocated)r?   r   r   r   r   r   r  r   r   r   r@     s   




z_ServerState.__init__NrA   r   r   r   r   r     s    r   c                 C   s8   | j  | j| W d    d S 1 sw   Y  d S r   )r   r   extend)r    r   r   r   r   _add_generic_handlers  s   "r  c                 C   s6   | j  | j|W  d    S 1 sw   Y  d S r   )r   r   add_http2_port)r    addressr   r   r   _add_insecure_port!  s   
$r	  c                 C   s:   | j  | j||jW  d    S 1 sw   Y  d S r   )r   r   r  Z_credentials)r    r  server_credentialsr   r   r   _add_secure_port&  s
   $r  c                 C   s$   | j | j| jt | jt d S r   )r   r   r   _REQUEST_CALL_TAGr2   rZ   r   r   r   r   _request_call,  s   r  c                 C   s:   | j s| js| j  | jD ]}|  qtj| _dS dS r.   )	r  r2   r   Zdestroyr   r1   r   r   r   )r    shutdown_eventr   r   r   _stop_serving3  s   


r  c                 C   s:   | j  |  jd8  _W d    d S 1 sw   Y  d S )N   )r   r  r   r   r   r   _on_call_completed>  s   "r  c              	      s  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 r jf  jt  jd uoJ j jk}t	| j
 j j|\}}|d urb j| |d urv  jd7  _| fdd  jtju rt  nt rd}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 rd}W d    |S W d    |S 1 sw   Y  |S )NTFr  c                    s   t  S r   )r  )Zunused_futurer   r   r   r   Y  s    z-_process_event_and_continue.<locals>.<lambda>zException calling callback!)tag_SHUTDOWN_TAGr   r2   rF   r  r  r  r  r   r   r   r   r  rZ   Zadd_done_callbackr   r   r   r  r   r   r   )r    eventZshould_continuer   r   Z
rpc_futurer<   ry   r   r   r   _process_event_and_continueC  s   

$
$$










r  c                 C   sJ   	 t   t }| j|}| jrt|  |jtjj	kr"t
| |s"d S d }qr   )rv   "_DEALLOCATED_SERVER_CHECK_PERIOD_Sr   Zpollr  _begin_shutdown_onceZcompletion_typer   ZCompletionTypeZqueue_timeoutr  )r    timeoutr  r   r   r   _servem  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 r   )r   r   r   r   r   r   r   r  r   r2   rZ   r   r   r   r   r  |  s   "r  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   r   cancel_all_callsr   r   r  r    r   r   cancel_all_calls_after_grace  s   "z+_stop.<locals>.cancel_all_calls_after_grace)target)r   r   r   r   r/   r   r1   r  r   rC   r   r  Threadstartr   )r    r   r  threadr   r  r   _stop  s(   
r"  c                 C   sx   | j / | jtjurtd| j  tj| _t|  t	j
t| fd}d|_|  W d    d S 1 s5w   Y  d S )Nz$Cannot start already-started server!)r  argsT)r   r   r   r   r   r   r   r   r  r/   r  r  Zdaemon)r    r!  r   r   r   _start  s   

"r$  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   )generic_rpc_handlersZgeneric_rpc_handlerZservice_attributer   r   r   _validate_generic_rpc_handlers  s   r(  c                 C   s   t |}t| | S r   )r   Zcreate_channel_optionrN   )Zbase_optionsr   Zcompression_optionr   r   r   _augment_options  s   
r)  c                   @   sN   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdddZdd Z	dd Z
dS )_Serverc           
      C   sB   t  }t t|||}	|	| t||	|t|||| _d S r   )	r   ZCompletionQueueServerr)  Zregister_completion_queuer   r   Zservice_pipelinero   )
r?   r   r   interceptorsoptionsr  r   xdsr   r   r   r   r   r@     s   

z_Server.__init__c                 C   s   t | t| j| d S r   )r(  r  ro   )r?   r'  r   r   r   add_generic_rpc_handlers  s   z _Server.add_generic_rpc_handlersc                 C   s   t |t| jt |S r   )r   validate_port_binding_resultr	  ro   r   )r?   r  r   r   r   add_insecure_port  s   z_Server.add_insecure_portc                 C   s   t |t| jt ||S r   )r   r0  r  ro   r   )r?   r  r
  r   r   r   add_secure_port  s   z_Server.add_secure_portc                 C   s   t | j d S r   )r$  ro   r>   r   r   r   r     r   z_Server.startNc                 C   s   t j| jjj| jjj|dS r  )r   r   ro   r   Zis_set)r?   r  r   r   r   wait_for_termination  s   z_Server.wait_for_terminationc                 C   s   t | j|S r   )r"  ro   )r?   r   r   r   r   stop  s   z_Server.stopc                 C   s   t | drd| j_d S d S )Nro   T)r   ro   r  r>   r   r   r   __del__  s   
z_Server.__del__r   )r'   r(   r)   r@   r/  r1  r2  r   r3  r4  r5  r   r   r   r   r*    s    	
r*  c                 C   s   t | t| ||||||S r   )r(  r*  )r   r'  r,  r-  r  r   r.  r   r   r   create_server  s   
r6  r   )`__doc__collectionsZ
concurrentr   enumZloggingr/   rv   rB   r   r   r   Zgrpc._cythonr   Z	getLoggerr'   r   r  r  ra   ri   rd   r   r   rX   rW   r4   r_   rU   rQ   r  Z_INF_TIMEOUTr   r   r!   r"   r%   
namedtupleZHandlerCallDetailsr&   objectr-   rD   rI   rM   rP   rS   r]   rb   rh   rj   rk   ZServicerContextrl   r   r   r   r   r   r   r   r   r   r   r   rG   r   r   r   r   r   r   r   r   r   r   uniqueEnumr   r   r  r	  r  r  r  r  r  r  r  r"  r$  r(  r)  r+  r*  r6  r   r   r   r   <module>   s   



		
o3%
#*	/