ó
    ‚¤j�   ã                  ó  • S r 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	J
r
Jr  SSKJr  SSKrSSKrSSKJr  SSKJr  SSKJrJr  SS	KJrJrJrJrJrJrJrJ r J!r!J"r"  SS
K#J$r$J%r%  \
 " S S5      5       r&SS jr'SS jr( " S S5      r)g)z»
Lightweight static file server for multi-process Gradio.

Handles file serving, uploads, and static assets in separate processes
to free the main Gradio server for queue/SSE/state work.
é    )ÚannotationsN)Ú	dataclassÚfield)ÚPath)Úutils)ÚMultiPartException)ÚPlainTextResponseÚStreamingResponse)
ÚBUILD_PATH_LIBÚSTATIC_PATH_LIBÚFileUploadProgressÚ FileUploadProgressNotQueuedErrorÚ!FileUploadProgressNotTrackedErrorÚfaviconÚ
file_fetchÚfile_responseÚsecure_url_stream_responseÚ	upload_fn)ÚDeveloperPathÚUserProvidedPathc                  óˆ   • \ rS rSr% SrS\S'   SrS\S'   SrS\S'   \" \	S9r
S\S	'   \" \	S9rS\S
'   SrS\S'   SrS\S'   Srg)ÚStaticServerConfigé+   Ú ÚstrÚ
build_pathÚstatic_pathÚuploaded_file_dir)Údefault_factoryz	list[str]Úallowed_pathsÚblocked_pathsNzint | float | NoneÚmax_file_sizeú
str | NoneÚfavicon_path© )Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   Ú__annotations__r   r   r   Úlistr    r!   r"   r$   Ú__static_attributes__r%   ó    Ú¢C:\Users\johnn\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.13_qbz5n2kfra8p0\LocalCache\local-packages\Python313\site-packages\gradio/static_server.pyr   r   +   sT   ‡ à€J�ÓØ€K�ÓØÐ�sÓÙ$°TÑ:€M�9Ó:Ù$°TÑ:€M�9Ó:Ø(,€MÐ%Ó,Ø#€L�*Ö#r-   r   c                óf  ^ ^^^• SSK Jn  [        R                  " 5       nUR	                  US/S/S/S9  T R
                  mT R                  b  T R                  O[        R                  mUR                  S5      SS j5       nUR                  S5      SS j5       nUR                  S	5      SS
 j5       nUR                  S5      U 4S j5       nUR                  S5      UR                  S5      UR                  S5      UR                  S5      SU U4S jj5       5       5       5       n[        5       mUR                  S5      UR                  S5       S   SUUU4S jjj5       5       nUR                  S5      UR                  S5      SU4S jj5       5       n	UR                  S5      S 5       n
U$ )zOCreate a minimal FastAPI app that only serves static files and handles uploads.r   )ÚCORSMiddlewareÚ*)Úallow_originsÚallow_methodsÚallow_headersz/svelte/{path:path}c              “  ó|   #   • [        [        [        [        5      S-  5      5      n[	        U[        U 5      5      $ 7f)NÚsvelte)r   r   r   r   r   r   )ÚpathÚsvelte_paths     r.   Úsvelte_resourceÚ*create_static_app.<locals>.svelte_resourceF   s1   é € ä#¤C¬¬^Ó(<¸xÑ(GÓ$HÓIˆÜ˜[Ô*:¸4Ó*@ÓAÐAùs   ‚:<z/static/{path:path}c              “  ó<   #   • [        [        [        U 5      5      $ 7f©N)r   r   r   ©r7   s    r.   Ústatic_resourceÚ*create_static_app.<locals>.static_resourceK   s   é € äœ_Ô.>¸tÓ.DÓEÐEùó   ‚z/assets/{path:path}c              “  ó<   #   • [        [        [        U 5      5      $ 7fr<   )r   r   r   r=   s    r.   Úbuild_resourceÚ)create_static_app.<locals>.build_resourceO   s   é € äœ^Ô-=¸dÓ-CÓDÐDùr@   z/favicon.icoc               “  ó6   >#   • [        T R                  5      $ 7fr<   )r   r$   )Úconfigs   €r.   Ú_Úcreate_static_app.<locals>._S   s   øé € ä�v×*Ñ*Ó+Ð+ùs   ƒz#/gradio_api/file={path_or_url:path}z/file={path_or_url:path}c              “  ó†   >#   • [         R                  " U 5      (       a  [        X5      I S h  v•N $ [        XTT5      $  N7fr<   )Úclient_utilsÚis_http_url_liker   r   )Úpath_or_urlÚrequestrE   Ú
upload_dirs     €€r.   ÚfileÚcreate_static_app.<locals>.fileW   s<   øé € ô
 ×(Ò(¨×5Ñ5Ü3°KÓI×IÐIÜ˜+°¸
ÓCÐCñ Jùs   ƒ*A­?®Az/gradio_api/uploadz/uploadc           	   “  óÚ   >#   •  [        U TTUSU(       a  TOS S9I S h  v•N u  n  nU$  N
! [         a2  nSUR                  ;   a  SOSn[        UR                  US9s S nA$ S nAff = f7f)NF)Ú	upload_idÚ
force_moveÚupload_progresszmaximum allowed sizei�  i�  ©Ústatus_code)r   r   Úmessager	   )	rL   rQ   Úoutput_filesrF   ÚexcÚcodeÚfile_upload_statusesr"   rM   s	         €€€r.   Úupload_fileÚ&create_static_app.<locals>.upload_fileb   s|   øé € ð	DÜ'0ØØØØ#Ø Þ8AÑ 4Àtñ(÷ "ÑˆL˜!˜Qð Ðñ"øô "ó 	DØ0°C·K±KÓ?‘3ÀSˆDÜ$ S§[¡[¸dÑCÕCûð	Düs<   ƒA+…, Ÿ* , ¨A+ª, ¬
A(¶'A#ÁA(ÁA+Á#A(Á(A+z/gradio_api/upload_progressz/upload_progressc              “  óò   >^ #   • S	UU 4S jjn [         R                  " TR                  T 5      SS9I S h  v•N   [        U" U5      SS9$  N! [         R                  [        4 a    [	        SSS9s $ f = f7f)
Nc               óÀ  >#   • [         R                  " 5       nSn U R                  5       I S h  v•N (       a  TR                  T5        g U(       a  TR                  T5        g SnSn TR	                  T5      (       a  SS0nSnO+TR                  T5      nSUR                  UR                  S.nS	[        R                  " U5       S
37v •  M´   N ! [         a     g [         at    [        R                  " U5      I S h  v•N    [         R                  " 5       U-
  U:”  a6  SS0nS	[        R                  " U5       S
37v •  [         R                  " 5       n NŒf = f7f)NFTé   gš™™™™™©?ÚmsgÚdoneÚupdate)r`   Ú	orig_nameÚ
chunk_sizezdata: z

Ú	heartbeat)ÚtimeÚperf_counterÚis_disconnectedÚstop_trackingÚis_doneÚpopÚfilenamerd   ÚjsonÚdumpsr   r   ÚasyncioÚsleep)	rL   Úlast_heartbeatrj   Úheartbeat_rateÚ
check_raterV   rb   rZ   rQ   s	          €€r.   Ú
sse_streamÚBcreate_static_app.<locals>.get_upload_progress.<locals>.sse_streamy   sC  øé € Ü!×.Ò.Ó0ˆNØˆGØØ ×0Ñ0Ó2×2Õ2Ø(×6Ñ6°yÔAØÞØ(×6Ñ6°yÔAØà!#�Ø!�
ð=Ø+×3Ñ3°I×>Ñ>Ø#(¨& /˜Ø"&™à!5×!9Ñ!9¸)Ó!D˜à#+Ø)/¯©Ø*0×*;Ñ*;ñ#˜ð
 #¤4§:¢:¨gÓ#6Ð"7°tÐ<Ó<ñ+ Ù2øô* 9ó ÙÜ7ó =Ü!Ÿ-š-¨
Ó3×3Ñ3Ü×(Ò(Ó*¨^Ñ;¸nÓLØ#(¨+Ð"6˜Ø &¤t§z¢z°'Ó':Ð&;¸4Ð@Ó@Ü)-×):Ò):Ó)<˜ùð=üsM   ƒ,E¯C°8EÁ)A%C ÃEÃ
EÃEÃ"EÄ DÄAEÅEÅEÅEé   ©ÚtimeoutzUpload not foundi”  rT   ztext/event-stream)Ú
media_type)rL   úfastapi.Request)ro   Úwait_forÚ
is_trackedÚTimeoutErrorr	   r
   )rQ   rL   rt   rZ   s   `  €r.   Úget_upload_progressÚ.create_static_app.<locals>.get_upload_progressv   s‰   ùé € ÷ 	=ð  	=ðD	JÜ×"Ò"Ø$×/Ñ/°	Ó:ÀAñ÷ ð ô !Ù�wÓØ*ñ
ð 	
ñøô ×$Ñ$¤lÐ3ó 	JÜ$Ð%7ÀSÑIÒIð	Jüs7   „
A7�'A ¶A·A »A7ÁA Á$A4Á1A7Á3A4Á4A7ú/healthc                 ó
   • SS0$ )NÚstatusÚokr%   r%   r-   r.   ÚhealthÚ!create_static_app.<locals>.health§   s   € à˜$ÐÐr-   )r7   r   )rK   r   rL   rz   r<   )rL   rz   rQ   r#   )rQ   r   rL   rz   )Ústarlette.middleware.corsr0   ÚfastapiÚFastAPIÚadd_middlewarer   r"   ÚmathÚinfÚgetÚheadr   Úpost)rE   r0   Úappr9   r>   rB   rF   rN   r[   r~   r„   rZ   r"   rM   s   `          @@@r.   Úcreate_static_appr�   6   sÝ  û€ å8ä
�/Š/Ó
€CØ×ÑØØ�eØ�eØ�eð	 ñ ð ×)Ñ)€Jà &× 4Ñ 4Ñ @ˆ×ÒÄdÇhÁhð ð 	‡W�WÐ"Ó#óBó $ðBð 	‡W�WÐ"Ó#óFó $ðFð 	‡W�WÐ"Ó#óEó $ðEð 	‡W�Wˆ^Óô,ó ð,ð 	‡X�XÐ3Ó4Ø‡W�WÐ2Ó3Ø‡X�XÐ(Ó)Ø‡W�WÐ'Ó(÷Dó )ó *ó 4ó 5ðDô
 .Ó/Ðà‡X�XÐ"Ó#Ø‡X�XˆiÓð !%ðØ ðà÷ñ ó ó $ðð$ 	‡W�WÐ*Ó+Ø‡W�WÐÓ ö-
ó !ó ,ð-
ð^ 	‡W�WˆYÓñ ó ð ð €Jr-   c                ó^   • [        S0 UD6n[        U5      n[        R                  " USU SS9  g)z+Entry point for a static worker subprocess.z	127.0.0.1Úwarning)ÚhostÚportÚ	log_levelNr%   )r   r�   ÚuvicornÚrun)r”   Úconfig_dictrE   r�   s       r.   Ú_run_static_workerr™   ®   s+   € äÑ. +Ñ.€FÜ
˜FÓ
#€CÜ‡K‚K�˜+¨D¸IÓFr-   c                  ó8   • \ rS rSrSrS	S jrS rS
S jrS rSr	g)ÚStaticWorkerPooléµ   z'Manages N static file server processes.c                óf   • Xl         X l        / U l        [        U5      U l        SU l        SU l        g )Nr   F)Únum_workersrE   Úworkersr+   ÚportsÚ_counterÚ_started)Úselfrž   rE   r    s       r.   Ú__init__ÚStaticWorkerPool.__init__¸   s-   € Ø&ÔØŒØBDˆŒÜ˜%“[ˆŒ
ØˆŒØˆ�r-   c                ó¤  • U R                   (       a  gSU l         U R                  R                  U R                  R                  U R                  R                  U R                  R
                  U R                  R                  U R                  R                  b>  U R                  R                  [        R                  :w  a  U R                  R                  OSU R                  R                  S.n[        U R                  5       HO  u  p#[        R                  " [        X14SSU 3S9nUR!                  5         U R"                  R%                  U5        MQ     SSKnU R                   H=  n[)        S5       H+  n UR+                  SU S	3S
S9nUR,                  S:X  a    M9  M-     M?     g! [.         a    [0        R2                  " S5         MW  f = f)z"Spawn all static worker processes.NT)r   r   r   r    r!   r"   r$   zgradio-static-)ÚtargetÚargsÚdaemonÚnamer   é2   úhttp://127.0.0.1:r€   é   rw   éÈ   gš™™™™™¹?)r¢   rE   r   r   r   r    r!   r"   rŠ   r‹   r$   Ú	enumerater    ÚmultiprocessingÚProcessr™   ÚstartrŸ   ÚappendÚhttpxÚrangerŒ   rU   Ú	Exceptionrf   rp   )r£   r˜   Úir”   Úprocessr´   rF   Úrs           r.   r²   ÚStaticWorkerPool.startÀ   sp  € à�=�=ØØˆŒð Ÿ+™+×0Ñ0ØŸ;™;×2Ñ2Ø!%§¡×!>Ñ!>Ø!Ÿ[™[×6Ñ6Ø!Ÿ[™[×6Ñ6à�{‰{×(Ñ(Ñ4Ø—‘×)Ñ)¬T¯X©XÓ5ð "Ÿ[™[×6Ò6ð Ø ŸK™K×4Ñ4ñ
ˆô ! §¡Ö,‰GˆAÜ%×-Ò-Ü)ØÐ(ØØ% a SÐ)ñ	ˆGð �M‰MŒOØ�L‰L×Ñ Ö(ñ -ó 	à—J”JˆDÜ˜2–Y�ð$ØŸ	™	Ð$5°d°V¸7Ð"CÈQ˜	ÐO�AØ—}‘}¨Ó+Úñ ,ó ò øô !ó $Ü—J’J˜s—Oð$ús   Å;$F+Æ+ GÇGc                ó”   • U R                   U R                  [        U R                   5      -     nU =R                  S-  sl        SU 3$ )z&Round-robin to the next static worker.r­   r¬   )r    r¡   Úlen)r£   r”   s     r.   Úget_next_urlÚStaticWorkerPool.get_next_urlé   s<   € à�z‰z˜$Ÿ-™-¬#¨d¯j©j«/Ñ9Ñ:ˆØ�Š˜Ñ�Ø" 4 &Ð)Ð)r-   c                ó  • U R                    H  nUR                  5         M     U R                    H  nUR                  SS9  M     U R                   R                  5         U R                  R                  5         SU l        g)z!Stop all static worker processes.g      à?rw   FN)rŸ   ÚkillÚjoinÚclearr    r¢   )r£   r¸   s     r.   ÚshutdownÚStaticWorkerPool.shutdownï   s\   € à—|”|ˆGØ�L‰LŽNñ $à—|”|ˆGØ�L‰L ˆLÓ%ñ $à�‰×ÑÔØ�
‰
×ÑÔØˆ�r-   )r¡   r¢   rE   rž   r    rŸ   N)rž   ÚintrE   r   r    z	list[int])Úreturnr   )
r&   r'   r(   r)   Ú__doc__r¤   r²   r½   rÃ   r,   r%   r-   r.   r›   r›   µ   s   † Ù1ôò'$ôR*õr-   r›   )rE   r   rÆ   zfastapi.FastAPI)r”   rÅ   r˜   Údict)*rÇ   Ú
__future__r   ro   rm   rŠ   r°   Úmultiprocessing.processrf   Údataclassesr   r   Úpathlibr   r‡   r–   Úgradio_clientr   rI   Ústarlette.formparsersr   Ústarlette.responsesr	   r
   Úgradio.route_utilsr   r   r   r   r   r   r   r   r   r   Úgradio.utilsr   r   r   r�   r™   r›   r%   r-   r.   Ú<module>rÒ      s|   ðñõ #ã Û Û Û Û Û ß (Ý ã Û Ý /Ý 4ß D÷÷ ÷ ÷ð ÷$ð $ó ð$ôuôpG÷Bò Br-   