o
    diX.                     @   s.  d dl Z d dlZd dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
mZ d dlmZ ddlmZ ddlmZ ed	Zed
ZeeZeG dd dZeG dd dZde	defddZdede	fddZdee deeef fddZdedeeef fddZ G dd deZ!G dd deZ"dS )    N)	dataclass)AnyOptional)	Candidate
ConnectionConnectionClosed)AsyncIOEventEmitter   )InvalidStateErrorRTCIceServerz^(?P<scheme>stun|stuns)\:(?P<host>[^?:]+)(\:(?P<port>[0-9]+?))?(\?transport=(?P<transport>.*))?z^(?P<scheme>turn|turns)\:(?P<host>[^?:]+)(\:(?P<port>[0-9]+?))?(\?transport=(?P<transport>.*))?c                   @   s   e Zd ZU dZeed< eed< eed< eed< eed< eed< eed< d	Zee ed
< d	Z	ee ed< d	Z
ee ed< d	Zee ed< d	Zee ed< d	S )RTCIceCandidatez
    The :class:`RTCIceCandidate` interface represents a candidate Interactive
    Connectivity Establishment (ICE) configuration which may be used to
    establish an RTCPeerConnection.
    	component
foundationipportpriorityprotocoltypeNrelatedAddressrelatedPortsdpMidsdpMLineIndextcpType)__name__
__module____qualname____doc__int__annotations__strr   r   r   r   r   r    r!   r!   J/home/ubuntu/.local/lib/python3.10/site-packages/aiortc/rtcicetransport.pyr      s   
 r   c                   @   sB   e Zd ZU dZdZee ed< 	 dZee ed< 	 dZ	e
ed< dS )RTCIceParametersz
    The :class:`RTCIceParameters` dictionary includes the ICE username
    fragment and password and other ICE-related parameters.
    NusernameFragmentpasswordFiceLite)r   r   r   r   r$   r   r    r   r%   r&   boolr!   r!   r!   r"   r#   2   s   
 r#   xreturnc                 C   0   t | j| j| j| j| j| j| j| j| j	| j
d
S )N)
r   r   r   r   r   r   r   r   r   r   )r   r   r   hostr   r   	transportrelated_addressrelated_porttcptyper   r(   r!   r!   r"   candidate_from_aioiceB      r1   c                 C   r*   )N)
r   r   r+   r   r   r-   r.   r,   r/   r   )r   r   r   r   r   r   r   r   r   r   r   r0   r!   r!   r"   candidate_to_aioiceQ   r2   r3   serversc                 C   s  i }| D ]|}t |jtr|j}n|jg}|D ]i}t|}|d dkr2d|v r'q|d |d f|d< q|d dv rd|v r=q|d dkrJ|d	 d
vrJq|d dkrW|d	 dkrWq|jdkr]q|d |d f|d< |d dk|d< |d	 |d< |j|d< |j|d< qq|S )Nschemestunstun_serverr+   r   )turnturnsturn_serverr8   r,   )udptcpr9   r<   r%   turn_sslturn_transportturn_usernameturn_password)
isinstanceurlslistparse_stun_turn_uricredentialTypeusername
credential)r4   kwargsserverurisuriparsedr!   r!   r"   connection_kwargs`   s8   


!rM   rK   c                 C   s   |  drt| }n|  drt| }ntd|s td| }|d r1t|d |d< n|d dv r<d|d< nd	|d< |d dkrP|d
 sPd|d
< |S |d dkr`|d
 s`d|d
< |S |d dv ry|d
 d urvtd|d  d |d
= |S )Nr6   r8   zmalformed uri: invalid schemezmalformed urir   r5   )stunsr9   i  i  r,   r;   r9   r<   )r6   rN   zmalformed uri: z must not contain transport)
startswith
STUN_REGEX	fullmatch
TURN_REGEX
ValueError	groupdictr   )rK   matchrL   r!   r!   r"   rD      s4   



rD   c                	       s   e Zd ZdZ			ddeee  dee dee ddf fddZe	defd	d
Z
dddZedee fddZdee fddZdefddZdeddfddZ  ZS )RTCIceGathererz
    The :class:`RTCIceGatherer` interface gathers local host, server reflexive
    and relay candidates, as well as enabling the retrieval of local
    Interactive Connectivity Establishment (ICE) parameters which can be
    exchanged in signaling.
    N
iceServerslocal_usernamelocal_passwordr)   c                    sF   t    |d u r|  }t|}tdddi|| _d| _d| _d S )Nice_controllingFnewr!   )super__init__getDefaultIceServersrM   r   _connection_remote_candidates_end_RTCIceGatherer__state)selfrW   rX   rY   
ice_kwargs	__class__r!   r"   r]      s   

zRTCIceGatherer.__init__c                 C      | j S )z8
        The current state of the ICE gatherer.
        )ra   rb   r!   r!   r"   state      zRTCIceGatherer.statec                    s8   | j dkr| d | j I dH  | d dS dS )z(
        Gather ICE candidates.
        r[   	gatheringN	completed)ra   _RTCIceGatherer__setStater_   gather_candidatesrg   r!   r!   r"   gather   s   

zRTCIceGatherer.gatherc                 C   s
   t dgS )zC
        Return the list of default :class:`RTCIceServer`.
        zstun:stun.l.google.com:19302r   )clsr!   r!   r"   r^      s   
z#RTCIceGatherer.getDefaultIceServersc                 C      dd | j jD S )zg
        Retrieve the list of valid local candidates associated with the ICE
        gatherer.
        c                 S      g | ]}t |qS r!   r1   .0r(   r!   r!   r"   
<listcomp>       z5RTCIceGatherer.getLocalCandidates.<locals>.<listcomp>)r_   local_candidatesrg   r!   r!   r"   getLocalCandidates      z!RTCIceGatherer.getLocalCandidatesc                 C   s   t | jj| jjdS )zd
        Retrieve the ICE parameters of the ICE gatherer.

        :rtype: RTCIceParameters
        )r$   r%   )r#   r_   rX   rY   rg   r!   r!   r"   getLocalParameters   s   z!RTCIceGatherer.getLocalParametersrh   c                 C   s   || _ | d d S )Nstatechange)ra   emitrb   rh   r!   r!   r"   
__setState   s   zRTCIceGatherer.__setState)NNNr)   N)r   r   r   r   r   rC   r   r    r]   propertyrh   rn   classmethodr^   r   rx   r#   rz   rl   __classcell__r!   r!   rd   r"   rV      s,    	

	rV   c                       s   e Zd ZdZdeddf fddZedefddZedefd	d
Z	edefddZ
dee ddfddZdee fddZdeddfddZd ddZd ddZdededdfddZdeddfddZ  ZS )!RTCIceTransporta  
    The :class:`RTCIceTransport` interface allows an application access to
    information about the Interactive Connectivity Establishment (ICE)
    transport over which packets are sent and received.

    :param gatherer: An :class:`RTCIceGatherer`.
    gathererr)   Nc                    sH   t    || _d | _d | _d| _|j| _d| _| jj| _	| jj
| _d S )Nr[   F)r\   r]   _RTCIceTransport__iceGatherer_RTCIceTransport__monitor_task_RTCIceTransport__start_RTCIceTransport__stater_   	_role_setrecv_recvsend_send)rb   r   rd   r!   r"   r]      s   

zRTCIceTransport.__init__c                 C   rf   )z=
        The ICE gatherer passed in the constructor.
        )r   rg   r!   r!   r"   iceGatherer  ri   zRTCIceTransport.iceGathererc                 C   s   | j jrdS dS )zk
        The current role of the ICE transport.

        Either `'controlling'` or `'controlled'`.
        controlling
controlled)r_   rZ   rg   r!   r!   r"   role  s   zRTCIceTransport.rolec                 C   rf   )z9
        The current state of the ICE transport.
        )r   rg   r!   r!   r"   rh     ri   zRTCIceTransport.state	candidatec                    sN   | j js%|du rd| j _| jdI dH  dS | jt|I dH  dS dS )z}
        Add a remote candidate.

        :param candidate: The new candidate or `None` to signal end of candidates.
        NT)r   r`   r_   add_remote_candidater3   )rb   r   r!   r!   r"   addRemoteCandidate&  s   z"RTCIceTransport.addRemoteCandidatec                 C   rp   )zn
        Retrieve the list of candidates associated with the remote
        :class:`RTCIceTransport`.
        c                 S   rq   r!   rr   rs   r!   r!   r"   ru   :  rv   z7RTCIceTransport.getRemoteCandidates.<locals>.<listcomp>)r_   remote_candidatesrg   r!   r!   r"   getRemoteCandidates5  ry   z#RTCIceTransport.getRemoteCandidatesremoteParametersc                    s   | j dkr
td| jdur| j I dH  dS t | _t|  | _| 	d |j
| j_|j| j_|j| j_z
| j I dH  W n tyR   | 	d Y nw | 	d | j  dS )z
        Initiate connectivity checks.

        :param remoteParameters: The :class:`RTCIceParameters` associated with
                                  the remote :class:`RTCIceTransport`.
        closedzRTCIceTransport is closedNcheckingfailedrk   )rh   r
   r   waitasyncioEventensure_future_monitorr   _RTCIceTransport__setStater&   r_   remote_is_liter$   remote_usernamer%   remote_passwordconnectConnectionErrorset)rb   r   r!   r!   r"   start<  s&   







zRTCIceTransport.startc                    sN   | j dkr#| d | j I dH  | jdur%| jI dH  d| _dS dS dS )zA
        Irreversibly stop the :class:`RTCIceTransport`.
        r   N)rh   r   r_   closer   rg   r!   r!   r"   stopY  s   



zRTCIceTransport.stopc                    s8   	 | j  I d H }t|tr| jdkr| d d S q)NTrk   r   )r_   	get_eventrA   r   rh   r   )rb   eventr!   r!   r"   r   d  s   


zRTCIceTransport._monitormsgargsc                 G   s    t jd| | jg|R   d S )NzRTCIceTransport(%s) )loggerdebugr   )rb   r   r   r!   r!   r"   __log_debugl  s    zRTCIceTransport.__log_debugrh   c                 C   sP   || j kr$| d| j | || _ | d |dkr&| j  |   d S d S d S )Nz
- %s -> %sr{   r   )r   _RTCIceTransport__log_debugr|   r   remove_all_listenersr}   r!   r!   r"   r~   o  s   


zRTCIceTransport.__setStater   )r   r   r   r   rV   r]   r   r   r    r   rh   r   r   r   rC   r   r#   r   r   r   objectr   r   r   r!   r!   rd   r"   r      s     

r   )#r   loggingredataclassesr   typingr   r   aioicer   r   r   pyee.asyncior   
exceptionsr
   rtcconfigurationr   compilerP   rR   	getLoggerr   r   r   r#   r1   r3   rC   dictr    rM   rD   rV   r   r!   r!   r!   r"   <module>   s4    
-#F