B
    ¬»ˆdX_  ã               @   sØ  d Z ddlZddlZddlmZ ddlZddlZddlZddl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ZdZdZdZdZ dZ!dZ"dZ#e $e%¡Z&G dd„ dej'ƒZ(eej)e(dœdd„Z*G dd„ dƒZ+G d d!„ d!ej,ƒZ-G d"d#„ d#e+ƒZ.G d$d%„ d%e+ƒZ/G d&d'„ d'e+ƒZ0G d(d)„ d)e.e+ej1ƒZ1G d*d+„ d+e/e+ej2ƒZ2G d,d-„ d-e0e.e+ej3ƒZ3G d.d/„ d/e0e/e+ej4ƒZ4dS )0z6Invocation-side implementation of gRPC Asyncio Python.é    N)Úpartial)ÚAsyncIteratorÚOptionalÚTuple)Ú_common)Úcygrpcé   )Ú
_base_call)ÚMetadata)ÚDeserializingFunction)ÚDoneCallbackType)ÚMetadatumType)ÚRequestIterableType)ÚRequestType)ÚResponseType)ÚSerializingFunction)ÚAioRpcErrorÚCallÚUnaryUnaryCallÚUnaryStreamCallz!Locally cancelled by application!z"Cancelled upon garbage collection!zRPC already finished.z0RPC is half closed after calling "done_writing".zBThe iterator and read/write APIs may not be mixed on a single RPC.z?<{} of RPC that terminated with:
	status = {}
	details = "{}"
>zZ<{} of RPC that terminated with:
	status = {}
	details = "{}"
	debug_error_string = "{}"
>c                   sî   e Zd ZU dZejed< ee ed< ee	 ed< ee	 ed< ee ed< deje	e	ee ee ddœ‡ fd	d
„Z
ej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‡  ZS )r   zÙAn implementation of RpcError to be used by the asynchronous API.

    Raised RpcError is a snapshot of the final status of the RPC, values are
    determined. Hence, its methods no longer needs to be coroutines.
    Ú_codeÚ_detailsÚ_initial_metadataÚ_trailing_metadataÚ_debug_error_stringN)ÚcodeÚinitial_metadataÚtrailing_metadataÚdetailsÚdebug_error_stringÚreturnc                s,   t ƒ  ¡  || _|| _|| _|| _|| _dS )ah  Constructor.

        Args:
          code: The status code with which the RPC has been finalized.
          details: Optional details explaining the reason of the error.
          initial_metadata: Optional initial metadata that could be sent by the
            Server.
          trailing_metadata: Optional metadata that could be sent by the Server.
        N)ÚsuperÚ__init__r   r   r   r   r   )Úselfr   r   r   r   r   )Ú	__class__© ú@/var/www/html/venv/lib/python3.7/site-packages/grpc/aio/_call.pyr"   I   s    
zAioRpcError.__init__)r    c             C   s   | j S )ztAccesses the status code sent by the server.

        Returns:
          The `grpc.StatusCode` status code.
        )r   )r#   r%   r%   r&   r   `   s    zAioRpcError.codec             C   s   | j S )zkAccesses the details sent by the server.

        Returns:
          The description of the error.
        )r   )r#   r%   r%   r&   r   h   s    zAioRpcError.detailsc             C   s   | j S )zuAccesses the initial metadata sent by the server.

        Returns:
          The initial metadata received.
        )r   )r#   r%   r%   r&   r   p   s    zAioRpcError.initial_metadatac             C   s   | j S )zwAccesses the trailing metadata sent by the server.

        Returns:
          The trailing metadata received.
        )r   )r#   r%   r%   r&   r   x   s    zAioRpcError.trailing_metadatac             C   s   | j S )zyAccesses the debug error string sent by the server.

        Returns:
          The debug error string received.
        )r   )r#   r%   r%   r&   r   €   s    zAioRpcError.debug_error_stringc             C   s   t  | jj| j| j| j¡S )z-Assembles the error string for the RPC error.)Ú_NON_OK_CALL_REPRESENTATIONÚformatr$   Ú__name__r   r   r   )r#   r%   r%   r&   Ú_reprˆ   s    
zAioRpcError._reprc             C   s   |   ¡ S )N)r*   )r#   r%   r%   r&   Ú__repr__Ž   s    zAioRpcError.__repr__c             C   s   |   ¡ S )N)r*   )r#   r%   r%   r&   Ú__str__‘   s    zAioRpcError.__str__)NN)r)   Ú
__module__Ú__qualname__Ú__doc__ÚgrpcÚ
StatusCodeÚ__annotations__r   Ústrr
   r"   r   r   r   r   r   r*   r+   r,   Ú__classcell__r%   r%   )r$   r&   r   <   s    

 (r   )r   Ústatusr    c             C   s4   t tj| ¡  t | ¡t | ¡ ¡| ¡ | ¡ dS )N)r   r   )	r   r   Ú!CYGRPC_STATUS_CODE_TO_STATUS_CODEr   r
   Ú
from_tupler   r   r   )r   r5   r%   r%   r&   Ú_create_rpc_error•   s    r8   c               @   sV  e Zd ZU dZejed< ejed< e	j
ed< eedf ed< eed< eed< e	j
eeeejd	d
œdd„Zd	dœdd„Z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d„Zee dœdd„Zedœdd„Zedœd d!„Zejdœd"d#„Zedœd$d%„Z edœd&d'„Z!d	dœd(d)„Z"edœd*d+„Z#edœd,d-„Z$edœd.d/„Z%d	S )0r   zyBase implementation of client RPC Call object.

    Implements logic around final status, metadata and cancellation.
    Ú_loopr   Ú_cython_call.Ú	_metadataÚ_request_serializerÚ_response_deserializerN)Úcython_callÚmetadataÚrequest_serializerÚresponse_deserializerÚloopr    c             C   s&   || _ || _t|ƒ| _|| _|| _d S )N)r9   r:   Útupler;   r<   r=   )r#   r>   r?   r@   rA   rB   r%   r%   r&   r"   ¬   s
    
zCall.__init__)r    c             C   s"   t | dƒr| j ¡ s|  t¡ d S )Nr:   )Úhasattrr:   ÚdoneÚ_cancelÚ_GC_CANCELLATION_DETAILS)r#   r%   r%   r&   Ú__del__¶   s    

zCall.__del__c             C   s
   | j  ¡ S )N)r:   Ú	cancelled)r#   r%   r%   r&   rI   ¼   s    zCall.cancelled)r   r    c             C   s"   | j  ¡ s| j  |¡ dS dS dS )z0Forwards the application cancellation reasoning.TFN)r:   rE   Úcancel)r#   r   r%   r%   r&   rF   ¿   s    
zCall._cancelc             C   s
   |   t¡S )N)rF   Ú_LOCAL_CANCELLATION_DETAILS)r#   r%   r%   r&   rJ   Ç   s    zCall.cancelc             C   s
   | j  ¡ S )N)r:   rE   )r#   r%   r%   r&   rE   Ê   s    z	Call.done)Úcallbackr    c             C   s   t || ƒ}| j |¡ d S )N)r   r:   Úadd_done_callback)r#   rL   Úcbr%   r%   r&   rM   Í   s    
zCall.add_done_callbackc             C   s
   | j  ¡ S )N)r:   Útime_remaining)r#   r%   r%   r&   rO   Ñ   s    zCall.time_remainingc             Ã   s   | j  ¡ I d H }t |¡S )N)r:   r   r
   r7   )r#   Úraw_metadata_tupler%   r%   r&   r   Ô   s    zCall.initial_metadatac             Ã   s   | j  ¡ I d H  ¡ }t |¡S )N)r:   r5   r   r
   r7   )r#   rP   r%   r%   r&   r   Ø   s    zCall.trailing_metadatac             Ã   s   | j  ¡ I d H  ¡ }tj| S )N)r:   r5   r   r   r6   )r#   Zcygrpc_coder%   r%   r&   r   Ý   s    z	Call.codec             Ã   s   | j  ¡ I d H  ¡ S )N)r:   r5   r   )r#   r%   r%   r&   r   á   s    zCall.detailsc             Ã   s   | j  ¡ I d H  ¡ S )N)r:   r5   r   )r#   r%   r%   r&   r   ä   s    zCall.debug_error_stringc             Ã   sP   | j  ¡ rt ¡ ‚|  ¡ I d H }|tjjkrLt|  	¡ I d H | j  
¡ I d H ƒ‚d S )N)r:   Úis_locally_cancelledÚasyncioÚCancelledErrorr   r0   r1   ÚOKr8   r   r5   )r#   r   r%   r%   r&   Ú_raise_for_statusç   s    
zCall._raise_for_statusc             C   s
   t | jƒS )N)Úreprr:   )r#   r%   r%   r&   r*   ï   s    z
Call._reprc             C   s   |   ¡ S )N)r*   )r#   r%   r%   r&   r+   ò   s    zCall.__repr__c             C   s   |   ¡ S )N)r*   )r#   r%   r%   r&   r,   õ   s    zCall.__str__)&r)   r-   r.   r/   rR   ÚAbstractEventLoopr2   r0   r1   r   Z_AioCallr   r   r   r   r
   r"   rH   ÚboolrI   r3   rF   rJ   rE   r   rM   r   ÚfloatrO   r   r   r   r   r   rU   r*   r+   r,   r%   r%   r%   r&   r       s6   



r   c               @   s   e Zd ZdZdZdZdS )Ú	_APIStyler   r   é   N)r)   r-   r.   ÚUNKNOWNÚASYNC_GENERATORÚREADER_WRITERr%   r%   r%   r&   rZ   ù   s   rZ   c                   sL   e Zd ZU ejed< ejdœdd„Zedœ‡ fdd„Ze	dœdd	„Z
‡  ZS )
Ú_UnaryResponseMixinÚ_call_response)Úresponse_taskc             C   s
   || _ d S )N)r`   )r#   ra   r%   r%   r&   Ú_init_unary_response_mixin  s    z._UnaryResponseMixin._init_unary_response_mixin)r    c                s    t ƒ  ¡ r| j ¡  dS dS d S )NTF)r!   rJ   r`   )r#   )r$   r%   r&   rJ     s    

z_UnaryResponseMixin.cancelc             c   st   y| j E dH }W n( tjk
r8   |  ¡ s2|  ¡  ‚ Y nX |tjkrl| j ¡ rXt ¡ ‚qpt	| jj
| jjƒ‚n|S dS )z+Wait till the ongoing RPC request finishes.N)r`   rR   rS   rI   rJ   r   ÚEOFr:   rQ   r8   r   Z_status)r#   Úresponser%   r%   r&   Ú	__await__  s    


z_UnaryResponseMixin.__await__)r)   r-   r.   rR   ÚTaskr2   rb   rX   rJ   r   re   r4   r%   r%   )r$   r&   r_   ÿ   s   

r_   c                   sœ   e Zd ZU ee ed< ejed< eed< ejdœdd„Z	edœdd	„Z
ed
œ‡ fdd„Zed
œdd„Zee d
œdd„Zed
œdd„Zed
œdd„Z‡  ZS )Ú_StreamResponseMixinÚ_message_aiterÚ_preparationÚ_response_style)Úpreparationc             C   s   d | _ || _tj| _d S )N)rh   ri   rZ   r\   rj   )r#   rk   r%   r%   r&   Ú_init_stream_response_mixin-  s    z0_StreamResponseMixin._init_stream_response_mixin)Ústylec             C   s,   | j tjkr|| _ n| j |k	r(t t¡‚d S )N)rj   rZ   r\   r   Ú
UsageErrorÚ_API_STYLE_ERROR)r#   rm   r%   r%   r&   Ú_update_response_style2  s    
z+_StreamResponseMixin._update_response_style)r    c                s    t ƒ  ¡ r| j ¡  dS dS d S )NTF)r!   rJ   ri   )r#   )r$   r%   r&   rJ   8  s    

z_StreamResponseMixin.cancelc             C  sD   |   ¡ I d H }x"|tjk	r0|V  |   ¡ I d H }qW |  ¡ I d H  d S )N)Ú_readr   rc   rU   )r#   Úmessager%   r%   r&   Ú_fetch_stream_responses?  s
    z,_StreamResponseMixin._fetch_stream_responsesc             C   s&   |   tj¡ | jd kr |  ¡ | _| jS )N)rp   rZ   r]   rh   rs   )r#   r%   r%   r&   Ú	__aiter__H  s    

z_StreamResponseMixin.__aiter__c             Ã   sl   | j I d H  y| j ¡ I d H }W n( tjk
rH   |  ¡ sB|  ¡  ‚ Y nX |tjkrZtjS t	 
|| j¡S d S )N)ri   r:   Zreceive_serialized_messagerR   rS   rI   rJ   r   rc   r   Údeserializer=   )r#   Zraw_responser%   r%   r&   rq   N  s    
z_StreamResponseMixin._readc             Ã   sR   |   ¡ r|  ¡ I d H  tjS |  tj¡ |  ¡ I d H }|tjkrN|  ¡ I d H  |S )N)rE   rU   r   rc   rp   rZ   r^   rq   )r#   Zresponse_messager%   r%   r&   Úread`  s    
z_StreamResponseMixin.read)r)   r-   r.   r   r   r2   rR   rf   rZ   rl   rp   rX   rJ   rs   rt   rq   rv   r4   r%   r%   )r$   r&   rg   (  s   

	rg   c                   sÎ   e Zd ZU ejed< eed< eej ed< e	ed< ee
 dœdd„Ze	dœd	d
„Zedœ‡ fdd„Zdd„ Ze
ddœdd„Zeddœdd„Zddœdd„Zeddœdd„Zddœdd„Zddœdd„Z‡  ZS )Ú_StreamRequestMixinÚ_metadata_sentÚ_done_writing_flagÚ_async_request_pollerÚ_request_style)Úrequest_iteratorc             C   sH   t  ¡ | _d| _|d k	r6| j |  |¡¡| _tj	| _
nd | _tj| _
d S )NF)rR   ÚEventrx   ry   r9   Úcreate_taskÚ_consume_request_iteratorrz   rZ   r]   r{   r^   )r#   r|   r%   r%   r&   Ú_init_stream_request_mixint  s    

z._StreamRequestMixin._init_stream_request_mixin)rm   c             C   s   | j |k	rt t¡‚d S )N)r{   r   rn   ro   )r#   rm   r%   r%   r&   Ú_raise_for_different_style‚  s    
z._StreamRequestMixin._raise_for_different_style)r    c                s*   t ƒ  ¡ r"| jd k	r| j ¡  dS dS d S )NTF)r!   rJ   rz   )r#   )r$   r%   r&   rJ   †  s
    


z_StreamRequestMixin.cancelc             C   s   | j  ¡  d S )N)rx   Úset)r#   r%   r%   r&   Ú_metadata_sent_observerŽ  s    z+_StreamRequestMixin._metadata_sent_observerN)r|   r    c             Ã   s  yêt  |¡st|dƒrˆxÂ|2 y3 d H }W n
 tk
szX y|  |¡I d H  W q tk
rv } zt d|¡ d S d }~X Y qX q   Y  W nRxP|D ]H}y|  |¡I d H  W qŽ tk
rÔ } zt d|¡ d S d }~X Y qŽX qŽW |  ¡ I d H  W n$   t dt	 
¡ ¡ |  ¡  Y nX d S )Nrt   z2Exception while consuming the request_iterator: %sz,Client request_iterator raised exception:
%s)ÚinspectÚ
isasyncgenrD   ÚStopAsyncIterationÚ_writer   Ú_LOGGERÚdebugÚ_done_writingÚ	tracebackÚ
format_excrJ   )r#   r|   ÚrequestZ	rpc_errorr%   r%   r&   r   ‘  s0    "

z-_StreamRequestMixin._consume_request_iterator)r   r    c             Ã   sÆ   |   ¡ rt t¡‚| jr"t t¡‚| j ¡ sR| j ¡ I d H  |   ¡ rR|  	¡ I d H  t
 || j¡}y| j |¡I d H  W nJ tjk
rš   |  	¡ I d H  Y n( tjk
rÀ   |  ¡ sº|  ¡  ‚ Y nX d S )N)rE   rR   ÚInvalidStateErrorÚ_RPC_ALREADY_FINISHED_DETAILSry   Ú_RPC_HALF_CLOSED_DETAILSrx   Úis_setÚwaitrU   r   Ú	serializer<   r:   Zsend_serialized_messager   ZInternalErrorrS   rI   rJ   )r#   r   Úserialized_requestr%   r%   r&   r‡   ±  s$    


z_StreamRequestMixin._writec             Ã   sZ   |   ¡ rd S | jsVd| _y| j ¡ I d H  W n( tjk
rT   |  ¡ sN|  ¡  ‚ Y nX d S )NT)rE   ry   r:   Zsend_receive_closerR   rS   rI   rJ   )r#   r%   r%   r&   rŠ   Æ  s    z!_StreamRequestMixin._done_writingc             Ã   s    |   tj¡ |  |¡I d H  d S )N)r   rZ   r^   r‡   )r#   r   r%   r%   r&   ÚwriteÔ  s    z_StreamRequestMixin.writec             Ã   s   |   tj¡ |  ¡ I dH  dS )zUSignal peer that client is done writing.

        This method is idempotent.
        N)r   rZ   r^   rŠ   )r#   r%   r%   r&   Údone_writingØ  s    z _StreamRequestMixin.done_writingc             Ã   s*   | j  ¡ I d H  |  ¡ r&|  ¡ I d H  d S )N)rx   r’   rE   rU   )r#   r%   r%   r&   Úwait_for_connectionà  s    z'_StreamRequestMixin.wait_for_connection)r)   r-   r.   rR   r}   r2   rX   r   rf   rZ   r   r€   r   rJ   rƒ   r   r   r‡   rŠ   r•   r–   r—   r4   r%   r%   )r$   r&   rw   n  s   

rw   c                   s|   e Zd ZU dZeed< ejed< eee	 e
eej ee ejeeeejddœ‡ fdd„Zedœd	d
„Zddœdd„Z‡  ZS )r   z}Object for managing unary-unary RPC calls.

    Returned when an instance of `UnaryUnaryMultiCallable` object is called.
    Ú_requestÚ_invocation_taskN)r   Údeadliner?   ÚcredentialsÚwait_for_readyÚchannelÚmethodr@   rA   rB   r    c                sF   t ƒ  | ||||¡|||	|
¡ || _|
 |  ¡ ¡| _|  | j¡ d S )N)r!   r"   Úcallr˜   r~   Ú_invoker™   rb   )r#   r   rš   r?   r›   rœ   r   rž   r@   rA   rB   )r$   r%   r&   r"   ï  s    zUnaryUnaryCall.__init__)r    c             Ã   st   t  | j| j¡}y| j || j¡I d H }W n& tjk
rP   |  	¡ sL|  
¡  Y nX | j ¡ rjt  || j¡S tjS d S )N)r   r“   r˜   r<   r:   Zunary_unaryr;   rR   rS   rI   rJ   Úis_okru   r=   r   rc   )r#   r”   Úserialized_responser%   r%   r&   r    ý  s    
zUnaryUnaryCall._invokec             Ã   s&   | j I d H  |  ¡ r"|  ¡ I d H  d S )N)r™   rE   rU   )r#   r%   r%   r&   r—     s    z"UnaryUnaryCall.wait_for_connection)r)   r-   r.   r/   r   r2   rR   rf   r   rY   r
   r0   ÚCallCredentialsrX   r   Ú
AioChannelÚbytesr   r   rW   r"   r   r    r—   r4   r%   r%   )r$   r&   r   æ  s   


r   c                   s|   e Zd ZU dZeed< ejed< eee	 e
eej ee ejeeeejddœ‡ fdd„Zedœd	d
„Zddœdd„Z‡  ZS )r   zObject for managing unary-stream RPC calls.

    Returned when an instance of `UnaryStreamMultiCallable` object is called.
    r˜   Ú_send_unary_request_taskN)r   rš   r?   r›   rœ   r   rž   r@   rA   rB   r    c                sF   t ƒ  | ||||¡|||	|
¡ || _|
 |  ¡ ¡| _|  | j¡ d S )N)r!   r"   rŸ   r˜   r~   Ú_send_unary_requestr¦   rl   )r#   r   rš   r?   r›   rœ   r   rž   r@   rA   rB   )r$   r%   r&   r"      s    zUnaryStreamCall.__init__)r    c             Ã   sX   t  | j| j¡}y| j || j¡I d H  W n( tjk
rR   |  	¡ sL|  
¡  ‚ Y nX d S )N)r   r“   r˜   r<   r:   Zinitiate_unary_streamr;   rR   rS   rI   rJ   )r#   r”   r%   r%   r&   r§   /  s    z#UnaryStreamCall._send_unary_requestc             Ã   s&   | j I d H  |  ¡ r"|  ¡ I d H  d S )N)r¦   rE   rU   )r#   r%   r%   r&   r—   :  s    z#UnaryStreamCall.wait_for_connection)r)   r-   r.   r/   r   r2   rR   rf   r   rY   r
   r0   r£   rX   r   r¤   r¥   r   r   rW   r"   r   r§   r—   r4   r%   r%   )r$   r&   r     s   


	r   c                   s^   e Zd ZdZee ee eeej	 ee
 ejeeeejddœ‡ fdd„Zedœdd„Z‡  ZS )	ÚStreamUnaryCallzObject for managing stream-unary RPC calls.

    Returned when an instance of `StreamUnaryMultiCallable` object is called.
    N)r|   rš   r?   r›   rœ   r   rž   r@   rA   rB   r    c                sB   t ƒ  | ||||¡|||	|
¡ |  |¡ |  |
 |  ¡ ¡¡ d S )N)r!   r"   rŸ   r€   rb   r~   Ú_conduct_rpc)r#   r|   rš   r?   r›   rœ   r   rž   r@   rA   rB   )r$   r%   r&   r"   H  s
    
zStreamUnaryCall.__init__)r    c             Ã   sh   y| j  | j| j¡I d H }W n( tjk
rD   |  ¡ s>|  ¡  ‚ Y nX | j  ¡ r^t	 
|| j¡S tjS d S )N)r:   Zstream_unaryr;   rƒ   rR   rS   rI   rJ   r¡   r   ru   r=   r   rc   )r#   r¢   r%   r%   r&   r©   V  s    
zStreamUnaryCall._conduct_rpc)r)   r-   r.   r/   r   r   rY   r
   r0   r£   rX   r   r¤   r¥   r   r   rR   rW   r"   r   r©   r4   r%   r%   )r$   r&   r¨   @  s   
r¨   c                   sd   e Zd ZU dZejed< ee ee	 e
eej ee ejeeeejddœ‡ fdd„Zdd„ Z‡  ZS )	ÚStreamStreamCallzObject for managing stream-stream RPC calls.

    Returned when an instance of `StreamStreamMultiCallable` object is called.
    Ú_initializerN)r|   rš   r?   r›   rœ   r   rž   r@   rA   rB   r    c                sL   t ƒ  | ||||¡|||	|
¡ | j |  ¡ ¡| _|  |¡ |  | j¡ d S )N)	r!   r"   rŸ   r9   r~   Ú_prepare_rpcr«   r€   rl   )r#   r|   rš   r?   r›   rœ   r   rž   r@   rA   rB   )r$   r%   r&   r"   o  s    
zStreamStreamCall.__init__c             Ã   sH   y| j  | j| j¡I dH  W n& tjk
rB   |  ¡ s>|  ¡  Y nX dS )zµThis method prepares the RPC for receiving/sending messages.

        All other operations around the stream should only happen after the
        completion of this method.
        N)r:   Zinitiate_stream_streamr;   rƒ   rR   rS   rI   rJ   )r#   r%   r%   r&   r¬   }  s    zStreamStreamCall._prepare_rpc)r)   r-   r.   r/   rR   rf   r2   r   r   rY   r
   r0   r£   rX   r   r¤   r¥   r   r   rW   r"   r¬   r4   r%   r%   )r$   r&   rª   f  s   


rª   )5r/   rR   ÚenumÚ	functoolsr   r„   Úloggingr‹   Útypingr   r   r   r0   r   Zgrpc._cythonr   Ú r	   r;   r
   Z_typingr   r   r   r   r   r   r   Ú__all__rK   rG   r   r   ro   Z_OK_CALL_REPRESENTATIONr'   Ú	getLoggerr)   rˆ   ZRpcErrorr   ZAioRpcStatusr8   r   ÚIntEnumrZ   r_   rg   rw   r   r   r¨   rª   r%   r%   r%   r&   Ú<module>   sT   
Y
Y)Fx1)%