
    Ih                       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j                        ZB G d2 d3ej                        ZCy)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y)Base64zBase64 codec.c                P    t        t        j                  t        |                  S N)r   base64	b64encoder   selfss     U/var/www/html/planif/env/lib/python3.12/site-packages/kombu/transport/virtual/base.pyencodezBase64.encodeF   s    F,,\!_=>>    c                >    t        j                  t        |            S r&   )r'   	b64decoder   r)   s     r,   decodezBase64.decodeI   s    Q00r.   N)__name__
__module____qualname____doc__r-   r1    r.   r,   r$   r$   C   s    ?1r.   r$   c                      e Zd ZdZy)NotEquivalentErrorzAEntity declaration is not equivalent to the previous declaration.Nr2   r3   r4   r5   r6   r.   r,   r8   r8   M   s    Kr.   r8   c                      e Zd ZdZy)UndeliverableWarningz.The message could not be delivered to a queue.Nr9   r6   r.   r,   r;   r;   Q   s    8r.   r;   c                  H    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y)BrokerStatez2Broker state holds exchanges, queues and bindings.Nc                P    |i n|| _         i | _        t        t              | _        y r&   )	exchangesbindingsr   setqueue_index)r*   r?   s     r,   __init__zBrokerState.__init__r   s$    (0i&s+r.   c                    | j                   j                          | j                  j                          | j                  j                          y r&   )r?   clearr@   rB   r*   s    r,   rE   zBrokerState.clearw   s4     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                  ||       | j                  |   j	                  |       y r&   )r   r@   
setdefaultrB   add)r*   r   r   r    r"   keys         r,   binding_declarezBrokerState.binding_declare   s=    E8[9  i0##C(r.   c                    t        |||      }	 | j                  |= | j                  |   j                  |       y # t        $ r Y y w xY wr&   )r   r@   rB   removeKeyError)r*   r   r   r    rL   s        r,   binding_deletezBrokerState.binding_delete   sP    E8[9	0c" U#**3/  		s   ; 	AAc                    	 | j                   j                  |      }|D cg c]  }| j                  j                  |d         c} y c c}w # t        $ r Y y w xY wr&   )rB   popr@   rP   )r*   r   r@   bindings       r,   queue_bindings_deletez!BrokerState.queue_bindings_delete   sW    	G''++E2H >FF'T]]w-FF  		s   A #A	AAc                4      fd j                   |   D        S )Nc              3  z   K   | ]2  }t        |j                  |j                  j                  |          4 y wr&   )r!   r   r    r@   ).0rL   r*   s     r,   	<genexpr>z-BrokerState.queue_bindings.<locals>.<genexpr>   s3      
 CLL#//4==;MN
s   8;)rB   r*   r   s   ` r,   queue_bindingszBrokerState.queue_bindings   s     
''.
 	
r.   r&   )r2   r3   r4   r5   r?   r@   rB   rC   rE   rH   rM   rQ   rU   r[   r6   r.   r,   r=   r=   U   s>    < I H K,
!
?)
0G
r.   r=   c                  h    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y)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                ,   || _         |xs d| _        t               | _        d| j                  _        t               | _        | j                  j                  | _        | j                  j                  | _
        t        | | j                  d      | _        y )Nr   Fr   )exitpriority)channelprefetch_countr   
_deliveredrestoredrA   _dirtyrK   
_quick_ack__setitem___quick_appendr	   restore_unacked_once_on_collect)r*   r`   ra   s      r,   rC   zQoS.__init__   sq    ,1 &-#( e++//!__88#$++!
r.   c                    | j                   }| xs. 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.
        )ra   lenrb   rd   r*   pcounts     r,   can_consumezQoS.can_consume   s8     $$zMS1C4DDvMMr.   c                    | j                   }|r8t        |t        | j                        t        | j                        z
  z
  d      S y)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)ra   maxrk   rb   rd   rl   s     r,   can_consume_max_estimatezQoS.can_consume_max_estimate   s@     $$vT__!5DKK8H!HI1MM r.   c                `    | j                   r| j                          | j                  ||       y)z&Append message to transactional state.N)rd   _flushrg   )r*   messagedelivery_tags      r,   appendz
QoS.append   s"    ;;KKM<1r.   c                     | j                   |   S r&   )rb   r*   ru   s     r,   getzQoS.get   s    |,,r.   c                    | j                   }| j                  }	 	 |j                         }|j                  |d       $# t        $ r Y yw xY w)z'Flush dirty (acked/rejected) tags from.N)rd   rb   rS   rP   )r*   dirty	delivered	dirty_tags       r,   rs   z
QoS._flush   sP    OO	!IIK	 MM)T*   s   > 	A
	A
c                &    | j                  |       y)z8Acknowledge message and remove from transactional state.N)re   rx   s     r,   ackzQoS.ack   s    %r.   c                z    |r(| j                   j                  | j                  |          | j                  |       y)z4Remove from transactional state and requeue message.N)r`   _restore_at_beginningrb   re   r*   ru   requeues      r,   rejectz
QoS.reject   s,    LL..t|/LM%r.   c                H   | j                          | j                  }g }| j                  j                  }|j                  }|r	  |       \  }}	  ||       |r|j                          |S # t
        $ r Y w xY w# t        $ r}|j                  ||f       Y d}~Ed}~ww xY w)z$Restore all unacknowledged messages.N)	rs   rb   r`   _restorepopitemrP   BaseExceptionrv   rE   )r*   r|   errorsrestorepop_message_rt   excs           r,   restore_unackedzQoS.restore_unacked   s    OO	,,''''(]
7.   	  
 ! .sGn--.s*   
A, A; ,	A87A8;	B!BB!c                N   | j                   j                          | j                          |t        j                  n|}| j
                  }| j                  r| j                  j                  syt        |dd      r|rJ y	 |rt        t        j                  t        | j
                              |       | j                         }|rKt        t!        |       \  }}t        t"        j                  t        |      |      |       t%        ||       d|_        y# 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.
        Nrc   )file)stderrT)ri   cancelrs   sysr   rb   restore_at_shutdownr`   
do_restoregetattrprintRESTORING_FMTformatrk   r   listzipRESTORE_PANIC_FMTr   rc   )r*   r   state
unrestoredr   messagess         r,   rh   zQoS.restore_unacked_once  s     	!%~6''t||/F/F5*d+9	"m**3t+?@!#!113
'+C,<'=$FH+223v;G%'(&A!ENTENs   BD 	D$c                     y)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   ra   rb   rd   r   rC   rn   rq   rv   ry   rs   r   r   r   rh   r   r6   r.   r,   r]   r]      s^     N J F 
NN 2-	+&&*"@	r.   r]   c                  *     e Zd ZdZd fd	Zd Z xZS )MessagezMessage object.c                6   || _         |d   }|j                  d      }|r!|j                  ||j                  d            }t        |   d|||d   |j                  d      |j                  d      |j                  d      ||j                  d      d	d
	| y )N
propertiesbodybody_encodingru   content-typecontent-encodingheadersdelivery_infoutf-8)	r   r`   ru   content_typecontent_encodingr   r   r   
postencoder6   )_rawry   decode_bodysuperrC   )r*   payloadr`   r   r   r   	__class__s         r,   rC   zMessage.__init__A  s    	\*
{{6"&&tZ^^O-LMD 
	#N3 ^4$[[);<KK	*!$..9
	 
	r.   c                   | j                   }| j                  j                  | j                  |j	                  d            \  }}t        | j                        }|j                  dd        ||| j                  | j                  |dS )Nr   compression)r   r   r   r   r   )
r   r`   encode_bodyr   ry   dictr   rS   r   r   )r*   propsr   r   r   s        r,   serializablezMessage.serializableS  sw    ,,**499+099_+EGat||$M4( -- $ 5 5
 	
r.   r&   )r2   r3   r4   r5   rC   r   __classcell__r   s   @r,   r   r   >  s    $
r.   r   c                  J    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y)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Ir.   c                    t        d      )zPut `message` onto `queue`.z$Virtual channels must implement _putr   )r*   r   rt   s      r,   _putzAbstractChannel._puts  r   r.   c                    t        d      )z!Remove all messages from `queue`.z&Virtual channels must implement _purger   rZ   s     r,   _purgezAbstractChannel._purgew  s    !"JKKr.   c                     y)z<Return the number of messages in `queue` as an :class:`int`.r   r6   rZ   s     r,   _sizezAbstractChannel._size{  s    r.   c                &    | j                  |       y)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                     y)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                     y)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     r.   c                $    |j                  |      S )z-Poll a list of queues for available messages.)ry   )r*   cyclecallbackr   s       r,   _pollzAbstractChannel._poll  s    yy""r.   c                8    | j                  |      } |||       y r&   )r   )r*   r   r   rt   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  s7    	JJ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	 	 	 d5dZd6dZd7dZd6dZd Z	 	 d8dZ	 	 d8dZ	 	 d9dZ	 	 d9d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	 	 d?d(Z3d@d)Z4d* Z5d=d+Z6d=d,Z7d- Z8d. Z9	 	 	 	 	 	 	 	 dAd/Z:e;d0        Z<e;d1        Z=e;d2        Z>d:d3Z?d4 Z@y)B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| _        | j                  j                         D ci c]  \  }}| ||        c}}| _        | j                         | _        | j                   j                  j                  }| j                  D ]  }	 t        | |||           y c c}}w # t         $ r Y (w xY wNF)
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   typclstoptsopt_names          r,   rC   zChannel.__init__  s    $% 	 ,0+>+>+D+D+F
'sCCTN
 335&&8833 	Hhh8	
  s   C8C	CCc                <   |xs d}|xs d|z  }|rY|| j                   j                  vr@t        dj                  || j                  j
                  j                  xs d      ddd      y	 | j                   j                  |   }| j                  |      j                  ||||||      sAt        t        j                  || j                  j
                  j                  xs d            y# t        $ r& ||||xs i g d	| j                   j                  |<   Y yw xY w)
zDeclare exchange.directz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$tzz333"@GG $//"8"8"E"E"LN8% 
 	::''1D;;x(33D(D4;[4=? ));)B)Bdoo44AAHS*J K K?
  	"*&_".DJJ  *	s   ,A?C, ,,DDc                    | j                  |      D ]  \  }}}| j                  |dd        | j                  j                  j	                  |d       y)z'Delete `exchange` and all its bindings.T)	if_unusedif_emptyN)	get_tablequeue_deleter   r?   rS   )r*   r   r
  r  rkeyr   r   s          r,   exchange_deletezChannel.exchange_delete	  sQ    "nnX6 	DND!UetdC	D

  40r.   c                ,   |xs dt               z  }|rS | j                  |fi |s@t        dj                  || j                  j
                  j                  xs d      ddd       | j                  |fi | t        || j                  |      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1>>E#G15  DOOE,V,!%E):A>>r.   c                   |r| j                  |      ry| j                  j                  |      D ]@  \  }}}| j                  |      j	                  ||||      } | j
                  ||g|i | B | j                  j                  |       y)zDelete queue.N)r   r   r[   r  prepare_bindr   rU   )	r*   r   r
  r  r   r   r    r   metas	            r,   r  zChannel.queue_delete  s    

5)+/::+D+DU+K 	;'Hk4;;x(55xdD DLL:4:6:		;
 	

((/r.   c                &    | j                  |       y r&   )r  rZ   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Mr.   c                    t        d      )Nz*transport does not support exchange_unbindr   r  s         r,   exchange_unbindzChannel.exchange_unbind.  s    !"NOOr.   c                   |xs d}| j                   j                  |||      ry| j                   j                  ||||       | j                   j                  |   j	                  dg       }| j                  |      j                  ||||      }|j                  |       | j                  r | j                  |g|  yy)z.Bind `queue` to `exchange` with `routing key`.z
amq.directNr   )
r   rH   rM   r?   rJ   r  r  rv   supports_fanout_queue_bind)r*   r   r   r    r"   r   r   r  s           r,   
queue_bindzChannel.queue_bind2  s     +|::!!%;?

""5(KK

$$X.99'2F{{8$118[)
 	TDX--  r.   c                   | j                   j                  |||       	 | j                  |      }| j	                  |      j                  ||||      }|D cg c]
  }||k7  s	| c}|d d  y # t        $ r Y y w xY wc c}w r&   )r   rQ   r  rP   r  r  )	r*   r   r   r    r"   r   r   binding_metar  s	            r,   queue_unbindzChannel.queue_unbindC  s     	

!!%;?	NN8,E {{8,998[)

 &+CTdl.BDCa  		 Ds   A- 
A<"A<-	A98A9c                B      fd j                   j                  D        S )Nc              3  \   K   | ]#  }j                  |      D ]  \  }}}|||f  % y wr&   )r  )rX   r   r  patternr   r*   s        r,   rY   z(Channel.list_bindings.<locals>.<genexpr>S  sF      F,0NN8,DF(D'5 $' F' Fs   ),r   r?   rF   s   `r,   list_bindingszChannel.list_bindingsR  s"    F $

 4 4F 	Fr.   c                $    | j                  |      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	    vr.   c                    | j                  |||       |r$ | j                  |      j                  |||fi |S  | j                  ||fi |S )zPublish message.)_inplace_augment_messager  deliverr   )r*   rt   r   r    r   s        r,   basic_publishzChannel.basic_publish^  s^    %%gxE04;;x(00;28  tyyg888r.   c                    | j                  |d   | j                        \  |d<   }|d   }|j                  || j                                |d   j                  ||       y )Nr   r   )r   ru   r   r   r    )r   r   updater-  )r*   rt   r   r    r   r   s         r,   r/  z Channel._inplace_augment_messageh  sv    )-)9)9FOT//*
& %'002 	 	
 	o%%# 	& 	
r.   c                     | j                   |<    j                  j                  |        fd}| j                  j                  |<    j
                  j                  |        j                          y)zConsume from `queue`.c                    j                  |       }s&j                  j                  ||j                          |      S )Nr`   )r   qosrv   ru   )raw_messagert   r   no_ackr*   s     r,   	_callbackz(Channel.basic_consume.<locals>._callback{  s;    ll;l=G)=)=>G$$r.   N)r   r   rv   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                R   || j                   v r| j                   j                  |       | j                          | j                  j	                  |d      }	 | j
                  j                  |       | j                  j                  j	                  |d       yy# t        $ r Y 3w xY w)z Cancel consumer by consumer tag.N)	r   rO   r=  r   rS   r   
ValueErrorr   r<  )r*   r>  r   s      r,   basic_cancelzChannel.basic_cancel  s    4??*OO""<0&&**<>E##**51 OO&&**5$7 +  s   B 	B&%B&c                    	 | j                  | j                  |      |       }|s&| j                  j                  ||j                         |S # t
        $ r Y yw xY w)z+Get message by direct access (synchronous).r7  N)r   r   r8  rv   ru   r
   )r*   r   r:  r   rt   s        r,   	basic_getzChannel.basic_get  sT    	ll499U#3TlBG)=)=>N 		s   AA 	AAc                :    | j                   j                  |       y)zAcknowledge message.N)r8  r   )r*   ru   multiples      r,   	basic_ackzChannel.basic_ack  s    \"r.   c                P    |r| j                   j                         S t        d      )zRecover unacked messages.z'Does not support recover(requeue=False))r8  r   r   )r*   r   s     r,   basic_recoverzChannel.basic_recover  s$    88++--!"KLLr.   c                >    | j                   j                  ||       y)zReject message.r   N)r8  r   r   s      r,   basic_rejectzChannel.basic_reject  s    g6r.   c                &    || j                   _        y)zzChange QoS settings for this channel.

        Note:
        ----
            Only `prefetch_count` is supported.
        N)r8  ra   )r*   prefetch_sizera   apply_globals       r,   	basic_qoszChannel.basic_qos  s     #1r.   c                @    t        | j                  j                        S r&   )r   r   r?   rF   s    r,   get_exchangeszChannel.get_exchanges  s    DJJ(())r.   c                :    | j                   j                  |   d   S )z%Get table of bindings for `exchange`.r   r(  )r*   r   s     r,   r  zChannel.get_table  s    zz##H-g66r.   c                |    	 | j                   j                  |   d   }| j                  |   S # t        $ r |}Y w xY w)z.Get the exchange type instance for `exchange`.r   )r   r?   rP   r   )r*   r   defaultr   s       r,   r  zChannel.typeof  sI    	::''1&9D ""4((  	D	s   - ;;c                R   || j                   }|s|xs |gS 	 | j                  |      j                  | j                  |      |||      }|sI|Gt        j                  t        t        j                  ||                   | j                  |       |g}|S # t        $ r g }Y Zw xY w)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.
        r3  )r   r  lookupr  rP   warningswarnr;   UNDELIVERABLE_FMTr   r   )r*   r   r    rU  Rs        r,   _lookupzChannel._lookup  s     ?++G*7++	H%,,x(+wA W(MM./@/G/G!{ 0H 0< =  OOG$	A  	A	s   2B B&%B&c                    |j                   }|j                         }d|d<   | j                  |d   |d         D ]  }| j                  ||        y)z.Redeliver message to its original destination.Tredeliveredr   r    N)r   r   r\  r   )r*   rt   r   r   s       r,   r   zChannel._restore  s]    --&&(!%\\*%m,. 	&E IIeW%	&r.   c                $    | j                  |      S r&   )r   )r*   rt   s     r,   r   zChannel._restore_at_beginning  s    }}W%%r.   c                $   |xs | j                   j                  }| j                  ra| j                  j	                         rGt        | d      r| j                  | j                  |      S | j                  | j                  ||      S t               )N	_get_manyr   )r   _deliverr   r8  rn   hasattrra  r   r   r   r
   )r*   r   r   s      r,   drain_eventszChannel.drain_events  so    7t77??txx335t[)~~d&9&97~KK::djj(G:DDgr.   c                X    t        || j                        s| j                  ||       S |S )z1Convert raw message to :class:`Message` instance.)r   r`   )
isinstancer   )r*   r9  s     r,   message_to_pythonzChannel.message_to_python  s)    +t||4<<T<BBr.   c                    |xs i }|j                  di        |j                  d|xs | j                         ||||xs i |xs i dS )zPrepare message data.r   priority)r   r   r   r   r   )rJ   default_priority)r*   r   rj  r   r   r   r   s          r,   prepare_messagezChannel.prepare_message  s[      %2
or2j(*Kd6K6KL$4 ,"=b(.B	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Jr.   c                   | j                   sd| _         t        | j                        D ]  }| j                  |        | j                  r| j                  j                          | j                  !| j                  j                          d| _        | j                  | j                  j                  |        d| _
        y)zTClose channel.

        Cancel all consumers, and requeue unacked messages.
        TN)r   r   r   rB  r   rh   r   closer   close_channelr   )r*   consumers     r,   rq  zChannel.close  s    
 {{DK 1 ,!!(+,yy		..0{{&!!#"*--d3"r.   c                    |r?|j                         dk7  r,| j                  j                  |      j                  |      |fS ||fS Nr   )lowercodecsry   r-   r*   r   encodings      r,   r   zChannel.encode_body$  s@    (G3;;??8,33D98CCX~r.   c                    |r=|j                         dk7  r*| j                  j                  |      j                  |      S |S ru  )rv  rw  ry   r1   rx  s      r,   r   zChannel.decode_body)  s6    (G3;;??8,33D99r.   c                X    t        | j                  | j                  t              | _        y r&   )r   r   r   r
   r   rF   s    r,   r=  zChannel._reset_cycle.  s!    !!4#6#6?r.   c                    | S r&   r6   rF   s    r,   	__enter__zChannel.__enter__2  s    r.   c                $    | j                          y r&   )rq  )r*   exc_typeexc_valexc_tbs       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                ^    | j                   | j                  |       | _         | j                   S )z&:class:`QoS` manager for this channel.)r   r]   rF   s    r,   r8  zChannel.qosB  s'     99DIyyr.   c                R    | j                   | j                          | j                   S r&   )r   r=  rF   s    r,   r   zChannel.cycleI  s"    ;;{{r.   c                    	 t        t        t        |d   d         | j                        | j                        }|r| j                  |z
  S |S # t
        t        t        f$ r | j                  }Y 5w xY w)zGet priority from message.

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

        Note:
        ----
            Higher value has more priority.
        r   rj  )	rp   minintmax_prioritymin_priority	TypeErrorrA  rP   rk  )r*   rt   reverserj  s       r,   _get_message_priorityzChannel._get_message_priorityO  sy    	-C-j9:%%'!!H 29!!H,FhF :x0 	-,,H	-s   9A  A10A1c                   t        | j                  j                        }t        d| j                  j                  dz         D ]/  }||vs| j                  j                  j                  |       |c S  t        dj                  t        | j                  j                        | j                  j                        d      )Nr   z/No free channel ids, current={}, channel_max={})   r   )
rA   r   _used_channel_idsrangechannel_maxrv   r   r   rk   channels)r*   used_channel_idsr   s      r,   r   zChannel._get_free_channel_idc  s     t@@A4??#>#>#BC 	"J!111188D!!	"
 =DDDOO,,-++-.6
 	
r.   )Nr   FFNFF)FFr   ) r  FN)Nr  Nr   )r   r   F)r   r&   )NN)NNNNN)T)r  ztype[BaseException] | Noner  zBaseException | Noner  zTracebackType | NonereturnNone)Ar2   r3   r4   r5   r   r]   r   r   r   r   r  r$   rw  r   r   _delivery_tagsr   r   rk  r  r  rC   r  r  r  r  r  r  r  r!  r$  r)  r+  r-  r1  r/  r?  rB  rD  rG  rI  rL  rP  rR  r  r  r\  r   r   re  rh  rl  ro  rq  r   r   r=  r}  r  propertyr   r8  r   r  r   r6   r.   r,   r   r     s    G C J 12N O !F M 1XN  C LL. FK6:/4<1?	0! AC.2N CE04P <>!." >@#DF
"9
 
8#M7 9:$1*7):&& AEHL0K#$

?, & %	
 
 % %    
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                b    t         |   |       |j                  j                         | _        y r&   )r   rC   r   r`   )r*   	transportr   s     r,   rC   zManagement.__init__w  s&    # ''//1r.   c           	     x    | j                   j                         D cg c]  \  }}}|||d c}}}S c c}}}w )N)r  r  r    )r`   r)  )r*   qers       r,   get_bindingszManagement.get_bindings{  sA    #||99;= =Aq! !"QqA = 	= =s   5c                8    | j                   j                          y r&   )r`   rq  rF   s    r,   rq  zManagement.close  s    r.   )r2   r3   r4   r5   rC   r  rq  r   r   s   @r,   r  r  t  s    1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                   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y)	Transportz|Virtual transport.

    Arguments:
    ---------
        client (kombu.Connection): The client this is a transport for.
    Ng      ?i  Fr   topic)asynchronousexchange_type
heartbeatsc                *   || _         t               | _        g | _        g | _        i | _        | j                  | j                  | j                  t              | _	        |j                  j                  d      }||| _        t        t              | _        y )Npolling_interval)r   r=   r   r  _avail_channelsr<  Cycle_drain_channelr
   r   r   ry   r  r   ARRAY_TYPE_Hr  )r*   r   r   r  s       r,   rC   zTransport.__init__  sy     ]
!ZZ 3 3T]]EJ
!33778JK'$4D!!&|!4r.   c                    	 | j                   j                         S # t        $ r1 | j                  |      }| j                  j                  |       |cY S w xY wr&   )r  rS   
IndexErrorr   r  rv   )r*   r   r`   s      r,   create_channelzTransport.create_channel  sP    	''++-- 	ll:.GMM  )N	s    7AAc                    	 	 | j                   j                  |j                         	 | j                  j                  |       d |_        y # t        $ r Y /w xY w# t        $ r Y "w xY w# d |_        w xY wr&   )r  rO   r   rA  r  r   )r*   r`   s     r,   rr  zTransport.close_channel  sy    	&&&--g.@.@A$$W- "&G  
   "&Gs@   %A A 	AA* AA* 	A'$A* &A''A* *	A3c                Z    | j                   j                  | j                  |              | S r&   )r  rv   r  rF   s    r,   establish_connectionzTransport.establish_connection  s(     	##D$7$7$=>r.   c                    | j                   j                          | j                  | j                  fD ])  }|s	 |j	                         }|j                          |r$+ y # t
        $ r Y w xY wr&   )r   rq  r  r  rS   LookupError)r*   r   	chan_listr`   s       r,   close_connectionzTransport.close_connection  sg    

--t}}< 	$I$'mmoG MMO 	$ # s   A  	A,+A,c                $   t               }| j                  j                  }| j                  }|r	|r||kD  r|}	 	  || j                  |       y # t
        $ r6 |$t               |z
  |k\  rt        j                         |t        |       Y nw xY wY)Nrb  )	r   r   ry   r  rc  r
   socketr   r   )r*   r   r   
time_startry   r  s         r,   re  zTransport.drain_events  s    [
jjnn00',<w,F&DMM73   ,&9;+Cw+N ..**#/*+	, s   A <BBc                    |st        dj                  |            	 | j                  |   } ||       y # t         $ r. t        j	                  t
        |       | j                  |       Y y w xY w)Nz.Received message without destination queue: {})rP   r   r<  loggerwarningW_NO_CONSUMERS_reject_inbound_message)r*   rt   r   r   s       r,   rc  zTransport._deliver  sm    @GG 	u-H
 W	  	2NN>51((1	2s   6 4A-,A-c                    | j                   D ]\  }|s|j                  ||      }|j                  j                  ||j                         |j                  |j                  d        y  y )Nr7  TrK  )r  r   r8  rv   ru   rL  )r*   r9  r`   rt   s       r,   r  z!Transport._reject_inbound_message  s`    }} 	G!//+w/G""7G,@,@A$$W%9%94$H	r.   c                    |r|| j                   vrt        dj                  ||             | j                   |   |       y )Nz,Message for queue {!r} without consumers: {})r<  rP   r   )r*   r`   rt   r   s       r,   on_message_readyzTransport.on_message_ready  sE    T__4>EE7$% % 	w'r.   c                (    |j                  ||      S )N)r   r   )re  )r*   r`   r   r   s       r,   r  zTransport._drain_channel
  s    ##Xw#GGr.   c                     | j                   ddS )N	localhost)porthostname)default_portrF   s    r,   default_connection_paramsz#Transport.default_connection_params  s    )){CCr.   r&   )r2   r3   r4   r5   r   r   r  r  r   r  r  r<  r  r  r   r  
implementsextend	frozensetrC   r  rr  r  r  re  rc  r  r  r  r  r  r6   r.   r,   r  r    s     GEJ E L H J  K**117 34 2 J5&	$"(H D Dr.   r  )Dr5   
__future__r   r'   r  r   rX  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  rZ  r  r  r   r   r2   r  r   r!   r$   	Exceptionr8   UserWarningr;   r=   r]   r   r   
StdChannelr   r  r  r6   r.   r,   <module>r     sA  
 #   
   < <  )  !   , 8     0 ; , ! -# 
 
 <9 	H	 ? - 
 . 1 
1 1L L9; 9D
 D
N_ _D"
dll "
J?! ?!DL
ot L
^ LD LDr.   