o
    <‘ði9/  ã                   @   sB  d dl mZmZ d dlmZ d dlmZ d dlmZ d dl	m
Z
mZmZmZ d dlmZ G dd„ deƒZG d	d
„ d
eƒZedd�G dd„ dƒƒZG dd„ dƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd„ deƒZG dd „ d eƒZG d!d"„ d"eƒZG d#d$„ d$eƒZd%S )&é    )ÚABCÚabstractmethod)ÚOrderedDict)Ú	dataclass)ÚEnum)ÚAnyÚListÚOptionalÚUnion)Ú	CSCReasonc                   @   ó   e Zd ZdZdZdS )ÚCacheEntryStatusÚVALIDÚIN_PROGRESSN)Ú__name__Ú
__module__Ú__qualname__r   r   © r   r   úJ/root/parts/websockify/install/lib/python3.10/site-packages/redis/cache.pyr   
   ó    r   c                   @   r   )ÚEvictionPolicyTypeÚ
time_basedÚfrequency_basedN)r   r   r   r   r   r   r   r   r   r      r   r   T)Úfrozenc                   @   s.   e Zd ZU dZeed< eed< dZeed< dS )ÚCacheKeyaÙ  
    Represents a unique key for a cache entry.

    Attributes:
        command (str): The Redis command being cached.
        redis_keys (tuple): The Redis keys involved in the command.
        redis_args (tuple): Additional arguments for the Redis command.
            This field is included in the cache key to ensure uniqueness
            when commands have the same keys but different arguments.
            Changing this field will affect cache key uniqueness.
    ÚcommandÚ
redis_keysr   Ú
redis_argsN)r   r   r   Ú__doc__ÚstrÚ__annotations__Útupler   r   r   r   r   r      s
   
 r   c                   @   s2   e Zd Zdededefdd„Zdd„ Zdd	„ Zd
S )Ú
CacheEntryÚ	cache_keyÚcache_valueÚstatusc                 C   s   || _ || _|| _|| _d S ©N)r#   r$   r%   Úconnection_ref)Úselfr#   r$   r%   r'   r   r   r   Ú__init__(   s   
zCacheEntry.__init__c                 C   s   t | j| j| j| jfƒS r&   )Úhashr#   r$   r%   r'   ©r(   r   r   r   Ú__hash__4   s   ÿzCacheEntry.__hash__c                 C   s   t | ƒt |ƒkS r&   )r*   )r(   Úotherr   r   r   Ú__eq__9   s   zCacheEntry.__eq__N)	r   r   r   r   Úbytesr   r)   r,   r.   r   r   r   r   r"   '   s    þý
ür"   c                   @   s†   e Zd Zeedd„ ƒƒZejedd„ ƒƒZeedefdd„ƒƒZede	fdd„ƒZ
ed	edee	 fd
d„ƒZede	ddfdd„ƒZdS )ÚEvictionPolicyInterfacec                 C   ó   d S r&   r   r+   r   r   r   Úcache>   ó   zEvictionPolicyInterface.cachec                 C   r1   r&   r   )r(   Úvaluer   r   r   r2   C   r3   Úreturnc                 C   r1   r&   r   r+   r   r   r   ÚtypeH   r3   zEvictionPolicyInterface.typec                 C   r1   r&   r   r+   r   r   r   Ú
evict_nextM   ó   z"EvictionPolicyInterface.evict_nextÚcountc                 C   r1   r&   r   ©r(   r9   r   r   r   Ú
evict_manyQ   r8   z"EvictionPolicyInterface.evict_manyr#   Nc                 C   r1   r&   r   ©r(   r#   r   r   r   ÚtouchU   r8   zEvictionPolicyInterface.touch)r   r   r   Úpropertyr   r2   Úsetterr   r6   r   r7   Úintr   r;   r=   r   r   r   r   r0   =   s     r0   c                   @   sb   e Zd Zedd„ ƒZedefdd„ƒZedd„ ƒZededefd	d
„ƒZ	ede
defdd„ƒZdS )ÚCacheConfigurationInterfacec                 C   r1   r&   r   r+   r   r   r   Úget_cache_class[   r8   z+CacheConfigurationInterface.get_cache_classr5   c                 C   r1   r&   r   r+   r   r   r   Úget_max_size_   r8   z(CacheConfigurationInterface.get_max_sizec                 C   r1   r&   r   r+   r   r   r   Úget_eviction_policyc   r8   z/CacheConfigurationInterface.get_eviction_policyr9   c                 C   r1   r&   r   r:   r   r   r   Úis_exceeds_max_sizeg   r8   z/CacheConfigurationInterface.is_exceeds_max_sizer   c                 C   r1   r&   r   ©r(   r   r   r   r   Úis_allowed_to_cachek   r8   z/CacheConfigurationInterface.is_allowed_to_cacheN)r   r   r   r   rB   r@   rC   rD   ÚboolrE   r   rG   r   r   r   r   rA   Z   s    

rA   c                   @   sü   e Zd Zeedefdd„ƒƒZeedefdd„ƒƒZeede	fdd„ƒƒZ
eedefdd	„ƒƒZed
edeedf fdd„ƒZededefdd„ƒZedee dee fdd„ƒZedee dee fdd„ƒZedefdd„ƒZed
edefdd„ƒZdS )ÚCacheInterfacer5   c                 C   r1   r&   r   r+   r   r   r   Ú
collectionq   r3   zCacheInterface.collectionc                 C   r1   r&   r   r+   r   r   r   Úconfigv   r3   zCacheInterface.configc                 C   r1   r&   r   r+   r   r   r   Úeviction_policy{   r3   zCacheInterface.eviction_policyc                 C   r1   r&   r   r+   r   r   r   Úsize€   r3   zCacheInterface.sizeÚkeyNc                 C   r1   r&   r   ©r(   rN   r   r   r   Úget…   r8   zCacheInterface.getÚentryc                 C   r1   r&   r   ©r(   rQ   r   r   r   Úset‰   r8   zCacheInterface.setÚ
cache_keysc                 C   r1   r&   r   ©r(   rT   r   r   r   Údelete_by_cache_keys�   r8   z#CacheInterface.delete_by_cache_keysr   c                 C   r1   r&   r   ©r(   r   r   r   r   Údelete_by_redis_keys‘   r8   z#CacheInterface.delete_by_redis_keysc                 C   r1   r&   r   r+   r   r   r   Úflush•   r8   zCacheInterface.flushc                 C   r1   r&   r   rO   r   r   r   Úis_cachable™   r8   zCacheInterface.is_cachable)r   r   r   r>   r   r   rJ   rA   rK   r0   rL   r@   rM   r   r
   r"   rP   rH   rS   r   rV   r/   rX   rY   rZ   r   r   r   r   rI   p   s2    rI   c                   @   sò   e Zd Zdeddfdd„Zedefdd„ƒZedefdd	„ƒZede	fd
d„ƒZ
edefdd„ƒZdedefdd„Zdedeedf fdd„Zdee dee fdd„Zdeee ee f dee fdd„Zdefdd„Zdedefdd„ZdS )ÚDefaultCacheÚcache_configr5   Nc                 C   s*   t ƒ | _|| _| j ¡  ¡ | _| | j_d S r&   )r   Ú_cacheÚ_cache_configrD   r4   Ú_eviction_policyr2   ©r(   r\   r   r   r   r)   Ÿ   s   zDefaultCache.__init__c                 C   ó   | j S r&   ©r]   r+   r   r   r   rJ   ¨   ó   zDefaultCache.collectionc                 C   ra   r&   )r^   r+   r   r   r   rK   ¬   rc   zDefaultCache.configc                 C   ra   r&   ©r_   r+   r   r   r   rL   °   rc   zDefaultCache.eviction_policyc                 C   s
   t | jƒS r&   )Úlenr]   r+   r   r   r   rM   ´   ó   
zDefaultCache.sizerQ   c                 C   s.   |   |j¡sdS || j|j< | j |j¡ dS )NFT)rZ   r#   r]   r_   r=   rR   r   r   r   rS   ¸   s
   zDefaultCache.setrN   c                 C   s*   | j  |d ¡}|d u rd S | j |¡ |S r&   )r]   rP   r_   r=   )r(   rN   rQ   r   r   r   rP   Á   s
   zDefaultCache.getrT   c                 C   sB   g }|D ]}|   |¡d ur| j |¡ | d¡ q| d¡ q|S )NTF)rP   r]   ÚpopÚappend)r(   rT   ÚresponserN   r   r   r   rV   Ê   s   z!DefaultCache.delete_by_cache_keysr   c              	      s¶   g }g }|D ]G}|g}t |tƒr| | d¡¡ nt |tƒr2z
| | d¡¡ W n	 ty1   Y nw | jD ]‰ t‡ fdd„|D ƒƒrL| ˆ ¡ | d¡ q5q|D ]}| j 	|¡ qP|S )Nzutf-8c                 3   s   � | ]}|ˆ j v V  qd S r&   )r   )Ú.0Ú	candidate©r#   r   r   Ú	<genexpr>è   s   € z4DefaultCache.delete_by_redis_keys.<locals>.<genexpr>T)
Ú
isinstancer   rh   Úencoder/   ÚdecodeÚUnicodeDecodeErrorr]   Úanyrg   )r(   r   ri   Úkeys_to_deleteÚ	redis_keyÚ
candidatesrN   r   rl   r   rX   Ö   s*   

ÿ


€ýz!DefaultCache.delete_by_redis_keysc                 C   s   t | jƒ}| j ¡  |S r&   )re   r]   Úclear)r(   Ú
elem_countr   r   r   rY   ñ   s   

zDefaultCache.flushc                 C   s   | j  |j¡S r&   )r^   rG   r   rO   r   r   r   rZ   ö   s   zDefaultCache.is_cachable)r   r   r   rA   r)   r>   r   rJ   rK   r0   rL   r@   rM   r"   rH   rS   r   r
   rP   r   rV   r/   r   rX   rY   rZ   r   r   r   r   r[   ž   s0    þ
ý			ÿ
þr[   c                   @   sæ   e Zd ZdZdefdd„Zedefdd„ƒZede	fdd	„ƒZ
edefd
d„ƒZedefdd„ƒZdedeedf fdd„Zdedefdd„Zdee dee fdd„Zdee dee fdd„Zdefdd„Zdedefdd„ZdS )Ú
CacheProxyzY
    Proxy object that wraps cache implementations to enable additional logic on top
    r2   c                 C   ó
   || _ d S r&   rb   ©r(   r2   r   r   r   r)   ÿ   ó   
zCacheProxy.__init__r5   c                 C   ó   | j jS r&   )r]   rJ   r+   r   r   r   rJ     ó   zCacheProxy.collectionc                 C   r|   r&   )r]   rK   r+   r   r   r   rK     r}   zCacheProxy.configc                 C   r|   r&   )r]   rL   r+   r   r   r   rL   
  r}   zCacheProxy.eviction_policyc                 C   r|   r&   )r]   rM   r+   r   r   r   rM     r}   zCacheProxy.sizerN   Nc                 C   ó   | j  |¡S r&   )r]   rP   rO   r   r   r   rP     ó   zCacheProxy.getrQ   c                 C   sB   | j  |¡}| j | j¡rddlm} |dtjd� | j	 
¡  |S )Nr   )Úrecord_csc_evictioné   )r9   Úreason)r]   rS   rK   rE   rM   Úredis.observability.recorderr€   r   ÚFULLrL   r7   )r(   rQ   Úis_setr€   r   r   r   rS     s   þ
zCacheProxy.setrT   c                 C   r~   r&   )r]   rV   rU   r   r   r   rV   $  r   zCacheProxy.delete_by_cache_keysr   c                 C   r~   r&   )r]   rX   rW   r   r   r   rX   '  r   zCacheProxy.delete_by_redis_keysc                 C   s
   | j  ¡ S r&   )r]   rY   r+   r   r   r   rY   *  r{   zCacheProxy.flushc                 C   r~   r&   )r]   rZ   rO   r   r   r   rZ   -  r   zCacheProxy.is_cachable)r   r   r   r   rI   r)   r>   r   rJ   rA   rK   r0   rL   r@   rM   r   r
   r"   rP   rH   rS   r   rV   r/   rX   rY   rZ   r   r   r   r   rx   ú   s"    rx   c                   @   s„   e Zd Zdd„ Zedd„ ƒZejdefdd„ƒZedefdd	„ƒZ	de
fd
d„Zdedee
 fdd„Zde
ddfdd„Zdd„ ZdS )Ú	LRUPolicyc                 C   s
   d | _ d S r&   )r2   r+   r   r   r   r)   2  r{   zLRUPolicy.__init__c                 C   ra   r&   rb   r+   r   r   r   r2   5  rc   zLRUPolicy.cacher2   c                 C   ry   r&   rb   rz   r   r   r   r2   9  rf   r5   c                 C   s   t jS r&   )r   r   r+   r   r   r   r6   =  rc   zLRUPolicy.typec                 C   s    |   ¡  | jjjdd�}|d S )NF©Úlastr   )Ú_assert_cacher]   rJ   Úpopitem)r(   Úpopped_entryr   r   r   r7   A  s   zLRUPolicy.evict_nextr9   c                 C   sT   |   ¡  |t| jjƒkrtdƒ‚g }t|ƒD ]}| jjjdd�}| |d ¡ q|S )Nz#Evictions count is above cache sizeFr‡   r   )r‰   re   r]   rJ   Ú
ValueErrorÚrangerŠ   rh   )r(   r9   Úpopped_keysÚ_r‹   r   r   r   r;   F  s   zLRUPolicy.evict_manyr#   Nc                 C   s4   |   ¡  | jj |¡d u rtdƒ‚| jj |¡ d S )Nz(Given entry does not belong to the cache)r‰   r]   rJ   rP   rŒ   Úmove_to_endr<   r   r   r   r=   S  s   zLRUPolicy.touchc                 C   s"   | j d u st| j tƒstdƒ‚d S )Nz6Eviction policy should be associated with valid cache.)r2   rn   rI   rŒ   r+   r   r   r   r‰   [  s   ÿzLRUPolicy._assert_cache)r   r   r   r)   r>   r2   r?   rI   r   r6   r   r7   r@   r   r;   r=   r‰   r   r   r   r   r†   1  s    
r†   c                   @   s   e Zd ZeZdS )ÚEvictionPolicyN)r   r   r   r†   ÚLRUr   r   r   r   r‘   `  s    r‘   c                   @   sˆ   e Zd ZeZejZdZg d¢Z	eeefde
dedefdd„Zdd	„ Zd
e
fdd„Zd
efdd„Zde
d
efdd„Zded
efdd„ZdS )ÚCacheConfigi'  )JÚBITCOUNTÚBITFIELD_ROÚBITPOSÚEXISTSÚGEODISTÚGEOHASHÚGEOPOSÚGEORADIUSBYMEMBER_ROÚGEORADIUS_ROÚ	GEOSEARCHÚGETÚGETBITÚGETRANGEÚHEXISTSÚHGETÚHGETALLÚHKEYSÚHLENÚHMGETÚHSTRLENÚHVALSzJSON.ARRINDEXzJSON.ARRLENzJSON.GETz	JSON.MGETzJSON.OBJKEYSzJSON.OBJLENz	JSON.RESPzJSON.STRLENz	JSON.TYPEÚLCSÚLINDEXÚLLENÚLPOSÚLRANGEÚMGETÚSCARDÚSDIFFÚSINTERÚ
SINTERCARDÚ	SISMEMBERÚSMEMBERSÚ
SMISMEMBERÚSORT_ROÚSTRLENÚSUBSTRÚSUNIONzTS.GETzTS.INFOzTS.RANGEzTS.REVRANGEÚTYPEÚXLENÚXPENDINGÚXRANGEÚXREADÚ	XREVRANGEÚZCARDÚZCOUNTÚZDIFFÚZINTERÚ
ZINTERCARDÚ	ZLEXCOUNTÚZMSCOREÚZRANGEÚZRANGEBYLEXÚZRANGEBYSCOREÚZRANKÚ	ZREVRANGEÚZREVRANGEBYLEXÚZREVRANGEBYSCOREÚZREVRANKÚZSCOREÚZUNIONÚmax_sizeÚcache_classrL   c                 C   s   || _ || _|| _d S r&   )Ú_cache_classÚ	_max_sizer_   )r(   rÑ   rÒ   rL   r   r   r   r)   ¶  s   
zCacheConfig.__init__c                 C   ra   r&   )rÓ   r+   r   r   r   rB   À  ó   zCacheConfig.get_cache_classr5   c                 C   ra   r&   ©rÔ   r+   r   r   r   rC   Ã  rÕ   zCacheConfig.get_max_sizec                 C   ra   r&   rd   r+   r   r   r   rD   Æ  rÕ   zCacheConfig.get_eviction_policyr9   c                 C   s
   || j kS r&   rÖ   r:   r   r   r   rE   É  r{   zCacheConfig.is_exceeds_max_sizer   c                 C   s
   || j v S r&   )ÚDEFAULT_ALLOW_LISTrF   r   r   r   rG   Ì  r{   zCacheConfig.is_allowed_to_cacheN)r   r   r   r[   ÚDEFAULT_CACHE_CLASSr‘   r’   ÚDEFAULT_EVICTION_POLICYÚDEFAULT_MAX_SIZEr×   r@   r   r)   rB   rC   rD   rH   rE   r   rG   r   r   r   r   r“   d  s(    Oüþý
ü
r“   c                   @   s   e Zd Zedefdd„ƒZdS )ÚCacheFactoryInterfacer5   c                 C   r1   r&   r   r+   r   r   r   Ú	get_cacheÑ  r8   zCacheFactoryInterface.get_cacheN)r   r   r   r   rI   rÜ   r   r   r   r   rÛ   Ð  s    rÛ   c                   @   s.   e Zd Zddee fdd„Zdefdd„ZdS )	ÚCacheFactoryNr\   c                 C   s    || _ | j d u rtƒ | _ d S d S r&   )Ú_configr“   r`   r   r   r   r)   ×  s   
ÿzCacheFactory.__init__r5   c                 C   s   | j  ¡ }t|| j d�ƒS )N)r\   )rÞ   rB   rx   )r(   rÒ   r   r   r   rÜ   Ý  s   
zCacheFactory.get_cacher&   )r   r   r   r	   r“   r)   rI   rÜ   r   r   r   r   rÝ   Ö  s    rÝ   N)Úabcr   r   Úcollectionsr   Údataclassesr   Úenumr   Útypingr   r   r	   r
   Úredis.observability.attributesr   r   r   r   r"   r0   rA   rI   r[   rx   r†   r‘   r“   rÛ   rÝ   r   r   r   r   Ú<module>   s*    .\7/l