Ë
    v¹1h  ã                   óp   — d dl mZmZmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZ d dlmZ eZdgZ G d„ de«      Zy)é    )ÚAbstractEventLoopÚensure_futureÚFutureÚiscoroutineÚwait)ÚAnyÚCallableÚcastÚDictÚOptionalÚSetÚTuple)ÚEventEmitterÚAsyncIOEventEmitterc            
       óÂ   ‡ — e Zd ZdZddedee   ddfˆ fd„Zdedede	d	e	de
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dfd„Zdeddfd„Zedede
fd„«       Zˆ xZS )r   a(  An event emitter class which can run asyncio coroutines in addition to
    synchronous blocking functions. For example:

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

    On emit, the event emitter  will automatically schedule the coroutine using
    `asyncio.ensure_future` and the configured event loop (defaults to
    `asyncio.get_event_loop()`).

    Unlike the case with the EventEmitter, all exceptions raised by
    event handlers are automatically emitted on the `error` event. This is
    important for asyncio coroutines specifically but is also handled for
    synchronous functions for consistency.

    When `loop` is specified, the supplied event loop will be used when
    scheduling work with `ensure_future`. Otherwise, the default asyncio
    event loop is used.

    For asyncio 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.
    NÚselfÚloopÚreturnc                 óV   •— t         t        | �  «        || _        t	        «       | _        y ©N)Úsuperr   Ú__init__Ú_loopÚsetÚ_waiting)r   r   Ú	__class__s     €úJ/var/www/skyplay_api_hub/venv/lib/python3.12/site-packages/pyee/asyncio.pyr   zAsyncIOEventEmitter.__init__)   s!   ø€ ÜÔ! 4Ñ1Ô3Ø26ˆŒ
Ü%(£Uˆ�ó    ÚeventÚargsÚkwargsc                 ó*   •— t        ‰| �  |g|¢­i |¤ŽS )a�  Emit `event`, passing `*args` and `**kwargs` to each attached
        function or coroutine. Returns `True` if any functions are attached to
        `event`; otherwise returns `False`.

        Example:

        ```py
        ee.emit('data', '00101001')
        ```

        Assuming `data` is an attached function, this will call
        `data('00101001')'`.

        When executing coroutine handlers, their respective futures will be
        stored in a "waiting" state. These futures may be waited on or
        canceled with `wait_for_complete` and `cancel`, respectively; and
        their status may be checked via the `complete` property.
        )r   Úemit)r   r   r    r!   r   s       €r   r#   zAsyncIOEventEmitter.emit.   s   ø€ ô0 ‰w‰|˜EÐ3 DÒ3¨FÑ3Ð3r   Úf.c                 óÎ  ‡ — 	  ||i |¤Ž}t        |«      rL‰ j                  r&t        t        t        |«      ‰ j                  ¬«      }n<t        t        t        |«      «      }n"t        |t        «      rt        t        |«      }ny dt        dd fˆ fd„}|j                  |«       ‰ j                  j                  |«       y # t        $ r}‰ j                  d|«       Y d }~y d }~ww xY w)N)r   r$   r   c                 ó¨   •— ‰j                   j                  | «       | j                  «       ry | j                  «       }|r‰j	                  d|«       y y )NÚerror)r   ÚdiscardÚ	cancelledÚ	exceptionr#   )r$   Úexcr   s     €r   Úcallbackz/AsyncIOEventEmitter._emit_run.<locals>.callbacka   sB   ø€ Ø—‘×%Ñ% aÔ(à—;‘;”=Øà/0¯{©{«}�ÙØ—I‘I˜g sÕ+ð r   r'   )r   r   r   r
   r   Ú
isinstancer   Úadd_done_callbackr   ÚaddÚ	Exceptionr#   )r   r$   r    r!   ÚcoroÚfutr,   r+   s   `       r   Ú	_emit_runzAsyncIOEventEmitter._emit_runH   sÀ   ø€ ð	#Ù˜4Ð* 6Ñ*ˆDô ˜4Ô Ø—:’:ô  -¬T´#°t«_À4Ç:Á:ÔN‘Cä'¬¬S°$«Ó8‘Cä˜D¤&Ô)Üœ3 “o‘àð,œFð , tõ ,ð ×!Ñ! (Ô+Ø�M‰M×Ñ˜cÕ"øô9 ò 	$Ø�I‰I�g˜s×#Ñ#ûð	$ús   ƒB? Â?	C$ÃCÃC$c              ƒ   ód   K  — | j                   rt        | j                   «      ƒ d{  –—†  yy7 Œ­w)a  Waits for all pending tasks to complete. For example:

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

        # Triggers execution of async_handler
        ee.emit('data', '00101001')

        await ee.wait_for_complete()

        # async_handler has completed execution
        ```

        This is useful if you're attempting a graceful shutdown of your
        application and want to ensure all coroutines have completed execution
        beforehand.
        N)r   r   ©r   s    r   Úwait_for_completez%AsyncIOEventEmitter.wait_for_completen   s)   è ø€ ð( �=Š=Ü�t—}‘}Ó%×%Ñ%ð Ø%ús   ‚%0§.¨0c                 ó¾   — | j                   D ]4  }|j                  «       rŒ|j                  «       rŒ%|j                  «        Œ6 | j                   j	                  «        y)aò  Cancel all pending tasks. For example:

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

        # Triggers execution of async_handler
        ee.emit('data', '00101001')

        ee.cancel()

        # async_handler execution has been canceled
        ```

        This is useful if you're attempting to shut down your application and
        attempts at a graceful shutdown via `wait_for_complete` have failed.
        N)r   Údoner)   ÚcancelÚclear)r   r2   s     r   r9   zAsyncIOEventEmitter.cancel…   sC   € ð& —=‘=ò 	ˆCØ—8‘8•: c§m¡m¥oØ—
‘
•ð	ð 	�‰×ÑÕr   c                 ó   — | j                    S )a  When true, there are no pending tasks, and execution is complete.
        For example:

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

        # Triggers execution of async_handler
        ee.emit('data', '00101001')

        # async_handler is still running, so this prints False
        print(ee.complete)

        await ee.wait_for_complete()

        # async_handler has completed execution, so this prints True
        print(ee.complete)
        ```
        )r   r5   s    r   ÚcompletezAsyncIOEventEmitter.complete�   s   € ð, —=‘=Ð Ð r   r   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚSelfr   r   r   Ústrr   Úboolr#   r	   r   r   r3   r6   r9   Úpropertyr<   Ú__classcell__)r   s   @r   r   r      sç   ø„ ññ6+�tð + 8Ð,=Ñ#>ð +È$õ +ð
4Øð4àð4ð ð4ð ð	4ð
 
õ4ð4$#Øð$#àð$#ð �C˜�H‰oð$#ð �S˜#�X‘ð	$#ð
 
ó$#ðL& dð &¨tó &ð.�Tð ˜dó ð0 ð!�tð ! ò !ó ô!r   N)Úasyncior   r   r   r   r   Útypingr   r	   r
   r   r   r   r   Ú	pyee.baser   rA   Ú__all__r   © r   r   ú<module>rK      s5   ð÷ PÕ Oß B× BÑ Bå "à
€à Ð
!€ôf!˜,õ f!r   