
    jKj                         d dl mZ d dlZd dlZd dlZd dlmZ d dlmZ d dl	m
Z
mZmZmZmZmZ d dlmZ dZdZd	Z e         G d
 de      Zy)    )AnyN)Thread)_configure_posthog_logging)AI_EVENTS_ENDPOINTEVENTS_ENDPOINTAPIErrorDatetimeSerializer
batch_postis_ai_event)Emptyi  i   i  P c                   x    e Zd ZdZ ej
                  d      Z	 	 	 	 	 	 	 	 	 ddZd Zd Z	d Z
d Zd	 Zd
 Zd Zy)Consumerz.Consumes the messages from the client's queue.posthogNc                     t        j                  |        d| _        || _        || _        || _        || _        || _        || _        || _	        || _
        d| _        || _        |	| _        |
| _        y)zCreate a consumer thread.TN)r   __init__daemonflush_atflush_intervalapi_keyhoston_errorqueuegzipdedicated_ai_endpointrunningretriestimeouthistorical_migration)selfr   r   r   r   r   r   r   r   r   r   r   s               a/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/posthog/consumer.pyr   zConsumer.__init__(   sp     	 ,	 
	%:"
 $8!    c                     | j                   j                  d       | j                  r| j                          | j                  r| j                   j                  d       y)zRuns the consumer.zconsumer is running...zconsumer exited.N)logdebugr   uploadr   s    r    runzConsumer.runK   s?    /0llKKM ll 	)*r!   c                     d| _         y)zPause the consumer.FN)r   r&   s    r    pausezConsumer.pauseS   s	    r!   c                 
   d}| j                         }t        |      dk(  ry	 | j                  |       d}|D ]  }| j                  j                           |S # t        $ rz}| j                  j                  d|       d}| j                  rF	 | j                  ||       n2# t        $ r&}| j                  j                  d|       Y d}~nd}~ww xY wY d}~d}~ww xY w# |D ]  }| j                  j                           w xY w)z:Upload the next batch of items, return whether successful.Fr   Tzerror uploading: %szon_error handler failed: %sN)	nextlenrequest	Exceptionr#   errorr   r   	task_done)r   successbatcheitems        r    r%   zConsumer.uploadW   s    		u:?	'LLG 

$$&    	EHHNN0!4G}}EMM!U+  EHHNN#@!DDE	E 

$$& sS   A 	C"*CB C 	C)C
C
CCC CC #Dc                    | j                   }g }t        j                         }d}t        |      | j                  k  r%t        j                         |z
  }|| j
                  k\  r	 |S 	 |j                  d| j
                  |z
        }t        t        j                  |t              j                               }| j                  |      }||kD  r:| j                  j                  d|dz  t        |             |j                          |j!                  |       ||z  }|t"        k\  r| j                  j%                  d|       	 |S 	 t        |      | j                  k  r%|S # t&        $ r Y |S w xY w)z)Return the next batch of items to upload.r   T)blockr   )clsz(Item exceeds %dKiB limit, dropping. (%s)i   zhit batch size limit (size: %d))r   time	monotonicr,   r   r   getjsondumpsr	   encode_max_msg_sizer#   r/   strr0   appendBATCH_SIZE_LIMITr$   r   )	r   r   items
start_time
total_sizeelapsedr4   	item_sizemax_msg_sizes	            r    r+   zConsumer.nextp   sW   

^^%

%j4==(nn&3G$---* )yytT5H5H75RyS

45G H O O QR	#11$7|+HHNNB$,D	
 OO%T"i'
!11HHNN#DjQ  2% %j4==(0   s   (B!E% 
;E% %	E21E2c                    | j                   s| j                  |t               yg }g }|D ]1  }t        |j	                  d            r|n|}|j                  |       3 d}|t        f|t        ffD ]  \  }}|s		 | j                  ||        ||y# t        $ r,}	||	}n| j                  j                  d||	       Y d}	~	Sd}	~	ww xY w)a  Upload the batch, routing `$ai_*` events to their own endpoint when enabled.

        Each destination is attempted independently so a failure on one does not
        skip the other. The first failure is raised (so `upload()` logs it and
        invokes `on_error`); a second is logged here so it isn't silently lost.
        The batch was already dequeued in `upload()`, so unsent events are dropped
        after retries, same as the single-endpoint path.
        Neventzerror uploading to %s: %s)
r   _sendr   r   r:   r@   r   r.   r#   r/   )
r   r2   	ai_eventsanalytics_eventsr4   target	first_exceventspathr3   s
             r    r-   zConsumer.request   s     ))JJuo.!	&(D"-dhhw.?"@YFVFMM$  	/*+
LFD I

64(
  O !  I$ !IHHNN#>aH	Is   :B	C"CCc           
         d }d}t        | j                  dz         D ]H  }	 t        | j                  | j                  | j
                  | j                  || j                  |        y |r|y# t        $ rp}|} ||      s || j                  k  rLt        |dd      }|r|dkD  rt        j                  |       n"t        j                  t        d|z  d             Y d}~d}~ww xY w)	zLAttempt to upload a single batch to `path`, retrying before raising an errorc                     t        | t              rFt        | j                  t              r+d| j                  cxk  xr dk  nc xr | j                  dv S yy)Ni  i  )i  i  FT)
isinstancer   statusint)excs    r    is_retryablez$Consumer._send.<locals>.is_retryable   sO    #x( cjj#.

0S0Rcjj
6R   r!   N   )r   r   r2   r   rP   retry_afterr         )ranger   r
   r   r   r   r   r   r.   getattrr8   sleepmin)r   r2   rP   rW   last_excattemptr3   rY   s           r    rJ   zConsumer._send   s    	 T\\A-.G8LLII LL)-)B)B  /0 N   
8#AT\\)")!]D"AK"{Q

;/

3q'z2#67
8s   AA..	C'7A&C""C'c                 f    | j                   r t        |j                  d            rt        S t        S )NrI   )r   r   r:   AI_MAX_MSG_SIZEMAX_MSG_SIZE)r   r4   s     r    r>   zConsumer._max_msg_size   s'    %%+dhhw6G*H""r!   )	d   NNg      @F
      FF)__name__
__module____qualname____doc__logging	getLoggerr#   r   r'   r)   r%   r+   r-   rJ   r>    r!   r    r   r   #   s`    8
'

I
&C "#!9F+2 D#J+Zr!   r   )typingr   r;   rl   r8   	threadingr   posthog._loggingr   posthog.requestr   r   r   r	   r
   r   r   r   rd   rc   rA   r   rn   r!   r    <module>rs      sR         7   
 " #   Dv Dr!   