a
    v=ic$                     @   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 ddl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 Z0d1d2 Z1d3d4 Z2d5d6 Z3d7d8 Z4G d9d: d:ej5Z6G d;d< d<e)Z7d=d> Z8dd?d@Z9dAdB Z:dCdD Z;dEdF Z<dGdH Z=dIdJ Z>dKdL Z?dMdN Z@dOdP ZAdQdR ZBdSdT ZCdUdV ZDdWdX ZEdYdZ ZFd[d\ ZGd]d^ ZHd_d` ZIdadb ZJdcdd ZKdedf ZLejMG dgdh dhejNZOG didj dje)ZPdkdl ZQdmdn ZRdodp ZSdqdr ZTdsdt ZUdudv ZVdwdx ZWdydz ZXd{d| ZYd}d~ ZZdd Z[dd 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   ]/home/droni/.local/share/virtualenvs/DPS-5Je3_V2c/lib/python3.9/site-packages/grpc/_server.py_serialized_request7   s    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 d S r   )r   r   r   okr   stater   r   r   _completion_code@   s    
r    c                 C   s   | j d u r|S t| j S d S r   )r   r   )r   r   r   r   r   _abortion_codeG   s    
r!   c                 C   s   | j d u rdS | j S )N    )detailsr   r   r   r   _detailsN   s    r$   c                   @   s   e Zd ZdS )_HandlerCallDetailsN)__name__
__module____qualname__r   r   r   r   r%   R   s   r%   )methodinvocation_metadatac                   @   s   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)	threading	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+   Z   s   r+   c                 C   s   t  }| j| |d S r   )grpcZRpcErrorr:   append)r   Z	rpc_errorr   r   r   _raise_rpc_errorm   s    rC   c                 C   s6   | j | t| s.| j s.| j}d | _| |fS dS d S )NNr   )r1   remove_is_rpc_state_activer;   )r   tokenr;   r   r   r   _possibly_finish_calls   s    rH   c                    s    fdd}|S )Nc                    s4    j  t W  d    S 1 s&0    Y  d S r   )r/   rH   )Z$unused_send_status_from_server_eventr   rG   r   r   r      s    z9_send_status_from_server.<locals>.send_status_from_serverr   )r   rG   r   r   rI   r   _send_status_from_server}   s    rJ   c                 C   s   | j l | jrRt| jf}|d u r6|W  d    S |t| W  d    S n|W  d    S W d    n1 sx0    Y  d S r   )r/   r6   r   Z!compression_algorithm_to_metadatatuple)r   metadataZcompression_metadatar   r   r   _get_initial_metadata   s    rM   c                 C   s   t t| |t}|S r   )r   ZSendInitialMetadataOperationrM   _EMPTY_FLAGS)r   rL   	operationr   r   r   _get_initial_metadata_operation   s    
rP   c                 C   s   | j turt| |}| jd u r"|n| j}| jrPt| d t| j||t	f}t
}nt| j||t	f}t}||t| | d| _| j| d S NT)r4   
_CANCELLEDr!   r#   r5   rP   r   SendStatusFromServerOperationr8   rN   8_SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN_SEND_STATUS_FROM_SERVER_TOKENstart_server_batchrJ   r9   r1   add)r   callr   r#   Zeffective_codeZeffective_details
operationsrG   r   r   r   _abort   s,    

rZ   c                    s    fdd}|S )Nc                    sd    j J | jd  rt _n jtu r.t _ j   t t	W  d    S 1 sV0    Y  d S r   )
r/   r   r   rR   r4   r3   _CLOSED
notify_allrH   _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    	r^   c                    s    fdd}|S )Nc                    s   t | }|d u r\j4 jtu r(t_j  ttW  d    S 1 sP0    Y  nht	|}jF |d u rt
 tjjd n|_j  ttW  d    S 1 s0    Y  d S )Ns    Exception deserializing request!)r   r/   r4   r3   r[   r\   rH   _RECEIVE_MESSAGE_TOKENr   ZdeserializerZ   r   r   internalr2   )Zreceive_message_eventZserialized_requestr2   rX   request_deserializerr   r   r   r      s$    

*
z)_receive_message.<locals>.receive_messager   )r   rX   rb   r   r   ra   r   _receive_message   s    rc   c                    s    fdd}|S )Nc                    s4    j  t tW  d    S 1 s&0    Y  d S r   )r/   rH   _SEND_INITIAL_METADATA_TOKEN)Z"unused_send_initial_metadata_eventr   r   r   r
      s    z5_send_initial_metadata.<locals>.send_initial_metadatar   )r   r
   r   r   r   _send_initial_metadata   s    re   c                    s    fdd}|S )Nc                    s>    j $  j   t W  d    S 1 s00    Y  d S r   )r/   r\   rH   )Zunused_send_message_eventrI   r   r   r      s    
z#_send_message.<locals>.send_messager   )r   rG   r   r   rI   r   _send_message   s    rf   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   s   || _ || _|| _d S r   )
_rpc_event_state_request_deserializer)r>   	rpc_eventr   rb   r   r   r   r?      s    z_Context.__init__c                 C   s6   | j j t| j W  d    S 1 s(0    Y  d S r   )ri   r/   rF   r=   r   r   r   	is_active   s    
z_Context.is_activec                 C   s   t | jjjt  dS r   )maxrh   call_detailsdeadlinetimer=   r   r   r   time_remaining   s    z_Context.time_remainingc                 C   s   | j j  d S r   )rh   rX   cancelr=   r   r   r   rr      s    z_Context.cancelc                 C   sf   | j jJ | j jd u r&W d    dS | j j| W d    dS W d    n1 sX0    Y  d S )NFT)ri   r/   r;   rB   )r>   callbackr   r   r   add_callback   s
    
z_Context.add_callbackc                 C   s4   | j j d| j _W d    n1 s&0    Y  d S rQ   )ri   r/   r7   r=   r   r   r    disable_next_message_compression  s    
z)_Context.disable_next_message_compressionc                 C   s   | j jS r   )rh   r*   r=   r   r   r   r*   	  s    z_Context.invocation_metadatac                 C   s   t | jj S r   )r   decoderh   rX   peerr=   r   r   r   rw     s    z_Context.peerc                 C   s   t | jjS r   )r   peer_identitiesrh   rX   r=   r   r   r   rx     s    z_Context.peer_identitiesc                 C   s$   t | jj}|d u r|S t|S r   )r   peer_identity_keyrh   rX   r   rv   )r>   Zid_keyr   r   r   ry     s    z_Context.peer_identity_keyc                 C   s   dd t t| jjD S )Nc                 S   s   i | ]\}}t ||qS r   )r   rv   ).0keyvaluer   r   r   
<dictcomp>  s   z)_Context.auth_context.<locals>.<dictcomp>)six	iteritemsr   auth_contextrh   rX   r=   r   r   r   r     s
    z_Context.auth_contextc                 C   s4   | j j || j _W d    n1 s&0    Y  d S r   )ri   r/   r6   )r>   compressionr   r   r   set_compression  s    
z_Context.set_compressionc                 C   s   | j jt | j jtu r"t| j  nL| j jrft| j |}| jj	|ft
| j  d| j _| j jt ntdW d    n1 s0    Y  d S )NFz#Initial metadata no longer allowed!)ri   r/   r4   rR   rC   r5   rP   rh   rX   rV   re   r1   rW   rd   
ValueError)r>   Zinitial_metadatarO   r   r   r   r
      s    
z_Context.send_initial_metadatac                 C   s4   | j j || j _W d    n1 s&0    Y  d S r   )ri   r/   r8   )r>   r8   r   r   r   set_trailing_metadata/  s    
z_Context.set_trailing_metadatac                 C   s   | j jS r   )ri   r8   r=   r   r   r   r8   3  s    z_Context.trailing_metadatac                 C   sr   |t jjkr"td t jj}d}| jj4 || j_t	
|| j_d| j_t W d    n1 sd0    Y  d S )Nz4abort() called with StatusCode.OK; returning UNKNOWN T)rA   r   OK_LOGGERerrorUNKNOWNri   r/   r   r   encoder#   r<   	Exception)r>   r   r#   r   r   r   abort6  s    
z_Context.abortc                 C   s   |j | j_ | |j|j d S r   )r8   ri   r   r   r#   )r>   statusr   r   r   abort_with_statusC  s    
z_Context.abort_with_statusc                 C   s4   | j j || j _W d    n1 s&0    Y  d S r   )ri   r/   r   )r>   r   r   r   r   set_codeG  s    
z_Context.set_codec                 C   s   | j jS r   )ri   r   r=   r   r   r   r   K  s    z_Context.codec                 C   s:   | j j t|| j _W d    n1 s,0    Y  d S r   )ri   r/   r   r   r#   )r>   r#   r   r   r   set_detailsN  s    
z_Context.set_detailsc                 C   s   | j jS r   )ri   r#   r=   r   r   r   r#   R  s    z_Context.detailsc                 C   s   d S r   r   r=   r   r   r   _finalize_stateU  s    z_Context._finalize_stateN)r&   r'   r(   r?   rl   rq   rr   rt   ru   r*   rw   rx   ry   r   r   r
   r   r8   r   r   r   r   r   r#   r   r   r   r   r   rg      s,   rg   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   s   || _ || _|| _d S r   )ri   _callrj   )r>   r   rX   rb   r   r   r   r?   [  s    z_RequestIterator.__init__c                 C   s`   | j jtu rt| j  nDt| j s*t n2| jt	t
ft| j | j| j | j jt d S r   )ri   r4   rR   rC   rF   StopIterationr   rV   r   ReceiveMessageOperationrN   rc   rj   r1   rW   r_   r=   r   r   r   _raise_or_start_receive_message`  s    


z0_RequestIterator._raise_or_start_receive_messagec                 C   sV   | j jtu rt| j  n4| j jd u r8t| j jvr8t n| j j}d | j _|S t d S r   )	ri   r4   rR   rC   r2   r_   r1   r   AssertionErrorr>   r2   r   r   r   _look_for_requestl  s    
z"_RequestIterator._look_for_requestc                 C   sd   | j jH |   | j j  |  }|d ur|W  d    S qW d    n1 sV0    Y  d S r   )ri   r/   r   waitr   r   r   r   r   _nexty  s    
z_RequestIterator._nextc                 C   s   | S r   r   r=   r   r   r   __iter__  s    z_RequestIterator.__iter__c                 C   s   |   S r   r   r=   r   r   r   __next__  s    z_RequestIterator.__next__c                 C   s   |   S r   r   r=   r   r   r   next  s    z_RequestIterator.nextN)
r&   r'   r(   r?   r   r   r   r   r   r   r   r   r   r   r   Y  s   	r   c                    s    fdd}|S )Nc                     s   j  ts W d    d S jttftj  j	t
 j   jd u rjtu rdjj} tjtjjt|  W d    d S jtu rW d    d S qLj}d _|W  d    S qLW d    n1 s0    Y  d S )Nz*"{}" requires exactly one request message.)r/   rF   rX   rV   r   r   rN   rc   r1   rW   r_   r   r2   r4   r[   formatrn   r)   rZ   r   unimplementedr   r   rR   )r#   r2   rb   rk   r   r   r   unary_request  s4    




z%_unary_request.<locals>.unary_requestr   )rk   r   rb   r   r   r   r   _unary_request  s    r   c                 C   s,  ddl m} || || }z<d }|d ur8||||}n
|||}|dfW W  d    S  ty }	 z|jd |jrt|| jtjj	d n8|	|j
vrd|	}
t|
 t|| jtjj	t|
 W d    n1 s0    Y  W Y d }	~	W d    dS d }	~	0 0 W d    n1 s0    Y  d S )Nr   )_create_servicer_contextT   RPC Abortedz!Exception calling application: {}NF)rA   r   r   r/   r<   rZ   rX   r   r   r   r:   r   r   	exceptionr   r   )rk   r   behaviorargumentrb   send_response_callbackr   contextZresponse_or_iteratorr   r#   r   r   r   _call_behavior  s8    


"r   c                 C   s   zt |dfW S  ty"   Y dS  ty } z|jd |jrTt|| jtjj	d n8||j
vrd|}t| t|| jtjj	t| W d    n1 s0    Y  W Y d }~dS d }~0 0 d S )NTrQ   r   z!Exception iterating responses: {}r   )r   r   r   r/   r<   rZ   rX   r   r   r   r:   r   r   r   r   r   )rk   r   response_iteratorr   r#   r   r   r   %_take_response_from_response_iterator  s"    


"r   c                 C   sZ   t ||}|d u rR|j$ t|| jtjjd W d    n1 sD0    Y  d S |S d S )Ns   Failed to serialize response!)r   	serializer/   rZ   rX   r   r   r`   )rk   r   responseresponse_serializerserialized_responser   r   r   _serialize_response  s    "r   c                 C   s   | j rtjjS tS d S r   )r7   r   Z	WriteFlagZno_compressrN   r   r   r   r   %_get_send_message_op_flags_from_state  s    r   c                 C   s0   | j  d| _W d    n1 s"0    Y  d S r   )r/   r7   r   r   r   r   _reset_per_message_state  s    r   c                 C   s   |j  t|s W d    dS |jrLt|d t|t|f}d|_t}nt|t|f}t}| j	
|t|| |j| t| |j   ||jvrt|W  d    S qW d    n1 s0    Y  d S r   )r/   rF   r5   rP   r   SendMessageOperationr   -_SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN_SEND_MESSAGE_TOKENrX   rV   rf   r1   rW   r   r   )rk   r   r   rY   rG   r   r   r   _send_response  s2    

r   c                 C   s   |j  |jturt|}t|}t|j||tg}|j	rL|
t|d  |d urj|
t|t| | j|t|t d|_t| |jt W d    n1 s0    Y  d S rQ   )r/   r4   rR   r    r$   r   rS   r8   rN   r5   rB   rP   r   r   rX   rV   rJ   rU   r9   r   r1   rW   )rk   r   r   r   r#   rY   r   r   r   _status  s2    
r   c           
      C   sn   t |  zT| }|d urTt| ||||\}}|rTt| |||}	|	d urTt| ||	 W t   n
t   0 d S r   )r   'install_context_from_request_call_eventr   r   r   uninstall_context)
rk   r   r   argument_thunkrb   r   r   r   proceedr   r   r   r   _unary_response_in_pool*  s    
r   c           
         s   t   fdd}zf| }|d urvt|drP|jrPt||||d n&t|||\}}	|	rvt|| W t   n
t   0 d S )Nc                    s<   | d u rt d  n"t|  }|d ur8t| d S r   )r   r   r   )r   r   r   rk   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   )
rk   r   r   r   rb   r   r   r   r   r   r   r   r   _stream_response_in_pool;  s.    



r   c                 C   s   | j tuo| j S r   )r4   rR   r9   r   r   r   r   rF   ^  s    rF   c                 C   s0   t | ||\}}|r,|| t|s*q,q q,q d S r   )r   rF   )rk   r   r   r   r   r   r   r   r   r   b  s    r   c                 C   s&   t | drt| jtjr| jS |S d S )Nexperimental_thread_pool)r   
isinstancer   r   ThreadPoolExecutor)r   default_thread_poolr   r   r    _select_thread_pool_for_behaviorp  s
    r   c              	   C   s6   t | ||j}t|j|}|t| ||j||j|jS r   )r   rb   r   Zunary_unarysubmitr   r   rk   r   method_handlerr   r   thread_poolr   r   r   _handle_unary_unaryx  s    
r   c              	   C   s6   t | ||j}t|j|}|t| ||j||j|jS r   )r   rb   r   Zunary_streamr   r   r   r   r   r   r   _handle_unary_stream  s    
r   c              	      s@   t || j|j t|j|}|t| ||j fdd|j|jS )Nc                      s    S r   r   r   Zrequest_iteratorr   r   <lambda>  r"   z&_handle_stream_unary.<locals>.<lambda>)r   rX   rb   r   Zstream_unaryr   r   r   rk   r   r   r   r   r   r   r   _handle_stream_unary  s    

r   c              	      s@   t || j|j t|j|}|t| ||j fdd|j|jS )Nc                      s    S r   r   r   r   r   r   r     r"   z'_handle_stream_stream.<locals>.<lambda>)r   rX   rb   r   Zstream_streamr   r   r   r   r   r   r   _handle_stream_stream  s    

r   c                    sB    fdd}t t| jj| j}|d ur6|||S ||S d 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   rv   rn   r)   r*   execute)rk   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 rD   r   )Zignored_event	rpc_stater   r   r     s    z_reject_rpc.<locals>.<lambda>)r+   rP   r   ReceiveCloseOnServerOperationrN   rS   rX   rV   )rk   r   r#   rY   r   r   r   _reject_rpc  s    
r   c                 C   s   t  }|j | jttft| |j	t
 |jr|jr`|t| |||fW  d    S |t| |||fW  d    S nF|jr|t| |||fW  d    S |t| |||fW  d    S W d    n1 s0    Y  d S r   )r+   r/   rX   rV   r   r   rN   r^   r1   rW   r]   Zrequest_streamingZresponse_streamingr   r   r   r   )rk   r   r   r   r   r   r   _handle_with_method_handler  s,    
r   c              
   C   s   | j s
dS | jjd urzt| ||}W nL tyr } z4d|}t| t| t	j
jdd fW  Y d }~S d }~0 0 |d u rt| t	j
jdd fS |rt| t	j
jdd fS t| ||S ndS d S )N)NNzException servicing handler: {}s   Error in service handler!s   Method not found!s   Concurrent RPC limit exceeded!)successrn   r)   r   r   r   r   r   r   r   r   r   r   Zresource_exhaustedr   )rk   r   r   r   concurrency_exceededr   r   r#   r   r   r   _handle_call  s>    




r   c                   @   s   e Zd ZdZdZdZdS )_ServerStagestoppedstartedgraceN)r&   r'   r(   STOPPEDSTARTEDGRACEr   r   r   r   r     s   r   c                   @   s   e Zd Zdd ZdS )_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_countr0   
rpc_statesr1   server_deallocated)r>   r   r   r   r   r   r   r   r   r   r?     s    



z_ServerState.__init__Nr@   r   r   r   r   r     s   r   c                 C   s6   | j  | j| W d    n1 s(0    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(0    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,0    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_TAGr1   rW   r   r   r   r   _request_call+  s    r  c                 C   s>   | j s6| js6| j  | jD ]}|  qtj| _dS dS d S r,   )	r   r1   r   destroyr   r0   r   r   r   )r   shutdown_eventr   r   r   _stop_serving2  s    


r  c                 C   s8   | j  |  jd8  _W d    n1 s*0    Y  d S )N   )r   r   r   r   r   r   _on_call_completed=  s    r	  c              	      s  d}|j tu rP j(  jt t r.d}W d    n1 sB0    Y  n`|j tu r  j  jt  jd uo j jk}t	| j
 j j|\}}|d ur j| |d ur܈  jd7  _| fdd  jtju rt  nt rd}W d    n1 s0    Y  n| |\}}|D ]0}z
|  W n ty^   td Y n0 q2|d ur j*  j| t rd}W d    n1 s0    Y  |S )NTFr  c                    s   t  S r   )r	  )Zunused_futurer   r   r   r   X  r"   z-_process_event_and_continue.<locals>.<lambda>zException calling callback!)tag_SHUTDOWN_TAGr   r1   rE   r  r  r   r   r   r   r   r   r   rW   add_done_callbackr   r   r   r  r   r   r   )r   eventZshould_continuer   r   Z
rpc_futurer;   rs   r   r   r   _process_event_and_continueB  sP    
&



&


$r  c                 C   sL   t   t }| j|}| jr&t|  |jtjj	krBt
| |sBd S d }q d S r   )rp   "_DEALLOCATED_SERVER_CHECK_PERIOD_Sr   pollr   _begin_shutdown_oncecompletion_typer   ZCompletionTypeZqueue_timeoutr  )r   timeoutr  r   r   r   _servel  s    
r  c                 C   sZ   | j @ | jtju r8| j| jt tj| _| j	
t W d    n1 sL0    Y  d S r   )r   r   r   r   r   r   r   r  r   r1   rW   r   r   r   r   r  {  s
    r  c                    s   j  jtju r6t   W  d    S t t j	  d u rfj
  n6 fdd}tj|d}|  W  d    S W d    n1 s0    Y    S )Nc                      s@   j  d j j  W d    n1 s20    Y  d S N)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   r0   r  r   rB   r   r  Threadstartr   )r   r   r  threadr   r  r   _stop  s     0r  c                 C   sv   | j \ | jtjurtd| j  tj| _t|  t	j
t| fd}d|_|  W d    n1 sh0    Y  d S )Nz$Cannot start already-started server!)r  argsT)r   r   r   r   r   r   r  r   r  r-   r  r  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_optionrK   )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_pipelineri   )
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   ri   )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   ri   r   )r>   r   r   r   r   add_insecure_port  s    z_Server.add_insecure_portc                 C   s   t |t| jt ||S r   )r   r,  r  ri   r   )r>   r   r  r   r   r   add_secure_port  s    z_Server.add_secure_portc                 C   s   t | j d S r   )r   ri   r=   r   r   r   r    s    z_Server.startNc                 C   s   t j| jjj| jjj|dS r  )r   r   ri   r   is_set)r>   r  r   r   r   wait_for_termination  s    z_Server.wait_for_terminationc                 C   s   t | j|S r   )r  ri   )r>   r   r   r   r   stop  s    z_Server.stopc                 C   s   t | drd| j_d S )Nri   T)r   ri   r   r=   r   r   r   __del__  s    
z_Server.__del__)N)r&   r'   r(   r?   r+  r-  r.  r  r0  r1  r2  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    
r3  )N)a__doc__collections
concurrentr   enumloggingr-   rp   rA   r   r   r   Zgrpc._cythonr   r~   	getLoggerr&   r   r  r  r]   rd   r_   r   r   rU   rT   r3   r[   rR   rN   r  Z_INF_TIMEOUTr   r   r    r!   r$   
namedtupleZHandlerCallDetailsr%   objectr+   rC   rH   rJ   rM   rP   rZ   r^   rc   re   rf   ZServicerContextrg   r   r   r   r   r   r   r   r   r   r   r   rF   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&  r3  r   r   r   r   <module>   s   



		
m3% 
#*	/