
    Ki5                         d dl Z d dlZd dlZd dlmZ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e      Zy)    N)MappingSequence)AnySupportsFloat)estimate_serialized_size)override)AsyncKeyValue)BaseWrapper__compressed_data____compression_version__   __compression_algorithm__c                   V    e Zd ZdZ	 ddededdf fdZdeee	f   de
fdZdeee	f   deee	f   fd	Zdeee	f   dz  deee	f   dz  fd
Zedddededz  deee	f   dz  fd       Zedddee   dedz  deeee	f   dz     fd       Zedddededz  deeee	f   dz  edz  f   fd       Zedddee   dedz  deeeee	f   dz  edz  f      fd       Zeddddedeee	f   dedz  dedz  ddf
d       Zeddddee   deeee	f      dedz  dedz  ddf
d       Z x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                 >    || _         || _        t        |           y)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__s      v/home/jay/workspace/scripts/.codegraph-venv/lib/python3.12/site-packages/key_value/aio/wrappers/compression/wrapper.pyr   zCompressionWrapper.__init__#   s     )2)=!    valuec                 J    t         |v ryt        |      }|| j                  k\  S )z<Determine if a value should be compressed based on its size.F)r   )_COMPRESSED_DATA_KEYr   r   )r   r   	item_sizes      r   _should_compressz#CompressionWrapper._should_compress4   s,      5( 2>	D5555r   c                    | j                  |      s|S t        j                  |d      }|j                  d      }t	        j
                  |d      }t        j                  |      j                  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_strs         r   _compress_valuez"CompressionWrapper._compress_value>   s    $$U+L ::e
;__W-
  ==1E %%&67>>wG
 !*$&:&
 	
r   c                    |yt         |vr|S |t            }t        |t              s|S 	 t        j                  |      }t        j                  |      }|j                  d      }t        j                  |      S # t        $ r |cY S w xY w)z.Decompress a value from the compressed format.Nr$   )r   
isinstancestrr,   	b64decoder'   
decompressr.   r(   loads	Exception)r   r   r5   r4   r3   r2   s         r   _decompress_valuez$CompressionWrapper._decompress_valueS   s    =  u,L /0
*c*L	%//
; )9:J "((1H::h'' 	 L	s   AA: :BB)
collectionkeyr?   c                z   K   | j                   j                  ||       d {   }| j                  |      S 7 wN)r@   r?   )r   getr>   )r   r@   r?   r   s       r   rC   zCompressionWrapper.getq   s9     nn((SZ(HH%%e,, Is   !;9;keysc                   K   | j                   j                  ||       d {   }|D cg c]  }| j                  |       c}S 7 #c c}w wN)rD   r?   )r   get_manyr>   )r   rD   r?   valuesr   s        r   rG   zCompressionWrapper.get_manyv   sG     ~~..DZ.PP;AB%&&u-BB QBs    !AAAA	A	Ac                   K   | j                   j                  ||       d {   \  }}| j                  |      |fS 7 wrB   )r   ttlr>   )r   r@   r?   r   rJ   s        r   rJ   zCompressionWrapper.ttl{   sB     >>--#*-MM
s%%e,c11 Ns   !A >A c                   K   | j                   j                  ||       d {   }|D cg c]  \  }}| j                  |      |f c}}S 7 *c c}}w wrF   )r   ttl_manyr>   )r   rD   r?   resultsr   rJ   s         r   rL   zCompressionWrapper.ttl_many   sP     //Tj/QQGNO''.4OO ROs    !AA	AA
AA)r?   rJ   rJ   c                   K   | j                  t        |            }| j                  j                  ||||       d {   S 7 w)N)r@   r   r?   rJ   )r6   dictr   put)r   r@   r   r?   rJ   compressed_values         r   rP   zCompressionWrapper.put   sB     //U<^^''C7GT^dg'hhhhs   =AA ArH   c                   K   |D cg c]  }| j                  t        |             }}| j                  j                  ||||       d {   S c c}w 7 	w)N)rD   rH   r?   rJ   )r6   rO   r   put_many)r   rD   rH   r?   rJ   r   compressed_valuess          r   rS   zCompressionWrapper.put_many   sZ      MSS5T11$u+>SS^^,,$?P]gmp,qqq Tqs   A!A$AA
A)i   )__name__
__module____qualname____doc__r	   intr   rO   r9   r   boolr   r6   r>   r   rC   r   listrG   tuplefloatrJ   rL   r   r   rP   rS   __classcell__)r   s   @r   r   r      s   " %)  " 
	"6d38n 6 6
T#s(^ 
S#X 
*tCH~'< c3hRVAV < >B -S -t -tCQTH~X\G\ - - NR C8C= Ct CW[\`adfiai\jmq\qWr C C >B 2S 2t 2uTRUWZRZ^^bMbdilpdpMpGq 2 2 NR P8C= Pt PW[\abfgjlogobpswbwy~  BF  zF  cF  ]G  XH P P X\z~ iS ic): i3QU: icpswcw i  DH i i  "&$(	rsm	r c*+	r
 $J	r T!	r 
	r 	rr   r   )r,   r'   r(   collections.abcr   r   typingr   r   $key_value.shared.utils.managed_entryr   typing_extensionsr   !key_value.aio.protocols.key_valuer	   key_value.aio.wrappers.baser
   r   r/   r0   r1   r    r   r   <module>rf      sJ       - % I & ; 3 - 4  8 @r @rr   