o
    di                     @   s,  d dl 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 d dl	m
Z
mZ d dlmZmZ d dlmZmZ eeZG dd dZe Zeeeef Zded	efd
dZded	efddZG dd deZG dd deZG dd deZG dd deZde jd	dfddZ de j!d	efddZ"dS )    N)ABCabstractmethod)OptionalUnion)RTCIceCandidateRTCSessionDescription)candidate_from_sdpcandidate_to_sdpc                   @   s   e Zd ZdS )SignalingByeN)__name__
__module____qualname__ r   r   L/home/ubuntu/.local/lib/python3.10/site-packages/aiortc/contrib/signaling.pyr
      s    r
   message_strreturnc                 C   s|   t | }|d dv rtd	i |S |d dkr4|d r4t|d ddd }|d |_|d |_|S |d dks<J tS )
Ntype)answeroffer	candidate:   idlabelbyer   )jsonloadsr   r   splitsdpMidsdpMLineIndexBYE)r   messager   r   r   r   object_from_string   s   


r"   objc                 C   sb   t | tr| j| jd}nt | tr dt|  | j| jdd}n
| tu s&J ddi}t	j
|ddS )	N)sdpr   z
candidate:r   )r   r   r   r   r   r   T)	sort_keys)
isinstancer   r$   r   r   r	   r   r   r    r   dumps)r#   r!   r   r   r   object_to_string'   s   


r(   c                   @   sT   e Zd ZedddZedddZededdfdd	Zedee fd
dZ	dS )BaseSignalingr   Nc                       d S Nr   selfr   r   r   connect9      zBaseSignaling.connectc                    r*   r+   r   r,   r   r   r   close<   r/   zBaseSignaling.closedescrc                    r*   r+   r   r-   r1   r   r   r   send?   r/   zBaseSignaling.sendc                    r*   r+   r   r,   r   r   r   receiveB   r/   zBaseSignaling.receiver   N)
r   r   r   r   r.   r0   _SignalingObjectr3   r   r4   r   r   r   r   r)   8   s    r)   c                   @   sN   e Zd ZdddZdddZdddZdee fd	d
ZdeddfddZ	dS )CopyAndPasteSignalingr   Nc                 C   s    t j| _d | _d | _t j| _d S r+   )sysstdin
_read_pipe_read_transport_readerstdout_write_piper,   r   r   r   __init__G   s   zCopyAndPasteSignaling.__init__c                    s>   t  }t j|d _| fdd jI d H \ _}d S )N)loopc                      s   t  jS r+   )asyncioStreamReaderProtocolr<   r   r,   r   r   <lambda>Q   s    z/CopyAndPasteSignaling.connect.<locals>.<lambda>)rA   get_event_loopStreamReaderr<   connect_read_piper:   r;   )r-   r@   _r   r,   r   r.   M   s   zCopyAndPasteSignaling.connectc                    s4   | j d ur| tI d H  | j  d | _ d S d S r+   )r<   r3   r    r;   r0   r,   r   r   r   r0   T   s   


zCopyAndPasteSignaling.closec                    s2   t d | j I d H }t   t|| jjS )Nz.-- Please enter a message from remote party --)printr<   readliner"   decoder:   encodingr-   datar   r   r   r4   Z   s
   zCopyAndPasteSignaling.receiver1   c                    s2   t d | jt|d  | j  t   d S )Nz2-- Please send this message to the remote party --
)rH   r>   writer(   flushr2   r   r   r   r3   `   s
   

zCopyAndPasteSignaling.sendr5   )
r   r   r   r?   r.   r0   r   r6   r4   r3   r   r   r   r   r7   F   s    


r7   c                   @   sl   e Zd ZdededdfddZdddZd	eddfd
dZdddZ	de
e fddZdeddfddZdS )TcpSocketSignalinghostportr   Nc                 C   s"   || _ || _d | _d | _d | _d S r+   )_host_port_serverr<   _writer)r-   rR   rS   r   r   r   r?   h   s
   
zTcpSocketSignaling.__init__c                    r*   r+   r   r,   r   r   r   r.   o   r/   zTcpSocketSignaling.connectserverc                    s   j d urd S |r5t  dtjdtjdd f fdd}tj|jjdI d H _ 	 I d H  d S tj
jjdI d H \__ d S )Nreaderwriterr   c                       | _ |_   d S r+   r<   rW   setrY   rZ   	connectedr-   r   r   client_connectedy      z5TcpSocketSignaling._connect.<locals>.client_connected)rR   rS   )rW   rA   EventrE   StreamWriterstart_serverrT   rU   rV   waitopen_connectionr<   r-   rX   ra   r   r_   r   _connectr   s&   

zTcpSocketSignaling._connectc                    sT   | j d ur| tI d H  | j   d | _d | _ | jd ur(| j  d | _d S d S r+   )rW   r3   r    r0   r<   rV   r,   r   r   r   r0      s   




zTcpSocketSignaling.closec                    L   |  dI d H  z
| j I d H }W n tjy   Y d S w t|dS NFutf8ri   r<   	readuntilrA   IncompleteReadErrorr"   rJ   rL   r   r   r   r4         zTcpSocketSignaling.receiver1   c                    4   |  dI d H  t|d}| j|d  d S NTrl      
ri   r(   encoderW   rO   r-   r1   rM   r   r   r   r3         zTcpSocketSignaling.sendr5   )r   r   r   strintr?   r.   boolri   r0   r   r6   r4   r3   r   r   r   r   rQ   g   s    


rQ   c                   @   sh   e Zd ZdeddfddZdddZdeddfd	d
ZdddZde	e
 fddZde
ddfddZdS )UnixSocketSignalingpathr   Nc                 C   s   || _ d | _d | _d | _d S r+   )_pathrV   r<   rW   )r-   r|   r   r   r   r?      s   
zUnixSocketSignaling.__init__c                    r*   r+   r   r,   r   r   r   r.      r/   zUnixSocketSignaling.connectrX   c                    s   j d urd S |r3t  dtjdtjdd f fdd}tj|jdI d H _  I d H  d S t	jI d H \_
_ d S )NrY   rZ   r   c                    r[   r+   r\   r^   r_   r   r   ra      rb   z6UnixSocketSignaling._connect.<locals>.client_connected)r|   )rW   rA   rc   rE   rd   start_unix_serverr}   rV   rf   open_unix_connectionr<   rh   r   r_   r   ri      s"   
zUnixSocketSignaling._connectc                    sn   | j d ur| tI d H  | j   d | _d | _ | jd ur3| j  d | _tjdk r5t	| j
 d S d S d S )N)      )rW   r3   r    r0   r<   rV   r8   version_infoosunlinkr}   r,   r   r   r   r0      s   




zUnixSocketSignaling.closec                    rj   rk   rm   rL   r   r   r   r4      rp   zUnixSocketSignaling.receiver1   c                    rq   rr   rt   rv   r   r   r   r3      rw   zUnixSocketSignaling.sendr5   )r   r   r   rx   r?   r.   rz   ri   r0   r   r6   r4   r3   r   r   r   r   r{      s    

r{   parserc                 C   sH   | j ddg dd | j dddd | j d	d
dd | j dddd dS )zG
    Add signaling method arguments to an argparse.ArgumentParser.
    z--signalingz-s)zcopy-and-paste
tcp-socketunix-socket)choicesz--signaling-hostz	127.0.0.1z Signaling host (tcp-socket only))defaulthelpz--signaling-porti  z Signaling port (tcp-socket only)z--signaling-pathzaiortc.socketz(Signaling socket path (unix-socket only)N)add_argument)r   r   r   r   add_signaling_arguments   s    
r   argsc                 C   s2   | j dkrt| j| jS | j dkrt| jS t S )zD
    Create a signaling method based on command-line arguments.
    r   r   )	signalingrQ   signaling_hostsignaling_portr{   signaling_pathr7   )r   r   r   r   create_signaling   s
   


r   )#argparserA   r   loggingr   r8   abcr   r   typingr   r   aiortcr   r   
aiortc.sdpr   r	   	getLoggerr   loggerr
   r    r6   rx   r"   r(   r)   r7   rQ   r{   ArgumentParserr   	Namespacer   r   r   r   r   <module>   s,    
!:;