o
    —¨ÊhÅ9  ã                   @  s"  d Z ddlm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 d	d
lmZmZmZmZ d	dlm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" d	dl#m$Z$ dZ%dZ&dZ'ee(ƒZ)e)j*e)j+Z*Z+G dd„ dƒZ,G dd„ dƒZ-dS )zGeneric process mailbox.é    )ÚannotationsN)ÚdefaultdictÚdeque)Úcontextmanager)Úcopy)Úcount)Útimeé   )ÚConsumerÚExchangeÚProducerÚQueue)ÚLamportClock)Úmaybe_declareÚoid_from)ÚInconsistencyError)Ú
get_logger)Úmatch)Úmaybe_evaluateÚreprcall)Úcached_property)Úuuidé
   zýA node named {node.hostname} is already using this process mailbox!

Maybe you forgot to shutdown the other node or did not do so properly?
Or if you meant to start multiple nodes on the same host please make sure
you give each node a unique node name!
)ÚNodeÚMailboxc                   @  s”   e Zd ZdZdZdZdZdZdZ		ddd„Z	ddd„Z
dd	„ Zd
d„ Zddd„Z		ddd„Zddd„Zdd„ Zdd„ Zddd„ZeZdd„ ZdS )r   zMailbox node.Nc                 C  s:   || _ || _|| _|| _| jjj| _|d u ri }|| _d S ©N)ÚchannelÚmailboxÚhostnameÚstateÚclockÚadjustÚadjust_clockÚhandlers)Úselfr   r   r   r#   r   © r%   ú>/var/www/html/env/lib/python3.10/site-packages/kombu/pidbox.pyÚ__init__8   s   
zNode.__init__Tc                   sP   ˆ j  ˆ j¡}‡ fdd„}||_t|pˆ j|gf||d u r!ˆ j jn|dœ|¤ŽS )Nc                   s   |rt  tjˆ d�¡ d S d S )N)Únode)ÚwarningsÚwarnÚW_PIDBOX_IN_USEÚformat)ÚnameÚmessagesÚ	consumers©r$   r%   r&   Úverify_exclusiveF   s   ÿz'Node.Consumer.<locals>.verify_exclusive)Úno_ackÚaccept)r   Ú	get_queuer   Úon_declaredr
   r   r3   )r$   r   r2   r3   ÚoptionsÚqueuer1   r%   r0   r&   r
   C   s   ÿþýzNode.Consumerc                 C  s   || j |j< |S r   )r#   Ú__name__)r$   Úfunr%   r%   r&   ÚhandlerQ   s   zNode.handlerc                 C  s   t d|dd� d S )NzCannot decode message: %rr	   ©Úexc_info)Úerror)r$   ÚmessageÚexcr%   r%   r&   Úon_decode_errorU   s   zNode.on_decode_errorc                 C  s&   | j ||p| jg| jd�}| ¡  |S )N)r   Ú	callbacksr@   )r
   Úhandle_messager@   Úconsume)r$   r   ÚcallbackÚconsumerr%   r%   r&   ÚlistenX   s   
þzNode.listenc           	   
   K  s´   |pi }t dt|d|d�||ƒ |r| jp| j}z|||ƒ}W n& ty'   ‚  tyE } ztd|dd� dt|ƒi}W Y d }~nd }~ww |rX| j| j	|i|d |d	 |d
� |S )Nz1pidbox received method %s [reply_to:%s ticket:%s]r%   )Úkwargszpidbox command error: %rr	   r;   r=   ÚexchangeÚrouting_key)rH   rI   Úticket)
Údebugr   Úhandle_callÚhandle_castÚ
SystemExitÚ	Exceptionr=   ÚreprÚreplyr   )	r$   ÚmethodÚ	argumentsÚreply_torJ   rG   ÚhandlerQ   r?   r%   r%   r&   Údispatch_   s*   ÿ€þýzNode.dispatchc                 C  s$   |si n|}| j | | jfi |¤ŽS r   )r#   r   ©r$   rR   rS   r%   r%   r&   rU   t   s   zNode.handlec                 C  ó   |   ||¡S r   ©rU   rW   r%   r%   r&   rL   x   ó   zNode.handle_callc                 C  rX   r   rY   rW   r%   r%   r&   rM   {   rZ   zNode.handle_castc                 C  sŠ   |  d¡}|  d¡}|  d¡}|r|  |j  d¡pd¡ | j}d}|r*||v r)d}n|r7|r7t|||ƒr6d}nd}|rC| jdi |¤ŽS d S )	NÚdestinationÚpatternÚmatcherr    r   FTr%   )Úgetr"   Úheadersr   r   rV   )r$   Úbodyr>   r[   r\   r]   r   Úrun_dispatchr%   r%   r&   rB   ~   s&   


€€ÿzNode.handle_messagec                 K  s"   | j j||||| j| j jd� d S )N)r   Ú
serializer)r   Ú_publish_replyr   rb   )r$   ÚdatarH   rI   rJ   rG   r%   r%   r&   rQ   ’   s   
þz
Node.reply©NNNN)NTN©NN)NNNr   )r8   Ú
__module__Ú__qualname__Ú__doc__r   r   r#   r   r   r'   r
   r:   r@   rF   rV   rU   rL   rM   rB   Údispatch_from_messagerQ   r%   r%   r%   r&   r   &   s.    
ÿ


ÿ

r   c                   @  s  e Zd ZdZeZdZdZdZdZ	dZ
dZdZdgZdZ				d0dd	„Zd
d„ Zd1dd„Z		d1dd„Zd2dd„Zd2dd„Z		d3dd„Zdd„ Zedd„ ƒZdd„ Zed4dd„ƒZ	d4dd „Z			d5d!d"„Z				d6d$d%„Z		d3d&d'„Zd(d)„ Zd*d+„ Z e!d,d-„ ƒZ"ed.d/„ ƒZ#dS )7r   zProcess Mailbox.z	%s.pidboxzreply.%s.pidboxNÚdirectÚjsonç      $@c                 C  sš   || _ || _|| _|d u rtƒ n|| _|  | j | j¡| _|  | j ¡| _t	t
ƒ| _|d u r/| jn|| _|d u r9| jn|| _|| _|	| _|
| _|| _|| _d S r   )Ú	namespaceÚ
connectionÚtyper   r    Ú_get_exchangerH   Ú_get_reply_exchangeÚreply_exchanger   r   Ú	unclaimedr3   rb   Ú	queue_ttlÚqueue_expiresÚreply_queue_ttlÚreply_queue_expiresÚ_producer_pool)r$   rn   rp   ro   r    r3   rb   Úproducer_poolru   rv   rw   rx   r%   r%   r&   r'   ´   s   

zMailbox.__init__c                 C  s   t | ƒ}||_|S r   )r   ro   )r$   ro   Úboundr%   r%   r&   Ú__call__È   s   zMailbox.__call__c                 C  s    |pt  ¡ }| j||||| d�S )N)r   )ÚsocketÚgethostnameÚnode_cls)r$   r   r   r   r#   r%   r%   r&   r   Í   s   zMailbox.Nodec              	   C  s$   |si n|}| j |||d|||d�S )NT)rQ   ÚtimeoutrD   r   ©Ú
_broadcast)r$   r[   ÚcommandrG   r€   rD   r   r%   r%   r&   ÚcallÑ   ó   
ýzMailbox.callc                 C  s   |si n|}| j |||dd�S ©NF)rQ   r�   )r$   r[   rƒ   rG   r%   r%   r&   ÚcastÙ   s   zMailbox.castc                 C  s   |si n|}| j ||dd�S r†   r�   )r$   rƒ   rG   r%   r%   r&   ÚabcastÝ   s   zMailbox.abcastr	   c              	   C  s$   |si n|}| j ||d||||d�S )NT)rQ   r€   ÚlimitrD   r   r�   )r$   rƒ   rG   r€   r‰   rD   r   r%   r%   r&   Ú
multi_callá   r…   zMailbox.multi_callc              	   C  s0   | j }t|› d| jj› �| j|dd| j| jd�S )NÚ.FT)rH   rI   ÚdurableÚauto_deleteÚexpiresÚmessage_ttl)Úoidr   rs   r-   rx   rw   )r$   r�   r%   r%   r&   Úget_reply_queueé   s   ùzMailbox.get_reply_queuec                 C  s   |   ¡ S r   )r‘   r0   r%   r%   r&   Úreply_queueõ   ó   zMailbox.reply_queuec                 C  s(   t |› d| j› d�| jdd| j| jd�S )Nr‹   z.pidboxFT)rH   rŒ   r�   rŽ   r�   )r   rn   rH   rv   ru   )r$   r   r%   r%   r&   r4   ù   s   úzMailbox.get_queuec                 c  s^   � |r|V  d S | j r&| j  ¡ �}|V  W d   ƒ d S 1 sw   Y  d S t|dd�V  d S )NF)Úauto_declare)rz   Úacquirer   )r$   Úproducerr   r%   r%   r&   Úproducer_or_acquire  s   €
"ÿzMailbox.producer_or_acquirec           	   	   K  s¢   |p| j j}t|dddd�}|  ||¡�3}z|j|f|||g|| j ¡ dœddœ|¤Ž W n	 ty6   Y n	w W d   ƒ d S W d   ƒ d S 1 sJw   Y  d S )Nrk   Ú	transientF)Úexchange_typeÚdelivery_moderŒ   )rJ   r    T)rH   rI   Údeclarer_   Úretry)ro   Údefault_channelr   r—   Úpublishr    Úforwardr   )	r$   rQ   rH   rI   rJ   r   r–   ÚoptsÚchanr%   r%   r&   rc     s2   þÿ
ÿü
ûþùþ"õzMailbox._publish_replyc              	   C  s¾   ||||	|
dœ}|p| j j}| j}|r't|  |¡ƒ |j|| jj| jdœd� |p+| j	}|  
||¡�#}|j||j|g| j ¡ |rEtƒ | nddœ|dd� W d   ƒ d S 1 sXw   Y  d S )N)rR   rS   r[   r\   r]   )rH   rI   )rJ   rT   r   )r    rŽ   T)rH   r›   r_   rb   rœ   )ro   r�   rH   r   r’   Úupdaters   r-   r�   rb   r—   rž   r    rŸ   r   )r$   rp   rS   r[   Úreply_ticketr   r€   rb   r–   r\   r]   r>   r¡   rH   r%   r%   r&   Ú_publish   s2   üÿÿ

ÿü"ÿzMailbox._publishFc                 C  sä   |d urt |ttfƒstd t|ƒ¡ƒ‚|
d ur2t |
tƒs2|d ur2t |tƒs2td t|
ƒt|ƒ¡ƒ‚|p5i }|r;tƒ p<d }|pB| jj	}|d u rQ|rQ|rOt
|ƒpPd }|	pU| j}	| j|||||||	|
|d�	 |rp| j|||||d�S d S )Nz'destination must be a list/tuple not {}z.pattern and matcher must be strings not {}, {})r[   r£   r   r€   rb   r\   r]   )r‰   r€   rD   r   )Ú
isinstanceÚlistÚtupleÚ
ValueErrorr,   rp   Ústrr   ro   r�   Úlenrb   r¤   Ú_collect)r$   rƒ   rS   r[   rQ   r€   r‰   rD   r   rb   r\   r]   r£   r¡   r%   r%   r&   r‚   8  sF   ÿÿÿþ

úýÿzMailbox._broadcastc              
     s  |d u r| j }|p| jj}| j}t||g|dd�}	g ‰| j‰| jj‰ zˆ ˆ¡W S  t	y1   Y nw ‡ ‡‡‡‡fdd„}
|	 
|
¡ zD|	�1 |rKt|ƒpMtƒ D ]}z	| jj|d� W qN tjyd   Y  nw ˆW  d   ƒ W | |j¡ S 1 sxw   Y  W | |j¡ d S | |j¡ w )NT)r3   r2   c                   sp   |j j}ˆ |dƒp
dƒ |dƒ}|rtƒ |krd S |dˆƒ}|ˆkr/ˆr(ˆ| ƒ ˆ | ¡ d S ˆ|  | ¡ d S )Nr    r   rŽ   rJ   )r_   r^   r   Úappend)r`   r>   ÚheaderrŽ   Úthis_id©r"   rD   Ú	responsesrJ   rt   r%   r&   Ú
on_messagep  s   
z$Mailbox._collect.<locals>.on_message)r€   )r3   ro   r�   r’   r
   rt   r    r!   ÚpopÚKeyErrorÚregister_callbackÚranger   Údrain_eventsr}   r€   Úafter_reply_message_receivedr-   )r$   rJ   r‰   r€   rD   r   r3   r¡   r7   rE   r±   Úir%   r¯   r&   r«   _  s8   ÿ
ÿúøzMailbox._collectc                 C  s   t | j| |ddd�S )NFr˜   ©rp   rŒ   rš   )r   Úexchange_fmt)r$   rn   rp   r%   r%   r&   rq   ‹  ó
   
ýzMailbox._get_exchangec                 C  s   t | j| dddd�S )Nrk   Fr˜   r¹   )r   Úreply_exchange_fmt)r$   rn   r%   r%   r&   rr   ‘  r»   zMailbox._get_reply_exchangec                 C  s   t | ƒS r   )r   r0   r%   r%   r&   r�   —  r“   zMailbox.oidc                 C  s
   t | jƒS r   )r   ry   r0   r%   r%   r&   rz   ›  s   
zMailbox.producer_pool)
rk   NNNNNNNNrm   re   r   )Nr	   NNNrf   )NNNNNNNN)
NNFr	   NNNNNN)$r8   rg   rh   ri   r   r   rº   r¼   rn   ro   rp   rH   rs   r3   rb   r'   r|   r„   r‡   rˆ   rŠ   r‘   r   r’   r4   r   r—   rc   r¤   r‚   r«   rq   rr   Úpropertyr�   rz   r%   r%   r%   r&   r   ˜   sj    
ü

ÿ


ÿ



ÿ
þ
ý(
þ,
r   ).ri   Ú
__future__r   r}   r)   Úcollectionsr   r   Ú
contextlibr   r   Ú	itertoolsr   r   Ú r
   r   r   r   Úclocksr   Úcommonr   r   Ú
exceptionsr   Úlogr   r]   r   Úutils.functionalr   r   Úutils.objectsr   Ú
utils.uuidr   ÚREPLY_QUEUE_EXPIRESr+   Ú__all__r8   ÚloggerrK   r=   r   r   r%   r%   r%   r&   Ú<module>   s2    r