§
    	Êj„  ã                  óF  — d Z ddl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m	Z	m
Z
 ddlmZ ddlmZ ddlmZ ddlmZmZ d	d
lmZ  ej        e¦  «        Ze
e
egdf         ge	eeef                  f         Z G d„ dee¦  «        Z G d„ de¦  «        Z G d„ d¦  «        ZdS )zTBackground task manager for long-running jobs (video generation, batch images, ...).é    )ÚannotationsN)Ú	AwaitableÚCallable)ÚEnum)ÚPath)ÚAny)Ú	BaseModelÚFieldé   )ÚMuse2APIErrorc                  ó"   — e Zd ZdZdZdZdZdZdS )Ú
TaskStatusÚqueuedÚrunningÚ	succeededÚfailedÚ	cancelledN)Ú__name__Ú
__module__Ú__qualname__ÚQUEUEDÚRUNNINGÚ	SUCCEEDEDÚFAILEDÚ	CANCELLED© ó    ú3C:\Projects\Muse2API\src\muse2api\services\tasks.pyr   r      s'   € € € € € Ø€FØ€GØ€IØ€FØ€I€I€Ir   r   c                  ó  — e Zd ZU  ed„ ¬¦  «        Zded<   ded<   ej        Zded<   dZ	d	ed
<    ee
j
        ¬¦  «        Zded<    ee
j
        ¬¦  «        Zded<    ee¬¦  «        Zded<   dZded<   dZded<   edd„¦   «         ZdS )ÚTaskc                 óH   — dt          j        ¦   «         j        d d…         z   S )NÚtask_é   )ÚuuidÚuuid4Úhexr   r   r   ú<lambda>zTask.<lambda>!   s   € ¨Gµd´j±l´lÔ6FÀsÈÀsÔ6KÑ,K€ r   )Údefault_factoryÚstrÚidÚkindr   Ústatusr   ÚintÚprogressÚfloatÚ
created_atÚ
updated_atúdict[str, Any]ÚrequestNzdict[str, Any] | NoneÚresultÚerrorÚreturnÚboolc                óV   — | j         t          j        t          j        t          j        fv S ©N)r,   r   r   r   r   )Úselfs    r   ÚfinishedzTask.finished+   s   € àŒ{�zÔ3µZÔ5FÍ
ÔH\Ð]Ð]Ð]r   )r6   r7   )r   r   r   r
   r*   Ú__annotations__r   r   r,   r.   Útimer0   r1   Údictr3   r4   r5   Úpropertyr;   r   r   r   r    r        s
  € € € € € € ØˆeÐ$KÐ$KÐLÑLÔL€BÐLÐLÐLÑLØ€I€I�IØ#Ô*€FÐ*Ð*Ð*Ñ*Ø€HÐÐÐÑØ˜¨d¬iÐ8Ñ8Ô8€JÐ8Ð8Ð8Ñ8Ø˜¨d¬iÐ8Ñ8Ô8€JÐ8Ð8Ð8Ñ8Ø#˜e°DÐ9Ñ9Ô9€GÐ9Ð9Ð9Ñ9Ø$(€FÐ(Ð(Ð(Ñ(Ø#'€EÐ'Ð'Ð'Ñ'àð^ð ^ð ^ñ „Xð^ð ^ð ^r   r    c                  ó`   — e Zd Zdddœd#d„Zd$d„Zd$d„Zd%d„Zd&d'd„Zd(d„Zd)d„Z	d*d!„Z
d$d"„ZdS )+ÚTaskManageriô  N)Úmax_keptÚ	on_finishÚpathr   rB   r-   rC   ú(Callable[[Task], Awaitable[None]] | Noner6   ÚNonec               óL   — || _         || _        || _        i | _        i | _        d S r9   )rD   rB   rC   Ú_tasksÚ_running)r:   rD   rB   rC   s       r   Ú__init__zTaskManager.__init__1   s)   € àˆŒ	Ø ˆŒà"ˆŒØ')ˆŒØ13ˆŒˆˆr   c              ƒ  ó¢  K  — | j                              ¦   «         sd S 	 t          j        | j                              d¬¦  «        pd¦  «        }n0# t          j        $ r t                               d¦  «         Y d S w xY w|D ]M}t           	                    |¦  «        }|j
        st          j        |_        dddœ|_        || j        |j        <   ŒNd S )Núutf-8©Úencodingz[]z$tasks file corrupted, starting emptyzinterrupted by server restartÚinterrupted©ÚmessageÚcode)rD   Úis_fileÚjsonÚloadsÚ	read_textÚJSONDecodeErrorÚlogÚwarningr    Úmodel_validater;   r   r   r,   r5   rH   r*   )r:   ÚitemsÚitemÚtasks       r   ÚloadzTaskManager.load:   së   è è € ØŒy× Ò Ñ"Ô"ð 	ØˆFð	Ý”J˜tœy×2Ò2¸GÐ2ÑDÔDÐLÈÑMÔMˆEˆEøÝÔ#ð 	ð 	ð 	Ý�KŠKÐ>Ñ?Ô?Ð?ØˆFˆFð	øøøð ð 	(ð 	(ˆDÝ×&Ò& tÑ,Ô,ˆDØ”=ð aÝ(Ô/�”Ø)HÐR_Ð`Ð`�”
Ø#'ˆDŒK˜œÑ Ð ð	(ð 	(s   Ÿ/A Á)A<Á;A<c                óª  — t          | j                             ¦   «         d„ ¬¦  «        | j         d …         }d„ |D ¦   «         | _        | j        j                             dd¬¦  «         | j                             d¦  «        }|                     t          j
        d„ |D ¦   «         d¬	¦  «        d
¬¦  «         |                     | j        ¦  «         d S )Nc                ó   — | j         S r9   ©r0   ©Úts    r   r'   z&TaskManager._persist.<locals>.<lambda>J   s   € ¸1¼<€ r   )Úkeyc                ó   — i | ]
}|j         |“ŒS r   )r*   ©Ú.0rc   s     r   ú
<dictcomp>z(TaskManager._persist.<locals>.<dictcomp>K   s   € Ð.Ð.Ð. 1�q”t˜QÐ.Ð.Ð.r   T)ÚparentsÚexist_okz.tmpc                ó:   — g | ]}|                      d ¬¦  «        ‘ŒS )rT   )Úmode)Ú
model_dumprf   s     r   ú
<listcomp>z(TaskManager._persist.<locals>.<listcomp>O   s&   € ÐAÐAÐA°a˜Ÿš¨&˜Ñ1Ô1ÐAÐAÐAr   F)Úensure_asciirL   rM   )ÚsortedrH   ÚvaluesrB   rD   ÚparentÚmkdirÚwith_suffixÚ
write_textrT   ÚdumpsÚreplace)r:   ÚtasksÚtmps      r   Ú_persistzTaskManager._persistI   sÙ   € Ý�t”{×)Ò)Ñ+Ô+Ð1GÐ1GÐHÑHÔHÈ$Ì-ÈÐIYÐIYÔZˆØ.Ð.¨Ð.Ñ.Ô.ˆŒØŒ	Ô×Ò t°dÐÑ;Ô;Ð;ØŒi×#Ò# FÑ+Ô+ˆØ�ŠÝŒJÐAÐA¸5ÐAÑAÔAÐPUÐVÑVÔVØð 	ñ 	
ô 	
ð 	
ð 	�Š�D”IÑÔÐÐÐr   Útask_idr)   úTask | Nonec                ó6   — | j                              |¦  «        S r9   )rH   Úget)r:   r{   s     r   r~   zTaskManager.getT   s   € ØŒ{�Š˜wÑ'Ô'Ð'r   éd   Úlimitú
list[Task]c                óf   — t          | j                             ¦   «         d„ d¬¦  «        d |…         S )Nc                ó   — | j         S r9   ra   rb   s    r   r'   z"TaskManager.list.<locals>.<lambda>X   s   € ¸!¼,€ r   T)rd   Úreverse)rp   rH   rq   )r:   r€   s     r   ÚlistzTaskManager.listW   s6   € Ý�d”k×(Ò(Ñ*Ô*Ð0FÐ0FÐPTÐUÑUÔUÐV\ÐW\ÐV\Ô]Ð]r   r+   r3   r2   ÚrunnerÚRunnerr    c                óØ   — t          ||¬¦  «        }|| j        |j        <   |                      ¦   «          t	          j        |                      ||¦  «        ¦  «        | j        |j        <   |S )N)r+   r3   )r    rH   r*   rz   ÚasyncioÚcreate_taskÚ_runrI   )r:   r+   r3   r†   r]   s        r   ÚsubmitzTaskManager.submitZ   s[   € Ý˜ wÐ/Ñ/Ô/ˆØ#ˆŒ�D”GÑØ�Š‰ŒˆÝ!(Ô!4°T·Y²Y¸tÀVÑ5LÔ5LÑ!MÔ!MˆŒ�d”gÑØˆr   r]   c              ƒ  ó–  ‡K  — dˆfd„}t           j        ‰_        	  ||¦  «        ƒ d {V —†‰_        t           j        ‰_        d‰_        n·# t          j        $ r t           j        ‰_        Y n•t          $ r/}t           j
        ‰_        |j        |j        dœ‰_        Y d }~nbd }~wt          $ rR}t                               d‰j        ¦  «         t           j
        ‰_        t%          |¦  «        d	dœ‰_        Y d }~nd }~ww xY wt'          j        ¦   «         ‰_        | j                             ‰j        d ¦  «         |                      ¦   «          | j        rO	 |                      ‰¦  «        ƒ d {V —† d S # t          $ r$ t                               d
‰j        ¦  «         Y d S w xY wd S # t'          j        ¦   «         ‰_        | j                             ‰j        d ¦  «         |                      ¦   «          | j        rM	 |                      ‰¦  «        ƒ d {V —† w # t          $ r# t                               d
‰j        ¦  «         Y w w xY ww xY w)NÚpr-   r6   rF   c           	     ó¢   •— t          ‰j        t          dt          | ¦  «        ¦  «        ¦  «        ‰_        t	          j        ¦   «         ‰_        d S )Néc   )Úmaxr.   Úminr-   r=   r1   )rŽ   r]   s    €r   r.   z"TaskManager._run.<locals>.progressb   s5   ø€ Ý ¤­s°2µs¸1±v´v©¬Ñ?Ô?ˆDŒMÝ"œi™kœkˆDŒOˆOˆOr   r   rP   ztask %s crashedÚinternal_errorz!on_finish hook failed for task %s)rŽ   r-   r6   rF   )r   r   r,   r4   r   r.   r‰   ÚCancelledErrorr   r   r   rQ   rR   r5   Ú	ExceptionrX   Ú	exceptionr*   r)   r=   r1   rI   Úpoprz   rC   )r:   r]   r†   r.   Úexcs    `   r   r‹   zTaskManager._runa   s¤  øè è € ð	*ð 	*ð 	*ð 	*ð 	*ð 	*õ !Ô(ˆŒð	PØ &  xÑ 0Ô 0Ð0Ð0Ð0Ð0Ð0Ð0ˆDŒKÝ$Ô.ˆDŒKØˆDŒMˆMøÝÔ%ð 	/ð 	/ð 	/Ý$Ô.ˆDŒKˆKˆKÝð 	Dð 	Dð 	DÝ$Ô+ˆDŒKØ%(¤[¸#¼(ÐCÐCˆDŒJˆJˆJˆJˆJˆJøøøøÝð 	Ið 	Ið 	IÝ�MŠMÐ+¨T¬WÑ5Ô5Ð5Ý$Ô+ˆDŒKÝ%(¨¡X¤XÐ7GÐHÐHˆDŒJˆJˆJˆJˆJˆJøøøøð	Iøøøõ
 #œi™kœkˆDŒOØŒM×Ò˜dœg tÑ,Ô,Ð,Ø�MŠM‰OŒOˆOØŒ~ð PðPØŸ.š.¨Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.øÝ ð Pð Pð PÝ—M’MÐ"EÀtÄwÑOÔOÐOÐOÐOÐOðPøøøðPð Pøõ #œi™kœkˆDŒOØŒM×Ò˜dœg tÑ,Ô,Ð,Ø�MŠM‰OŒOˆOØŒ~ð PðPØŸ.š.¨Ñ.Ô.Ð.Ð.Ð.Ð.Ð.Ð.Ð.Ð.øÝ ð Pð Pð PÝ—M’MÐ"EÀtÄwÑOÔOÐOÐOÐOðPøøøðPøøøs…   œ.A Á
F& Á C?Á+F& Á-	C?Á6%B ÂF& Â C?Â-AC:Ã5F& Ã:C?Ã?F& ÅE3 Å3*F!Æ F!Æ&AIÇ;HÈIÈ*IÉIÉIÉIr7   c              ƒ  ón   K  — | j                              |¦  «        }|€dS |                     ¦   «          dS )NFT)rI   r~   Úcancel)r:   r{   r   s      r   rš   zTaskManager.cancel~   s:   è è € Ø”-×#Ò# GÑ,Ô,ˆØˆ?Ø�5Ø�ŠÑÔÐØˆtr   c              ƒ  óò   K  — t          | j                             ¦   «         ¦  «        D ]}|                     ¦   «          Œ| j        r0t	          j        | j                             ¦   «         ddiŽƒ d {V —† d S d S )NÚreturn_exceptionsT)r…   rI   rq   rš   r‰   Úgather)r:   rc   s     r   ÚshutdownzTaskManager.shutdown…   sŒ   è è € Ý�d”m×*Ò*Ñ,Ô,Ñ-Ô-ð 	ð 	ˆAØ�HŠH‰JŒJˆJˆJØŒ=ð 	RÝ”. $¤-×"6Ò"6Ñ"8Ô"8ÐQÈDÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQÐQð	Rð 	Rr   )rD   r   rB   r-   rC   rE   r6   rF   )r6   rF   )r{   r)   r6   r|   )r   )r€   r-   r6   r�   )r+   r)   r3   r2   r†   r‡   r6   r    )r]   r    r†   r‡   r6   rF   )r{   r)   r6   r7   )r   r   r   rJ   r^   rz   r~   r…   rŒ   r‹   rš   rž   r   r   r   rA   rA   0   sì   € € € € € Ø69ØGKð4ð 4ð 4ð 4ð 4ð 4ð(ð (ð (ð (ð	ð 	ð 	ð 	ð(ð (ð (ð (ð^ð ^ð ^ð ^ð ^ðð ð ð ðPð Pð Pð Pð:ð ð ð ðRð Rð Rð Rð Rð Rr   rA   ) Ú__doc__Ú
__future__r   r‰   rT   Úloggingr=   r$   Úcollections.abcr   r   Úenumr   Úpathlibr   Útypingr   Úpydanticr	   r
   Úerrorsr   Ú	getLoggerr   rX   r-   r>   r)   r‡   r   r    rA   r   r   r   ú<module>r©      s¢  ðØ ZÐ Zà "Ð "Ð "Ð "Ð "Ð "à €€€Ø €€€Ø €€€Ø €€€Ø €€€Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð à %Ð %Ð %Ð %Ð %Ð %Ð %Ð %à "Ð "Ð "Ð "Ð "Ð "à€gÔ˜Ñ!Ô!€à	�8˜S˜E 4˜KÔ(Ð)¨9°T¸#¸s¸(´^Ô+DÐDÔ	E€ðð ð ð ð ��dñ ô ð ð^ð ^ð ^ð ^ð ^ˆ9ñ ^ô ^ð ^ð YRð YRð YRð YRð YRñ YRô YRð YRð YRð YRr   