o
    i                  	   @   s4  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dZG dd deZde jddfd	d
Zdeeeef deeeef fddZdeeeef defddZedZG dd de	e ZG dd de je ZG dd de	e ZdadddZdededeeddf fddZ dS )     N)deque)Callable	GeneratorGenericListTypeVarUnionlivekitc                   @   s   e Zd Zdd Zdd ZdS )classpropertyc                 C   s   t || _d S N)classmethodf)selfr    r   T/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/rtc/_utils.py__init__      zclassproperty.__init__c                 G   s   | j j|  S r   )r   __get__)r   ar   r   r   r      r   zclassproperty.__get__N)__name__
__module____qualname__r   r   r   r   r   r   r
      s    r
   taskreturnc                 C   s<   |   rtd|  d S |  rtjd| |  d d S d S )Nztask cancelled: %sztask exception: %s)exc_info)	cancelledloggerinfo	exceptionerror)r   r   r   r   task_done_logger!   s   r    datac                 C   sf   t | tr!| jstd| jt| jkr| jst| S t	| S | S t | t	tfs1t
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!   r   r   r   _ensure_compatible_buffer+   s   
r/   c                 C   s   t | tr| jsttj| S | j} t | tr"ttj| S t | t	r:t
t| tjj}|d us8J |S tdt|  )Nr"   )r#   r$   r*   ctypes	addressofc_charfrom_bufferr)   r+   r,   castc_char_pc_void_pvaluer-   r.   )r!   addrr   r   r   get_address=   s   


r9   Tc                   @   s@   e Zd ZddeddfddZdeddfdd	Zdefd
dZdS )	RingQueuer   capacityr   Nc                 C   s   || _ t | _t | _d S r   )	_capacityr   _queueasyncioEvent_event)r   r<   r   r   r   r   O   s   zRingQueue.__init__itemc                 C   s>   | j dkrt| j| j kr| j  | j| | j  d S Nr   )r=   r(   r>   popleftappendrA   set)r   rB   r   r   r   putT   s   
zRingQueue.putc                    sB   t | jdkr| j I d H  t | jdks| j  | j S rC   )r(   r>   rA   waitclearrD   r   r   r   r   getZ   s   

zRingQueue.getr   )r   r   r   intr   r:   rG   rK   r   r   r   r   r;   N   s    r;   c                       sH   e Zd ZdZddeddf fddZdeegef defd	d
Z	  Z
S )Queuez%asyncio.Queue with utility functions.r   maxsizer   Nc                    s   t  | d S r   )superr   )r   rO   	__class__r   r   r   d      zQueue.__init__fncc                    s(   	 |   I dH }||r|S |   q)zfWait for an event that matches the given function.
        The previous events are discarded.
        TN)rK   	task_done)r   rT   eventr   r   r   wait_forg   s   zQueue.wait_forrL   )r   r   r   __doc__rM   r   r   r:   boolrW   __classcell__r   r   rQ   r   rN   a   s    $rN   c                   @   sl   e Zd ZdZdddZdefddZdeddfd	d
Zde	e fddZ
de	e ddfddZdddZdS )BroadcastQueuez Queue with multiple subscribers.r   Nc                 C   s   t  | _g | _d S r   )r?   Lock_lock_subscribersrJ   r   r   r   r   x   s   

zBroadcastQueue.__init__c                 C   s
   t | jS r   )r(   r^   rJ   r   r   r   len_subscribers|   s   
zBroadcastQueue.len_subscribersrB   c                 C   s   | j D ]}|| qd S r   )r^   
put_nowait)r   rB   queuer   r   r   r`      s   
zBroadcastQueue.put_nowaitc                 C   s   t t  }| j| |S r   )rN   r:   r^   rE   r   ra   r   r   r   	subscribe   s   
zBroadcastQueue.subscribera   c                 C   s   | j | d S r   )r^   removerb   r   r   r   unsubscribe   rS   zBroadcastQueue.unsubscribec              	      sd   | j 4 I d H  | j }|D ]	}| I d H  qW d   I d H  d S 1 I d H s+w   Y  d S r   )r]   r^   copyjoin)r   subsra   r   r   r   rg      s   
.zBroadcastQueue.join)r   N)r   r   r   rX   r   rM   r_   r:   r`   rN   rc   re   rg   r   r   r   r   r[   u   s    
r[   >0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ   c                 C   s   d d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                 s   s    | ]}t tV  qd S r   )randomchoice_base62_characters).0_r   r   r   	<genexpr>   s    z)generate_random_base62.<locals>.<genexpr>)rg   range)lengthr   r   r   generate_random_base62   s   rt   snc                 c   sr    |   }t||kr4|}|| d@ dkr!|d8 }|| d@ dks|d| V  ||d }t||ks|V  dS )z.Split UTF-8 s into chunks of maximum length n.         N)encoder(   )ru   rv   encodedkr   r   r   
split_utf8   s   
r}   )rj   )!r?   loggingcollectionsr   r0   rl   typingr   r   r   r   r   r   	getLoggerr   objectr
   Taskr    r,   r+   r$   r/   rM   r9   r:   r;   rN   r[   rn   rt   strr}   r   r   r   r   <module>   s,    



$