Ë
    ±Œj³  ã                  óš   — d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ er	  ed	d
¬«       G d„ de«      «       Zy)é    )Úannotations)ÚTYPE_CHECKING)Úversionchanged)ÚVersion)Úparse_storage_uri)ÚConfigurationError)ÚRedisStorage)ÚRedisClientz4.3zuAdded support for using the redis client from :pypi:`valkey` if :paramref:`uri` has the ``valkey+sentinel://`` schema)ÚversionÚreasonc                  óÊ   ‡ — e Zd ZdZddgZ	  ed«       ed«       ed«       ed«      dœZdddej                  d	f	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 dˆ fd
„Z	e
	 	 dd„«       Zddd„Zˆ xZS )ÚRedisSentinelStoragez¯
    Rate limit storage with redis sentinel as backend

    Depends on :pypi:`redis` package (or :pypi:`valkey` if :paramref:`uri` starts with
    ``valkey+sentinel://``)
    zredis+sentinelzvalkey+sentinelz3.0z6.0)Úrediszredis.sentinelÚvalkeyzvalkey.sentinelNTFc                óp  •— t        t        | �
  |fd|i|¤Ž t        |«      }g }	|r|j	                  «       ni }
i }|j                  d|j                  «      x}r||d<   |j                  d|j                  «      x}r||d<   |	j                  |j                  «       || _
        |j                  r|j                  j                  dd«      n|| _        | j                  €t        d«      ‚|j                  d«      rdnd	| _        | j"                  | j                   › d
�   j$                  } |j&                  |	fdi |¥|
¥ii |¥|¥¤Ž| _        | j(                  j+                  | j                  «      | _        | j(                  j/                  | j                  «      | _        || _        | j5                  |«       y)aÕ  
        :param uri: url of the form
         ``redis+sentinel://host:port,host:port/service_name``

         If the uri scheme is ``valkey+sentinel`` the implementation used will be from
         :pypi:`valkey`.
        :param service_name: sentinel service name
         (if not provided in :attr:`uri`)
        :param use_replicas: Whether to use replicas for read only operations
        :param sentinel_kwargs: kwargs to pass as
         :attr:`sentinel_kwargs` to :class:`redis.sentinel.Sentinel`
        :param key_prefix: the prefix for each key created in redis
        :param wrap_exceptions: Whether to wrap storage exceptions in
         :exc:`limits.errors.StorageError` before raising it.
        :param options: all remaining keyword arguments are passed
         directly to the constructor of :class:`redis.sentinel.Sentinel`
        :raise ConfigurationError: when the redis library is not available
         or if the redis master host cannot be pinged.
        Úwrap_exceptionsÚusernameÚpasswordÚ/Ú Nz'service_name' not providedr   r   z	.sentinelÚsentinel_kwargs)Úsuperr	   Ú__init__r   ÚcopyÚgetr   r   ÚextendÚ	locationsÚ
key_prefixÚpathÚreplaceÚservice_namer   Ú
startswithÚtarget_serverÚdependenciesÚmoduleÚSentinelÚsentinelÚ
master_forÚstorageÚ	slave_forÚstorage_slaveÚuse_replicasÚinitialize_storage)ÚselfÚurir!   r,   r   r   r   ÚoptionsÚstorage_uri_optionsÚsentinel_configurationÚsentinel_optionsÚparsed_authr   r   Úsentinel_depÚ	__class__s                  €úg/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/limits/storage/redis_sentinel.pyr   zRedisSentinelStorage.__init__*   sÌ  ø€ ô< 	Œl˜DÑ*Øñ	
Ø!0ð	
Ø4;ò	
ô 0°Ó4ÐØ!#ÐÙ5D˜?×/Ñ/Ô1È"Ðà57ˆà—{‘{ :Ð/B×/KÑ/KÓLÐLˆ8ÐLØ&.ˆK˜
Ñ#Ø—{‘{ :Ð/B×/KÑ/KÓLÐLˆ8ÐLØ&.ˆK˜
Ñ#à×%Ñ%Ð&9×&CÑ&CÔDØ$ˆŒð #×'Ò'ð  ×$Ñ$×,Ñ,¨S°"Ô5àð 	Ôð ×ÑÐ$Ü$Ð%BÓCÐCà),¯©¸Ô)A™XÀwˆÔØ×(Ñ(¨D×,>Ñ,>Ð+?¸yÐ)IÑJ×QÑQˆØ-˜×-Ñ-Ø"ñ
à?˜{Ð?Ð.>Ð?ð
ð )�Ð( Ð(ñ
ˆŒð
 %)§M¡M×$<Ñ$<¸T×=NÑ=NÓ$OˆŒØ*.¯-©-×*AÑ*AÀ$×BSÑBSÓ*TˆÔØ(ˆÔØ×Ñ Õ$ó    c                ó¬   — | j                   dk(  r#| j                  d   j                  j                  S | j                  d   j                  j                  S )Nr   r   )r#   r$   r%   Ú
RedisErrorÚValkeyError)r.   s    r7   Úbase_exceptionsz$RedisSentinelStorage.base_exceptionsn   sT   € ð ×!Ñ! WÒ,ð ×Ñ˜gÑ&×-Ñ-×8Ñ8ð	
ð ×"Ñ" 8Ñ,×3Ñ3×?Ñ?ð	
r8   c                óN   — |r| j                   r| j                  S | j                  S )N)r,   r+   r)   )r.   Úreadonlys     r7   Úget_connectionz#RedisSentinelStorage.get_connectionx   s!   € Ù&.°4×3DÒ3Dˆt×!Ñ!ÐWÈ4Ï<É<ÐWr8   )r/   Ústrr!   z
str | Noner,   Úboolr   z$dict[str, float | str | bool] | Noner   r@   r   rA   r0   zfloat | str | boolÚreturnÚNone)rB   z-type[Exception] | tuple[type[Exception], ...])F)r>   rA   rB   r
   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚSTORAGE_SCHEMEr   ÚDEPENDENCIESr	   ÚPREFIXr   Úpropertyr<   r?   Ú__classcell__)r6   s   @r7   r   r      sÙ   ø„ ñð 'Ð(9Ð:€NØQñ ˜“Ù! %›.Ù˜%“.Ù" 5›>ñ	€Lð $(Ø!Ø@DØ&×-Ñ-Ø %ðB%àðB%ð !ðB%ð ð	B%ð
 >ðB%ð ðB%ð ðB%ð &ðB%ð 
õB%ðH ð
à	6ò
ó ð
÷Xð Xr8   r   N)Ú
__future__r   Útypingr   Údeprecated.sphinxr   Úpackaging.versionr   Úlimits._storage_schemer   Úlimits.errorsr   Úlimits.storage.redisr	   Úlimits.typingr
   r   © r8   r7   Ú<module>rV      sR   ðÝ "å  å ,Ý %å 4Ý ,Ý -Ý %áØñ Øð	DôôaX˜<ó aXóñaXr8   