o
    i                     @   s   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	m
Z
 er(ddlmZ defd	d
Zddddee ddfddZddddee ddfddZdedee fddZddededefddZdS )    N)TYPE_CHECKINGOptional)Redis)Pipeline   )DuplicateSchedulerErrorSchedulerNotFound)CronSchedulerreturnc                   C   s   dS )z0Get the Redis key for the CronScheduler registryzrq:cron_schedulers r   r   r   Q/home/app/Keep/.python/lib/python3.10/site-packages/rq/cron_scheduler_registry.pyget_registry_key   s   r   cron_schedulerr	   pipelinec                 C   sT   |dur|n| j }t }t }|j|| j|idd}|dkr(td| j ddS )a9  Register a CronScheduler in the registry with current timestamp as score

    Args:
        cron_scheduler: CronScheduler instance to register
        pipeline: Redis pipeline to use. If None, uses cron_scheduler.connection

    Raises:
        DuplicateSchedulerError: If the scheduler is already registered
    NT)nxr   CronScheduler 'z' is already registered)
connectionr   timeZzaddnamer   )r   r   r   registry_keyZscoreZadded_countr   r   r   register   s   
r   c                 C   s@   |dur|n| j }t }||| j}|std| j ddS )a  Remove a CronScheduler from the registry

    Args:
        cron_scheduler: CronScheduler instance to unregister
        pipeline: Redis pipeline to use. If None, uses cron_scheduler.connection

    Raises:
        SchedulerNotFound: If the scheduler is not found in the registry
    Nr   z' not found in registry)r   r   Zzremr   r   )r   r   r   r   resultr   r   r   
unregister)   s   
r   r   c                 C   s"   t  }| |dd}dd |D S )zGet all registered CronScheduler names from the registry

    Args:
        connection: Redis connection to use

    Returns:
        List of CronScheduler names (strings) sorted by registration time (oldest first)
    r   c                 S   s$   g | ]}t |tr|d n|qS )zutf-8)
isinstancebytesdecode).0keyr   r   r   
<listcomp>L   s   $ zget_keys.<locals>.<listcomp>)r   Zzrange)r   r   keysr   r   r   get_keys<   s   	r!   x   	thresholdc                 C   s   t   | }| t d|S )a^  Remove stale CronScheduler entries from the registry

    Removes schedulers that haven't sent a heartbeat in more than `threshold` seconds.

    Args:
        connection: Redis connection to use
        threshold: Number of seconds after which a scheduler is considered stale (default: 120)

    Returns:
        Number of stale entries removed
    r   )r   Zzremrangebyscorer   )r   r#   Zcutoff_timer   r   r   cleanupO   s   r$   )N)r"   )r   typingr   r   Zredisr   Zredis.clientr   
exceptionsr   r   cronr	   strr   r   r   listr!   intr$   r   r   r   r   <module>   s    