o
    hX                     @   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scope_force_auto_session_trackingclientoptionsget)hubshould_trackclient_options r   V/var/www/html/aiguide_backend/venv/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   start_sessionend_session)r   r    r   r   r   r   r   %   s   
r   )exitedabnormalcrashedd   c                 C   s   t |t|  dS )N)attrs
aggregates)dictlistvalues)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)selfr0   r1   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   )r2   r6   r3   r   lenitemsMAX_ENVELOPE_ITEMSr0   add_sessionadd_sessionsr-   )r9   r2   r3   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)r8   timesleepr1   rC   r   r9   r   r   r4   y   s
   z/SessionFlusher._ensure_running.<locals>._thread)targetTF)
r7   osgetpidr4   r5   r   daemonstartRuntimeErrorr8   )r9   r4   threadr   rG   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)with_user_infostartedr%   r      r$   erroredr#   )r6   get_json_attrstuplesortedr<   truncated_startedr3   
setdefaultr   statusr   errors)r9   rA   r'   primary_keysecondary_keyrB   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    r^   r2   appendto_jsonrO   )r9   rA   r   r   r   r>      s   
zSessionFlusher.add_sessionc                 C   s
   d| _ d S )NF)r8   rG   r   r   r   kill   s   
zSessionFlusher.killc                 C   s   |    d S rD   )rb   rG   r   r   r   __del__   s   zSessionFlusher.__del__N)r/   )
__name__
__module____qualname__r:   rC   rO   r^   r>   rb   rc   r   r   r   r   r.   >   s    
%
r.   rD   )Nr   )rI   rE   	threadingr   r   
contextlibr   r   sentry_sdk.enveloper   sentry_sdk.sessionr   sentry_sdk._typesr   sentry_sdk.utilsr   typingr	   r
   r   r   r   r   r   r   r   TERMINAL_SESSION_STATESr=   r-   objectr.   r   r   r   r   <module>   s0    
