
    R3iz'                        d Z ddlmZ ddlmZ ddlmZmZmZ ddlm	Z	m
Z
mZmZ ddlZddlmZ ddlmZ d	d
lmZmZ e	r
d	dlmZmZmZ e G d d             Z G d de      Ze G d d             Z G d d      Zg dZy)z.Snapshot and worker tracking mixin for Docket.    )AbstractAsyncContextManager)	dataclass)datetime	timedeltatimezone)TYPE_CHECKING
CollectionSequencecastN)Redis)RedisCluster   )	ExecutionExecutionState)RedisMessageRedisMessageIDRedisStreamPendingMessagec                   2    e Zd ZU eed<   eed<   ee   ed<   y)
WorkerInfoname	last_seentasksN)__name__
__module____qualname__str__annotations__r   set     a/mnt/e/genesis-system/.venvs/voice-bridge/lib/python3.12/site-packages/docket/_docket_snapshot.pyr   r      s    
Is8Or    r   c                   F     e Zd ZU eed<   eed<   dedededdf fdZ xZS )RunningExecutionworkerstarted	executionreturnNc                    t         |   |j                  |j                  |j                  |j
                  |j                  |j                  |j                  |j                  |j                  	       |j                  | _        |j                  | _        |j                  | _        |j                  | _        |j                  | _        || _        || _        y )N)	docketfunctionargskwargskeywhenattempttrace_contextredelivered)super__init__r)   r*   r+   r,   r-   r.   r/   r0   r1   state
started_atcompleted_aterror
result_keyr$   r%   )selfr&   r$   r%   	__class__s       r!   r3   zRunningExecution.__init__   s     	##''##%%#11!-- 	 
	
 &/__
+4+?+?-6-C-C!*
&/&:&:r    )	r   r   r   r   r   r   r   r3   __classcell__)r:   s   @r!   r#   r#      s>    K  	
 
 r    r#   c                   R    e Zd ZU eed<   eed<   ee   ed<   ee   ed<   e	e
   ed<   y)DocketSnapshottakentotal_tasksfuturerunningworkersN)r   r   r   r   r   intr
   r   r#   r	   r   r   r    r!   r=   r=   7   s/    OY&''
##r    r=   c                       e Zd ZU dZerPeed<   ded<   eed<   edefd       Z	edefd       Z
edefd	       Zd
edefdZdedefdZdeeez     fdZddZedefd       ZdedefdZdedefdZdefdZdee   fdZdedee   fdZy)DocketSnapshotMixina4  Mixin providing snapshot and worker tracking functionality for Docket.

    This mixin extracts the observability-related methods from Docket:
    - snapshot(): Get current state of all tasks
    - workers(): List all active workers
    - task_workers(): List workers capable of a specific task

    Note: This mixin expects to be used with a Docket class that provides:
    - name, url, heartbeat_interval, missed_heartbeats, worker_group_name
    - stream_key, queue_key properties
    - key(), parked_task_key(), redis(), _ensure_stream_and_group() methods
    urlr   heartbeat_intervalmissed_heartbeatsr'   c                      y Nr   r9   s    r!   
stream_keyzDocketSnapshotMixin.stream_keyT   s    %(r    c                      y rJ   r   rK   s    r!   	queue_keyzDocketSnapshotMixin.queue_keyV   s    $'r    c                      y rJ   r   rK   s    r!   worker_group_namez%DocketSnapshotMixin.worker_group_nameX   s    ,/r    suffixc                      y rJ   r   )r9   rQ   s     r!   r-   zDocketSnapshotMixin.key[       r    task_keyc                      y rJ   r   )r9   rT   s     r!   parked_task_keyz#DocketSnapshotMixin.parked_task_key\   rS   r    c                      y rJ   r   rK   s    r!   rediszDocketSnapshotMixin.redis]   rS   r    Nc                    K   y wrJ   r   rK   s    r!   _ensure_stream_and_groupz,DocketSnapshotMixin._ensure_stream_and_group^   s     s   c                 $    | j                  d      S )NrB   r-   rK   s    r!   workers_setzDocketSnapshotMixin.workers_set`   s    xx	""r    worker_namec                 *    | j                  d|       S )Nzworker-tasks:r\   )r9   r^   s     r!   worker_tasks_setz$DocketSnapshotMixin.worker_tasks_setd   s    xx-}566r    	task_namec                 *    | j                  d|       S )Nztask-workers:r\   )r9   ra   s     r!   task_workers_setz$DocketSnapshotMixin.task_workers_setg   s    xx-	{344r    c           	      x  K   | j                   j                  d      r| j                          d{    g }g }| j                         4 d{   }|j	                         4 d{   }|j                  | j                         |j                  | j                         |j                  | j                  | j                  ddd       |j                  | j                  ddd       |j                  | j                  dd	       t        j                  t        j                         }	 |j#                          d{   \  }}}}	}
|
D ]0  }|j-                  | j/                  |j1                                      2 |j#                          d{   D cg c]  }|s|	 }}ddd      d{    ddd      d{    z   }D ci c]  }|d   |
 }}ddlm} t7        ||       }	D ]  \  }}t9        j:                  ||       d{   }||v rH||   d   j1                         }t=        ||   d         z
  }|j?                  tA        |||             p|j?                  |        D ]1  }t9        j:                  ||       d{   }|j?                  |       3 | jC                          d{   }tE        ||||      S 7 7 7 r7 # t        j$                  j&                  $ rt}t)        |      }d
|v sd|v r[| j                          d{  7   | j+                          d{  7  cY d}~cddd      d{  7   cddd      d{  7   S  d}~ww xY w7 c c}w 7 # 1 d{  7  sw Y   xY w7 # 1 d{  7  sw Y   xY wc c}w 7 7 !7 w)zGet a snapshot of the Docket, including which tasks are scheduled or currently
        running, as well as which workers are active.

        Returns:
            A snapshot of the Docket.
        z	memory://N-+i  )minmaxcount)ri   r   NOGROUPXPENDING
message_idr   )Docketconsumertime_since_delivered)milliseconds)#rF   
startswithrZ   rX   pipelinexlenrL   zcardrN   xpending_rangerP   xrangezranger   nowr   utcexecute
exceptionsResponseErrorr   snapshothgetallrV   decoder)   rn   r   r   from_messager   appendr#   rB   r=   )r9   rA   r@   rrs   ry   total_stream_messagestotal_schedule_messagespending_messagesstream_messagesscheduled_task_keyse	error_strrT   mqueued_messagesr?   pendingpending_lookuprn   r)   rm   messager&   r^   r%   rB   s                              r!   r~   zDocketSnapshotMixin.snapshotj   s     88{+//111*,"$::< 3	 3	1zz| 2 2xdoo.t~~.''OO** (  cF26 ll8<<0 '..00-/('+ !4 NH$$T%9%9(//:K%LMN &.%5%5%7771A7 7a2 23	 3	j ,.EE ;KK
/6GL!7*K
 K

 	#fd##2 		)J'44VWEEI^+,Z8DKKM	!/
!;<R!S!  /	;PQi(		) ' 	%G'44VWEEIMM)$	% &c;IIm 2
3	2> 1''55  !$AI I-y1H";;===%)]]_444O2 2 23	 3	 3	R "  87a2 2 2 23	 3	 3	 3	nK
 F F 's  /N:KN:KN:N'K(N+C M>,K?K 
K
AM>M3M>M6!M6%M>'N2M;3N7N:NN:N-5N:N2BN:N5*N:?N8 N:N:NKM0<&M+"L%
#M+;L>
<M+ M0M>NMNN:#M&$N:*M++M00M>6M>;N>N	NN	NN:N*N N*%N:5N:8N:c           
      Z  K   g }t        j                  t        j                        j	                         | j
                  j                         | j                  z  z
  }| j                         4 d{   }|j                  | j                  d|       d{    |j                  | j                  ddd       d{   D ]  \  }}|j                         }t        j                  |t        j                        }t        t        t            |j#                  | j%                  |             d{         D ch c]  }|j                          }	}|j'                  t)        |||	              ddd      d{    |S 7 7 7 7 Zc c}w 7 # 1 d{  7  sw Y   |S xY ww)zGet a list of all workers that have sent heartbeats to the Docket.

        Returns:
            A list of all workers that have sent heartbeats to the Docket.
        Nr   rj   T
withscores)r   ry   r   rz   	timestamprG   total_secondsrH   rX   zremrangebyscorer]   rx   r   fromtimestampr   r   bytessmembersr`   r   r   )
r9   rB   oldestr   worker_name_byteslast_seen_timestampr^   r   task_name_bytes
task_namess
             r!   rB   zDocketSnapshotMixin.workers   s     %'hll+557##113d6L6LL
 ::< 	O 	O1$$T%5%5q&AAA
 AB  !RD AI A ; O6!#6 0668$223FU	 ,0E
!**T5J5J;5W*X$X,(' $**,(
 ( z+y*MNO	O 	O* +	OA
; %Y(	O 	O 	O 	O* s   A0F+2F3F+6!FF&F>F
?A2F1F2
F<F F3F+>F?F+F
FFFF+F(FF(#F+c           
      n  K   g }t        j                  t        j                        j	                         | j
                  j                         | j                  z  z
  }| j                         4 d{   }|j                  | j                  |      d|       d{    |j                  | j                  |      ddd       d{   D ]  \  }}|j                         }t        j                  |t        j                        }t        t        t            |j#                  | j%                  |             d{         D 	ch c]  }	|	j                          }
}	|j'                  t)        |||
              ddd      d{    |S 7 7 7 7 Zc c}	w 7 # 1 d{  7  sw Y   |S xY ww)zGet a list of all workers that are able to execute a given task.

        Args:
            task_name: The name of the task.

        Returns:
            A list of all workers that are able to execute the given task.
        Nr   rj   Tr   )r   ry   r   rz   r   rG   r   rH   rX   r   rc   rx   r   r   r   r   r   r   r`   r   r   )r9   ra   rB   r   r   r   r   r^   r   r   r   s              r!   task_workersz DocketSnapshotMixin.task_workers   s     %'hll+557##113d6L6LL
 ::< 	O 	O1$$T%:%:9%Eq&QQQ
 AB%%i0!RD AI A ; O6!#6 0668$223FU	 ,0E
!**T5J5J;5W*X$X,(' $**,(
 ( z+y*MNO	O 	O* +	OQ
; %Y(	O 	O 	O 	O* s   A0F52F3F56&FF+FF	A2F;F<
FF F=F5F	F5FFFFF5F2%F(&F2-F5)r'   N)r   r   r   __doc__r   r   r   rC   propertyrL   rN   rP   r-   rV   r   r   r   rX   rZ   r]   r`   rc   r=   r~   r	   r   rB   r   r   r    r!   rE   rE   @   s     ''	(( 
(	's' 
'	/s/ 
/.c.c.<C<C<Q6u|7KLQ=#S # #7C 7C 75# 5# 5aJ aJF!z*5 !F#C #Jz4J #r    rE   )r=   rE   r#   r   )r   
contextlibr   dataclassesr   r   r   r   typingr   r	   r
   r   redis.exceptionsrX   redis.asyncior   redis.asyncio.clusterr   r&   r   r   r)   r   r   r   r   r#   r=   rE   __all__r   r    r!   <module>r      s    4 2 ! 2 2 < <   . 0OO   y < $ $ $S Slr    