U
    ڲg=                 	   @   sx  d 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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 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$Ze%e&Z'd(ej)Z*dZ+e,ddk	Z-ej.j/ej.j0ej.j1ej.j2ej.j3ej.j4fZ5ej.j/ej.j0ej.j1ej.j2ej.j4fZ6ej.j/ej.j2ej.j3ej.j4fZ7ej.j/ej.j2ej.j4fZ8dZ9dZ:dZ;ee< ee< dddZ=eej> ee? e?dddZ@G dd deAZBeBej>e?dddd ZCejDeBee ee  d!d"d#ZEeBee e#d$d%d&ZFeeBeejGejHf e"ee# dd'd(d)ZIe?eBe?d*d+d,ZJG d-d. d.ejKejLejMZNG d/d0 d0ejKejOZPG d1d2 d2ePejLejMZQG d3d4 d4ePejLejMZRe
ee< e"eee< eeS eejK f d5d6d7ZTeBejHeUee< ee!ee!ejLf f d8d9d:ZVee eWeeejX  d;d<d=ZYee eWeeeejX ee# f  d;d>d?ZZee< ee< d@dAdBZ[G dCdD dDej\Z]G dEdF dFej^Z_G dGdH dHej^Z`G dIdJ dJejaZbG dKdL dLejcZdG dMdN dNeWZeG dOdP dPeAZfefddQdRdSZgefdTdUdVZhG dWdX dXeAZieieeejjgdf  dQdYdZZkeiejjeeejjgdf  dd[d\d]Zleieeejjgdf  dd^d_d`ZmeiejneUddadbdcZoeieejjgdf eUddddedfZpeieejjgdf ddgdhdiZqee eejr ee djdkdlZsee eee ee f dmdndoZtG dpdq dqejnZndS )rz.Invocation-side implementation of gRPC Python.    N)
AnyCallableDictIteratorListOptionalSequenceSetTupleUnion)_common)_compression)_grpcio_metadata)_observability)cygrpc)ChannelArgumentType)DeserializingFunction)IntegratedCallFactory)MetadataType)NullaryCallbackType)ResponseType)SerializingFunction)UserTagzgrpc-python/{}Z!GRPC_SINGLE_THREADED_UNARY_STREAMz0Exception calling channel subscription callback!z?<{} of RPC that terminated with:
	status = {}
	details = "{}"
>zZ<{} of RPC that terminated with:
	status = {}
	details = "{}"
	debug_error_string = "{}"
>timeoutreturnc                 C   s   | d krd S t   |  S N)timer    r   1/tmp/pip-unpacked-wheel-8poujhl6/grpc/_channel.py	_deadlinem   s    r!   )unknown_cygrpc_codedetailsr   c                 C   s   d | |S )Nz,Server sent unknown code {} and details "{}")format)r"   r#   r   r   r    _unknown_code_detailsq   s     r%   c                   @   s   e Zd ZU ejed< eej ed< e	e
 ed< eed< e	e
 ed< e	ej ed< e	e ed< e	e ed< eed	< ee ed
< e	e ed< e	e ed< e	e ed< e	e ed< e	e ed< eej e	e
 e	e
 e	ej e	e dddZdd ZdS )	_RPCState	conditiondueinitial_metadataresponsetrailing_metadatacoder#   debug_error_string	cancelled	callbacks
fork_epochrpc_start_timerpc_end_timemethodtarget)r(   r)   r+   r,   r#   c                 C   sj   t  | _t|| _|| _d | _|| _|| _|| _	d | _
d | _d | _d | _d | _d| _g | _t | _d S NF)	threading	Conditionr'   setr(   r)   r*   r+   r,   r#   r-   r1   r2   r3   r4   r.   r/   r   get_fork_epochr0   )selfr(   r)   r+   r,   r#   r   r   r    __init__   s    


z_RPCState.__init__c                 C   s   t  | _d S r   )r6   r7   r'   r:   r   r   r    reset_postfork_child   s    z_RPCState.reset_postfork_childN)__name__
__module____qualname__r6   r7   __annotations__r	   r   OperationTyper   r   r   grpc
StatusCodestrboolr   r   intfloatr   r;   r=   r   r   r   r    r&   y   s,   

(r&   )stater,   r#   r   c                 C   s0   | j d kr,|| _ || _| jd kr&d| _d| _d S Nr   )r,   r#   r)   r+   )rI   r,   r#   r   r   r    _abort   s    

rK   )eventrI   response_deserializerr   c           
      C   s$  g }| j D ]}| }|j| |tjjkr<| |_q
|tjjkr|	 }|d k	rt
||}|d krd}t|tjj| n||_q
|tjjkr
| |_|jd krt
j| }	|	d krtjj|_t|	| |_n|	|_| |_| |_t |_t| | |j! d |_!q
|S )Nz!Exception deserializing response!)"Zbatch_operationstyper(   remover   rB   receive_initial_metadatar)   receive_messagemessager   ZdeserializerK   rC   rD   INTERNALr*   receive_status_on_clientr+   r,   Z!CYGRPC_STATUS_CODE_TO_STATUS_CODEgetUNKNOWNr%   r#   Zerror_stringr-   r   perf_counterr2   r   Zmaybe_record_rpc_latencyextendr/   )
rL   rI   rM   r/   Zbatch_operationZoperation_typeZserialized_responser*   r#   r,   r   r   r    _handle_event   sJ     


 



rY   )rI   rM   r   c                    s    fdd}|S )Nc                    s   j $ t|  }j   j }W 5 Q R X |D ]J}z
|  W q4 tk
r| } ztdt|jt| W 5 d }~X Y q4X q4|oj	t
 kS )NzException in callback %s: %s)r'   rY   
notify_allr(   	Exceptionloggingerrorreprfuncr0   r   r9   )rL   r/   donecallbackerM   rI   r   r    handle_event   s    

  z$_event_handler.<locals>.handle_eventr   )rI   rM   rd   r   rc   r    _event_handler   s    re   )request_iteratorrI   callrequest_serializerevent_handlerr   c                    s6    fdd}t j|d}|d |  dS )z'Consume a request supplied by the user.c               	      s  d} zzt   t}W nv tk
r8   Y W fqY nZ tk
r   t   d} tjj}d}t	
|  tj| | t|| Y W 
d S X W 5 | st   X t|}j  jd krjs|d krtjj}d} tj| | t|| W 5 Q R  d S jt jj t |tf} |}|s^jt jj W 5 Q R  d S fdd}tjjj|tt jd jd k	rW 5 Q R  d S nW 5 Q R  d S W 5 Q R X q jP jd krjt jj  t !tf} |}|sjt jj  W 5 Q R X d S )NFTzException iterating requests!Exception serializing request!c                      s    j d k	ptjj jkS r   )r,   r   rB   send_messager(   r   rI   r   r    _done=  s
    
zJ_consume_request_iterator.<locals>.consume_request_iterator.<locals>._done)Zspin_cb)"r   Z"return_from_user_request_generatorZenter_user_request_generatornextStopIterationr[   rC   rD   rV   _LOGGER	exceptioncancelr   !STATUS_CODE_TO_CYGRPC_STATUS_CODErK   	serializer'   r,   r.   rS   r(   addrB   rk   SendMessageOperation_EMPTY_FLAGSoperaterO   wait	functoolspartialblock_if_fork_in_progresssend_close_from_clientSendCloseFromClientOperation)Z*return_from_user_request_generator_invokedrequestr,   r#   serialized_request
operations	operatingrm   rg   ri   rf   rh   rI   r   r    consume_request_iterator  s    
 


  z;_consume_request_iterator.<locals>.consume_request_iteratorr4   TNr   ForkManagedThread	setDaemonstart)rf   rI   rg   rh   ri   r   Zconsumption_threadr   r   r    _consume_request_iterator  s    	O
r   )
class_name	rpc_stater   c              
   C   s   |j t |jdkr(d| W  5 Q R  S |jtjjkrTt| |j|jW  5 Q R  S t| |j|j|j	W  5 Q R  S W 5 Q R X dS )z Calculates error string for RPC.Nz<{} object>)
r'   r,   r$   rC   rD   OK_OK_RENDEZVOUS_REPR_FORMATr#   _NON_OK_RENDEZVOUS_REPR_FORMATr-   )r   r   r   r   r    _rpc_state_stringb  s    
  r   c                   @   sV  e Zd ZU dZeed< edddZee dddZ	ee dd	d
Z
eej dddZee dddZee dddZedddZedddZedddZedddZedddZedddZedddZd*ee ed d!d"Zd+ee ee d d#d$Zd,ee eej d d%d&Z d-e!ej"gdf ee dd'd(d)Z#dS )._InactiveRpcErrorzAn RPC error not tied to the execution of a particular RPC.

    The RPC represented by the state object must not be in-progress or
    cancelled.

    Attributes:
      _state: An instance of _RPCState.
    _staterl   c              	   C   sb   |j R tdt|jt|j|jt|j| _t|j	| j_	t|j
| j_
W 5 Q R X d S rJ   )r'   r&   copydeepcopyr)   r+   r,   r#   r   r*   r-   r:   rI   r   r   r    r;     s    


z_InactiveRpcError.__init__r   c                 C   s   | j jS r   r   r)   r<   r   r   r    r)     s    z"_InactiveRpcError.initial_metadatac                 C   s   | j jS r   r   r+   r<   r   r   r    r+     s    z#_InactiveRpcError.trailing_metadatac                 C   s   | j jS r   r   r,   r<   r   r   r    r,     s    z_InactiveRpcError.codec                 C   s   t | jjS r   )r   decoder   r#   r<   r   r   r    r#     s    z_InactiveRpcError.detailsc                 C   s   t | jjS r   )r   r   r   r-   r<   r   r   r    r-     s    z$_InactiveRpcError.debug_error_stringc                 C   s   t | jj| jS r   r   	__class__r>   r   r<   r   r   r    _repr  s    z_InactiveRpcError._reprc                 C   s   |   S r   r   r<   r   r   r    __repr__  s    z_InactiveRpcError.__repr__c                 C   s   |   S r   r   r<   r   r   r    __str__  s    z_InactiveRpcError.__str__c                 C   s   dS )zSee grpc.Future.cancel.Fr   r<   r   r   r    rr     s    z_InactiveRpcError.cancelc                 C   s   dS )zSee grpc.Future.cancelled.Fr   r<   r   r   r    r.     s    z_InactiveRpcError.cancelledc                 C   s   dS )zSee grpc.Future.running.Fr   r<   r   r   r    running  s    z_InactiveRpcError.runningc                 C   s   dS )zSee grpc.Future.done.Tr   r<   r   r   r    r`     s    z_InactiveRpcError.doneNr   c                 C   s   | dS )zSee grpc.Future.result.Nr   r:   r   r   r   r    result  s    z_InactiveRpcError.resultc                 C   s   | S )zSee grpc.Future.exception.r   r   r   r   r    rq     s    z_InactiveRpcError.exceptionc                 C   s0   z| W n" t jk
r*   t d  Y S X dS )zSee grpc.Future.traceback.   N)rC   RpcErrorsysexc_infor   r   r   r    	traceback  s    z_InactiveRpcError.traceback)fnr   r   c                 C   s   ||  dS )z"See grpc.Future.add_done_callback.Nr   )r:   r   r   r   r   r    add_done_callback  s    z#_InactiveRpcError.add_done_callback)N)N)N)N)$r>   r?   r@   __doc__r&   rA   r;   r   r   r)   r+   rC   rD   r,   rE   r#   r-   r   r   r   rF   rr   r.   r   r`   rH   r   r   r[   rq   typesTracebackTyper   r   Futurer   r   r   r   r    r   t  sH   
	    r   c                       s  e Zd ZU dZeed< eejej	f ed< e
e ed< e
e ed< eeejej	f e
e e
e d fddZed	d
dZe
e d	ddZed	ddZeedddZdd Zdd Zdd Zdd Ze
e d	ddZed	ddZed	dd Zed	d!d"Zd#d	d$d%Z  ZS )&_Rendezvousa  An RPC iterator.

    Attributes:
      _state: An instance of _RPCState.
      _call: An instance of SegregatedCall or IntegratedCall.
        In either case, the _call object is expected to have operate, cancel,
        and next_event methods.
      _response_deserializer: A callable taking bytes and return a Python
        object.
      _deadline: A float representing the deadline of the RPC in seconds. Or
        possibly None, to represent an RPC with no deadline at all.
    r   _call_response_deserializerr!   )rI   rg   rM   deadlinec                    s*   t t|   || _|| _|| _|| _d S r   )superr   r;   r   r   r   r!   )r:   rI   rg   rM   r   r   r   r    r;     s
    z_Rendezvous.__init__r   c              
   C   s,   | j j | j jdkW  5 Q R  S Q R X dS )zSee grpc.RpcContext.is_activeNr   r'   r,   r<   r   r   r    	is_active  s    
z_Rendezvous.is_activec              
   C   sP   | j j> | jdkr"W 5 Q R  dS t| jt  dW  5 Q R  S W 5 Q R X dS )z"See grpc.RpcContext.time_remainingNr   )r   r'   r!   maxr   r<   r   r   r    time_remaining  s    

z_Rendezvous.time_remainingc              	   C   s   | j jp | j jdkrftjj}d}| jtj	| | d| j _
t| j || | j j  W 5 Q R  dS W 5 Q R  dS W 5 Q R X dS )zSee grpc.RpcContext.cancelNz!Locally cancelled by application!TF)r   r'   r,   rC   rD   	CANCELLEDr   rr   r   rs   r.   rK   rZ   )r:   r,   r#   r   r   r    rr     s    
 z_Rendezvous.cancelra   r   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 )z See grpc.RpcContext.add_callbackNFT)r   r'   r/   appendr:   ra   r   r   r    add_callback  s
    
z_Rendezvous.add_callbackc                 C   s   | S r   r   r<   r   r   r    __iter__  s    z_Rendezvous.__iter__c                 C   s   |   S r   _nextr<   r   r   r    rn     s    z_Rendezvous.nextc                 C   s   |   S r   r   r<   r   r   r    __next__  s    z_Rendezvous.__next__c                 C   s
   t  d S r   NotImplementedErrorr<   r   r   r    r   !  s    z_Rendezvous._nextc                 C   s
   t  d S r   r   r<   r   r   r    r-   $  s    z_Rendezvous.debug_error_stringc                 C   s   t | jj| jS r   r   r<   r   r   r    r   '  s    z_Rendezvous._reprc                 C   s   |   S r   r   r<   r   r   r    r   *  s    z_Rendezvous.__repr__c                 C   s   |   S r   r   r<   r   r   r    r   -  s    z_Rendezvous.__str__Nc              	   C   sh   | j jV | j jd krZtjj| j _d| j _d| j _| j	t
j| j j | j j | j j  W 5 Q R X d S )Nz"Cancelled upon garbage collection!T)r   r'   r,   rC   rD   r   r#   r.   r   rr   r   rs   rZ   r<   r   r   r    __del__0  s    
z_Rendezvous.__del__)r>   r?   r@   r   r&   rA   r   r   SegregatedCallIntegratedCallr   r   rH   r;   rF   r   r   rr   r   r   r   rn   r   r   rE   r-   r   r   r   r   __classcell__r   r   r   r    r     s.   
	r   c                   @   sF  e Zd ZU dZeed< edddZedddZeddd	Z	edd
dZ
d'ee edddZd(ee ee dddZd)ee eej dddZeejgdf ddddZee dddZee dddZeej dddZee dddZeej  ddd Z!edd!d"Z"edd#d$Z#ee dd%d&Z$dS )*_SingleThreadedRendezvousaN  An RPC iterator operating entirely on a single thread.

    The __next__ method of _SingleThreadedRendezvous does not depend on the
    existence of any other thread, including the "channel spin thread".
    However, this means that its interface is entirely synchronous. So this
    class cannot completely fulfill the grpc.Future interface. The result,
    exception, and traceback methods will never block and will instead raise
    an exception if calling the method would result in blocking.

    This means that these methods are safe to call from add_done_callback
    handlers.
    r   r   c                 C   s   | j jd k	S r   r   r<   r   r   r    _is_completeO  s    z&_SingleThreadedRendezvous._is_completec              
   C   s(   | j j | j jW  5 Q R  S Q R X d S r   r   r'   r.   r<   r   r   r    r.   R  s    
z#_SingleThreadedRendezvous.cancelledc              
   C   s,   | j j | j jd kW  5 Q R  S Q R X d S r   r   r<   r   r   r    r   V  s    
z!_SingleThreadedRendezvous.runningc              
   C   s,   | j j | j jd k	W  5 Q R  S Q R X d S r   r   r<   r   r   r    r`   Z  s    
z_SingleThreadedRendezvous.doneNr   c              
   C   sh   ~| j jT |  s tjd| j jtjjkrD| j j	W  5 Q R  S | j j
rVt n| W 5 Q R X dS )a9  Returns the result of the computation or raises its exception.

        This method will never block. Instead, it will raise an exception
        if calling this method would otherwise result in blocking.

        Since this method will never block, any `timeout` argument passed will
        be ignored.
        zJ_SingleThreadedRendezvous only supports result() when the RPC is complete.N)r   r'   r   rC   experimental
UsageErrorr,   rD   r   r*   r.   FutureCancelledErrorr   r   r   r    r   ^  s    	

z _SingleThreadedRendezvous.resultc              
   C   sn   ~| j jZ |  s tjd| j jtjjkr>W 5 Q R  dS | j j	rPt
 n| W  5 Q R  S W 5 Q R X dS )a*  Return the exception raised by the computation.

        This method will never block. Instead, it will raise an exception
        if calling this method would otherwise result in blocking.

        Since this method will never block, any `timeout` argument passed will
        be ignored.
        zM_SingleThreadedRendezvous only supports exception() when the RPC is complete.N)r   r'   r   rC   r   r   r,   rD   r   r.   r   r   r   r   r    rq   u  s    	

z#_SingleThreadedRendezvous.exceptionc              
   C   s   ~| j j |  s tjd| j jtjjkr>W 5 Q R  dS | j j	rPt
 n8z| W n. tjk
r   t d  Y W  5 Q R  S X W 5 Q R X dS )a;  Access the traceback of the exception raised by the computation.

        This method will never block. Instead, it will raise an exception
        if calling this method would otherwise result in blocking.

        Since this method will never block, any `timeout` argument passed will
        be ignored.
        zM_SingleThreadedRendezvous only supports traceback() when the RPC is complete.Nr   )r   r'   r   rC   r   r   r,   rD   r   r.   r   r   r   r   r   r   r   r    r     s    

z#_SingleThreadedRendezvous.tracebackr   r   c              	   C   sP   | j j6 | j jd kr:| j jt||  W 5 Q R  d S W 5 Q R X ||  d S r   r   r'   r,   r/   r   rz   r{   r:   r   r   r   r    r     s
    
z+_SingleThreadedRendezvous.add_done_callbackc              
   C   s>   | j j, | j jdkr |   q
| j jW  5 Q R  S Q R X dS )See grpc.Call.initial_metadataN)r   r'   r)   _consume_next_eventr<   r   r   r    r)     s    

z*_SingleThreadedRendezvous.initial_metadatac              
   C   s@   | j j. | j jdkr"tjd| j jW  5 Q R  S Q R X dS )See grpc.Call.trailing_metadataNz4Cannot get trailing metadata until RPC is completed.)r   r'   r+   rC   r   r   r<   r   r   r    r+     s    
z+_SingleThreadedRendezvous.trailing_metadatac              
   C   s@   | j j. | j jdkr"tjd| j jW  5 Q R  S Q R X dS )See grpc.Call.codeNz'Cannot get code until RPC is completed.)r   r'   r,   rC   r   r   r<   r   r   r    r,     s    
z_SingleThreadedRendezvous.codec              
   C   sF   | j j4 | j jdkr"tjdt| j jW  5 Q R  S Q R X dS )See grpc.Call.detailsNz*Cannot get details until RPC is completed.)r   r'   r#   rC   r   r   r   r   r<   r   r   r    r#     s    
z!_SingleThreadedRendezvous.detailsc              	   C   sB   | j  }| jj& t|| j| j}|D ]
}|  q(W 5 Q R X |S r   )r   
next_eventr   r'   rY   r   )r:   rL   r/   ra   r   r   r    r     s    

  z-_SingleThreadedRendezvous._consume_next_eventc              
   C   s   |    | jjj | jjd k	r>| jj}d | j_|W  5 Q R  S tjj| jjkrv| jjt	j
jkrft n| jjd k	rv| W 5 Q R X q d S r   )r   r   r'   r*   r   rB   rQ   r(   r,   rC   rD   r   ro   )r:   r*   r   r   r    _next_response  s    
z(_SingleThreadedRendezvous._next_responsec              	   C   s   | j jn | j jd krV| j jtjj | j	t
tfd }|sr| j jtjj n| j jtjjkrnt n| W 5 Q R X |  S r   )r   r'   r,   r(   ru   r   rB   rQ   r   rx   ReceiveMessageOperationrw   rO   rC   rD   r   ro   r   )r:   r   r   r   r    r     s    

 z_SingleThreadedRendezvous._nextc              
   C   sF   | j j4 | j jd kr"tjdt| j jW  5 Q R  S Q R X d S )Nz5Cannot get debug error string until RPC is completed.)r   r'   r-   rC   r   r   r   r   r<   r   r   r    r-   
  s    
z,_SingleThreadedRendezvous.debug_error_string)N)N)N)%r>   r?   r@   r   r&   rA   rF   r   r.   r   r`   r   rH   r   r   r[   rq   r   r   r   r   rC   r   r   r   r)   r+   rD   r,   rE   r#   r   	BaseEventr   r   r   r-   r   r   r   r    r   =  s,   
 				r   c                   @   s$  e Zd ZU dZeed< ee dddZee dddZ	ee
j ddd	Zee dd
dZee dddZedddZedddZedddZedddZd#ee edddZd$ee ee dddZd%ee eej dddZee
jgdf dddd Zedd!d"Z dS )&_MultiThreadedRendezvousa  An RPC iterator that depends on a channel spin thread.

    This iterator relies upon a per-channel thread running in the background,
    dequeueing events from the completion queue, and notifying threads waiting
    on the threading.Condition object in the _RPCState object.

    This extra thread allows _MultiThreadedRendezvous to fulfill the grpc.Future interface
    and to mediate a bidirection streaming RPC.
    r   r   c              
      sF    j j4  fdd}t j jj|  j jW  5 Q R  S Q R X dS )r   c                      s    j jd k	S r   r   r   r<   r   r    rm   &  s    z8_MultiThreadedRendezvous.initial_metadata.<locals>._doneN)r   r'   r   ry   r)   r:   rm   r   r<   r    r)   "  s    
z)_MultiThreadedRendezvous.initial_metadatac              
      sF    j j4  fdd}t j jj|  j jW  5 Q R  S Q R X dS )r   c                      s    j jd k	S r   r   r   r<   r   r    rm   0  s    z9_MultiThreadedRendezvous.trailing_metadata.<locals>._doneN)r   r'   r   ry   r+   r   r   r<   r    r+   ,  s    
z*_MultiThreadedRendezvous.trailing_metadatac              
      sF    j j4  fdd}t j jj|  j jW  5 Q R  S Q R X dS )r   c                      s    j jd k	S r   r   r   r<   r   r    rm   :  s    z,_MultiThreadedRendezvous.code.<locals>._doneN)r   r'   r   ry   r,   r   r   r<   r    r,   6  s    
z_MultiThreadedRendezvous.codec              
      sL    j j:  fdd}t j jj| t j jW  5 Q R  S Q R X dS )r   c                      s    j jd k	S r   )r   r#   r   r<   r   r    rm   D  s    z/_MultiThreadedRendezvous.details.<locals>._doneN)r   r'   r   ry   r   r#   r   r   r<   r    r#   @  s    
z _MultiThreadedRendezvous.detailsc              
      sL    j j:  fdd}t j jj| t j jW  5 Q R  S Q R X d S )Nc                      s    j jd k	S r   )r   r-   r   r<   r   r    rm   M  s    z:_MultiThreadedRendezvous.debug_error_string.<locals>._done)r   r'   r   ry   r   r-   r   r   r<   r    r-   J  s    
z+_MultiThreadedRendezvous.debug_error_stringc              
   C   s(   | j j | j jW  5 Q R  S Q R X d S r   r   r<   r   r   r    r.   S  s    
z"_MultiThreadedRendezvous.cancelledc              
   C   s,   | j j | j jd kW  5 Q R  S Q R X d S r   r   r<   r   r   r    r   W  s    
z _MultiThreadedRendezvous.runningc              
   C   s,   | j j | j jd k	W  5 Q R  S Q R X d S r   r   r<   r   r   r    r`   [  s    
z_MultiThreadedRendezvous.donec                 C   s   | j jd k	S r   r   r<   r   r   r    r   _  s    z%_MultiThreadedRendezvous._is_completeNr   c              
   C   sx   | j jf tj| j jj| j|d}|r0t n:| j jtjj	krT| j j
W  5 Q R  S | j jrft n| W 5 Q R X dS )zReturns the result of the computation or raises its exception.

        See grpc.Future.result for the full API contract.
        r   N)r   r'   r   ry   r   rC   FutureTimeoutErrorr,   rD   r   r*   r.   r   r:   r   Z	timed_outr   r   r    r   b  s    
  

z_MultiThreadedRendezvous.resultc              
   C   s~   | j jl tj| j jj| j|d}|r0t n@| j jtjj	krNW 5 Q R  dS | j j
r`t n| W  5 Q R  S W 5 Q R X dS )zvReturn the exception raised by the computation.

        See grpc.Future.exception for the full API contract.
        r   N)r   r'   r   ry   r   rC   r   r,   rD   r   r.   r   r   r   r   r    rq   u  s    
  

z"_MultiThreadedRendezvous.exceptionc              
   C   s   | j j tj| j jj| j|d}|r0t nh| j jtjj	krNW 5 Q R  dS | j j
r`t n8z| W n. tjk
r   t d  Y W  5 Q R  S X W 5 Q R X dS )zAccess the traceback of the exception raised by the computation.

        See grpc.future.traceback for the full API contract.
        r   Nr   )r   r'   r   ry   r   rC   r   r,   rD   r   r.   r   r   r   r   r   r   r   r    r     s     
  

z"_MultiThreadedRendezvous.tracebackr   c              	   C   sP   | j j6 | j jd kr:| j jt||  W 5 Q R  d S W 5 Q R X ||  d S r   r   r   r   r   r    r     s
    
z*_MultiThreadedRendezvous.add_done_callbackc              
      s   j j  j jd krft j  j} j jtjj	  j
ttf|}|s j jtjj	 n j jtjjkr~t n  fdd}t j jj|  j jd k	r̈ j j}d  j _|W  5 Q R  S tjj	 j jkr j jtjjkrt n j jd k	r W 5 Q R X d S )Nc                      s(    j jd k	p&tjj j jko& j jd k	S r   )r   r*   r   rB   rQ   r(   r,   r   r<   r   r    _response_ready  s    
z7_MultiThreadedRendezvous._next.<locals>._response_ready)r   r'   r,   re   r   r(   ru   r   rB   rQ   r   rx   r   rw   rO   rC   rD   r   ro   r   ry   r*   )r:   ri   r   r   r*   r   r<   r    r     s6     
z_MultiThreadedRendezvous._next)N)N)N)!r>   r?   r@   r   r&   rA   r   r   r)   r+   rC   rD   r,   rE   r#   r-   rF   r.   r   r`   r   rH   r   r   r[   rq   r   r   r   r   r   r   r   r   r   r   r    r     s(   





	 r   )r   r   rh   r   c                 C   sP   t |}t| |}|d krBtdddtjjd}t|}|d |fS ||d fS d S )Nr   rj   )r!   r   rt   r&   rC   rD   rS   r   )r   r   rh   r   r   rI   r]   r   r   r    _start_unary_request  s    
r   )rI   rg   	with_callr   r   c                 C   s>   | j tjjkr2|r*t| |d |}| j|fS | jS nt| d S r   )r,   rC   rD   r   r   r*   r   )rI   rg   r   r   
rendezvousr   r   r    _end_unary_response_blocking  s    
r   )metadatainitial_metadata_flagsr   c                 C   s*   t | |t tt tft tffS r   )r   SendInitialMetadataOperationr   rw   ReceiveStatusOnClientOperationReceiveInitialMetadataOperationr   r   r   r   r    #_stream_unary_invocation_operations  s     
r   c                 C   s   t dd t| |D S )Nc                 s   s   | ]}|d fV  qd S r   r   ).0r   r   r   r    	<genexpr>  s   z?_stream_unary_invocation_operations_and_tags.<locals>.<genexpr>)tupler   r   r   r   r    ,_stream_unary_invocation_operations_and_tags   s     r   )user_deadliner   c                 C   sR   t  }|d kr| d krd S |d k	r0| d kr0|S | d k	rD|d krD| S t|| S d S r   )r   Zget_deadline_from_contextmin)r   Zparent_deadliner   r   r    _determine_deadline  s    r   c                   @   s  e Zd ZU ejed< eed< eed< eed< ee	 ed< ee
 ed< eed< ee ed< dddddddgZejeeeee	 ee
 ee d	d
dZeee ee ee eej eee eeej  ee eej f dddZdeee ee eej ee eej eeejf dddZdeee ee eej ee eej edddZdeee ee eej ee eej eeejf dddZdeee ee eej ee eej e dddZ!dS )_UnaryUnaryMultiCallable_channel_managed_call_method_target_request_serializerr   _context_registered_call_handlechannelmanaged_callr3   r4   rh   rM   r   c                 C   s8   || _ || _|| _|| _|| _|| _t | _|| _	d S r   
r   r   r   r   r   r   r   build_census_contextr   r   r:   r   r   r3   r4   rh   rM   r   r   r   r    r;   /  s    

z!_UnaryUnaryMultiCallable.__init__)r   r   r   wait_for_readycompressionr   c                 C   s   t ||| j\}}}t |}	t||}
|d kr@d d d |fS ttd d d d }t	|
|	t
|tttttttttf}|||d fS d S r   )r   r   _InitialMetadataFlagswith_wait_for_readyr   augment_metadatar&   _UNARY_UNARY_INITIAL_DUEr   r   rv   rw   r~   r   r   r   )r:   r   r   r   r   r   r   r   r   r   augmented_metadatarI   r   r   r   r    _prepareB  s4      
  

z!_UnaryUnaryMultiCallable._prepareNr   r   r   credentialsr   r   r   c                 C   s   |  |||||\}}}	}
|d kr(|
nt |_t| j|_t| j|_	| j
tjj| jd t|	||d krtd n|j|d ff| j| j	}| }t||| j ||fS d S r   )r  r   rW   r1   r   r   r   r3   r   r4   r   segregated_callr   PropagationConstantsGRPC_PROPAGATE_DEFAULTSr   _credentialsr   r   r   rY   r   )r:   r   r   r   r  r   r   rI   r   r   r   rg   rL   r   r   r    	_blockingh  s:    	    
z"_UnaryUnaryMultiCallable._blockingc           	      C   s&   |  ||||||\}}t||dd S r5   r  r   	r:   r   r   r   r  r   r   rI   rg   r   r   r    __call__  s         z!_UnaryUnaryMultiCallable.__call__c           	      C   s&   |  ||||||\}}t||dd S NTr  r  r   r   r    r     s         z"_UnaryUnaryMultiCallable.with_callc                 C   s   |  |||||\}}}	}
|d kr(|
nxt|| j}t |_t| j|_	t| j
|_| tjj| jd |	||d krzd n|j|f|| j| j
}t||| j|	S d S r   )r  re   r   r   rW   r1   r   r   r   r3   r   r4   r   r   r
  r  r  r   r   r   )r:   r   r   r   r  r   r   rI   r   r   r   ri   rg   r   r   r    future  s>    	    
   z_UnaryUnaryMultiCallable.future)NNNNN)NNNNN)NNNNN)NNNNN)"r>   r?   r@   r   ChannelrA   r   bytesr   r   r   r   rG   	__slots__r;   rH   r   rF   rC   Compressionr
   r&   r   	Operationr   r  CallCredentialsr   r  r  Callr   r   r  r   r   r   r    r     s   

)     )               r   c                	   @   s   e Zd ZU ejed< eed< eed< ee ed< ee	 ed< e
ed< ee ed< ddddddgZejeeee	ee dd	d
Zde
ee ee eej ee eej edddZdS )'_SingleThreadedUnaryStreamMultiCallabler   r   r   r   r   r   r   )r   r3   r4   rh   rM   r   c                 C   s2   || _ || _|| _|| _|| _t | _|| _d S r   )	r   r   r   r   r   r   r   r   r   )r:   r   r3   r4   rh   rM   r   r   r   r    r;     s    	
z0_SingleThreadedUnaryStreamMultiCallable.__init__Nr  c                 C   s  t |}t|| j}|d kr:tdddtjjd}	t|	tt	d d d d }	|d krVd n|j
}
t |}t||}t||t|tttfttfttff}tdd |D }t |	_t| j|	_t| j|	_| j tj!j"| jd t#|||
|| j$| j%	}t&|	|| j'|S )Nr   rj   c                 s   s   | ]}|d fV  qd S r   r   )r   opsr   r   r    r   $  s     zC_SingleThreadedUnaryStreamMultiCallable.__call__.<locals>.<genexpr>)(r!   r   rt   r   r&   rC   rD   rS   r   _UNARY_STREAM_INITIAL_DUEr  r  r  r   r  r   r   rv   rw   r~   r   r   r   r   rW   r1   r   r   r3   r   r4   r   r	  r
  r  r   r   r   r   r   )r:   r   r   r   r  r   r   r   r   rI   Zcall_credentialsr   r  r   operations_and_tagsrg   r   r   r    r    sn    	   



   z0_SingleThreadedUnaryStreamMultiCallable.__call__)NNNNN)r>   r?   r@   r   r  rA   r  r   r   r   r   rG   r  r;   rH   r   rC   r  rF   r  r   r  r   r   r   r    r    sF   

     r  c                	   @   s   e Zd ZU ejed< eed< eed< eed< ee	 ed< ee
 ed< eed< ee ed< dddddddgZejeeee	e
ee d	d
dZdeee ee eej ee eej edddZdS )_UnaryStreamMultiCallabler   r   r   r   r   r   r   r   r   c                 C   s8   || _ || _|| _|| _|| _|| _t | _|| _	d S r   r   r   r   r   r    r;   M  s    

z"_UnaryStreamMultiCallable.__init__Nr  c                 C   s   t ||| j\}}}	t |}
|d kr.|	nt||}ttd d d d }t	||
t
|tttttfttff}t |_t| j|_t| j|_| tjj| jd t|||d krd n|j|t|| j| j| j 
}t!||| j|S d S r   )"r   r   r  r  r   r  r&   r  r   r   rv   rw   r~   r   r   r   rW   r1   r   r   r   r3   r   r4   r   r
  r  r   r  re   r   r   r   r   )r:   r   r   r   r  r   r   r   r   r   r   r  rI   r   rg   r   r   r    r  `  sb    	  
   



   z"_UnaryStreamMultiCallable.__call__)NNNNN)r>   r?   r@   r   r  rA   r   r  r   r   r   r   rG   r  r;   rH   r   rC   r  rF   r  r   r  r   r   r   r    r  8  sL   

     r  c                
   @   sx  e Zd ZU ejed< eed< eed< eed< ee	 ed< ee
 ed< eed< ee ed< dddddddgZejeeeee	 ee
 ee d	d
dZeee ee eej ee eej eeejf dddZdeee ee eej ee eej edddZdeee ee eej ee eej eeejf dddZdeee ee eej ee eej edddZdS )_StreamUnaryMultiCallabler   r   r   r   r   r   r   r   r   c                 C   s8   || _ || _|| _|| _|| _|| _t | _|| _	d S r   r   r   r   r   r    r;     s    

z"_StreamUnaryMultiCallable.__init__rf   r   r   r  r   r   r   c                 C   s   t |}ttd d d d }t |}	t||}
t |_	t
| j|_t
| j|_| jtjj| jd t||
|d kr|d n|jt|
|	| j| j	}t|||| jd  | }|j0 t||| j |j   |j!sW 5 Q R  qW 5 Q R X q||fS r   )"r!   r&   _STREAM_UNARY_INITIAL_DUEr  r  r   r  r   rW   r1   r   r   r   r3   r   r4   r   r	  r   r
  r  r   r  r   r   r   r   r   r   r'   rY   r   rZ   r(   )r:   rf   r   r   r  r   r   r   rI   r   r  rg   rL   r   r   r    r    sP    	 
     
z#_StreamUnaryMultiCallable._blockingNc           	      C   s&   |  ||||||\}}t||dd S r5   r  	r:   rf   r   r   r  r   r   rI   rg   r   r   r    r    s    	z"_StreamUnaryMultiCallable.__call__c           	      C   s&   |  ||||||\}}t||dd S r  r  r"  r   r   r    r     s    	z#_StreamUnaryMultiCallable.with_callc                 C   s   t |}ttd d d d }t|| j}	t |}
t||}t	
 |_t| j|_t| j|_| tjj| jd |||d krd n|jt||
|	| j| j
}t|||| j|	 t||| j|S r   )r!   r&   r!  re   r   r  r  r   r  r   rW   r1   r   r   r   r3   r   r4   r   r   r
  r  r  r   r   r   r   r   r   )r:   rf   r   r   r  r   r   r   rI   ri   r   r  rg   r   r   r    r    sR    	 
    z _StreamUnaryMultiCallable.future)NNNNN)NNNNN)NNNNN)r>   r?   r@   r   r  rA   r   r  r   r   r   r   rG   r  r;   r   rH   r   rC   r  rF   r  r
   r&   r   r  r  r  r   r   r  r   r   r   r    r    s   

0               r  c                	   @   s   e Zd ZU ejed< eed< eed< eed< ee	 ed< ee
 ed< eed< ee ed< dddddddgZejeeeee	 ee
 ee d	d
dZdeee ee eej ee eej edddZdS )_StreamStreamMultiCallabler   r   r   r   r   r   r   r   r   c                 C   s8   || _ || _|| _|| _|| _|| _t | _|| _	d S r   r   r   r   r   r    r;   \  s    

z#_StreamStreamMultiCallable.__init__Nr   c                 C   s   t |}ttd d d d }t |}	t||}
t|
|	t	t
ftt
ff}t|| j}t |_t| j|_t| j|_| tjj| jd t||
|d krd n|j||| j| j
}t|||| j| t ||| j|S r   )!r!   r&   _STREAM_STREAM_INITIAL_DUEr  r  r   r  r   r   r   rw   r   re   r   r   rW   r1   r   r   r   r3   r   r4   r   r
  r  r   r  r   r   r   r   r   )r:   rf   r   r   r  r   r   r   rI   r   r  r   ri   rg   r   r   r    r  o  s\    	  
	
   z#_StreamStreamMultiCallable.__call__)NNNNN)r>   r?   r@   r   r  rA   r   r  r   r   r   r   rG   r  r;   r   rH   r   rC   r  rF   r  r   r  r   r   r   r    r#  G  sL   

     r#  c                       s>   e Zd ZdZefed fddZee edddZ	  Z
S )r  z'Stores immutable initial metadata flags)valuec                    s   |t jjM }tt| | |S r   )r   InitialMetadataFlagsZ	used_maskr   r  __new__)clsr%  r   r   r    r'    s    z_InitialMetadataFlags.__new__)r   r   c                 C   sJ   |d k	rF|r&|  | tjjB tjjB S |sF|  | tjj @ tjjB S | S r   )r   r   r&  r   Zwait_for_ready_explicitly_set)r:   r   r   r   r    r    s     z)_InitialMetadataFlags.with_wait_for_ready)r>   r?   r@   r   rw   rG   r'  r   rF   r  r   r   r   r   r    r    s   r  c                   @   sN   e Zd ZU ejed< eed< eed< ejdddZddd	d
Z	dd Z
dS )_ChannelCallStater   managed_callsr6   r   c                 C   s    t  | _|| _d| _d| _ d S )Nr   F)r6   Locklockr   r*  r:   r   r   r   r    r;     s    
z_ChannelCallState.__init__Nr   c                 C   s
   d| _ d S )Nr   )r*  r<   r   r   r    r=     s    z&_ChannelCallState.reset_postfork_childc              	   C   s4   z| j tjjd W n ttfk
r.   Y nX d S )NzChannel deallocated!)r   closer   rD   r.   	TypeErrorAttributeErrorr<   r   r   r    r     s     z_ChannelCallState.__del__)r>   r?   r@   r   r  rA   rG   rF   r;   r=   r   r   r   r   r    r)    s   

r)  )rI   r   c                    s.    fdd}t j|d}|d |  d S )Nc               	      sp   t    j } | jt jjkr$q | | }|r  j,   j	d8  _	 j	dkr`W 5 Q R  d S W 5 Q R X q d S )N   r   )
r   r|   r   Znext_call_eventcompletion_typeZCompletionTypeZqueue_timeouttagr-  r*  )rL   Zcall_completedrl   r   r    channel_spin  s    



z._run_channel_spin_thread.<locals>.channel_spinr   Tr   )rI   r5  Zchannel_spin_threadr   rl   r    _run_channel_spin_thread  s    
r6  rl   c                    sL   t ttt tt tt ttj tttj	  t
ttt  tjd fdd}|S )N)flagsr3   hostr   r   r  r   ri   contextr   r   c
                    s|   t  fdd|D }
jV j| ||||||
||		}jdkrTd_t n jd7  _|W  5 Q R  S Q R X dS )a  Creates a cygrpc.IntegratedCall.

        Args:
          flags: An integer bitfield of call flags.
          method: The RPC method.
          host: A host string for the created call.
          deadline: A float to be the deadline of the created call or None if
            the call is to have an infinite deadline.
          metadata: The metadata for the call or None.
          credentials: A cygrpc.CallCredentials or None.
          operations: A sequence of sequences of cygrpc.Operations to be
            started on the call.
          event_handler: A behavior to call to handle the events resultant from
            the operations on the call.
          context: Context object for distributed tracing.
          _registered_call_handle: An int representing the call handle of the
            method, or None if the method is not registered.
        Returns:
          A cygrpc.IntegratedCall with which to conduct an RPC.
        c                 3   s   | ]}| fV  qd S r   r   )r   Z	operationri   r   r    r     s   zC_channel_managed_call_management.<locals>.create.<locals>.<genexpr>r   r2  N)r   r-  r   Zintegrated_callr*  r6  )r7  r3   r8  r   r   r  r   ri   r9  r   r  rg   rl   r:  r    create  s(     

z0_channel_managed_call_management.<locals>.create)rG   r  r   rE   rH   r   r   r  r   r  r   r   r   )rI   r;  r   rl   r     _channel_managed_call_management  s    :r<  c                   @   s   e Zd ZU ejed< ejed< eed< ej	ed< eed< e
eeeej	gdf eej	 f   ed< eed< ejd	d
dZddddZdS )_ChannelConnectivityStater-  r   pollingconnectivitytry_to_connectNcallbacks_and_connectivities
deliveringr+  c                 C   s2   t  | _|| _d| _d | _d| _g | _d| _d S r5   )	r6   RLockr-  r   r>  r?  r@  rA  rB  r.  r   r   r    r;   6  s    
z"_ChannelConnectivityState.__init__r   c                 C   s"   d| _ d | _d| _g | _d| _d S r5   )r>  r?  r@  rA  rB  r<   r   r   r    r=   ?  s
    z._ChannelConnectivityState.reset_postfork_child)r>   r?   r@   r6   rC  rA   rC   r  rF   ChannelConnectivityr   r   r   r   r   r;   r=   r   r   r   r    r=  %  s"   



	r=  c                 C   s:   g }| j D ]*}|\}}|| jk	r
|| | j|d< q
|S )Nr2  )rA  r?  r   )rI   Zcallbacks_needing_updatecallback_and_connectivityra   Zcallback_connectivityr   r   r    _deliveriesG  s    


rF  )rI   initial_connectivityinitial_callbacksr   c              	   C   s   |}|}|D ]:}t |  z|| W q tk
rD   tt Y qX q| j. t| }|rd| j}nd| _	W 5 Q R  d S W 5 Q R X qd S r5   )
r   r|   r[   rp   rq   0_CHANNEL_SUBSCRIPTION_CALLBACK_ERROR_LOG_MESSAGEr-  rF  r?  rB  )rI   rG  rH  r?  r/   ra   r   r   r    _deliverV  s     
rJ  )rI   r/   r   c                 C   s2   t jt| | j|fd}|d |  d| _d S N)r4   argsT)r   r   rJ  r?  r   r   rB  )rI   r/   Zdelivering_threadr   r   r    _spawn_deliveryo  s    
rM  )rI   r   initial_try_to_connectr   c              	   C   s  |}| |}| jJ tj| | _tdd | jD }| jD ]}| j|d< q<|rZt| | W 5 Q R X ||t		 d }t
|  | j8 | js| jsd| _d | _W 5 Q R  q| j}d| _W 5 Q R X |js|rd| |}| j2 tj| | _| jst| }|rt| | W 5 Q R X qdd S )Nc                 s   s   | ]\}}|V  qd S r   r   )r   ra   _r   r   r    r     s    z%_poll_connectivity.<locals>.<genexpr>r2  g?F)Zcheck_connectivity_stater-  r   Z1CYGRPC_CONNECTIVITY_STATE_TO_CHANNEL_CONNECTIVITYr?  r   rA  rM  Zwatch_connectivity_stater   r   r|   r@  r>  successrB  rF  )rI   r   rN  r@  r?  r/   rE  rL   r   r   r    _poll_connectivity  sP    

 



rQ  )rI   ra   r@  r   c              	   C   s   | j  | jsX| jsXtjt| | jt|fd}|d |	  d| _| j
|d g nd| js| jd k	rt| |f |  jt|O  _| j
|| jg n"|  jt|O  _| j
|d g W 5 Q R X d S rK  )r-  rA  r>  r   r   rQ  r   rF   r   r   r   rB  r?  rM  r@  )rI   ra   r@  Zpolling_threadr   r   r    
_subscribe  s$    
rR  )rI   ra   r   c              	   C   sF   | j 6 t| jD ]$\}\}}||kr| j|  q8qW 5 Q R X d S r   )r-  	enumeraterA  pop)rI   ra   indexZsubscribed_callbackZunused_connectivityr   r   r    _unsubscribe  s    rV  )base_optionsr   r   c                 C   s$   t |}t| | tjjtff S r   )r   Zcreate_channel_optionr   r   ZChannelArgKeyZprimary_user_agent_string_USER_AGENT)rW  r   Zcompression_optionr   r   r    _augment_options  s    
rY  )optionsr   c                 C   sB   g }g }| D ],}|d t jjjkr.|| q|| q||fS )z;Separates core channel options from Python channel options.r   )rC   r   ChannelOptionsSingleThreadedUnaryStreamr   )rZ  core_optionspython_optionspairr   r   r    _separate_channel_options  s    r`  c                   @   s  e Zd ZU dZeed< ejed< eed< e	ed< e
ed< ee
ef ed< e
ee eej eej dd	d
Ze
edddZee ddddZd1eejgdf ee ddddZeejgdf ddddZd2e
ee ee ee ejdddZd3e
ee ee ee ejdddZd4e
ee ee ee ej dddZ!d5e
ee ee ee ej"dd d!Z#dd"d#d$Z$dd"d%d&Z%dd"d'd(Z&d)d* Z'd+d, Z(dd"d-d.Z)d/d0 Z*dS )6r  z7A cygrpc.Channel-backed implementation of grpc.Channel._single_threaded_unary_streamr   _call_state_connectivity_stater   Z_registered_call_handles)r4   rZ  r  r   c                 C   sr   t |\}}t| _| | tt|t|||| _	|| _
t| j	| _t| j	| _t|  tjrnt  dS )aP  Constructor.

        Args:
          target: The target to which to connect.
          options: Configuration options for the channel.
          credentials: A cygrpc.ChannelCredentials or None.
          compression: An optional value indicating the compression method to be
            used over the lifetime of the channel.
        N)r`  %_DEFAULT_SINGLE_THREADED_UNARY_STREAMra  _process_python_optionsr   r  r   encoderY  r   r   r)  rb  r=  rc  Zfork_register_channelg_gevent_activatedZgevent_increment_channel_count)r:   r4   rZ  r  r   r^  r]  r   r   r    r;     s    

zChannel.__init__)r3   r   c                 C   s   | j t|S )ah  
        Get the registered call handle for a method.

        This is a semi-private method. It is intended for use only by gRPC generated code.

        This method is not thread-safe.

        Args:
          method: Required, the method name for the RPC.

        Returns:
          The registered call handle pointer in the form of a Python Long.
        )r   Zget_registered_call_handler   rf  )r:   r3   r   r   r    _get_registered_call_handle&  s    z#Channel._get_registered_call_handleN)r^  r   c                 C   s&   |D ]}|d t jjjkrd| _qdS )zASets channel attributes according to python-only channel options.r   TN)rC   r   r[  r\  ra  )r:   r^  r_  r   r   r    re  6  s    zChannel._process_python_options)ra   r@  r   c                 C   s   t | j|| d S r   )rR  rc  )r:   ra   r@  r   r   r    	subscribeA  s    zChannel.subscriber   c                 C   s   t | j| d S r   )rV  rc  r   r   r   r    unsubscribeH  s    zChannel.unsubscribeF)r3   rh   rM   _registered_methodr   c                 C   s<   d }|r|  |}t| jt| jt|t| j|||S r   )rh  r   r   r<  rb  r   rf  r   r:   r3   rh   rM   rk  r   r   r   r    unary_unaryN  s    

zChannel.unary_unaryc                 C   sh   d }|r|  |}| jr:t| jt|t| j|||S t| jt| j	t|t| j|||S d S r   )
rh  ra  r  r   r   rf  r   r  r<  rb  rl  r   r   r    unary_streamc  s*    

	
zChannel.unary_streamc                 C   s<   d }|r|  |}t| jt| jt|t| j|||S r   )rh  r  r   r<  rb  r   rf  r   rl  r   r   r    stream_unary  s    

zChannel.stream_unaryc                 C   s<   d }|r|  |}t| jt| jt|t| j|||S r   )rh  r#  r   r<  rb  r   rf  r   rl  r   r   r    stream_stream  s    

zChannel.stream_streamr   c              	   C   s,   | j }|r(|j |jd d = W 5 Q R X d S r   )rc  r-  rA  r   r   r   r    _unsubscribe_all  s    zChannel._unsubscribe_allc                 C   s6   |    | jtjjd t|  tjr2t  d S )NzChannel closed!)	rq  r   r/  r   rD   r.   Zfork_unregister_channelrg  Zgevent_decrement_channel_countr<   r   r   r    _close  s
    
zChannel._closec                 C   s   |    | jtjjd d S )NzChannel closed due to fork)rq  r   Zclose_on_forkr   rD   r.   r<   r   r   r    _close_on_fork  s
     zChannel._close_on_forkc                 C   s   | S r   r   r<   r   r   r    	__enter__  s    zChannel.__enter__c                 C   s   |    dS r5   rr  )r:   exc_typeexc_valexc_tbr   r   r    __exit__  s    zChannel.__exit__c                 C   s   |    d S r   ru  r<   r   r   r    r/    s    zChannel.closec                 C   s   z|    W n   Y nX d S r   )rq  r<   r   r   r    r     s    
zChannel.__del__)N)NNF)NNF)NNF)NNF)+r>   r?   r@   r   rF   rA   r   r  r)  r=  rE   r   rG   r   r   r   rC   ZChannelCredentialsr  r;   rh  re  r   rD  ri  rj  r   r   UnaryUnaryMultiCallablerm  UnaryStreamMultiCallablern  StreamUnaryMultiCallablero  StreamStreamMultiCallablerp  rq  rr  rs  rt  ry  r/  r   r   r   r   r    r    s   

! 	      &      r  )ur   r   rz   r\   osr   r6   r   r   typingr   r   r   r   r   r   r   r	   r
   r   rC   r   r   r   r   Zgrpc._cythonr   Zgrpc._typingr   r   r   r   r   r   r   r   Zgrpc.experimental	getLoggerr>   rp   r$   __version__rX  rw   getenvrd  rB   Zsend_initial_metadatark   r}   rP   rQ   rT   r  r  r!  r$  rI  r   r   rH   r!   rD   rE   r%   objectr&   rK   r   rY   re   r   r   r   r   r   r  r   r   Z
RpcContextr   r   r   r  r   rF   r   rG   r  r   r   r   rz  r   r{  r  r  r|  r  r}  r#  r  r)  r6  r<  r=  rD  rF  rJ  rM  r  rQ  rR  rV  r  rY  r`  r   r   r   r    <module>   sB  0
		 =
- _^k
   W
   ;   ;d_ 1^?#2