o
    iW                     @   sj  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Zd dlm	Z	m
Z
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Zd dlmZmZ d dlmZ d dlmZ d dlZd dlmZ d dlZd dlZd dlm Z  d dl!Z"d dl#Z"d dl$m%Z% d dl&Z&d d	l'm(Z( d d
l)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z? d dl@mAZAmBZB d dlCmDZD d dlEmFZF d dlGmHZH e jIrd dlJZJdeKdeKfddZLdd ZMeN ZOejPdejQfd d!ZRejPdejQfd"d#ZSd$eTfd%d&ZUd'd( ZVd)d* ZWd+d, ZXG d-d. d.ZYdS )/    N)	JobStatusget_jobget_all_jobs)ImageImageOps)PngInfo)BytesIO)web)args)feature_flags)__version__)FrontendManagerparse_version)_ComfyNodeInternal)asset_seeder)register_assets_routes)register_file_in_place)resolve_hash_to_path)UserManager)ModelFileManager)CustomNodeManager)SubgraphManager)NodeReplaceManager)OptionalUnion)InternalRoutes)BinaryEventTypes)cache_controlqueuereturnc                 C   s   dd | D S )z7Remove sensitive data (index 5) from queue item tuples.c                 S   s   g | ]}|d d qS )N    ).0itemr!   r!   $/mnt/c/Users/fbmor/ComfyUI/server.py
<listcomp>;   s    z0_remove_sensitive_from_queue.<locals>.<listcomp>r!   )r   r!   r!   r$   _remove_sensitive_from_queue9   s   r&   c                    s\   z
| |I d H  W d S  t jt jtttfy- } ztd| W Y d }~d S d }~ww )Nzsend error: {})	aiohttpClientErrorClientPayloadErrorConnectionResetErrorBrokenPipeErrorConnectionErrorloggingwarningformat)functionmessageerrr!   r!   r$   send_socket_catch_exception>   s   r3   requestc                    sR   | j }|ds|dr |tvr t| td| d || I dH }|S )z6Middleware to warn about deprecated frontend API pathsz/scripts/uiz/extensions/core/z@[DEPRECATION WARNING] Detected import of deprecated legacy API: z. This is likely caused by a custom node extension using outdated APIs. Please update your extensions or contact the extension author for an updated version.N)path
startswith_deprecated_paths_warnedaddr-   r.   )r4   handlerr5   responser!   r!   r$   deprecation_warningG   s   

r;   c                    sV   | j dd}|| I d H }t|tjs|S |jdvr|S |jr)d|v r)|  |S )NzAccept-Encoding )zapplication/jsonz
text/plaingzip)headersget
isinstancer	   Responsecontent_typebodyenable_compression)r4   r9   accept_encodingr:   r!   r!   r$   compress_bodyZ   s   
rF   allowed_originc                    s   t jdt jf fdd}|S )Nr4   c                    sP   | j dkrt }n|| I d H } |jd< d|jd< d|jd< d|jd< |S )	NOPTIONSzAccess-Control-Allow-Originz&POST, GET, DELETE, PUT, OPTIONS, PATCHzAccess-Control-Allow-MethodszContent-Type, AuthorizationzAccess-Control-Allow-Headerstruez Access-Control-Allow-Credentialsmethodr	   rA   r>   r4   r9   r:   rG   r!   r$   cors_middlewareh   s   





z/create_cors_middleware.<locals>.cors_middlewarer	   
middlewareRequest)rG   rN   r!   rM   r$   create_cors_middlewareg   s   rR   c              	   C   s   | d u rdS zt | jrW dS W dS    Y d}tjtjfD ]2}z&t| d |tj}|D ]\}}}}}t |d jsC|  W   S d}q-W q tjyQ   Y qw |S )NFTr   )		ipaddress
ip_addressis_loopbacksocketAF_INETAF_INET6getaddrinfoSOCK_STREAMgaierror)hostloopbackfamilyr_sockaddrr!   r!   r$   rU   x   s*   rU   c                  C      t jdt jfdd} | S )Nr4   c                    s$  d| j v r| j d }|dkrtjddS d| j v r~d| j v r~| j d }| j d }| }tj|}|j }tjd| }t	|j
}	|jd u rM|j
}|jd u rU|j
}|	r~|d ur~|d ur~t|dkr~t|dkr~||kr~td	|| tjddS | jd
krt }
|
S || I d H }
|
S )NzSec-Fetch-Sitez
cross-site  statusHostOriginz//r   zJWARNING: request with non matching host and origin {} != {}, returning 403rH   )r>   r	   rA   lowerurllibparseurlparsenetlocurlsplitrU   hostnameportlenr-   r.   r/   rK   )r4   r9   sec_fetch_siter\   originhost_domainparsedorigin_domainhost_domain_parsedr]   r:   r!   r!   r$   origin_only_middleware   s4   







,
z=create_origin_only_middleware.<locals>.origin_only_middlewarerO   )rw   r!   r!   r$   create_origin_only_middleware   s   $rx   c                  C   rb   )Nr4   c                    s2   | j dkrt }n|| I d H }d|jd< |S )NrH   zdefault-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' blob:; style-src 'self' 'unsafe-inline'; img-src 'self' data: blob:; font-src 'self'; connect-src 'self' data:; frame-src 'self'; object-src 'self';zContent-Security-PolicyrJ   rL   r!   r!   r$   block_external_middleware   s   


zCcreate_block_external_middleware.<locals>.block_external_middlewarerO   )ry   r!   r!   r$    create_block_external_middleware   s   
rz   c                   @   s   e Zd Zdd Zdd Zdd Zdd Zd)d
dZdd Zd)ddZ	d*ddZ
d)ddZd)ddZd)ddZdd Zdd Zd+ddZd,dd Zd!d" Zd#d$ Z		d)d%eeeef d&efd'd(Zd	S )-PromptServerc                    s  t _t _t _t _t _	t
 _t_dg_t_|_t _d _d_ttg}tjr@|t tjrL|ttj n|t   tj!r[|t"  tj#re|t$%  t&tj'd d }t(j)||d_*t+ _,t+ _-tj.d u rt/0tj1ntj._2t34dj2  tj5rt6j*j n	t6j* t78  t(9 }|_:d _;d _<g _=|>dfdd}|>d	fd
d}|>ddd }|>ddd }|>ddd }	|>dfdd}
dd dd  dV fdd	|?dfdd }|?d!fd"d#}|>d$fd%d&}|>d'd(d) }|>d*d+d, }|>d-d.d/ }|>d0fd1d2}d3d4 |>d5fd6d7}|>d8fd9d:}|>d;fd<d=}|>d>fd?d@}|>dAfdBdC}|>dDfdEdF}|>dGfdHdI}|?d0fdJdK}|?dGfdLdM}|?dNfdOdP}|?dQfdRdS}|?dAfdTdU}d S )WNcustom_nodes_from_webr   i   )client_max_sizemiddlewaresz[Prompt Server] web root: z/wsc                    s  t  }|| I d H  | jjdd}|r j|d  nt	 j
}| j|< di i j|< z d  |d|I d H   j|krW jd urW dd ji|I d H  d}|2 z3 d H W }|jtjjkrrtd	|   q[|jtjjkrz7t|j}|r|d
dkr|di }| j| d<  dt |I d H  td| d|  d}W q[ tjy   td| d|j  Y q[ ty } zt d|  W Y d }~q[d }~ww q[6 W  j|d   j|d  |S  j|d   j|d  w )NclientIdr<   r   re   )re   sid	executingnodeTz&ws connection closed with exception %stypedataz$Feature flags negotiated for client z: Fz"Invalid JSON received from client z$Error processing WebSocket message: )!r	   WebSocketResponsepreparerel_urlqueryr?   socketspopuuiduuid4hexsockets_metadatasendget_queue_info	client_idlast_node_idr   r'   	WSMsgTypeERRORr-   r.   	exceptionTEXTjsonloadsr   r   get_server_featuresdebugJSONDecodeError	Exceptionerror)r4   wsr   first_messagemsgr   client_flagseselfr!   r$   websocket_handler   s^   


z0PromptServer.__init__.<locals>.websocket_handler/c                    s:   t tj jd}d|jd< d|jd< d|jd< |S )Nz
index.htmlzno-store, must-revalidatezCache-Controlzno-cachePragma0Expires)r	   FileResponseosr5   joinweb_rootr>   )r4   r:   r   r!   r$   get_root<  s   


z'PromptServer.__init__.<locals>.get_rootz/embeddingsc                 S   s"   t d}tttdd |S )N
embeddingsc                 S   s   t j| d S )Nr   )r   r5   splitextar!   r!   r$   <lambda>G  s    z?PromptServer.__init__.<locals>.get_embeddings.<locals>.<lambda>)folder_pathsget_filename_listr	   json_responselistmap)r4   r   r!   r!   r$   get_embeddingsD  s   
z-PromptServer.__init__.<locals>.get_embeddingsz/modelsc                 S   s   t tj }t|S N)r   r   folder_names_and_pathskeysr	   r   )r4   model_typesr!   r!   r$   list_model_typesI  s   
z/PromptServer.__init__.<locals>.list_model_typesz/models/{folder}c                    s:   | j dd }|tjvrtjddS t|}t|S )Nfolder  rd   )
match_infor?   r   r   r	   rA   r   r   )r4   r   filesr!   r!   r$   
get_modelsO  s   


z)PromptServer.__init__.<locals>.get_modelsz/extensionsc                    s   t j tjt jddd}ttfdd|}tj	
 D ]"\ t j tjt  ddd}|tt fdd| q!t|S )Nzextensions/**/*.jsT)	recursivec                    s   dt j|  jdd S )Nr   \)r   r5   relpathr   replacefr   r!   r$   r   \  s    z?PromptServer.__init__.<locals>.get_extensions.<locals>.<lambda>z**/*.jsc                    s*   dt j d tj|  dd S )N/extensions/r   r   )ri   rj   quoter   r5   r   r   r   dirnamer!   r$   r   `  s    )globr   r5   r   escaper   r   r   nodesEXTENSION_WEB_DIRSitemsextendr	   r   )r4   r   
extensionsr   r   r$   get_extensionsW  s   


z-PromptServer.__init__.<locals>.get_extensionsc                 S   sT   | d u rd} | dkrt  }|| fS | dkrt  }|| fS | dkr&t  }|| fS )Ninputtempoutput)r   get_input_directoryget_temp_directoryget_output_directory)dir_typetype_dirr!   r!   r$   get_dir_by_typee  s   z.PromptServer.__init__.<locals>.get_dir_by_typec                 S   s   t  }tj| rB| }| }t| d}||  ||j  |j	d W d    n1 s5w   Y  |
 |
 kS dS )Nrbr   F)node_helpershasherr   r5   existsopenupdatereadfileseek	hexdigest)filepathimager   r   br   r!   r!   r$   compare_image_hashr  s   z1PromptServer.__init__.<locals>.compare_image_hashc                    s6  |  d}|  d}d}|  d}|\}}|r|jr|j}|s)tjddS |  dd}tj|tj|}	tj	tj|	|}
tj
||
f|krUtjddS tj|	s`t|	 tj|}|d urs|d	ksr|d
krsn/d}tj|
r |
|rd}n|d  d| d|d  }tj|	|}
|d7 }tj|
s{|s|d ur||| |
 nt|
d}||j  W d    n1 sw   Y  |||d}tjrz(|dv r|nd}t|
||gd}|jj|jj|jj|jj|jj|jd|d< W n ty   tjddd Y nw t|S tjddS )Nr   	overwriteFr     rd   	subfolderr<   rI   1   Tr   z ()wb)r   r   r   )r   r   r   )abs_pathr   tags)idr   
asset_hashsize	mime_typer   assetz*Failed to register uploaded image as asset)exc_info) r?   r   filenamer	   rA   r   r5   r   normpathabspath
commonpathr   makedirsr   r   writer   r
   enable_assetsr   refr   r   r   hash
size_bytesr   r   r   r-   r.   r   )postimage_save_functionr   r   image_is_duplicateimage_upload_type
upload_dirr   r   full_output_folderr   splitir   resptagresult)r   r   r!   r$   image_upload  sf   





z+PromptServer.__init__.<locals>.image_uploadz/upload/imagec                    s   |   I d H } |S r   r  )r4   r  r  r!   r$   upload_image  s   z+PromptServer.__init__.<locals>.upload_imagez/upload/maskc                    s"   |   I d H }dd } ||S )Nc                 S   s  t |d}t|d \}}|stjddS |d dks#d|v r)tjddS |d u r8|dd	}t|}|d u rBtjddS |d
ddkritj	
||d
 }tj	tj	||f|krgtjddS |}tj	
||}tj	|rt|@}	t }
t|	dr|	jD ]}|
||	j|  q|	d}	t| jd}|d}|	| |	j|d|
d W d    d S 1 sw   Y  d S d S )Noriginal_refr   r   rd   r   r   ..r   r   r   r<   rc   textRGBAA   )compress_levelpnginfo)r   r   r?   r   annotated_filepathr	   rA   get_directory_by_typer   r5   r   r   r   isfiler   r   r   hasattrr  add_textconvertr   
getchannelputalphasave)r   r  r   r  r   
output_dirr   full_output_dirr   original_pilmetadatakeymask_pil	new_alphar!   r!   r$   r    s<   





"zGPromptServer.__init__.<locals>.upload_mask.<locals>.image_save_functionr  )r4   r  r  r  r!   r$   upload_mask  s   
(z*PromptServer.__init__.<locals>.upload_maskz/viewc                    s0  d| j jv r| j jd }|dr5 j| }t||d}|d u r)tjddS |j|j	|j
}}}npd }t|\}}|sFtjddS |d dksPd	|v rVtjddS |d u rg| j jd
d}t|}|d u rqtjddS d| j jv rtj|| j jd }tjtj||f|krtjddS |}tj|}tj||}tj|rd| j jv r*t|i}	| j jd d}
|
d }|dvsd| j jddv rd}d}|
d  rt|
d }t }|dv s| j jdddkr|	d}	|	j|||d |d tj| d| dd| didW  d    S 1 s%w   Y  d| j jvr4d }n| j jd }|dkrt|D}	|	j d!kr]|	 \}}}}t!d|||f}n|	d}t }|j|d"d# |d tj| d$dd| didW  d    S 1 sw   Y  n|dkrt|J}	|	j d!kr|	 \}}}}nt"d%|	j#d&}t"d!|	j#}|$| t }|j|d"d# |d tj| d$dd| didW  d    S 1 sw   Y  n"|pt%&|d pd'}|d(v rd'}tj'|d| d|d)d*S tjddS )+Nr   zblake3:)owner_idr   rd   r   r   r   r  r   r   r   rc   preview;)webpjpegr   channelr<   r2  Z   )r3  rgbRGB)r/   qualityzimage/Content-Dispositionz
filename="")rC   rB   r>   rgbar  PNG)r/   	image/pngL   zapplication/octet-stream>   text/css	text/htmltext/javascripttext/html-sandboxedapplication/xhtml+xml)r:  zContent-Type)r>   )(r   r   r6   user_managerget_request_user_idr   r	   rA   r   download_namerB   r   r  r?   r  r   r5   r   r   r   basenamer   r   r   r  isdigitintr   r#  r&  r   r   modemergenewr   r%  	mimetypes
guess_typer   )r4   r   r/  r  r   resolved_content_typer'  r   r(  imgpreview_infoimage_formatr9  bufferr4  r_   gr   r   new_imgr`   	alpha_imgalpha_bufferrB   r   r!   r$   
view_image  s   



"


$


$

z)PromptServer.__init__.<locals>.view_imagez/view_metadata/{folder_name}c                    s   | j dd }|d u rtjddS d| jjvrtjddS | jjd }|ds/tjddS t||}|d u r?tjddS t	j
j|dd}|d u rQtjddS t|}d|vr`tjddS t|d S )	Nfolder_namer   rd   r   z.safetensorsi   )max_size__metadata__)r   r?   r	   rA   r   r   endswithr   get_full_pathcomfyutilssafetensors_headerr   r   r   )r4   r[  r   safetensors_pathoutdtr!   r!   r$   view_metadatao  s&   

z,PromptServer.__init__.<locals>.view_metadataz/system_statsc                    s   t j }t j|}t jjd}t j|}t j|}t jj|dd\}}t jj|dd\}}	t	 }
t
 }t }tj||t|
||tjt jjtjtjtjd d dktjd||j|j||||	d	gd
}t|S )NcpuT)torch_total_too)torch_free_toor   r   python_embeded)r   	ram_totalram_freecomfyui_versionrequired_frontend_versioninstalled_templates_versionrequired_templates_versionpython_versionpytorch_versionembedded_pythonargv)r   r   index
vram_total	vram_freetorch_vram_totaltorch_vram_free)systemdevices)r`  model_managementget_torch_deviceget_torch_device_nametorchdeviceget_total_memoryget_free_memoryr   get_required_frontend_versionget_installed_templates_versionget_required_templates_versionsysplatformr   versiontorch_versionr   r5   r  
executablert  r   ru  r	   r   )r4   r  device_name
cpu_devicerk  rl  rv  rx  rw  ry  rn  ro  rp  system_statsr!   r!   r$   r    sD   
 
z+PromptServer.__init__.<locals>.system_statsz	/featuresc                    s   t t S r   )r	   r   r   r   r4   r!   r!   r$   get_features     z+PromptServer.__init__.<locals>.get_featuresz/promptc                    s   t   S r   )r	   r   r   r  r   r!   r$   
get_prompt  r  z)PromptServer.__init__.<locals>.get_promptc                 S   s  t j|  }t|tr| S i }| |d< dd |  D |d< t|dd|d< |j|d< t	|d	r8|j
ndgt|j |d
< t	|drJ|jn|d |d< | |d< | t j v r`t j|  n| |d< t	|drl|jnd|d< t|dd|d< d|d< t	|dr|jdkrd|d< nd|d< t	|dr|jdkrd|d< nd|d< t	|dr|j|d< t	|dr|j|d< t|ddrd|d < t|d!drd|d"< t|d#drd|d$< t	|d%r|j|d&< t|d'g |d(< t	|d)r|j|d*< |S )+Nr   c                 S   s   i | ]\}}|t | qS r!   )r   r   )r"   r+  valuer!   r!   r$   
<dictcomp>  s    z<PromptServer.__init__.<locals>.node_info.<locals>.<dictcomp>input_orderINPUT_IS_LISTFis_input_listr   OUTPUT_IS_LISToutput_is_listRETURN_NAMESoutput_namer   display_nameDESCRIPTIONr<   descriptionRELATIVE_PYTHON_MODULEr   python_modulesdcategoryOUTPUT_NODEToutput_nodeHAS_INTERMEDIATE_OUTPUThas_intermediate_outputCATEGORYOUTPUT_TOOLTIPSoutput_tooltips
DEPRECATED
deprecatedEXPERIMENTALexperimentalDEV_ONLYdev_onlyAPI_NODEapi_nodeSEARCH_ALIASESsearch_aliasesESSENTIALS_CATEGORYessentials_category)r   NODE_CLASS_MAPPINGS
issubclassr   GET_NODE_INFO_V1INPUT_TYPESr   getattrRETURN_TYPESr!  r  rp   r  NODE_DISPLAY_NAME_MAPPINGSr   r  r  r  r  r  r  r  )
node_class	obj_classinfor!   r!   r$   	node_info  sJ   


$ 









z(PromptServer.__init__.<locals>.node_infoz/object_infoc              
      s   t jdd tj6 i }tjD ]#}z |||< W q ty3   td| d tt	
  Y qw t|W  d    S 1 sCw   Y  d S )N)modelsr   r   )rootsz@[ERROR] An error occurred while retrieving information for the 'z' node.)r   startr   cache_helperr   r  r   r-   r   	traceback
format_excr	   r   )r4   rd  xr  r!   r$   get_object_info  s   
$z.PromptServer.__init__.<locals>.get_object_infoz/object_info/{node_class}c                    s<   | j dd }i }|d ur|tjv r |||< t|S )Nr  )r   r?   r   r  r	   r   )r4   r  rd  r  r!   r$   get_object_info_node  s   
z3PromptServer.__init__.<locals>.get_object_info_nodez	/api/jobsc                    s  | j j}|d}|d}|dd }|dd }d}|rLdd	 |d
D }dd	 |D }|rLtjddd| ddtj	 iddS |dvrYtjddiddS |dvrftjddiddS d}d|v rzt
|d}|dkrtjddiddW S W n ttfy   tjddidd Y S w d}	d|v rzt
|d}	|	dk rd}	W n ttfy   tjddidd Y S w  j \}
} j }t|
}
t|}t|
||||||||	d	\}}|	t| |k }t||	|||ddS )a  List all jobs with filtering, sorting, and pagination.

            Query parameters:
                status: Filter by status (comma-separated): pending, in_progress, completed, failed
                workflow_id: Filter by workflow ID
                sort_by: Sort field: created_at (default), execution_duration
                sort_order: Sort direction: asc, desc (default)
                limit: Max items to return (positive integer)
                offset: Items to skip (non-negative integer, default 0)
            re   workflow_idsort_by
created_at
sort_orderdescNc                 S   s    g | ]}|  r|   qS r!   )striprh   r"   sr!   r!   r$   r%     s     z;PromptServer.__init__.<locals>.get_jobs.<locals>.<listcomp>,c                 S   s   g | ]	}|t jvr|qS r!   )r   ALLr  r!   r!   r$   r%     s    r   zInvalid status value(s): z, z. Valid values: r   rd   >   r  execution_durationz4sort_by must be 'created_at' or 'execution_duration'>   ascr  z"sort_order must be 'asc' or 'desc'limitr   z limit must be a positive integerzlimit must be an integeroffsetzoffset must be an integer)status_filterr  r  r  r  r  )r  r  totalhas_more)jobs
pagination)r   r   r?   rh   r  r	   r   r   r   r  rK  
ValueError	TypeErrorprompt_queueget_current_queue_volatileget_historyr&   r   rp   )r4   r   status_paramr  r  r  r  invalid_statusesr  r  runningqueuedhistoryr  r  r  r   r!   r$   get_jobs  s   

 




z'PromptServer.__init__.<locals>.get_jobsz/api/jobs/{job_id}c                    s   | j dd}|stjddiddS  j \}} jj|d}t|}t|}t||||}|du r=tjddid	dS t|S )
zGet a single job by ID.job_idNr   zjob_id is requiredr   rd   	prompt_idzJob not foundr   )	r   r?   r	   r   r  r  r  r&   r   )r4   r  r  r  r  jobr   r!   r$   get_job_by_id_  s$   
z,PromptServer.__init__.<locals>.get_job_by_idz/historyc                    s^   | j jdd }|d urt|}| j jdd }|d ur"t|}nd}t jj||dS )N	max_itemsr  r6  )r  r  )r   r   r?   rK  r	   r   r  r  )r4   r  r  r   r!   r$   r  x  s   
z*PromptServer.__init__.<locals>.get_historyz/history/{prompt_id}c                    s$   | j dd }t jj|dS )Nr  r  )r   r?   r	   r   r  r  )r4   r  r   r!   r$   get_history_prompt_id  s   z4PromptServer.__init__.<locals>.get_history_prompt_idz/queuec                    s:   i } j  }t|d |d< t|d |d< t|S )Nr   queue_runningr   queue_pending)r  r  r&   r	   r   )r4   
queue_infocurrent_queuer   r!   r$   	get_queue  s   

z(PromptServer.__init__.<locals>.get_queuec                    s  t d |  I d H } |}d|v rt|d }n j}d|v r+|d r+| }  jd7  _d|v r|d }t|dt	 }d }d|v rN|d } j
| t|||I d H }i }d|v rh|d }d	|v rr|d	 |d	< |d
 r|d }i }	tjD ]}
|
|v r||
|	|
< qtt d |d<  j||||||	f |||d d}t|S t d|d  tj|d |d dddS dddi d}tj|i dddS )Nz
got promptnumberfrontr   promptr  partial_execution_targets
extra_datar   r      i  create_time   )r  r  node_errorszinvalid prompt: {})r   r  r   rd   	no_promptzNo prompt provided)r   r1   details
extra_info)r-   r  r   trigger_on_promptfloatr  strr?   r   r   node_replace_managerapply_replacements	executionvalidate_promptSENSITIVE_EXTRA_DATA_KEYSr   rK  timer  putr	   r   r.   r/   )r4   	json_datar  r  r  r  validr  outputs_to_execute	sensitivesensitive_valr:   r   r   r!   r$   post_prompt  sV   



z*PromptServer.__init__.<locals>.post_promptc                    sh   |   I d H }d|v r|d rj  d|v r.|d }|D ]  fdd}j| qtjddS )Ncleardeletec                    s   | d  kS )Nr   r!   r   id_to_deleter!   r$   r     s    z;PromptServer.__init__.<locals>.post_queue.<locals>.<lambda>   rd   )r   r  
wipe_queuedelete_queue_itemr	   rA   )r4   r
  	to_deletedelete_funcr   r  r$   
post_queue  s   
z)PromptServer.__init__.<locals>.post_queuez
/interruptc                    s   z	|   I d H }W n t jy   i }Y nw |d}|rO j \}}d}|D ]}|d |kr=td|  d} nq)|rEt  ntd| d n	td t  t	j
d	d
S )Nr  Fr   zInterrupting prompt TzPrompt z- is not currently running, skipping interruptz)Global interrupt (no prompt_id specified)r  rd   )r   r   r?   r  get_current_queuer-   r  r   interrupt_processingr	   rA   )r4   r
  r  currently_runningr`   should_interruptr#   r   r!   r$   post_interrupt  s,   


z-PromptServer.__init__.<locals>.post_interruptz/freec                    sX   |   I d H }|dd}|dd}|r jd| |r& jd| tjddS )Nunload_modelsFfree_memoryr  rd   )r   r?   r  set_flagr	   rA   )r4   r
  r  r   r   r!   r$   	post_free  s   z(PromptServer.__init__.<locals>.post_freec                    s\   |   I d H }d|v r|d r j  d|v r(|d }|D ]} j| qtjddS )Nr  r  r  rd   )r   r  wipe_historydelete_history_itemr	   rA   )r4   r
  r  r  r   r!   r$   post_history  s   
z+PromptServer.__init__.<locals>.post_historyr   )@r{   instancer   rF  r   model_file_managerr   custom_node_managerr   subgraph_managerr   r  r   internal_routessupportsr  PromptQueuer  loopasyncioQueuemessagesclient_sessionr  r   r;   r
   enable_compress_response_bodyappendrF   enable_cors_headerrR   rx   disable_api_nodesrz   enable_managercomfyui_managercreate_middlewareroundmax_upload_sizer	   Applicationappdictr   r   front_end_rootr   init_frontendfront_end_versionr   r-   r  r  r   r   disableRouteTableDefroutesr   r   on_prompt_handlersr?   r  )r   r-  r~   r:  rC  r   r   r   r   r   r   r  r.  rZ  rf  r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r%  r!   )r   r   r  r  r   r$   __init__   s   




;


A-y

(
1a6
zPromptServer.__init__c                    s    t jd d}t j|d| _d S )N)r  )timeout)r'   ClientTimeoutClientSessionr1  )r   rF  r!   r!   r$   setup  s   zPromptServer.setupc              
   C   s  | j | j | j| j | j| j| jtj  | j	| jtj  | j
| j | jd| j  t }| jD ]}t|tjrX||jd|j |jfi |j q>| j| | j| j tj D ]\}}| jtd| |g qkt }d}|rz
t|tdk }W n ty } ztd|| W Y d }~nd }~ww |rt }|r| jtd|g nt  }	|	r| jj!"d|	 t# }
|
r| jtd	|
g | jtd
| j$g d S )Nz	/internalz/apir   Tz0.3.0z*Unable to parse templates version '%s': %sz
/templatesz/templates/{path:.*}z/docsr   )%rF  
add_routesrC  r'  r(  r<  r   LOADED_MODULE_DIRSr   r)  r  
add_subappr*  get_appr	   rB  r@   RouteDefrouterK   r5   r9   kwargsr   staticr   r  r   r   r-   r.   legacy_templates_pathtemplate_asset_handlerrouteradd_getembedded_docs_pathr   )r   
api_routesrO  r   r   ro  use_legacy_templatesexcworkflow_templates_pathr9   rV  r!   r!   r$   rJ    sb   
$


zPromptServer.add_routesc                 C   s"   i }i }| j  |d< ||d< |S )Nqueue_remaining	exec_info)r  get_tasks_remaining)r   prompt_infor\  r!   r!   r$   r   S  s
   zPromptServer.get_queue_infoNc                    s   |t jkr| j||dI d H  d S |t jkr(|\}}| j|||dI d H  d S t|ttfr;| |||I d H  d S | 	|||I d H  d S )Nr   )
r   UNENCODED_PREVIEW_IMAGE
send_imagePREVIEW_IMAGE_WITH_METADATAsend_image_with_metadatar@   bytes	bytearray
send_bytes	send_json)r   eventr   r   preview_imager*  r!   r!   r$   r   Z  s   

zPromptServer.sendc                 C   s:   t |tstd| td|}t|}|| |S )Nz)Binary event types must be integers, got >I)r@   rK  RuntimeErrorstructpackre  r   )r   rh  r   packedr1   r!   r!   r$   encode_bytesf  s   

zPromptServer.encode_bytesc                    s   |d }|d }|d }|d ur(t tdrtjj}ntjj}t|||f|}d}|dkr1d}n|dkr7d}t }t	d|}	|
|	 |j||ddd	 | }
| jtj|
|d
I d H  d S )Nr   r   r  
ResamplingJPEGr=  rj  _   r/   r9  r  r_  )r!  r   rp  BILINEARLANCZOSr   containr   rl  rm  r  r&  getvaluerf  r   PREVIEW_IMAGE)r   
image_datar   
image_typer   r\  
resamplingtype_numbytesIOheaderpreview_bytesr!   r!   r$   ra  o  s(   


zPromptServer.send_imagec                    s   |d }|d }|d }|d ur(t tdrtjj}ntjj}t|||f|}|dkr.dnd}|d u r6i }||d< dd l}	|	|	d	}
t
|
}t }|j||d
dd | }t }|td| ||
 || | jtj||dI d H  d S )Nr   r   r  rp  r=  r>  z
image/jpegrz  utf-8rr  rs  rj  r_  )r!  r   rp  rt  ru  r   rv  r   dumpsencoderp   r   r&  rw  re  r   rl  rm  rf  r   rb  )r   ry  r*  r   rz  r   r\  r{  mimetyper   metadata_jsonmetadata_lengthr}  image_bytescombined_datar!   r!   r$   rc    s0   



z%PromptServer.send_image_with_metadatac                    sn   |  ||}|d u r"t| j }|D ]}t|j|I d H  qd S || jv r5t| j| j|I d H  d S d S r   )ro  r   r   valuesr3   rf  r   rh  r   r   r1   r   r   r!   r!   r$   rf    s   
zPromptServer.send_bytesc                    sl   ||d}|d u r!t | j }|D ]}t|j|I d H  qd S || jv r4t| j| j|I d H  d S d S )N)r   r   )r   r   r  r3   rg  r  r!   r!   r$   rg    s   

zPromptServer.send_jsonc                 C   s   | j | jj|||f d S r   )r-  call_soon_threadsafer0  
put_nowait)r   rh  r   r   r!   r!   r$   	send_sync  s   zPromptServer.send_syncc                 C   s   |  dd|  i d S )Nre   )r  r   r   r!   r!   r$   queue_updated  s   zPromptServer.queue_updatedc                    s&   	 | j  I d H }| j| I d H  qr   )r0  r?   r   )r   r   r!   r!   r$   publish_loop  s
   zPromptServer.publish_loopTc                    s    | j ||fg|dI d H  d S )N)call_on_start)start_multi_address)r   addressro   verboser  r!   r!   r$   r    s   zPromptServer.startc                    s
  t j| jd d}| I d H  d }d}tjr.tjr.tjtj	tj
d}|jtjtjd d}|r5td |D ]=}|d }|d }	t j|||	|d	}
|
 I d H  t| d
s\|| _|	| _d|v rfd|}n|}|rttd|||	 q7|d ur||| j| j d S d S )N)
access_loghttp)protocolverify_mode)certfilekeyfilehttpszStarting server
r   r   )ssl_contextr  :z[{}]z To see the GUI go to: {}://{}:{})r	   	AppRunnerr<  rI  r
   tls_keyfiletls_certfilessl
SSLContextPROTOCOL_TLS_SERVER	CERT_NONEload_cert_chainr-   r  TCPSiter  r!  r  ro   r/   )r   	addressesr  r  runnerssl_ctxschemeaddrr  ro   siteaddress_printr!   r!   r$   r    s<   

z PromptServer.start_multi_addressc                 C   s   | j | d S r   )rD  r3  )r   r9   r!   r!   r$   add_on_prompt_handler  s   z"PromptServer.add_on_prompt_handlerc              	   C   sF   | j D ]}z||}W q ty    td tt  Y qw |S )NzA[ERROR] An error occurred during the on_prompt_handler processing)rD  r   r-   r.   r  r  )r   r
  r9   r!   r!   r$   r     s   

zPromptServer.trigger_on_promptr  node_idc                 C   sN   t |tr
|d}t|d}tdt|| | }| tj|| d S )Nr  rj  )	r@   r  r  rl  rm  rp   r  r   r   )r   r  r  r   node_id_bytesr1   r!   r!   r$   send_progress_text  s
   

zPromptServer.send_progress_textr   )NN)TN)NT)__name__
__module____qualname__rE  rI  rJ  r   r   ro  ra  rc  rf  rg  r  r  r  r  r  r  r   r   rd  re  r  r  r!   r!   r!   r$   r{      s<          K?

	

%





"r{   )Zr   r  r.  r  r  r   r   r  comfy_execution.jobsr   r   r   r   ri   r   r   rl  r  rV   rS   PILr   r   PIL.PngImagePluginr   ior   r'   r	   r-   rO  comfy.cli_argsr
   comfy.utilsr`  comfy.model_management	comfy_apir   r   rm  r   app.frontend_managementr   r   comfy_api.internalr   app.assets.seederr   app.assets.api.routesr   app.assets.services.ingestr   $app.assets.services.asset_managementr   app.user_managerr   app.model_managerr   app.custom_node_managerr   app.subgraph_managerr   app.node_replace_managerr   typingr   r   *api_server.routes.internal.internal_routesr   r  r   middleware.cache_middlewarer   r6  r7  r   r&   r3   setr7   rP   rQ   r;   rF   r  rR   rU   rx   rz   r{   r!   r!   r!   r$   <module>   sv    )