
    h                       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 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. e ed                     ed          k    Z/n# e0$ r dZ.dZ/Y nw xY w	 ddl.m1Z1 n# e0$ r dZ1Y nw xY w ed          Z2e2j3        e2j4        cZ5Z4dZ6dZ7dZ8g dZ9 edd           Z:d! Z;d" Z< G d# d$e=          Z>e
d%             Z?d& Z@ G d' d(          ZA G d) d*eAe.jB                  ZC G d+ d,eAe.jD        jE                  ZF G d- d.e.jD        jG                  ZH G d/ d0e-jI                  ZI G d1 d2          ZJ G d3 d4e-jK                  ZK G d5 d6e-jL                  ZLe1r G d7 d8e1jM        e.jN                  ZO G d9 d:eK          ZP G d; d<eL          ZQdS )=a  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)version)Empty)time)Version)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redisz5.3.0)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)r   r'   hasattrr(   	DataErrorr"   r   	Transportr#   r   socketerrorIOErrorOSErrorConnectionErrorBusyLoadingErrorAuthenticationErrorTimeoutErrorr$   InvalidResponseResponseError)r'   r*   s     U/var/www/html/auto_sub_bot/venv/lib/python3.11/site-packages/kombu/transport/redis.pyget_redis_error_classesr7   }   s           z=)) )*		(				,L&'*#0% 
% 
		)&$-& 
&      c                     ddl m}  | j        S )z1Return the redis ConnectionError exception class.r   r&   )r   r'   r0   r&   s    r6   get_redis_ConnectionErrorr:      s          %%r8   c                      e Zd ZdZdS )	MutexHeldz)Raised when another party holds the lock.N__name__
__module____qualname____doc__ r8   r6   r<   r<      s        3333r8   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expirerG   lock_acquireds        r6   MutexrO      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    r6   _after_fork_cleanup_channelrT      s    r8   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   rg   rh   c                >    g | ]}j         t          |          z   S rB   global_keyprefixstr.0argselfs     r6   
<listcomp>z5GlobalKeyPrefixMixin._prefix_args.<locals>.<listcomp>   s7        %C0  r8   )listpopPREFIXED_SIMPLE_COMMANDSrr   rs   PREFIXED_COMPLEX_COMMANDS)rw   argscommandrg   rh   pre_args	post_argss   `      r6   _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
 $r8   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.
        rl   N)superparse_responselenrr   )rw   
connectioncommand_nameoptionsretkeyvalue	__class__s          r6   r   z#GlobalKeyPrefixMixin.parse_response   sh     %egg$ZIIII7""s"JCc$/00112C:
r8   c                \     t                      j        |                     |          i |S rQ   r   execute_commandr   rw   r}   kwargsr   s      r6   r   z$GlobalKeyPrefixMixin.execute_command  -    &uww&(9(9$(?(?J6JJJr8   Tc                H    t          | j        | j        ||| j                  S )Nrr   )PrefixedRedisPipelineconnection_poolresponse_callbacksrr   )rw   transaction
shard_hints      r6   pipelinezGlobalKeyPrefixMixin.pipeline  s1    $ #!2
 
 
 	
r8   )TN)r>   r?   r@   rA   r{   r|   r   r   r   r   __classcell__r   s   @r6   rV   rV      s              (  T22 !r22"#33 !t44	! !     .    K K K K K
 
 
 
 
 
 
 
r8   rV   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 Nrr    )rz   rr   r   Redis__init__rw   r}   r   s      r6   r   zPrefixedStrictRedis.__init__  sB     &

+=r B BT3D333F33333r8   c                4    t          | j        fd| j        i|S )Nrr   )PrefixedRedisPubSubr   rr   )rw   r   s     r6   pubsubzPrefixedStrictRedis.pubsub  s4    " 
 
!2
 
 
 	
r8   N)r>   r?   r@   rA   r   r   rB   r8   r6   r   r     s8        JJ4 4 4
 
 
 
 
r8   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   )rz   rr   r   rK   Pipeliner   r   s      r6   r   zPrefixedRedisPipeline.__init__&  sE     &

+=r B B&t=d===f=====r8   N)r>   r?   r@   rA   r   rB   r8   r6   r   r     s-         > > > > >r8   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   )rz   rr   r   r   r   s      r6   r   zPrefixedRedisPubSub.__init__5  s<     &

+=r B B$)&)))))r8   c                     t          |          }|                    d          }| j        v r fd|D             }|g|S )Nr   c                >    g | ]}j         t          |          z   S rB   rq   rt   s     r6   rx   z4PrefixedRedisPubSub._prefix_args.<locals>.<listcomp>>  s7        %C0  r8   )ry   rz   PUBSUB_COMMANDS)rw   r}   r~   s   `  r6   r   z PrefixedRedisPubSub._prefix_args9  sc    Dzz((1++d***     D
 $r8   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 rQ   )r   rr   )ru   rS   rw   s     r6   rx   z6PrefixedRedisPubSub.parse_response.<locals>.<listcomp>W  s/    KKKwgc$/00112KKKr8   )r   r   )rw   r}   r   r   message_typechannelsmessager   s   `      r6   r   z"PrefixedRedisPubSub.parse_responseE  sl     %egg$d5f55;J ,/(x
KKKK(KKK
 
 	
r8   c                \     t                      j        |                     |          i |S rQ   r   r   s      r6   r   z#PrefixedRedisPubSub.execute_command[  r   r8   )
r>   r?   r@   rA   r   r   r   r   r   r   r   s   @r6   r   r   +  s        MMO* * * * *
  
  
 
 
 
 
 
,K K K K K K K K Kr8   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      r6   r   zQoS.__init__d  s-    $)&))) r8   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)	rw   r   delivery_tagdeliveryEXRK	zadd_argspiper   s	           r6   r   z
QoS.appendh  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rK   )rS   conn_or_acquire
_deliveredrestore_by_tagclear)rw   rK   tags      r6   restore_unackedzQoS.restore_unackedy  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 rQ   )_remove_from_indicesr   r   ack)rw   r   r   s     r6   r   zQoS.ack  s?    !!,//77999L!!!!!r8   Fc                    |r|                      |d           n'|                     |                                           t                                          |           d S NT)leftmost)r   r   r   r   r   )rw   r   requeuer   s      r6   rejectz
QoS.reject  sc     	>t<<<<%%l33;;===L!!!!!r8   c              #     K   |r|V  d S | j                             |          5 }|                                V  d d d            d S # 1 swxY w Y   d S rQ   )rS   r   r   )rw   r   rK   s      r6   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 rQ   )r   zremr   hdelr   )rw   r   r   s      r6   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   rS   r   r	   visibility_timeoutrO   unacked_mutex_keyunacked_mutex_expirezrevrangebyscorer   r   r<   )	rw   r   r   intervalrK   ceilvisibler   scores	            r6   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 rQ   )hgetr   multir   r   r   rS   _do_restore_message)r   pMr   r   r   rw   r   s        r6   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r8   )rS   r   r   r   )rw   r   rK   r   r   s   `` ` r6   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 rQ   )rS   r   rw   s    r6   r   zQoS.unacked_key  s    |''r8   c                    | j         j        S rQ   )rS   r   r   s    r6   r   zQoS.unacked_index_key      |--r8   c                    | j         j        S rQ   )rS   r   r   s    r6   r   zQoS.unacked_mutex_key  r   r8   c                    | j         j        S rQ   )rS   r   r   s    r6   r   zQoS.unacked_mutex_expire  s    |00r8   c                    | j         j        S rQ   )rS   r   r   s    r6   r   zQoS.visibility_timeout  s    |..r8   rQ   FNN)r   r   r   )NF)r>   r?   r@   rA   restore_at_shutdownr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   @r6   r   r   _  s       ! ! ! ! !2 2 2 2 2"       " " " " "" " " " " " ( ( ( ^(= = = =
   "F F F F ( ( _( . . _. . . _. 1 1 _1 / / _/ / / / /r8   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 rQ   )set	_channels_fd_to_chan_chan_to_sockr   poller
after_readr   s    r6   r   zMultiChannelPoller.__init__  s7    ff%%r8   c                8   | j                                         D ]4}	 | j                            |           # t          t
          f$ r Y 1w xY w| j                                         | j                                         | j                                          d S rQ   )	r  valuesr  
unregisterKeyError
ValueErrorr	  r   r
  )rw   fds     r6   closezMultiChannelPoller.close  s    $++-- 	 	B&&r****j)        """""s   8AAc                :    | j                             |           d S rQ   )r	  addrw   rS   s     r6   r  zMultiChannelPoller.add  s    7#####r8   c                :    | j                             |           d S rQ   )r	  discardr  s     r6   r  zMultiChannelPoller.discard  s    w'''''r8   c                v    	 | j                             |j                   d S # t          t          f$ r Y d S w xY wrQ   )r  r  _sockAttributeError	TypeErrorrw   r   s     r6   _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 rQ   )
r  _unregisterr   r  connectr
  filenor  register
eventflags)rw   rS   rK   typesocks        r6   	_registerzMultiChannelPoller._register  s    VT"d&888Wfd333"*%%''' &+2D/'6:GVT23T4?33333r8   c                V    | j                             | j        |||f                    d S rQ   )r  r  r  )rw   rS   rK   r&  s       r6   r!  zMultiChannelPoller._unregister  s-    t17FD2IJKKKKKr8   c                    t          |dd           Et          r|j                                        |_        n|j                            d          |_        |j        j        d uo|||f| j        v S )Nr   _)getattr"_REDIS_GET_CONNECTION_WITHOUT_ARGSr   get_connectionr   r  r  )rw   rS   rK   cmds       r6   _client_registeredz%MultiChannelPoller._client_registered  sz    6<..61 O$*$:$I$I$K$K!!$*$:$I$I#$N$N!!'t3 =&#&$*<<	>r8   c                    ||j         df}|                     ||j         d          sd|_         | j        |  |j        s|                                 dS dS )zEnable BRPOP mode for channel.rl   FN)rK   r0  _in_pollr(  _brpop_start)rw   rS   idents      r6   _register_BRPOPz"MultiChannelPoller._register_BRPOP  sp    0&&wHH 	#$GDNE"" 	#  """""	# 	#r8   c                    |                      ||j        d          s#d|_        |                     ||j        d           |j        s|                                 dS dS )zEnable LISTEN mode for channel.LISTENFN)r0  	subclient
_in_listenr(  
_subscriber  s     r6   _register_LISTENz#MultiChannelPoller._register_LISTEN  sn    &&w0A8LL 	A!&GNN7G$5x@@@! 	!     	! 	!r8   c                    | j         D ]S}|j        r.|j                                        r|                     |           |j        r|                     |           Td S rQ   )r	  active_queuesqoscan_consumer5  active_fanout_queuesr;  r  s     r6   on_poll_startz MultiChannelPoller.on_poll_start  sr    ~ 	/ 	/G$ 2;**,, 2((111+ /%%g...	/ 	/r8   c                j    || _         | j        D ]#}|j                            |j                  c S d S N)r   )r  r	  r>  r   unacked_restore_limit)rw   r  rS   s      r6   on_poll_initzMultiChannelPoller.on_poll_init&  sS    ~ 	 	G;..1 /     	 	r8   c                l    | j         D ]+}|j        r"|j                            |j                  c S ,d S rC  )r	  r=  r>  r   rD  r  s     r6   maybe_restore_messagesz)MultiChannelPoller.maybe_restore_messages-  s\    ~ 	 	G$ {225 3     	 	r8   c                    | j         D ]P}|j                            d          }|2t          t	          |dd                     r|                                 Qd S )Nr8  check_health)r	  __dict__getcallabler,  rI  )rw   rS   rK   s      r6   maybe_check_subclient_healthz/MultiChannelPoller.maybe_check_subclient_health5  sh    ~ 	& 	&G%))+66F! !F!FGG "##%%%	& 	&r8   c                    | j         |         \  }}|j                                        r |j        |                      d S d S rQ   )r
  r>  r?  handlers)rw   r#  chanr&  s       r6   on_readablezMultiChannelPoller.on_readable=  sN    %f-
d8!! 	"DM$!!!!!	" 	"r8   c                    |t           z  r|                     |          | fS |t          z  r'| j        |         \  }}|                    |           d S d S rQ   )r   rQ  r   r
  _poll_error)rw   r#  eventrP  r&  s        r6   handle_eventzMultiChannelPoller.handle_eventB  sh    4< 	###F++T11S[ 	#)&1JD$T"""""	# 	#r8   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?  r5  r@  r;  r  r   rU  r  rz   r  rG  r   )	rw   callbackrE   rS   eventsr#  rT  r   funs	            r6   rK  zMultiChannelPoller.getI  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 rQ   )r
  r   s    r6   fdszMultiChannelPoller.fdsg  s    r8   rQ   )r>   r?   r@   rA   r   r   r%  rW  r  r   r  r  r  r  r(  r!  r0  r5  r;  rA  rE  rG  rM  rQ  rU  rK  propertyr\  rB   r8   r6   r  r    sT       //J  J
  
  
 # # #$ $ $( ( (  4 4 4L L L> > ># # #! ! !/ / /    & & &" " "
# # #   <     X     r8   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   rD  fanout_prefixfanout_patternsrr   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)rl   r7  r   T)"r   r   re  r   r   _registeredr   rl  _queue_cycle_get_clientClient_get_response_errorr5   r  r@  auto_delete_queues_fanout_to_queue_brpop_read_receiverO  rf  
isinstancers   keyprefix_fanoutrK   ping	Exception_disconnect_poolsr   cycler  r#   r   rT   r   s      r6   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 rQ   )r  r   s    r6   rR   zChannel._after_fork  s         r8   c                    | j         }| j        }d x| _        | _         ||                                 ||                                 d S d S rQ   )_pool_async_pool
disconnect)rw   pool
async_pools      r6   r  zChannel._disconnect_pools  s\    z%
(,,4:OO!!!##### "!r8   c                    | j         |u rd | _         | j        |u rd | _        | j        r-| j        j        r#| j        j                            |           d S d S d S rQ   )r2  r9  r   r  r  r  s     r6   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r8   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)rw   payloadr   r   r   r   queuepris           r6   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 rQ   )r   r   r   r   r   r   r   )r   Pr   r   r   r   rw   r   s        r6   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r8   )re  r   _restorer   r   r   r   )rw   r   r   r   rK   r   r   s   ` `  @r6   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  )rw   r   s     r6   _restore_at_beginningzChannel._restore_at_beginning7  s    }}Wt}444r8   c                    || j         v r4| j         |         \  }}| j                            |           || j        |<    t	                      j        |g|R i |}|                                  |S rQ   )_fanout_queuesr@  r  rx  r   basic_consume_update_queue_cycle)rw   r  r}   r   r   r+  r   r   s          r6   r  zChannel.basic_consume:  s    D'''-e4KHa%))%000.3D!(+#egg#E;D;;;F;; 	  """
r8   c                    | j         }|rT|j        j        r3|j        j                            t          | j        |f                    S |                     |          S d S rQ   )r   r  rW  r  r  r   _basic_cancel)rw   consumer_tagr   s      r6   basic_cancelzChannel.basic_cancelN  sq    
 _
 	42 !'266D.@@   %%l333	4 	4r8   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 rQ   )_tag_to_queuer  r@  remove_unsubscribe_fromr  rx  rz   r   r  r  )rw   r  r  r   r+  r   r   s         r6   r  zChannel._basic_cancel[  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   /)rg  joinr|  )rw   r   r   s      r6   _get_publish_topiczChannel._get_publish_topico  sN     	P4/ 	P77D18S+NOOOww-x8999r8   c                N    | j         |         \  }}|                     ||          S rQ   )r  r  )rw   r  r   r   s       r6   _get_subscribe_topiczChannel._get_subscribe_topict  s*     $ 3E :+&&x===r8   c                      fd j         D             }|sd S  j        }|j        j        |j                                         |j         _        |                    |           d S )Nc                :    g | ]}                     |          S rB   )r  ru   r  rw   s     r6   rx   z&Channel._subscribe.<locals>.<listcomp>y  s7     8 8 8 ))%00 8 8 8r8   )r@  r8  r   r  r"  r9  
psubscribe)rw   keyscs   `  r6   r:  zChannel._subscribex  s    8 8 8 8!68 8 8 	FN<%L  """,	Tr8   c                    |                      |          }| j        }|j        r$|j        j        r|                    |g           d S d S d S rQ   )r  r8  r   r  unsubscribe)rw   r  topicr  s       r6   r  zChannel._unsubscribe_from  s`    ))%00N< 	#AL. 	#MM5'"""""	# 	# 	# 	#r8   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  rj   Fpmessager   r   )r&  patternrS   data)r   
subscribed)rw   rK   rr&  r  rS   r  s          r6   _handle_messagezChannel._handle_message  s    !..1Q4199 %FF!+++,Q41qtQqT+A(D'7DD+,Q4qtQqT+A(D'7D	
 
 	
r8   c                ~   | j         }g }	 |                    |                     |                     n# t          $ r Y nw xY w|j        e|j                            d          rJ|                    |                     |                     |j        |j                            d          Jt          |          S )Nr   rD   )r8  r   _receive_oner   r   can_readany)rw   r  r   s      r6   rz  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   rS   r  r   r  .z&Cannot process event on channel %r: %si   r   r  T)r   r#   r9  r{  ry   tupler  r   endswith	partitionr   r  r  warningreprr   splitr   _deliverrx  )rw   r  responser  rS   r+  r   r   s           r6   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 rB   )r  )ru   r  r  queuesrw   s      r6   rx   z(Channel._brpop_start.<locals>.<listcomp>  sK     % % %#% % s++ % % % %r8   r   rl   )rs  consumer   r=  rp  rK   r   r2  rr   r   send_command)rw   rE   r  command_argsr  s   `   @r6   r3  zChannel._brpop_start  s    "**3t/A+B+BCC 	F% % % % %t7J % % %(/1~6.'$'  	B;33LAAL++\::::r8   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)Nrl   r   r   T)rK   r   r   r#   r  r   rsplitrd  rs  rotater  r   r2  r   )rw   r   
dest__itemdestitems        r6   ry  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 )Nr7  )r8  r   rK   r   )rw   r&  r   s      r6   rS  zChannel._poll_error  sJ    8N))+++++K&&t{'=tDDDDDr8   c                    |                                  5 }| j        D ]W}|                    |                     ||                    }|r*t	          t          |                    c cd d d            S Xt                      # 1 swxY w Y   d S rQ   )r   rp  rpopr  r   r   r   )rw   r  rK   r  r  s        r6   _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 rQ   )r{  numbersIntegral)ru   sizes     r6   	<genexpr>z Channel._size.<locals>.<genexpr>  sP       B BD(w/?@@B4 B B B B B Br8   )r   r   rp  llenr  r   sum)rw   r  rK   r   r  sizess         r6   _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 rQ   )priorityrd  )rw   r  r  s      r6   r  zChannel._q_for_pri  s8    mmC   	-,TX,s,,,r8   c                B    | j         }|t          ||          dz
           S )Nr   )rp  r   )rw   nstepss      r6   r  zChannel.priority  s$    #VE1%%)**r8   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   )rw   r  r   r   r  rK   s         r6   _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   )rw   r   r   r   r   rK   s         r6   _put_fanoutzChannel._put_fanout	  s    !!## 	vNN''+>>g  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   8AA!Ac                B    |r| j                             |           d S d S rQ   )rw  r  )rw   r  auto_deleter   s       r6   
_new_queuezChannel._new_queue  s1     	/#''.....	/ 	/r8   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_queuerd  r  )rw   r   r   r  r  rK   s         r6   _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 )NrK   r   r   )rw  r  r   rK  sremr  rd  r  r   rp  deleter  r   )
rw   r  r   r   r  r}   r   rK   r   r  s
             r6   _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 rQ   )r   r   rp  existsr  r  r   )rw   r  r   rK   r   r  s         r6   
_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 rB   )r  r   r  rd  )ru   valrw   s     r6   rx   z%Channel.get_table.<locals>.<listcomp><  s9    OOOE,s++11$(;;<<OOOr8   )r  r   smembers)rw   r   r   rK   r  s   `    r6   	get_tablezChannel.get_table4  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 )Nrj   )r   r   rp  r  r  r  r   r  )rw   r  rK   r   r  priqr  s          r6   _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        r&	 |                                  n# t          $ r Y nw xY w| j        s| j        j                            |            | j        	                    d          }|*| j
        D ]"}|| j        v r|                     ||           #|                                  |                                  t                                                       d S )NTrK   r   )_closingr2  ry  r   closedr   r  r  rJ  rK  r  rw  queue_deleter  _close_clientsr   r  )rw   rK   r  r   s      r6   r  zChannel.closeG  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)rK   r8  )rJ  r   r  r  r  r5   )rw   attrrK   r   s       r6   r  zChannel._close_clients\  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 {})r{  r  r  
DEFAULT_DB
startswithintr  format)rw   vhosts     r6   _prepare_virtual_hostzChannel._prepare_virtual_hostf  s    %!122 	 "ESLL"!!#&& "abb	E

    ELL   
 s   A -Bc                    |S rQ   rB   )rw   rj  rk  paramss       r6   _filter_tcp_connparamszChannel._filter_tcp_connparamsu  s    r8   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passwordrm  rh  ri  rj  rk  rn  ro  r   	__bases__rn  connection_classr!  z://r,   r  )r'  pathri  rj  rk  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 rQ   )r   r  rr  r  )rw   r}   r   rS   s     r6   r  z2Channel._connparams.<locals>.Connection.disconnect  sK    &EGG&-- * @99$?????@ @r8   )r>   r?   r@   r  r   )r   rS   s   @r6   
Connectionr+    sH        @ @ @ @ @ @ @ @ @ @r8   r-  rB   ) r   rK   hostnamer"  default_portr#  useridr%  rm  rh  ri  rj  rk  rn  ro  r'  r)   ry   r&  r   r   rz   sslupdateconnection_class_sslr  r   r  r   UnixDomainSocketConnectionr  rK  )rw   asynchronousconninfo
connparams
conn_classclassesklassr!  schemer+  r$  r%  r(  queryconnection_clsr-  rS   s                   @r6   _connparamszChannel._connparamsy  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   )ru  r  r  )rw   r5  s     r6   _create_clientzChannel._create_client  s7     	@;;t;???{{49{555r8   c                    |                      |          }| j                            |d                   | _        t          j        di |S )Nr5  r)  r)  rB   )r>  r|  r  r   ConnectionPoolrw   r5  r  s      r6   	_get_poolzChannel._get_pool  sO    !!|!<< $ 5 < <t < M M#--f---r8   c                    t           j        dk     r't          d                    t                               | j        r t          j        t          | j                  S t           j        S )N)r   rj   r   zSRedis transport requires redis-py versions 3.2.0 or later. You have {0.__version__}r   )	r   r   r   r  rr   	functoolspartialr   r   r   s    r6   rt  zChannel._get_client  sk    =9$$!++16%==: : :   	$#!%!6   
 {r8   c              #  F   K   |r|V  d S |                                  V  d S rQ   r@  rw   rK   s     r6   r   zChannel.conn_or_acquire  s9       	(LLLLL%%'''''''r8   c                P    | j         |                                 | _         | j         S rQ   )r  rF  r   s    r6   r  zChannel.pool  s#    :))DJzr8   c                T    | j         |                     d          | _         | j         S )NTrB  )r  rF  r   s    r6   r  zChannel.async_pool  s*    ##~~4~@@Dr8   c                .    |                      d          S )z+Client used to publish messages, BRPOP etc.TrB  rK  r   s    r6   rK   zChannel.client  s     """555r8   c                V    |                      d          }|                                S )z1Pub/Sub connection used to consume fanout queues.TrB  )r@  r   rL  s     r6   r8  zChannel.subclient  s(     $$$$77}}r8   c                D    | j                             | j                   d S rQ   )rs  r2  r=  r   s    r6   r  zChannel._update_queue_cycle   s"      !344444r8   c                    ddl m} |j        S )Nr   r&   )r   r'   r5   )rw   r'   s     r6   rv  zChannel._get_response_error  s    $$$$$$''r8   c                *      fd j         D             S )z<Set of queues being consumed from (excluding fanout queues).c                &    h | ]}|j         v|S rB   )r@  r  s     r6   	<setcomp>z(Channel.active_queues.<locals>.<setcomp>
  s0     ; ; ;% 999 999r8   )_active_queuesr   s   `r6   r=  zChannel.active_queues  s0    ; ; ; ;4#6 ; ; ; 	;r8   r  )r   r  rQ   )br>   r?   r@   rA   r   _client
_subclientr  supports_fanoutr  r|  rd  r2  r9  r  re  r   r   r   r   rD  r   PRIORITY_STEPSrp  rh  ri  rj  rk  ro  rm  DEFAULT_HEALTH_CHECK_INTERVALrn  rf  rg  rr   rl  r  r  r   r_  from_transport_optionsr   r-  r'  SSLConnectionr3  r   rR   r  r  r   r  r  r  r  r  r  r  r:  r  r  rz  r  r3  ry  rS  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r>  r@  rF  rt  r   r   r]  r  r  r   rK   r8  r  rv  r=  r   r   s   @r6   r_  r_  l  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; ; ; ; ;r8   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  )r5  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      r6   r   zTransport.__init__   sF    =IJJJ$)&))) ())


r8   c                    t           j        S rQ   )r   __version__r   s    r6   driver_versionzTransport.driver_version(  s      r8   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 rQ   )r  r  r\  on_tickr  )r   r  looprA  s    r6   _on_disconnectz:Transport.register_with_event_loop.<locals>._on_disconnect2  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 rB   rB   )ru   r  
add_readerrQ  s     r6   rx   zMTransport.register_with_event_loop.<locals>.on_poll_start.<locals>.<listcomp>A  s'    AAAZZK,,AAAr8   )r\  )rm  r  cycle_poll_startrQ  s   r6   rA  z9Transport.register_with_event_loop.<locals>.on_poll_start?  s7    AAAAAuyAAAAAAr8   r   rn  )r  rE  r  rA  rm  rQ  r  rh  r  call_repeatedlyrG  rK   transport_optionsrK  r[  rM  )
rw   r   ri  rj  rn  rm  r  rn  rA  rQ  s
     `  @@@@@r6   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#)!
 !
 	!.	
 	
 	
 	
 	
r8   c                :    | j                             |           dS )z1Handle AIO event for one of our file descriptors.N)r  rQ  )rw   r#  s     r6   rQ  zTransport.on_readableM  s    
v&&&&&r8   )r>   r?   r@   rA   r_  polling_intervalDEFAULT_PORTr/  driver_typedriver_namer   r+   
implementsextend	frozensetr   r7   r#   r$   r   re  rq  rQ  r   r   s   @r6   r+   r+     s        GLKK"-44i = = =>> 5  J
  F,C,C,E,E)>* * * * *! ! ! 
  
  
D' ' ' ' ' ' 'r8   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=   rB   r8   r6   r{  r{  S  s        	 	 	r8   r{  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>  copyrz   r   rK   altr   r;  r"  r/  r   r.  r   Sentinelr,  r  
master_forr   r   r   )	rw   r5  r7  additional_params	sentinelsurlr"  sentinel_instr~  s	            r6   _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
 
 	r8   c                    |                      |          }| j                            |d                   | _        |                     |          S )NrB  r)  rC  )r>  r|  r  r  rE  s      r6   rF  zSentinelChannel._get_pool  sL    !!|!<< $ 5 < <t < M M**<888r8   r  )r>   r?   r@   rA   r_  r\  r   SentinelManagedConnectionr'  r{  r3  r  rF  rB   r8   r6   r}  r}  `  s         8 %; ? 
 >FOx994;CM77# # # #J9 9 9 9 9 9r8   r}  c                      e Zd ZdZdZeZdS )SentinelTransportzRedis Sentinel Transport.ig  N)r>   r?   r@   rA   r/  r}  r_  rB   r8   r6   r  r    s        ##LGGGr8   r  )RrA   
__future__r   rH  r  r,   r   collectionsr   
contextlibr   importlib.metadatar   r  r   r	   packaging.versionr
   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-  rb  r   loggercriticalr  r  rt  r  r[  rZ  r"   r7   r:   r~  r<   rO   rT   rV   r   r   rK   r   r   PubSubr   r   r  r_  r+   r  r]  r{  r}  r  rB   r8   r6   <module>r     sY  3 3j # " " " " "             " " " " " " % % % % % % & & & & & &             % % % % % %       @ @ @ @ @ @ @ @             2 2 2 2 2 2 - - - - - - / / / / / / / / / / 3 3 3 3 3 3 ) ) ) ) ) ) ) ) / / / / / / 0 0 0 0 0 0 & & & & & &      .LLL)01A1A)B)BgggFVFV)V&& . . .E)-&&&.   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_  _  _  _  _  _  _  _ D_
; _
; _
; _
; _
;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$   %B6 6	CCC CC