
    ;3h                       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j$                  dd            Z e ej$                  d	d
            Z ej$                  d ej$                  dd            Z	 	 	 d	 	 	 	 	 	 	 ddZ ej$                  d      duZ ee      j2                  j5                  ddd      Z	 	 	 	 	 	 	 	 ddZddZdddZddZy)    )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.1c                   | xs t         } | j                  d      r| j                  d      r| dd }n| }||gn t        t        dz   t        dz   t
        z         }t        |xs t        j                  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
    []   GRADIO_NODE_PATH)	node_pathserver_nameserver_ports)	LOCALHOST_NAME
startswithendswithrangeINITIAL_PORT_VALUETRY_NUM_PORTSstart_node_processosgetenv)r   server_portr   hostr   node_process	node_ports          R/var/www/html/audio-gradio/venv/lib/python3.12/site-packages/gradio/node_server.pystart_node_serverr%      s    $ /K
 c"{';';C'@1R  " 
%)+=+AM+QR  1<ryy);<!L) i//    GRADIO_LOCAL_DEV_MODE	templatesnodebuildc                T  	 t         ry| syd 	|D ]  }	 t        j                         }|j                  t        j                  t        j                  d       |j                  ||f       |j                          t        j                  }t        |      |d<   ||d<   t         rd|d<   t        t        t              j                  j                  dd	            }t        j                  d
k(  rd|z   }t!        j"                  | d|t$        gt         j&                  |      	t)        ||d      }|rTt+        j*                  t*        j,                  	fd       t+        j*                  t*        j.                  	fd       	|fc S 	j1                          	j3                  d       d 	 t=        d|d    d|d    d       t=        d       t=        d       y# t4        $ r Y t6        $ r8}t9        j:                  d| d       	r	j1                          d 	Y d }~d }~ww xY w)N)Ni&  )NNr   PORTHOST1r'   r(   zregister.mjswin32zfile://z--import)stdoutenv   timeoutc                    t              S Nhandle_sigterm___r"   s     r$   <lambda>z$start_node_process.<locals>.<lambda>y   s    .2N r&   c                    t              S r6   r7   r9   s     r$   r<   z$start_node_process.<locals>.<lambda>{   s    >,;W r&      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   environstrr   __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sr1   register_file
is_workinger"   s
            @r$   r   r   J   s   
 L 87	 ALL**F,?,?C FFK&'GGI **Cd)CK%CK$/2+,X%%..{NKM ||w& )M 9%++J|D!))L /{D!LJNN$N fmm-WX#T)) &&(!!!!,#[8v 

<\!_<MQ|\^O_N``ab 
 	B 
a -  	 	MM?sBWX &&(#	s$   E-G$G	H''H'/-H""H'c                    	 t        t        j                  | |fd            5  	 ddd       y# 1 sw Y   yxY w# t        t        f$ r Y yt
        $ r Y yw xY w)z+Attempts a single connection to the server.r   r3   NTF)r   rA   create_connectionr   ConnectionRefusedErrorrY   )r!   r]   s     r$   attempt_connectionre      sZ    V--tTlAFG 		 	 	01  s)   "; /; 8; ; AAAc                P   t        j                          }t        j                          |z
  |k  r%	 t        j                  | |fd      5  	 ddd       yy# 1 sw Y   nxY wn*# t        t        f$ r t        j
                  d       Y nw xY wt        j                          |z
  |k  rxT)z@Verifies if a server is up and running by attempting to connect.r   r3   NTg?F)timerA   rc   r   rX   sleep)r!   r]   r4   
start_times       r$   rR   rR      s    J
))+

"W
,	))4,B   	  g& 	JJsO		 ))+

"W
,s)   A" 	AA" AA" "$B	B	c                    | At        d       | j                          | j                          t        j                  d       y y )Nz
Stopping Node.js server...r   )r\   rV   rW   rL   exit)r"   s    r$   r8   r8      s9    ,- 	  r&   )NNN)r   
str | Noner    z
int | Noner   rl   returnz=tuple[str | None, subprocess.Popen[bytes] | None, int | None])r   rl   r   rH   r   zlist[int] | rangerm   z1tuple[subprocess.Popen[bytes] | None, int | None])r!   rH   r]   intrm   bool)g      @)r!   rH   r]   rn   r4   floatrm   ro   )r"   zsubprocess.Popen[bytes] | None) 
__future__r   r   rS   rA   rN   rL   rg   rZ   concurrent.futuresr   
contextlibr   pathlibr   typingr   rn   r   r   r   r   r%   r'   rI   rJ   rK   rP   r   re   rR   r8    r&   r$   <module>rw      s0   " 	    
   +     #7@A IBII5u=>yryy)={K #" (0(0(0 (0 C	(0V "		"9:$F H~$$--k67KQQQ $Q 7	Qh	r&   