
    qi              	          d dl Z d dlZd dlmZ d dlZd dlZd dlmZmZm	Z	m
Z
mZmZ  ej                  d      Z G d de      Zde j"                  ddfd	Zd
eeeef   deeeef   fdZd
eeeef   defdZ ed      Z G d de	e         Z G d de j6                  e         Z G d de	e         ZdaddZdededeeddf   fdZ y)    N)deque)Callable	GeneratorGenericListTypeVarUnionlivekitc                       e Zd Zd Zd Zy)classpropertyc                 $    t        |      | _        y N)classmethodf)selfr   s     D/opt/pipecat/venv/lib/python3.12/site-packages/livekit/rtc/_utils.py__init__zclassproperty.__init__   s    Q    c                 >      | j                   j                  |        S r   )r   __get__)r   as     r   r   zclassproperty.__get__   s    !~tvv~~q!##r   N)__name__
__module____qualname__r   r    r   r   r   r      s     $r   r   taskreturnc                     | j                         rt        j                  d|        y | j                         r't        j	                  d| | j                                y y )Nztask cancelled: %sztask exception: %s)exc_info)	cancelledloggerinfo	exceptionerror)r   s    r   task_done_loggerr%   !   sJ    ~~($/~~)4$..:JK r   datac                 :   t        | t              r]| j                  st        d      | j                  t        | j                        k7  r"| j                  st        |       S t        |       S | S t        | t        t        f      st        dt        |              | S )zValidate and normalize a buffer for FFI use.

    Sliced memoryviews are materialized because get_address cannot
    reliably resolve their offset for all buffer types.
    zmemoryview must be contiguous.expected bytes, bytearray, or memoryview, got )
isinstance
memoryview
contiguous
ValueErrornbyteslenobjreadonly	bytearraybytes	TypeErrortype)r&   s    r   _ensure_compatible_bufferr5   +   s     $
#<==;;#dhh-'*.--9T?HU4[H K ui01HdUVVKr   c                    t        | t              rJ| j                  s2t        j                  t        j
                  j                  |             S | j                  } t        | t              r2t        j                  t        j
                  j                  |             S t        | t              rGt        j                  t        j                  |       t        j                        j                  }|J |S t        dt        |              )Nr(   )r)   r*   r0   ctypes	addressofc_charfrom_bufferr/   r1   r2   castc_char_pc_void_pvaluer3   r4   )r&   addrs     r   get_addressr@   =   s    $
#}}##FMM$=$=d$CDDxx$	" 9 9$ ?@@${{6??40&//BHH
DT$ZLQ
RRr   Tc                   :    e Zd ZddeddfdZdeddfdZdefdZy)		RingQueuecapacityr   Nc                 b    || _         t               | _        t        j                         | _        y r   )	_capacityr   _queueasyncioEvent_event)r   rD   s     r   r   zRingQueue.__init__O   s    ! %mmor   itemc                    | j                   dkD  r<t        | j                        | j                   k(  r| j                  j                          | j                  j	                  |       | j
                  j                          y Nr   )rF   r.   rG   popleftappendrJ   set)r   rK   s     r   putzRingQueue.putT   sR    >>A#dkk"2dnn"DKK!4 r   c                   K   t        | j                        dk(  r;| j                  j                          d {    t        | j                        dk(  r;| j                  j	                          | j                  j                         S 7 QwrM   )r.   rG   rJ   waitclearrN   r   s    r   getzRingQueue.getZ   sh     $++!#++""$$$ $++!#{{""$$ %s   6BB
B5Br   )r   r   r   intr   rA   rQ   rV   r   r   r   rC   rC   N   s4    & &T &
 d %1 %r   rC   c                   J     e Zd ZdZddeddf fdZdeegef   defdZ	 xZ
S )	Queuez%asyncio.Queue with utility functions.maxsizer   Nc                 $    t         |   |       y r   )superr   )r   r[   	__class__s     r   r   zQueue.__init__d   s    !r   fncc                 v   K   	 | j                          d{   } ||      r|S | j                          37 w)zfWait for an event that matches the given function.
        The previous events are discarded.
        N)rV   	task_done)r   r_   events      r   wait_forzQueue.wait_forg   s7     
 ((*$E5zNN $s   97 9rW   )r   r   r   __doc__rX   r   r   rA   boolrc   __classcell__)r^   s   @r   rZ   rZ   a   s7    /" "D "(A39"5 ! r   rZ   c                   d    e Zd ZdZddZdefdZdeddfdZde	e   fdZ
d	e	e   ddfd
ZddZy)BroadcastQueuez Queue with multiple subscribers.r   Nc                 D    t        j                         | _        g | _        y r   )rH   Lock_lock_subscribersrU   s    r   r   zBroadcastQueue.__init__x   s    \\^
,.r   c                 ,    t        | j                        S r   )r.   rl   rU   s    r   len_subscriberszBroadcastQueue.len_subscribers|   s    4$$%%r   rK   c                 H    | j                   D ]  }|j                  |        y r   )rl   
put_nowait)r   rK   queues      r   rp   zBroadcastQueue.put_nowait   s%    && 	#ET"	#r   c                 ^    t        t                  }| j                  j                  |       |S r   )rZ   rA   rl   rO   r   rq   s     r   	subscribezBroadcastQueue.subscribe   s&    a
  'r   rq   c                 :    | j                   j                  |       y r   )rl   removers   s     r   unsubscribezBroadcastQueue.unsubscribe   s      'r   c                    K   | j                   4 d {    | j                  j                         }|D ]  }|j                          d {     d d d       d {    y 7 N7 7 	# 1 d {  7  sw Y   y xY wwr   )rk   rl   copyjoin)r   subsrq   s      r   rz   zBroadcastQueue.join   st     :: 	# 	#$$))+D #jjl""#	# 	# 	# #	# 	# 	# 	#sV   A=A"A=3A(
A$A(A=A&A=$A(&A=(A:.A1/A:6A=)r   N)r   r   r   rd   r   rX   rn   rA   rp   rZ   rt   rw   rz   r   r   r   rh   rh   u   sU    */& &#q #T #58 
(q (d (#r   rh   >0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZc                 D    dj                  d t        |       D              S )z
    Generate a random base62 encoded string of a specified length.

    :param length: The desired length of the base62 encoded string.
    :return: A base62 encoded string.
     c              3   N   K   | ]  }t        j                  t                y wr   )randomchoice_base62_characters).0_s     r   	<genexpr>z)generate_random_base62.<locals>.<genexpr>   s     L6==!34Ls   #%)rz   range)lengths    r   generate_random_base62r      s     77LeFmLLLr   snc              #      K   | j                         }t        |      |kD  r9|}||   dz  dk(  r|dz  }||   dz  dk(  r|d|  ||d }t        |      |kD  r9| yw)z.Split UTF-8 s into chunks of maximum length n.         N)encoder.   )r   r   encodedks       r   
split_utf8r      s{     hhjG
g,
qzD T)FA qzD T)bqk!"+ g,
 Ms   <AAA)   )!rH   loggingcollectionsr   r7   r   typingr   r   r   r   r   r	   	getLoggerr!   objectr   Taskr%   r2   r1   r*   r5   rX   r@   rA   rC   rZ   rh   r   r   strr   r   r   r   <module>r      s        E E			9	%$F $7<< D 
y*,
-
5)Z'($SeE9j89 Sc S CL%
 %&GMM! (#WQZ #: V M	# 	# 	)E4,="> 	r   