o
    i                     @   s   d dl Z d dlZd dlZd dlmZ 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 dZd	Zd
ZdZG dd deZdS )    N)Sequence)AnySupportsFloat)ManagedEntry)override)AsyncKeyValue)BaseWrapper__compressed_data____compression_version__   __compression_algorithm__c                       s  e Zd ZdZ	d#dededdf fddZd	eee	f de
fd
dZd	eee	f deee	f fddZd	eee	f dB deee	f dB fddZedddededB deee	f dB fddZedddee dedB deeee	f dB  fddZedddededB deeee	f dB edB f fddZedddee dedB deeeee	f dB edB f  fddZedddded	eee	f dedB dedB ddf
ddZeddddee d eeee	f  dedB deedB  dB ddf
d!d"Z  ZS )$CompressionWrappera  Wrapper that compresses values before storing and decompresses on retrieval.

    This wrapper compresses the JSON-serialized value using the specified compression algorithm and stores it as a
    base64-encoded string within a special key in the dictionary. This allows compression
    while maintaining the dict[str, Any] interface.

    The compressed format looks like:
    {
        "__compressed_data__": "base64-encoded-compressed-data",
        "__compression_algorithm__": "gzip",
        "__compression_version__": 1
    }
       	key_valuemin_size_to_compressreturnNc                    s   || _ || _t   dS )zInitialize the compression wrapper.

        Args:
            key_value: The store to wrap.
            min_size_to_compress: Only compress values larger than this many bytes.
                                 Defaults to 1024 bytes (1KB).
        N)r   r   super__init__)selfr   r   	__class__ p/var/www/html/karishye-ai-python/venv/lib/python3.10/site-packages/key_value/aio/wrappers/compression/wrapper.pyr   #   s   zCompressionWrapper.__init__valuec                 C   s(   t |v rdS tt|d }|| jkS )z<Determine if a value should be compressed based on its size.F)r   )_COMPRESSED_DATA_KEYlenr   to_jsonr   )r   r   	item_sizer   r   r   _should_compress4   s   
z#CompressionWrapper._should_compressc                 C   sT   |  |s|S tj|dd}|d}tj|dd}t|d}t	|t
ttdiS )z,Compress a value into the compressed format.),:)
separatorsutf-8r   )compresslevelasciigzip)r   jsondumpsencoder%   compressbase64	b64encodedecoder   _COMPRESSION_VERSION_KEY_COMPRESSION_VERSION_COMPRESSION_ALGORITHM_KEY)r   r   json_str
json_bytescompressed_bytes
base64_strr   r   r   _compress_value>   s   

z"CompressionWrapper._compress_valuec                 C   sp   |du rdS t |vr|S |t  }t|ts|S zt|}t|}|d}t	|W S  t
y7   | Y S w )z.Decompress a value from the compressed format.Nr"   )r   
isinstancestrr*   	b64decoder%   
decompressr,   r&   loads	Exception)r   r   r3   r2   r1   r0   r   r   r   _decompress_valueS   s   



z$CompressionWrapper._decompress_value)
collectionkeyr<   c                   s"   | j j||dI d H }| |S N)r=   r<   )r   getr;   )r   r=   r<   r   r   r   r   r?   q   s   
zCompressionWrapper.getkeysc                   *    j j||dI d H } fdd|D S )Nr@   r<   c                       g | ]}  |qS r   r;   .0r   r   r   r   
<listcomp>y       z/CompressionWrapper.get_many.<locals>.<listcomp>)r   get_many)r   r@   r<   valuesr   rG   r   rJ   v      zCompressionWrapper.get_manyc                   s*   | j j||dI d H \}}| ||fS r>   )r   ttlr;   )r   r=   r<   r   rM   r   r   r   rM   {   s   zCompressionWrapper.ttlc                   rA   )NrB   c                    s   g | ]\}}  ||fqS r   rD   )rF   r   rM   rG   r   r   rH      s    z/CompressionWrapper.ttl_many.<locals>.<listcomp>)r   ttl_many)r   r@   r<   resultsr   rG   r   rN      rL   zCompressionWrapper.ttl_many)r<   rM   rM   c                   s&   |  |}| jj||||dI d H S )N)r=   r   r<   rM   )r4   r   put)r   r=   r   r<   rM   compressed_valuer   r   r   rP      s   
zCompressionWrapper.putrK   c                   s.    fdd|D } j j||||dI d H S )Nc                    rC   r   )r4   rE   rG   r   r   rH      rI   z/CompressionWrapper.put_many.<locals>.<listcomp>)r@   rK   r<   rM   )r   put_many)r   r@   rK   r<   rM   compressed_valuesr   rG   r   rR      s   	zCompressionWrapper.put_many)r   )__name__
__module____qualname____doc__r   intr   dictr6   r   boolr   r4   r;   r   r?   listrJ   tuplefloatrM   rN   r   rP   r   rR   __classcell__r   r   r   r   r      sJ    "
*.6:B8r   )r*   r%   r&   collections.abcr   typingr   r   $key_value.shared.utils.managed_entryr   typing_extensionsr   !key_value.aio.protocols.key_valuer   key_value.aio.wrappers.baser   r   r-   r.   r/   r   r   r   r   r   <module>   s    