
    !niI                     `    d Z ddlZddlZddlmZ ddlmZ d Z G d dej                        Z	y)z?
Asyncio-based hub, originally implemented by Miguel Grinberg.
    N)hub)_unmonkey_patch_asyncio_allc                       y)z
    Indicate whether this hub is available, since some hubs are
    platform-specific.

    Python always has asyncio, so this is always ``True``.
    T r       U/home/homepc/tiktok-worker/venv/lib/python3.12/site-packages/eventlet/hubs/asyncio.pyis_availabler	      s     r   c                   V     e Zd ZdZ fdZ fdZd Z fdZ fdZ fdZ	d Z
 xZS )	Hubz?An Eventlet hub implementation on top of an asyncio event loop.c                    t         |           t                dd lj	                         | _        j                  | j
                         j                         | _        dd l	t        j                  d      r'd j                  j                  j                  _        y | j
                  ffd	}t        j                  |       y )Nr   on_forkc                       y Nr   r   r   r   <lambda>zHub.__init__.<locals>.<lambda>3   s    r   c                 <    j                   j                  |        y r   )events_set_running_loop)loopasyncios    r   re_register_loopz&Hub.__init__.<locals>.re_register_loop7   s    006r   )after_in_child)super__init__r   r   new_event_loopr   set_event_loopEventsleep_eventasyncio.eventshasattrr   __code__r   osregister_at_fork)selfr   r   	__class__s     @r   r   zHub.__init__!   s     	$% 	**,	tyy)"==?7>>9- 0<.E.EGNN""+ '+ii 7 /?@r   c                 X    t         |   |       | j                  j                          y)zX
        Register a ``Timer``.

        Typically not called directly by users.
        N)r   	add_timerr   set)r#   timerr$   s     r   r&   zHub.add_timer<   s$     	% r   c                     	  ||       | j                  j                          y# | j                   $ r   | j                  |t        j                                Y RxY w)zU
        Callback called by ``asyncio`` when a file descriptor has an event.
        N)SYSTEM_EXCEPTIONSsquelch_exceptionsysexc_infor   r'   )r#   cbfilenos      r   _file_cbzHub._file_cbE   sR    	;vJ
 		 %% 		;""63<<>:s	   % 5Ac                    	 t        j                  |       | j                  |   j                  |      du}t        |   |||||      }|se|t        j                  k(  r*| j                  j                  || j                  ||       |S | j                  j                  || j                  ||       |S # t        $ r t        d      w xY w)z
        Add a file descriptor of given event type to the ``Hub``.  See the
        superclass for details.

        Typically not called directly by users.
        zInvalid file descriptorN)r!   fstatOSError
ValueError	listenersgetr   addr   READr   
add_readerr0   
add_writer)	r#   evtyper/   r.   tbmark_as_closedalready_listeninglistenerr$   s	           r   r7   zHub.addQ   s    	8HHV !NN6266v>dJ7;vvr2~F !		$$VT]]BG  		$$VT]]BG  	8677	8s   B4 4C	c                 &   t         |   |       |j                  }|j                  }| j                  |   j                  |      sK|t        j                  k(  r| j                  j                  |       y| j                  j                  |       yy)z
        Remove a listener from the ``Hub``.  See the superclass for details.

        Typically not called directly by users.
        N)r   remover;   r/   r5   r6   r   r8   r   remove_readerremove_writer)r#   r?   r;   r/   r$   s       r   rA   z
Hub.removee   so     	x ~~f%))&1!		''/		''/	 2r   c                 J   | j                   t        j                     j                  |      }| j                   t        j                     j                  |      }t
        |   |       |r| j                  j                  |       |r| j                  j                  |       yy)zv
        Remove a file descriptor from the ``asyncio`` loop.

        Typically not called directly by users.
        N)
r5   r   r8   r6   WRITEr   remove_descriptorr   rB   rC   )r#   r/   	have_read
have_writer$   s       r   rF   zHub.remove_descriptort   s{     NN388,008	^^CII.226:
!&)II##F+II##F+ r   c                 \     ddl  fd} j                  j                   |              y)zL
        Start the ``Hub`` running. See the superclass for details.
        r   Nc                    K   j                   rt        d      	 d_         d_        j                  sPj                  rj	                          j                  rj                          j                  rj                          j                  j                                j                  rj                          j                          j                         } | j                         }n| j                         z
  }|dkD  rN	 j                  j                  j                         |       d {    j                  j#                          nj%                  d       d {    j                  sPd_        j(                  d d = j*                  d d = 	 d_         d_        y 7 {# j                   $ r Y w xY w7 ^# d_         d_        w xY ww)NzAlready running!TFr   )runningRuntimeErrorstoppingclosed	close_oneprepare_timersdebug_blockingblock_detect_prefire_timersclockblock_detect_postsleep_untildefault_sleepwait_forr   waitTimeoutErrorclearsleeptimers_canceledtimersnext_timers)wakeup_when
sleep_timer   r#   s     r   	async_runzHub.run.<locals>.async_run   s    ||"#566!&# %--++( ++ '')**--/$$TZZ\2**..0'')"&"2"2"4K"*%)%7%7%9
%04::<%?
!A~!")"2"243C3C3H3H3JJ"WWW ((..0%mmA.../ --2 ,-D(A((+$ % X&33 ! ! /  % %sl   G(AG  B2G -F>  F<F> /G 4G5G %G -G(<F> >GG GG G%%G()r   r   run_until_complete)r#   akwrb   r   s   `   @r   runzHub.run   s$     	$	&L 			$$Y[1r   )__name__
__module____qualname____doc__r   r&   r0   r7   rA   rF   rf   __classcell__)r$   s   @r   r   r      s*    IA6
(0,,2r   r   )
rj   r!   r,   eventlet.hubsr   eventlet.patcherr   r	   BaseHubr   r   r   r   <module>ro      s/    
 
  8P2#++ P2r   