a
    a*j                     @  sp   d dl mZ d dlZd dlZd dlZd dlmZmZm	Z	 d dl
mZ d dlmZ er\d dlZG dd deZdS )    )annotationsN)TYPE_CHECKINGOptionalUnion)Storage)ConcurrentUpdateErrorc                      s   e Zd ZdZdgZdgZdZdZedfddd	dd
d fddZe	ddddZ
dddddZd&ddd	dddddZdddddZdddddZd	ddd Zd!dd"d#Zdd
dd$d%Z  ZS )'EtcdStoragezQ
    Rate limit storage with etcd as backend.

    Depends on :pypi:`aetcd`.
    z
async+etcdaetcdZlimits   FstrintboolNone)urimax_retrieswrap_exceptionsoptionsreturnc                   sR   t j|}| jd j| _| jjf |j|jd|| _	|| _
t j||d dS )a.  
        :param uri: etcd location of the form
         ``async+etcd://host:port``,
        :param max_retries: Maximum number of attempts to retry
         in the case of concurrent updates to a rate limit key
        :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:`aetcd.client.Client`
        :raise ConfigurationError: when :pypi:`aetcd` is not available
        r	   )hostport)r   N)urllibparseurlparsedependenciesmodulelibZClienthostnamer   storager   super__init__)selfr   r   r   r   parsed	__class__ S/var/www/html/assistant/venv/lib/python3.9/site-packages/limits/aio/storage/etcd.pyr      s    zEtcdStorage.__init__z3Union[type[Exception], tuple[type[Exception], ...]])r   c                 C  s   | j jS N)r   ZClientErrorr    r$   r$   r%   base_exceptions7   s    zEtcdStorage.base_exceptionsbytes)keyr   c                 C  s   | j  d|  S N/)PREFIXencoder    r*   r$   r$   r%   prefixed_key=   s    zEtcdStorage.prefixed_key   )r*   expiryelastic_expiryamountr   c                   s  d}|  |}|| jk rt }| j|I d H }|| }	| jj| jj|dkg| jjj|| d|	 	 |j
dg| jj|gdI d H }
|
d r|S |
d d d d }|jd\}}	t|	}	|	|krt| j|j| j|I d H  n|r| j|jI d H  || }	t|| }| jj| jj||jkg| jjj|| d|	 	 |jdgg dI d H d r||S |d7 }qt||d S )Nr      0:)lease)comparesuccessZfailurer1      :)r0   r   timer   r7   ZtransactionZtransactionscreateputr.   idgetvaluesplitfloatasyncioZgatherZrevoke_leasedeleteZrefresh_leaser   r   )r    r*   r2   r3   r4   retriesZetcd_keynowr7   
window_endZcreate_attemptcurZ	cur_valuenewr$   r$   r%   incr@   sX    
	


zEtcdStorage.incrc                   sH   | j | |I d H }|rD|jd\}}t|t krDt|S dS )Nr:   r   )r   r?   r0   r@   rA   rB   r;   r   )r    r*   rH   r4   r2   r$   r$   r%   r?   u   s    zEtcdStorage.getrB   c                   s<   | j | |I d H }|r4t|jdd }|S t S )Nr:   r1   )r   r?   r0   rB   r@   rA   r;   )r    r*   rH   rG   r$   r$   r%   
get_expiry}   s
    zEtcdStorage.get_expiryc                   s*   z| j  I d H  W dS    Y dS 0 d S )NTF)r   statusr'   r$   r$   r%   check   s
    zEtcdStorage.checkzOptional[int]c                   s    | j | j d I d H jS r+   )r   Zdelete_prefixr-   r.   Zdeletedr'   r$   r$   r%   reset   s    zEtcdStorage.resetc                   s   | j | |I d H  d S r&   )r   rD   r0   r/   r$   r$   r%   clear   s    zEtcdStorage.clear)Fr1   )__name__
__module____qualname____doc__ZSTORAGE_SCHEMEZDEPENDENCIESr-   ZMAX_RETRIESr   propertyr(   r0   rJ   r?   rK   rM   rN   rO   __classcell__r$   r$   r"   r%   r      s$    5r   )
__future__r   rC   r;   urllib.parser   typingr   r   r   Zlimits.aio.storage.baser   Zlimits.errorsr   r	   r   r$   r$   r$   r%   <module>   s   