o
    ZhX                     @   s   d dl Z d dlZd dlmZmZ d dlmZ d dlZd dlm	Z	 d dl
mZ d dlmZ d dlmZ er^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 d dlmZ dddZedddZdZdZdd ZG dd deZdS )    N)ThreadLock)contextmanager)Envelope)Session)TYPE_CHECKING)format_timestamp)Any)Callable)Dict)	Generator)List)Optional)Unionc                 C   sB   | du rt jj} | jj}|du r| jr| jjni }|dd}|S )z<Utility function to find out if session tracking is enabled.Nauto_session_trackingF)
sentry_sdkHubcurrentscopeZ_force_auto_session_trackingclientoptionsget)hubshould_trackZclient_options r   J/var/www/html/lang_env/lib/python3.10/site-packages/sentry_sdk/sessions.py is_auto_session_tracking_enabled   s   r   applicationc                 c   sX    | du r	t jj} t| }|r| j|d zdV  W |r"|   dS dS |r+|   w w )z8Starts and stops a session automatically around a block.N)session_mode)r   r   r   r   Zstart_sessionZend_session)r   r   r   r   r   r   r   %   s   
r   )exitedabnormalcrashedd   c                 C   s   t |t|  dS )N)attrsZ
aggregates)dictlistvalues)Zaggregate_statesr#   r   r   r   make_aggregate_envelope9   s   r'   c                   @   sH   e Zd Z	dddZdd Zdd Zdd	 Zd
d Zdd Zdd Z	dS )SessionFlusher<   c                 C   s>   || _ || _g | _i | _d | _t | _t | _d | _d| _	d S )NT)
capture_funcflush_intervalpending_sessionspending_aggregates_threadr   _thread_lock_aggregate_lock_thread_for_pid_running)selfr*   r+   r   r   r   __init__?   s   
zSessionFlusher.__init__c                 C   s   | j }g | _ | j | j}i | _W d    n1 sw   Y  t }|D ]}t|jtkr5| | t }|| q$| D ]\}}t|jtkrR| | t }|	t
|| q?t|jdkri| | d S d S )Nr   )r,   r0   r-   r   lenitemsMAX_ENVELOPE_ITEMSr*   add_sessionZadd_sessionsr'   )r3   r,   r-   envelopesessionr#   statesr   r   r   flushO   s(   

zSessionFlusher.flushc              	      s    j t kr jdurdS  jN  j t kr' jdur'	 W d   dS  fdd}t|d}d|_z|  W n tyN   d _	Y W d   dS w | _t  _ W d   dS 1 sbw   Y  dS )a%  
        Check that we have an active thread to run in, or create one if not.

        Note that this might fail (e.g. in Python 3.12 it's not possible to
        spawn new threads at interpreter shutdown). In that case self._running
        will be False after running this function.
        Nc                      s.    j rt j  j r    j sd S d S N)r2   timesleepr+   r<   r   r3   r   r   r.   y   s
   z/SessionFlusher._ensure_running.<locals>._thread)targetTF)
r1   osgetpidr.   r/   r   daemonstartRuntimeErrorr2   )r3   r.   threadr   r@   r   _ensure_runningj   s,   	

zSessionFlusher._ensure_runningc                 C   s"  | j  |jdd}tt| }|j}| j|i }||i }d|vr-t|j|d< |j	dkr=|
ddd |d< n2|j	dkrM|
ddd |d< n*|jdkr]|
ddd |d< n"|
d	dd |d	< W d    d S W d    d S W d    d S W d    d S 1 sw   Y  d S )
NF)Zwith_user_infostartedr!   r      r    Zerroredr   )r0   Zget_json_attrstuplesortedr6   Ztruncated_startedr-   
setdefaultr   statusr   errors)r3   r:   r#   Zprimary_keyZsecondary_keyr;   stater   r   r   add_aggregate_session   s,   


"z$SessionFlusher.add_aggregate_sessionc                 C   s2   |j dkr| | n| j|  |   d S )Nrequest)r   rQ   r,   appendto_jsonrH   )r3   r:   r   r   r   r8      s   
zSessionFlusher.add_sessionc                 C   s
   d| _ d S )NF)r2   r@   r   r   r   kill   s   
zSessionFlusher.killc                 C   s   |    d S r=   )rU   r@   r   r   r   __del__   s   zSessionFlusher.__del__N)r)   )
__name__
__module____qualname__r4   r<   rH   rQ   r8   rU   rV   r   r   r   r   r(   >   s    
%
r(   r=   )Nr   )rB   r>   	threadingr   r   
contextlibr   r   Zsentry_sdk.enveloper   Zsentry_sdk.sessionr   Zsentry_sdk._typesr   Zsentry_sdk.utilsr   typingr	   r
   r   r   r   r   r   r   r   ZTERMINAL_SESSION_STATESr7   r'   objectr(   r   r   r   r   <module>   s0    
