o
    i$                     @   sx  d dl Z 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	 d dl
Z
d dlZd dlZd dlZd dlZd dlmZmZmZmZmZ ddlmZ ddlmZmZ ddlmZ e Zeej d	d
 Z dd Z!e"de#ej$ej%Z&d Z'G dd dZ(edZ)G dd dee) Z*e"de#ej$ej%de#ej$dej%ddfddZ+dej,j-dee. fddZ/G dd dZ0dS )    N)	ExitStack   )__version__)CallableGenericListOptionalTypeVar)ffi_pb2)Queueclassproperty)loggerc                   C   s4   t  dkrdS t  dkrdS t  dkrdS d S )NLinuxzliblivekit_ffi.soDarwinzliblivekit_ffi.dylibWindowszlivekit_ffi.dll)platformsystem r   r   Y/var/www/html/livekit_bhavya/venv/lib/python3.10/site-packages/livekit/rtc/_ffi_client.py	_lib_name%   s   r   c                  C   sv   t jdd } | rt| S t }|d u r!tdt	  dt
jd| }t
j|}t|}tt|S )NLIVEKIT_LIB_PATH z"no ffi library found for platform z.. Set LIVEKIT_LIB_PATH to specify the lib pathzlivekit.rtc.resources)osenvirongetstripctypesCDLLr   	Exceptionr   r   	importlib	resourcesfilesas_file_resource_filesenter_contextstr)libpathlibnameresctxpathr   r   r   get_ffi_lib/   s   

r+   c                   @   sP   e Zd ZdeddfddZdd Zedefdd	Zdd
dZ	de
fddZdS )	FfiHandlehandlereturnNc                 C   s   || _ d| _d S )NF)r-   	_disposed)selfr-   r   r   r   __init__H   s   
zFfiHandle.__init__c                 C   s   |    d S N)disposer0   r   r   r   __del__L   s   zFfiHandle.__del__c                 C      | j S r2   )r/   r4   r   r   r   disposedO      zFfiHandle.disposedc                 C   s<   | j tkr| jsd| _tjjt| j sJ d S d S d S )NT)	r-   INVALID_HANDLEr/   	FfiClientinstance_ffi_liblivekit_ffi_drop_handler   c_uint64r4   r   r   r   r3   S   s
   zFfiHandle.disposec                 C   s   d| j  dS )Nz
FfiHandle())r-   r4   r   r   r   __repr__X   s   zFfiHandle.__repr__r.   N)__name__
__module____qualname__intr1   r5   propertyboolr7   r3   r%   r@   r   r   r   r   r,   G   s    
r,   Tc                   @   sr   e Zd ZdddZdeddfddZ		ddeej d	ee	ege
f  dee fd
dZdee ddfddZdS )FfiQueuer.   Nc                 C   s   t  | _g | _d S r2   )	threadingRLock_lock_subscribersr4   r   r   r   r1   `   s   
zFfiQueue.__init__itemc                 C   s   | j I | jD ]<\}}}|d ur"z||sW qW n	 ty!   Y nw z	||j| W q tyC } ztd| W Y d }~qd }~ww W d    d S 1 sOw   Y  d S )Nzerror putting to queue: %s)rL   rM   r   call_soon_threadsafe
put_nowaitr   error)r0   rN   queueloop	filter_fner   r   r   putg   s$   "zFfiQueue.putrS   rT   c                 C   sV   | j  tt  }|pt }| j|||f |W  d   S 1 s$w   Y  dS )a  Subscribe to FFI events.

        Args:
            loop: Event loop to use (defaults to current).
            filter_fn: Optional filter function. If provided, only items where
                      filter_fn(item) returns True will be delivered.
                      If None, receives all events (original behavior).

        Returns:
            Queue to receive events from.
        N)rL   r   rH   asyncioget_event_looprM   append)r0   rS   rT   rR   r   r   r   	subscribey   s   
$zFfiQueue.subscriberR   c                 C   sn   | j * t| jD ]\}\}}}||kr| j|  n	q	W d    d S W d    d S 1 s0w   Y  d S r2   )rL   	enumeraterM   pop)r0   rR   iq_r   r   r   unsubscribe   s   "zFfiQueue.unsubscriberA   )NN)rB   rC   rD   r1   rH   rV   r   rW   AbstractEventLoopr   rG   r   rZ   r`   r   r   r   r   rI   _   s    

rI   data_ptrdata_lenr.   c           	   	   C   s   t | t|}t }|| |d}|dkr\|jjD ];}t	|j
}tjdd  }|dv }|tjkrG|sG|jdksF|jdrGq|d urYt|d|j|j|j|j qd S |d	krvtd
|jjtjdd tt tj  d S t!j"j#$| d S )NmessagelogsLIVEKIT_RTC_DEBUGr   )true1	libwebrtclivekitz%s:%s:%s - %spaniczFFI Panic: T)fileflush)%r   	string_atrE   	proto_ffiFfiEventParseFromString
WhichOneofre   recordsto_python_levellevelr   r   r   r   lowerloggingDEBUGtarget
startswithr   loglinemodule_pathrd   printrk   sysstderrkillgetpidsignalSIGTERMr:   r;   rR   rV   )	rb   rc   
event_dataeventwhichrecordru   	debug_env	rtc_debugr   r   r   ffi_event_callback   s8   


	r   ru   c                 C   sZ   | t jjkr	tjS | t jjkrtjS | t jjkrtjS | t jj	kr$tj
S | t jjkr+	 d S r2   )ro   LogLevel	LOG_ERRORrw   ERRORLOG_WARNWARNLOG_INFOINFO	LOG_DEBUGrx   	LOG_TRACE)ru   r   r   r   rt      s   rt   c                   @   sd   e Zd ZU dZed  ed< edddZdddZe	de
ej fdd	Zd
ejdejfddZdS )r:   N	_instancer.   c                 C   s   | j d u r	t | _ | j S r2   )r   r:   )clsr   r   r   r;      s   
zFfiClient.instancec              
      s  t  | _ttj  | _zt | _W n t	y, } zt
 pd}td||f d d }~ww ttjtjtjg| jj_ttjtjtttjttjg| jj_tj| jj_tjg| jj_tj| jj_g | jj_d | jj_| jtddtd | j tj fdd}d S )Nlivekit_ffizfailed to load %s: %s
Install the livekit package with: pip install livekit
Or set LIVEKIT_LIB_PATH to the path of the native library.Ts   pythonasciic                      s       d S r2   )livekit_ffi_disposer   ffi_libr   r   _dispose_lk_ffi  s   z+FfiClient.__init__.<locals>._dispose_lk_ffi)rJ   rK   rL   rI   ro   rp   _queuer+   r<   r   r   ImportError
ffi_cb_fncr   c_boolc_char_plivekit_ffi_initializeargtypesPOINTERc_ubytec_size_tlivekit_ffi_requestr>   restyper=   r   r   r   encodeatexitregister)r0   rU   r'   r   r   r   r   r1      sH   







zFfiClient.__init__c                 C   r6   r2   )r   r4   r   r   r   rR     r8   zFfiClient.queuereqc           
      C   s   |  }t|}tj| | }ttj }t }| j||t|t|}|t	ks/J t
||j}t }	|	| t|  |	S r2   )SerializeToStringlenr   r   r   r   r<   r   byrefr9   rn   valuero   FfiResponserq   r,   r3   )
r0   r   
proto_data	proto_lendataresp_ptrresp_lenr-   	resp_datarespr   r   r   request	  s   
zFfiClient.request)r.   r:   rA   )rB   rC   rD   r   r   __annotations__r   r;   r1   rF   rI   ro   rp   rR   
FfiRequestr   r   r   r   r   r   r:      s   
 
)r:   )1r   rW   r   
contextlibr   r   importlib.resourcesr   versionr   rw   r   r   r   rJ   typingr   r   r   r   r	   _protor
   ro   _utilsr   r   r{   r   r#   r   closer   r+   	CFUNCTYPEr   c_uint8r   r   r9   r,   rH   rI   r   r   	ValueTyperE   rt   r:   r   r   r   r   <module>   sF   
9
(