o
    ;h                     @  sh   d dl mZ d dlZd dlmZ d dlmZ d dlmZm	Z	 ddl
mZ er*d dlZG dd	 d	eZdS )
    )annotationsN)ceil)
ModuleType)TYPE_CHECKINGIterable   )MemcachedBridgec                      s   e Zd Zd- fd	d
Zd.ddZd/ddZd0ddZd1ddZd2d3ddZ	 d4d5d$d%Z	d6d&d'Z
ed7d)d*Zd8d+d,Z  ZS )9EmcacheBridgeuristr
dependencyr   optionsfloat | str | boolreturnNonec                   s    t  j||fi | d | _d S N)super__init___storage)selfr
   r   r   	__class__ W/var/www/html/venv/lib/python3.10/site-packages/limits/aio/storage/memcached/emcache.pyr      s   
zEmcacheBridge.__init__emcache.Clientc                   sF    j s jj fdd jD fi  jI d H  _  j s J  j S )Nc                   s   g | ]\}} j ||qS r   )r   ZMemcachedHostAddress).0hpr   r   r   
<listcomp>   s    z-EmcacheBridge.get_storage.<locals>.<listcomp>)r   r   Zcreate_clienthostsr   r   r   r   r   get_storage   s   
zEmcacheBridge.get_storagekeyintc                   s4   |   I d H |dI d H }|rt|jpdS )Nutf-8r   )r!   getencoder#   value)r   r"   itemr   r   r   r%   "   s    zEmcacheBridge.getkeysIterable[str]dict[bytes, int]c                   s8   |   I d H dd |D I d H }dd | D S )Nc                 S  s   g | ]}| d qS )r$   )r&   )r   kr   r   r   r   (   s    z*EmcacheBridge.get_many.<locals>.<listcomp>c                 S  s$   i | ]\}}||rt |jnd qS )r   )r#   r'   )r   r,   r(   r   r   r   
<dictcomp>*   s   $ z*EmcacheBridge.get_many.<locals>.<dictcomp>)r!   get_manyitems)r   r)   resultsr   r   r   r.   &   s
   
zEmcacheBridge.get_manyc                   sB   z|   I d H |dI d H  W d S  | jjy    Y d S w Nr$   )r!   deleter&   r   NotFoundCommandError)r   r"   r   r   r   clear,   s   &zEmcacheBridge.clearr   Famountnoreplyboolc                   sX   |   I d H }|d}z|j|||dI d H pd}W |S  | jjy+   d}Y |S w )Nr$   )r6   r   )r!   r&   Z	decrementr   r3   )r   r"   r5   r6   storage	limit_keyr'   r   r   r   decr2   s   
zEmcacheBridge.decrTexpiryfloatset_expiration_keyc           	        s  |   I d H }|d}| | }z|||I d H p|W S  | jjy   |   I d H }z0|j||  t|dI d H  |rZ|j|t	|t

  dt|ddI d H  |}W | Y S  | jjy   |   I d H }|||I d H pz|}Y | Y S w w )Nr$   )exptimeF)r>   r6   )r!   r&   _expiration_key	incrementr   r3   addr   setr   timeZNotStoredStorageCommandError)	r   r"   r;   r5   r=   r8   r9   Z
expire_keyr'   r   r   r   incr;   s2   
 zEmcacheBridge.incrc                   sB   |   I d H }|| |dI d H }|rt|jp t S r1   )r!   r%   r?   r&   r<   r'   rC   )r   r"   r8   r(   r   r   r   
get_expiryU   s   zEmcacheBridge.get_expiry-type[Exception] | tuple[type[Exception], ...]c                 C  s   | j j| j jfS r   )r   ZClusterNoAvailableNodesCommandErrorr   r   r   r   base_exceptions\   s   zEmcacheBridge.base_exceptionsc                   s4   z|   I dH }|dI dH  W dS    Y dS )zq
        Check if storage is healthy by calling the ``get`` command
        on the key ``limiter-check``
        Ns   limiter-checkTF)r!   r%   )r   r8   r   r   r   checke   s   zEmcacheBridge.check)r
   r   r   r   r   r   r   r   )r   r   )r"   r   r   r#   )r)   r*   r   r+   )r"   r   r   r   )r   F)r"   r   r5   r#   r6   r7   r   r#   )r   T)
r"   r   r;   r<   r5   r#   r=   r7   r   r#   )r"   r   r   r<   )r   rF   )r   r7   )__name__
__module____qualname__r   r!   r%   r.   r4   r:   rD   rE   propertyrH   rI   __classcell__r   r   r   r   r	      s    
	
	



r	   )
__future__r   rC   mathr   typesr   Zlimits.typingr   r   Zbridger   Zemcacher	   r   r   r   r   <module>   s    