
    ^fw                       d Z ddlmZ ddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ 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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) 	 ddl*Z*n# e+$ r dZ*Y nw xY w	 ddl*m,Z, n# e+$ r dZ,Y nw xY w ed          Z-e-j.        e-j/        cZ0Z/dZ1dZ2dZ3g dZ4 edd          Z5d Z6d Z7 G d d e8          Z9e
d!             Z:d" Z; G d# d$          Z< G d% d&e<e*j=                  Z> G d' d(e<e*j?        j@                  ZA G d) d*e*j?        jB                  ZC G d+ d,e)jD                  ZD G d- d.          ZE G d/ d0e)jF                  ZF G d1 d2e)jG                  ZGe,r G d3 d4e,jH        e*jI                  ZJ G d5 d6eF          ZK G d7 d8eG          ZLdS )9a  Redis transport module for Kombu.

Features
========
* Type: Virtual
* Supports Direct: Yes
* Supports Topic: Yes
* Supports Fanout: Yes
* Supports Priority: Yes
* Supports TTL: No

Connection String
=================
Connection string has the following format:

.. code-block::

    redis://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]
    rediss://[USER:PASSWORD@]REDIS_ADDRESS[:PORT][/VIRTUALHOST]

To use sentinel for dynamic Redis discovery,
the connection string has following format:

.. code-block::

    sentinel://[USER:PASSWORD@]SENTINEL_ADDRESS[:PORT]

Transport Options
=================
* ``sep``
* ``ack_emulation``: (bool) If set to True transport will
  simulate Acknowledge of AMQP protocol.
* ``unacked_key``
* ``unacked_index_key``
* ``unacked_mutex_key``
* ``unacked_mutex_expire``
* ``visibility_timeout``
* ``unacked_restore_limit``
* ``fanout_prefix``
* ``fanout_patterns``
* ``global_keyprefix``: (str) The global key prefix to be prepended to all keys
  used by Kombu
* ``socket_timeout``
* ``socket_connect_timeout``
* ``socket_keepalive``
* ``socket_keepalive_options``
* ``queue_order_strategy``
* ``max_connections``
* ``health_check_interval``
* ``retry_on_timeout``
* ``priority_steps``
    )annotationsN)bisect)
namedtuple)contextmanager)Empty)time)promise)InconsistencyErrorVersionMismatch)
get_logger)register_after_fork)bytes_to_str)ERRREADpoll)accepts_argument)dumpsloads)cached_property)cycle_by_name)
_parse_url   )virtual)sentinelzkombu.transport.redisi     )r         	   error_classes_t)connection_errorschannel_errorsc                 8   ddl m}  t          | d          r| j        }n| j        }t          t          j        j        t          t          j        t          t          | j        | j        | j        | j        fz   t          j        j        || j        | j        fz             S )z$Return tuple of redis error classes.r   
exceptionsInvalidData)redisr$   hasattrr%   	DataErrorr   r   	Transportr    r
   socketerrorIOErrorOSErrorConnectionErrorBusyLoadingErrorAuthenticationErrorTimeoutErrorr!   InvalidResponseResponseError)r$   r(   s     G/var/www/html/env/lib/python3.11/site-packages/kombu/transport/redis.pyget_redis_error_classesr5   y   s           z=)) )*		(				,L&'*#0% 
% 
		)&$-& 
&      c                     ddl m}  | j        S )z1Return the redis ConnectionError exception class.r   r#   )r&   r$   r.   r#   s    r4   get_redis_ConnectionErrorr8      s          %%r6   c                      e Zd ZdZdS )	MutexHeldz)Raised when another party holds the lock.N__name__
__module____qualname____doc__ r6   r4   r:   r:      s        3333r6   r:   c              #  l  K   |                      ||          }d}	 |                    d          }|rdV  nt                      	 |r2	 |                                 dS # t          j        j        $ r Y dS w xY wdS # |r0	 |                                 w # t          j        j        $ r Y w w xY ww xY w)zTAcquire redis lock in non blocking way.

    Raise MutexHeld if not successful.
    timeoutF)blockingN)lockacquirer:   releaser&   r$   LockNotOwnedError)clientnameexpirerE   lock_acquireds        r4   MutexrM      s       ;;tV;,,DMe44 	EEEE++   	#5   	 	= 	#5   	sA   +A? A" "A:9A:?B3BB3B/,B3.B//B3c                .    |                                   d S N)_after_fork)channels    r4   _after_fork_cleanup_channelrR      s    r6   c                  h     e Zd ZdZg dZddddddddddddd	Zd
 Z fdZ fdZddZ	 xZ
S )GlobalKeyPrefixMixina  Mixin to provide common logic for global key prefixing.

    Overriding all the methods used by Kombu with the same key prefixing logic
    would be cumbersome and inefficient. Hence, we override the command
    execution logic that is called by all commands.
    )HDELHGETHLENHSETLLENLPUSHPUBLISHRPUSHRPOPSADDSREMSETSMEMBERSZADDZREMZREVRANGEBYSCOREr   N)
args_startargs_end   r   )DELBRPOPEVALSHAWATCHc                    t          |          }|                    d          }| j        v r! j        t	          |d                   z   |d<   nk| j        v rb j        |         d         } j        |         d         }|dk    r
|d |         ng }g }|
||d          }| fd|||         D             z   |z   }|g|S )Nr   re   rf   c                >    g | ]}j         t          |          z   S r@   global_keyprefixstr.0argselfs     r4   
<listcomp>z5GlobalKeyPrefixMixin._prefix_args.<locals>.<listcomp>   s7        %C0  r6   )listpopPREFIXED_SIMPLE_COMMANDSrp   rq   PREFIXED_COMPLEX_COMMANDS)ru   argscommandre   rf   pre_args	post_argss   `      r4   _prefix_argsz!GlobalKeyPrefixMixin._prefix_args   s   Dzz((1++d333+c$q'll:DGG6667@NJ5g>zJH,6NNtKZK((HI# O	    
8 34    D
 $r6   c                     t                      j        ||fi |}|dk    r'|r%|\  }}|t          | j                  d         }||fS |S )zParse a response from the Redis server.

        Method wraps ``redis.parse_response()`` to remove prefixes of keys
        returned by redis command.
        rj   N)superparse_responselenrp   )ru   
connectioncommand_nameoptionsretkeyvalue	__class__s          r4   r   z#GlobalKeyPrefixMixin.parse_response   sh     %egg$ZIIII7""s"JCc$/00112C:
r6   c                \     t                      j        |                     |          i |S rO   r   execute_commandr   ru   r{   kwargsr   s      r4   r   z$GlobalKeyPrefixMixin.execute_command   -    &uww&(9(9$(?(?J6JJJr6   Tc                H    t          | j        | j        ||| j                  S )Nrp   )PrefixedRedisPipelineconnection_poolresponse_callbacksrp   )ru   transaction
shard_hints      r4   pipelinezGlobalKeyPrefixMixin.pipeline  s1    $ #!2
 
 
 	
r6   )TN)r<   r=   r>   r?   ry   rz   r   r   r   r   __classcell__r   s   @r4   rT   rT      s              (  T22 !r22"#33 !t44	! !     .    K K K K K
 
 
 
 
 
 
 
r6   rT   c                      e Zd ZdZd Zd ZdS )PrefixedStrictRedisz@Returns a ``StrictRedis`` client that prefixes the keys it uses.c                p    |                     dd          | _        t          j        j        | g|R i | d S Nrp    )rx   rp   r&   Redis__init__ru   r{   r   s      r4   r   zPrefixedStrictRedis.__init__  sB     &

+=r B BT3D333F33333r6   c                4    t          | j        fd| j        i|S )Nrp   )PrefixedRedisPubSubr   rp   )ru   r   s     r4   pubsubzPrefixedStrictRedis.pubsub  s4    " 
 
!2
 
 
 	
r6   N)r<   r=   r>   r?   r   r   r@   r6   r4   r   r     s8        JJ4 4 4
 
 
 
 
r6   r   c                      e Zd ZdZd ZdS )r   a   Custom Redis pipeline that takes global_keyprefix into consideration.

    As the ``PrefixedStrictRedis`` client uses the `global_keyprefix` to prefix
    the keys it uses, the pipeline called by the client must be able to prefix
    the keys as well.
    c                z    |                     dd          | _        t          j        j        j        | g|R i | d S r   )rx   rp   r&   rI   Pipeliner   r   s      r4   r   zPrefixedRedisPipeline.__init__"  sE     &

+=r B B&t=d===f=====r6   N)r<   r=   r>   r?   r   r@   r6   r4   r   r     s-         > > > > >r6   r   c                  @     e Zd ZdZdZ fdZd Z fdZ fdZ xZ	S )r   zCRedis pubsub client that takes global_keyprefix into consideration.)	SUBSCRIBEUNSUBSCRIBE
PSUBSCRIBEPUNSUBSCRIBEc                p    |                     dd          | _         t                      j        |i | d S r   )rx   rp   r   r   r   s      r4   r   zPrefixedRedisPubSub.__init__1  s<     &

+=r B B$)&)))))r6   c                     t          |          }|                    d          }| j        v r fd|D             }|g|S )Nr   c                >    g | ]}j         t          |          z   S r@   ro   rr   s     r4   rv   z4PrefixedRedisPubSub._prefix_args.<locals>.<listcomp>:  s7        %C0  r6   )rw   rx   PUBSUB_COMMANDS)ru   r{   r|   s   `  r4   r   z PrefixedRedisPubSub._prefix_args5  sc    Dzz((1++d***     D
 $r6   c                r      t                      j        |i |}||S |^}}}|g fd|D             |S )zParse a response from the Redis server.

        Method wraps ``PubSub.parse_response()`` to remove prefixes of keys
        returned by redis command.
        Nc                H    g | ]}|t          j                  d          S rO   )r   rp   )rs   rQ   ru   s     r4   rv   z6PrefixedRedisPubSub.parse_response.<locals>.<listcomp>S  s/    KKKwgc$/00112KKKr6   )r   r   )ru   r{   r   r   message_typechannelsmessager   s   `      r4   r   z"PrefixedRedisPubSub.parse_responseA  sl     %egg$d5f55;J ,/(x
KKKK(KKK
 
 	
r6   c                \     t                      j        |                     |          i |S rO   r   r   s      r4   r   z#PrefixedRedisPubSub.execute_commandW  r   r6   )
r<   r=   r>   r?   r   r   r   r   r   r   r   s   @r4   r   r   '  s        MMO* * * * *
  
  
 
 
 
 
 
,K K K K K K K K Kr6   r   c                       e Zd ZdZdZ fdZ fdZddZ fdZd fd		Z	e
dd
            ZddZddZddZed             Zed             Zed             Zed             Zed             Z xZS )QoSzRedis Ack Emulation.Tc                H     t                      j        |i | d| _        d S )Nr   )r   r   _vrestore_countr   s      r4   r   zQoS.__init__`  s-    $)&))) r6   c           
        |j         }|d         |d         }}t          j        d         dk    r|t                      ig}nt                      |g}|                                 5 } |j        | j        g|R                      | j        |t          |j
        ||g                                                     t                                          ||           d d d            d S # 1 swxY w Y   d S )Nexchangerouting_keyr   r   )delivery_infor&   VERSIONr   pipe_or_acquirezaddunacked_index_keyhsetunacked_keyr   _rawexecuter   append)	ru   r   delivery_tagdeliveryEXRK	zadd_argspiper   s	           r4   r   z
QoS.appendd  s+   (*%x'>B=q  &/0II.I!!## 	2tDId,9y999d&W\2r2335 5GGNN7L111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2s   %A7C))C-0C-Nc                    | j                             |          5 }| j        D ]}|                     ||           	 d d d            n# 1 swxY w Y   | j                                         d S )NrI   )rQ   conn_or_acquire
_deliveredrestore_by_tagclear)ru   rI   tags      r4   restore_unackedzQoS.restore_unackedu  s    \))&11 	8V 8 8##C#77778	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	8 	s   "A

AAc                    |                      |                                           t                                          |           d S rO   )_remove_from_indicesr   r   ack)ru   r   r   s     r4   r   zQoS.ack{  s?    !!,//77999L!!!!!r6   Fc                    |r|                      |d           n'|                     |                                           t                                          |           d S NT)leftmost)r   r   r   r   r   )ru   r   requeuer   s      r4   rejectz
QoS.reject  sc     	>t<<<<%%l33;;===L!!!!!r6   c              #     K   |r|V  d S | j                             |          5 }|                                V  d d d            d S # 1 swxY w Y   d S rO   )rQ   r   r   )ru   r   rI   s      r4   r   zQoS.pipe_or_acquire  s       	(JJJJJ--f55 (oo'''''( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( ( (s   A		AAc                    |                      |          5 }|                    | j        |                              | j        |          cd d d            S # 1 swxY w Y   d S rO   )r   zremr   hdelr   )ru   r   r   s      r4   r   zQoS._remove_from_indices  s    !!$'' 	=499T3\BBT-|<<	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	= 	=s   4AAAr   
   c           
        | xj         dz  c_         | j         dz
  |z  rd S | j                                        5 }t                      | j        z
  }	 t          || j        | j                  5  |                    | j	        |d|o||d          }|pg D ]\  }}| 
                    ||           	 d d d            n# 1 swxY w Y   n# t          $ r Y nw xY wd d d            d S # 1 swxY w Y   d S )Nr   r   T)startnum
withscores)r   rQ   r   r   visibility_timeoutrM   unacked_mutex_keyunacked_mutex_expirezrevrangebyscorer   r   r:   )	ru   r   r   intervalrI   ceilvisibler   scores	            r4   restore_visiblezQoS.restore_visible  s   ! 1$0 	F\))++ 	v66D33D	64#946 6 9 9$55.a!me 6 G GG '.m 9 9
U++C888899 9 9 9 9 9 9 9 9 9 9 9 9 9 9    	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	sZ   C%C,AB<0C<C 	 CC 	CC%
CC%CC%%C),C)c                      fd} j                             |          5 }|                    | j                   d d d            d S # 1 swxY w Y   d S )Nc                   |                      j                  }|                                                      |            |r@t	          t          |                    \  }}}j                            ||||            d S d S rO   )hgetr   multir   r   r   rQ   _do_restore_message)r   pMr   r   r   ru   r   s        r4   restore_transactionz/QoS.restore_by_tag.<locals>.restore_transaction  s    		$*C00AJJLLL%%c4000 L!,q//22	2r00BD(KKKKKL Lr6   )rQ   r   r   r   )ru   r   rI   r   r   s   `` ` r4   r   zQoS.restore_by_tag  s    	L 	L 	L 	L 	L 	L 	L \))&11 	FV2D4DEEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	Fs   AAAc                    | j         j        S rO   )rQ   r   ru   s    r4   r   zQoS.unacked_key  s    |''r6   c                    | j         j        S rO   )rQ   r   r   s    r4   r   zQoS.unacked_index_key      |--r6   c                    | j         j        S rO   )rQ   r   r   s    r4   r   zQoS.unacked_mutex_key  r   r6   c                    | j         j        S rO   )rQ   r   r   s    r4   r   zQoS.unacked_mutex_expire  s    |00r6   c                    | j         j        S rO   )rQ   r   r   s    r4   r   zQoS.visibility_timeout  s    |..r6   rO   FNN)r   r   r   )NF)r<   r=   r>   r?   restore_at_shutdownr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   @r4   r   r   [  s       ! ! ! ! !2 2 2 2 2"       " " " " "" " " " " " ( ( ( ^(= = = =
   "F F F F ( ( _( . . _. . . _. 1 1 _1 / / _/ / / / /r6   r   c                      e Zd ZdZeez  ZdZdZd Z	d Z
d Zd Zd Zd	 Zd
 Zd Zd Zd Zd Zd Zd Zd Zd Zd ZddZed             ZdS )MultiChannelPollerz%Async I/O poller for Redis transport.FNc                    t                      | _        i | _        i | _        t	                      | _        t                      | _        d S rO   )set	_channels_fd_to_chan_chan_to_sockr   poller
after_readr   s    r4   r   zMultiChannelPoller.__init__  s7    ff%%r6   c                8   | j                                         D ]4}	 | j                            |           # t          t
          f$ r Y 1w xY w| j                                         | j                                         | j                                          d S rO   )	r	  valuesr
  
unregisterKeyError
ValueErrorr  r   r  )ru   fds     r4   closezMultiChannelPoller.close  s    $++-- 	 	B&&r****j)        """""s   8AAc                :    | j                             |           d S rO   )r  addru   rQ   s     r4   r  zMultiChannelPoller.add  s    7#####r6   c                :    | j                             |           d S rO   )r  discardr  s     r4   r  zMultiChannelPoller.discard  s    w'''''r6   c                v    	 | j                             |j                   d S # t          t          f$ r Y d S w xY wrO   )r
  r  _sockAttributeError	TypeErrorru   r   s     r4   _on_connection_disconnectz,MultiChannelPoller._on_connection_disconnect  sM    	K"":#344444	* 	 	 	DD	s   # 88c                D   |||f| j         v r|                     |||           |j        j        |j                                         |j        j        }||f| j        |                                <   || j         |||f<   | j                            || j	                   d S rO   )
r	  _unregisterr   r  connectr  filenor
  register
eventflags)ru   rQ   rI   typesocks        r4   	_registerzMultiChannelPoller._register  s    VT"d&888Wfd333"*%%''' &+2D/'6:GVT23T4?33333r6   c                V    | j                             | j        |||f                    d S rO   )r
  r  r	  )ru   rQ   rI   r$  s       r4   r  zMultiChannelPoller._unregister  s-    t17FD2IJKKKKKr6   c                    t          |dd           |j                            d          |_        |j        j        d uo|||f| j        v S )Nr   _)getattrr   get_connectionr   r  r	  )ru   rQ   rI   cmds       r4   _client_registeredz%MultiChannelPoller._client_registered   sW    6<..6 & 6 E Ec J JF!'t3 =&#&$*<<	>r6   c                    ||j         df}|                     ||j         d          sd|_         | j        |  |j        s|                                 dS dS )zEnable BRPOP mode for channel.rj   FN)rI   r-  _in_pollr&  _brpop_start)ru   rQ   idents      r4   _register_BRPOPz"MultiChannelPoller._register_BRPOP  sp    0&&wHH 	#$GDNE"" 	#  """""	# 	#r6   c                    |                      ||j        d          s#d|_        |                     ||j        d           |j        s|                                 dS dS )zEnable LISTEN mode for channel.LISTENFN)r-  	subclient
_in_listenr&  
_subscriber  s     r4   _register_LISTENz#MultiChannelPoller._register_LISTEN  sn    &&w0A8LL 	A!&GNN7G$5x@@@! 	!     	! 	!r6   c                    | j         D ]S}|j        r.|j                                        r|                     |           |j        r|                     |           Td S rO   )r  active_queuesqoscan_consumer2  active_fanout_queuesr8  r  s     r4   on_poll_startz MultiChannelPoller.on_poll_start  sr    ~ 	/ 	/G$ 2;**,, 2((111+ /%%g...	/ 	/r6   c                j    || _         | j        D ]#}|j                            |j                  c S d S N)r   )r
  r  r;  r   unacked_restore_limit)ru   r
  rQ   s      r4   on_poll_initzMultiChannelPoller.on_poll_init  sS    ~ 	 	G;..1 /     	 	r6   c                l    | j         D ]+}|j        r"|j                            |j                  c S ,d S r@  )r  r:  r;  r   rA  r  s     r4   maybe_restore_messagesz)MultiChannelPoller.maybe_restore_messages&  s\    ~ 	 	G$ {225 3     	 	r6   c                    | j         D ]P}|j                            d          }|2t          t	          |dd                     r|                                 Qd S )Nr5  check_health)r  __dict__getcallabler*  rF  )ru   rQ   rI   s      r4   maybe_check_subclient_healthz/MultiChannelPoller.maybe_check_subclient_health.  sh    ~ 	& 	&G%))+66F! !F!FGG "##%%%	& 	&r6   c                    | j         |         \  }}|j                                        r |j        |                      d S d S rO   )r  r;  r<  handlers)ru   r!  chanr$  s       r4   on_readablezMultiChannelPoller.on_readable6  sN    %f-
d8!! 	"DM$!!!!!	" 	"r6   c                    |t           z  r|                     |          | fS |t          z  r'| j        |         \  }}|                    |           d S d S rO   )r   rN  r   r  _poll_error)ru   r!  eventrM  r$  s        r4   handle_eventzMultiChannelPoller.handle_event;  sh    4< 	###F++T11S[ 	#)&1JD$T"""""	# 	#r6   c                   d| _         	 | j        D ]S}|j        r.|j                                        r|                     |           |j        r|                     |           T| j        	                    |          }|rp|D ]m\  }}| 
                    ||          }|rP d| _         | j        r?	 | j                                        } |             n# t          $ r Y d S w xY w| j        =d S d S n|                                  t                      # d| _         | j        r<	 | j                                        } |             n# t          $ r Y nw xY w| j        <w xY w)NTF)_in_protected_readr  r:  r;  r<  r2  r=  r8  r
  r   rR  r  rx   r  rD  r   )	ru   callbackrC   rQ   eventsr!  rQ  r   funs	            r4   rH  zMultiChannelPoller.getB  s   "&	> 3 3( 6{..00 6,,W555/ 3))'222[%%g..F %+  MFE++FE::C  ',D#/ /--//C CEEEE     EE /      '')))''M&+D#/ /--//C CEEEE     E /     sH   BD /C 
C! C!/#D E"E;E
EEEEc                    | j         S rO   )r  r   s    r4   fdszMultiChannelPoller.fds`  s    r6   rO   )r<   r=   r>   r?   r   r   r#  rT  r  r   r  r  r  r  r&  r  r-  r2  r8  r>  rB  rD  rJ  rN  rR  rH  propertyrY  r@   r6   r4   r  r    sT       //J  J
  
  
 # # #$ $ $( ( (  4 4 4L L L> > ># # #! ! !/ / /    & & &" " "
# # #   <     X     r6   r  c                      e Zd ZdZeZdZdZdZdZdZ	dZ
dZdZdZi ZdZdZd	Zd
ZdZdZdZeZdZdZdZdZdZdZeZdZ dZ!dZ"dZ#dZ$dZ%e&j'        j(        dz   Z(e)re)j*        ndZ+e)re)j,        ndZ- fdZ.d Z/d Z0d Z1	 dBdZ2dB fd	Z3d Z4 fdZ5d Z6 fdZ7d Z8d Z9d Z:d Z;d Z<d  Z=d! Z>dCd#Z?d$ Z@d% ZAd& ZBd' ZCd( ZDd) ZEd* ZFd+ ZGdBd,ZHd- ZId. ZJd/ ZKd0 ZLd1 ZM fd2ZNd3 ZOd4 ZP	 	 dDd5ZQdBd6ZRdBd7ZSdBd8ZTd9 ZUeVdEd:            ZWeXd;             ZYeXd<             ZZe[d=             Z\e[d>             Z]d? Z^d@ Z_eXdA             Z` xZaS )FChannelzRedis Channel.NFTz_kombu.binding.%sz/{db}.zunackedunacked_indexunacked_mutexi,  i  r   r   round_robin)sepack_emulationr   r   r   r   r   rA  fanout_prefixfanout_patternsrp   socket_timeoutsocket_connect_timeoutsocket_keepalivesocket_keepalive_optionsqueue_order_strategymax_connectionshealth_check_intervalretry_on_timeoutpriority_stepsc                0    t                      j        |i | | j        st          j        | _        d| _         t          | j                              | _        | 	                                | _
        |                                 | _        t                      | _        t                      | _        i | _        | j        | j        d| _        | j        r't+          | j        t,                    r| j        | _        nd| _        	 | j                                         n## t4          $ r |                                   w xY w| j        j                            |            d| _        | j        j        | _        t@          tA          | tB                     d S d S )NF)rj   r4  r   T)"r   r   rb  r   r   _registeredr   ri  _queue_cycle_get_clientClient_get_response_errorr3   r  r=  auto_delete_queues_fanout_to_queue_brpop_read_receiverL  rc  
isinstancerq   keyprefix_fanoutrI   ping	Exception_disconnect_poolsr   cycler  r    r   rR   r   s      r4   r   zChannel.__init__  s   $)&)))! 	#{DH DM$*CDDFF&&((!5577$'EE!"%%% ""&"2dmLL 	'$,c22 ;(,(:% %'D!	K 	 	 	""$$$	 	!!$''' "&!B*&ABBBBB +*s   D  D>c                .    |                                   d S rO   )r|  r   s    r4   rP   zChannel._after_fork  s         r6   c                    | j         }| j        }d x| _        | _         ||                                 ||                                 d S d S rO   )_pool_async_pool
disconnect)ru   pool
async_pools      r4   r|  zChannel._disconnect_pools  s\    z%
(,,4:OO!!!##### "!r6   c                    | j         |u rd | _         | j        |u rd | _        | j        r-| j        j        r#| j        j                            |           d S d S d S rO   )r/  r6  r   r}  r  r  s     r4   r  z!Channel._on_connection_disconnect  sy    =J&& DM?j(("DO? 	Ht4 	HO!;;JGGGGG	H 	H 	H 	Hr6   c                   	 	 d|d         d<   d|d         d         d<   n# t           $ r Y nw xY w|                     ||          D ]T}|                     |d          } |r|j        n|j        |                     ||          t          |                     Ud S # t          $ r t          d|d	           Y d S w xY w)
NTheadersredelivered
propertiesr   FreversezCould not restore message: %rexc_info)	r  _lookup_get_message_prioritylpushrpush
_q_for_prir   r{  crit)ru   payloadr   r   r   r   queuepris           r4   r   zChannel._do_restore_message  s   	J48	"=1HL%o6}EE   h<<  00%0HH7x7TZOOE3//w      	J 	J 	J0'DIIIIIII	Js(     B 
-B -A.B B=<B=c                
     j         s!t                                          |          S |j         fd}                                 5 }|                    | j                   d d d            d S # 1 swxY w Y   d S )Nc                   |                      j                  }|                                  |                     j                   |r;t	          t          |                    \  }}}                    ||||            d S d S rO   )r   r   r   r   r   r   r   )r   Pr   r   r   r   ru   r   s        r4   r   z-Channel._restore.<locals>.restore_transaction%  s    		$*C00AJJLLLIId&,,, D!,q//22	2r((BD(CCCCCD Dr6   )rb  r   _restorer   r   r   r   )ru   r   r   r   rI   r   r   s   ` `  @r4   r  zChannel._restore   s    ! 	-77##G,,,"	D 	D 	D 	D 	D 	D 	D !!## 	Fv2D4DEEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	Fs   A88A<?A<c                0    |                      |d          S r   )r  )ru   r   s     r4   _restore_at_beginningzChannel._restore_at_beginning0  s    }}Wt}444r6   c                    || j         v r4| j         |         \  }}| j                            |           || j        |<    t	                      j        |g|R i |}|                                  |S rO   )_fanout_queuesr=  r  ru  r   basic_consume_update_queue_cycle)ru   r  r{   r   r   r)  r   r   s          r4   r  zChannel.basic_consume3  s    D'''-e4KHa%))%000.3D!(+#egg#E;D;;;F;; 	  """
r6   c                    | j         }|rT|j        j        r3|j        j                            t          | j        |f                    S |                     |          S d S rO   )r   r}  rT  r  r  r	   _basic_cancel)ru   consumer_tagr   s      r4   basic_cancelzChannel.basic_cancelG  sq    
 _
 	42 !'266D.@@   %%l333	4 	4r6   c                   	 | j         |         }n# t          $ r Y d S w xY w	 | j                            |           |                     |           n# t          $ r Y nw xY w	 | j        |         \  }}| j                            |           n# t          $ r Y nw xY wt                      	                    |          }| 
                                 |S rO   )_tag_to_queuer  r=  remove_unsubscribe_fromr  ru  rx   r   r  r  )ru   r  r  r   r)  r   r   s         r4   r  zChannel._basic_cancelT  s   	&|4EE 	 	 	FF		*%,,U333 ""5))))  	 	 	D		-e4KHa!%%h//// 	 	 	D	gg""<00  """
s/    
A 
A A $*B 
BBc                    |r%| j         rd                    | j        |d|g          S d                    | j        |g          S )Nr   /)rd  joinry  )ru   r   r   s      r4   _get_publish_topiczChannel._get_publish_topich  sN     	P4/ 	P77D18S+NOOOww-x8999r6   c                N    | j         |         \  }}|                     ||          S rO   )r  r  )ru   r  r   r   s       r4   _get_subscribe_topiczChannel._get_subscribe_topicm  s*     $ 3E :+&&x===r6   c                      fd j         D             }|sd S  j        }|j        j        |j                                         |j         _        |                    |           d S )Nc                :    g | ]}                     |          S r@   )r  rs   r  ru   s     r4   rv   z&Channel._subscribe.<locals>.<listcomp>r  s7     8 8 8 ))%00 8 8 8r6   )r=  r5  r   r  r   r6  
psubscribe)ru   keyscs   `  r4   r7  zChannel._subscribeq  s    8 8 8 8!68 8 8 	FN<%L  """,	Tr6   c                    |                      |          }| j        }|j        r$|j        j        r|                    |g           d S d S d S rO   )r  r5  r   r  unsubscribe)ru   r  topicr  s       r4   r  zChannel._unsubscribe_from|  s`    ))%00N< 	#AL. 	#MM5'"""""	# 	# 	# 	#r6   c                    t          |d                   dk    r|d         dk    r	d|_        d S t          |d                   dk    r$|d         |d         |d         |d         f\  }}}}n|d         d |d         |d         f\  }}}}||||dS )	Nr   r  rh   Fpmessager   r   )r$  patternrQ   data)r   
subscribed)ru   rI   rr$  r  rQ   r  s          r4   _handle_messagezChannel._handle_message  s    !..1Q4199 %FF!+++,Q41qtQqT+A(D'7DD+,Q4qtQqT+A(D'7D	
 
 	
r6   c                ~   | j         }g }	 |                    |                     |                     n# t          $ r Y nw xY w|j        e|j                            d          rJ|                    |                     |                     |j        |j                            d          Jt          |          S )Nr   rB   )r5  r   _receive_oner   r   can_readany)ru   r  r   s      r4   rw  zChannel._receive  s    N	JJt((++,,,, 	 	 	D	l&1<+@+@+@+K+K&JJt((++,,, l&1<+@+@+@+K+K&3xxs   (4 
A Ac                
   d }	 |                                 }n# | j        $ r	 d | _         w xY wt          |t          t
          f          r3|                     ||          }t          |d                                       d          rt          |d                   }|d         r|d         dk    r|	                    d          \  }}}	 t          t          |d                             }nK# t          t          f$ r7 t          d|t          |          d d	         d
           t                      w xY w|                    dd
          d         }| j                            || j        |                    dS d S d S d S )Nr$  r   rQ   r  r   r  .z&Cannot process event on channel %r: %si   r   r  T)r   r    r6  rx  rw   tupler  r   endswith	partitionr   r  r  warningreprr   splitr   _deliverru  )ru   r  responser  rQ   r)  r   r   s           r4   r  zChannel._receive_one  s   	''))HH% 	 	 	"DO	 hu.. 	 **1h77GGFO,,55i@@  &wy'9::6?  qzS(((/(9(9#(>(>1g&"'WV_(E(E"F"F%z2 & & & H 'guu)=K K K K#gg&  '}}S!44Q7HO,,!6x!@B B B4!	  	       s    ,"C0 0AD8r   c                4     j                             t           j                            sd S  fd j        D             |pdgz   } j        j         _        dg|} j        r j        	                    |          }  j        j        j
        |  d S )Nc                F    g | ]}D ]}                     ||          S r@   )r  )rs   r  r  queuesru   s      r4   rv   z(Channel._brpop_start.<locals>.<listcomp>  sK     % % %#% % s++ % % % %r6   r   rj   )rp  consumer   r:  rm  rI   r   r/  rp   r   send_command)ru   rC   r  command_argsr  s   `   @r4   r0  zChannel._brpop_start  s    "**3t/A+B+BCC 	F% % % % %t7J % % %(/1~6.'$'  	B;33LAAL++\::::r6   c                   	 	  | j         j        | j         j        dfi |}n-# | j        $ r  | j         j                                          w xY w|r|\  }}t          |                              | j        d          d         }| j        	                    |           | j        
                    t          t          |                    |           	 d | _        dS t                      # d | _        w xY w)Nrj   r   r   T)rI   r   r   r    r  r   rsplitra  rp  rotater  r   r/  r   )ru   r   
dest__itemdestitems        r4   rv  zChannel._brpop_read  s    	!7T[78N8?C C:AC C

 )    &11333	
  '
d#D))001==a@!((...((|D/A/A)B)BDIII !DMMM gg DM    s!   " C+ *ABC+ C+ +	C4c                    |dk    r| j                                          d S | j                            | j        j        |           d S )Nr4  )r5  r   rI   r   )ru   r$  r   s      r4   rP  zChannel._poll_error  sJ    8N))+++++K&&t{'=tDDDDDr6   c                    |                                  5 }| j        D ]W}|                    |                     ||                    }|r*t	          t          |                    c cd d d            S Xt                      # 1 swxY w Y   d S rO   )r   rm  rpopr  r   r   r   )ru   r  rI   r  r  s        r4   _getzChannel._get  s    !!## 	v* 5 5{{4??5##>#>?? 5 d!3!34444		 	 	 	 	 	 	 	5''M	 	 	 	 	 	 	 	 	 	s   AB4BB
Bc           	        |                                  5 }|                                5 }| j        D ]+}|                    |                     ||                    },|                                }t          d |D                       cd d d            cd d d            S # 1 swxY w Y   	 d d d            d S # 1 swxY w Y   d S )Nc              3  N   K   | ] }t          |t          j                  |V  !d S rO   )rx  numbersIntegral)rs   sizes     r4   	<genexpr>z Channel._size.<locals>.<genexpr>  sP       B BD(w/?@@B4 B B B B B Br6   )r   r   rm  llenr  r   sum)ru   r  rI   r   r  sizess         r4   _sizezChannel._size  s   !!## 	Bv"" Bd. B BC99T__UC%@%@AADD B BE B B B B B	B B B B B B B	B 	B 	B 	B 	B 	B 	B 	BB B B B B B B B B	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	B 	Bs5   B<A B#
B<#B'	'B<*B'	+B<<C C c                N    |                      |          }|r| | j         | S |S rO   )priorityra  )ru   r  r  s      r4   r  zChannel._q_for_pri  s8    mmC   	-,TX,s,,,r6   c                B    | j         }|t          ||          dz
           S )Nr   )rm  r   )ru   nstepss      r4   r  zChannel.priority  s$    #VE1%%)**r6   c                    |                      |d          }|                                 5 }|                    |                     ||          t	          |                     ddd           dS # 1 swxY w Y   dS )zDeliver message.Fr  N)r  r   r  r  r   )ru   r  r   r   r  rI   s         r4   _putzChannel._put  s    ((%(@@!!## 	FvLL44eGnnEEE	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	F 	Fs   8A11A58A5c                    |                                  5 }|                    |                     ||          t          |                     ddd           dS # 1 swxY w Y   dS )zDeliver fanout message.N)r   publishr  r   )ru   r   r   r   r   rI   s         r4   _put_fanoutzChannel._put_fanout  s    !!## 	vNN''+>>g  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   8AA!Ac                B    |r| j                             |           d S d S rO   )rt  r  )ru   r  auto_deleter   s       r4   
_new_queuezChannel._new_queue
  s1     	/#''.....	/ 	/r6   c           	     \   |                      |          j        dk    r ||                    dd          f| j        |<   |                                 5 }|                    | j        |fz  | j                            |pd|pd|pdg                     d d d            d S # 1 swxY w Y   d S )Nfanout#*r   )	typeofr$  replacer  r   saddkeyprefix_queuera  r  )ru   r   r   r  r  rI   s         r4   _queue_bindzChannel._queue_bind  s   ;;x  %11 +--c377*D& !!## 	6vKK,{:{'8b'.}"',{'4 5 56 6 6	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6 	6s   AB!!B%(B%c           	     $   | j                             |           |                     |                    d                    5 }|                    | j        |fz  | j                            |pd|pd|pdg                     |                                5 }| j	        D ]+}	|
                    |                     ||	                    },|                                 d d d            n# 1 swxY w Y   d d d            d S # 1 swxY w Y   d S )NrI   r   r   )rt  r  r   rH  sremr  ra  r  r   rm  deleter  r   )
ru   r  r   r   r  r{   r   rI   r   r  s
             r4   _deletezChannel._delete  s   ''...!!H)=)=!>> 	&KK,{:{'8b'.}"',{'4 5 56 6 6 "" d. D DC;;tuc'B'BCCDD              	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s8   ADAC-!D-C1	1D4C1	5DD	D	c           	     z   |                                  5 }|                                5 }| j        D ]+}|                    |                     ||                    },t          |                                          cd d d            cd d d            S # 1 swxY w Y   	 d d d            d S # 1 swxY w Y   d S rO   )r   r   rm  existsr  r  r   )ru   r  r   rI   r   r  s         r4   
_has_queuezChannel._has_queue&  sL   !!## 	+v"" +d. D DC;;tuc'B'BCCDD4<<>>**+ + + + + + +	+ 	+ 	+ 	+ 	+ 	+ 	+ 	++ + + + + + + + +	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+ 	+s5   B0AB>B0B	B0B	B00B47B4c                      j         |z  }                                 5 }|                    |          }|sg cd d d            S  fd|D             cd d d            S # 1 swxY w Y   d S )Nc                x    g | ]6}t          t          |                              j                            7S r@   )r  r   r  ra  )rs   valru   s     r4   rv   z%Channel.get_table.<locals>.<listcomp>5  s9    OOOE,s++11$(;;<<OOOr6   )r  r   smembers)ru   r   r   rI   r  s   `    r4   	get_tablezChannel.get_table-  s    "X-!!## 	Pv__S))F  	P 	P 	P 	P 	P 	P 	P 	P POOOOOO	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	P 	Ps   A A  A$'A$c                   |                                  5 }|                                5 }| j        D ]@}|                     ||          }|                    |                              |          }A|                                }t          |d d d                   cd d d            cd d d            S # 1 swxY w Y   	 d d d            d S # 1 swxY w Y   d S )Nrh   )r   r   rm  r  r  r  r   r  )ru   r  rI   r   r  priqr  s          r4   _purgezChannel._purge7  sh   !!## 	'v"" 'd. 8 8C??5#66D99T??11$77DD51:' ' ' ' ' ' '	' 	' 	' 	' 	' 	' 	' 	'' ' ' ' ' ' ' ' '	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	' 	's5   CA4B7C7B;	;C>B;	?CCCc                   d| _         | j        r&	 |                                  n# t          $ r Y nw xY w| j        s| j        j                            |            | j        	                    d          }|*| j
        D ]"}|| j        v r|                     ||           #|                                  |                                  t                                                       d S )NTrI   r   )_closingr/  rv  r   closedr   r}  r  rG  rH  r  rt  queue_deleter|  _close_clientsr   r  )ru   rI   r  r   s      r4   r  zChannel.close@  s   = 	  """"   { 	"O!))$/// ]&&x00F!!0 @ @E 777))%)???""$$$!!!s   & 
33c                    dD ]P}	 | j         |         }|j        d c}|_        |                                 4# t          t          | j        f$ r Y Mw xY wd S )N)rI   r5  )rG  r   r  r  r  r3   )ru   attrrI   r   s       r4   r  zChannel._close_clientsU  s}    ) 	 	Dt,060A4-
F-%%''''nd.@A   	 	s   07AAc                   t          |t          j                  sp|r|dk    rt          }n|                    d          r
|dd          }	 t          |          }n0# t          $ r# t          d                    |                    w xY w|S )Nr  r   z/Database is int between 0 and limit - 1, not {})rx  r  r  
DEFAULT_DB
startswithintr  format)ru   vhosts     r4   _prepare_virtual_hostzChannel._prepare_virtual_host_  s    %!122 	 "ESLL"!!#&& "abb	E

    ELL   
 s   A -Bc                    |S rO   r@   )ru   rg  rh  paramss       r4   _filter_tcp_connparamszChannel._filter_tcp_connparamsn  s    r6   c                   | j         j        }|j        pd|j        p| j         j        |j        |j        |j        | j        | j	        | j
        | j        | j        | j        | j        d}| j        }t!          |d          r[|g}t!          |d          r|t#          |j                  z  }|D ]}t'          |j        d          r n|                    d           |j        r6	 |                    |j                   | j        |d<   n# t2          $ r Y nw xY w|d         }d|v rt5          |          \  }}	}	}
}}}|d	k    rm | j        di |} |j        t8          j        d
|z   dfi | |                    dd            |                    dd            |                    dd            |
|d<   ||d<   |                    dd            |                    dd            |                     |                    dd                     |d<   | |                    d          p| j        }|r G fdd|          }|}||d<   |S )Nz	127.0.0.1)hostportvirtual_hostusernamepasswordrj  re  rf  rg  rh  rk  rl  r   	__bases__rk  connection_classr  z://r*   r  )r$  pathrf  rg  rh  r!  r"  r  r   dbc                  "     e Zd Z fdZ xZS )'Channel._connparams.<locals>.Connectionc                p     t                      j        |  j        r                    |            d S d S rO   )r   r  ro  r  )ru   r{   r   rQ   s     r4   r  z2Channel._connparams.<locals>.Connection.disconnect  sK    &EGG&-- * @99$?????@ @r6   )r<   r=   r>   r  r   )r   rQ   s   @r4   
Connectionr(    sH        @ @ @ @ @ @ @ @ @ @r6   r*  r@   ) r   rI   hostnamer  default_portr   useridr"  rj  re  rf  rg  rh  rk  rl  r$  r'   rw   r#  r   r   rx   sslupdateconnection_class_sslr  r   r  r&   UnixDomainSocketConnectionr  rH  )ru   asynchronousconninfo
connparams
conn_classclassesklassr  schemer)  r!  r"  r%  queryconnection_clsr*  rQ   s                   @r4   _connparamszChannel._connparamsr  s   ?)%4MAT_%A$1  )#3"1&*&A $ 5(,(E%)%? $ 5
 

 *
 :z** 
	8 "lGz;// 64
 4555  8 8#EN4KLL E 6777< 	!!(,///151J
-..   &!D==<Ft<L<L9FAq(HdE!!8T8FF:FF
!
!(-(H$J#( #( 2 2+02 2 2 7>>>1488894@@@%-Jz"%-Jz"NN64(((NN64(((55NN>4002 2
4 NN-.. "! 	
  	(@ @ @ @ @ @ @^ @ @ @ (N)7
%&s   !$D 
DDc                r    |r|                      | j                  S |                      | j                  S )N)r   )rr  r  r  )ru   r2  s     r4   _create_clientzChannel._create_client  s7     	@;;t;???{{49{555r6   c                    |                      |          }| j                            |d                   | _        t          j        di |S )Nr2  r&  r&  r@   )r;  ry  r  r&   ConnectionPoolru   r2  r  s      r4   	_get_poolzChannel._get_pool  sO    !!|!<< $ 5 < <t < M M#--f---r6   c                    t           j        dk     r't          d                    t                               | j        r t          j        t          | j                  S t           j        S )N)r   rh   r   zSRedis transport requires redis-py versions 3.2.0 or later. You have {0.__version__}r   )	r&   r   r   r  rp   	functoolspartialr   r   r   s    r4   rq  zChannel._get_client  sk    =9$$!++16%==: : :   	$#!%!6   
 {r6   c              #  F   K   |r|V  d S |                                  V  d S rO   r=  ru   rI   s     r4   r   zChannel.conn_or_acquire  s9       	(LLLLL%%'''''''r6   c                P    | j         |                                 | _         | j         S rO   )r  rC  r   s    r4   r  zChannel.pool  s#    :))DJzr6   c                T    | j         |                     d          | _         | j         S )NTr?  )r  rC  r   s    r4   r  zChannel.async_pool  s*    ##~~4~@@Dr6   c                .    |                      d          S )z+Client used to publish messages, BRPOP etc.Tr?  rH  r   s    r4   rI   zChannel.client  s     """555r6   c                V    |                      d          }|                                S )z1Pub/Sub connection used to consume fanout queues.Tr?  )r=  r   rI  s     r4   r5  zChannel.subclient  s(     $$$$77}}r6   c                D    | j                             | j                   d S rO   )rp  r/  r:  r   s    r4   r  zChannel._update_queue_cycle  s"      !344444r6   c                    ddl m} |j        S )Nr   r#   )r&   r$   r3   )ru   r$   s     r4   rs  zChannel._get_response_error  s    $$$$$$''r6   c                *      fd j         D             S )z<Set of queues being consumed from (excluding fanout queues).c                &    h | ]}|j         v|S r@   )r=  r  s     r4   	<setcomp>z(Channel.active_queues.<locals>.<setcomp>  s0     ; ; ;% 999 999r6   )_active_queuesr   s   `r4   r:  zChannel.active_queues   s0    ; ; ; ;4#6 ; ; ; 	;r6   r   )r   r  rO   )br<   r=   r>   r?   r   _client
_subclientr  supports_fanoutr  ry  ra  r/  r6  r  rb  r   r   r   r   rA  r   PRIORITY_STEPSrm  re  rf  rg  rh  rl  rj  DEFAULT_HEALTH_CHECK_INTERVALrk  rc  rd  rp   ri  r  r  r   r\  from_transport_optionsr&   r*  r$  SSLConnectionr0  r   rP   r|  r  r   r  r  r  r  r  r  r  r7  r  r  rw  r  r0  rv  rP  r  r  r  r  r  r  r  r  r   r  r  r  r  r  r  r  r;  r=  rC  rq  r   r   rZ  r  r  r   rI   r5  r  rs  r:  r   r   s   @r4   r\  r\  e  s       
CGJHO)O
CHJNMK'' #NN!#O9 M O
 4 )KE 	.		 0 ,1:u''d27A5..T&C &C &C &C &CP! ! !
$ 
$ 
$H H H ,1J J J J"F F F F F F 5 5 5    (4 4 4    (: : :
> > >	 	 	# # #
 
 
 	 	 	     2; ; ; ;! ! !,E E E  B B B  + + +F F F  / / / /
6 
6 
6
 
 
+ + +P P P' ' '    *     7;8<   O O O Ob6 6 6 6
. . . .
   ( ( ( ^(   X
     X 
 6 6 _6   _
5 5 5( ( ( ; ; X; ; ; ; ;r6   r\  c                       e Zd ZdZeZdZeZdZdZ	e
j        j                            d eg d                    Zer e            \  ZZ fdZd Zd	 Zd
 Z xZS )r)   zRedis Transport.Nr&   T)directr  r  )r2  exchange_typec                    t           t          d           t                      j        |i | t	                      | _        d S )Nz)Missing redis library (pip install redis))r&   ImportErrorr   r   r  r}  r   s      r4   r   zTransport.__init__  sF    =IJJJ$)&))) ())


r6   c                    t           j        S rO   )r&   __version__r   s    r4   driver_versionzTransport.driver_version!  s      r6   c                  	 | j                             j                   j        j        | j        	fd}|_        	fdj                                       	                    dj
                   |j        j                            dt                    }	                    |j                   d S )Nc                    | j         r                    | j                    j        r.	 j                                       d S # t          $ r Y d S w xY wd S rO   )r  r  rY  on_tickr  )r   r}  loopr>  s    r4   _on_disconnectz:Transport.register_with_event_loop.<locals>._on_disconnect+  s|     .J,--- y L''66666   DD	 s   A 
AAc                 D                   fdj         D              d S )Nc                *    g | ]} ||          S r@   r@   )rs   r  
add_readerrN  s     r4   rv   zMTransport.register_with_event_loop.<locals>.on_poll_start.<locals>.<listcomp>:  s'    AAAZZK,,AAAr6   )rY  )rj  r}  cycle_poll_startrN  s   r4   r>  z9Transport.register_with_event_loop.<locals>.on_poll_start8  s7    AAAAAuyAAAAAAr6   r   rk  )r}  rB  r
  r>  rj  rN  r  re  r  call_repeatedlyrD  rI   transport_optionsrH  rX  rJ  )
ru   r   rf  rg  rk  rj  r}  rk  r>  rN  s
     `  @@@@@r4   register_with_event_loopz"Transport.register_with_event_loop$  s   
4;''' ._
&
	 
	 
	 
	 
	 
	 
	 +9'	B 	B 	B 	B 	B 	B 	B 	B 	'''R!=>>> * 1 C G G#)!
 !
 	!.	
 	
 	
 	
 	
r6   c                :    | j                             |           dS )z1Handle AIO event for one of our file descriptors.N)r}  rN  )ru   r!  s     r4   rN  zTransport.on_readableF  s    
v&&&&&r6   )r<   r=   r>   r?   r\  polling_intervalDEFAULT_PORTr,  driver_typedriver_namer   r)   
implementsextend	frozensetr&   r5   r    r!   r   rb  rn  rN  r   r   s   @r4   r)   r)     s        GLKK"-44i = = =>> 5  J
  F,C,C,E,E)>* * * * *! ! ! 
  
  
D' ' ' ' ' ' 'r6   r)   c                      e Zd ZdZdS )SentinelManagedSSLConnectionzConnect to a Redis server using Sentinel + TLS.

        Use Sentinel to identify which Redis server is the current master
        to connect to and when connecting to the Master server, use an
        SSL Connection.
        Nr;   r@   r6   r4   rx  rx  L  s        	 	 	r6   rx  c                  X    e Zd ZdZej        dz   Zerej        ndZere	ndZ
ddZddZdS )SentinelChannela  Channel with explicit Redis Sentinel knowledge.

    Broker url is supposed to look like:

    .. code-block::

        sentinel://0.0.0.0:26379;sentinel://0.0.0.0:26380/...

    where each sentinel is separated by a `;`.

    Other arguments for the sentinel should come from the transport options
    (see `transport_options` of :class:`~kombu.connection.Connection`).

    You must provide at least one option in Transport options:
     * `master_name` - name of the redis group to poll

    Example:
    -------
    .. code-block:: python

        >>> import kombu
        >>> c = kombu.Connection(
             'sentinel://sentinel1:26379;sentinel://sentinel2:26379',
             transport_options={'master_name': 'mymaster'}
        )
        >>> c.connect()
    )master_namemin_other_sentinelssentinel_kwargsNFc           	        |                      |          }|                                }|                    dd            |                    dd            g }| j        j        j        D ]K}t          |          }|j        dk    r/|j        p| j        j	        }|
                    |j        |f           L|s#|
                    |d         |d         f           t          j        |ft          | dd          t          | dd           d|}t          | dd           }|t          d	          |                    |t"          j                  j        S )
Nr  r  r   r|  r   r}  )r|  r}  r{  z1'master_name' transport option must be specified.)r;  copyrx   r   rI   altr   r8  r  r,  r   r+  r   Sentinelr*  r  
master_forr&   r   r   )	ru   r2  r4  additional_params	sentinelsurlr  sentinel_instr{  s	            r4   _sentinel_managed_poolz&SentinelChannel._sentinel_managed_pool~  s~   %%l33
&OO--fd+++fd+++	?)- 	7 	7CS//CzZ''x?4?#?  #,!5666  	Gj0*V2DEFFF )! '.CQ G G#D*;TBB! !  	! ! dM488C   ''K
 
 	r6   c                    |                      |          }| j                            |d                   | _        |                     |          S )Nr?  r&  r@  )r;  ry  r  r  rB  s      r4   rC  zSentinelChannel._get_pool  sL    !!|!<< $ 5 < <t < M M**<888r6   r   )r<   r=   r>   r?   r\  rY  r   SentinelManagedConnectionr$  rx  r0  r  rC  r@   r6   r4   rz  rz  Y  s         8 %; ? 
 >FOx994;CM77# # # #J9 9 9 9 9 9r6   rz  c                      e Zd ZdZdZeZdS )SentinelTransportzRedis Sentinel Transport.ig  N)r<   r=   r>   r?   r,  rz  r\  r@   r6   r4   r  r    s        ##LGGGr6   r  )Mr?   
__future__r   rE  r  r*   r   collectionsr   
contextlibr   r  r   r   viner	   kombu.exceptionsr
   r   	kombu.logr   kombu.utils.compatr   kombu.utils.encodingr   kombu.utils.eventior   r   r   kombu.utils.functionalr   kombu.utils.jsonr   r   kombu.utils.objectsr   kombu.utils.schedulingr   kombu.utils.urlr   r   r   r&   r_  r   loggercriticalr  r  rq  r  rX  rW  r   r5   r8   r{  r:   rM   rR   rT   r   r   rI   r   r   PubSubr   r   r  r\  r)   r  rZ  rx  rz  r  r@   r6   r4   <module>r     s  3 3j # " " " " "             " " " " " " % % % % % %                   @ @ @ @ @ @ @ @             2 2 2 2 2 2 - - - - - - / / / / / / / / / / 3 3 3 3 3 3 ) ) ) ) ) ) ) ) / / / / / / 0 0 0 0 0 0 & & & & & &      LLLL   EEE   HHH 
+	,	,g
 " *. 1  (  4& & &4 4 4 4 4	 4 4 4   ,  P
 P
 P
 P
 P
 P
 P
 P
f
 
 
 
 
. 
 
 

> 
> 
> 
> 
>0%,2G 
> 
> 
>1K 1K 1K 1K 1K%,- 1K 1K 1Khh/ h/ h/ h/ h/'+ h/ h/ h/V\  \  \  \  \  \  \  \ ~_
; _
; _
; _
; _
;go _
; _
; _
;DA' A' A' A' A'! A' A' A'H  
 
 
 
 
.
 
 
M9 M9 M9 M9 M9g M9 M9 M9`    	     s$   B	 	BBB B('B(