
    rne$                     8   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j                  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 Z!d Z"d Z#d Z$d Z% G d d ejL                  dd      ejN                        Z( G d de)      Z*d  Z+d! Z,d" Z-d# Z.d$ Z/d% Z0d& Z1d' Z2d( Z3d) Z4 G d* d+ejj                        Z6 G d, d-e)      Z7d. Z8	 dWd/Z9d0 Z:d1 Z;d2 Z<d3 Z=d4 Z>d5 Z?d6 Z@d7 ZAd8 ZBd9 ZCd: ZDd; ZEd< ZFd= ZGd> ZHd? ZId@ ZJdA ZKdB ZLej                   G dC dDej                               ZO G dE dFe)      ZPdG ZQdH ZRdI ZSdJ ZTdK ZUdL ZVdM ZWdN ZXdO ZYdP ZZdQ Z[dR Z\dS Z] G dT dUej                        Z_dV Z`y)Xz+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                 <    | j                   d   j                         S Nr   )batch_operationsmessage)request_events    ,lib/python3.12/site-packages/grpc/_server.py_serialized_requestr   7   s    ))!,4466    c                 |    t         j                  j                  |       }|t        j                  j
                  S |S N)r   !STATUS_CODE_TO_CYGRPC_STATUS_CODEgetr   
StatusCodeunknown)codecygrpc_codes     r   _application_coder"   ;   s4    ;;??EK(3(;6$$LLr   c                 x    | j                   t        j                  j                  S t	        | j                         S r   )r    r   r   okr"   states    r   _completion_coder'   @   s-    zz  ### ,,r   c                 H    | j                   |S t        | j                         S r   )r    r"   )r&   r    s     r   _abortion_coder)   G   s     zz ,,r   c                 6    | j                   dS | j                   S )Nr   )detailsr%   s    r   _detailsr,   N   s    --'3:U]]:r   c                       e Zd Zy)_HandlerCallDetailsN)__name__
__module____qualname__ r   r   r.   r.   R   s    
 	r   r.   )methodinvocation_metadatac                       e Zd Zd Zy)	_RPCStatec                    t        j                         | _        t               | _        d | _        t        | _        d| _        d | _	        d| _
        d | _        d | _        d | _        d| _        g | _        g | _        d| _        y 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selfs    r   __init__z_RPCState.__init__\   ss    ",,.5(,%%)"(-%!%	r   Nr/   r0   r1   rK   r2   r   r   r6   r6   Z   s    r   r6   c                 d    t        j                         }| j                  j                  |       |r   )grpcRpcErrorrF   append)r&   	rpc_errors     r   _raise_rpc_errorrR   m   s&    I	I&
Or   c                     | j                   j                  |       t        |       s#| j                   s| j                  }d | _        | |fS y)NNr2   )r=   remove_is_rpc_state_activerG   )r&   tokenrG   s      r   _possibly_finish_callrX   s   s@    	IIU&uyyOO	ir   c                       fd}|S )Nc                 `    j                   5  t              cd d d        S # 1 sw Y   y xY wr   )r;   rX   )$unused_send_status_from_server_eventr&   rW   s    r   r   z9_send_status_from_server.<locals>.send_status_from_server   s)    __ 	7(6	7 	7 	7s   $-r2   )r&   rW   r   s   `` r   _send_status_from_serverr\   }   s    7 #"r   c                     | j                   5  | j                  rDt        j                  | j                        f}||cd d d        S |t	        |      z   cd d d        S |cd d d        S # 1 sw Y   y xY wr   )r;   rB   r   !compression_algorithm_to_metadatatuple)r&   metadatacompression_metadatas      r   _get_initial_metadatarb      sx    	 
&&>>//1$3  +
 
 ,eHo=
 
 
 
 
s   0A)A)A))A2c                 N    t        j                  t        | |      t              }|S r   )r   SendInitialMetadataOperationrb   _EMPTY_FLAGS)r&   r`   	operations      r   _get_initial_metadata_operationrg      s$    33eX.>Ir   c                    | j                   t        urt        | |      }| j                  |n| j                  }| j                  r9t        | d       t        j                  | j                  ||t              f}t        }n-t        j                  | j                  ||t              f}t        }|j                  |t        | |             d| _        | j                  j!                  |       y y NT)r@   
_CANCELLEDr)   r+   rA   rg   r   SendStatusFromServerOperationrD   re   8_SEND_INITIAL_METADATA_AND_SEND_STATUS_FROM_SERVER_TOKEN_SEND_STATUS_FROM_SERVER_TOKENstart_server_batchr\   rE   r=   add)r&   callr    r+   effective_codeeffective_details
operationsrW   s           r   _abortrt      s    ||:%'t4',}}'<G%--))/t<44U5L5L5C5F5ACJ ME >>''9J  J 3E
 8 F	H		e) &r   c                       fd}|S )Nc                 (   j                   5  | j                  d   j                         rt        _        nj                  t
        u rt        _        j                   j                          t        t              cd d d        S # 1 sw Y   y xY wr   )
r;   r   r   rj   r@   r?   _CLOSED
notify_allrX   _RECEIVE_CLOSE_ON_SERVER_TOKEN)receive_close_on_server_eventr&   s    r   r
   z9_receive_close_on_server.<locals>.receive_close_on_server   so    __ 	P,==a@JJL)&&OO&&((0NO	P 	P 	Ps   A0BBr2   )r&   r
   s   ` r   _receive_close_on_serverr{      s    P #"r   c                       fd}|S )Nc                    t        |       }|]j                  5  j                  t        u rt        _        j                  j                          t        t              cd d d        S t        j                  |      }j                  5  |'t        t        j                  j                  d       n|_        j                  j                          t        t              cd d d        S # 1 sw Y   y xY w# 1 sw Y   y xY w)Ns    Exception deserializing request!)r   r;   r@   r?   rw   rx   rX   _RECEIVE_MESSAGE_TOKENr   deserializert   r   r   internalr>   )receive_message_eventserialized_requestr>   rp   request_deserializerr&   s      r   r   z)_receive_message.<locals>.receive_message   s    01FG% L<<5(#*EL**,,U4JK	L L ))*<*>@G L?5$(9(9(B(B>@ %,EM**,,U4JKL LL LL Ls   AC2AC>2C;>Dr2   )r&   rp   r   r   s   ``` r   _receive_messager      s    L( r   c                       fd}|S )Nc                 h    j                   5  t        t              cd d d        S # 1 sw Y   y xY wr   )r;   rX   _SEND_INITIAL_METADATA_TOKEN)"unused_send_initial_metadata_eventr&   s    r   r   z5_send_initial_metadata.<locals>.send_initial_metadata   s.    __ 	N(0LM	N 	N 	Ns   (1r2   )r&   r   s   ` r   _send_initial_metadatar      s    N ! r   c                       fd}|S )Nc                     j                   5  j                   j                          t              cd d d        S # 1 sw Y   y xY wr   )r;   rx   rX   )unused_send_message_eventr&   rW   s    r   r   z#_send_message.<locals>.send_message   s9    __ 	7OO&&((6	7 	7 	7s	   &>Ar2   )r&   rW   r   s   `` r   _send_messager      s    7
 r   c                       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 Zd Zd Zd Zd Zd Zd Zd Zy)_Contextc                 .    || _         || _        || _        y r   )
_rpc_event_state_request_deserializer)rJ   	rpc_eventr&   r   s       r   rK   z_Context.__init__   s    #%9"r   c                     | j                   j                  5  t        | j                         cd d d        S # 1 sw Y   y xY wr   )r   r;   rV   rI   s    r   	is_activez_Context.is_active   s0    [["" 	5'4	5 	5 	5s   6?c                     t        | j                  j                  j                  t	        j                         z
  d      S r   )maxr   call_detailsdeadlinetimerI   s    r   time_remainingz_Context.time_remaining   s*    4??//88499;FJJr   c                 L    | j                   j                  j                          y r   )r   rp   cancelrI   s    r   r   z_Context.cancel   s    ##%r   c                     | j                   j                  5  | j                   j                  
	 d d d        y| j                   j                  j                  |       	 d d d        y# 1 sw Y   y xY w)NFT)r   r;   rG   rP   )rJ   callbacks     r   add_callbackz_Context.add_callback   s^    [["" 	{{$$,	 	 %%,,X6	 	 	s   A'&A''A0c                 |    | j                   j                  5  d| j                   _        d d d        y # 1 sw Y   y xY wri   )r   r;   rC   rI   s    r    disable_next_message_compressionz)_Context.disable_next_message_compression  s0    [["" 	837DKK0	8 	8 	8   2;c                 .    | j                   j                  S r   )r   r4   rI   s    r   r4   z_Context.invocation_metadata	  s    222r   c                 p    t        j                  | j                  j                  j	                               S r   )r   decoder   rp   peerrI   s    r   r   z_Context.peer  s$    ~~doo22779::r   c                 T    t        j                  | j                  j                        S r   )r   peer_identitiesr   rp   rI   s    r   r   z_Context.peer_identities  s    %%doo&:&:;;r   c                     t        j                  | j                  j                        }||S t	        j
                  |      S r   )r   peer_identity_keyr   rp   r   r   )rJ   id_keys     r   r   z_Context.peer_identity_key  s4    ))$//*>*>?vCW^^F-CCr   c                     t        j                  t        j                  | j                  j
                              D ci c]  \  }}t        j                  |      | c}}S c c}}w r   )six	iteritemsr   auth_contextr   rp   r   r   )rJ   keyvalues      r   r   z_Context.auth_context  sR    9<##DOO$8$89:;
+53GNN3&
 	
 
s     A$c                 |    | j                   j                  5  || j                   _        d d d        y # 1 sw Y   y xY wr   )r   r;   rB   )rJ   compressions     r   set_compressionz_Context.set_compression  s0    [["" 	<0;DKK-	< 	< 	<r   c                    | j                   j                  5  | j                   j                  t        u rt	        | j                          n| j                   j
                  rt        | j                   |      }| j                  j                  j                  |ft        | j                                d| j                   _        | j                   j                  j                  t               nt        d      d d d        y # 1 sw Y   y xY w)NFz#Initial metadata no longer allowed!)r   r;   r@   rj   rR   rA   rg   r   rp   rn   r   r=   ro   r   
ValueError)rJ   initial_metadatarf   s      r   r   z_Context.send_initial_metadata   s    [["" 	L{{!!Z/ -;;77 ?%5!7IOO((;;"&<T[[&IK;@DKK8KKOO''(DE$%JKK	L 	L 	Ls   CC??Dc                 |    | j                   j                  5  || j                   _        d d d        y # 1 sw Y   y xY wr   )r   r;   rD   )rJ   rD   s     r   set_trailing_metadataz_Context.set_trailing_metadata/  s0    [["" 	>,=DKK)	> 	> 	>r   c                 .    | j                   j                  S r   )r   rD   rI   s    r   rD   z_Context.trailing_metadata3  s    {{,,,r   c                    |t         j                  j                  k(  r1t        j	                  d       t         j                  j
                  }d}| j                  j                  5  || j                  _        t        j                  |      | j                  _        d| j                  _        t               # 1 sw Y   y xY w)Nz4abort() called with StatusCode.OK; returning UNKNOWN T)rN   r   OK_LOGGERerrorUNKNOWNr   r;   r    r   encoder+   rH   	Exception)rJ   r    r+   s      r   abortz_Context.abort6  s    4??%%%MMFH??**DG[["" 	#DKK").."9DKK"&DKK+		 	s   %AB66B?c                     |j                   | j                  _         | j                  |j                  |j                         y r   )rD   r   r   r    r+   )rJ   statuss     r   abort_with_statusz_Context.abort_with_statusC  s*    (.(@(@%

6;;/r   c                 |    | j                   j                  5  || j                   _        d d d        y # 1 sw Y   y xY wr   )r   r;   r    )rJ   r    s     r   set_codez_Context.set_codeG  s0    [["" 	$#DKK	$ 	$ 	$r   c                 .    | j                   j                  S r   )r   r    rI   s    r   r    z_Context.codeK  s    {{r   c                     | j                   j                  5  t        j                  |      | j                   _        d d d        y # 1 sw Y   y xY wr   )r   r;   r   r   r+   )rJ   r+   s     r   set_detailsz_Context.set_detailsN  s9    [["" 	:").."9DKK	: 	: 	:s   %AAc                 .    | j                   j                  S r   )r   r+   rI   s    r   r+   z_Context.detailsR  s    {{"""r   c                      y r   r2   rI   s    r   _finalize_statez_Context._finalize_stateU  s    r   N)r/   r0   r1   rK   r   r   r   r   r   r4   r   r   r   r   r   r   r   rD   r   r   r   r    r   r+   r   r2   r   r   r   r      ss    :
5K&83;<D
<L>-0$ :#r   r   c                   6    e Zd Zd Zd Zd Zd Zd Zd Zd Z	y)	_RequestIteratorc                 .    || _         || _        || _        y r   )r   _callr   )rJ   r&   rp   r   s       r   rK   z_RequestIterator.__init__[  s    
%9"r   c                    | j                   j                  t        u rt        | j                          y t	        | j                         s
t               | j                  j                  t        j                  t              ft        | j                   | j                  | j                               | j                   j                  j                  t               y r   )r   r@   rj   rR   rV   StopIterationr   rn   r   ReceiveMessageOperationre   r   r   r=   ro   r~   rI   s    r   _raise_or_start_receive_messagez0_RequestIterator._raise_or_start_receive_message`  s    ;;+T[[)%dkk2/!JJ))//=? djj!%!;!;=> KKOO 67r   c                 B   | j                   j                  t        u rt        | j                          t               | j                   j                  &t
        | j                   j                  vr
t               | j                   j                  }d | j                   _        |S r   )	r   r@   rj   rR   r>   r~   r=   r   AssertionErrorrJ   r>   s     r   _look_for_requestz"_RequestIterator._look_for_requestl  su    ;;+T[[)  kk!!)$DKKOO;/!kk))G"&DKKNr   c                     | j                   j                  5  | j                          	 | j                   j                  j                          | j	                         }||cd d d        S B# 1 sw Y   y xY wr   )r   r;   r   waitr   r   s     r   _nextz_RequestIterator._nexty  sh    [["" 	#002%%**,002&"	# 	#	# 	#s   A	A+*A++A4c                     | S r   r2   rI   s    r   __iter__z_RequestIterator.__iter__  s    r   c                 "    | j                         S r   r   rI   s    r   __next__z_RequestIterator.__next__      zz|r   c                 "    | j                         S r   r   rI   s    r   nextz_RequestIterator.next  r   r   N)
r/   r0   r1   rK   r   r   r   r   r   r   r2   r   r   r   r   Y  s%    :

8#r   r   c                       fd}|S )Nc            	         j                   5  t              s
	 d d d        y j                  j                  t	        j
                  t              ft        j                               j                  j                  t               	 j                   j                          j                  j                  t        u rrdj                  j                   j"                        } t%        j                  t        j&                  j(                  t+        j,                  |              	 d d d        y j                  t.        u r(	 d d d        y j                  }d _        |cd d d        S # 1 sw Y   y xY w)Nz*"{}" requires exactly one request message.)r;   rV   rp   rn   r   r   re   r   r=   ro   r~   r   r>   r@   rw   formatr   r3   rt   r   unimplementedr   r   rj   )r+   r>   r   r   r&   s     r   unary_requestz%_unary_request.<locals>.unary_request  s;   __ 	''.	' 	' 1133LAC$UINN%9;< 		45OO((*}}, <<72&R&Y&Y ) 6 6 = ='?G"5)..#)#4#4#B#B#*>>'#:< $(%	' 	'& #\\Z7#')	' 	', #(--(,&1	' 	' 	' 	's#   E2D
E27E2E21E22E;r2   )r   r&   r   r   s   ``` r   _unary_requestr     s    '6 r   c                 p   ddl m}  || ||      5 }	 d }| ||||      }n	 |||      }|dfcd d d        S # t        $ r}	|j                  5  |j                  r1t        || j                  t        j                  j                  d       nw|	|j                  vridj                  |	      }
t        j                  |
       t        || j                  t        j                  j                  t        j                  |
             d d d        n# 1 sw Y   nxY wY d }	~	d d d        yd }	~	ww xY w# 1 sw Y   y xY w)Nr   )_create_servicer_contextT   RPC Abortedz!Exception calling application: {}NF)rN   r   r   r;   rH   rt   rp   r   r   r   rF   r   r   	exceptionr   r   )r   r&   behaviorargumentr   send_response_callbackr   contextresponse_or_iteratorr   r+   s              r   _call_behaviorr     s,    .	!)U"6
8 ;B	#' %1'/'0F(H$ (0''B$'-   	 	4==5)..&2C2C2K2K)+e&6&66AHH!#G%%g.5)..&2C2C2K2K">>'24	4 	4 	4 + 	 sE   D,8	D)D$B5D	D$DD$D,$D))D,,D5c           
      
   	 t        |      dfS # t        $ r Y yt        $ r}|j                  5  |j                  r1t        || j                  t        j                  j                  d       nw||j                  vridj                  |      }t        j                  |       t        || j                  t        j                  j                  t        j                  |             d d d        n# 1 sw Y   nxY wY d }~yd }~ww xY w)NTri   r   z!Exception iterating responses: {}r   )r   r   r   r;   rH   rt   rp   r   r   r   rF   r   r   r   r   r   )r   r&   response_iteratorr   r+   s        r   %_take_response_from_response_iteratorr     s    %&,,  
__ 	0}}uinnf.?.?.G.G%'%"2"22=DDYO!!'*uinnf.?.?.G.G~~g.0	0 	0 	0 
s1    	DDC=B5C,#	C=,C5	1C==Dc                     t        j                  ||      }|F|j                  5  t        || j                  t
        j                  j                  d       d d d        y |S # 1 sw Y   y xY w)Ns   Failed to serialize response!)r   	serializer;   rt   rp   r   r   r   )r   r&   responseresponse_serializerserialized_responses        r   _serialize_responser    sd    !++H6IJ"__ 	55)..&*;*;*D*D35	5 ""	5 s   1A!!A*c                 Z    | j                   rt        j                  j                  S t        S r   )rC   r   	WriteFlagno_compressre   r%   s    r   %_get_send_message_op_flags_from_stater    s#    %%+++r   c                 T    | j                   5  d| _        d d d        y # 1 sw Y   y xY wr   )r;   rC   r%   s    r   _reset_per_message_stater    s&    	 /).&/ / /s   'c                 H   |j                   5  t        |      s
	 d d d        y|j                  r9t        |d       t	        j
                  |t        |            f}d|_        t        }n&t	        j
                  |t        |            f}t        }| j                  j                  |t        ||             |j                  j                  |       t        |       	 |j                   j                          ||j                  vrt        |      cd d d        S =# 1 sw Y   y xY wr   )r;   rV   rA   rg   r   SendMessageOperationr  -_SEND_INITIAL_METADATA_AND_SEND_MESSAGE_TOKEN_SEND_MESSAGE_TOKENrp   rn   r   r=   ro   r  r   )r   r&   r   rs   rW   s        r   _send_responser    s	   	 7#E*7 7 --3E4@//+=eDF
 27.E$99'9%@B D
 ,NN--j.;E5.IKIIMM% $U+$$&		)/637 7, -7 7s   DC*DDD!c           	      H   |j                   5  |j                  t        urt        |      }t	        |      }t        j                  |j                  ||t              g}|j                  r|j                  t        |d              |.|j                  t        j                  |t        |                   | j                  j                  |t!        |t"                     d|_        t'        |       |j(                  j+                  t"               d d d        y # 1 sw Y   y xY wri   )r;   r@   rj   r'   r,   r   rk   rD   re   rA   rP   rg   r	  r  rp   rn   r\   rm   rE   r  r=   ro   )r   r&   r   r    r+   rs   s         r   _statusr    s    	 :<<z)#E*DuoG44U5L5L5975ACJ
 --!!"A%"NO".!!//+=eDFG NN--(0NOQ "EN$U+IIMM89+: : :s   DDD!c                     t        j                  |        	  |       }|1t        | ||||      \  }}|rt        | |||      }	|	t	        | ||	       t        j
                          y # t        j
                          w xY wr   )r   'install_context_from_request_call_eventr   r  r  uninstall_context)
r   r&   r   argument_thunkr   r   r   r   proceedr   s
             r   _unary_response_in_poolr  *  s    
229=#!# .y%/79M!OHg&9uh0C'E#&2Iu.AB  "  "s   :A& &A<c                 H    t        j                           fd}	  |       }|Lt        |d      r|j                  rt	         ||||       n"t	         |||      \  }}	|	rt         ||       t        j                          y # t        j                          w xY w)Nc                 b    | t        d        y t        |       }|t        |       y y r   )r  r  r  )r   r   r   r   r&   s     r   send_responsez/_stream_response_in_pool.<locals>.send_response?  sE    Iud+"5i6>6I#K #.y%1DE /r   experimental_non_blocking)r   )r   r  hasattrr  r   3_send_message_callback_to_blocking_iterator_adapterr  )
r   r&   r   r  r   r   r  r   r   r  s
   ``   `    r   _stream_response_in_poolr  ;  s    
229=F#!#x!< $>>y$''36CE .<uh:N.P*!7G!5-9JL 	  "  "s   AB B!c                 D    | j                   t        uxr | j                   S r   )r@   rj   rE   r%   s    r   rV   rV   ^  s    <<z)@%...@@r   c                 T    	 t        | ||      \  }}|r ||       t        |      sy y (r   )r   rV   )r   r&   r   r   r   r  s         r   r  r  b  s<     Au/1'"8,'. r   c                 ~    t        | d      r0t        | j                  t        j                        r| j                  S |S )Nexperimental_thread_pool)r  
isinstancer  r   ThreadPoolExecutor)r   default_thread_pools     r    _select_thread_pool_for_behaviorr#  p  s8    x34--w/I/I:K000""r   c           	          t        | ||j                        }t        |j                  |      }|j	                  t
        | ||j                  ||j                  |j                        S r   )r   r   r#  unary_unarysubmitr  r   r   r&   method_handlerr"  r   thread_pools         r   _handle_unary_unaryr*  x  si    "9e#1#F#FHM2>3M3M3FHK5y%,88-,AA,@@B Br   c           	          t        | ||j                        }t        |j                  |      }|j	                  t
        | ||j                  ||j                  |j                        S r   )r   r   r#  unary_streamr&  r  r   r'  s         r   _handle_unary_streamr-    si    "9e#1#F#FHM2>3N3N3FHK6	5,99=,AA,@@B Br   c           	          t        || j                  |j                        t        |j                  |      }|j                  t        | ||j                  fd|j                  |j                        S )Nc                       S r   r2   request_iterators   r   <lambda>z&_handle_stream_unary.<locals>.<lambda>      &6 r   )r   rp   r   r#  stream_unaryr&  r  r   r   r&   r(  r"  r)  r1  s        @r   _handle_stream_unaryr6    sp    'y~~(6(K(KM2>3N3N3FHK5y%,996,AA,@@	B Br   c           	          t        || j                  |j                        t        |j                  |      }|j                  t        | ||j                  fd|j                  |j                        S )Nc                       S r   r2   r0  s   r   r2  z'_handle_stream_stream.<locals>.<lambda>  r3  r   )r   rp   r   r#  stream_streamr&  r  r   r5  s        @r   _handle_stream_streamr:    sp    'y~~(6(K(KM2>3O3O3FHK6	5,::6,AA,@@	B Br   c                     fd}t        t        j                  | j                  j                        | j
                        }||j                  ||      S  ||      S )Nc                 B    D ]  }|j                  |       }||c S  y r   )service)handler_call_detailsgeneric_handlerr(  generic_handlerss      r   query_handlersz,_find_method_handler.<locals>.query_handlers  s4    / 	&O,445IJN)%%	& r   )r.   r   r   r   r3   r4   execute)r   r@  interceptor_pipelinerA  r>  s    `   r   _find_method_handlerrD    sf     /y--445%%' '#++N,@B 	B 233r   c                     t               t        d       t        j                  t              t        j
                  d ||t              f}| j                  j                  |fd       S )Nc                     dfS rT   r2   )ignored_event	rpc_states    r   r2  z_reject_rpc.<locals>.<lambda>  s    
I r   )r6   rg   r   ReceiveCloseOnServerOperationre   rk   rp   rn   )r   r   r+   rs   rH  s       @r   _reject_rpcrJ    sc    I'	48,,\:,,T67-9	;J NN%%j 3  r   c                    t               }|j                  5  | j                  j                  t	        j
                  t              ft        |             |j                  j                  t               |j                  r>|j                  r|t        | |||      fcd d d        S |t        | |||      fcd d d        S |j                  r|t        | |||      fcd d d        S |t!        | |||      fcd d d        S # 1 sw Y   y xY wr   )r6   r;   rp   rn   r   rI  re   r{   r=   ro   ry   request_streamingresponse_streamingr:  r6  r-  r*  )r   r(  r)  r&   s       r   _handle_with_method_handlerrN    s   KE	 O))11,?A$U+	- 			45++003Iu4BKQ QO O 29e3A;P PO O 0029e3A;P PO O" 1)U2@+O O#O O Os   BC<%C<>C<#C<<Dc                    | j                   sy| j                  j                  m	 t        | ||      }|'t        | t        j                  j                  d      d fS |r't        | t        j                  j                  d      d fS t        | ||      S y# t        $ rW}dj                  |      }t        j                  |       t        | t        j                  j                  d      d fcY d }~S d }~ww xY w)N)NNzException servicing handler: {}s   Error in service handler!s   Method not found!s   Concurrent RPC limit exceeded!)successr   r3   rD  r   r   r   r   rJ  r   r   r   r   resource_exhaustedrN  )r   r@  rC  r)  concurrency_exceededr(  r   r+   s           r   _handle_callrS    s   $$0	C1)=M2FHN !y&*;*;*I*I356:; ;!y&*;*;*N*N@BCGH H /y./:< <   	C7>>yIGg&y&*;*;*C*C;=>BC C	Cs   B 	C2AC-'C2-C2c                       e Zd ZdZdZdZy)_ServerStagestoppedstartedgraceN)r/   r0   r1   STOPPEDSTARTEDGRACEr2   r   r   rU  rU    s    GGEr   rU  c                       e Zd Zd Zy)_ServerStatec                 t   t        j                         | _        || _        || _        t        |      | _        || _        || _        t        j                  | _        t        j                         | _        | j                  g| _        || _        d| _        t#               | _        t#               | _        d| _        y )Nr   F)r9   RLocklockcompletion_queueserverlistr@  rC  r)  rU  rY  stageEventtermination_eventshutdown_eventsmaximum_concurrent_rpcsactive_rpc_countr<   
rpc_statesr=   server_deallocated)rJ   ra  rb  r@  rC  r)  rh  s          r   rK   z_ServerState.__init__  s    OO%	 0 $%5 6$8!&!))
!*!2 $ 6 67'>$ ! %5 #(r   NrL   r2   r   r   r]  r]    s    (r   r]  c                 |    | j                   5  | j                  j                  |       d d d        y # 1 sw Y   y xY wr   )r`  r@  extend)r&   r@  s     r   _add_generic_handlersrn    s3    	 8%%&678 8 8s   2;c                 |    | j                   5  | j                  j                  |      cd d d        S # 1 sw Y   y xY wr   )r`  rb  add_http2_port)r&   addresss     r   _add_insecure_portrr     s0    	 4||**734 4 4s   2;c                     | j                   5  | j                  j                  ||j                        cd d d        S # 1 sw Y   y xY wr   )r`  rb  rp  _credentials)r&   rq  server_credentialss      r   _add_secure_portrv  %  s@    	 L||**7+=+J+JLL L Ls	   &=Ac                     | j                   j                  | j                  | j                  t               | j                  j                  t               y r   )rb  r	   ra  _REQUEST_CALL_TAGr=   ro   r%   s    r   _request_callry  +  s8    	LLe44e6L6L/1	IIMM#$r   c                     | j                   s]| j                  sQ| j                  j                          | j                  D ]  }|j                           t        j                  | _        yyr8   )	rj  r=   rb  destroyrg  r<   rU  rY  rd  )r&   shutdown_events     r   _stop_servingr}  2  sU    EII#33 	!N 	!"**r   c                 p    | j                   5  | xj                  dz  c_        d d d        y # 1 sw Y   y xY w)N   )r`  ri  r%   s    r   _on_call_completedr  =  s/    	 $!#$ $ $s   ,5c                 R    d}|j                   t        u rC j                  5   j                  j	                  t               t               rd}d d d        |S |j                   t        u r j                  5   j                  j	                  t                j                  d uxr  j                   j                  k\  }t        | j                   j                   j                  |      \  }}| j                  j                  |       |) xj                  dz  c_        |j                   fd        j                   t"        j$                  u rt'                nt               rd}d d d        |S |j                  |      \  }}|D ]
  }	  |         |? j                  5   j                  j	                  |       t               rd}d d d        |S |S # 1 sw Y   |S xY w# 1 sw Y   |S xY w# t(        $ r t*        j-                  d       Y w xY w# 1 sw Y   |S xY w)NTFr  c                     t              S r   )r  )unused_futurer&   s    r   r2  z-_process_event_and_continue.<locals>.<lambda>X  s    *<U*C r   zException calling callback!)tag_SHUTDOWN_TAGr`  r=   rU   r}  rx  rh  ri  rS  r@  rC  r)  rj  ro   add_done_callbackrd  rU  rZ  ry  r   r   r   )r&   eventshould_continuerR  rH  
rpc_futurerG   r   s   `       r   _process_event_and_continuer  B  s   OyyM!ZZ 	(II]+U#"'	(H A 
'	'ZZ 	(II./--T9 H&&%*G*GG ! %18N8N161K1K161B1B1E%G!Iz $  $$Y/%&&!+&,,CE{{l222e$u%"'%	(>   %yy/	9! 	AHA
	A
   ,  ''	2 '&+O, ?I	(H ?	(>   A!!"?@A, s6   -G8C6G+G8))HG(+G58HHH&c                    	 t        j                          t        z   }| j                  j                  |      }| j                  rt        |        |j                  t        j                  j                  k7  rt        | |      sy d }r   )r   "_DEALLOCATED_SERVER_CHECK_PERIOD_Sra  pollrk  _begin_shutdown_oncecompletion_typer   CompletionTypequeue_timeoutr  )r&   timeoutr  s      r   _server  l  sp    
))+ BB&&++G4## '  F$9$9$G$GG.ue<  r   c                 :   | j                   5  | j                  t        j                  u r^| j                  j                  | j                  t               t        j                  | _        | j                  j                  t               d d d        y # 1 sw Y   y xY wr   )r`  rd  rU  rZ  rb  r   ra  r  r[  r=   ro   r%   s    r   r  r  {  sg    	 );;,...LL!!%"8"8-H&,,EKIIMM-(	) ) )s   A;BBc                 $     j                   5   j                  t        j                  u r/t	        j
                         j                          cd d d        S t                t	        j
                          j                  j                          j                  j                          n8 fd}t	        j                  |      }|j                          cd d d        S 	 d d d        j                          S # 1 sw Y   xY w)Nc                      j                          j                  5  j                  j                          d d d        y # 1 sw Y   y xY wN)r  )r   r`  rb  cancel_all_calls)rX  r|  r&   s   r   cancel_all_calls_after_gracez+_stop.<locals>.cancel_all_calls_after_grace  s@    "'''6 85578 8 8s   AA)target)r`  rd  rU  rY  r9   re  r<   r  rg  rP   rb  r  Threadstartr   )r&   rX  r  threadr|  s   ``  @r   _stopr    s    	 &;;,...&__.N !	& & !'&__.N!!((8}--/8
 #))1MN%)& & 0&* -& &s   ADBDDc                 n   | j                   5  | j                  t        j                  urt	        d      | j
                  j                          t        j                  | _        t        |        t        j                  t        | f      }d|_        |j                          d d d        y # 1 sw Y   y xY w)Nz$Cannot start already-started server!)r  argsT)r`  rd  rU  rY  r   rb  r  rZ  ry  r9   r  r  daemon)r&   r  s     r   _startr    s    	 	;;l222CDD"**e!!uh?	 	 	s   BB++B4c                 d    | D ]+  }t        |dd       }|t        dj                  |             y )Nr=  zT"{}" must conform to grpc.GenericRpcHandler type but does not have "service" method!)getattrAttributeErrorr   )generic_rpc_handlersgeneric_rpc_handlerservice_attributes      r   _validate_generic_rpc_handlersr    sI    3 J#$7DI$ --3V4G-HJ JJr   c                 H    t        j                  |      }t        |       |z   S r   )r   create_channel_optionr_   )base_optionsr   compression_options      r   _augment_optionsr    s$    %;;KH!333r   c                   >    e Zd Zd Zd Zd Zd Zd Zd
dZd Z	d	 Z
y)_Serverc                     t        j                         }t        j                  t        ||      |      }	|	j	                  |       t        ||	|t        j                  |      ||      | _        y r   )	r   CompletionQueueServerr  register_completion_queuer]  r   service_pipeliner   )
rJ   r)  r@  interceptorsoptionsrh  r   xdsra  rb  s
             r   rK   z_Server.__init__  sa    !113/EsK(()9:"#3V=M#/#@#@#N#.0GIr   c                 F    t        |       t        | j                  |       y r   )r  rn  r   )rJ   r  s     r   add_generic_rpc_handlersz _Server.add_generic_rpc_handlers  s    &';<dkk+?@r   c           	      |    t        j                  |t        | j                  t        j                  |                  S r   )r   validate_port_binding_resultrr  r   r   )rJ   rq  s     r   add_insecure_portz_Server.add_insecure_port  s1    33'W^^G5LMO 	Or   c           	      ~    t        j                  |t        | j                  t        j                  |      |            S r   )r   r  rv  r   r   )rJ   rq  ru  s      r   add_secure_portz_Server.add_secure_port  s4    33T[['..*A/12 	2r   c                 .    t        | j                         y r   )r  r   rI   s    r   r  z_Server.start  s    t{{r   Nc                     t        j                  | j                  j                  j                  | j                  j                  j                  |      S r  )r   r   r   rf  is_set)rJ   r  s     r   wait_for_terminationz_Server.wait_for_termination  s=     ||DKK99>> KK99@@$+- 	-r   c                 .    t        | j                  |      S r   )r  r   )rJ   rX  s     r   stopz_Server.stop  s    T[[%((r   c                 @    t        | d      rd| j                  _        y y )Nr   T)r  r   rk  rI   s    r   __del__z_Server.__del__  s    4" .2DKK* #r   r   )r/   r0   r1   rK   r  r  r  r  r  r  r  r2   r   r   r  r    s-    IAO2-)2r   r  c           	      :    t        |       t        | ||||||      S r   )r  r  )r)  r  r  r  rh  r   r  s          r   create_serverr    s(    "#78; 4lG*K> >r   r   )a__doc__collections
concurrentr   enumloggingr9   r   rN   r   r   r   grpc._cythonr   r   	getLoggerr/   r   r  rx  ry   r   r~   r  r
  rm   rl   r?   rw   rj   re   r  _INF_TIMEOUTr   r"   r'   r)   r,   
namedtupleHandlerCallDetailsr.   objectr6   rR   rX   r\   rb   rg   rt   r{   r   r   r   ServicerContextr   r   r   r   r   r  r  r  r  r  r  r  rV   r  r#  r*  r-  r6  r:  rD  rJ  rN  rS  uniqueEnumrU  r]  rn  rr  rv  ry  r}  r  r  r  r  r  r  r  r  r  r  r  r2   r   r   <module>r     s@   2            

'

H
%" !: 6 * $ * .!: 5 9 	

%( "7M
--;	4 7
 	 ##		 &#0#2!jt## jZ0v 0fJ +/>$#/
7::2#" #FA#BB	B
B4(O.4 499  (6 (28
4
L%$
'T)4
J4
,2dkk ,2^>r   