Ë
    ÿ\jË  ã                   óÆ   — d dl mZ d dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZ d dlZd dlmZ d d	lmZ d dlZd d
lmZmZmZ  G d„ de«      Z G d„ d«      Zdedefd„Zy)é    )ÚBigSegmentsConfig)ÚBigSegmentsStatus)Ú	Listeners)ÚRepeatingTask)Úlog)ÚBigSegmentStoreStatusÚBigSegmentStoreStatusProviderN)ÚExpiringDict)Úsha256)ÚCallableÚOptionalÚTuplec                   ó€   — e Zd ZdZdeg ef   fd„Zedefd„«       Zdeegdf   ddfd„Z	deegdf   ddfd	„Z
d
efd„Zy)Ú!BigSegmentStoreStatusProviderImplaL  
    Default implementation of the BigSegmentStoreStatusProvider interface.
    
    The real implementation of getting the status is in BigSegmentStoreManager - we pass in a lambda that
    allows us to get the current status from that class. So this class provides a facade for that, and
    also adds the listener mechanism.
    Ústatus_getterc                 ó>   — || _         t        «       | _        d | _        y ©N)Ú1_BigSegmentStoreStatusProviderImpl__status_getterr   Ú4_BigSegmentStoreStatusProviderImpl__status_listenersÚ/_BigSegmentStoreStatusProviderImpl__last_status)Úselfr   s     úD/root/env/lib/python3.12/site-packages/ldclient/impl/big_segments.pyÚ__init__z*BigSegmentStoreStatusProviderImpl.__init__   s   € Ø,ˆÔÜ"+£+ˆÔØ!ˆÕó    Úreturnc                 ó"   — | j                  «       S r   )r   ©r   s    r   Ústatusz(BigSegmentStoreStatusProviderImpl.status   s   € à×#Ñ#Ó%Ð%r   ÚlistenerNc                 ó:   — | j                   j                  |«       y r   )r   Úadd©r   r   s     r   Úadd_listenerz.BigSegmentStoreStatusProviderImpl.add_listener    s   € Ø×Ñ×#Ñ# HÕ-r   c                 ó:   — | j                   j                  |«       y r   )r   Úremover"   s     r   Úremove_listenerz1BigSegmentStoreStatusProviderImpl.remove_listener#   s   € Ø×Ñ×&Ñ& xÕ0r   Ú
new_statusc                 óÚ   — | j                   }|€|| _         y |j                  |j                  k7  s|j                  |j                  k7  r#|| _         | j                  j	                  |«       y y r   )r   Ú	availableÚstaler   Únotify)r   r'   Úlasts      r   Ú_update_statusz0BigSegmentStoreStatusProviderImpl._update_status&   s_   € Ø×!Ñ!ˆØˆ<Ø!+ˆDÕØ×!Ñ! T§^¡^Ò3°z×7GÑ7GÈ4Ï:É:Ò7UØ!+ˆDÔØ×#Ñ#×*Ñ*¨:Õ6ð 8Vr   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   Úpropertyr   r#   r&   r-   © r   r   r   r      s‹   „ ñð" h¨rÐ3HÐ/HÑ&Ió "ð
 ð&Ð-ò &ó ð&ð. XÐ/DÐ.EÀtÐ.KÑ%Lð .ÐQUó .ð1¨Ð2GÐ1HÈ$Ð1NÑ(Oð 1ÐTXó 1ð7Ð)>ô 7r   r   c                   ó~   — e Zd Zi Z	 defd„Zd„ Zedefd„«       Z	de
deee   e
f   fd„Zdefd„Zdefd	„Zdefd
„Zy)ÚBigSegmentStoreManagerÚconfigc                 ó„  — |j                   | _        |j                  dz  | _        t	        | j
                  «      | _        d | _        d | _        | j                  rgt        |j                  |j                  ¬«      | _        t        |j                  d| j                  «      | _        | j                  j!                  «        y y )Néè  )Úmax_lenÚmax_age_secondsr   )ÚstoreÚ_BigSegmentStoreManager__storeÚstale_afterÚ+_BigSegmentStoreManager__stale_after_millisr   Ú
get_statusÚ(_BigSegmentStoreManager__status_providerÚ$_BigSegmentStoreManager__last_statusÚ"_BigSegmentStoreManager__poll_taskr
   Úcontext_cache_sizeÚcontext_cache_timeÚ_BigSegmentStoreManager__cacher   Ústatus_poll_intervalÚpoll_store_and_update_statusÚstart)r   r6   s     r   r   zBigSegmentStoreManager.__init__7   s—   € Ø—|‘|ˆŒà$*×$6Ñ$6¸Ñ$=ˆÔ!Ü!BÀ4Ç?Á?Ó!SˆÔØ!ˆÔØˆÔà<Š<Ü'°&×2KÑ2KÐ]c×]vÑ]vÔwˆDŒLÜ,¨V×-HÑ-HÈ!ÈT×MnÑMnÓoˆDÔØ×Ñ×"Ñ"Õ$ð r   c                 óž   — | j                   r| j                   j                  «        | j                  r| j                  j                  «        y y r   )rB   Ústopr<   r   s    r   rJ   zBigSegmentStoreManager.stopD   s9   € Ø×ÒØ×Ñ×!Ñ!Ô#Ø<Š<ØL‰L×ÑÕð r   r   c                 ó   — | j                   S r   )r@   r   s    r   Ústatus_providerz&BigSegmentStoreManager.status_providerJ   s   € à×%Ñ%Ð%r   Úuser_keyc                 óV  — | j                   sd t        j                  fS | j                  j	                  |«      }|€Dt        |«      }	 | j                   j                  |«      }|€| j                  }|| j                  |<   | j                  }|s| j                  «       }|j                  s|t        j                  fS ||j                  rt        j                   fS t        j"                  fS # t        $ r4}t        j                  d|z  «       d t        j                  fcY d }~S d }~ww xY w)Nz5Big Segment store membership query returned error: %s)r<   r   ÚNOT_CONFIGUREDrE   ÚgetÚ_hash_for_user_keyÚget_membershipÚEMPTY_MEMBERSHIPÚ	Exceptionr   Ú	exceptionÚSTORE_ERRORrA   rG   r)   r*   ÚSTALEÚHEALTHY)r   rM   Ú
membershipÚ	user_hashÚer   s         r   Úget_user_membershipz*BigSegmentStoreManager.get_user_membershipN   s  € Ø|Š|ØÔ+×:Ñ:Ð;Ð;Ø—\‘\×%Ñ% hÓ/ˆ
ØÐÜ*¨8Ó4ˆIð=Ø!Ÿ\™\×8Ñ8¸ÓC
ØÐ%Ø!%×!6Ñ!6JØ)3—‘˜XÑ&ð ×#Ñ#ˆÙØ×6Ñ6Ó8ˆFØ×ÒØÔ 1× =Ñ =Ð>Ð>Ø°v·|²|Ô-×3Ñ3ÐcÐcÔIZ×IbÑIbÐcÐcøô ò =Ü—‘ÐUÐXYÑYÔZØÔ/×;Ñ;Ð<Õ<ûð=ús   Á8C+ Ã+	D(Ã4)D#ÄD(Ä#D(c                 óB   — | j                   }|r|S | j                  «       S r   )rA   rG   )r   r   s     r   r?   z!BigSegmentStoreManager.get_statusc   s#   € Ø×#Ñ#ˆÙˆvÐH T×%FÑ%FÓ%HÐHr   c                 ób  — t        dd«      }| j                  rF	 | j                  j                  «       }t        d|d u xs | j                  |j                  «      «      }|| _        | j                  j                  |«       |S # t
        $ r"}t        j                  d|z  «       Y d }~ŒJd }~ww xY w)NFTz1Big Segment store status query returned error: %s)r   r<   Úget_metadataÚis_staleÚlast_up_to_daterT   r   rU   rA   r@   r-   )r   r'   Úmetadatar[   s       r   rG   z3BigSegmentStoreManager.poll_store_and_update_statusg   s¡   € Ü*¨5°%Ó8ˆ
Ø<Š<ðWØŸ<™<×4Ñ4Ó6Ü2°4¸(ÀdÐ:JÒ9vÈtÏ}É}Ð]e×]uÑ]uÓOvÓw
ð (ˆÔØ×Ñ×-Ñ-¨jÔ9ØÐøô	 ò WÜ—‘ÐQÐTUÑU×VÑVûðWús   šAB Â	B.ÂB)Â)B.c                 ón   — |d u xs0 t        t        j                  «       dz  «      |z
  | j                  k\  S )Nr8   )ÚintÚtimer>   )r   Ú	timestamps     r   r`   zBigSegmentStoreManager.is_stales   s3   € Ø˜TÐ!Òj¬¬D¯I©I«K¸$Ñ,>Ó(?À)Ñ(KÐPT×PiÑPiÑ'iÐjr   N)r.   r/   r0   rS   r   r   rJ   r2   r	   rL   Ústrr   r   Údictr\   r   r?   rG   Úboolr`   r3   r   r   r5   r5   .   s‹   „ ð Ððð%Ð0ó %ò ð ð&Ð!>ò &ó ð&ðd¨Cð d°E¸(À4¹.È#Ð:MÑ4Nó dð*IÐ1ó Ið
Ð.Có 
ðk Tô kr   r5   rM   r   c                 ó–   — t        j                  t        | j                  d«      «      j	                  «       «      j                  d«      S )Nzutf-8)Úbase64Ú	b64encoder   ÚencodeÚdigestÚdecode)rM   s    r   rQ   rQ   v   s5   € Ü×ÑœF 8§?¡?°7Ó#;Ó<×CÑCÓEÓF×MÑMÈgÓVÐVr   )Úldclient.configr   Úldclient.evaluationr   Úldclient.impl.listenersr   Úldclient.impl.repeating_taskr   Úldclient.impl.utilr   Úldclient.interfacesr   r	   rk   Úexpiringdictr
   Úhashlibr   re   Útypingr   r   r   r   r5   rg   rQ   r3   r   r   ú<module>ry      s[   ðÝ -Ý 1Ý -Ý 6Ý "ß Tã Ý %Ý Û ß ,Ñ ,ô7Ð(Eô 7÷>Fkñ FkðPW ð W¨ô Wr   