
    ^(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"y)!    )	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y)	NodeStatependingrunningfinishederrorN)__name__
__module____qualname__PendingRunningFinishedError     B/Users/danicosta/Desktop/Flux2/ComfyUI/comfy_execution/progress.pyr   r      s    GGHEr   r   c                   0    e Zd ZU dZeed<   eed<   eed<   y)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     L	Jr   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y	)ProgressHandlerz
    Abstract base class for progress handlers.
    Progress handlers receive progress updates and display them in various ways.
    namec                      || _         d| _        y )NT)r+   enabled)selfr+   s     r    __init__zProgressHandler.__init__&   s    	r   c                      y Nr   r.   registrys     r    set_registryzProgressHandler.set_registry*   s    r   node_idr#   	prompt_idc                      y)z$Called when a node starts processingNr   r.   r5   r#   r6   s       r    start_handlerzProgressHandler.start_handler-       r   Nr$   	max_valueimagec                      y)z(Called when a node's progress is updatedNr   )r.   r5   r$   r;   r#   r6   r<   s          r    update_handlerzProgressHandler.update_handler1   s     	r   c                      y)z&Called when a node finishes processingNr   r8   s       r    finish_handlerzProgressHandler.finish_handler=   r:   r   c                      y)z*Called when the progress registry is resetNr   r.   s    r    resetzProgressHandler.resetA   r:   r   c                     d| _         y)zEnable this handlerTNr-   rB   s    r    enablezProgressHandler.enableE   s	    r   c                     d| _         y)zDisable this handlerFNrE   rB   s    r    disablezProgressHandler.disableI   s	    r   r3   ProgressRegistryr1   )r   r   r   r&   strr/   r4   r"   r9   r(   PreviewImageTupler>   r@   rC   rF   rH   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                 2    t         |   d       i | _        y )Ncli)superr/   progress_bars)r.   	__class__s    r    r/   zCLIProgressHandler.__init__S   s    .0r   r5   r#   r6   c           	          || j                   vr7t        |d   d| ddt        | j                               | j                   |<   y y )Nr%   Node stepsTtotaldescunitleaveposition)rR   r   lenr8   s       r    r9   z CLIProgressHandler.start_handlerW   sQ     $,,,*.ElWI&T//0+Dw' -r   Nr$   r;   r<   c           	         || j                   vrRt        |d| ddt        | j                               | j                   |<   | j                   |   j                  |       y || j                   |   j                  k7  r|| j                   |   _        | j                   |   j
                  }||z
  }|dkD  r| j                   |   j                  |       y y )NrU   rV   TrW   r   )rR   r   r]   updaterX   n)	r.   r5   r$   r;   r#   r6   r<   current_positionupdate_amounts	            r    r>   z!CLIProgressHandler.update_handlerc   s     $,,,*.WI&T//0+Dw' w'..u5 D..w7===4=""7+1#11':<<!$44Mq ""7+22=A !r   c                     || j                   v rm|d   | j                   |   j                  z
  }|dkD  r| j                   |   j                  |       | j                   |   j                          | j                   |= y y )Nr%   r   )rR   r`   r_   close)r.   r5   r#   r6   	remainings        r    r@   z!CLIProgressHandler.finish_handler   s{     d(((et'9'9''B'D'DDI1}""7+229=w'--/""7+ )r   c                     | j                   j                         D ]  }|j                           | j                   j                          y r1   )rR   valuesrd   clear)r.   bars     r    rC   zCLIProgressHandler.reset   s8     %%,,.CIIK /  "r   r1   )r   r   r   r&   r/   r   rK   r"   r9   r(   rL   r>   r@   rC   __classcell__rS   s   @r    rN   rN   N   s    1 	S 	1B 	s 	 	  +/BB B 	B
 !B B !4'B B: ,c ,2C ,PS , , # #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                 2    t         |   d       || _        y )Nwebui)rQ   r/   server_instance)r.   rp   rS   s     r    r/   zWebUIProgressHandler.__init__   s    !.r   c                     || _         y r1   )r3   r2   s     r    r4   z!WebUIProgressHandler.set_registry   s	     r   r6   nodesc                    | j                   y|j                         D ci c]  \  }}|d   t        j                  k7  r||d   |d   |d   j                  ||| j
                  j                  j                  |      | j
                  j                  j                  |      | j
                  j                  j                  |      d }}}| j                   j                  d||d| j                   j                         yc c}}w )z-Send the current progress state to the clientNr#   r$   r%   )r$   r%   r#   r5   r6   display_node_idparent_node_idreal_node_idprogress_state)r6   rr   )rp   itemsr   r   r$   r3   	dynpromptget_display_node_idget_parent_node_idget_real_node_id	send_sync	client_id)r.   r6   rr   r5   r#   active_nodess         r    _send_progress_statez)WebUIProgressHandler._send_progress_state   s    ' #(++-
 #0W~!2!22 wU|w--"&#'==#:#:#N#Nw#W"&--"9"9"L"LW"U $ 7 7 H H Q	 	 #0 	 
" 	&&IMtOcOcOmOm	
#
s   B(Dr5   r#   c                 j    | j                   r'| j                  || j                   j                         y y r1   r3   r   rr   r8   s       r    r9   z"WebUIProgressHandler.start_handler   *     ==%%i1D1DE r   Nr$   r;   r<   c                 R   | j                   r&| j                  || j                   j                         |rt        j                  | j
                  j                  | j
                  j                  d      r||| j                   j                  j                  |      | j                   j                  j                  |      | j                   j                  j                  |      d}| j
                  j                  t        j                  ||f| j
                  j                         y y y )Nsupports_preview_metadata)r5   r6   rt   ru   rv   )r3   r   rr   r   supports_featurerp   sockets_metadatar~   ry   rz   r{   r|   r}   r   PREVIEW_IMAGE_WITH_METADATA)r.   r5   r$   r;   r#   r6   r<   metadatas           r    r>   z#WebUIProgressHandler.update_handler   s     ==%%i1D1DE--$$55$$..+  '!*'+}}'>'>'R'R( '+mm&=&=&P&P' %)MM$;$;$L$LW$U
 $$..$@@H%((22! r   c                 j    | j                   r'| j                  || j                   j                         y y r1   r   r8   s       r    r@   z#WebUIProgressHandler.finish_handler   r   r   rI   r1   )r   r   r   r&   r/   r4   rK   r   r"   r   r   r9   r(   rL   r>   r@   rj   rk   s   @r    rm   rm      s    /!
c 
$sDU?U:V 
6 FS F1B Fs F F
  +/"" " 	"
 !" " !4'" "H Fc F2C FPS 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y)rJ   zW
    Registry that maintains node progress state and notifies registered handlers.
    r6   ry   r   c                 <    || _         || _        i | _        i | _        y r1   )r6   ry   rr   handlers)r.   r6   ry   s      r    r/   zProgressRegistry.__init__   s    ""35
46r   handlerreturnNc                 6    || j                   |j                  <   y)zRegister a progress handlerN)r   r+   r.   r   s     r    register_handlerz!ProgressRegistry.register_handler   s    &-gll#r   handler_namec                 v    || j                   v r+| j                   |   j                          | j                   |= yy)zUnregister a progress handlerN)r   rC   r.   r   s     r    unregister_handlerz#ProgressRegistry.unregister_handler   s4    4==(MM,'--/l+ )r   c                 \    || j                   v r| j                   |   j                          yy)zEnable a progress handlerN)r   rF   r   s     r    enable_handlerzProgressRegistry.enable_handler  s(    4==(MM,'..0 )r   c                 \    || j                   v r| j                   |   j                          yy)zDisable a progress handlerN)r   rH   r   s     r    disable_handlerz ProgressRegistry.disable_handler  s(    4==(MM,'//1 )r   r5   c                     || 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.   r5   s     r    ensure_entryzProgressRegistry.ensure_entry  s?    $**$"3''qa#DJJw zz'""r   c                     | j                  |      }t        j                  |d<   d|d<   d|d<   | j                  j	                         D ],  }|j
                  s|j                  ||| j                         . y)z"Start progress tracking for a noder#   g        r$   g      ?r%   N)r   r   r   r   rg   r-   r9   r6   r.   r5   entryr   s       r    start_progresszProgressRegistry.start_progress  si    !!'*"**gge }}++-G%%gudnnE .r   r$   r;   r<   c           	          | j                  |      }t        j                  |d<   ||d<   ||d<   | j                  j	                         D ]/  }|j
                  s|j                  ||||| j                  |       1 y)zUpdate progress for a noder#   r$   r%   N)r   r   r   r   rg   r-   r>   r6   )r.   r5   r$   r;   r<   r   r   s          r    update_progressz ProgressRegistry.update_progress   st     !!'*"**gg e }}++-G&&UIudnne .r   c                     | j                  |      }t        j                  |d<   |d   |d<   | j                  j	                         D ],  }|j
                  s|j                  ||| j                         . y)z#Finish progress tracking for a noder#   r%   r$   N)r   r   r   r   rg   r-   r@   r6   r   s       r    finish_progressz ProgressRegistry.finish_progress0  sd    !!'*"++gug }}++-G&&wt~~F .r   c                 b    | j                   j                         D ]  }|j                           y)zReset all handlersN)r   rg   rC   r   s     r    reset_handlerszProgressRegistry.reset_handlers;  s"    }}++-GMMO .r   r1   )r   N)r   r   r   r&   rK   r/   r*   r   r   r   r   r"   r   r   r(   rL   r   r   r   r   r   r    rJ   rJ      s    7# 7/ 7. .D .,s ,t ,13 14 1
2C 2D 2
#C #,= #
Fc 
Fd 
F _c#(5:CTW[C[	 	Gs 	Gt 	Gr   rJ   Nglobal_progress_registryr6   ry   r   r   c                 P    t         t         j                          t        | |      a y r1   )r   r   rJ   r6   ry   s     r    reset_progress_stater   C  s%      + //1  0	9Er   r   c                 \    t               }| j                  |       |j                  |        y r1   )get_progress_stater4   r   )r   r3   s     r    add_progress_handlerr   N  s&    !#H"g&r   c                  L    t         ddlm}  t        d | i             a t         S )Nr   r    r   )r   comfy_execution.graphr   rJ   r   s    r    r   r   T  s(    '7#3M"$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   rJ   r   r'   r   r   r   r   r   r    <module>r      s    3 3 &      3 % ##u{{HSM9:  	 +c +\C# C#LVF? VFpR Rj 59 *T1 8FC FO F F'/ 'd '$, $r   