o
    ٷi                     @  s  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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 er=	 eeddZeed	d
ZededdZ			d0d1ddZedduZeejdddZd2dd Zd3d%d&Zd4d5d*d+Zd6d.d/ZdS )7    )annotationsN)TimeoutError)closing)Path)TYPE_CHECKINGGRADIO_SERVER_PORT7860GRADIO_NODE_NUM_PORTS100GRADIO_NODE_SERVER_NAMEGRADIO_SERVER_NAMEz	127.0.0.1server_name
str | Noneserver_port
int | None	node_pathreturn=tuple[str | None, subprocess.Popen[bytes] | None, int | None]c                 C  sx   | pt } | dr| dr| dd }n| }|dur|gn
ttd td t }t|p0td||d\}}| ||fS )a  Launches a local server running the provided Interface
    Parameters:
        server_name: to make app accessible on local network, set this to "0.0.0.0". Can be set by environment variable GRADIO_SERVER_NAME.
        server_port: will start gradio app on this port (if available). Can be set by environment variable GRADIO_SERVER_PORT.
        node_path: the path to the node executable. Can be set by environment variable GRADIO_NODE_PATH.
        ssr_mode: If False, will not start the node server and will serve the SPA from the Python server

    Returns:
        server_name: the name of the server (default is "localhost")
        node_process: the node process that is running the SSR app
        node_port: the port the node server is running on
    []   NGRADIO_NODE_PATH)r   r   server_ports)	LOCALHOST_NAME
startswithendswithrangeINITIAL_PORT_VALUETRY_NUM_PORTSstart_node_processosgetenv)r   r   r   hostr   node_process	node_port r&   F/home/ubuntu/.local/lib/python3.10/site-packages/gradio/node_server.pystart_node_server   s   

r(   GRADIO_LOCAL_DEV_MODE	templatesnodebuildstrr   list[int] | range1tuple[subprocess.Popen[bytes] | None, int | None]c           	        s  t rdS | sdS d  |D ]}zt }|tjtjd |||f |  tj}t	||d< ||d< t r:d|d< t	t
tjdd	}tjd
krNd| }tj| d|tgtj|d t||dd}|rttj fdd ttj fdd  |fW   S     jdd d  W q ty   Y q ty } ztd| d  r   d  W Y d }~qd }~ww td|d  d|d  d td td dS )N)Ni&  )NNr   PORTHOST1r)   r*   zregister.mjswin32zfile://z--import)stdoutenv   timeoutc                      t  S Nhandle_sigterm___r$   r&   r'   <lambda>y       z$start_node_process.<locals>.<lambda>c                   r9   r:   r;   r=   r@   r&   r'   rA   {   rB      z-Unexpected error while starting Node server: z. Trying next port...z2Cannot start Node server on any port in the range r   -r   .zwPlease install Node 20 or higher and set the environment variable GRADIO_NODE_PATH to the path of your Node executable.zWYou can explicitly specify a port by setting the environment variable GRADIO_NODE_PORT.)r)   socket
setsockopt
SOL_SOCKETSO_REUSEADDRbindcloser!   environr-   r   __file__parentjoinpathsysplatform
subprocessPopenSSR_APP_PATHDEVNULLverify_server_startupsignalSIGTERMSIGINT	terminatewaitOSError	Exceptionwarningswarnprint)	r   r   r   portsr5   register_file
is_workinger&   r@   r'   r    J   st   



r    r#   ra   intboolc              	   C  sn   z!t tj| |fdd 	 W d   W dS 1 sw   Y  W dS  ttfy-   Y dS  ty6   Y dS w )z+Attempts a single connection to the server.r   r7   NTF)r   rF   create_connectionr   ConnectionRefusedErrorr]   )r#   ra   r&   r&   r'   attempt_connection   s   (rj         @r8   floatc              	   C  s   t   }t   | |k rCztj| |fdd 	 W d   W dS 1 s$w   Y  W n ttfy:   t d Y nw t   | |k sdS )z@Verifies if a server is up and running by attempting to connect.r   r7   NTg?F)timerF   rh   r   r\   sleep)r#   ra   r8   
start_timer&   r&   r'   rV      s   &rV   r$   subprocess.Popen[bytes] | Nonec                 C  s2   | d urt d |   |   td d S d S )Nz
Stopping Node.js server...r   )r`   rZ   r[   rP   exitr@   r&   r&   r'   r<      s   r<   )NNN)r   r   r   r   r   r   r   r   )r   r   r   r-   r   r.   r   r/   )r#   r-   ra   rf   r   rg   )rk   )r#   r-   ra   rf   r8   rl   r   rg   )r$   rp   ) 
__future__r   r!   rW   rF   rR   rP   rm   r^   concurrent.futuresr   
contextlibr   pathlibr   typingr   rf   r"   r   r   r   r(   r)   rM   rN   rO   rT   r    rj   rV   r<   r&   r&   r&   r'   <module>   s:    +

T