
    /j              	          S SK r S SKrS SKJr  S SKrS SKrS SKJrJrJ	r	J
r
JrJr  \R                  " S5      r " S S\5      rS\ R"                  SS4S	 jrS
\\\\4   S\\\\4   4S jrS
\\\\4   S\4S jr\" S5      r " S S\	\   5      r " S S\ R6                  \   5      r " S S\	\   5      rSqSS jrS\S\S\\SS4   4S jr g)    N)deque)Callable	GeneratorGenericListTypeVarUnionlivekitc                        \ rS rSrS rS rSrg)classproperty   c                 $    [        U5      U l        g N)classmethodf)selfr   s     C/app/agent/.venv/lib/python3.13/site-packages/livekit/rtc/_utils.py__init__classproperty.__init__   s    Q    c                 >    U R                   R                  " U6 " 5       $ r   )r   __get__)r   as     r   r   classproperty.__get__   s    vv~~q!##r   )r   N)__name__
__module____qualname____firstlineno__r   r   __static_attributes__ r   r   r   r      s     $r   r   taskreturnc                     U R                  5       (       a  [        R                  SU 5        g U R                  5       (       a#  [        R	                  SX R                  5       S9  g g )Nztask cancelled: %sztask exception: %s)exc_info)	cancelledloggerinfo	exceptionerror)r!   s    r   task_done_loggerr*   !   sN    ~~($/~~)4..:JK r   datac                 f   [        U [        5      (       ai  U R                  (       d  [        S5      eU R                  [        U R                  5      :w  a'  U R                  (       d  [        U 5      $ [        U 5      $  U $ [        U [        [        45      (       d  [        S[        U 5       35      eU $ )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_bufferr:   +   s     $
##<==;;#dhh-'*.--9T?HU4[H ( K ui011HdUVVKr   c                 H   [        U [        5      (       aP  U R                  (       d3  [        R                  " [        R
                  R                  U 5      5      $ U R                  n [        U [        5      (       a3  [        R                  " [        R
                  R                  U 5      5      $ [        U [        5      (       aJ  [        R                  " [        R                  " U 5      [        R                  5      R                  nUc   eU$ [        S[        U 5       35      e)Nr-   )r.   r/   r5   ctypes	addressofc_charfrom_bufferr4   r6   r7   castc_char_pc_void_pvaluer8   r9   )r+   addrs     r   get_addressrE   =   s    $
##}}##FMM$=$=d$CDDxx$	"" 9 9$ ?@@${{6??40&//BHH
DT$ZLQ
RRr   Tc                   J    \ rS rSrS
S\SS4S jjrS\SS4S jrS\4S jrS	r	g)	RingQueueN   capacityr"   Nc                 b    Xl         [        5       U l        [        R                  " 5       U l        g r   )	_capacityr   _queueasyncioEvent_event)r   rJ   s     r   r   RingQueue.__init__O   s    ! %mmor   itemc                    U R                   S:  a=  [        U R                  5      U R                   :X  a  U R                  R                  5         U R                  R	                  U5        U R
                  R                  5         g Nr   )rL   r3   rM   popleftappendrP   set)r   rR   s     r   putRingQueue.putT   sR    >>A#dkk"2dnn"DKK!4 r   c                 "  #    [        U R                  5      S:X  a=  U R                  R                  5       I S h  vN   [        U R                  5      S:X  a  M=  U R                  R	                  5         U R                  R                  5       $  NS7frT   )r3   rM   rP   waitclearrU   r   s    r   getRingQueue.getZ   sg     $++!#++""$$$ $++!#{{""$$ %s   7BBB5B)rL   rP   rM   r   )
r   r   r   r   intr   rF   rX   r^   r   r    r   r   rH   rH   N   s4    & &T &
 d %1 %r   rH   c                   Z   ^  \ rS rSrSrS
S\SS4U 4S jjjrS\\/\	4   S\4S jr
S	rU =r$ )Queuea   z%asyncio.Queue with utility functions.maxsizer"   Nc                 $   > [         TU ]  U5        g r   )superr   )r   re   	__class__s     r   r   Queue.__init__d   s    !r   fncc                    #     U R                  5       I Sh  vN nU" U5      (       a  U$ U R                  5         M9   N%7f)zVWait for an event that matches the given function.
The previous events are discarded.
N)r^   	task_done)r   rj   events      r   wait_forQueue.wait_forg   s8     
 ((*$E5zzNN $s   ?=&?r    r`   )r   r   r   r   __doc__ra   r   r   rF   boolrn   r   __classcell__)rh   s   @r   rc   rc   a   sA    /" "D " "(A39"5 !  r   rc   c                   x    \ rS rSrSrSS jrS\4S jrS\SS4S jr	S\
\   4S	 jrS
\
\   SS4S jrSS jrSrg)BroadcastQueueu   z Queue with multiple subscribers.r"   Nc                 F    [         R                  " 5       U l        / U l        g r   )rN   Lock_lock_subscribersr]   s    r   r   BroadcastQueue.__init__x   s    \\^
,.r   c                 ,    [        U R                  5      $ r   )r3   ry   r]   s    r   len_subscribersBroadcastQueue.len_subscribers|   s    4$$%%r   rR   c                 L    U R                    H  nUR                  U5        M     g r   )ry   
put_nowait)r   rR   queues      r   r   BroadcastQueue.put_nowait   s     &&ET" 'r   c                 `    [         [           " 5       nU R                  R                  U5        U$ r   )rc   rF   ry   rV   r   r   s     r   	subscribeBroadcastQueue.subscribe   s&    a
  'r   r   c                 :    U R                   R                  U5        g r   )ry   remover   s     r   unsubscribeBroadcastQueue.unsubscribe   s      'r   c                   #    U R                    IS h  vN   U R                  R                  5       nU H  nUR                  5       I S h  vN   M     S S S 5      IS h  vN   g  NP N N	! , IS h  vN  (       d  f       g = f7fr   )rx   ry   copyjoin)r   subsr   s      r   r   BroadcastQueue.join   sT     :::$$))+Djjl""  :: # :::sV   BA$B3A*
A&A*BA(B&A*(B*B0A31B=B)rx   ry   )r"   N)r   r   r   r   rp   r   ra   r|   rF   r   rc   r   r   r   r   r    r   r   rt   rt   u   sU    */& &#q #T #58 
(q (d (#r   rt   >0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZc                 D    SR                  S [        U 5       5       5      $ )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   V   #    U  H  n[         R                  " [        5      v   M!     g 7fr   )randomchoice_base62_characters).0_s     r   	<genexpr>)generate_random_base62.<locals>.<genexpr>   s     Lm6==!344ms   '))r   range)lengths    r   generate_random_base62r      s     77LeFmLLLr   snc              #      #    U R                  5       n[        U5      U:  a;  UnX#   S-  S:X  a  US-  nX#   S-  S:X  a  M  USU v   X#S n[        U5      U:  a  M;  Uv   g7f)z.Split UTF-8 s into chunks of maximum length n.         N)encoder3   )r   r   encodedks       r   
split_utf8r      st     hhjG
g,
zD T)FA zD T)bqk"+ g,
 Ms   =A"A"A")   )!rN   loggingcollectionsr   r<   r   typingr   r   r   r   r   r	   	getLoggerr&   objectr   Taskr*   r7   r6   r/   r:   ra   rE   rF   rH   rc   rt   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   