
    qi$                        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j<                  ej>                         d	 Z d
 Z! ejD                  d ejF                  ejH                        ejJ                        Z&d Z' G d d      Z( ed      Z) G d dee)         Z* ejD                  d ejF                  ejH                        ejJ                        d ejF                  ejH                        dejJ                  ddfd       Z+dejX                  jZ                  dee.   fdZ/ G d d      Z0y)    N)	ExitStack   )__version__)CallableGenericListOptionalTypeVar)ffi_pb2)Queueclassproperty)loggerc                      t        j                         dk(  ryt        j                         dk(  ryt        j                         dk(  ryy )NLinuxzliblivekit_ffi.soDarwinzliblivekit_ffi.dylibWindowszlivekit_ffi.dll)platformsystem     I/opt/pipecat/venv/lib/python3.12/site-packages/livekit/rtc/_ffi_client.py	_lib_namer   %   s;    G#"		h	&%		i	' r   c                     t         j                  j                  dd      j                         } | rt	        j
                  |       S t               }|!t        dt        j                          d      t        j                  j                  d      |z  }t        j                  j                  |      }t        j                  |      }t	        j
                  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paths        r   get_ffi_libr/   /   s    jjnn/4::<G{{7##kG01B0C D; ;
 	

 


#
#$;
<w
FC



%
%c
*C((-D;;s4y!!r   c                   L    e Zd ZdeddfdZd Zedefd       Zd	dZ	de
fdZy)
	FfiHandlehandlereturnNc                      || _         d| _        y )NF)r2   	_disposed)selfr2   s     r   __init__zFfiHandle.__init__H   s    r   c                 $    | j                          y N)disposer6   s    r   __del__zFfiHandle.__del__L   s    r   c                     | j                   S r9   )r5   r;   s    r   disposedzFfiHandle.disposedO   s    ~~r   c                     | j                   t        k7  r]| j                  sPd| _        t        j                  j
                  j                  t        j                  | j                               sJ y y y )NT)	r2   INVALID_HANDLEr5   	FfiClientinstance_ffi_liblivekit_ffi_drop_handler    c_uint64r;   s    r   r:   zFfiHandle.disposeS   sT    ;;.(!DN%%..FFvW[WbWbGcddd 2@(r   c                 "    d| j                    dS )Nz
FfiHandle())r2   r;   s    r   __repr__zFfiHandle.__repr__X   s    DKK=**r   r3   N)__name__
__module____qualname__intr7   r<   propertyboolr>   r:   r)   rH   r   r   r   r1   r1   G   sG    s t  $  e
+# +r   r1   Tc                       e Zd ZddZdeddfdZ	 	 ddeej                     dee	ege
f      dee   fdZd	ee   ddfd
Zy)FfiQueuer3   Nc                 D    t        j                         | _        g | _        y r9   )	threadingRLock_lock_subscribersr;   s    r   r7   zFfiQueue.__init__`   s    __&
  	r   itemc                 <   | j                   5  | j                  D ]0  \  }}}|	  ||      s	 	 |j                  |j                  |       2 	 d d d        y # t        $ r Y 4w xY w# t        $ r }t        j                  d|       Y d }~pd }~ww xY w# 1 sw Y   y xY w)Nzerror putting to queue: %s)rV   rW   r"   call_soon_threadsafe
put_nowaitr   error)r6   rX   queueloop	filter_fnes         r   putzFfiQueue.putg   s    ZZ 	B*.*;*; B&tY(($  /
B--e.>.>EB	B 	B % 
 ! B LL!=qAAB	B 	BsV   BABA&B	A# B"A##B&	B/B
B
BBBr^   r_   c                     | j                   5  t        t                  }|xs t        j                         }| j
                  j                  |||f       |cddd       S # 1 sw Y   yxY w)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)rV   r   rP   asyncioget_event_looprW   append)r6   r^   r_   r]   s       r   	subscribezFfiQueue.subscribey   s\      ZZ 	!HJE37113D$$eT9%=>		 	 	s   A	A  A)r]   c                     | j                   5  t        | j                        D ]+  \  }\  }}}||k(  s| j                  j                  |        n d d d        y # 1 sw Y   y xY wr9   )rV   	enumeraterW   pop)r6   r]   iq_s        r   unsubscribezFfiQueue.unsubscribe   s`    ZZ 	 )$*;*; < 9Aq!:%%))!,	 	 	s   %AAA#rI   )NN)rJ   rK   rL   r7   rP   ra   r	   rc   AbstractEventLoopr   rO   r   rf   rm   r   r   r   rR   rR   _   s|    B Bd B( 5937w001 HaS$Y/0 
q	,q d r   rR   data_ptrdata_lenr3   c           	         t        j                  | t        |            }t        j                         }|j                  |       |j                  d      }|dk(  r|j                  j                  D ]  }t        |j                        }t        j                  j                  dd      j                         j                         }|dv }|t         j"                  k(  r-|s+|j$                  dk(  s|j$                  j'                  d      r|t)        j*                  |d|j$                  |j,                  |j.                  |j0                          y |d	k(  rht3        d
|j4                  j0                  t6        j8                  d       t        j:                  t        j<                         t>        j@                         y tB        jD                  jF                  jI                  |       y )NmessagelogsLIVEKIT_RTC_DEBUGr   )true1	libwebrtclivekitz%s:%s:%s - %spaniczFFI Panic: T)fileflush)%r    	string_atrM   	proto_ffiFfiEventParseFromString
WhichOneofrs   recordsto_python_levellevelr   r   r   r   lowerloggingDEBUGtarget
startswithr   loglinemodule_pathrr   printry   sysstderrkillgetpidsignalSIGTERMrA   rB   r]   ra   )	ro   rp   
event_dataeventwhichrecordr   	debug_env	rtc_debugs	            r   ffi_event_callbackr      sg   
 !!(CM:J E	*%Y'Ejj(( 	F#FLL1E

':B?EEGMMOI!]2I%i==K/6==3K3KI3V 

#MMKK&&NN	( 		'	mU[[00szzN
		V^^,  'r   r   c                    | 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	 y r9   )r}   LogLevel	LOG_ERRORr   ERRORLOG_WARNWARNLOG_INFOINFO	LOG_DEBUGr   	LOG_TRACE)r   s    r   r   r      s    	"",,,}}	)$$--	-||	)$$--	-||	)$$..	.}}	)$$..	. 	r   c                       e Zd ZU dZed    ed<   ed	d       Zd
dZe	de
ej                     fd       Zdej                  dej                  fdZy)rA   N	_instancer3   c                 P    | j                   t               | _         | j                   S r9   )r   rA   )clss    r   rB   zFfiClient.instance   s    == %KCM}}r   c                    t        j                         | _        t        t        j
                            | _        	 t               | _        t        t        j                  t        j                  t        j                  g| j                  j                   _        t        j$                  t        j&                        t        j(                  t        j$                  t        j$                  t        j&                              t        j$                  t        j(                        g| j                  j*                  _        t        j,                  | j                  j*                  _        t        j,                  g| j                  j0                  _        t        j                  | j                  j0                  _        g | j                  j2                  _        d | j                  j2                  _        | j                  j!                  t4        ddt7        j8                  d             | j                  t:        j<                  fd       }y # t        $ r&}t               xs d}t        d|d|d      d d }~ww xY w)	Nlivekit_ffizfailed to load z: zq
Install the livekit package with: pip install livekit
Or set LIVEKIT_LIB_PATH to the path of the native library.Ts   pythonasciic                  &     j                          y r9   )livekit_ffi_dispose)ffi_libs   r   _dispose_lk_ffiz+FfiClient.__init__.<locals>._dispose_lk_ffi  s    '')r   )rT   rU   rV   rR   r}   r~   _queuer/   rC   r"   r   ImportError
ffi_cb_fncr    c_boolc_char_plivekit_ffi_initializeargtypesPOINTERc_ubytec_size_tlivekit_ffi_requestrE   restyperD   r   r   r   encodeatexitregister)r6   r`   r+   r   r   s       @r   r7   zFfiClient.__init__   s   __&
y1124	'MDM MMOOOO	9
,,5 NN6>>*OONN6>>&..9:NN6??+	6
))2 5;OO))1:@//9J--68>--557))248))1,,i1C1CG1L	
 --		* 
	*A  	k2]G QXYZ\ 		s   I 	I6!I11I6c                     | j                   S r9   )r   r;   s    r   r]   zFfiClient.queue  s    {{r   reqc                 8   |j                         }t        |      }t        j                  |z  | } t        j                  t        j                               }t        j
                         }| j                  j                  ||t        j                  |      t        j                  |            }|t        k7  sJ t        j                  ||j                        }t        j                         }	|	j                  |       t        |      j!                          |	S r9   )SerializeToStringlenr    r   r   r   rC   r   byrefr@   r|   valuer}   FfiResponser   r1   r:   )
r6   r   
proto_data	proto_lendataresp_ptrresp_lenr2   	resp_dataresps
             r   requestzFfiClient.request	  s    **,

O	*Z816>>&..13??$22)V\\(3V\\(5K
 '''$$Xx~~>	$$&Y'&!!#r   )r3   rA   rI   )rJ   rK   rL   r   r	   __annotations__r   rB   r7   rN   rR   r}   r~   r]   
FfiRequestr   r   r   r   r   rA   rA      sn    '+Ix$+ 
'*R x	 2 23  9// I4I4I r   rA   )1r   rc   r   
contextlibr   r    importlib.resourcesr#   versionr   r   r   r   r   rT   typingr   r   r   r	   r
   _protor   r}   _utilsr   r   r   r   r'   r   closer   r/   	CFUNCTYPEr   c_uint8r   r   r@   r1   rP   rR   r   r   	ValueTyperM   r   rA   r   r   r   <module>r      sK     
        	    = = ( ( + %% &"& VdNFNN6>>$BFOOT
+ +* CL6wqz 6r $v~~6H%(fnnV^^,%(oo%( 
%( I%(P9--77 HSM $F Fr   