
    ^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mZ ddlm	Z	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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dl)m*Z* erddl+m,Z, dZ-dZ.dZ/dZ0dZ1dZ2 ee3          Z4 edd          Z5 edd          Z6 G d  d!          Z7 G d" d#e8          Z9 G d$ d%e:          Z; G d& d'          Z< G d( d)          Z= G d* d+ej>                  Z> G d, d-          Z? G d. d/e?ej@                  ZA G d0 d1ejB                  ZB G d2 d3ejC                  ZCdS )4zPVirtual transport implementation.

Emulates the AMQ API for non-AMQ transports.
    )annotationsN)array)OrderedDictdefaultdict
namedtuple)count)Finalize)Empty)	monotonicsleep)TYPE_CHECKING)queue_declare_ok_t)ChannelErrorResourceError)
get_logger)base)emergency_dump_state)bytes_to_strstr_to_bytes)	FairCycleuuid   )STANDARD_EXCHANGE_TYPES)TracebackTypeHzlMessage could not be delivered: No queues bound to exchange {exchange!r} using binding key {routing_key!r}.
zkCannot redeclare exchange {0!r} in vhost {1!r} with different type, durable, autodelete or arguments value.z;Requeuing undeliverable message for queue %r: No consumers.z)Restoring {0!r} unacknowledged message(s)z#UNABLE TO RESTORE {0} MESSAGES: {1}binding_key_t)queueexchangerouting_keyqueue_binding_t)r   r    	argumentsc                      e Zd ZdZd Zd ZdS )Base64zBase64 codec.c                ^    t          t          j        t          |                              S N)r   base64	b64encoder   selfss     N/var/www/html/env/lib/python3.11/site-packages/kombu/transport/virtual/base.pyencodezBase64.encodeF   s!    F,\!__==>>>    c                D    t          j        t          |                    S r&   )r'   	b64decoder   r)   s     r,   decodezBase64.decodeI   s    Q000r.   N)__name__
__module____qualname____doc__r-   r1    r.   r,   r$   r$   C   s8        ? ? ?1 1 1 1 1r.   r$   c                      e Zd ZdZdS )NotEquivalentErrorzAEntity declaration is not equivalent to the previous declaration.Nr2   r3   r4   r5   r6   r.   r,   r8   r8   M   s        KKKKr.   r8   c                      e Zd ZdZdS )UndeliverableWarningz.The message could not be delivered to a queue.Nr9   r6   r.   r,   r;   r;   Q   s        8888r.   r;   c                  J    e Zd ZdZdZdZdZd
dZd Zd Z	d Z
d Zd Zd	 ZdS )BrokerStatez2Broker state holds exchanges, queues and bindings.Nc                \    |i n|| _         i | _        t          t                    | _        d S r&   )	exchangesbindingsr   setqueue_index)r*   r?   s     r,   __init__zBrokerState.__init__r   s/    (0i&s++r.   c                    | j                                          | j                                         | j                                         d S r&   )r?   clearr@   rB   r*   s    r,   rE   zBrokerState.clearw   sE         r.   c                    |||f| j         v S r&   )r@   )r*   r   r   r    s       r,   has_bindingzBrokerState.has_binding|   s    x->>r.   c                    t          |||          }| j                            ||           | j        |                             |           d S r&   )r   r@   
setdefaultrB   add)r*   r   r   r    r"   keys         r,   binding_declarezBrokerState.binding_declare   sM    E8[99  i000##C(((((r.   c                    t          |||          }	 | j        |= | j        |                             |           d S # t          $ r Y d S w xY wr&   )r   r@   rB   removeKeyError)r*   r   r   r    rL   s        r,   binding_deletezBrokerState.binding_delete   sj    E8[99	0c" U#**3/////  	 	 	DD	s   = 
A
Ac                |     	  j                             |          } fd|D              d S # t          $ r Y d S w xY w)Nc                F    g | ]}j                             |d           S r&   )r@   pop).0bindingr*   s     r,   
<listcomp>z5BrokerState.queue_bindings_delete.<locals>.<listcomp>   s+    FFF'T]w--FFFr.   )rB   rT   rP   )r*   r   r@   s   `  r,   queue_bindings_deletez!BrokerState.queue_bindings_delete   sf    	G'++E22H GFFFXFFFFFF  	 	 	DD	s   - 
;;c                6      fd j         |         D             S )Nc              3  d   K   | ]*}t          |j        |j        j        |                   V  +d S r&   )r!   r   r    r@   )rU   rL   r*   s     r,   	<genexpr>z-BrokerState.queue_bindings.<locals>.<genexpr>   sN       
 
 CL#/4=;MNN
 
 
 
 
 
r.   )rB   r*   r   s   ` r,   queue_bindingszBrokerState.queue_bindings   s6    
 
 
 
'.
 
 
 	
r.   r&   )r2   r3   r4   r5   r?   r@   rB   rC   rE   rH   rM   rQ   rX   r]   r6   r.   r,   r=   r=   U   s        << I H K, , , ,
! ! !
? ? ?) ) )
0 0 0G G G
 
 
 
 
r.   r=   c                  j    e Zd ZdZdZdZdZdZddZd Z	d Z
d Zd	 Zd
 Zd ZddZd ZddZd ZdS )QoSzQuality of Service guarantees.

    Only supports `prefetch_count` at this point.

    Arguments:
    ---------
        channel (ChannelT): Connection channel.
        prefetch_count (int): Initial prefetch count (defaults to 0).
    r   NTc                   || _         |pd| _        t                      | _        d| j        _        t                      | _        | j        j        | _        | j        j	        | _
        t          | | j        d          | _        d S )Nr   Fr   )exitpriority)channelprefetch_countr   
_deliveredrestoredrA   _dirtyrK   
_quick_ack__setitem___quick_appendr	   restore_unacked_once_on_collect)r*   rb   rc   s      r,   rC   zQoS.__init__   sw    ,1 &--#( ee+/!_8#$+!
 
 
r.   c                p    | j         }| p,t          | j                  t          | j                  z
  |k     S )zReturn true if the channel can be consumed from.

        Used to ensure the client adhers to currently active
        prefetch limits.
        )rc   lenrd   rf   r*   pcounts     r,   can_consumezQoS.can_consume   s7     $zMS11C4D4DDvMMr.   c                    | j         }|r:t          |t          | j                  t          | j                  z
  z
  d          S dS )a  Return the maximum number of messages allowed to be returned.

        Returns an estimated number of messages that a consumer may be allowed
        to consume at once from the broker.  This is used for services where
        bulk 'get message' calls are preferred to many individual 'get message'
        calls - like SQS.

        Returns
        -------
            int: greater than zero.
        r   N)rc   maxrm   rd   rf   rn   s     r,   can_consume_max_estimatezQoS.can_consume_max_estimate   sO     $ 	NvT_!5!5DK8H8H!HI1MMM	N 	Nr.   c                h    | j         r|                                  |                     ||           dS )z&Append message to transactional state.N)rf   _flushri   )r*   messagedelivery_tags      r,   appendz
QoS.append   s5    ; 	KKMMM<11111r.   c                    | j         |         S r&   )rd   r*   rw   s     r,   getzQoS.get   s    |,,r.   c                    | j         }| j        }	 	 |                                }n# t          $ r Y dS w xY w|                    |d           >)z'Flush dirty (acked/rejected) tags from.r   N)rf   rd   rT   rP   )r*   dirty	delivered	dirty_tags       r,   ru   z
QoS._flush   sd    O		+!IIKK		   MM)T***	+s   & 
44c                0    |                      |           dS )z8Acknowledge message and remove from transactional state.N)rg   rz   s     r,   ackzQoS.ack   s    %%%%%r.   Fc                ~    |r%| j                             | j        |                    |                     |           dS )z4Remove from transactional state and requeue message.N)rb   _restore_at_beginningrd   rg   r*   rw   requeues      r,   rejectz
QoS.reject   s@     	NL..t|/LMMM%%%%%r.   c                J   |                                   | j        }g }| j        j        }|j        }|r\	  |            \  }}n# t
          $ r Y nAw xY w	  ||           n.# t          $ r!}|                    ||f           Y d}~nd}~ww xY w|\|                                 |S )z$Restore all unacknowledged messages.N)	ru   rd   rb   _restorepopitemrP   BaseExceptionrx   rE   )r*   r~   errorsrestorepop_message_rv   excs           r,   restore_unackedzQoS.restore_unacked   s    O	,'' 		.([]]
77   .      . . .sGn--------.  		. 	s)   A 
AAA 
B
)BB
c                v   | j                                          |                                  |t          j        n|}| j        }| j        r| j        j        sdS t          |dd          r|rJ dS 	 |rt          t                              t          | j                            |           |                                 }|rat          t!          |           \  }}t          t"                              t          |          |          |           t%          ||           d|_        dS # d|_        w xY w)zRestore all unacknowledged messages at shutdown/gc collect.

        Note:
        ----
            Can only be called once for each instance, subsequent
            calls will be ignored.
        Nre   )file)stderrT)rk   cancelru   sysr   rd   restore_at_shutdownrb   
do_restoregetattrprintRESTORING_FMTformatrm   r   listzipRESTORE_PANIC_FMTr   re   )r*   r   state
unrestoredr   messagess         r,   rj   zQoS.restore_unacked_once  sS    	!!!%~6' 	t|/F 	F5*d++ 	9F	" 	Bm**3t+?+?@@!# # # #!1133
 B'+C,<'='=$FH+223v;;GG%' ' ' '(&AAAA!ENNNTEN!!!!s   2B4D/ /	D8c                    dS )a  Restore any pending unacknowledged messages.

        To be filled in for visibility_timeout style implementations.

        Note:
        ----
            This is implementation optional, and currently only
            used by the Redis transport.
        Nr6   )r*   argskwargss      r,   restore_visiblezQoS.restore_visible2        r.   )r   Fr&   )r2   r3   r4   r5   rc   rd   rf   r   rC   rp   rs   rx   r{   ru   r   r   r   rj   r   r6   r.   r,   r_   r_      s          N J F 
 
 
 
N N NN N N 2 2 2- - -	+ 	+ 	+& & && & & &  *" " " "@	 	 	 	 	r.   r_   c                  *     e Zd ZdZd fd	Zd Z xZS )MessagezMessage object.Nc                   || _         |d         }|                    d          }|r)|                    ||                    d                    } t                      j        d|||d         |                    d          |                    d          |                    d          ||                    d          d	d
	| d S )N
propertiesbodybody_encodingrw   content-typecontent-encodingheadersdelivery_infoutf-8)	r   rb   rw   content_typecontent_encodingr   r   r   
postencoder6   )_rawr{   decode_bodysuperrC   )r*   payloadrb   r   r   r   	__class__s         r,   rC   zMessage.__init__A  s    	\*
{{6"" 	N&&tZ^^O-L-LMMD 
	#N3 ^44$[[);<<KK	**!$..99
	 
	 
	 
	 
	 
	 
	r.   c                    | j         }| j                            | j        |                    d                    \  }}t          | j                  }|                    dd            ||| j        | j	        |dS )Nr   compression)r   r   r   r   r   )
r   rb   encode_bodyr   r{   dictr   rT   r   r   )r*   propsr   r   r   s        r,   serializablezMessage.serializableS  s    ,**49+099_+E+EG Gat|$$M4((( - $ 5
 
 	
r.   r&   )r2   r3   r4   r5   rC   r   __classcell__r   s   @r,   r   r   >  sR             $
 
 
 
 
 
 
r.   r   c                  L    e Zd ZdZddZd Zd Zd Zd Zd Z	d	 Z
dd
Zd ZdS )AbstractChannelzAbstract channel interface.

    This is an abstract class defining the channel methods
    you'd usually want to implement in a virtual channel.

    Note:
    ----
        Do not subclass directly, but rather inherit
        from :class:`Channel`.
    Nc                     t          d          )zGet next message from `queue`.z$Virtual channels must implement _getNotImplementedError)r*   r   timeouts      r,   _getzAbstractChannel._geto      !"HIIIr.   c                     t          d          )zPut `message` onto `queue`.z$Virtual channels must implement _putr   )r*   r   rv   s      r,   _putzAbstractChannel._puts  r   r.   c                     t          d          )z!Remove all messages from `queue`.z&Virtual channels must implement _purger   r\   s     r,   _purgezAbstractChannel._purgew  s    !"JKKKr.   c                    dS )z<Return the number of messages in `queue` as an :class:`int`.r   r6   r\   s     r,   _sizezAbstractChannel._size{  s    qr.   c                0    |                      |           dS )zDelete `queue`.

        Note:
        ----
            This just purges the queue, if you need to do more you can
            override this method.
        Nr   )r*   r   r   r   s       r,   _deletezAbstractChannel._delete  s     	Er.   c                    dS )zCreate new queue.

        Note:
        ----
            Your transport can override this method if it needs
            to do something whenever a new queue is declared.
        Nr6   r*   r   r   s      r,   
_new_queuezAbstractChannel._new_queue  r   r.   c                    dS )zVerify that queue exists.

        Returns
        -------
            bool: Should return :const:`True` if the queue exists
                or :const:`False` otherwise.
        Tr6   r   s      r,   
_has_queuezAbstractChannel._has_queue  s	     tr.   c                ,    |                     |          S )z-Poll a list of queues for available messages.)r{   )r*   cyclecallbackr   s       r,   _pollzAbstractChannel._poll  s    yy"""r.   c                H    |                      |          } |||           d S r&   )r   )r*   r   r   rv   s       r,   _get_and_deliverz AbstractChannel._get_and_deliver  s+    ))E""%     r.   r&   )r2   r3   r4   r5   r   r   r   r   r   r   r   r   r   r6   r.   r,   r   r   c  s        	 	J J J JJ J JL L L        # # # #! ! ! ! !r.   r   c                     e Zd ZdZeZeZdZ ee          Z	dZ
d e            iZdZ ed          ZdZdZdZdZd	Zd
 Z	 	 	 d?dZd@dZdAdZd@dZd Z	 	 dBdZ	 	 dBdZ	 	 dCdZ	 	 dCdZd Zd Z d Z!d Z"d Z#d Z$d Z%dDdZ&dDdZ'dDdZ(dDd Z)	 	 dEd!Z*d" Z+d# Z,dFd$Z-dGd%Z.d& Z/d' Z0dHd(Z1d) Z2	 	 dId*Z3dJd+Z4d, Z5dGd-Z6dGd.Z7d/ Z8d0 Z9dKd9Z:e;d:             Z<e;d;             Z=e;d<             Z>dDd=Z?d> Z@dS )LChannelzVirtual channel.

    Arguments:
    ---------
        connection (ConnectionT): The transport instance this
            channel is part of.
    TFr'   r   N)r   deadletter_queuer   	   c                    | _         t                       _        d  _        i  _        g  _        d  _        d _         fd j        	                                D              _         
                                 _         j         j        j        } j        D ]*}	 t           |||                    # t           $ r Y 'w xY wd S )NFc                .    i | ]\  }}| |          S r6   r6   )rU   typclsr*   s      r,   
<dictcomp>z$Channel.__init__.<locals>.<dictcomp>  s4     
 
 
'sCCT
 
 
r.   )
connectionrA   
_consumers_cycle_tag_to_queue_active_queues_qosclosedexchange_typesitems_get_free_channel_id
channel_idclienttransport_optionsfrom_transport_optionssetattrrP   )r*   r   r   toptsopt_names   `    r,   rC   zChannel.__init__  s    $%% 	
 
 
 
+/+>+D+D+F+F
 
 
 3355&83 	 	Hhh8888   	 	s   B55
CCdirectc                   |pd}|pd|z  }|rG|| j         j        vr7t          d                    || j        j        j        pd          ddd          dS 	 | j         j        |         }|                     |                              ||||||          s9t          t                              || j        j        j        pd                    dS # t          $ r ||||pi g d	| j         j        |<   Y dS w xY w)
zDeclare exchange.r   zamq.%sz*NOT_FOUND - no exchange {!r} in vhost {!r}/2   
   zChannel.exchange_declare404N)typedurableauto_deleter"   table)r   r?   r   r   r   r   virtual_hosttypeof
equivalentr8   NOT_EQUIVALENT_FMTrP   )	r*   r   r   r  r  r"   nowaitpassiveprevs	            r,   exchange_declarezChannel.exchange_declare  s\    x.x$ 	tz333"@GG $/"8"E"LN N8%  
 F	:'1D;;x((33D(D4;[4=? ? K ));)B)Bdo4AHS*J *J K K KK K
  	 	 	"*&_". .DJ ****	s   A8C !C54C5c                    |                      |          D ]\  }}}|                     |dd           | j        j                            |d           dS )z'Delete `exchange` and all its bindings.T)	if_unusedif_emptyN)	get_tablequeue_deleter   r?   rT   )r*   r   r  r  rkeyr   r   s          r,   exchange_deletezChannel.exchange_delete	  sd    "nnX66 	D 	DND!UetdCCCC
  400000r.   c                   |pdt                      z  }|rE | j        |fi |s7t          d                    || j        j        j        pd          ddd           | j        |fi | t          || 	                    |          d          S )zDeclare queue.z
amq.gen-%sz'NOT_FOUND - no queue {!r} in vhost {!r}r   r   zChannel.queue_declarer   r   )
r   r   r   r   r   r   r  r   r   r   )r*   r   r	  r   s       r,   queue_declarezChannel.queue_declare  s    .. 	-?4?5;;F;; 	-9@@4?1>E#G G15   DOE,,V,,,!%E):):A>>>r.   c                (   |r|                      |          rdS | j                            |          D ]C\  }}}|                     |                              ||||          } | j        ||g|R i | D| j                            |           dS )zDelete queue.N)r   r   r]   r  prepare_bindr   rX   )	r*   r   r  r  r   r   r    r   metas	            r,   r  zChannel.queue_delete  s     	

5)) 	F+/:+D+DU+K+K 	; 	;'Hk4;;x((55xd D DL:4:::6::::
((/////r.   c                0    |                      |           d S r&   )r  r\   s     r,   after_reply_message_receivedz$Channel.after_reply_message_received'  s    %     r.    c                     t          d          )Nz(transport does not support exchange_bindr   r*   destinationsourcer    r  r"   s         r,   exchange_bindzChannel.exchange_bind*  s    !"LMMMr.   c                     t          d          )Nz*transport does not support exchange_unbindr   r  s         r,   exchange_unbindzChannel.exchange_unbind.  s    !"NOOOr.   c                ~   |pd}| j                             |||          rdS | j                             ||||           | j         j        |                             dg           }|                     |                              ||||          }|                    |           | j        r | j	        |g|R   dS dS )z.Bind `queue` to `exchange` with `routing key`.z
amq.directNr  )
r   rH   rM   r?   rJ   r  r  rx   supports_fanout_queue_bind)r*   r   r   r    r"   r   r  r  s           r,   
queue_bindzChannel.queue_bind2  s     +|:!!%;?? 	F
""5(KKKK
$X.99'2FF{{8$$118[)
 
 	T 	.DX-------	. 	.r.   c                   | j                             |||           	 |                     |          }n# t          $ r Y d S w xY w|                     |                              ||||          fd|D             |d d <   d S )Nc                     g | ]
}|k    |S r6   r6   )rU   r  binding_metas     r,   rW   z(Channel.queue_unbind.<locals>.<listcomp>P  s#    CCCTdl.B.BD.B.B.Br.   )r   rQ   r  rP   r  r  )r*   r   r   r    r"   r   r  r(  s          @r,   queue_unbindzChannel.queue_unbindC  s     	
!!%;???	NN8,,EE 	 	 	FF	{{8,,998[)
 

 DCCCUCCCaaas   5 
AAc                4      fd j         j        D             S )Nc              3  Z   K   | ]%}                     |          D ]\  }}}|||fV  &d S r&   )r  )rU   r   r  patternr   r*   s        r,   r[   z(Channel.list_bindings.<locals>.<genexpr>S  sp       F F,0NN8,D,DF F(D'5 $' F F F F F F Fr.   r   r?   rF   s   `r,   list_bindingszChannel.list_bindingsR  s;    F F F F $
 4F F F 	Fr.   c                ,    |                      |          S )z%Remove all ready messages from queue.r   r   s      r,   queue_purgezChannel.queue_purgeW  s    {{5!!!r.   c                    t                      S r&   r   rF   s    r,   _next_delivery_tagzChannel._next_delivery_tag[  s    vvr.   c                    |                      |||           |r# |                     |          j        |||fi |S  | j        ||fi |S )zPublish message.)_inplace_augment_messager  deliverr   )r*   rv   r   r    r   s        r,   basic_publishzChannel.basic_publish^  sw    %%gxEEE 	04;;x((0; 28   tyg88888r.   c                    |                      |d         | j                  \  |d<   }|d         }|                    ||                                            |d                             ||           d S )Nr   r   )r   rw   r   r   r    )r   r   updater2  )r*   rv   r   r    r   r   s         r,   r4  z Channel._inplace_augment_messageh  s    )-)9)9FOT/*
 *
& %'0022 	 	
 	
 	
 	o%%# 	& 	
 	
 	
 	
 	
r.   c                     | j         |<    j                            |            fd}| j        j        |<    j                            |                                             dS )zConsume from `queue`.c                                         |           }s j                            ||j                    |          S )Nrb   )r   qosrx   rw   )raw_messagerv   r   no_ackr*   s     r,   	_callbackz(Channel.basic_consume.<locals>._callback{  sI    ll;l==G ?)=>>>8G$$$r.   N)r   r   rx   r   
_callbacksr   rK   _reset_cycle)r*   r   r?  r   consumer_tagr   r@  s   ` ``   r,   basic_consumezChannel.basic_consumev  s    +0<(""5)))	% 	% 	% 	% 	% 	% 	% -6"5)L)))r.   c                F   || j         v r| j                             |           |                                  | j                            |d          }	 | j                            |           n# t          $ r Y nw xY w| j        j                            |d           dS dS )z Cancel consumer by consumer tag.N)	r   rO   rB  r   rT   r   
ValueErrorr   rA  )r*   rC  r   s      r,   basic_cancelzChannel.basic_cancel  s    4?**O""<000&**<>>E#**51111   O&**5$77777 +*s   A/ /
A<;A<c                    	 |                      |                     |          |           }|s | j                            ||j                   |S # t
          $ r Y dS w xY w)z+Get message by direct access (synchronous).r<  N)r   r   r=  rx   rw   r
   )r*   r   r?  r   rv   s        r,   	basic_getzChannel.basic_get  sp    	ll499U#3#3TlBBG ?)=>>>N 	 	 	DD	s   AA 
AAc                :    | j                             |           dS )zAcknowledge message.N)r=  r   )r*   rw   multiples      r,   	basic_ackzChannel.basic_ack  s    \"""""r.   c                V    |r| j                                         S t          d          )zRecover unacked messages.z'Does not support recover(requeue=False))r=  r   r   )r*   r   s     r,   basic_recoverzChannel.basic_recover  s-     	.8++---!"KLLLr.   c                >    | j                             ||           dS )zReject message.r   N)r=  r   r   s      r,   basic_rejectzChannel.basic_reject  s     g66666r.   c                    || j         _        dS )zzChange QoS settings for this channel.

        Note:
        ----
            Only `prefetch_count` is supported.
        N)r=  rc   )r*   prefetch_sizerc   apply_globals       r,   	basic_qoszChannel.basic_qos  s     #1r.   c                4    t          | j        j                  S r&   )r   r   r?   rF   s    r,   get_exchangeszChannel.get_exchanges  s    DJ()))r.   c                2    | j         j        |         d         S )z%Get table of bindings for `exchange`.r  r-  )r*   r   s     r,   r  zChannel.get_table  s    z#H-g66r.   c                t    	 | j         j        |         d         }n# t          $ r |}Y nw xY w| j        |         S )z.Get the exchange type instance for `exchange`.r   )r   r?   rP   r   )r*   r   defaultr   s       r,   r  zChannel.typeof  sO    	:'1&9DD 	 	 	DDD	"4((s    **c                x   || j         }|s|p|gS 	 |                     |                              |                     |          |||          }n# t          $ r g }Y nw xY w|sU|St          j        t          t          	                    ||                               | 
                    |           |g}|S )zFind all queues matching `routing_key` for the given `exchange`.

        Returns
        -------
            list[str]: queue names -- must return `[default]`
                if default is set and no queues matched.
        Nr8  )r   r  lookupr  rP   warningswarnr;   UNDELIVERABLE_FMTr   r   )r*   r   r    rZ  Rs        r,   _lookupzChannel._lookup  s     ?+G 	,*7++	H%%,,x((+w AA  	 	 	AAA	  	W(M./@/G/G!{ 0H 0< 0< = =    OOG$$$	As   >A A A c                    |j         }|                                }d|d<   |                     |d         |d                   D ]}|                     ||           dS )z.Redeliver message to its original destination.Tredeliveredr   r    N)r   r   ra  r   )r*   rv   r   r   s       r,   r   zChannel._restore  su    -&&((!%\\*%m,. . 	& 	&E IIeW%%%%	& 	&r.   c                ,    |                      |          S r&   )r   )r*   rv   s     r,   r   zChannel._restore_at_beginning  s    }}W%%%r.   c                   |p| j         j        }| j        rb| j                                        rIt          | d          r|                     | j        |          S |                     | j	        ||          S t                      )N	_get_manyr   )r   _deliverr   r=  rp   hasattrrf  r   r   r   r
   )r*   r   r   s      r,   drain_eventszChannel.drain_events  s    7t7? 	Etx3355 	Et[)) L~~d&97~KKK::dj(G:DDDggr.   c                ^    t          || j                  s|                     ||           S |S )z1Convert raw message to :class:`Message` instance.)r   rb   )
isinstancer   )r*   r>  s     r,   message_to_pythonzChannel.message_to_python  s3    +t|44 	C<<T<BBBr.   c                    |pi }|                     di            |                     d|p| j                   ||||pi |pi dS )zPrepare message data.r   priority)r   r   r   r   r   )rJ   default_priority)r*   r   ro  r   r   r   r   s          r,   prepare_messagezChannel.prepare_message  si      %2
or222j(*Kd6KLLL$4 ,"=b(.B	0 0 	0r.   c                     t          d          )zEnable/disable message flow.

        Raises
        ------
            NotImplementedError: as flow
                is not implemented by the base virtual implementation.
        z%virtual channels do not support flow.r   )r*   actives     r,   flowzChannel.flow  s     ""IJJJr.   c                X   | j         sd| _         t          | j                  D ]}|                     |           | j        r| j                                         | j         | j                                         d| _        | j        | j        	                    |            d| _
        dS )zTClose channel.

        Cancel all consumers, and requeue unacked messages.
        TN)r   r   r   rG  r   rj   r   closer   close_channelr   )r*   consumers     r,   rv  zChannel.close  s    
 { 
	4DK 11 , ,!!(++++y 1	..000{&!!###"*--d333"r.   c                    |rG|                                 dk    r/| j                            |                              |          |fS ||fS Nr   )lowercodecsr{   r-   r*   r   encodings      r,   r   zChannel.encode_body$  sP     	D((G33;??8,,33D998CCX~r.   c                    |rE|                                 dk    r-| j                            |                              |          S |S rz  )r{  r|  r{   r1   r}  s      r,   r   zChannel.decode_body)  sE     	:((G33;??8,,33D999r.   c                P    t          | j        | j        t                    | _        d S r&   )r   r   r   r
   r   rF   s    r,   rB  zChannel._reset_cycle.  s$    !4#6? ?r.   c                    | S r&   r6   rF   s    r,   	__enter__zChannel.__enter__2  s    r.   exc_typetype[BaseException] | Noneexc_valBaseException | Noneexc_tbTracebackType | NonereturnNonec                .    |                                   d S r&   )rv  )r*   r  r  r  s       r,   __exit__zChannel.__exit__5  s     	

r.   c                    | j         j        S )z/Broker state containing exchanges and bindings.)r   r   rF   s    r,   r   zChannel.state=  s     $$r.   c                R    | j         |                     |           | _         | j         S )z&:class:`QoS` manager for this channel.)r   r_   rF   s    r,   r=  zChannel.qosB  s%     9DIyr.   c                F    | j         |                                  | j         S r&   )r   rB  rF   s    r,   r   zChannel.cycleI  s$    ;{r.   c                    	 t          t          t          |d         d                   | j                  | j                  }n$# t
          t          t          f$ r
 | j        }Y nw xY w|r
| j        |z
  n|S )zGet priority from message.

        The value is limited to within a boundary of 0 to 9.

        Note:
        ----
            Higher value has more priority.
        r   ro  )	rr   minintmax_prioritymin_priority	TypeErrorrF  rP   rp  )r*   rv   reversero  s       r,   _get_message_priorityzChannel._get_message_priorityO  s    	-C-j9::%' '! HH
 :x0 	- 	- 	-,HHH	- 29F!H,,hFs   AA A%$A%c                L   t          | j        j                  }t          d| j        j        dz             D ])}||vr#| j        j                            |           |c S *t          d                    t          | j        j	                  | j        j                  d          )Nr   z/No free channel ids, current={}, channel_max={})   r   )
rA   r   _used_channel_idsrangechannel_maxrx   r   r   rm   channels)r*   used_channel_idsr   s      r,   r   zChannel._get_free_channel_idc  s     t@AA4?#>#BCC 	" 	"J!111188DDD!!!! 2 =DDDO,--+- -.6
 
 	
r.   )Nr   FFNFF)FF)NF)r  r  FN)Nr  Nr   )r   r   F)r   r&   )NN)NNNNN)T)r  r  r  r  r  r  r  r  )Ar2   r3   r4   r5   r   r_   r   r   r   r   r#  r$   r|  r   r   _delivery_tagsr   r   rp  r  r  rC   r  r  r  r  r  r  r!  r%  r)  r.  r0  r2  r6  r4  rD  rG  rI  rL  rN  rQ  rU  rW  r  r  ra  r   r   rj  rm  rq  rt  rv  r   r   rB  r  r  propertyr   r=  r   r  r   r6   r.   r,   r   r     s         G C J T122N O !F M U1XXN  C LL  . FK6:/4   <1 1 1 1? ? ? ?	0 	0 	0 	0! ! ! AC.2N N N N CE04P P P P <>!. . . ." >@#D D D DF F F
" " "  9 9 9
 
 
   
8 
8 
8   # # # #M M M M7 7 7 7 9:$1 1 1 1* * *7 7 7) ) ) )   :& & && & &      AEHL0 0 0 0K K K K# # #$   
   
? ? ?      % % X%   X   X
G G G G(
 
 
 
 
r.   r   c                  .     e Zd ZdZ fdZd Zd Z xZS )
Managementz'Base class for the AMQP management API.c                    t                                          |           |j                                        | _        d S r&   )r   rC   r   rb   )r*   	transportr   s     r,   rC   zManagement.__init__w  s5    ### '//11r.   c                H    d | j                                         D             S )Nc                "    g | ]\  }}}|||d S ))r  r  r    r6   )rU   qers       r,   rW   z+Management.get_bindings.<locals>.<listcomp>|  s8     = = =Aq! !"QqAA = = =r.   )rb   r.  rF   s    r,   get_bindingszManagement.get_bindings{  s1    = =#|99;;= = = 	=r.   c                8    | j                                          d S r&   )rb   rv  rF   s    r,   rv  zManagement.close  s    r.   )r2   r3   r4   r5   rC   r  rv  r   r   s   @r,   r  r  t  s\        112 2 2 2 2= = =      r.   r  c                      e Zd ZdZeZeZeZdZdZ	dZ
dZdZdZej        j                            d eddg          d          Zd	 Zd
 Zd Zd Zd ZddZd Zd Zd ZddZed             ZdS )	Transportz|Virtual transport.

    Arguments:
    ---------
        client (kombu.Connection): The client this is a transport for.
    Ng      ?i  Fr   topic)asynchronousexchange_type
heartbeatsc                2   || _         t                      | _        g | _        g | _        i | _        |                     | j        | j        t                    | _	        |j
                            d          }||| _        t          t                    | _        d S )Npolling_interval)r   r=   r   r  _avail_channelsrA  Cycle_drain_channelr
   r   r   r{   r  r   ARRAY_TYPE_Hr  )r*   r   r   r  s       r,   rC   zTransport.__init__  s     ]]
!ZZ 3T]EJJ
!3778JKK'$4D!!&|!4!4r.   c                    	 | j                                         S # t          $ r4 |                     |          }| j                            |           |cY S w xY wr&   )r  rT   
IndexErrorr   r  rx   )r*   r   rb   s      r,   create_channelzTransport.create_channel  sg    	'++--- 	 	 	ll:..GM  )))NNN	s    ;AAc                    	 	 | j                             |j                   n# t          $ r Y nw xY w	 | j                            |           n# t          $ r Y nw xY wd |_        d S # d |_        w xY wr&   )r  rO   r   rF  r  r   )r*   rb   s     r,   rw  zTransport.close_channel  s    	&&--g.@AAAA   $$W----    "&GG%%%%sD   # A( 
0A( 0A( A A( 
AA( AA( (	A1c                `    | j                             |                     |                      | S r&   )r  rx   r  rF   s    r,   establish_connectionzTransport.establish_connection  s.     	##D$7$7$=$=>>>r.   c                    | j                                          | j        | j        fD ]@}|r<	 |                                }|                                 n# t
          $ r Y nw xY w|<Ad S r&   )r   rv  r  r  rT   LookupError)r*   r   	chan_listrb   s       r,   close_connectionzTransport.close_connection  s    
-t}< 	$ 	$I $$'mmooG MMOOOO #   D  $	$ 	$s   A
A#"A#c                    t                      }| j        j        }| j        }|r
|r||k    r|}	 	  || j        |           d S # t
          $ r> |(t                      |z
  |k    rt          j                    |t          |           Y nw xY wa)Nr   rg  )	r   r   r{   r  rh  r
   socketr   r   )r*   r   r   
time_startr{   r  s         r,   rj  zTransport.drain_events  s    [[
jn0 	'' 	',<w,F,F&		DM73333   , , ,&9;;+Cw+N+N .***#/*+++	,		s   A ABBc                   |s"t          d                    |                    	 | j        |         } ||           d S # t           $ r9 t                              t
          |           |                     |           Y d S w xY w)Nz.Received message without destination queue: {})rP   r   rA  loggerwarningW_NO_CONSUMERS_reject_inbound_message)r*   rv   r   r   s       r,   rh  zTransport._deliver  s     	@GG   	u-H
 HW	  	2 	2 	2NN>5111((111111	2s   A   ?BBc                    | j         D ]Z}|rV|                    ||          }|j                            ||j                   |                    |j        d            d S [d S )Nr<  TrP  )r  r   r=  rx   rw   rQ  )r*   r>  rb   rv   s       r,   r  z!Transport._reject_inbound_message  s}    } 	 	G !//+w/GG""7G,@AAA$$W%94$HHH		 	r.   c                    |r	|| j         vr#t          d                    ||                     | j         |         |           d S )Nz,Message for queue {!r} without consumers: {})rA  rP   r   )r*   rb   rv   r   s       r,   on_message_readyzTransport.on_message_ready  s_     	%T_44>EE7$ $% % % 	w'''''r.   c                0    |                     ||          S )N)r   r   )rj  )r*   rb   r   r   s       r,   r  zTransport._drain_channel
  s    ##Xw#GGGr.   c                    | j         ddS )N	localhost)porthostname)default_portrF   s    r,   default_connection_paramsz#Transport.default_connection_params  s    ){CCCr.   r&   )r2   r3   r4   r5   r   r   r  r  r   r  r  rA  r  r  r   r  
implementsextend	frozensetrC   r  rw  r  r  rj  rh  r  r  r  r  r  r6   r.   r,   r  r    sU         GEJ E L H J  K*11i7 344 2  J5 5 5  & & &  	$ 	$ 	$   "    ( ( (H H H H D D XD D Dr.   r  )Dr5   
__future__r   r'   r  r   r]  r   collectionsr   r   r   	itertoolsr   multiprocessing.utilr	   r   r
   timer   r   typingr   amqp.protocolr   kombu.exceptionsr   r   	kombu.logr   kombu.transportr   kombu.utils.divr   kombu.utils.encodingr   r   kombu.utils.schedulingr   kombu.utils.uuidr   r   r   typesr   r  r_  r  r  r   r   r2   r  r   r!   r$   	Exceptionr8   UserWarningr;   r=   r_   r   r   
StdChannelr   r  r  r6   r.   r,   <module>r     s   
 # " " " " "   



        < < < < < < < < < <       ) ) ) ) ) )       ! ! ! ! ! ! ! !             , , , , , , 8 8 8 8 8 8 8 8                         0 0 0 0 0 0 ; ; ; ; ; ; ; ; , , , , , , ! ! ! ! ! ! - - - - - - $###### 
 
 <9 	H		 
? -  
 *. 1  
1 1 1 1 1 1 1 1L L L L L L L L9 9 9 9 9; 9 9 9D
 D
 D
 D
 D
 D
 D
 D
N_ _ _ _ _ _ _ _D"
 "
 "
 "
 "
dl "
 "
 "
J?! ?! ?! ?! ?! ?! ?! ?!DL
 L
 L
 L
 L
ot L
 L
 L
^       LD LD LD LD LD LD LD LD LD LDr.   