
    g                    v    d Z ddlmZ ddlmZmZmZ ddlmZ  ee	      Z
dZedz
  ZdZddZdd	Zdd
ZddZy)z:Native Delayed Delivery API.

Only relevant for RabbitMQ.
    )annotations)
ConnectionExchangeQueue)
get_logger      celery_delayed_deliveryc                ,    | dk  rt        d      d|  S )z=Generates the delayed queue/exchange name based on the level.r   z#level must be a non-negative numbercelery_delayed_)
ValueError)levels    d/var/www/html/answerous/venv/lib/python3.12/site-packages/kombu/transport/native_delayed_delivery.py
level_namer      s"    qy>??UG$$    c                J   |dk7  r|dk7  rt        d      | j                         }d}t        ddd      D ]  }t        |      }|dkD  rt        |dz
        nd	}t	        |d
      j                  |      }|j                          |dt        d|      dz  |dkD  r|nt        d}|dk(  rd|d<   t        ||      j                  |      }	|	j                          |	j                  ||       d|z   } d}t        ddd      D ]U  }t        |      }|dkD  rt        |dz
        nd	}t	        |d
      j                  |      }
|
j                  ||       d|z   }W t	        t        d
      j                  |      }|j                          |j                  t        d      |       y	)z:Declares all native delayed delivery exchanges and queues.classicquorumz+queue_type must be either classic or quorumz1.#   r   r	   Ntopic)typezreject-publish   i  )zx-queue-typez
x-overflowzx-message-ttlzx-dead-letter-exchangezat-least-oncezx-dead-letter-strategy)queue_argumentsz*.z0.#)r   channelranger   r   binddeclarepow CELERY_DELAYED_DELIVERY_EXCHANGEr   bind_to)
connection
queue_typer   routing_keyr   current_level
next_leveldelayed_exchanger   delayed_queuenext_level_exchangedelivery_exchanges               r   4declare_native_delayed_delivery_exchanges_and_queuesr+      s   Y:#9FGG  "GKr2s# )"5).3aiZ	*T
%-&))-g 	  " '* E]T149AIjCc	
 !8GO45$+ 
 $w- 	 	m[9[(3)6 Kr1c" 	)"5).3aiZ	*T
(0W)&&*d7m 	 	##M;?[(	) #+(w#88<W jm[9r   c                   | j                         }|j                  |      }|j                  j                  |      }|j                  dk(  r$t        j                  d|j                   d       y|j                  j                  d      r|j                  nd|j                   }|j                  t        |       |j                  |j                  |       y)z6Binds a queue to the native delayed delivery exchange.directz	Exchange z is a direct exchange and native delayed delivery do not support direct exchanges.
ETA tasks published to this exchange will block the worker until the ETA arrives.N#z#.)r$   )r   r   exchanger   loggerwarnnamer$   
startswithr!   r    )r"   queuer   r/   r$   s        r   .bind_queue_to_native_delayed_delivery_exchanger5   O   s      "GJJwE,,W5H}} i /h i 	j 	','8'8'C'C(%##u(()* 5;O	MM(--[M9r   c                    | dk  rt        d      |st        d      dj                  t        | d            d| z   S )zRCalculate the routing key for publishing a delayed message based on the countdown.r	   z#countdown must be a positive numberzrouting_key must be non-empty.028b)r   joinlist)	countdownr$   s     r   calculate_routing_keyr<   a   sI    1}>??89988DId+-.1[M1BBBr   N)r   intreturnstr)r"   r   r#   r?   r>   None)r"   r   r4   r   r>   r@   )r;   r=   r$   r?   r>   r?   )__doc__
__future__r   kombur   r   r   	kombu.logr   __name__r0   MAX_NUMBER_OF_BITS_TO_USE	MAX_LEVELr    r   r+   r5   r<    r   r   <module>rI      sN    # - -  	H	 %)	#<  %3:l:$Cr   