§
    !ß·iÿ-  ã                   óV   — d dl Z d dlmZ d dlZddlmZ ddlmZ  G d„ de¦  «        ZdS )é    N)Úpartialé   )ÚManager)ÚPacketc                   óÆ   ‡ — e Zd ZdZdZ	 	 dˆ fd„	Zˆ fd„Z	 	 dˆ fd„	Zˆ fd	„Zdˆ fd
„	Z	dˆ fd„	Z
ˆ fd„Zdd„Zd„ Zd„ Zˆ fd„Zd„ Zd„ Zd„ Zˆ fd„Zˆ fd„Zˆ fd„Zd„ Zˆ xZS )ÚPubSubManagera¥  Manage a client list attached to a pub/sub backend.

    This is a base class that enables multiple servers to share the list of
    clients, with the servers communicating events through a pub/sub backend.
    The use of a pub/sub backend also allows any client connected to the
    backend to emit events addressed to Socket.IO clients.

    The actual backends must be implemented by subclasses, this class only
    provides a pub/sub generic framework.

    :param channel: The channel name on which the server sends and receives
                    notifications.
    :param write_only: If set to ``True``, only initialize to emit events. The
                       default of ``False`` initializes the class for emitting
                       and receiving. A write-only instance can be used
                       independently of the server to emit to clients from an
                       external process.
    :param logger: a custom logger to log it. If not given, the server logger
                   is used.
    :param json: An alternative JSON module to use for encoding and decoding
                 packets. Custom json modules must have ``dumps`` and ``loads``
                 functions that are compatible with the standard library
                 versions. This setting is only used when ``write_only`` is set
                 to ``True``. Otherwise the JSON module configured in the
                 server is used.
    ÚpubsubÚsocketioFNc                 óÂ   •— t          ¦   «                              ¦   «          || _        || _        t	          j        ¦   «         j        | _        || _        |�	|| _	        d S d S ©N)
ÚsuperÚ__init__ÚchannelÚ
write_onlyÚuuidÚuuid4ÚhexÚhost_idÚloggerÚjson)Úselfr   r   r   r   Ú	__class__s        €ú\/home/mmwave/public_html/mmwave/venv/lib/python3.11/site-packages/socketio/pubsub_manager.pyr   zPubSubManager.__init__&   sW   ø€ å‰Œ×ÒÑÔÐØˆŒØ$ˆŒÝ”z‘|”|Ô'ˆŒØˆŒØÐØˆDŒIˆIˆIð Ðó    c                 óü   •— t          ¦   «                              ¦   «          | j        s$| j                             | j        ¦  «        | _        |                      ¦   «                              | j	        dz   ¦  «         d S )Nz backend initialized.)
r   Ú
initializer   ÚserverÚstart_background_taskÚ_threadÚthreadÚ_get_loggerÚinfoÚname)r   r   s    €r   r   zPubSubManager.initialize0   sk   ø€ Ý‰Œ×ÒÑÔÐØŒð 	JØœ+×;Ò;¸D¼LÑIÔIˆDŒKØ×ÒÑÔ×Ò ¤	Ð,CÑ CÑDÔDÐDÐDÐDr   c           
      ó\  •— |p|}|                      d¦  «        r't          ¦   «                              ||||||¬¦  «        S |pd}|�C| j        €t	          d¦  «        ‚|€t          d¦  «        ‚|                      ||¦  «        }	|||	f}nd}t          |t          ¦  «        rt          |¦  «        }n|g}t          j        |¦  «        }
|
r&t          j        |¦  «        \  }}|gd„ |D ¦   «         ¢}d|||
||||| j        d	œ	}|                      |¦  «         |                      |¦  «         dS )
a/  Emit a message to a single client, a room, or all the clients
        connected to the namespace.

        This method takes care or propagating the message to all the servers
        that are connected through the message queue.

        The parameters are the same as in :meth:`.Server.emit`.
        Úignore_queue©Ú	namespaceÚroomÚskip_sidÚcallbackú/Nz:Callbacks can only be issued from the context of a server.z'Cannot use callback without a room set.c                 óZ   — g | ](}t          j        |¦  «                             ¦   «         ‘Œ)S © )Úbase64Ú	b64encodeÚdecode©Ú.0Úas     r   ú
<listcomp>z&PubSubManager.emit.<locals>.<listcomp>W   s/   € ÐNÐNÐN¸Q�FÔ,¨QÑ/Ô/×6Ò6Ñ8Ô8ÐNÐNÐNr   Úemit)	ÚmethodÚeventÚdataÚbinaryr'   r(   r)   r*   r   )Úgetr   r5   r   ÚRuntimeErrorÚ
ValueErrorÚ_generate_ack_idÚ
isinstanceÚtupleÚlistr   Údata_is_binaryÚdeconstruct_binaryr   Ú_handle_emitÚ_publish)r   r7   r8   r'   r(   r)   r*   ÚtoÚkwargsÚidr9   ÚattachmentsÚmessager   s                €r   r5   zPubSubManager.emit6   s~  ø€ ð ˆz�TˆØ�:Š:�nÑ%Ô%ð 	#Ý‘7”7—<’<Ø�t y°tÀhØ!ð  ñ #ô #ð #ð Ð$ ˆ	ØÐØŒ{Ð"Ý"ð $:ñ ;ô ;ð ;àˆ|Ý Ð!JÑKÔKÐKØ×&Ò& t¨XÑ6Ô6ˆBØ˜i¨Ð,ˆHˆHàˆHÝ�d�EÑ"Ô"ð 	Ý˜‘:”:ˆDˆDà�6ˆDÝÔ& tÑ,Ô,ˆØð 	PÝ &Ô 9¸$Ñ ?Ô ?ÑˆD�+ØÐOÐNÐNÀ+ÐNÑNÔNÐOˆDØ#¨e¸TØ#°)ÀTØ'°XØ"œlð,ð ,ˆð 	×Ò˜'Ñ"Ô"Ð"Ø�Š�gÑÔÐÐÐr   c                 óè   •— |                       ||¦  «        r"t          ¦   «                              ||¦  «        S d||pd| j        dœ}|                      |¦  «         |                      |¦  «         d S )NÚ
disconnectr+   ©r6   Úsidr'   r   )Úis_connectedr   Úcan_disconnectr   Ú_handle_disconnectrD   )r   rM   r'   rI   r   s       €r   rO   zPubSubManager.can_disconnect_   s‚   ø€ Ø×Ò˜S )Ñ,Ô,ð 	#å‘7”7×)Ò)¨#¨yÑ9Ô9Ð9ð ".°cØ$-Ð$4°ÀÄðOð OˆGà×#Ò# GÑ,Ô,Ð,Ø�MŠM˜'Ñ"Ô"Ð"Ð"Ð"r   c                 óè   •— |                      d¦  «        r#t          ¦   «                              ||¬¦  «        S d||pd| j        dœ}|                      |¦  «         |                      |¦  «         d S )Nr%   )r'   rK   r+   rL   )r:   r   rK   r   rP   rD   )r   rM   r'   rF   rI   r   s        €r   rK   zPubSubManager.disconnectj   s€   ø€ Ø�:Š:�nÑ%Ô%ð 	@Ý‘7”7×%Ò% c°YÐ%Ñ?Ô?Ð?Ø)°#Ø )Ð 0¨S¸T¼\ðKð Kˆà×Ò Ñ(Ô(Ð(Ø�Š�gÑÔÐÐÐr   c                 óÆ   •— |                       ||¦  «        r%t          ¦   «                              ||||¬¦  «        S d|||pd| j        dœ}|                      |¦  «         d S )N)Úeio_sidÚ
enter_roomr+   ©r6   rM   r(   r'   r   )rN   r   rT   r   rD   )r   rM   r'   r(   rS   rI   r   s         €r   rT   zPubSubManager.enter_roomr   su   ø€ Ø×Ò˜S )Ñ,Ô,ð 	#å‘7”7×%Ò% c¨9°dÀGÐ%ÑLÔLÐLà!-°cÀ4Ø$-Ð$4°ÀÄðOð OˆGà�MŠM˜'Ñ"Ô"Ð"Ð"Ð"r   c                 óÂ   •— |                       ||¦  «        r#t          ¦   «                              |||¦  «        S d|||pd| j        dœ}|                      |¦  «         d S )NÚ
leave_roomr+   rU   )rN   r   rW   r   rD   )r   rM   r'   r(   rI   r   s        €r   rW   zPubSubManager.leave_room{   sp   ø€ Ø×Ò˜S )Ñ,Ô,ð 	#å‘7”7×%Ò% c¨9°dÑ;Ô;Ð;à!-°cÀ4Ø$-Ð$4°ÀÄðOð OˆGà�MŠM˜'Ñ"Ô"Ð"Ð"Ð"r   c                 óv   — d||pd| j         dœ}|                      |¦  «         |                      |¦  «         d S )NÚ
close_roomr+   )r6   r(   r'   r   )r   Ú_handle_close_roomrD   )r   r(   r'   rI   s       r   rY   zPubSubManager.close_room„   sM   € Ø)°4Ø )Ð 0¨S¸T¼\ðKð Kˆà×Ò Ñ(Ô(Ð(Ø�Š�gÑÔÐÐÐr   c                 ó    — t          d¦  «        ‚)z¤Publish a message on the Socket.IO channel.

        This method needs to be implemented by the different subclasses that
        support pub/sub backends.
        ú.This method must be implemented in a subclass.©ÚNotImplementedError)r   r8   s     r   rD   zPubSubManager._publishŠ   s   € õ "ð #.ñ /ô /ð 	/r   c                 ó    — t          d¦  «        ‚)zãReturn the next message published on the Socket.IO channel,
        blocking until a message is available.

        This method needs to be implemented by the different subclasses that
        support pub/sub backends.
        r\   r]   )r   s    r   Ú_listenzPubSubManager._listen“   s   € õ "ð #.ñ /ô /ð 	/r   c           	      ó–  •— |                      d¦  «        }|                      d¦  «        }|�'t          |¦  «        dk    rt          | j        |g|¢R Ž }nd }|d         }|                      d¦  «        r/d„ |dd …         D ¦   «         }t	          j        |d         |¦  «        }t          |t          ¦  «        r+t          |¦  «        dk    r	|d         }nt          |¦  «        }t          ¦   «          
                    |d	         ||                      d
¦  «        |                      d¦  «        |                      d¦  «        |¬¦  «         d S )Nr*   r   é   r8   r9   c                 ó6   — g | ]}t          j        |¦  «        ‘ŒS r-   )r.   Ú	b64decoder1   s     r   r4   z.PubSubManager._handle_emit.<locals>.<listcomp>ª   s#   € ÐAÐAÐA°1�6Ô+¨AÑ.Ô.ÐAÐAÐAr   r   r   r7   r'   r(   r)   r&   )r:   Úlenr   Ú_return_callbackr   Úreconstruct_binaryr>   r@   r?   r   r5   )r   rI   Úremote_callbackÚremote_host_idr*   r8   rH   r   s          €r   rC   zPubSubManager._handle_emit�   sW  ø€ ð "Ÿ+š+ jÑ1Ô1ˆØ Ÿš YÑ/Ô/ˆØÐ&­3¨Ñ+?Ô+?À1Ò+DÐ+DÝ˜tÔ4°nð 1Ø /ð1ð 1ð 1ˆHˆHð ˆHØ�vŒˆØ�;Š;�xÑ Ô ð 	CØAÐA¸¸Q¸R¸R¼ÐAÑAÔAˆKÝÔ,¨T°!¬W°kÑBÔBˆDÝ�d�DÑ!Ô!ð 	#Ý�4‰yŒy˜AŠ~ˆ~Ø˜A”w��å˜T‘{”{�Ý‰Œ�Š�W˜WÔ% tØ&Ÿ{š{¨;Ñ7Ô7Ø!Ÿ+š+ fÑ-Ô-Ø%Ÿkšk¨*Ñ5Ô5Àð 	ñ 	Jô 	Jð 	Jð 	Jð 	Jr   c                 óÊ   — | j         |                     d¦  «        k    rD	 |d         }|d         }|d         }n# t          $ r Y d S w xY w|                      |||¦  «         d S d S )Nr   rM   rG   Úargs)r   r:   ÚKeyErrorÚtrigger_callback)r   rI   rM   rG   rk   s        r   Ú_handle_callbackzPubSubManager._handle_callback¶   s…   € ØŒ<˜7Ÿ;š; yÑ1Ô1Ò1Ð1ðØ˜e”n�Ø˜T”]�Ø˜v”��øÝð ð ð Ø��ðøøøà×!Ò! # r¨4Ñ0Ô0Ð0Ð0Ð0ð 2Ð1s    9 ¹
AÁAc           	      ó†   — || j         k    r|                      |||¦  «         d S |                      d|||||dœ¦  «         d S )Nr*   )r6   r   rM   r'   rG   rk   )r   rm   rD   )r   r   rM   r'   Úcallback_idrk   s         r   rf   zPubSubManager._return_callbackÀ   sg   € ð �d”lÒ"Ð"Ø×!Ò! # {°DÑ9Ô9Ð9Ð9Ð9à�MŠM Z¸GØ"%°IØ!,°dð<ð <ñ =ô =ð =ð =ð =r   c                 óŒ   — | j                              |                     d¦  «        |                     d¦  «        d¬¦  «         d S )NrM   r'   T)rM   r'   r%   )r   rK   r:   )r   rI   s     r   rP   z PubSubManager._handle_disconnectÊ   sK   € ØŒ×Ò 7§;¢;¨uÑ#5Ô#5Ø)0¯ª°[Ñ)AÔ)AØ,0ð 	ñ 	2ô 	2ð 	2ð 	2ð 	2r   c                 óø   •— |                      d¦  «        }|                      d¦  «        }|                      ||¦  «        r8t          ¦   «                              |||                      d¦  «        ¦  «         d S d S ©NrM   r'   r(   )r:   rN   r   rT   ©r   rI   rM   r'   r   s       €r   Ú_handle_enter_roomz PubSubManager._handle_enter_roomÏ   óx   ø€ Ø�kŠk˜%Ñ Ô ˆØ—K’K Ñ,Ô,ˆ	Ø×Ò˜S )Ñ,Ô,ð 	DÝ‰GŒG×Ò˜s I¨w¯{ª{¸6Ñ/BÔ/BÑCÔCÐCÐCÐCð	Dð 	Dr   c                 óø   •— |                      d¦  «        }|                      d¦  «        }|                      ||¦  «        r8t          ¦   «                              |||                      d¦  «        ¦  «         d S d S rs   )r:   rN   r   rW   rt   s       €r   Ú_handle_leave_roomz PubSubManager._handle_leave_roomÕ   rv   r   c                 óš   •— t          ¦   «                              |                     d¦  «        |                     d¦  «        ¬¦  «         d S )Nr(   r'   )r(   r'   )r   rY   r:   )r   rI   r   s     €r   rZ   z PubSubManager._handle_close_roomÛ   sK   ø€ Ý‰Œ×Ò §¢¨FÑ 3Ô 3Ø%,§[¢[°Ñ%=Ô%=ð 	ñ 	?ô 	?ð 	?ð 	?ð 	?r   c                 ó  — 	 	 |                       ¦   «         D �]¤}d }t          |t          ¦  «        r|}n#	 | j                             |¦  «        }n#  Y nxY w|�rad|v �r\|                      ¦   «                              d                     |d         ¦  «        ¦  «         	 |d         dk    r|                      |¦  «         nÇ| 	                    d¦  «        | j
        k    r©|d         dk    r|                      |¦  «         n‡|d         dk    r|                      |¦  «         ne|d         dk    r|                      |¦  «         nC|d         d	k    r|                      |¦  «         n!|d         d
k    r|                      |¦  «         �Œt# t           $ r# | j        j                             d¦  «         Y �Œ w xY w�Œ¦| j        j                             d¦  «         d S # t           $ r" | j        j                             d¦  «         Y nw xY w�Œ)NTr6   zpubsub message: {}r*   r   r5   rK   rT   rW   rY   z(Handler error in pubsub listening threadz#pubsub listen() exited unexpectedlyz+Unexpected Error in pubsub listening thread)r`   r>   Údictr   Úloadsr!   ÚdebugÚformatrn   r:   r   rC   rP   ru   rx   rZ   Ú	Exceptionr   r   Ú	exceptionÚerror)r   rI   r8   s      r   r   zPubSubManager._threadß   s‡  € ð#	Að"AØ#Ÿ|š|™~œ~ð Lñ L�GØ�DÝ! '­4Ñ0Ô0ð !Ø&˜˜ð!Ø#'¤9§?¢?°7Ñ#;Ô#;˜D˜Døð!Ø ˜DøøøØñ L ¨DÐ 0Ñ 0Ø×(Ò(Ñ*Ô*×0Ò0Ð1E×1LÒ1LØ  œNñ2,ô 2,ñ -ô -ð -ðLØ# Hœ~°Ò;Ð;Ø $× 5Ò 5°dÑ ;Ô ;Ð ;Ð ;Ø!%§¢¨)Ñ!4Ô!4¸¼Ò!DÐ!DØ#'¨¤>°VÒ#;Ð#;Ø$(×$5Ò$5°dÑ$;Ô$;Ð$;Ð$;Ø%)¨(¤^°|Ò%CÐ%CØ$(×$;Ò$;¸DÑ$AÔ$AÐ$AÐ$AØ%)¨(¤^°|Ò%CÐ%CØ$(×$;Ò$;¸DÑ$AÔ$AÐ$AÐ$AØ%)¨(¤^°|Ò%CÐ%CØ$(×$;Ò$;¸DÑ$AÔ$AÐ$AÐ$AØ%)¨(¤^°|Ò%CÐ%CØ$(×$;Ò$;¸DÑ$AÔ$AÐ$AùøÝ(ð Lð Lð LØ œKÔ.×8Ò8Ø JñLô Lð Lð Lñ LðLøøøùð ”Ô"×(Ò(Ð)NÑOÔOÐOØ�øÝð Að Að AØ”Ô"×,Ò,ð .@ñ Aô Að Að Að AðAøøøñC#	AsN   ƒ1G µAÁG ÁAÁAG Â C)FÆ	G Æ)F8Æ4G Æ7F8Æ8$G Ç)H
È	H
)r
   FNN)NNNNNr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r#   r   r   r5   rO   rK   rT   rW   rY   rD   r`   rC   rn   rf   rP   ru   rx   rZ   r   Ú__classcell__)r   s   @r   r   r   	   sñ  ø€ € € € € ðð ð4 €DàDHØðð ð ð ð ð ðEð Eð Eð Eð Eð EIØ#ð'ð 'ð 'ð 'ð 'ð 'ðR	#ð 	#ð 	#ð 	#ð 	#ðð ð ð ð ð ð#ð #ð #ð #ð #ð #ð#ð #ð #ð #ð #ðð ð ð ð/ð /ð /ð/ð /ð /ðJð Jð Jð Jð Jð21ð 1ð 1ð=ð =ð =ð2ð 2ð 2ð
Dð Dð Dð Dð DðDð Dð Dð Dð Dð?ð ?ð ?ð ?ð ?ð$Að $Að $Að $Að $Að $Að $Ar   r   )	r.   Ú	functoolsr   r   Úmanagerr   Úpacketr   r   r-   r   r   ú<module>rŠ      s•   ðØ €€€Ø Ð Ð Ð Ð Ð Ø €€€à Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ðzAð zAð zAð zAð zA�Gñ zAô zAð zAð zAð zAr   