a
    &ñ»jŒ  ã                   @  s–   d dl mZ d dlZd dlmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ G d	d
„ d
ƒZdddddœdd„Zdddd
dœdd„ZdS )é    )ÚannotationsN)Úcast)ÚGateway)Ú	ExecModel)ÚHostNotFound)ÚGroup)ÚXSpecc                   @  s~   e Zd ZU ded< dddœdd„Zdd	d
œdd„Zd	ddœdd„Zddœdd„Zddœdd„Zddœdd„Z	ddœdd„Z
dS )ÚSocketIOÚstrÚremoteaddressr   ÚNone)Ú	execmodelÚreturnc              	   C  sb   || _ || _|j}z(| |j|jd¡ | |j|jd¡ W n" tt	fy\   t
j d¡ Y n0 d S )Né   é   z WARNING: cannot set socketoption)Úsockr   ÚsocketÚ
setsockoptÚSOL_IPÚIP_TOSÚSOL_TCPÚTCP_NODELAYÚAttributeErrorÚOSErrorÚsysÚstderrÚwrite)Úselfr   r   r   © r   ú<E:\soccer\ml_env\Lib\site-packages\execnet/gateway_socket.pyÚ__init__   s    zSocketIO.__init__ÚintÚbytes)Únumbytesr   c                 C  s:   d}t |ƒ|k r6| j |t |ƒ ¡}|s,t‚||7 }q|S )z+Read exactly 'bytes' bytes from the socket.ó    )Úlenr   ÚrecvÚEOFError)r   r#   ÚbufÚtr   r   r   Úread   s    
zSocketIO.read)Údatar   c                 C  s   | j  |¡ d S ©N)r   Úsendall)r   r+   r   r   r   r   %   s    zSocketIO.write)r   c                 C  s.   z| j  d¡ W n | jjjy(   Y n0 d S )Nr   ©r   Úshutdownr   r   Úerror©r   r   r   r   Ú
close_read(   s    zSocketIO.close_readc                 C  s.   z| j  d¡ W n | jjjy(   Y n0 d S )Nr   r.   r1   r   r   r   Úclose_write.   s    zSocketIO.close_writec                 C  s   d S r,   r   r1   r   r   r   Úwait4   s    zSocketIO.waitc                 C  s   d S r,   r   r1   r   r   r   Úkill7   s    zSocketIO.killN)Ú__name__Ú
__module__Ú__qualname__Ú__annotations__r    r*   r   r2   r3   r4   r5   r   r   r   r   r	      s   

r	   r   ztuple[str, int] | Noneútuple[str, int])ÚgatewayÚhostportr   c                 C  sh   |du rd\}}n|\}}ddl m} |  |¡}| ||f¡ td| ¡ ƒ\}}|r\|dkr`d}||fS )zVInstantiate a socketserver on the given gateway.

    Returns a host, port tuple.
    N)Ú	localhostr   r   )Úsocketserverr:   z0.0.0.0r=   )Zexecnet.scriptr>   Zremote_execÚsendr   Zreceive)r;   r<   ÚhostÚportr>   ZchannelÚrealhostZrealportr   r   r   Ú	start_via;   s    

rC   r   r   r   )ÚspecÚgroupr   r   c              
   C  sÆ   | j d usJ ‚| jrJ dƒ‚| j}|r8t|| ƒ\}}n| j  d¡\}}t|ƒ}|j }|  |j|j¡}t||ƒ}	d||f |	_	z| 
||f¡ W n0 |j jyÀ }
 ztƒ |
‚W Y d }
~
n
d }
~
0 0 |	S )Nz7socket: specifying python executables not yet supportedú:z%s:%d)r   ÚpythonZ
installviarC   Úsplitr!   ÚAF_INETÚSOCK_STREAMr	   r   ÚconnectÚgaierrorr   )rD   rE   r   Z
gateway_idr@   rA   Zport_strr   r   ÚioÚer   r   r   Ú	create_ioT   s     
rO   )N)Ú
__future__r   r   Útypingr   Zexecnet.gatewayr   Zexecnet.gateway_baser   Zexecnet.gateway_bootstrapr   Zexecnet.multir   Zexecnet.xspecr   r	   rC   rO   r   r   r   r   Ú<module>   s   / ÿ