
    wg                     F    d dl Z d dlmZ d dlmZ ddlmZ  G d de      Zy)    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                 .   K   | j                  ||      S wN)is_connected)selfsid	namespaces      [/home/mcse/projects/flask/flask-venv/lib/python3.12/site-packages/socketio/async_manager.pycan_disconnectzAsyncManager.can_disconnect
   s       i00   c           
        K   |xs |}|| j                   vryt        |t              rt        |      }n||g}ng }t        |t              s|g}g }	|s| j                  j                  t        j                  ||g|z         }
|
j                         }t        |t              s|g}|D cg c]&  }t        j                  t        j                  |      ( }}| j                  ||      D ]O  \  }}||vs|D ]@  }|	j                  t        j                  | j                  j!                  ||                   B Q n| j                  ||      D ]  \  }}||vs| j#                  ||      }| j                  j                  t        j                  ||g|z   |      }
|	j                  t        j                  | j                  j%                  ||
                    |	g k(  ryt        j&                  |	       d{    yc c}w 7 
w)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   data)r   r   id)rooms
isinstancetuplelistserverpacket_classr   EVENTencode
eio_packetPacketMESSAGE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peio_pktr   eio_sidr   s                    r   emitzAsyncManager.emit   s     zTDJJ&dE" :D6DD(D) zH ++**	$ + HC ZZ\Nnd3"0!1 .0 "((););Q? 0G 0 $ 5 5i F GWh&$ GW%8%8 KK88!D&F GGG !% 5 5i F AWh&..sH=B++22	$ 3 C LL!4!400#>"@ AA B;ll5!!!-0, 	"s,   B(H*+H H4A$HB!H:H;Hc                 ,   K   t         |   ||      S w)z`Register a client connection to a namespace.

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

        Note: this method is a coroutine.
        )basic_disconnect)r   r   r   r,   s       r   
disconnectzAsyncManager.disconnectI   s"     
 %t$$S)>v>>s   c                 4   K   | j                  ||||      S w)zKAdd a client to a room.

        Note: this method is a coroutine.
        )r2   )basic_enter_room)r   r   r   r(   r2   s        r   
enter_roomzAsyncManager.enter_roomP   s"     
 $$S)T7$KKs   c                 0   K   | j                  |||      S w)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_roomW   s     
 $$S)T::s   c                 .   K   | j                  ||      S w)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5r   c                 :  K   d}	 | j                   |   |   }| j                   |   |= |' || }t	        j
                  |      r	 | d{    yyy# t        $ r" | j                         j                  d       Y Tw xY w7 5# t        j                  $ r Y yw xY ww)zSInvoke an application callback.

        Note: this method is a coroutine.
        Nz$Unknown callback received, ignoring.)	callbacksKeyError_get_loggerwarningr!   iscoroutineCancelledError)r   r   r   r   r*   rets         r   trigger_callbackzAsyncManager.trigger_callbacke   s     
 	(~~c*2.H
 s#B'D/C""3'II (    	O&&'MN	O -- s]   BA ,BB 
B B B(A=:B<A==B B BBBB)NNNNr	   )__name__
__module____qualname____doc__r   r3   r6   r:   r=   r@   rC   rL   __classcell__)r7   s   @r   r   r      s:    51 FJ%)3"j3?L;6    r   )r!   engineior   r   socketiobase_managerr   r    rR   r   <module>rW      s     )  %p; prR   