o
    xi                     @  s   d dl m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mZ dd	lmZmZmZ eeZG d
d deej ZdS )    )annotationsN)	Awaitable)Callable)override)wandb_server_pb2)asyncio_manager   )HandleAbandonedErrorMailboxHandleServerResponseErrorc                      sj   e Zd ZdZd fd
dZdddZedddZdddZed ddZ	ed ddZ
d!ddZ  ZS )"MailboxResponseHandlez(A general handle for any ServerResponse.addressstrasyncerasyncio_manager.AsyncioManagercancel Callable[[str], Awaitable[None]]returnNonec                  s.   t  | || _|| _d| _d | _d | _d S )NF)super__init___address
_cancel_fn
_abandoned	_response_done_event)selfr   r   r   	__class__ U/home/ubuntu/.local/lib/python3.10/site-packages/wandb/sdk/mailbox/response_handle.pyr      s   
zMailboxResponseHandle.__init__responsespb.ServerResponsec                   sH   | j rd S | jrtd| j d|| _| jst | _| j  d S )Nz)A response has already been delivered to .)r   r   
ValueErrorr   r   asyncioEventset)r   r!   r   r   r    deliver(   s   
zMailboxResponseHandle.deliverc                   sL   d fdd}z     j| W d S  ty%   td j Y d S w )Nr   r   c                     s>   z   jI d H  W d S  ty   td j Y d S w )NzFailed to cancel request %r)r   r   	Exception_logger	exceptionr   r   r   r    impl:   s   z*MailboxResponseHandle.cancel.<locals>.implz'Failed to abandon and cancel request %rr   r   )abandonr   run_soonr)   r*   r+   r   r   r-   r   r,   r    r   7   s   
zMailboxResponseHandle.cancelc                   s   d fdd} j | dS )zIndicate the handle will not receive a response.

        This causes any code blocked on `wait_or` or `wait_async` to raise
        a `HandleAbandonedError` after a short time.
        r   r   c                     s&   d _  jst  _ j  d S )NT)r   r   r%   r&   r'   r   r,   r   r    r-   P   s
   
z+MailboxResponseHandle.abandon.<locals>.implNr.   )r   r0   r1   r   r,   r    r/   I   s   zMailboxResponseHandle.abandontimeoutfloat | Nonec                  s    j  fddS )Nc                     s    j dS )Nr2   )
wait_asyncr   r   r2   r   r    <lambda>[   s    z/MailboxResponseHandle.wait_or.<locals>.<lambda>)r   runr6   r   r6   r    wait_orY   s   zMailboxResponseHandle.wait_orc             
     s   |d urt |std| jst | _ztj| j |dI d H  W n7 tjtfyU } z!| 	  }r>|W  Y d }~S | j
rDt |   td| j |d }~w   |    | 	  }re|S | j
sjJ t )NzTimeout must be finite or None.r4   z"Timed out waiting for response on )mathisfiniter$   r   r%   r&   wait_forwaitTimeoutError_response_or_errorr   r	   r   r   )r   r2   er!   r   r   r    r5   ]   s4   


z MailboxResponseHandle.wait_asyncspb.ServerResponse | Nonec                 C  s*   | j sdS | j drt| j jj| j S )z7Returns self._response, raising on ServerErrorResponse.Nerror_response)r   HasFieldr   rB   messager,   r   r   r    r?   ~   s
   z(MailboxResponseHandle._response_or_error)r   r   r   r   r   r   r   r   )r!   r"   r   r   r.   )r2   r3   r   r"   )r   rA   )__name__
__module____qualname____doc__r   r(   r   r   r/   r9   r5   r?   __classcell__r   r   r   r    r      s    

 r   )
__future__r   r%   loggingr:   collections.abcr   typingr   typing_extensionsr   wandb.protor   spbwandb.sdk.libr   mailbox_handler	   r
   r   	getLoggerrE   r*   ServerResponser   r   r   r   r    <module>   s    
