
    +j.                        % S SK JrJrJrJr  S SKJr  S SKJr  S SK	J
r
  S SKJr  S SKJr  S SK Jr  \(       a  S SKJr  S S	KJr  S S
KJr  \\\R                  \\   4   r " S S\
5      r " S S\5      r " S S\5      r " S S\5      r " S S\5      r " S S5      rSq\S-  \S'   S\SSSS4S jr S\SS4S jr!S\4S  jr"g)!    )	TypedDictDictOptionalTuple)override)Image)Enum)ABC)tqdm)TYPE_CHECKINGDynamicPrompt)BinaryEventTypes)feature_flagsc                   $    \ rS rSrSrSrSrSrSrg)	NodeState   pendingrunningfinishederror N)	__name__
__module____qualname____firstlineno__PendingRunningFinishedError__static_attributes__r       8/home/wildlama/comfy/ComfyUI/comfy_execution/progress.pyr   r      s    GGHEr"   r   c                   8    \ rS rSr% Sr\\S'   \\S'   \\S'   Srg)NodeProgressState   z6
A class to represent the state of a node's progress.
statevaluemaxr   N)	r   r   r   r   __doc__r   __annotations__floatr!   r   r"   r#   r%   r%      s     L	Jr"   r%   c                       \ rS rSrSrS\4S jrSS jrS\S\S\4S	 jr	 SS\S\
S\
S\S\S\S
-  4S jjrS\S\S\4S jrS rS rS rSrg
)ProgressHandler    zy
Abstract base class for progress handlers.
Progress handlers receive progress updates and display them in various ways.
namec                     Xl         SU l        g )NT)r0   enabled)selfr0   s     r#   __init__ProgressHandler.__init__&   s    	r"   c                     g Nr   r3   registrys     r#   set_registryProgressHandler.set_registry*   s    r"   node_idr'   	prompt_idc                     g)z$Called when a node starts processingNr   r3   r<   r'   r=   s       r#   start_handlerProgressHandler.start_handler-       r"   Nr(   	max_valueimagec                     g)z(Called when a node's progress is updatedNr   )r3   r<   r(   rC   r'   r=   rD   s          r#   update_handlerProgressHandler.update_handler1   s     	r"   c                     g)z&Called when a node finishes processingNr   r?   s       r#   finish_handlerProgressHandler.finish_handler=   rB   r"   c                     g)z*Called when the progress registry is resetNr   r3   s    r#   resetProgressHandler.resetA   rB   r"   c                     SU l         g)zEnable this handlerTNr2   rL   s    r#   enableProgressHandler.enableE   s	    r"   c                     SU l         g)zDisable this handlerFNrP   rL   s    r#   disableProgressHandler.disableI   s	    r"   )r2   r0   r9   ProgressRegistryr7   )r   r   r   r   r*   strr4   r:   r%   r@   r,   PreviewImageTuplerF   rI   rM   rQ   rT   r!   r   r"   r#   r.   r.       s    
S S 1B s  +/

 
 	

 !
 
 !4'
c 2C PS r"   r.   c                      ^  \ rS rSrSrU 4S jr\S\S\S\4S j5       r	\ SS\S	\
S
\
S\S\S\S-  4S jj5       r\S\S\S\4S j5       r\S 5       rSrU =r$ )CLIProgressHandlerN   zE
Handler that displays progress using tqdm progress bars in the CLI.
c                 2   > [         TU ]  S5        0 U l        g )Ncli)superr4   progress_bars)r3   	__class__s    r#   r4   CLIProgressHandler.__init__S   s    .0r"   r<   r'   r=   c           	          XR                   ;  a4  [        US   SU 3SS[        U R                   5      S9U R                   U'   g g )Nr)   Node stepsTtotaldescunitleaveposition)r`   r   lenr?   s       r#   r@    CLIProgressHandler.start_handlerW   sO     ,,,*.ElWI&T//0+Dw' -r"   Nr(   rC   rD   c           	         XR                   ;  aO  [        USU 3SS[        U R                   5      S9U R                   U'   U R                   U   R                  U5        g X0R                   U   R                  :w  a  X0R                   U   l        U R                   U   R
                  nX'-
  nUS:  a  U R                   U   R                  U5        g g )Nrd   re   Trf   r   )r`   r   rl   updaterg   n)	r3   r<   r(   rC   r'   r=   rD   current_positionupdate_amounts	            r#   rF   !CLIProgressHandler.update_handlerc   s     ,,,*.WI&T//0+Dw' w'..u5 ..w7===4=""7+1#11':<<!4Mq ""7+22=A !r"   c                     XR                   ;   an  US   U R                   U   R                  -
  nUS:  a  U R                   U   R                  U5        U R                   U   R                  5         U R                   U	 g g )Nr)   r   )r`   rp   ro   close)r3   r<   r'   r=   	remainings        r#   rI   !CLIProgressHandler.finish_handler   sy     (((et'9'9''B'D'DDI1}""7+229=w'--/""7+ )r"   c                     U R                   R                  5        H  nUR                  5         M     U R                   R                  5         g r7   )r`   valuesru   clear)r3   bars     r#   rM   CLIProgressHandler.reset   s8     %%,,.CIIK /  "r"   )r`   r7   )r   r   r   r   r*   r4   r   rX   r%   r@   r,   rY   rF   rI   rM   r!   __classcell__ra   s   @r#   r[   r[   N   s    1 	S 	1B 	s 	 	  +/BB B 	B
 !B B !4'B B: ,c ,2C ,PS , , # #r"   r[   c                      ^  \ rS rSrSrU 4S jrSS jrS\S\\\	4   4S jr
\S\S	\	S\4S
 j5       r\ SS\S\S\S	\	S\S\S-  4S jj5       r\S\S	\	S\4S j5       rSrU =r$ )WebUIProgressHandler   zB
Handler that sends progress updates to the WebUI via WebSockets.
c                 0   > [         TU ]  S5        Xl        g )Nwebui)r_   r4   server_instance)r3   r   ra   s     r#   r4   WebUIProgressHandler.__init__   s    !.r"   c                     Xl         g r7   )r9   r8   s     r#   r:   !WebUIProgressHandler.set_registry   s     r"   r=   nodesc                    U R                   c  gUR                  5        VVs0 s H  u  p4US   [        R                  :w  d  M  UUS   US   US   R                  UUU R
                  R                  R                  U5      U R
                  R                  R                  U5      U R
                  R                  R                  U5      S._M     nnnU R                   R                  SXS.U R                   R                  5        gs  snnf )z-Send the current progress state to the clientNr'   r(   r)   )r(   r)   r'   r<   r=   display_node_idparent_node_idreal_node_idprogress_state)r=   r   )r   itemsr   r   r(   r9   	dynpromptget_display_node_idget_parent_node_idget_real_node_id	send_sync	client_id)r3   r=   r   r<   r'   active_nodess         r#   _send_progress_state)WebUIProgressHandler._send_progress_state   s    ' #(++-
 #0W~!2!22	GwU|w--"&#'==#:#:#N#Nw#W"&--"9"9"L"LW"U $ 7 7 H H Q	 	 #0 	 
" 	&&IMtOcOcOmOm	
#
s   DBDr<   r'   c                 r    U R                   (       a&  U R                  X0R                   R                  5        g g r7   r9   r   r   r?   s       r#   r@   "WebUIProgressHandler.start_handler   (     ==%%i1D1DE r"   Nr(   rC   rD   c                 n   U R                   (       a%  U R                  XPR                   R                  5        U(       a  [        R                  " U R
                  R                  U R
                  R                  S5      (       a  UUU R                   R                  R                  U5      U R                   R                  R                  U5      U R                   R                  R                  U5      S.nU R
                  R                  [        R                  Xg4U R
                  R                  5        g g g )Nsupports_preview_metadata)r<   r=   r   r   r   )r9   r   r   r   supports_featurer   sockets_metadatar   r   r   r   r   r   r   PREVIEW_IMAGE_WITH_METADATA)r3   r<   r(   rC   r'   r=   rD   metadatas           r#   rF   #WebUIProgressHandler.update_handler   s     ==%%i1D1DE--$$55$$..+   '!*'+}}'>'>'R'R( '+mm&=&=&P&P' %)MM$;$;$L$LW$U
 $$..$@@%((22! r"   c                 r    U R                   (       a&  U R                  X0R                   R                  5        g g r7   r   r?   s       r#   rI   #WebUIProgressHandler.finish_handler   r   r"   )r9   r   rV   r7   )r   r   r   r   r*   r4   r:   rX   r   r%   r   r   r@   r,   rY   rF   rI   r!   r}   r~   s   @r#   r   r      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"   r   c                       \ rS rSrSrS\SS4S jrS\SS	4S
 jrS\SS	4S jr	S\SS	4S jr
S\SS	4S jrS\S\4S jrS\SS	4S jr SS\S\S\S\S	-  SS	4
S jjrS\SS	4S jrSS jrSrg	)rW      zO
Registry that maintains node progress state and notifies registered handlers.
r=   r   r   c                 8    Xl         X l        0 U l        0 U l        g r7   )r=   r   r   handlers)r3   r=   r   s      r#   r4   ProgressRegistry.__init__   s    ""35
46r"   handlerreturnNc                 4    XR                   UR                  '   g)zRegister a progress handlerN)r   r0   r3   r   s     r#   register_handler!ProgressRegistry.register_handler   s    &-gll#r"   handler_namec                 x    XR                   ;   a+  U R                   U   R                  5         U R                   U	 gg)zUnregister a progress handlerN)r   rM   r3   r   s     r#   unregister_handler#ProgressRegistry.unregister_handler   s2    ==(MM,'--/l+ )r"   c                 ^    XR                   ;   a  U R                   U   R                  5         gg)zEnable a progress handlerN)r   rQ   r   s     r#   enable_handlerProgressRegistry.enable_handler  s&    ==(MM,'..0 )r"   c                 ^    XR                   ;   a  U R                   U   R                  5         gg)zDisable a progress handlerN)r   rT   r   s     r#   disable_handler ProgressRegistry.disable_handler  s&    ==(MM,'//1 )r"   r<   c                     XR                   ;  a&  [        [        R                  SSS9U R                   U'   U R                   U   $ )zEnsure a node entry existsr      )r'   r(   r)   )r   r%   r   r   )r3   r<   s     r#   ensure_entryProgressRegistry.ensure_entry  s=    **$"3''qa#DJJw zz'""r"   c                     U R                  U5      n[        R                  US'   SUS'   SUS'   U R                  R	                  5        H2  nUR
                  (       d  M  UR                  XU R                  5        M4     g)z"Start progress tracking for a noder'   g        r(   g      ?r)   N)r   r   r   r   ry   r2   r@   r=   r3   r<   entryr   s       r#   start_progressProgressRegistry.start_progress  si    !!'*"**gge }}++-G%%gdnnE .r"   r(   rC   rD   c           	          U R                  U5      n[        R                  US'   X%S'   X5S'   U R                  R	                  5        H4  nUR
                  (       d  M  UR                  XX5U R                  U5        M6     g)zUpdate progress for a noder'   r(   r)   N)r   r   r   r   ry   r2   rF   r=   )r3   r<   r(   rC   rD   r   r   s          r#   update_progress ProgressRegistry.update_progress   sn     !!'*"**gg e }}++-G&&Idnne .r"   c                     U R                  U5      n[        R                  US'   US   US'   U R                  R	                  5        H2  nUR
                  (       d  M  UR                  XU R                  5        M4     g)z#Finish progress tracking for a noder'   r)   r(   N)r   r   r   r   ry   r2   rI   r=   r   s       r#   finish_progress ProgressRegistry.finish_progress0  sd    !!'*"++gug }}++-G&&wt~~F .r"   c                 f    U R                   R                  5        H  nUR                  5         M     g)zReset all handlersN)r   ry   rM   r   s     r#   reset_handlersProgressRegistry.reset_handlers;  s"    }}++-GMMO .r"   )r   r   r   r=   r7   )r   N)r   r   r   r   r*   rX   r4   r.   r   r   r   r   r%   r   r   r,   rY   r   r   r   r!   r   r"   r#   rW   rW      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"   rW   Nglobal_progress_registryr=   r   r   r   c                 P    [         b  [         R                  5         [        X5      q g r7   )r   r   rW   r=   r   s     r#   reset_progress_stater   C  s#      + //1  0	Er"   r   c                 \    [        5       nU R                  U5        UR                  U 5        g r7   )get_progress_stater:   r   )r   r9   s     r#   add_progress_handlerr   N  s&    !#H"g&r"   c                  H    [         c  SSKJn   [        SU " 0 5      S9q [         $ )Nr   r    r   )r   comfy_execution.graphr   rW   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   rX   intrY   r   r%   r.   r[   r   rW   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"   