
     h                        d 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Z.Z-dZ/dZ0dZ1g dZ2 edd          Z3d Z4d Z5 G d de6          Z7ed              Z8d! Z9 G d" d#          Z: G d$ d%e:e(j;                  Z< G d& d'e:e(j=        j>                  Z? G d( d)e(j=        j@                  ZA G d* d+e'jB                  ZB G d, d-          ZC G d. d/e'jD                  ZD G d0 d1e'jE                  ZEe*r G d2 d3e*jF        e(jG                  ZH G d4 d5eD          ZI G d6 d7eE          ZJdS )8a  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``
    N)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            
      ,   ddl m}  t          | d          r| j        }n| j        }t          t          j        j        t          t          j        t          t          | 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AuthenticationErrorTimeoutErrorr    InvalidResponseResponseError)r#   r'   s     Q/var/www/html/Sam_Eipo/venv/lib/python3.11/site-packages/kombu/transport/redis.pyget_redis_error_classesr3   w   s           z=)) )*		(				,L&*#0% 
% 
		)&$-& 
&      c                      ddl m}  | j        S )z1Return the redis ConnectionError exception class.r   r"   )r%   r#   r-   r"   s    r2   get_redis_ConnectionErrorr6      s          %%r4   c                       e Zd ZdZdS )	MutexHeldz)Raised when another party holds the lock.N__name__
__module____qualname____doc__ r4   r2   r8   r8      s        3333r4   r8   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acquirer8   releaser%   r#   LockNotOwnedError)clientnameexpirerC   lock_acquireds        r2   MutexrK      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    r2   _after_fork_cleanup_channelrP      s    r4   c                   `     e Zd ZdZg dZ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HSETLLENLPUSHPUBLISHRPUSHRPOPSADDSREMSETSMEMBERSZADDZREMZREVRANGEBYSCOREr   N)
args_startargs_end   r   )DELBRPOPEVALSHAc                     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   rb   rc   c                 >    g | ]}j         t          |          z   S r>   global_keyprefixstr.0argselfs     r2   
<listcomp>z5GlobalKeyPrefixMixin._prefix_args.<locals>.<listcomp>   s7        %C0  r4   )listpopPREFIXED_SIMPLE_COMMANDSrl   rm   PREFIXED_COMPLEX_COMMANDS)rq   argscommandrb   rc   pre_args	post_argss   `      r2   _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
 $r4   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.
        rg   N)superparse_responselenrl   )rq   
connectioncommand_nameoptionsretkeyvalue	__class__s          r2   r~   z#GlobalKeyPrefixMixin.parse_response   sh     %egg$ZIIII7""s"JCc$/00112C:
r4   c                 \     t                      j        |                     |          i |S rM   r}   execute_commandr{   rq   rw   kwargsr   s      r2   r   z$GlobalKeyPrefixMixin.execute_command   -    &uww&(9(9$(?(?J6JJJr4   Tc                 H    t          | j        | j        ||| j                  S )Nrl   )PrefixedRedisPipelineconnection_poolresponse_callbacksrl   )rq   transaction
shard_hints      r2   pipelinezGlobalKeyPrefixMixin.pipeline   s1    $ #!2
 
 
 	
r4   )TN)r:   r;   r<   r=   ru   rv   r{   r~   r   r   __classcell__r   s   @r2   rR   rR      s              &  T22 !r22"#33! !     .    K K K K K
 
 
 
 
 
 
 
r4   rR   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 Nrl    )rt   rl   r%   Redis__init__rq   rw   r   s      r2   r   zPrefixedStrictRedis.__init__	  sB     &

+=r B BT3D333F33333r4   c                 4    t          | j        fd| j        i|S )Nrl   )PrefixedRedisPubSubr   rl   )rq   r   s     r2   pubsubzPrefixedStrictRedis.pubsub  s4    " 
 
!2
 
 
 	
r4   N)r:   r;   r<   r=   r   r   r>   r4   r2   r   r     s8        JJ4 4 4
 
 
 
 
r4   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   )rt   rl   r%   rG   Pipeliner   r   s      r2   r   zPrefixedRedisPipeline.__init__  sE     &

+=r B B&t=d===f=====r4   N)r:   r;   r<   r=   r   r>   r4   r2   r   r     s-         > > > > >r4   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   )rt   rl   r}   r   r   s      r2   r   zPrefixedRedisPubSub.__init__,  s<     &

+=r B B$)&)))))r4   c                      t          |          }|                    d          }| j        v r fd|D             }|g|S )Nr   c                 >    g | ]}j         t          |          z   S r>   rk   rn   s     r2   rr   z4PrefixedRedisPubSub._prefix_args.<locals>.<listcomp>5  s7        %C0  r4   )rs   rt   PUBSUB_COMMANDS)rq   rw   rx   s   `  r2   r{   z PrefixedRedisPubSub._prefix_args0  sc    Dzz((1++d***     D
 $r4   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 rM   )r   rl   )ro   rO   rq   s     r2   rr   z6PrefixedRedisPubSub.parse_response.<locals>.<listcomp>N  s/    KKKwgc$/00112KKKr4   )r}   r~   )rq   rw   r   r   message_typechannelsmessager   s   `      r2   r~   z"PrefixedRedisPubSub.parse_response<  sl     %egg$d5f55;J ,/(x
KKKK(KKK
 
 	
r4   c                 \     t                      j        |                     |          i |S rM   r   r   s      r2   r   z#PrefixedRedisPubSub.execute_commandR  r   r4   )
r:   r;   r<   r=   r   r   r{   r~   r   r   r   s   @r2   r   r   "  s        MMO* * * * *
  
  
 
 
 
 
 
,K K K K K K K K Kr4   r   c                        e Zd ZdZdZ fdZ fdZddZ fdZd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      r2   r   zQoS.__init__[  s-    $)&))) r4   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)	rq   r   delivery_tagdeliveryEXRK	zadd_argspiper   s	           r2   r   z
QoS.append_  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rG   )rO   conn_or_acquire
_deliveredrestore_by_tagclear)rq   rG   tags      r2   restore_unackedzQoS.restore_unackedp  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 rM   )_remove_from_indicesr   r}   ack)rq   r   r   s     r2   r   zQoS.ackv  s?    !!,//77999L!!!!!r4   Fc                 b    |r|                      |d           |                     |           d S NT)leftmost)r   r   )rq   r   requeues      r2   rejectz
QoS.rejectz  s;     	=t<<<r4   c              #      K   |r|V  d S | j                             |          5 }|                                V  d d d            d S # 1 swxY w Y   d S rM   )rO   r   r   )rq   r   rG   s      r2   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 rM   )r   zremr   hdelr   )rq   r   r   s      r2   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   rO   r   r   visibility_timeoutrK   unacked_mutex_keyunacked_mutex_expirezrevrangebyscorer   r   r8   )	rq   r   r   intervalrG   ceilvisibler   scores	            r2   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 rM   )hgetr   multir   r   r   rO   _do_restore_message)r   pMr   r   r   rq   r   s        r2   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r4   )rO   r   r   r   )rq   r   rG   r   r   s   `` ` r2   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 rM   )rO   r   rq   s    r2   r   zQoS.unacked_key  s    |''r4   c                     | j         j        S rM   )rO   r   r   s    r2   r   zQoS.unacked_index_key      |--r4   c                     | j         j        S rM   )rO   r   r   s    r2   r   zQoS.unacked_mutex_key  r   r4   c                     | j         j        S rM   )rO   r   r   s    r2   r   zQoS.unacked_mutex_expire  s    |00r4   c                     | j         j        S rM   )rO   r   r   s    r2   r   zQoS.visibility_timeout  s    |..r4   rM   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   @r2   r   r   V  s       ! ! ! ! !2 2 2 2 2"       " " " " "   
 ( ( ( ^(= = = =
   "F F F F ( ( _( . . _. . . _. 1 1 _1 / / _/ / / / /r4   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 rM   )set	_channels_fd_to_chan_chan_to_sockr   poller
after_readr   s    r2   r   zMultiChannelPoller.__init__  s7    ff%%r4   c                 8   | j                                         D ]4}	 | j                            |           # t          t
          f$ r Y 1w xY w| j                                         | j                                         | j                                          d S rM   )	r  valuesr  
unregisterKeyError
ValueErrorr  r   r  )rq   fds     r2   closezMultiChannelPoller.close  s    $++-- 	 	B&&r****j)        """""s   8AAc                 :    | j                             |           d S rM   )r  addrq   rO   s     r2   r  zMultiChannelPoller.add  s    7#####r4   c                 :    | j                             |           d S rM   )r  discardr  s     r2   r  zMultiChannelPoller.discard  s    w'''''r4   c                 v    	 | j                             |j                   d S # t          t          f$ r Y d S w xY wrM   )r  r
  _sockAttributeError	TypeErrorrq   r   s     r2   _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 rM   )
r  _unregisterr   r  connectr  filenor  register
eventflags)rq   rO   rG   typesocks        r2   	_registerzMultiChannelPoller._register  s    VT"d&888Wfd333"*%%''' &+2D/'6:GVT23T4?33333r4   c                 V    | j                             | j        |||f                    d S rM   )r  r
  r  )rq   rO   rG   r   s       r2   r  zMultiChannelPoller._unregister  s-    t17FD2IJKKKKKr4   c                     t          |dd           |j                            d          |_        |j        j        d uo|||f| j        v S )Nr   _)getattrr   get_connectionr   r  r  )rq   rO   rG   cmds       r2   _client_registeredz%MultiChannelPoller._client_registered  sW    6<..6 & 6 E Ec J JF!'t3 =&#&$*<<	>r4   c                     ||j         df}|                     ||j         d          sd|_         | j        |  |j        s|                                 dS dS )zEnable BRPOP mode for channel.rg   FN)rG   r)  _in_pollr"  _brpop_start)rq   rO   idents      r2   _register_BRPOPz"MultiChannelPoller._register_BRPOP  sp    0&&wHH 	#$GDNE"" 	#  """""	# 	#r4   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     r2   _register_LISTENz#MultiChannelPoller._register_LISTEN  sn    &&w0A8LL 	A!&GNN7G$5x@@@! 	!     	! 	!r4   c                     | j         D ]S}|j        r.|j                                        r|                     |           |j        r|                     |           Td S rM   )r  active_queuesqoscan_consumer.  active_fanout_queuesr4  r  s     r2   on_poll_startz MultiChannelPoller.on_poll_start  sr    ~ 	/ 	/G$ 2;**,, 2((111+ /%%g...	/ 	/r4   c                 j    || _         | j        D ]#}|j                            |j                  c S d S N)r   )r  r  r7  r   unacked_restore_limit)rq   r  rO   s      r2   on_poll_initzMultiChannelPoller.on_poll_init  sS    ~ 	 	G;..1 /     	 	r4   c                 l    | j         D ]+}|j        r"|j                            |j                  c S ,d S r<  )r  r6  r7  r   r=  r  s     r2   maybe_restore_messagesz)MultiChannelPoller.maybe_restore_messages  s\    ~ 	 	G$ {225 3     	 	r4   c                     | j         D ]P}|j                            d          }|2t          t	          |dd                     r|                                 Qd S )Nr1  check_health)r  __dict__getcallabler&  rB  )rq   rO   rG   s      r2   maybe_check_subclient_healthz/MultiChannelPoller.maybe_check_subclient_health'  sh    ~ 	& 	&G%))+66F! !F!FGG "##%%%	& 	&r4   c                     | j         |         \  }}|j                                        r |j        |                      d S d S rM   )r  r7  r8  handlers)rq   r  chanr   s       r2   on_readablezMultiChannelPoller.on_readable/  sN    %f-
d8!! 	"DM$!!!!!	" 	"r4   c                     |t           z  r|                     |          | fS |t          z  r'| j        |         \  }}|                    |           d S d S rM   )r   rJ  r   r  _poll_error)rq   r  eventrI  r   s        r2   handle_eventzMultiChannelPoller.handle_event4  sh    4< 	###F++T11S[ 	#)&1JD$T"""""	# 	#r4   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  r6  r7  r8  r.  r9  r4  r  r   rN  r  rt   r  r@  r   )	rq   callbackrA   rO   eventsr  rM  r   funs	            r2   rD  zMultiChannelPoller.get;  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 rM   )r  r   s    r2   fdszMultiChannelPoller.fdsY  s    r4   rM   )r:   r;   r<   r=   r   r   r  rP  r  r   r  r  r  r  r"  r  r)  r.  r4  r:  r>  r@  rF  rJ  rN  rD  propertyrU  r>   r4   r2   r   r     sT       //J  J
  
  
 # # #$ $ $( ( (  4 4 4L L L> > ># # #! ! !/ / /    & & &" " "
# # #   <     X     r4   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   r=  fanout_prefixfanout_patternsrl   socket_timeoutsocket_connect_timeoutsocket_keepalivesocket_keepalive_optionsqueue_order_strategymax_connectionshealth_check_intervalretry_on_timeoutpriority_stepsc                     t                      j        |i | | j        st          j        | _         t          | j                              | _        |                                 | _	        | 
                                | _        t                      | _        t                      | _        i | _        | j        | j        d| _        | j        r't)          | j        t*                    r| j        | _        nd| _        	 | j                                         n## t2          $ r |                                   w xY w| j        j                            |            | j        j        | _        t>          t?          | t@                     d S d S )N)rg   r0  r   )!r}   r   r^  r   r   r   re  _queue_cycle_get_clientClient_get_response_errorr1   r  r9  auto_delete_queues_fanout_to_queue_brpop_read_receiverH  r_  
isinstancerm   keyprefix_fanoutrG   ping	Exception_disconnect_poolsr   cycler  r   r   rP   r   s      r2   r   zChannel.__init__  sz   $)&)))! 	#{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  D7c                 .    |                                   d S rM   )rw  r   s    r2   rN   zChannel._after_fork  s         r4   c                     | j         }| j        }d x| _        | _         ||                                 ||                                 d S d S rM   )_pool_async_pool
disconnect)rq   pool
async_pools      r2   rw  zChannel._disconnect_pools  s\    z%
(,,4:OO!!!##### "!r4   c                     | j         |u rd | _         | j        |u rd | _        | j        r-| j        j        r#| j        j                            |           d S d S d S rM   )r+  r2  r   rx  r  r  s     r2   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r4   c                 *   	 	 d|d         d<   d|d         d         d<   n# t           $ r Y nw xY w|                     ||          D ])} |r|j        n|j        |t	          |                     *d S # t
          $ r t          d|d           Y d S w xY w)NTheadersredelivered
propertiesr   zCould not restore message: %rexc_info)r  _lookuplpushrpushr   rv  crit)rq   payloadr   r   r   r   queues          r2   r   zChannel._do_restore_message  s    	J48	"=1HL%o6}EE   h<<  7x7TZ5>>      	J 	J 	J0'DIIIIIII	Js(     A2 
-A2 -AA2 2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 rM   )r   r   r   r   r   r   r   )r   Pr   r   r   r   rq   r   s        r2   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r4   )r^  r}   _restorer   r   r   r   )rq   r   r   r   rG   r   r   s   ` `  @r2   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  )rq   r   s     r2   _restore_at_beginningzChannel._restore_at_beginning$  s    }}Wt}444r4   c                     || j         v r4| j         |         \  }}| j                            |           || j        |<    t	                      j        |g|R i |}|                                  |S rM   )_fanout_queuesr9  r  rp  r}   basic_consume_update_queue_cycle)rq   r  rw   r   r   r%  r   r   s          r2   r  zChannel.basic_consume'  s    D'''-e4KHa%))%000.3D!(+#egg#E;D;;;F;; 	  """
r4   c                     | j         }|rT|j        j        r3|j        j                            t          | j        |f                    S |                     |          S d S rM   )r   rx  rP  r  r  r   _basic_cancel)rq   consumer_tagr   s      r2   basic_cancelzChannel.basic_cancel;  sq    
 _
 	42 !'266D.@@   %%l333	4 	4r4   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 rM   )_tag_to_queuer  r9  remove_unsubscribe_fromr  rp  rt   r}   r  r  )rq   r  r  r   r%  r   r   s         r2   r  zChannel._basic_cancelH  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   /)r`  joinrt  )rq   r   r   s      r2   _get_publish_topiczChannel._get_publish_topic\  sN     	P4/ 	P77D18S+NOOOww-x8999r4   c                 N    | j         |         \  }}|                     ||          S rM   )r  r  )rq   r  r   r   s       r2   _get_subscribe_topiczChannel._get_subscribe_topica  s*     $ 3E :+&&x===r4   c                       fd j         D             }|sd S  j        }|j        j        |j                                         |j         _        |                    |           d S )Nc                 :    g | ]}                     |          S r>   )r  ro   r  rq   s     r2   rr   z&Channel._subscribe.<locals>.<listcomp>f  s7     8 8 8 ))%00 8 8 8r4   )r9  r1  r   r  r  r2  
psubscribe)rq   keyscs   `  r2   r3  zChannel._subscribee  s    8 8 8 8!68 8 8 	FN<%L  """,	Tr4   c                     |                      |          }| j        }|j        r$|j        j        r|                    |g           d S d S d S rM   )r  r1  r   r  unsubscribe)rq   r  topicr  s       r2   r  zChannel._unsubscribe_fromp  s`    ))%00N< 	#AL. 	#MM5'"""""	# 	# 	# 	#r4   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  re   Fpmessager   r   )r   patternrO   data)r   
subscribed)rq   rG   rr   r  rO   r  s          r2   _handle_messagezChannel._handle_messagev  s    !..1Q4199 %FF!+++,Q41qtQqT+A(D'7DD+,Q4qtQqT+A(D'7D	
 
 	
r4   c                 ~   | j         }g }	 |                    |                     |                     n# t          $ r Y nw xY w|j        e|j                            d          rJ|                    |                     |                     |j        |j                            d          Jt          |          S )Nr   r@   )r1  r   _receive_oner   r   can_readany)rq   r  r   s      r2   rr  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   rO   r  r   r  .z&Cannot process event on channel %r: %si   r   r  T)r~   r   r2  rs  rs   tupler  r   endswith	partitionr   r  r  warnreprr   splitr   _deliverrp  )rq   r  responser  rO   r%  r   r   s           r2   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 & & &E$d7mmETE&:QH H H H#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>   )
_q_for_pri)ro   prir  queuesrq   s      r2   rr   z(Channel._brpop_start.<locals>.<listcomp>  sK     % % %#% % s++ % % % %r4   r   rg   )rk  consumer   r6  ri  rG   r   r+  rl   r{   send_command)rq   rA   r  command_argsr  s   `   @r2   r,  zChannel._brpop_start  s    "**3t/A+B+BCC 	F% % % % %t7J % % %(/1~6.'$'  	B;33LAAL++\::::r4   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)Nrg   r   r   T)rG   r~   r   r   r}  r   rsplitr]  rk  rotater  r   r+  r   )rq   r   
dest__itemdestitems        r2   rq  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 )Nr0  )r1  r~   rG   r   )rq   r   r   s      r2   rL  zChannel._poll_error  sJ    8N))+++++K&&t{'=tDDDDDr4   c                     |                                  5 }| j        D ]W}|                    |                     ||                    }|r*t	          t          |                    c cd d d            S Xt                      # 1 swxY w Y   d S rM   )r   ri  rpopr  r   r   r   )rq   r  rG   r  r  s        r2   _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 rM   )rs  numbersIntegral)ro   sizes     r2   	<genexpr>z Channel._size.<locals>.<genexpr>  sP       B BD(w/?@@B4 B B B B B Br4   )r   r   ri  llenr  r   sum)rq   r  rG   r   r  sizess         r2   _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 rM   )priorityr]  )rq   r  r  s      r2   r  zChannel._q_for_pri  s8    mmC   	-,TX,s,,,r4   c                 B    | j         }|t          ||          dz
           S )Nr   )ri  r   )rq   nstepss      r2   r  zChannel.priority  s$    #VE1%%)**r4   c                     |                      |d          }|                                 5 }|                    |                     ||          t	          |                     ddd           dS # 1 swxY w Y   dS )zDeliver message.F)reverseN)_get_message_priorityr   r  r  r   )rq   r  r   r   r  rG   s         r2   _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   )rq   r   r   r   r   rG   s         r2   _put_fanoutzChannel._put_fanout  s    !!## 	vNN''+>>g  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   8AA!Ac                 B    |r| j                             |           d S d S rM   )ro  r  )rq   r  auto_deleter   s       r2   
_new_queuezChannel._new_queue  s1     	/#''.....	/ 	/r4   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_queuer]  r  )rq   r   r   r  r  rG   s         r2   _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 )NrG   r   r   )ro  r  r   rD  sremr  r]  r  r   ri  deleter  r   )
rq   r  r   r   r  rw   r   rG   r   r  s
             r2   _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 rM   )r   r   ri  existsr  r  r   )rq   r  r   rG   r   r  s         r2   
_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  r]  )ro   valrq   s     r2   rr   z%Channel.get_table.<locals>.<listcomp>)  s9    OOOE,s++11$(;;<<OOOr4   )r  r   smembers)rq   r   r   rG   r	  s   `    r2   	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 )Nre   )r   r   ri  r  r  r  r   r  )rq   r  rG   r   r  priqr  s          r2   _purgezChannel._purge+  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        s| j        j                            |            | j                            d          }|*| j        D ]"}|| j        v r| 	                    ||           #| 
                                 |                                  t                                                       d S )NTrG   r   )_closingclosedr   rx  r  rC  rD  r  ro  queue_deleterw  _close_clientsr}   r  )rq   rG   r  r   s      r2   r  zChannel.close4  s    { 	"O!))$/// ]&&x00F!!0 @ @E 777))%)???""$$$!!!r4   c                     dD ]P}	 | j         |         }|j        d c}|_        |                                 4# t          t          | j        f$ r Y Mw xY wd S )N)rG   r1  )rC  r   r}  r  r  r1   )rq   attrrG   r   s       r2   r
  zChannel._close_clientsD  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 {})rs  r  r  
DEFAULT_DB
startswithintr  format)rq   vhosts     r2   _prepare_virtual_hostzChannel._prepare_virtual_hostN  s    %!122 	 "ESLL"!!#&& "abb	E

    ELL   
 s   A -Bc                     |S rM   r>   )rq   rc  rd  paramss       r2   _filter_tcp_connparamszChannel._filter_tcp_connparams]  s    r4   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*t#          |j        d          s|                    d           |j        r6	 |                    |j                   | j        |d<   n# t.          $ r Y nw xY w|d         }d|v rt1          |          \  }}}}}	}
}|dk    rm | j        di |} |j        t4          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passwordrf  ra  rb  rc  rd  rg  rh  r   rg  connection_classr  z://r)   r  )r  pathrb  rc  rd  r  r  r  r  dbc                   "     e Zd Z fdZ xZS )'Channel._connparams.<locals>.Connectionc                 r    t                                                                           |            d S rM   )r}   r}  r  )rq   r   rO   s    r2   r}  z2Channel._connparams.<locals>.Connection.disconnect  s3    GG&&(((55d;;;;;r4   )r:   r;   r<   r}  r   )r   rO   s   @r2   
Connectionr!    s>        < < < < < < < < < <r4   r#  r>   )r   rG   hostnamer  default_portr  useridr  rf  ra  rb  rc  rd  rg  rh  r  r&   r   r   rt   sslupdateconnection_class_sslr  r   r  r%   UnixDomainSocketConnectionr  rD  )rq   asynchronousconninfo
connparams
conn_classr  schemer%  r  r  r  queryconnection_clsr#  rO   s                 @r2   _connparamszChannel._connparamsa  s   ?)%4MAT_%A$1  )#3"1&*&A $ 5(,(E%)%? $ 5
 

 *

 J
++	4 !46MNN	4 NN2333< 	!!(,///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   0$C 
C"!C"c                 r    |r|                      | j                  S |                      | j                  S )N)r   )rm  r  r~  rq   r+  s     r2   _create_clientzChannel._create_client  s7     	@;;t;???{{49{555r4   c                     |                      |          }| j                            |d                   | _        t          j        di |S )Nr+  r  )r  r>   )r2  rt  r  r%   ConnectionPool)rq   r+  r  s      r2   	_get_poolzChannel._get_pool  sO    !!|!<< $ 5 < <t < M M#--f---r4   c                     t           j        dk     r't          d                    t                               | j        r t          j        t          | j                  S t           j        S )N)r   re   r   zSRedis transport requires redis-py versions 3.2.0 or later. You have {0.__version__}r   )	r%   r   r
   r  rl   	functoolspartialr   StrictRedisr   s    r2   rl  zChannel._get_client  sl    =9$$!++16%==: : :   	$#!%!6   
   r4   c              #   F   K   |r|V  d S |                                  V  d S rM   r5  rq   rG   s     r2   r   zChannel.conn_or_acquire  s9       	(LLLLL%%'''''''r4   c                 P    | j         |                                 | _         | j         S rM   )r{  r9  r   s    r2   r~  zChannel.pool  s#    :))DJzr4   c                 T    | j         |                     d          | _         | j         S )NTr7  )r|  r9  r   s    r2   r  zChannel.async_pool  s*    ##~~4~@@Dr4   c                 .    |                      d          S )z+Client used to publish messages, BRPOP etc.Tr7  r?  r   s    r2   rG   zChannel.client  s     """555r4   c                 V    |                      d          }|                                S )z1Pub/Sub connection used to consume fanout queues.Tr7  )r5  r   r@  s     r2   r1  zChannel.subclient  s(     $$$$77}}r4   c                 D    | j                             | j                   d S rM   )rk  r(  r6  r   s    r2   r  zChannel._update_queue_cycle  s"      !344444r4   c                     ddl m} |j        S )Nr   r"   )r%   r#   r1   )rq   r#   s     r2   rn  zChannel._get_response_error  s    $$$$$$''r4   c                 *      fd j         D             S )z<Set of queues being consumed from (excluding fanout queues).c                 &    h | ]}|j         v|S r>   )r9  r  s     r2   	<setcomp>z(Channel.active_queues.<locals>.<setcomp>  s0     ; ; ;% 999 999r4   )_active_queuesr   s   `r2   r6  zChannel.active_queues  s0    ; ; ; ;4#6 ; ; ; 	;r4   r   )r   r   rM   )br:   r;   r<   r=   r   _client
_subclientr  supports_fanoutr  rt  r]  r+  r2  r  r^  r   r   r   r   r=  r   PRIORITY_STEPSri  ra  rb  rc  rd  rh  rf  DEFAULT_HEALTH_CHECK_INTERVALrg  r_  r`  rl   re  r|  r{  r   rX  from_transport_optionsr%   r#  r  SSLConnectionr)  r   rN   rw  r  r   r  r  r  r  r  r  r  r3  r  r  rr  r  r,  rq  rL  r  r  r  r  r  r  r  r  r  r  r  r  r  r
  r  r  r2  r5  r9  rl  r   r   rV  r~  r  r   rG   r1  r  rn  r6  r   r   s   @r2   rX  rX  ^  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J! ! !
$ 
$ 
$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<   F F F FP6 6 6 6
. . . .
! ! ! ( ( ( ^(   X
     X 
 6 6 _6   _
5 5 5( ( ( ; ; X; ; ; ; ;r4   rX  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  )r+  exchange_typec                     t           t          d           t                      j        |i | t	                      | _        d S )Nz)Missing redis library (pip install redis))r%   ImportErrorr}   r   r   rx  r   s      r2   r   zTransport.__init__  sF    =IJJJ$)&))) ())


r4   c                     t           j        S rM   )r%   __version__r   s    r2   driver_versionzTransport.driver_version  s      r4   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 rM   )r  r  rU  on_tickr  )r   rx  loopr:  s    r2   _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>   )ro   r  
add_readerrJ  s     r2   rr   zMTransport.register_with_event_loop.<locals>.on_poll_start.<locals>.<listcomp>   s'    AAAZZK,,AAAr4   )rU  )ra  rx  cycle_poll_startrJ  s   r2   r:  z9Transport.register_with_event_loop.<locals>.on_poll_start  s7    AAAAAuyAAAAAAr4   r   rg  )rx  r>  r  r:  ra  rJ  r  r\  r  call_repeatedlyr@  rG   transport_optionsrD  rO  rF  )
rq   r   r]  r^  rg  ra  rx  rb  r:  rJ  s
     `  @@@@@r2   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#)!
 !
 	!.	
 	
 	
 	
 	
r4   c                 :    | j                             |           dS )z1Handle AIO event for one of our file descriptors.N)rx  rJ  )rq   r  s     r2   rJ  zTransport.on_readable,  s    
v&&&&&r4   )r:   r;   r<   r=   rX  polling_intervalDEFAULT_PORTr%  driver_typedriver_namer   r(   
implementsextend	frozensetr%   r3   r   r    r   rY  re  rJ  r   r   s   @r2   r(   r(     s        GLKK"-44i = = =>> 5  J
  F,C,C,E,E)>* * * * *! ! ! 
  
  
D' ' ' ' ' ' 'r4   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.
        Nr9   r>   r4   r2   ro  ro  2  s        	 	 	r4   ro  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	          |                    || j                  j        S )
Nr  r  r   rs  r   rt  )rs  rt  rr  z1'master_name' transport option must be specified.)r2  copyrt   r   rG   altr   r/  r  r%  r   r$  r   Sentinelr&  r  
master_forrm  r   )	rq   r+  r-  additional_params	sentinelsurlr  sentinel_instrr  s	            r2   _sentinel_managed_poolz&SentinelChannel._sentinel_managed_poold  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
 
 	r4   c                 ,    |                      |          S rM   )r~  r4  s     r2   r9  zSentinelChannel._get_pool  s    **<888r4   r   )r:   r;   r<   r=   rX  rP  r   SentinelManagedConnectionr  ro  r)  r~  r9  r>   r4   r2   rq  rq  ?  s         8 %; ? 
 >FOx994;CM77# # # #J9 9 9 9 9 9r4   rq  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%  rq  rX  r>   r4   r2   r  r    s        ##LGGGr4   r  )Kr=   r;  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%   rV  r   loggercriticalr  r  rh  r  rO  rN  r   r3   r6   rv  r8   rK   rP   rR   r   r   rG   r   r   PubSubr   r   r   rX  r(   r  rQ  ro  rq  r  r>   r4   r2   <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 
+	,	,_fk
d
 " *. 1  (  2& & &4 4 4 4 4	 4 4 4   ,  N
 N
 N
 N
 N
 N
 N
 N
b
 
 
 
 
. 
 
 

> 
> 
> 
> 
>0%,2G 
> 
> 
>1K 1K 1K 1K 1K%,- 1K 1K 1Khf/ f/ f/ f/ f/'+ f/ f/ f/R\  \  \  \  \  \  \  \ ~L
; L
; L
; L
; L
;go L
; L
; L
;^A' A' A' A' A'! A' A' A'H  
 
 
 
 
.
 
 
K9 K9 K9 K9 K9g K9 K9 K9\    	     s$   >B BBB B"!B"