
     h߃                        d 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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& dZ'dZ(dZ)dZ*dZ+dZ, ee-          Z. e	dd          Z/ e	dd          Z0 G d d          Z1 G d d e2          Z3 G d! d"e4          Z5 G d# d$          Z6 G d% d&          Z7 G d' d(ej8                  Z8 G d) d*          Z9 G d+ d,e9ej:                  Z; G d- d.ej<                  Z< G d/ d0ej=                  Z=dS )1zPVirtual transport implementation.

Emulates the AMQ API for non-AMQ transports.
    N)array)OrderedDictdefaultdict
namedtuple)count)Finalize)Empty)	monotonicsleep)queue_declare_ok_t)ChannelErrorResourceError)
get_logger)base)emergency_dump_state)bytes_to_strstr_to_bytes)	FairCycleuuid   )STANDARD_EXCHANGE_TYPES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     X/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/kombu/transport/virtual/base.pyencodezBase64.encode@   s!    F,\!__==>>>    c                 D    t          j        t          |                    S r#   )r$   	b64decoder   r&   s     r)   decodezBase64.decodeC   s    Q000r+   N)__name__
__module____qualname____doc__r*   r.    r+   r)   r!   r!   =   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r/   r0   r1   r2   r3   r+   r)   r5   r5   G   s        KKKKr+   r5   c                       e Zd ZdZdS )UndeliverableWarningz.The message could not be delivered to a queue.Nr6   r3   r+   r)   r8   r8   K   s        8888r+   r8   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__l   s/    (0i&s++r+   c                     | j                                          | j                                         | j                                         d S r#   )r<   clearr=   r?   r'   s    r)   rB   zBrokerState.clearq   sE         r+   c                     |||f| j         v S r#   )r=   )r'   r   r   r   s       r)   has_bindingzBrokerState.has_bindingv   s    x->>r+   c                     t          |||          }| j                            ||           | j        |                             |           d S r#   )r   r=   
setdefaultr?   add)r'   r   r   r   r   keys         r)   binding_declarezBrokerState.binding_declarey   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=   r?   removeKeyError)r'   r   r   r   rI   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+   )r?   rQ   rM   )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=   )rR   rI   r'   s     r)   	<genexpr>z-BrokerState.queue_bindings.<locals>.<genexpr>   sN       
 
 CL#/4=;MNN
 
 
 
 
 
r+   )r?   r'   r   s   ` r)   queue_bindingszBrokerState.queue_bindings   s6    
 
 
 
'.
 
 
 	
r+   r#   )r/   r0   r1   r2   r<   r=   r?   r@   rB   rE   rJ   rN   rU   rZ   r3   r+   r)   r:   r:   O   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restoredr>   _dirtyrH   
_quick_ack__setitem___quick_appendr   restore_unacked_once_on_collect)r'   r_   r`   s      r)   r@   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.
        )r`   lenra   rc   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)r`   maxrj   ra   rc   rk   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)rc   _flushrf   )r'   messagedelivery_tags      r)   appendz
QoS.append   s5    ; 	KKMMM<11111r+   c                     | j         |         S r#   )ra   r'   rt   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)rc   ra   rQ   rM   )r'   dirty	delivered	dirty_tags       r)   rr   z
QoS._flush   sd    O		+!IIKK		   MM)T***	+s   & 
44c                 0    |                      |           dS )z8Acknowledge message and remove from transactional state.N)rd   rw   s     r)   ackzQoS.ack   s    %%%%%r+   Fc                 ~    |r%| j                             | j        |                    |                     |           dS )z4Remove from transactional state and requeue message.N)r_   _restore_at_beginningra   rd   r'   rt   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)	rr   ra   r_   _restorepopitemrM   BaseExceptionru   rB   )r'   r{   errorsrestorepop_message_rs   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.
        Nrb   )file)stderrT)rh   cancelrr   sysr   ra   restore_at_shutdownr_   
do_restoregetattrprintRESTORING_FMTformatrj   r   listzipRESTORE_PANIC_FMTr   rb   )r'   r   state
unrestoredr   messagess         r)   rg   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 )zRestore any pending unackwnowledged messages.

        To be filled in for visibility_timeout style implementations.

        Note:
            This is implementation optional, and currently only
            used by the Redis transport.
        Nr3   )r'   argskwargss      r)   restore_visiblezQoS.restore_visible)        r+   )r   Fr#   )r/   r0   r1   r2   r`   ra   rc   r   r@   rm   rp   ru   rx   rr   r~   r   r   rg   r   r3   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_encodingrt   content-typecontent-encodingheadersdelivery_infozutf-8)	r   r_   rt   content_typecontent_encodingr   r   r   
postencoder3   )_rawrx   decode_bodysuperr@   )r'   payloadr_   r   r   r   	__class__s         r)   r@   zMessage.__init__7  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   r_   encode_bodyr   rx   dictr   rQ   r   r   )r'   propsr   r   r   s        r)   serializablezMessage.serializableI  s    ,**49+099_+E+EG Gat|$$M4((( - $ 5
 
 	
r+   r#   )r/   r0   r1   r2   r@   r   __classcell__r   s   @r)   r   r   4  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._getd      !"HIIIr+   c                      t          d          )zPut `message` onto `queue`.z$Virtual channels must implement _putr   )r'   r   rs   s      r)   _putzAbstractChannel._puth  r   r+   c                      t          d          )z!Remove all messages from `queue`.z&Virtual channels must implement _purger   rY   s     r)   _purgezAbstractChannel._purgel  s    !"JKKKr+   c                     dS )z<Return the number of messages in `queue` as an :class:`int`.r   r3   rY   s     r)   _sizezAbstractChannel._sizep  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._deletet  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.
        Nr3   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.
        Tr3   r   s      r)   
_has_queuezAbstractChannel._has_queue  s	     tr+   c                 ,    |                     |          S )z-Poll a list of queues for available messages.)rx   )r'   cyclecallbackr   s       r)   _pollzAbstractChannel._poll  s    yy"""r+   c                 H    |                      |          } |||           d S r#   )r   )r'   r   r   rs   s       r)   _get_and_deliverz AbstractChannel._get_and_deliver  s+    ))E""%     r+   r#   )r/   r0   r1   r2   r   r   r   r   r   r   r   r   r   r3   r+   r)   r   r   Y  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	 	 	 d7dZd8dZd9dZd8dZd Z	 	 d:dZ	 	 d:dZ	 	 d;dZ	 	 d;dZd Zd Z d Z!d Z"d Z#d Z$d Z%d<dZ&d<dZ'd<dZ(d<d Z)	 	 d=d!Z*d" Z+d# Z,d>d$Z-d?d%Z.d& Z/d' Z0d@d(Z1d) Z2	 	 dAd*Z3dBd+Z4d, Z5d?d-Z6d?d.Z7d/ Z8d0 Z9d1 Z:e;d2             Z<e;d3             Z=e;d4             Z>d<d5Z?d6 Z@dS )C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 r3   r3   )rR   typclsr'   s      r)   
<dictcomp>z$Channel.__init__.<locals>.<dictcomp>  s4     
 
 
'sCCT
 
 
r+   )
connectionr>   
_consumers_cycle_tag_to_queue_active_queues_qosclosedexchange_typesitems_get_free_channel_id
channel_idclienttransport_optionsfrom_transport_optionssetattrrM   )r'   r   r   toptsopt_names   `    r)   r@   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
equivalentr5   NOT_EQUIVALENT_FMTrM   )	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<   rQ   )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   rZ   r  prepare_bindr   rU   )	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  rY   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   rE   rJ   r<   rG   r  r  ru   supports_fanout_queue_bind)r'   r   r   r   r   r   r   r  s           r)   
queue_bindzChannel.queue_bind#  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 r3   r3   )rR   r  binding_metas     r)   rT   z(Channel.queue_unbind.<locals>.<listcomp>A  s#    CCCTdl.B.BD.B.B.Br+   )r   rN   r  rM   r  r  )r'   r   r   r   r   r   r   r$  s          @r)   queue_unbindzChannel.queue_unbind4  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  )rR   r   r  patternr   r'   s        r)   rX   z(Channel.list_bindings.<locals>.<genexpr>D  sp       F F,0NN8,D,DF F(D'5 $' F F F F F F Fr+   r   r<   rC   s   `r)   list_bindingszChannel.list_bindingsC  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_purgeH  s    {{5!!!r+   c                     t                      S r#   r   rC   s    r)   _next_delivery_tagzChannel._next_delivery_tagL  s    vvr+   c                     |                      |||           |r# |                     |          j        |||fi |S  | j        ||fi |S )zPublish message.)_inplace_augment_messager  deliverr   )r'   rs   r   r   r   s        r)   basic_publishzChannel.basic_publishO  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   rt   r   r   r   )r   r   updater.  )r'   rs   r   r   r   r   s         r)   r0  z Channel._inplace_augment_messageY  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r_   )r   qosru   rt   )raw_messagers   r   no_ackr'   s     r)   	_callbackz(Channel.basic_consume.<locals>._callbackl  sI    ll;l==G ?)=>>>8G$$$r+   N)r   r   ru   r   
_callbacksr   rH   _reset_cycle)r'   r   r;  r   consumer_tagr   r<  s   ` ``   r)   basic_consumezChannel.basic_consumeg  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   rL   r>  r   rQ   r   
ValueErrorr   r=  )r'   r?  r   s      r)   basic_cancelzChannel.basic_cancelw  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).r8  N)r   r   r9  ru   rt   r	   )r'   r   r;  r   rs   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)r9  r~   )r'   rt   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))r9  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)r9  r   r   s      r)   basic_rejectzChannel.basic_reject  s     g66666r+   c                     || j         _        dS )zmChange QoS settings for this channel.

        Note:
            Only `prefetch_count` is supported.
        N)r9  r`   )r'   prefetch_sizer`   apply_globals       r)   	basic_qoszChannel.basic_qos  s     #1r+   c                 4    t          | j        j                  S r#   )r   r   r<   rC   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<   rM   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:
            str: queue name -- must return the string `default`
                if no queues matched.
        Nr4  )r   r  lookupr  rM   warningswarnr8   UNDELIVERABLE_FMTr   r   )r'   r   r   rV  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   r]  r   )r'   rs   r   r   s       r)   r   zChannel._restore  st    -&&((!%\\j)=+GI I 	& 	&EIIeW%%%%	& 	&r+   c                 ,    |                      |          S r#   )r   )r'   rs   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   r9  rm   hasattrrb  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   r_   )
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   )rG   default_priority)r'   r   rk  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   rC  r   rg   r   closer   close_channelr   )r'   consumers     r)   rr  zChannel.close  s    
 { 
	4DK 11 , ,!!(++++y 1	..000{&!!###"*--d333"r+   c                 l    |r/| j                             |                              |          |fS ||fS r#   )codecsrx   r*   r'   r   encodings      r)   r   zChannel.encode_body  s<     	D;??8,,33D998CCX~r+   c                 d    |r-| j                             |                              |          S |S r#   )rv  rx   r.   rw  s      r)   r   zChannel.decode_body  s1     	:;??8,,33D999r+   c                 P    t          | j        | j        t                    | _        d S r#   )r   r   r   r	   r   rC   s    r)   r>  zChannel._reset_cycle  s$    !4#6? ?r+   c                     | S r#   r3   rC   s    r)   	__enter__zChannel.__enter__  s    r+   c                 .    |                                   d S r#   )rr  )r'   exc_infos     r)   __exit__zChannel.__exit__"  s    

r+   c                     | j         j        S )z/Broker state containing exchanges and bindings.)r   r   rC   s    r)   r   zChannel.state%  s     $$r+   c                 R    | j         |                     |           | _         | j         S )z&:class:`QoS` manager for this channel.)r   r\   rC   s    r)   r9  zChannel.qos*  s%     9DIyr+   c                 F    | j         |                                  | j         S r#   )r   r>  rC   s    r)   r   zChannel.cycle1  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   rk  )	ro   minintmax_prioritymin_priority	TypeErrorrB  rM   rl  )r'   rs   reverserk  s       r)   _get_message_priorityzChannel._get_message_priority7  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   )
r>   r   _used_channel_idsrangechannel_maxru   r   r   rj   channels)r'   used_channel_idsr   s      r)   r   zChannel._get_free_channel_idJ  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)Ar/   r0   r1   r2   r   r\   r   r   r   r   r  r!   rv  r   r   _delivery_tagsr   r   rl  r  r  r@   r  r  r  r  r  r  r  r!  r%  r*  r,  r.  r2  r0  r@  rC  rE  rH  rJ  rM  rQ  rS  r  r  r]  r   r   rf  ri  rm  rp  rr  r   r   r>  r|  r  propertyr   r9  r   r  r   r3   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) ) ) )   8& & && & &      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   r@   r   r_   )r'   	transportr   s     r)   r@   zManagement.__init__^  s5    ### '//11r+   c                 H    d | j                                         D             S )Nc                 "    g | ]\  }}}|||d S ))r  r  r   r3   )rR   qers       r)   rT   z+Management.get_bindings.<locals>.<listcomp>c  s8     = = =Aq! !"QqAA = = =r+   )r_   r*  rC   s    r)   get_bindingszManagement.get_bindingsb  s1    = =#|99;;= = = 	=r+   c                 8    | j                                          d S r#   )r_   rr  rC   s    r)   rr  zManagement.closef  s    r+   )r/   r0   r1   r2   r@   r  rr  r   r   s   @r)   r  r  [  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 )	TransportznVirtual 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_channelsr=  Cycle_drain_channelr	   r   r   rx   r  r   ARRAY_TYPE_Hr  )r'   r   r   r  s       r)   r@   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  rQ   
IndexErrorr   r  ru   )r'   r   r_   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  rL   r   rB  r  r   )r'   r_   s     r)   rs  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  ru   r  rC   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   rr  r  r  rQ   LookupError)r'   r   	chan_listr_   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   rc  )	r
   r   rx   r  rd  r	   socketr   r   )r'   r   r   
time_startrx   r  s         r)   rf  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: {})rM   r   r=  loggerwarningW_NO_CONSUMERS_reject_inbound_message)r'   rs   r   r   s       r)   rd  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 )Nr8  TrL  )r  r   r9  ru   rt   rM  )r'   r:  r_   rs   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: {})r=  rM   r   )r'   r_   rs   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   )rf  )r'   r_   r   r   s       r)   r  zTransport._drain_channel  s    ##Xw#GGGr+   c                     | j         ddS )N	localhost)porthostname)default_portrC   s    r)   default_connection_paramsz#Transport.default_connection_params  s    ){CCCr+   r#   )r/   r0   r1   r2   r   r   r  r  r   r  r  r=  r  r  r   r  
implementsextend	frozensetr@   r  rs  r  r  rf  rd  r  r  r  r  r  r3   r+   r)   r  r  j  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  )>r2   r$   r  r   rY  r   collectionsr   r   r   	itertoolsr   multiprocessing.utilr   r   r	   timer
   r   amqp.protocolr   kombu.exceptionsr   r   	kombu.logr   kombu.transportr   kombu.utils.divr   kombu.utils.encodingr   r   kombu.utils.schedulingr   kombu.utils.uuidr   r   r   r  r[  r  r  r   r   r/   r  r   r   r!   	Exceptionr5   UserWarningr8   r:   r\   r   r   
StdChannelr   r  r  r3   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[ [ [ [ [ [ [ [|"
 "
 "
 "
 "
dl "
 "
 "
J;! ;! ;! ;! ;! ;! ;! ;!|A
 A
 A
 A
 A
ot A
 A
 A
H       KD KD KD KD KD KD KD KD KD KDr+   