
    㾙h                     |    d dl mZ d dlmZ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 eZdgZ G d de      Zy)	    )iscoroutine)AnyCallablecastDictOptionalTuple)DeferredensureDeferred)Failure)EventEmitter	PyeeErrorTwistedEventEmitterc            
       x     e Zd ZdZdeddf fdZdededeedf   d	e	e
ef   ddf
d
Zdede
deddf fdZ x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:

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

    or:

    ```py
    @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.
    selfreturnNc                 *    t         t        |           y )N)superr   __init__)r   	__class__s    H/var/www/Befach/backend/env/lib/python3.12/site-packages/pyee/twisted.pyr   zTwistedEventEmitter.__init__5   s    !413    fargs.kwargsc                     d }	  ||i |}t        |      rt        |      }nt        |t              r|}n|sy dt        dd f fd}|j                  |       y # t        $ r  j                  dt	                      Y y w xY w)Nfailurer   c                 0    | rj                  d|        y y )Nr   )emit)r   r   s    r   errbackz.TwistedEventEmitter._emit_run.<locals>.errbackK   s    IIi1 r   )r   r   
isinstancer
   r   
addErrback	Exceptionr   )r   r   r   r   dresultr    s   `      r   	_emit_runzTwistedEventEmitter._emit_run8   s     &*	"''F 6""6*FH-2 2T 2 LL!  	,IIi+	,s   A #B ?B eventerrorc                    |dk(  rdt        |t              r	 |j                          y t        |t              r| j	                  d|       y | j	                  dt        d|              y t        t        t        t        |             j                  ||       y # t        $ r}| j	                  d|       Y d }~y d }~ww xY w)Nr   r(   zUnexpected failure object: )r!   r   raiseExceptionr#   r   r   r   r   r   r   _emit_handle_potential_error)r   r'   r(   excr   s       r   r+   z0TwistedEventEmitter._emit_handle_potential_errorQ   s    I%),((* E9-		'5)		'9/J5'-R#STe/67TTu ! ,IIgs++,s   B 	B?#B::B?)__name__
__module____qualname____doc__Selfr   r   r	   r   r   strr&   r+   __classcell__)r   s   @r   r   r      s    !F4t 4 4""" CHo" S#X	"
 
"24  C D  r   N)asyncior   typingr   r   r   r   r   r	   twisted.internet.deferr
   r   twisted.python.failurer   	pyee.baser   r   r1   __all__r    r   r   <module>r;      s6      = = ; * -
 !
!N, Nr   