
    i                     V    d dl Z d dlZd dlmZ d dlmZ ddlmZ  G d de          ZdS )    N)packet   )BaseManagerc                   T     e Zd ZdZd Z	 	 ddZ fdZd ZddZd Z	d	 Z
d
 Z xZS )AsyncManagerz+Manage a client list for an asyncio server.c                 2   K   |                      ||          S N)is_connected)selfsid	namespaces      A/usr/local/lib/python3.11/dist-packages/socketio/async_manager.pycan_disconnectzAsyncManager.can_disconnect   s        i000    Nc           
        K   |p|}|| j         vrdS t          |t                    rt          |          }n||g}ng }t          |t                    s|g}g }	|s| j                            t          j        ||g|z             }
|
                                }t          |t                    s|g}d |D             }| 	                    ||          D ]N\  }}||vrE|D ]B}|	
                    t          j        | j                            ||                               COn| 	                    ||          D ]\  }}||vr|                     ||          }| j                            t          j        ||g|z   |          }
|	
                    t          j        | j                            ||
                               |	g k    rdS t          j        |	           d{V  dS )zEmit a message to a single client, a room, or all the clients
        connected to the namespace.

        Note: this method is a coroutine.
        N)r   datac                 L    g | ]!}t          j        t           j        |          "S  )
eio_packetPacketMESSAGE).0ps     r   
<listcomp>z%AsyncManager.emit.<locals>.<listcomp>+   s8     0 0 0 "();Q?? 0 0 0r   )r   r   id)rooms
isinstancetuplelistserverpacket_classr   EVENTencodeget_participantsappendasynciocreate_task_send_eio_packet_generate_ack_id_send_packetwait)r   eventr   r   roomskip_sidcallbacktokwargstaskspktencoded_packeteio_pktr   eio_sidr   r   s                    r   emitzAsyncManager.emit   sm      zTDJ&&FdE"" 	 ::DD6DDD(D)) 	" zH 	A +**	$ + H HC ZZ\\Nnd33 2"0!10 0 .0 0 0G $ 5 5i F F G GWh&&$ G GW%8 K88!DD&F &F G G G GG !% 5 5i F F A AWh&&..sH==B+22	$ 3  C LL!400#>>"@ "@ A A AB;;Fl5!!!!!!!!!!!r   c                 L   K   t                                          ||          S )z`Register a client connection to a namespace.

        Note: this method is a coroutine.
        )superconnect)r   r6   r   	__class__s      r   r:   zAsyncManager.connectC   s!      
 www	222r   c                 $   K    | j         ||fi |S )zHDisconnect a client.

        Note: this method is a coroutine.
        )basic_disconnect)r   r   r   r1   s       r   
disconnectzAsyncManager.disconnectJ   s%      
 %t$S)>>v>>>r   c                 8   K   |                      ||||          S )zKAdd a client to a room.

        Note: this method is a coroutine.
        )r6   )basic_enter_room)r   r   r   r-   r6   s        r   
enter_roomzAsyncManager.enter_roomQ   s%      
 $$S)T7$KKKr   c                 4   K   |                      |||          S )zPRemove a client from a room.

        Note: this method is a coroutine.
        )basic_leave_room)r   r   r   r-   s       r   
leave_roomzAsyncManager.leave_roomX   s       
 $$S)T:::r   c                 2   K   |                      ||          S )zXRemove all participants from a room.

        Note: this method is a coroutine.
        )basic_close_room)r   r-   r   s      r   
close_roomzAsyncManager.close_room_   s      
 $$T9555r   c                 >  K   d}	 | j         |         |         }| j         |         |= n7# t          $ r* |                                                     d           Y nw xY w|: || }t	          j        |          r#	 | d{V  dS # t          j        $ r Y dS w xY wdS dS )zSInvoke an application callback.

        Note: this method is a coroutine.
        Nz$Unknown callback received, ignoring.)	callbacksKeyError_get_loggerwarninginspectiscoroutiner&   CancelledError)r   r   r   r   r/   rets         r   trigger_callbackzAsyncManager.trigger_callbackf   s      
 	(~c*2.H
 s#B''	  	O 	O 	O&&'MNNNNN	O
 (D/C"3'' IIIIIIIII-   DD   s!   ( 1AA;B BB)NNNNr	   )__name__
__module____qualname____doc__r   r7   r:   r>   rA   rD   rG   rQ   __classcell__)r;   s   @r   r   r   	   s        551 1 1 FJ%)3" 3" 3" 3"j3 3 3 3 3? ? ?L L L L; ; ;6 6 6      r   r   )	r&   rM   engineior   r   socketiobase_managerr   r   r   r   r   <module>rZ      s      ) ) ) ) ) )       % % % % % %p p p p p; p p p p pr   