a
    ݌xd                     @   s   d dl mZmZmZmZmZ d dlmZmZ d dl	m
Z
 d dlmZmZ zd dlmZ W n eyn   dZY n0 dgZG dd deZdS )	    )AnyCallableDictOptionalTuple)DeferredensureDeferred)Failure)EventEmitterPyeeException)iscoroutineNTwistedEventEmitterc                       sZ   e Zd ZdZ fddZeeedf ee	ef ddddZ
e	edd	 fd
dZ  ZS )r   a  An event emitter class which can run twisted coroutines and handle
    returned Deferreds, in addition to synchronous blocking functions. For
    example::

        @ee.on('event')
        @inlineCallbacks
        def async_handler(*args, **kwargs):
            yield returns_a_deferred()

    or::

        @ee.on('event')
        async def async_handler(*args, **kwargs):
            await returns_a_deferred()


    When async handlers fail, Failures are first emitted on the ``failure``
    event. If there are no ``failure`` handlers, the Failure's associated
    exception is then emitted on the ``error`` event. If there are no ``error``
    handlers, the exception is raised. For consistency, when handlers raise
    errors synchronously, they're captured, wrapped in a Failure and treated
    as an async failure. This is unlike the behavior of EventEmitter,
    which have no special error handling.

    For twisted coroutine event handlers, calling emit is non-blocking.
    In other words, you do not have to await any results from emit, and the
    coroutine is scheduled in a fire-and-forget fashion.

    Similar behavior occurs for "sync" functions which return Deferreds.
    c                    s   t t|   d S )N)superr   __init__self	__class__ D/var/www/html/Ranjet/env/lib/python3.9/site-packages/pyee/twisted.pyr   3   s    zTwistedEventEmitter.__init__.N)fargskwargsreturnc                    s   d }z||i |}W n  t y6    dt  Y nN0 trNt|rNt|}nt|tr^|}n|sfd S td d fdd}|| d S )Nfailure)r   r   c                    s   | r  d|  d S )Nr   )emit)r   r   r   r   errbackI   s    z.TwistedEventEmitter._emit_run.<locals>.errback)	Exceptionr   r	   r   r   
isinstancer   Z
addErrback)r   r   r   r   dresultr   r   r   r   	_emit_run6   s    

zTwistedEventEmitter._emit_run)eventerrorr   c              
      s   |dkrt |trRz|  W q tyN } z| d| W Y d }~qd }~0 0 qt |trj| d| q| dtd|  ntt| || d S )Nr   r#   zUnexpected failure object: )	r   r	   ZraiseExceptionr   r   r   r   r   _emit_handle_potential_error)r   r"   r#   excr   r   r   r$   O   s    
$

z0TwistedEventEmitter._emit_handle_potential_error)__name__
__module____qualname____doc__r   r   r   r   r   strr!   r$   __classcell__r   r   r   r   r      s   

)typingr   r   r   r   r   Ztwisted.internet.deferr   r   Ztwisted.python.failurer	   Z	pyee.baser
   r   asyncior   ImportError__all__r   r   r   r   r   <module>   s   
