a
    Ad                     @   s   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 Zdd Zdd Z	d	d
 Z
dd Zdd Zdd Zdd Zdd Zdd Zdd ZdS )    N)startup_timerc                  C   s*   ddl m}  | jr| jS | jr"dS d S d S )Nr   cmd_optsz0.0.0.0)modules.shared_cmd_optionsr   server_namelistenr    r   ?/var/www/html/stable-diffusion-webui/modules/initialize_util.pygradio_server_name
   s    r
   c                  C   s>   dd l } d| jv sd| jv r:| j| _td| jd| _d S )Nr   z.devz+gitz
[\d.]+[\d])torch__version__Z__long_version__researchgroup)r   r   r   r	   fix_torch_version   s    r   c                     sN   ddl  tjdkr$t dr$ j} n j} G  fddd| } |  dS )a  
        The default `asyncio` event loop policy only automatically creates
        event loops in the main threads. Other threads must create event
        loops explicitly or `asyncio.get_event_loop` (and therefore
        `.IOLoop.current`) will fail. Installing this policy allows event
        loops to be created automatically on any thread, matching the
        behavior of Tornado versions prior to 5.0 (or 5.0 on Python 2).
    r   Nwin32WindowsSelectorEventLoopPolicyc                       s(   e Zd ZdZjd fddZ  ZS )z?fix_asyncio_event_loop_policy.<locals>.AnyThreadEventLoopPolicyzEvent loop policy that allows loop creation on any thread.
        Usage::

            asyncio.set_event_loop_policy(AnyThreadEventLoopPolicy())
        )returnc              	      s>   zt   W S  ttfy8   |  }| | | Y S 0 d S N)superget_event_loopRuntimeErrorAssertionErrorZnew_event_loopZset_event_loop)selfZloop	__class__r   r	   r   6   s    
zNfix_asyncio_event_loop_policy.<locals>.AnyThreadEventLoopPolicy.get_event_loop)__name__
__module____qualname____doc__ZAbstractEventLoopr   __classcell__r   asyncior   r	   AnyThreadEventLoopPolicy/   s   r#   )r"   sysplatformhasattrr   ZDefaultEventLoopPolicyZset_event_loop_policy)Z_BasePolicyr#   r   r!   r	   fix_asyncio_event_loop_policy   s    
r'   c                  C   s   ddl m} m} | jj}|dkr$d S d| j_| j| j tj	|rt
d|  t|ddd$}t|}|| W d    n1 s0    Y  td n|rt
d	|  d S )
Nr   )sharedconfig_states z0*** About to restore extension state from file: rzutf-8encodingzrestore extension configz#!!! Config state backup not found: )modulesr(   r)   optsrestore_config_state_fileZsaveZconfig_filenameospathisfileprintopenjsonloadZrestore_extension_configr   record)r(   r)   Zconfig_state_filefZconfig_stater   r   r	   r0   D   s    
(r0   c                  C   s   ddl m}  | jr| jsd S z:tj| js4td tj| jsTtd| j d W n& ty|   d  | _| _td Y n
0 td t	
d d S )	Nr   r   z!Invalid path to TLS keyfile givenzInvalid path to TLS certfile: ''z,TLS setup invalid, running webui without TLSzRunning with TLSZTLS)r   r   tls_keyfiletls_certfiler1   r2   existsr4   	TypeErrorr   r8   r   r   r   r	   validate_tls_optionsX   s    r?   c                  c   s   ddl m}  dd }| jr>| jdD ]}||}|r&|V  q&| jrt| jdddD}| D ]*}| dD ]}||}|rp|V  qpq^W d	   n1 s0    Y  d	S )
z
    Convert the gradio_auth and gradio_auth_path commandline arguments into
    an iterable of (username, password) tuples.
    r   r   c                 S   s    |   } | sd S t| ddS )N:   )striptuplesplit)sr   r   r	   process_credential_liner   s    z6get_gradio_auth_creds.<locals>.process_credential_line,r+   utf8r,   N)r   r   gradio_authrD   gradio_auth_pathr5   	readlinesrB   )r   rF   Zcredfileliner   r   r	   get_gradio_auth_credsk   s    rN   c            
   
   C   s   dd l } dd l}dd |  D }g }t  D ]r\}}|d||d d| d ||D ]>\}}}}	|d| d	| d
|  |	rd|d|		   qdq2t
d| d S )Nr   c                 S   s   i | ]}|j |jqS r   )identname).0thr   r   r	   
<dictcomp>       zdumpstacks.<locals>.<dictcomp>z
# Thread: r*   ()zFile: "z", line z, in z  
)	threading	traceback	enumerater$   _current_framesitemsappendgetextract_stackrB   r4   join)
rX   rY   Zid2namecodeZthreadIdstackfilenamelinenorP   rM   r   r   r	   
dumpstacks   s     re   c                  C   s&   dd } t jds"ttj|  d S )Nc                 S   s(   t d|  d|  t  td d S )NzInterrupted with signal z in r   )r4   re   r1   _exit)sigframer   r   r	   sigint_handler   s    z0configure_sigint_handler.<locals>.sigint_handlerZCOVERAGE_RUN)r1   environr^   signalSIGINT)ri   r   r   r	   configure_sigint_handler   s    rm   c                     s   ddl mmmm} m  ddlm} jj	d|fdddd jj	d	|fd
ddd jj	d|fdddd j	d| j
 j	dj jj	d| fdddd td d S )Nr   )r(   	sd_modelssd_vae
ui_tempdir	sd_hijack)wrap_queued_callZsd_model_checkpointc                      s      S r   )Zreload_model_weightsr   )rn   r   r	   <lambda>   rT   z)configure_opts_onchange.<locals>.<lambda>F)callro   c                      s      S r   Zreload_vae_weightsr   ro   r   r	   rs      rT   Z&sd_vae_overrides_per_model_preferencesc                      s      S r   ru   r   rv   r   r	   rs      rT   Ztemp_dirZgradio_themeZcross_attention_optimizationc                      s    j jS r   )Zmodel_hijackZredo_hijackZsd_modelr   )rq   r(   r   r	   rs      rT   zopts onchange)r.   r(   rn   ro   rp   rq   modules.call_queuerr   r/   ZonchangeZon_tmpdir_changedZreload_gradio_themer   r8   )rp   rr   r   )rq   rn   ro   r(   r	   configure_opts_onchange   s     rx   c                 C   s4   ddl m} d | _| j|dd t|  |   d S )Nr   )GZipMiddlewarei  )Zminimum_size)Zstarlette.middleware.gzipry   Zmiddleware_stackadd_middlewareconfigure_cors_middlewareZbuild_middleware_stack)appry   r   r   r	   setup_middleware   s
    r}   c                 C   sd   ddl m} ddlm} dgdgdd}|jr>|jd|d< |jrN|j|d	< | j|fi | d S )
Nr   )CORSMiddlewarer   *T)Zallow_methodsZallow_headersZallow_credentialsrG   Zallow_originsZallow_origin_regex)Zstarlette.middleware.corsr~   r   r   cors_allow_originsrD   cors_allow_origins_regexrz   )r|   r~   r   Zcors_optionsr   r   r	   r{      s    
r{   )r6   r1   rk   r$   r   modules.timerr   r
   r   r'   r0   r?   rN   re   rm   rx   r}   r{   r   r   r   r	   <module>   s    		(	