§
    !ß·iÛ"  ã                   óÜ   — d dl Z d dlZd dlmZ 	 d dlZd dlmZ n# e$ r dZdZY nw xY w	 d dlZd dl	m
Z
 n# e$ r dZdZ
Y nw xY wddlmZ  e j        d¦  «        Zd„ Z G d	„ d
e¦  «        ZdS )é    N)Úurlparse)Ú
RedisError)ÚValkeyErroré   )ÚPubSubManagerÚsocketioc                 óŽ  — t          | ¦  «        }|j        dvrt          d¦  «        ‚g }|j                             d¦  «        d                              d¦  «        D ]?}|                     dd¦  «        \  }}|                     |t          |¦  «        f¦  «         Œ@i }|j        r
|j        |d<   |j	        r
|j	        |d	<   d
}|j
        rx|j
                             d¦  «        }t          |¦  «        dk    r$|d         dk    rt          |d         ¦  «        |d<   t          |¦  «        dk    r|d         dk    r|d         }|||fS )z}Parse a Redis Sentinel URL with the format:
    redis+sentinel://[:password]@host1:port1,host2:port2,.../db/service_name
    ¾   úredis+sentinelúvalkey+sentinelzInvalid Redis Sentinel URLú@éÿÿÿÿÚ,ú:r   ÚusernameÚpasswordNú/é   Ú Údbé   )r   ÚschemeÚ
ValueErrorÚnetlocÚsplitÚrsplitÚappendÚintr   r   ÚpathÚlen)	ÚurlÚ
parsed_urlÚ	sentinelsÚ	host_portÚhostÚportÚkwargsÚservice_nameÚpartss	            ú[/home/mmwave/public_html/mmwave/venv/lib/python3.11/site-packages/socketio/redis_manager.pyÚparse_redis_sentinel_urlr+      sX  € õ ˜#‘”€JØÔÐ EÐEÐEÝÐ5Ñ6Ô6Ð6Ø€IØÔ&×,Ò,¨SÑ1Ô1°"Ô5×;Ò;¸CÑ@Ô@ð ,ð ,ˆ	Ø×%Ò% c¨1Ñ-Ô-‰
ˆˆdØ×Ò˜$¥ D¡	¤	Ð*Ñ+Ô+Ð+Ð+Ø€FØÔð 1Ø'Ô0ˆˆzÑØÔð 1Ø'Ô0ˆˆzÑØ€LØ„ð $Ø”×%Ò% cÑ*Ô*ˆÝˆu‰:Œ:˜Š?ˆ?˜u Qœx¨2š~˜~Ý˜u Qœx™=œ=ˆF�4‰LÝˆu‰:Œ:˜Š?ˆ?˜u Qœx¨2š~˜~Ø  œ8ˆLØ�l FÐ*Ð*ó    c                   óT   ‡ — e Zd ZdZdZ	 	 dˆ fd„	Zˆ fd„Zd	„ Zd
„ Zd„ Z	d„ Z
d„ Zˆ xZS )ÚRedisManagera6  Redis based client manager.

    This class implements a Redis backend for event sharing across multiple
    processes. Only kept here as one more example of how to build a custom
    backend, since the kombu backend is perfectly adequate to support a Redis
    message queue.

    To use a Redis backend, initialize the :class:`Server` instance as
    follows::

        url = 'redis://hostname:port/0'
        server = socketio.Server(client_manager=socketio.RedisManager(url))

    :param url: The connection URL for the Redis server. For a default Redis
                store running on the same host, use ``redis://``.  To use a
                TLS connection, use ``rediss://``. To use Redis Sentinel, use
                ``redis+sentinel://`` with a comma-separated list of hosts
                and the service name after the db in the URL path. Example:
                ``redis+sentinel://user:pw@host1:1234,host2:2345/0/myredis``.
    :param channel: The channel name on which the server sends and receives
                    notifications. Must be the same in all the servers.
    :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.
    :param redis_options: additional keyword arguments to be passed to
                          ``Redis.from_url()`` or ``Sentinel()``.
    Úredisúredis://localhost:6379/0r   FNc                 óœ   •— t          ¦   «                              ||||¬¦  «         || _        |pi | _        d| _        d | _        d | _        d S )N)ÚchannelÚ
write_onlyÚloggerÚjsonF)ÚsuperÚ__init__Ú	redis_urlÚredis_optionsÚ	connectedr/   Úpubsub)Úselfr!   r2   r3   r4   r5   r9   Ú	__class__s          €r*   r7   zRedisManager.__init__Z   sZ   ø€ å‰Œ×Ò °ZÈØ"ð 	ñ 	$ô 	$ð 	$àˆŒØ*Ð0¨bˆÔØˆŒØˆŒ
ØˆŒˆˆr,   c                 ó
  •— t          ¦   «                              ¦   «          d}| j        j        dk    rddlm}  |d¦  «        }nd| j        j        v rddlm}  |d¦  «        }|st          d| j        j        z   ¦  «        ‚d S )	NTÚeventletr   )Úis_monkey_patchedÚsocketÚgevent)Úis_module_patchedz<Redis requires a monkey patched socket library to work with )	r6   Ú
initializeÚserverÚ
async_modeÚeventlet.patcherr@   Úgevent.monkeyrC   ÚRuntimeError)r<   Úmonkey_patchedr@   rC   r=   s       €r*   rD   zRedisManager.initialized   sº   ø€ Ý‰Œ×ÒÑÔÐàˆØŒ;Ô! ZÒ/Ð/Ø:Ð:Ð:Ð:Ð:Ð:Ø.Ð.¨xÑ8Ô8ˆNˆNØ˜œÔ/Ð/Ð/Ø7Ð7Ð7Ð7Ð7Ð7Ø.Ð.¨xÑ8Ô8ˆNØð 	2ÝðØœ+Ô0ñ1ñ2ô 2ð 2ð	2ð 	2r,   c                 ó  — t          | j        ¦  «        }|j                             dd¦  «        d                              ¦   «         }|dv r+t
          �t          €t          d¦  «        ‚t
          t          fS |dv r+t          �t          €t          d¦  «        ‚t          t          fS |dk    rGt
          �t          €+t          �t          €t          d	¦  «        ‚t          t          fS t
          t          fS d
|› �}t          |¦  «        ‚)Nú+r   r   )r/   ÚredisszLRedis package is not installed (Run "pip install redis" in your virtualenv).)ÚvalkeyÚvalkeyszNValkey package is not installed (Run "pip install valkey" in your virtualenv).ÚunixzdRedis package is not installed (Run "pip install redis" or "pip install valkey" in your virtualenv).zUnsupported Redis URL scheme: )r   r8   r   r   Úlowerr/   r   rI   rN   r   r   )r<   r"   r   Ú	error_msgs       r*   Ú_get_redis_module_and_errorz(RedisManager._get_redis_module_and_errors   s  € Ý˜dœnÑ-Ô-ˆ
ØÔ"×(Ò(¨¨aÑ0Ô0°Ô3×9Ò9Ñ;Ô;ˆØÐ(Ð(Ð(Ýˆ}¥
Ð 2Ý"ð $:ñ ;ô ;ð ;õ �*Ð$Ð$ØÐ*Ð*Ð*Ýˆ~¥Ð!4Ý"ð $:ñ ;ô ;ð ;õ �;Ð&Ð&Ø�VÒÐÝˆ}¥
Ð 2Ý�>¥[Ð%8Ý&ð (>ñ ?ô ?ð ?õ
 "¥;Ð.Ð.å�jÐ(Ð(Ø=°VÐ=Ð=ˆ	Ý˜Ñ#Ô#Ð#r,   c                 óÒ  — |                       ¦   «         \  }}t          | j        ¦  «        }|j        dv rit	          | j        ¦  «        \  }}}| j        }|                     |¦  «          |j        j        |fi |¤Ž}| 	                    |p| j
        ¦  «        | _        n" |j        j        | j        fi | j        ¤Ž| _        | j                             d¬¦  «        | _        d| _        d S )Nr
   T)Úignore_subscribe_messages)rS   r   r8   r   r+   r9   ÚupdateÚsentinelÚSentinelÚ
master_forr2   r/   ÚRedisÚfrom_urlr;   r:   )	r<   ÚmoduleÚ_r"   r#   r(   Úconnection_kwargsr'   rW   s	            r*   Ú_redis_connectzRedisManager._redis_connect�   sø   € Ø×4Ò4Ñ6Ô6‰	ˆ�Ý˜dœnÑ-Ô-ˆ
ØÔÐ EÐEÐEå(¨¬Ñ8Ô8ñ 7ˆI�|Ð%6àÔ'ˆFØ�MŠMÐ+Ñ,Ô,Ð,Ø/�v”Ô/°	ÐDÐD¸VÐDÐDˆHØ!×,Ò,¨\Ð-I¸T¼\ÑJÔJˆDŒJˆJà.˜œÔ.¨t¬~ð Eð EØ15Ô1CðEð EˆDŒJà”j×'Ò'À$Ð'ÑGÔGˆŒØˆŒˆˆr,   c           	      ó   — |                       ¦   «         \  }}t          ddd¦  «        D ]Ô}	 | j        s|                      ¦   «          | j                             | j        | j                             |¦  «        ¦  «        c S # |$ ru}|dk    r3t           
                    ddt          |¦  «        i¬¦  «         d| _        n2t           
                    ddt          |¦  «        i¬¦  «         Y d }~ d S Y d }~ŒÍd }~ww xY wd S )	Nr   r   r   z#Cannot publish to redis... retryingÚredis_exception©ÚextraFz$Cannot publish to redis... giving up)rS   Úranger:   r_   r/   Úpublishr2   r5   Údumpsr4   ÚerrorÚstr)r<   Údatar]   rg   Úretries_leftÚexcs         r*   Ú_publishzRedisManager._publish    s6  € Ø×3Ò3Ñ5Ô5‰ˆˆ5Ý! ! R¨Ñ,Ô,ð 	ð 	ˆLðØ”~ð *Ø×'Ò'Ñ)Ô)Ð)Ø”z×)Ò)¨$¬,¸¼	¿ºÈÑ8MÔ8MÑNÔNÐNÐNÐNøØð ð ð Ø !Ò#Ð#Ý—L’LØ=Ø0µ#°c±(´(Ð;ð !ñ ô ð ð &+�D”N�Nå—L’LØ>Ø0µ#°c±(´(Ð;ð !ñ ô ð ð �E�E�E�E�E�Eð #�N�N�N�Nøøøøðøøøð	ð 	s   ¬ABÂC;ÂA$C6Ã6C;c              #   ó¸  K  — |                       ¦   «         \  }}d}d}	 	 |s5|                      ¦   «          | j                             | j        ¦  «         d}| j                             ¦   «         E d {V —† nd# |$ r\}t                               d|› d�dt          |¦  «        i¬¦  «         d}t          j
        |¦  «         |dz  }|d	k    rd	}Y d }~nd }~ww xY wŒ½)
Nr   FTz)Cannot receive from redis... retrying in z secsra   rb   r   é<   )rS   r_   r;   Ú	subscriber2   Úlistenr4   rg   rh   ÚtimeÚsleep)r<   r]   rg   Úretry_sleepÚ
subscribedrk   s         r*   Ú_redis_listen_with_retriesz'RedisManager._redis_listen_with_retriesµ   s,  è è € Ø×3Ò3Ñ5Ô5‰ˆˆ5ØˆØˆ
ð	%ð%Ø!ð $Ø×'Ò'Ñ)Ô)Ð)Ø”K×)Ò)¨$¬,Ñ7Ô7Ð7Ø"#�KØœ;×-Ò-Ñ/Ô/Ð/Ð/Ð/Ð/Ð/Ð/Ð/Ð/øØð %ð %ð %Ý—’ð ?Ø,7ð?ð ?ð ?à$5µs¸3±x´xÐ#@ð ñ Bô Bð Bð #�
Ý”
˜;Ñ'Ô'Ð'Ø˜qÑ �Ø Ò#Ð#Ø"$�Køøøøøøøøøð%øøøð	%s    AA7 Á7CÁ<ACÃCc              #   óö   K  — | j                              d¦  «        }|                      ¦   «         D ](}|d         |k    r|d         dk    rd|v r
|d         V — Œ)| j                             | j         ¦  «         d S )Nzutf-8r2   ÚtypeÚmessageri   )r2   Úencoderu   r;   Úunsubscribe)r<   r2   rx   s      r*   Ú_listenzRedisManager._listenÊ   sŽ   è è € Ø”,×%Ò% gÑ.Ô.ˆØ×6Ò6Ñ8Ô8ð 	&ð 	&ˆGØ�yÔ! WÒ,Ð,Ø˜F”O yÒ0Ð0°V¸wÐ5FÐ5FØ˜f”oÐ%Ð%Ð%øØŒ×Ò ¤Ñ-Ô-Ð-Ð-Ð-r,   )r0   r   FNNN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__Únamer7   rD   rS   r_   rl   ru   r{   Ú__classcell__)r=   s   @r*   r.   r.   2   s¹   ø€ € € € € ð$ð $ðJ €Dà?IØIMðð ð ð ð ð ð2ð 2ð 2ð 2ð 2ð$ð $ð $ð:ð ð ð ð ð ð*%ð %ð %ð*.ð .ð .ð .ð .ð .ð .r,   r.   )Úloggingrq   Úurllib.parser   r/   Úredis.exceptionsr   ÚImportErrorrN   Úvalkey.exceptionsr   Úpubsub_managerr   Ú	getLoggerr4   r+   r.   © r,   r*   ú<module>rŠ      s4  ðØ €€€Ø €€€Ø !Ð !Ð !Ð !Ð !Ð !ðØ€L€L€LØ+Ð+Ð+Ð+Ð+Ð+Ð+øØð ð ð Ø€EØ€J€J€JðøøøðØ€M€M€MØ-Ð-Ð-Ð-Ð-Ð-Ð-øØð ð ð Ø€FØ€K€K€Kðøøøð *Ð )Ð )Ð )Ð )Ð )à	ˆÔ	˜:Ñ	&Ô	&€ð+ð +ð +ð4^.ð ^.ð ^.ð ^.ð ^.�=ñ ^.ô ^.ð ^.ð ^.ð ^.s   �
 ›	'¦'«
6 ¶	AÁA