
    +j.                        U d dl mZmZmZmZ d dlmZ d dlmZ d dl	m
Z
 d dlmZ d dlmZ d dl mZ erd dlmZ d d	lmZ d d
lmZ eeej        ee         f         Z G d de
          Z G d de          Z G d de          Z G d de          Z G d de          Z G d d          Zdaedz  ed<   deddddfdZ deddfdZ!defd Z"dS )!    )	TypedDictDictOptionalTuple)override)Image)Enum)ABC)tqdm)TYPE_CHECKINGDynamicPrompt)BinaryEventTypes)feature_flagsc                       e Zd ZdZdZdZdZdS )	NodeStatependingrunningfinishederrorN)__name__
__module____qualname__PendingRunningFinishedError     8/home/wildlama/comfy/ComfyUI/comfy_execution/progress.pyr   r      s"        GGHEEEr   r   c                   2    e Zd ZU dZeed<   eed<   eed<   dS )NodeProgressStatez>
    A class to represent the state of a node's progress.
    statevaluemaxN)r   r   r   __doc__r   __annotations__floatr   r   r    r"   r"      s:           LLL	JJJJJr   r"   c                       e Zd ZdZdefdZddZdeded	efd
Z	 ddede	de	ded	ede
dz  fdZdeded	efdZd Zd Zd ZdS )ProgressHandlerz
    Abstract base class for progress handlers.
    Progress handlers receive progress updates and display them in various ways.
    namec                 "    || _         d| _        d S )NT)r+   enabled)selfr+   s     r    __init__zProgressHandler.__init__&   s    	r   registryProgressRegistryc                     d S Nr   r.   r0   s     r    set_registryzProgressHandler.set_registry*   s    r   node_idr#   	prompt_idc                     dS )z$Called when a node starts processingNr   r.   r6   r#   r7   s       r    start_handlerzProgressHandler.start_handler-       r   Nr$   	max_valueimagec                     dS )z(Called when a node's progress is updatedNr   )r.   r6   r$   r<   r#   r7   r=   s          r    update_handlerzProgressHandler.update_handler1   s	     	r   c                     dS )z&Called when a node finishes processingNr   r9   s       r    finish_handlerzProgressHandler.finish_handler=   r;   r   c                     dS )z*Called when the progress registry is resetNr   r.   s    r    resetzProgressHandler.resetA   r;   r   c                     d| _         dS )zEnable this handlerTNr-   rC   s    r    enablezProgressHandler.enableE   s    r   c                     d| _         dS )zDisable this handlerFNrF   rC   s    r    disablezProgressHandler.disableI   s    r   r0   r1   r3   )r   r   r   r&   strr/   r5   r"   r:   r(   PreviewImageTupler?   rA   rD   rG   rI   r   r   r    r*   r*       s,        
S       S 1B s     +/
 

 
 	

 !
 
 !4'
 
 
 
c 2C PS            r   r*   c                        e Zd ZdZ fdZedededefd            Ze	 ddede	d	e	deded
e
dz  fd            Zedededefd            Zed             Z xZS )CLIProgressHandlerzM
    Handler that displays progress using tqdm progress bars in the CLI.
    c                 X    t                                          d           i | _        d S )Ncli)superr/   progress_bars)r.   	__class__s    r    r/   zCLIProgressHandler.__init__S   s)    .0r   r6   r#   r7   c           	          || j         vr9t          |d         d| ddt          | j                             | j         |<   d S d S )Nr%   Node stepsTtotaldescunitleaveposition)rR   r   lenr9   s       r    r:   z CLIProgressHandler.start_handlerW   sb     $,,,*.El&W&&T/00+ + +Dw''' -,r   Nr$   r<   r=   c           	         || j         vrSt          |d| ddt          | j                             | j         |<   | j         |                             |           d S || j         |         j        k    r|| j         |         _        | j         |         j        }||z
  }|dk    r"| j         |                             |           d S d S )NrU   rV   TrW   r   )rR   r   r]   updaterX   n)	r.   r6   r$   r<   r#   r7   r=   current_positionupdate_amounts	            r    r?   z!CLIProgressHandler.update_handlerc   s     $,,,*.&W&&T/00+ + +Dw' w'..u55555 D.w7===4="7+1#1':<!$44Mq  "7+22=AAAAA ! r   c                     || j         v rj|d         | j         |         j        z
  }|dk    r | j         |                             |           | j         |                                          | j         |= d S d S )Nr%   r   )rR   r`   r_   close)r.   r6   r#   r7   	remainings        r    rA   z!CLIProgressHandler.finish_handler   s     d(((et'9''B'DDI1}}"7+229===w'--///"7+++ )(r   c                     | j                                         D ]}|                                 | j                                          d S r3   )rR   valuesrd   clear)r.   bars     r    rD   zCLIProgressHandler.reset   sL     %,,.. 	 	CIIKKKK  """""r   r3   )r   r   r   r&   r/   r   rK   r"   r:   r(   rL   r?   rA   rD   __classcell__rS   s   @r    rN   rN   N   s>        1 1 1 1 1 	S 	1B 	s 	 	 	 X	  +/B BB B 	B
 !B B !4'B B B XB: ,c ,2C ,PS , , , X, # # X# # # # #r   rN   c                        e Zd ZdZ fdZddZdedeeef         fdZ	e
d	ed
edefd            Ze
	 dd	ededed
edededz  fd            Ze
d	ed
edefd            Z xZS )WebUIProgressHandlerzJ
    Handler that sends progress updates to the WebUI via WebSockets.
    c                 X    t                                          d           || _        d S )Nwebui)rQ   r/   server_instance)r.   rp   rS   s     r    r/   zWebUIProgressHandler.__init__   s)    !!!.r   r0   r1   c                     || _         d S r3   )r0   r4   s     r    r5   z!WebUIProgressHandler.set_registry   s     r   r7   nodesc                       j         dS  fd|                                D             } j                             d|d j         j                   dS )z-Send the current progress state to the clientNc                 6   i | ]\  }}|d          t           j        k    ||d         |d         |d          j        |j        j                            |          j        j                            |          j        j                            |          dS )r#   r$   r%   )r$   r%   r#   r6   r7   display_node_idparent_node_idreal_node_id)r   r   r$   r0   	dynpromptget_display_node_idget_parent_node_idget_real_node_id).0r6   r#   r7   r.   s      r    
<dictcomp>z=WebUIProgressHandler._send_progress_state.<locals>.<dictcomp>   s     
 
 
 W~!222 wU|w-"&#'=#:#N#Nw#W#W"&-"9"L"LW"U"U $ 7 H H Q Q	 	 322r   progress_state)r7   rr   )rp   items	send_sync	client_id)r.   r7   rr   active_nodess   ``  r    _send_progress_statez)WebUIProgressHandler._send_progress_state   s    'F
 
 
 
 
 #(++--
 
 
" 	&&IMMtOcOm	
 	
 	
 	
 	
r   r6   r#   c                 X    | j         r"|                     || j         j                   d S d S r3   r0   r   rr   r9   s       r    r:   z"WebUIProgressHandler.start_handler   <     = 	F%%i1DEEEEE	F 	Fr   Nr$   r<   r=   c                    | j         r |                     || j         j                   |rt          j        | j        j        | j        j        d          r||| j         j        	                    |          | j         j        
                    |          | j         j                            |          d}| j                            t          j        ||f| j        j                   d S d S d S )Nsupports_preview_metadata)r6   r7   ru   rv   rw   )r0   r   rr   r   supports_featurerp   sockets_metadatar   rx   ry   rz   r{   r   r   PREVIEW_IMAGE_WITH_METADATA)r.   r6   r$   r<   r#   r7   r=   metadatas           r    r?   z#WebUIProgressHandler.update_handler   s    = 	F%%i1DEEE 	-$5$.+    '!*'+}'>'R'R( ( '+m&=&P&P' ' %)M$;$L$LW$U$U
 
 $..$@H%(2    %	 	 r   c                 X    | j         r"|                     || j         j                   d S d S r3   r   r9   s       r    rA   z#WebUIProgressHandler.finish_handler   r   r   rJ   r3   )r   r   r   r&   r/   r5   rK   r   r"   r   r   r:   r(   rL   r?   rA   rj   rk   s   @r    rm   rm      sl        / / / / /! ! ! !
c 
$sDU?U:V 
 
 
 
6 FS F1B Fs F F F XF
  +/" "" " 	"
 !" " !4'" " " X"H Fc F2C FPS F F F XF F F F Fr   rm   c                       e Zd ZdZdeddfdZdeddfd	Zd
eddfdZd
eddfdZ	d
eddfdZ
dedefdZdeddfdZ	 ddededededz  ddf
dZdeddfdZddZdS )r1   zW
    Registry that maintains node progress state and notifies registered handlers.
    r7   rx   r   c                 >    || _         || _        i | _        i | _        d S r3   )r7   rx   rr   handlers)r.   r7   rx   s      r    r/   zProgressRegistry.__init__   s"    ""35
46r   handlerreturnNc                 $    || j         |j        <   dS )zRegister a progress handlerN)r   r+   r.   r   s     r    register_handlerz!ProgressRegistry.register_handler   s    &-gl###r   handler_namec                 j    || j         v r)| j         |                                          | j         |= dS dS )zUnregister a progress handlerN)r   rD   r.   r   s     r    unregister_handlerz#ProgressRegistry.unregister_handler   s@    4=((M,'--///l+++ )(r   c                 Z    || j         v r!| j         |                                          dS dS )zEnable a progress handlerN)r   rG   r   s     r    enable_handlerzProgressRegistry.enable_handler  s6    4=((M,'..00000 )(r   c                 Z    || j         v r!| j         |                                          dS dS )zDisable a progress handlerN)r   rI   r   s     r    disable_handlerz ProgressRegistry.disable_handler  s6    4=((M,'//11111 )(r   r6   c                 v    || j         vr$t          t          j        dd          | j         |<   | j         |         S )zEnsure a node entry existsr      )r#   r$   r%   )rr   r"   r   r   )r.   r6   s     r    ensure_entryzProgressRegistry.ensure_entry  sC    $*$$"3'qa# # #DJw z'""r   c                     |                      |          }t          j        |d<   d|d<   d|d<   | j                                        D ]%}|j        r|                    ||| j                   &dS )z"Start progress tracking for a noder#   g        r$   g      ?r%   N)r   r   r   r   rg   r-   r:   r7   r.   r6   entryr   s       r    start_progresszProgressRegistry.start_progress  s    !!'**"*gge }++-- 	F 	FG F%%gudnEEE	F 	Fr   r$   r<   r=   c           	          |                      |          }t          j        |d<   ||d<   ||d<   | j                                        D ](}|j        r|                    ||||| j        |           )dS )zUpdate progress for a noder#   r$   r%   N)r   r   r   r   rg   r-   r?   r7   )r.   r6   r$   r<   r=   r   r   s          r    update_progressz ProgressRegistry.update_progress   s     !!'**"*gg e }++-- 	 	G &&UIudne  	 	r   c                     |                      |          }t          j        |d<   |d         |d<   | j                                        D ]%}|j        r|                    ||| j                   &dS )z#Finish progress tracking for a noder#   r%   r$   N)r   r   r   r   rg   r-   rA   r7   r   s       r    finish_progressz ProgressRegistry.finish_progress0  s    !!'**"+gug }++-- 	G 	GG G&&wt~FFF	G 	Gr   c                 f    | j                                         D ]}|                                 dS )zReset all handlersN)r   rg   rD   r   s     r    reset_handlerszProgressRegistry.reset_handlers;  s8    }++-- 	 	GMMOOOO	 	r   r3   )r   N)r   r   r   r&   rK   r/   r*   r   r   r   r   r"   r   r   r(   rL   r   r   r   r   r   r    r1   r1      s        7# 7/ 7 7 7 7. .D . . . .,s ,t , , , ,13 14 1 1 1 1
2C 2D 2 2 2 2
#C #,= # # # #
Fc 
Fd 
F 
F 
F 
F _c #(5:CTW[C[	    	Gs 	Gt 	G 	G 	G 	G     r   r1   Nglobal_progress_registryr7   rx   r   r   c                 f    t           t                                            t          | |          a d S r3   )r   r   r1   r7   rx   s     r    reset_progress_stater   C  s4      + //111  0	9EEr   r   c                 v    t                      }|                     |           |                    |            d S r3   )get_progress_stater5   r   )r   r0   s     r    add_progress_handlerr   N  s;    !##H"""g&&&&&r   c                  ^    t            ddlm}  t          d | i                     a t           S )Nr   r    r   )r   comfy_execution.graphr   r1   r   s    r    r   r   T  sF    '777777#3MM"$5$5$
 $
 $
  $#r   )#typingr   r   r   r   typing_extensionsr   PILr   enumr	   abcr
   r   r   r   r   protocolr   	comfy_apir   rK   intrL   r   r"   r*   rN   rm   r1   r   r'   r   r   r   r   r   r    <module>r      s   3 3 3 3 3 3 3 3 3 3 3 3 3 & & & & & &                                     4333333 % % % % % % # # # # # ##u{HSM9:            	   + + + + +c + + +\C# C# C# C# C# C# C# C#LVF VF VF VF VF? VF VF VFpR R R R R R R Rj 59 *T1 8 8 8FC FO F F F F F'/ 'd ' ' ' '$, $ $ $ $ $ $r   