o
    j                     @   s|   d dl mZmZ d dlZG dd dZG dd dZG dd dZG d	d
 d
Zd dlm	Z	 de	fddZ
G dd dZdS )    )WSNetworkTCPWSNetworkUDPNc                   @      e Zd ZedddZdS )WSNETNetworkTestFc                    s   ddl m} t }t }t }|| t||||}| I d H \}}	|	d ur,|	t||}
t||}|
 I d H  | I d H  ||
fS )Nr   )WSNetworkTCPTEST)	asysocks.test.wsnettestr   asyncioQueueEventintrunWSNETWriterWSNETReader)hostportwsnet_reuser   	out_queuein_queueclosed_eventclient_errwriterreader r   /root/aizidognhua/tmp/workspace/projects/ec89d86c-575f-41c9-af57-ac45cbdbf775/venv/lib/python3.10/site-packages/asysocks/network/wsnet.pyopen_connection   s   

z WSNETNetworkTest.open_connectionNF__name__
__module____qualname__staticmethodr   r   r   r   r   r   
       r   c                   @   r   )WSNETNetworkFc                    s   t  }t  }t  }t| t||||}| I d H \}}|d ur&|t||}	t||}
|	 I d H  |
 I d H  |
|	fS N)r   r	   r
   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   r      s   

zWSNETNetwork.open_connectionNr   r   r   r   r   r   r$      r#   r$   c                   @   s4   e Zd Zdd Zdd Zdd Zdd Zd	d
 ZdS )r   c                 C   s   || _ || _d S r%   )r   r   )selfr   r   r   r   r   __init__2   s   
zWSNETWriter.__init__c                 C   s   | j | d S r%   )r   
put_nowait)r&   datar   r   r   write6   s   zWSNETWriter.writec                 C   s   | j d  | j  d S r%   )r   r(   r   setr&   r   r   r   close9   s   zWSNETWriter.closec                    s   t dI d H  d S Nr   )r   sleepr,   r   r   r   drain=   s   zWSNETWriter.drainc                    s   d S r%   r   r,   r   r   r   r   A      zWSNETWriter.runN)r   r    r!   r'   r*   r-   r0   r   r   r   r   r   r   1   s    r   c                   @   sP   e Zd Zdd Zdd Zdd Zddd	Zd
d ZdddZdd Z	dd Z
dS )r   c                 C   s6   d | _ || _|| _d| _t | _d | _t | _	d S )N    )
wsnet_reader_typer   r   bufferr   r
   data_in_evtr   Lock
bufferlock)r&   r   r   r   r   r   r'   F   s   
zWSNETReader.__init__c                    s   	 | j  I d H \}| _|d u r| jd u r| j  d S | jd ur>|d ur7|dkr7|  j|j7  _| j  | j  d S |  j|7  _| j  |dkrOnq| j  d S )NTr2   )r   getr   r   r+   r4   r)   r5   )r&   resr   r   r   __handle_inO   s$   




zWSNETReader.__handle_inc                    s&   t |  | _t dI d H  d S r.   )r   create_task_WSNETReader__handle_inhandle_taskr/   r,   r   r   r   r   d   s   zWSNETReader.runc              
      sZ  z| j  r7t| jdkrW dS |dkst| j|k r%| j}d| _|W S | jd | }| j|d  | _|W S | j4 I d H O |dkr^t| jdkrW| j  | j I d H  | j}d| _n#t| jdkrr| j  | j I d H  | jd | }| j|d  | _W d   I d H  |W S 1 I d H sw   Y  |W S  ty } z| j 	   d }~ww )Nr   r2   r>   )
r   is_setlenr4   r7   r5   clearwait	Exceptionr+   r&   ntemper   r   r   readh   sB   



zWSNETReader.readc              
      s"  z}| j  r+t| jdkst| j|k rtd| jd | }| j|d  | _|W S |dk r3td| j4 I d H 7 t| j|k rV| j  | j I d H  t| j|k sB| jd | }| j|d  | _W d   I d H  |W S 1 I d H sww   Y  |W S  ty } z| j 	   d }~ww )Nr   Pipe broken!   z'Readexactly must be a positive integer!)
r   r?   r@   r4   rC   r7   r5   rA   rB   r+   rD   r   r   r   readexactly   s4   

		
zWSNETReader.readexactly   
c              
      s2  z| j  r/| j|dk}|dkrtd|t| }| jd | }| j|d  | _|W S | j4 I d H C | j|dkrT| j  | j	 I d H  | j|dks?| j|t| }| jd | }| j|d  | _W d   I d H  |W S 1 I d H sw   Y  |W S  ty } z| j 
   d }~ww )Nr>   rI   )r   r?   r4   findrC   r@   r7   r5   rA   rB   r+   )r&   	separatorposendrF   rG   r   r   r   	readuntil   s6   

		
zWSNETReader.readuntilc                    s   |  dI d H S )NrL   )rQ   r,   r   r   r   readline   s   zWSNETReader.readlinec                 C   s   | j  ot| jdkS r.   )r   r?   r@   r4   r,   r   r   r   at_eof   s   zWSNETReader.at_eofN)r>   )rL   )r   r    r!   r'   r<   r   rH   rK   rQ   rR   rS   r   r   r   r   r   E   s    	
)
r   )	UniTargettargetc                    sT   t  }t  }t|  | j||dd}| I d H \}}|d ur$|t| ||S )NT)reuse_ws)r   r	   r   get_ip_or_hostnamer   r   WSNETEndpoint)rU   in_qout_q
connectionr   r   r   r   r   create_udp_client   s   r\   c                   @   s   e Zd ZdedejdejfddZdd Zdd	d
ZdddZ	dddZ
dd Zdd Zdd Zdd Zedd Zedd ZdS )rX   rU   r   r   c                 C   s   || _ || _|| _d| _d S )NF)rU   r   r   _closed)r&   rU   r   r   r   r   r   r'      s   
zWSNETEndpoint.__init__c                 C   s,   | j rd S d| _ | jd  | jd  d S NT)r]   r   r(   r   r,   r   r   r   r-      s
   zWSNETEndpoint.closeNc                    s(   |du r| j  | j jf}| ||S )%Send a datagram to the given address.N)rU   rW   r   sendr&   r)   addrr   r   r   r*      s   zWSNETEndpoint.writeFc                 C  sZ   | j s+|  I dH \}}|du r|   dS ||f}|du r#|V  n|V  | j rdS dS nWait for an incoming datagram and return it with
		the corresponding address.
		This method is a coroutine.
		NT)r]   receiver-   )r&   	with_addrr)   rb   resultr   r   r   rH      s   zWSNETEndpoint.readc                    s<   |   I dH \}}|du r|   dS |du r||fS |S rc   )re   r-   )r&   rf   r)   rb   r   r   r   read_one  s   zWSNETEndpoint.read_onec                 C   s"   | j rtd| j||f dS )r_   Enpoint is closedN)r]   IOErrorr   r(   ra   r   r   r   r`     s   zWSNETEndpoint.sendc                    sP   | j  I dH }|du rtd|\}}}|dur||du r$td||fS )rd   Nri   )r   r8   rj   )r&   r9   r)   rb   r   r   r   r   re     s   
zWSNETEndpoint.receivec                 C   s   | j rdS |   dS )z Close the transport immediately.N)r]   r-   r,   r   r   r   abort$  s   zWSNETEndpoint.abortc                    s   dS r^   r   r,   r   r   r   r0   *  r1   zWSNETEndpoint.drainc                 C   s   t  )z-The endpoint address as a (host, port) tuple.)NotImplementedErrorr,   r   r   r   address-     zWSNETEndpoint.addressc                 C   s   | j S )z0Indicates whether the endpoint is closed or not.)r]   r,   r   r   r   closed2  rn   zWSNETEndpoint.closedr%   r   )r   r    r!   rT   r   r	   r'   r-   r*   rH   rh   r`   re   rk   r0   propertyrm   ro   r   r   r   r   rX      s    



rX   )wsnet.pyodide.clientr   r   r   r   r$   r   r   asysocks.unicomm.common.targetrT   r\   rX   r   r   r   r   <module>   s     