ó
    ‚¤j‘1  ã                  ó   • S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKrS SKrS SK	r	S SK
Jr  S SKJr  S SKJr  S SKJr  S SKJr  S SKJr  \(       a  S S	KJr  \" \R2                  " S
S5      5      r\" \R2                  " SS5      5      rSr\R2                  " S\R2                  " SS5      5      r        S                 SS jjr\R2                  " S5      SLr\" \ 5      RB                  RE                  SSS5      r#     S                 S S jjr$S!S jr%S"S jr&S#S$S jjr'\4     S%S jjr( S&     S'S jjr)g)(é    )ÚannotationsN)Údeque)ÚTimeoutError)Úclosing)ÚHTTPConnection)ÚPath)ÚTYPE_CHECKING)ÚCallableÚGRADIO_SERVER_PORTÚ7860ÚGRADIO_NODE_NUM_PORTSÚ100g      @ÚGRADIO_NODE_SERVER_NAMEÚGRADIO_SERVER_NAMEú	127.0.0.1c                óT  • U =(       d    [         n U R                  S5      (       a  U R                  S5      (       a  U SS nOU nUb  U/O[        [        [        [
        -   5      n	[        U=(       d    [        R                  " S5      UU	UU=(       d    SU=(       d    / UUS9u  p«X
U4$ )a­  Launches the Node SSR server as a front proxy.

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.
    python_port: the port of the main Python (FastAPI) server that Node will proxy to.
    python_host: the host of the main Python server (default 127.0.0.1).
    static_worker_ports: ports of static file worker processes for round-robin proxying.
    on_shutdown: called when a shutdown signal arrives, before Node is stopped.

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_PATHr   )Ú	node_pathÚserver_nameÚserver_portsÚpython_portÚpython_hostÚstatic_worker_portsÚdebugÚon_shutdown)	ÚLOCALHOST_NAMEÚ
startswithÚendswithÚrangeÚINITIAL_PORT_VALUEÚTRY_NUM_PORTSÚstart_node_processÚosÚgetenv)r   Úserver_portr   r   r   r   r   r   Úhostr   Únode_processÚ	node_ports               Ú C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\gradio/node_server.pyÚstart_node_serverr.   !   s´   € ð6 ×/¤€Kð
 ×Ñ˜c×"Ñ" {×';Ñ';¸C×'@Ñ'@Ø˜1˜RÐ ‰àˆð Ñ"ð 
‰äÔ%Ô'9¼MÑ'IÓJð ô 1Ø×<œrŸyšyÐ);Ó<ØØ!ØØ×. ;Ø/×5°2ØØñ	Ñ€Lð  iÐ/Ð/ó    ÚGRADIO_LOCAL_DEV_MODEÚ	templatesÚnodeÚbuildc                óT  • [         (       a  gU (       d  gS nSn	/ n
SnU GHm  n [        R                  " 5       nUR                  [        R                  [        R                  S5        UR                  X45        UR                  5         Sn[        R                  R                  5       n[        U5      US'   XS'   [         (       a  S	US
'   Ub  [        U5      US'   XNS'   U(       a  SR                  S U 5       5      US'   OUR                  SS 5        [        [        [        5      R                  R!                  SS5      5      n["        R$                  S:X  a  [        U5      R'                  5       n[(        R*                  " U SU[,        /UU(       a  S O[(        R.                  U(       a  S O[(        R0                  S9n[3        SS9nS nUR4                  b6  [6        R8                  " [:        UR4                  U4SS9nUR=                  5         [?        XSS9nU(       a  [A        X‡5        XŒ4s  $ URC                  5         URE                  SS9  Ub  UR                  SS9  SR                  U5      RG                  5       =(       d    U	n	S nGMp     [S        SUS    SUS     S!35        U	(       a7  [S        S"5        [S        S#R                  U	RU                  5       S$S  5      5        OMU(       d;  [W        U
5      S:X  a  [S        S%U
S    S&35        O$[S        S'US    SUS     S!35        O[S        S(5        [S        S)5        g! [H         a    U
RK                  U5         GM@  [L         a?  n[N        RP                  " SU S35        U(       a  URC                  5         S n S nAGMƒ  S nAff = f)*N)Ni”&  )NNÚ Fr   TÚPORTÚHOSTÚ1r0   ÚGRADIO_PYTHON_PORTÚGRADIO_PYTHON_HOSTÚ,c              3  ó8   #   • U  H  n[        U5      v •  M     g 7f©N)Ústr)Ú.0Úps     r-   Ú	<genexpr>Ú%start_node_process.<locals>.<genexpr>Ž   s   é € ð =Ú$7˜q”C˜—F�FÒ$7ùs   ‚ÚGRADIO_STATIC_WORKER_PORTSr1   zregister.mjsÚwin32z--import)ÚenvÚstdoutÚstderré2   )Úmaxlen)ÚtargetÚargsÚdaemoné   ©Útimeouté   z-Unexpected error while starting Node server: z. Trying next port...z2Cannot start Node server on any port in the range r   Ú-r   Ú.zThe Node server reported:Ú
iìÿÿÿzPort ze is already in use. Pass a free `server_port`, or omit it to let Gradio pick the next available port.zNo free port found in range zwPlease install Node 20 or higher and set the environment variable GRADIO_NODE_PATH to the path of your Node executable.z^You can explicitly specify a port by setting the environment variable GRADIO_NODE_SERVER_PORT.),r0   ÚsocketÚ
setsockoptÚ
SOL_SOCKETÚSO_REUSEADDRÚbindÚcloser'   ÚenvironÚcopyr>   ÚjoinÚpopr   Ú__file__ÚparentÚjoinpathÚsysÚplatformÚas_uriÚ
subprocessÚPopenÚSSR_APP_PATHÚDEVNULLÚPIPEr   rG   Ú	threadingÚThreadÚdrain_stderrÚstartÚverify_server_startupÚinstall_shutdown_handlersÚ	terminateÚwaitÚstripÚOSErrorÚappendÚ	ExceptionÚwarningsÚwarnÚprintÚ
splitlinesÚlen)r   r   r   r   r   r   r   r   r+   Únode_errorsÚ
busy_portsÚattempted_startÚportÚsrE   Úregister_fileÚrecent_errorsÚstderr_threadÚ
is_workingÚes                       r-   r&   r&   ^   sƒ  € ÷ ÒØÞØà€Lð €KØ€JØ€Oäˆð[	ô —’“ˆAØ�L‰Lœ×*Ñ*¬F×,?Ñ,?ÀÔCð �F‰F�KÐ&Ô'Ø�G‰GŒIØ"ˆOô —*‘*—/‘/Ó#ˆCÜ˜d›)ˆC�‰KØ%�‰Kß$Ò$Ø/2�Ð+Ñ,ð Ñ&Ü,/°Ó,<�Ð(Ñ)Ø,7Ð(Ñ)Þ"Ø47·H±Hñ =Ù$7ó=ó 5�Ð0Ò1ð —‘Ð4°dÔ;äÜ”X“×%Ñ%×.Ñ.¨{¸NÓKóˆMô �|‰|˜wÓ&Ü $ ]Ó 3× :Ñ :Ó <�ä%×+Ò+Ø˜J¨´|ÐDØÞ$‘t¬*×*<Ñ*<Þ$‘t¬*¯/©/ñ	ˆLô ).°RÑ(8ˆMØ ˆMØ×"Ñ"Ñ.Ü )× 0Ò 0Ü'Ø&×-Ñ-¨}Ð=Øñ!�ð
 ×#Ñ#Ô%ô /¨{È"ÑMˆJÞÜ)¨,ÔDØ#Ð)Ò)ð ×&Ñ&Ô(Ø×!Ñ!¨!Ð!Ñ,ð !Ñ,Ø!×&Ñ&¨qÐ&Ñ1Ø Ÿg™g mÓ4×:Ñ:Ó<×KÀ�Ø#“ña ô~ 
Ø
<¸\È!¹_Ð<MÈQÈ|Ð\^ÑO_ÐN`Ð`aÐbôö ô 	Ð)Ô*Üˆd�i‰i˜×.Ñ.Ó0°°Ð6Ó7Õ8ÞÜˆz‹?˜aÓÜØ˜
 1™�ð 'dð dõô
 Ð0°¸a±Ð0AÀÀ<ÐPRÑCSÐBTÐTUÐVÕWäð Fô	
ô 
Øhôð øôM ó 	Ø×Ñ˜dÔ#ÛÜó 	Ü�MŠMØ?À¸sÐBWÐXôö Ø×&Ñ&Ô(Ø#�Þûð	ús%   ¤H
M È1AM Í N'Í	N'Í(3N"Î"N'c                ó,  •  [        U R                  S5       H"  nUR                  UR                  SSS95        M$      U R                  5         g! [         a     Nf = f! [         a     gf = f!  U R                  5         f ! [         a     f f = f= f)zCReads the Node server's stderr, keeping only the most recent lines.r/   zutf-8Úreplace)ÚerrorsN)ÚiterÚreadliners   Údecodert   rY   )ÚstreamÚbufferÚlines      r-   rk   rk   ð   sŠ   € ð	Ü˜Ÿ™¨#Ö.ˆDØ�M‰M˜$Ÿ+™+ g°i˜+Ð@ÖAñ /ð
	Ø�L‰L�Nøô	 ó Ùðûô
 ó 	Ùð	ûð	Ø�L‰L�NøÜó 	Ùð	ýsX   ‚<A ¿A  Á
AÁA0 ÁAÁA0 Á 
A-Á,A-Á0BÁ2BÂBÂ
BÂBÂBÂBc                ó¼   •  [        [        R                  " X4SS95          SSS5        g! , (       d  f       g= f! [        [        4 a     g[
         a     gf = f)z+Attempts a single connection to the server.r   rN   NTF)r   rT   Úcreate_connectionr   ÚConnectionRefusedErrorrt   )r*   r}   s     r-   Úattempt_connectionr�   þ   sP   € ðÜ”V×-Ò-¨t¨lÀAÑFÕGØ÷ H×GÖGûäÔ0Ð1ó ÙÜó Ùðús)   ‚= ¡,£= ¬
:¶= º= ½AÁ	AÁAc                óŒ  • [         R                   " 5       n[         R                   " 5       U-
  U:  aƒ   [        XSS9nUR                  SS5        UR                  5       nUR	                  5         UR
                  S:  a  g [         R                  " S5        [         R                   " 5       U-
  U:  a  Mƒ  g! [         a     NAf = f)	zªPolls ``HEAD /`` until the server returns a non-5xx status (or the
timeout elapses), confirming it can actually serve requests rather than
just that its TCP port is open.rP   rN   ÚHEADÚ/iô  Tgš™™™™™É?F)Útimer   ÚrequestÚgetresponserY   Ústatusrt   Úsleep)r*   r}   rO   Ú
start_timeÚconnÚresps         r-   rm   rm   	  s§   € ô —’“€JÜ
�)Š)‹+˜
Ñ
" WÓ
,ð	Ü! $°aÑ8ˆDØ�L‰L˜ Ô%Ø×#Ñ#Ó%ˆDØ�J‰JŒLØ�{‰{˜SÓ Øð !ô 	�
Š
�3Œô �)Š)‹+˜
Ñ
" WÕ
,ð øô ó 	Ùð	ús   ³AB6 Â6
CÃCc                ó¸   • U R                  5          U R                  US9  g! [        R                   a#    U R	                  5         U R                  5          gf = f)zGStops the Node server, killing it if it does not exit within `timeout`.rN   N)ro   rp   rd   ÚTimeoutExpiredÚkill)r+   rO   s     r-   Ústop_node_processrŸ     sS   € ð
 ×ÑÔðØ×Ñ 'ÐÒ*øÜ×$Ñ$ó Ø×ÑÔØ×ÑÖðús   ’" ¢4AÁAc                ó²   ^ ^^• SmU UU4S jn[         R                   " [         R                  U5        [         R                   " [         R                  U5        g)z>Stops the Node server when this process is asked to terminate.Fc                ó¨   >• T(       a  g Sm[        S5        Tb   T" 5         [        T5        [        R                  " S5        g ! [         a     N.f = f)NTz
Stopping Node.js server...r   )rw   rt   rŸ   ra   Úexit)Ú_signumÚ_framer+   r   Ústoppings     €€€r-   Úhandle_shutdownÚ2install_shutdown_handlers.<locals>.handle_shutdown0  sT   ø€ ö
 ØØˆÜÐ,Ô-ØÑ"ðÙ”ô
 	˜,Ô'Ü�Š��øô ó ñ ðús   ›A Á
AÁAN)ÚsignalÚSIGTERMÚSIGINT)r+   r   r¦   r¥   s   `` @r-   rn   rn   )  s5   ú€ ð
 €H÷ô& ‡M‚M”&—.‘. /Ô2Ü
‡M‚M”&—-‘- Õ1r/   )NNNNNNFN)r   ú
str | Noner)   ú
int | Noner   r«   r   r¬   r   r«   r   úlist[int] | Noner   Úboolr   úCallable[[], None] | NoneÚreturnz=tuple[str | None, subprocess.Popen[bytes] | None, int | None])Nr   NFN)r   r«   r   r>   r   zlist[int] | ranger   r¬   r   r>   r   r­   r   r®   r   r¯   r°   z1tuple[subprocess.Popen[bytes] | None, int | None])r‹   z
deque[str]r°   ÚNone)r*   r>   r}   Úintr°   r®   )g      .@)r*   r>   r}   r²   rO   Úfloatr°   r®   )r+   úsubprocess.Popen[bytes]rO   r³   r°   r±   r=   )r+   r´   r   r¯   r°   r±   )*Ú
__future__r   r'   r¨   rT   rd   ra   ri   r”   ru   Úcollectionsr   Úconcurrent.futuresr   Ú
contextlibr   Úhttp.clientr   Úpathlibr   Útypingr	   Úcollections.abcr
   r²   r(   r$   r%   ÚNODE_SHUTDOWN_TIMEOUTr    r.   r0   r^   r_   r`   rf   r&   rk   r�   rm   rŸ   rn   © r/   r-   Ú<module>r¿      s  ðÝ "ã 	Û Û Û Û 
Û Û Û Ý Ý +Ý Ý &Ý Ý  æÝ(ñ ˜ŸšÐ#7¸Ó@ÓAÐ Ù�B—I’IÐ5°uÓ=Ó>€ð Ð Ø—’Ø˜rŸyšyÐ)=¸{ÓKó€ð #Ø"Ø Ø"Ø"Ø,0ØØ-1ð60Øð60àð60ð ð60ð ð	60ð
 ð60ð *ð60ð ð60ð +ð60ð Cõ60ðr Ÿ	š	Ð"9Ó:À$ÐFÐ Ù�H‹~×$Ñ$×-Ñ-¨k¸6À7ÓK€ð #Ø"Ø,0ØØ-1ðOØðOàðOð $ðOð ð	Oð
 ðOð *ðOð ðOð +ðOð 7õOôdôöð* +ð
Ø)ð
àð
ð 
õ
ð .2ð2Ø)ð2à*ð2ð 
ö2r/   