
    leJi                       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 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l0Z0 e ed                     ed          k    Z1n# e2$ r dZ0dZ1Y nw xY w	 ddl0m3Z3m4Z4 n# e2$ r dZ4dZ3Y nw xY w ed          Z5e5j6        e5j7        cZ8Z7dZ9dZ:dZ;g dZ< ed d!          Z=d" Z>d# Z? G d$ d%e@          ZAe
d&             ZBd' ZC G d( d)          ZD G d* d+eDe0jE                  ZF G d, d-eDe0jG        jH                  ZI G d. d/e0jG        jJ                  ZK G d0 d1e/jL                  ZL G d2 d3          ZM G d4 d5e/jN                  ZN G d6 d7e/jO                  ZOe4r G d8 d9e4jP        e0jQ                  ZR G d: d;eN          ZS G d< d=eO          ZTd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``
* ``client_name``: (str) The name to use when connecting to Redis server.
    )annotationsN)bisect)
namedtuple)contextmanager)version)Empty)time)Version)promise)InconsistencyErrorVersionMismatch)
get_logger)symbol_by_name)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)CredentialProvider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     [/var/www/html/movieo_spanner_bot/venv/lib/python3.11/site-packages/kombu/transport/redis.pyget_redis_error_classesr9      s           z=)) )*		(				,L&'*#0% 
% 
		)&$-& 
&      c                     ddl m}  | j        S )z1Return the redis ConnectionError exception class.r   r(   )r   r)   r2   r(   s    r8   get_redis_ConnectionErrorr<      s          %%r:   c                      e Zd ZdZdS )	MutexHeldz)Raised when another party holds the lock.N__name__
__module____qualname____doc__ r:   r8   r>   r>      s        3333r:   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expirerI   lock_acquireds        r8   MutexrQ      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    r8   _after_fork_cleanup_channelrV      s    r:   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   ri   rj   c                >    g | ]}j         t          |          z   S rD   global_keyprefixstr.0argselfs     r8   
<listcomp>z5GlobalKeyPrefixMixin._prefix_args.<locals>.<listcomp>   s7        %C0  r:   )listpopPREFIXED_SIMPLE_COMMANDSrt   ru   PREFIXED_COMPLEX_COMMANDS)ry   argscommandri   rj   pre_args	post_argss   `      r8   _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
 $r:   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.
        rn   N)superparse_responselenrt   )ry   
connectioncommand_nameoptionsretkeyvalue	__class__s          r8   r   z#GlobalKeyPrefixMixin.parse_response   sh     %egg$ZIIII7""s"JCc$/00112C:
r:   c                \     t                      j        |                     |          i |S rS   r   execute_commandr   ry   r   kwargsr   s      r8   r   z$GlobalKeyPrefixMixin.execute_command  -    &uww&(9(9$(?(?J6JJJr:   Tc                H    t          | j        | j        ||| j                  S )Nrt   )PrefixedRedisPipelineconnection_poolresponse_callbacksrt   )ry   transaction
shard_hints      r8   pipelinezGlobalKeyPrefixMixin.pipeline  s1    $ #!2
 
 
 	
r:   )TN)r@   rA   rB   rC   r}   r~   r   r   r   r   __classcell__r   s   @r8   rX   rX      s              (  T22 !r22"#33 !t44	! !     .    K K K K K
 
 
 
 
 
 
 
r:   rX   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 Nrt    )r|   rt   r   Redis__init__ry   r   r   s      r8   r   zPrefixedStrictRedis.__init__  sB     &

+=r B BT3D333F33333r:   c                4    t          | j        fd| j        i|S )Nrt   )PrefixedRedisPubSubr   rt   )ry   r   s     r8   pubsubzPrefixedStrictRedis.pubsub  s4    " 
 
!2
 
 
 	
r:   N)r@   rA   rB   rC   r   r   rD   r:   r8   r   r     s8        JJ4 4 4
 
 
 
 
r:   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   )r|   rt   r   rM   Pipeliner   r   s      r8   r   zPrefixedRedisPipeline.__init__)  sE     &

+=r B B&t=d===f=====r:   N)r@   rA   rB   rC   r   rD   r:   r8   r   r   !  s-         > > > > >r:   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   )r|   rt   r   r   r   s      r8   r   zPrefixedRedisPubSub.__init__8  s<     &

+=r B B$)&)))))r:   c                     t          |          }|                    d          }| j        v r fd|D             }|g|S )Nr   c                >    g | ]}j         t          |          z   S rD   rs   rv   s     r8   rz   z4PrefixedRedisPubSub._prefix_args.<locals>.<listcomp>A  s7        %C0  r:   )r{   r|   PUBSUB_COMMANDS)ry   r   r   s   `  r8   r   z PrefixedRedisPubSub._prefix_args<  sc    Dzz((1++d***     D
 $r:   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 rS   )r   rt   )rw   rU   ry   s     r8   rz   z6PrefixedRedisPubSub.parse_response.<locals>.<listcomp>Z  s/    KKKwgc$/00112KKKr:   )r   r   )ry   r   r   r   message_typechannelsmessager   s   `      r8   r   z"PrefixedRedisPubSub.parse_responseH  sl     %egg$d5f55;J ,/(x
KKKK(KKK
 
 	
r:   c                \     t                      j        |                     |          i |S rS   r   r   s      r8   r   z#PrefixedRedisPubSub.execute_command^  r   r:   )
r@   rA   rB   rC   r   r   r   r   r   r   r   s   @r8   r   r   .  s        MMO* * * * *
  
  
 
 
 
 
 
,K K K K K K K K Kr:   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      r8   r   zQoS.__init__g  s-    $)&))) r:   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)	ry   r   delivery_tagdeliveryEXRK	zadd_argspiper   s	           r8   r   z
QoS.appendk  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rM   )rU   conn_or_acquire
_deliveredrestore_by_tagclear)ry   rM   tags      r8   restore_unackedzQoS.restore_unacked|  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 rS   )_remove_from_indicesr   r   ack)ry   r   r   s     r8   r   zQoS.ack  s?    !!,//77999L!!!!!r:   Fc                    |r|                      |d           n'|                     |                                           t                                          |           d S NT)leftmost)r   r   r   r   r   )ry   r   requeuer   s      r8   rejectz
QoS.reject  sc     	>t<<<<%%l33;;===L!!!!!r:   c              #     K   |r|V  d S | j                             |          5 }|                                V  d d d            d S # 1 swxY w Y   d S rS   )rU   r   r   )ry   r   rM   s      r8   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 rS   )r   zremr   hdelr   )ry   r   r   s      r8   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   rU   r   r	   visibility_timeoutrQ   unacked_mutex_keyunacked_mutex_expirezrevrangebyscorer   r   r>   )	ry   r   r   intervalrM   ceilvisibler   scores	            r8   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 rS   )hgetr   multir   r   r   rU   _do_restore_message)r   pMr   r   r   ry   r   s        r8   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r:   )rU   r   r   r   )ry   r   rM   r   r   s   `` ` r8   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 rS   )rU   r   ry   s    r8   r   zQoS.unacked_key  s    |''r:   c                    | j         j        S rS   )rU   r   r   s    r8   r   zQoS.unacked_index_key      |--r:   c                    | j         j        S rS   )rU   r   r   s    r8   r   zQoS.unacked_mutex_key  r   r:   c                    | j         j        S rS   )rU   r   r   s    r8   r   zQoS.unacked_mutex_expire  s    |00r:   c                    | j         j        S rS   )rU   r   r   s    r8   r   zQoS.visibility_timeout  s    |..r:   rS   FNN)r   r   r   )NF)r@   rA   rB   rC   restore_at_shutdownr   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   s   @r8   r   r   b  s       ! ! ! ! !2 2 2 2 2"       " " " " "" " " " " " ( ( ( ^(= = = =
   "F F F F ( ( _( . . _. . . _. 1 1 _1 / / _/ / / / /r:   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 rS   )set	_channels_fd_to_chan_chan_to_sockr   poller
after_readr   s    r8   r   zMultiChannelPoller.__init__  s7    ff%%r:   c                8   | j                                         D ]4}	 | j                            |           # t          t
          f$ r Y 1w xY w| j                                         | j                                         | j                                          d S rS   )	r  valuesr  
unregisterKeyError
ValueErrorr  r   r  )ry   fds     r8   closezMultiChannelPoller.close  s    $++-- 	 	B&&r****j)        """""s   8AAc                :    | j                             |           d S rS   )r  addry   rU   s     r8   r  zMultiChannelPoller.add  s    7#####r:   c                :    | j                             |           d S rS   )r  discardr  s     r8   r  zMultiChannelPoller.discard  s    w'''''r:   c                v    	 | j                             |j                   d S # t          t          f$ r Y d S w xY wrS   )r  r  _sockAttributeError	TypeErrorry   r   s     r8   _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 rS   )
r  _unregisterr   r  connectr  filenor  register
eventflags)ry   rU   rM   typesocks        r8   	_registerzMultiChannelPoller._register  s    VT"d&888Wfd333"*%%''' &+2D/'6:GVT23T4?33333r:   c                V    | j                             | j        |||f                    d S rS   )r  r  r  )ry   rU   rM   r(  s       r8   r#  zMultiChannelPoller._unregister  s-    t17FD2IJKKKKKr:   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  )ry   rU   rM   cmds       r8   _client_registeredz%MultiChannelPoller._client_registered  sz    6<..61 O$*$:$I$I$K$K!!$*$:$I$I#$N$N!!'t3 =&#&$*<<	>r:   c                    ||j         df}|                     ||j         d          sd|_         | j        |  |j        s|                                 dS dS )zEnable BRPOP mode for channel.rn   FN)rM   r2  _in_pollr*  _brpop_start)ry   rU   idents      r8   _register_BRPOPz"MultiChannelPoller._register_BRPOP  sp    0&&wHH 	#$GDNE"" 	#  """""	# 	#r:   c                    |                      ||j        d          s#d|_        |                     ||j        d           |j        s|                                 dS dS )zEnable LISTEN mode for channel.LISTENFN)r2  	subclient
_in_listenr*  
_subscriber  s     r8   _register_LISTENz#MultiChannelPoller._register_LISTEN  sn    &&w0A8LL 	A!&GNN7G$5x@@@! 	!     	! 	!r:   c                    | j         D ]S}|j        r.|j                                        r|                     |           |j        r|                     |           Td S rS   )r  active_queuesqoscan_consumer7  active_fanout_queuesr=  r  s     r8   on_poll_startz MultiChannelPoller.on_poll_start!  sr    ~ 	/ 	/G$ 2;**,, 2((111+ /%%g...	/ 	/r:   c                j    || _         | j        D ]#}|j                            |j                  c S d S N)r   )r  r  r@  r   unacked_restore_limit)ry   r  rU   s      r8   on_poll_initzMultiChannelPoller.on_poll_init)  sS    ~ 	 	G;..1 /     	 	r:   c                l    | j         D ]+}|j        r"|j                            |j                  c S ,d S rE  )r  r?  r@  r   rF  r  s     r8   maybe_restore_messagesz)MultiChannelPoller.maybe_restore_messages0  s\    ~ 	 	G$ {225 3     	 	r:   c                    | j         D ]P}|j                            d          }|2t          t	          |dd                     r|                                 Qd S )Nr:  check_health)r  __dict__getcallabler.  rK  )ry   rU   rM   s      r8   maybe_check_subclient_healthz/MultiChannelPoller.maybe_check_subclient_health8  sh    ~ 	& 	&G%))+66F! !F!FGG "##%%%	& 	&r:   c                    | j         |         \  }}|j                                        r |j        |                      d S d S rS   )r  r@  rA  handlers)ry   r%  chanr(  s       r8   on_readablezMultiChannelPoller.on_readable@  sN    %f-
d8!! 	"DM$!!!!!	" 	"r:   c                    |t           z  r|                     |          | fS |t          z  r'| j        |         \  }}|                    |           d S d S rS   )r   rS  r   r  _poll_error)ry   r%  eventrR  r(  s        r8   handle_eventzMultiChannelPoller.handle_eventE  sh    4< 	###F++T11S[ 	#)&1JD$T"""""	# 	#r:   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@  rA  r7  rB  r=  r  r   rW  r  r|   r  rI  r   )	ry   callbackrG   rU   eventsr%  rV  r   funs	            r8   rM  zMultiChannelPoller.getL  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 rS   )r  r   s    r8   fdszMultiChannelPoller.fdsj  s    r:   rS   )r@   rA   rB   rC   r   r   r'  rY  r  r   r  r  r  r!  r*  r#  r2  r7  r=  rC  rG  rI  rO  rS  rW  rM  propertyr^  rD   r:   r8   r  r    sT       //J  J
  
  
 # # #$ $ $( ( (  4 4 4L L L> > ># # #! ! !/ / /    & & &" " "
# # #   <     X     r:   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%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 Z0d Z1d Z2	 dBdZ3dB fd	Z4d Z5 fdZ6d Z7 fdZ8d Z9d Z:d Z;d Z<d Z=d  Z>d! Z?dCd"Z@d# ZAd$ ZBd% ZCd& ZDd' ZEd( ZFd) ZGd* ZHdBd+ZId, ZJd- ZKd. ZLd/ ZMd0 ZN fd1ZOd2 ZPd3 ZQ	 	 dDd4ZRd5 ZSdBd6ZTdBd7ZUdBd8ZVd9 ZWeXdCd:            ZYeZd;             Z[eZd<             Z\e]d=             Z^e]d>             Z_d? Z`d@ ZaeZdA             Zb xZcS )E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   rF  fanout_prefixfanout_patternsrt   socket_timeoutsocket_connect_timeoutsocket_keepalivesocket_keepalive_optionsqueue_order_strategymax_connectionshealth_check_intervalretry_on_timeoutpriority_stepsclient_namec                R    t                      j        |i | | j        st          j        | _        d| _         t          | j                              | _        | 	                                | _
        |                                 | _        t                      | _        t                      | _        i | _        | j        | j        d| _        | j        j        | _        | j        r't/          | j        t0                    r| j        | _        nd| _        	 | j                                         n## t8          $ r |                                   w xY w| j        j                            |            d| _        | j        j         | _         tB          tC          | tD                     d S d S )NF)rn   r9  r   T)#r   r   rg  r   r   _registeredr   rn  _queue_cycle_get_clientClient_get_response_errorr7   r
  rB  auto_delete_queues_fanout_to_queue_brpop_read_receiverQ  r   brpop_timeoutrh  
isinstanceru   keyprefix_fanoutrM   ping	Exception_disconnect_poolscycler  r%   r   rV   r   s      r8   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/ / Ec                .    |                                   d S rS   )r  r   s    r8   rT   zChannel._after_fork  s         r:   c                    | j         }| j        }d x| _        | _         ||                                 ||                                 d S d S rS   )_pool_async_pool
disconnect)ry   pool
async_pools      r8   r  zChannel._disconnect_pools  s\    z%
(,,4:OO!!!##### "!r:   c                    | j         |u rd | _         | j        |u rd | _        | j        r-| j        j        r#| j        j                            |           d S d S d S rS   )r4  r;  r   r  r!  r   s     r8   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r:   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)ry   payloadr   r   r   r   queuepris           r8   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 rS   )r   r   r   r   r   r   r   )r   Pr   r   r   r   ry   r   s        r8   r   z-Channel._restore.<locals>.restore_transaction2  s    		$*C00AJJLLLIId&,,, D!,q//22	2r((BD(CCCCCD Dr:   )rg  r   _restorer   r   r   r   )ry   r   r   r   rM   r   r   s   ` `  @r8   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  )ry   r   s     r8   _restore_at_beginningzChannel._restore_at_beginning=  s    }}Wt}444r:   c                    || j         v r4| j         |         \  }}| j                            |           || j        |<    t	                      j        |g|R i |}|                                  |S rS   )_fanout_queuesrB  r  r{  r   basic_consume_update_queue_cycle)ry   r  r   r   r   r-  r   r   s          r8   r  zChannel.basic_consume@  s    D'''-e4KHa%))%000.3D!(+#egg#E;D;;;F;; 	  """
r:   c                    | j         }|rT|j        j        r3|j        j                            t          | j        |f                    S |                     |          S d S rS   )r   r  rY  r  r  r   _basic_cancel)ry   consumer_tagr   s      r8   basic_cancelzChannel.basic_cancelT  sq    
 _
 	42 !'266D.@@   %%l333	4 	4r:   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 rS   )_tag_to_queuer  rB  remove_unsubscribe_fromr  r{  r|   r   r  r  )ry   r  r  r   r-  r   r   s         r8   r  zChannel._basic_cancela  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   /)ri  joinr  )ry   r   r   s      r8   _get_publish_topiczChannel._get_publish_topicu  sN     	P4/ 	P77D18S+NOOOww-x8999r:   c                N    | j         |         \  }}|                     ||          S rS   )r  r  )ry   r  r   r   s       r8   _get_subscribe_topiczChannel._get_subscribe_topicz  s*     $ 3E :+&&x===r:   c                      fd j         D             }|sd S  j        }|j        j        |j                                         |j         _        |                    |           d S )Nc                :    g | ]}                     |          S rD   )r  rw   r  ry   s     r8   rz   z&Channel._subscribe.<locals>.<listcomp>  s7     8 8 8 ))%00 8 8 8r:   )rB  r:  r   r  r$  r;  
psubscribe)ry   keyscs   `  r8   r<  zChannel._subscribe~  s    8 8 8 8!68 8 8 	FN<%L  """,	Tr:   c                    |                      |          }| j        }|j        r$|j        j        r|                    |g           d S d S d S rS   )r  r:  r   r  unsubscribe)ry   r  topicr  s       r8   r  zChannel._unsubscribe_from  s`    ))%00N< 	#AL. 	#MM5'"""""	# 	# 	# 	#r:   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  rl   Fpmessager   r!   )r(  patternrU   data)r   
subscribed)ry   rM   rr(  r  rU   r  s          r8   _handle_messagezChannel._handle_message  s    !..1Q4199 %FF!+++,Q41qtQqT+A(D'7DD+,Q4qtQqT+A(D'7D	
 
 	
r:   c                ~   | j         }g }	 |                    |                     |                     n# t          $ r Y nw xY w|j        e|j                            d          rJ|                    |                     |                     |j        |j                            d          Jt          |          S )Nr   rF   )r:  r   _receive_oner   r   can_readany)ry   r  r   s      r8   r}  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   rU   r  r   r  .z&Cannot process event on channel %r: %si   r   r  T)r   r%   r;  r  r{   tupler  r   endswith	partitionr   r  r  warningreprr   splitr   _deliverr{  )ry   r  responser  rU   r-  r   r   s           r8   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c                F    | j         } 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 rD   )r  )rw   r  r  queuesry   s      r8   rz   z(Channel._brpop_start.<locals>.<listcomp>  sK     % % %#% % s++ % % % %r:   r   rn   )r~  rv  consumer   r?  rr  rM   r   r4  rt   r   send_command)ry   rG   r  command_argsr  s   `   @r8   r5  zChannel._brpop_start  s    ?(G"**3t/A+B+BCC 	F% % % % %t7J % % %(/1~6.'$'  	B;33LAAL++\::::r:   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)Nrn   r   r   T)rM   r   r   r%   r  r   rsplitrf  rv  rotater  r   r4  r   )ry   r   
dest__itemdestitems        r8   r|  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 )Nr9  )r:  r   rM   r   )ry   r(  r   s      r8   rU  zChannel._poll_error  sJ    8N))+++++K&&t{'=tDDDDDr:   c                    |                                  5 }| j        D ]W}|                    |                     ||                    }|r*t	          t          |                    c cd d d            S Xt                      # 1 swxY w Y   d S rS   )r   rr  rpopr  r   r   r   )ry   r  rM   r  r  s        r8   _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 rS   )r  numbersIntegral)rw   sizes     r8   	<genexpr>z Channel._size.<locals>.<genexpr>  sP       B BD(w/?@@B4 B B B B B Br:   )r   r   rr  llenr  r   sum)ry   r  rM   r   r  sizess         r8   _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 rS   )priorityrf  )ry   r  r  s      r8   r  zChannel._q_for_pri   s8    mmC   	-,TX,s,,,r:   c                B    | j         }|t          ||          dz
           S )Nr   )rr  r   )ry   nstepss      r8   r  zChannel.priority  s$    #VE1%%)**r:   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   )ry   r  r   r   r  rM   s         r8   _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   )ry   r   r   r   r   rM   s         r8   _put_fanoutzChannel._put_fanout  s    !!## 	vNN''+>>g  	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	s   8AA!Ac                B    |r| j                             |           d S d S rS   )rz  r  )ry   r  auto_deleter   s       r8   
_new_queuezChannel._new_queue  s1     	/#''.....	/ 	/r:   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_queuerf  r  )ry   r   r   r  r  rM   s         r8   _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 )NrM   r   r   )rz  r  r   rM  sremr  rf  r  r   rr  deleter  r   )
ry   r  r   r   r  r   r   rM   r   r  s
             r8   _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 rS   )r   r   rr  existsr  r  r   )ry   r  r   rM   r   r  s         r8   
_has_queuezChannel._has_queue5  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 rD   )r  r   r  rf  )rw   valry   s     r8   rz   z%Channel.get_table.<locals>.<listcomp>D  s9    OOOE,s++11$(;;<<OOOr:   )r  r   smembers)ry   r   r   rM   r  s   `    r8   	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 )Nrl   )r   r   rr  r  r  r  r   r  )ry   r  rM   r   r  priqr  s          r8   _purgezChannel._purgeF  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 )NTrM   r   )_closingr4  r|  r   closedr   r  r  rL  rM  r  rz  queue_deleter  _close_clientsr   r  )ry   rM   r  r   s      r8   r  zChannel.closeO  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)rM   r:  )rL  r   r  r  r  r7   )ry   attrrM   r   s       r8   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 {})r  r  r  
DEFAULT_DB
startswithintr  format)ry   vhosts     r8   _prepare_virtual_hostzChannel._prepare_virtual_hostn  s    %!122 	 "ESLL"!!#&& "abb	E

    ELL   
 s   A -Bc                    |S rS   rD   )ry   rl  rm  paramss       r8   _filter_tcp_connparamszChannel._filter_tcp_connparams}  s    r:   c                   |rt          |t                    rt          |          } |            }t          |t                    st	          d          ||d<   |                    dd            |                    dd            d S d S )NzRCredential provider is not an instance of a redis.CredentialProvider or a subclasscredential_providerusernamepassword)r  ru   r   r   r  r|   )ry   r%  
connparamscredential_provider_clss       r8   _process_credential_providerz$Channel._process_credential_provider  s     	--s33 @*89L*M*M'&=&=&?&?#13EFF  h   1DJ,-NN:t,,,NN:t,,,,,	- 	-r:   c                4   | j         j        }|j        pd|j        p| j         j        |j        |j        |j        |j        | j	        | j
        | j        | j        | j        | j        | j        | j        d}|                     |j        |           | j        }t'          |d          r[|g}t'          |d          r|t)          |j                  z  }|D ]}t-          |j        d          r n|                    d           |j        r6	 |                    |j                   | j        |d<   n# t8          $ r Y nw xY w|d         }d|v rt;          |          \  }}	}	}
}}}|d	k    rm | j        di |} |j        t>          j         d
|z   dfi | |                    dd            |                    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_hostr&  r'  r%  ro  rj  rk  rl  rm  rp  rq  rs  r   	__bases__rp  connection_classr,  z://r.   r  )r0  pathrk  rl  rm  r&  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 rS   )r   r  ru  r!  )ry   r   r   rU   s     r8   r  z2Channel._connparams.<locals>.Connection.disconnect  sK    &EGG&-- * @99$?????@ @r:   )r@   rA   rB   r  r   )r   rU   s   @r8   
Connectionr4    sH        @ @ @ @ @ @ @ @ @ @r:   r6  rD   )#r   rM   hostnamer-  default_portr.  useridr'  r%  ro  rj  rk  rl  rm  rp  rq  rs  r*  r0  r+   r{   r/  r   r   r|   sslupdateconnection_class_sslr  r   r#  r   UnixDomainSocketConnectionr   rM  )ry   asynchronousconninfor(  
conn_classclassesklassr,  schemer-  r&  r'  r1  queryr%  connection_clsr6  rU   s                    @r8   _connparamszChannel._connparams  sd   ?)%4MAT_%A$1  )#+#?#3"1&*&A $ 5(,(E%)%? $ 5+
 

" 	))(*F
SSS*
 :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" #()),A4"H"H--.A:NNNNN64(((NN64(((55NN>4002 2
4 NN-.. "! 	
  	(@ @ @ @ @ @ @^ @ @ @ (N)7
%&s   $D- -
D:9D:c                r    |r|                      | j                  S |                      | j                  S )N)r   )rx  r  r  )ry   r>  s     r8   _create_clientzChannel._create_client  s7     	@;;t;???{{49{555r:   c                    |                      |          }| j                            |d                   | _        t          j        di |S )Nr>  r2  r2  rD   )rF  r  r  r   ConnectionPoolry   r>  r"  s      r8   	_get_poolzChannel._get_pool  sO    !!|!<< $ 5 < <t < M M#--f---r:   c                    t           j        dk     r't          d                    t                               | j        r t          j        t          | j                  S t           j        S )N)r!   rl   r   zSRedis transport requires redis-py versions 3.2.0 or later. You have {0.__version__}r   )	r   r   r   r  rt   	functoolspartialr   r   r   s    r8   rw  zChannel._get_client  sk    =9$$!++16%==: : :   	$#!%!6   
 {r:   c              #  F   K   |r|V  d S |                                  V  d S rS   rH  ry   rM   s     r8   r   zChannel.conn_or_acquire  s9       	(LLLLL%%'''''''r:   c                P    | j         |                                 | _         | j         S rS   )r  rN  r   s    r8   r  zChannel.pool	  s#    :))DJzr:   c                T    | j         |                     d          | _         | j         S )NTrJ  )r  rN  r   s    r8   r  zChannel.async_pool  s*    ##~~4~@@Dr:   c                .    |                      d          S )z+Client used to publish messages, BRPOP etc.TrJ  rS  r   s    r8   rM   zChannel.client  s     """555r:   c                V    |                      d          }|                                S )z1Pub/Sub connection used to consume fanout queues.TrJ  )rH  r   rT  s     r8   r:  zChannel.subclient  s(     $$$$77}}r:   c                D    | j                             | j                   d S rS   )rv  r;  r?  r   s    r8   r  zChannel._update_queue_cycle   s"      !344444r:   c                    ddl m} |j        S )Nr   r(   )r   r)   r7   )ry   r)   s     r8   ry  zChannel._get_response_error#  s    $$$$$$''r:   c                *      fd j         D             S )z<Set of queues being consumed from (excluding fanout queues).c                &    h | ]}|j         v|S rD   )rB  r  s     r8   	<setcomp>z(Channel.active_queues.<locals>.<setcomp>*  s0     ; ; ;% 999 999r:   )_active_queuesr   s   `r8   r?  zChannel.active_queues'  s0    ; ; ; ;4#6 ; ; ; 	;r:   r  rS   r  )dr@   rA   rB   rC   r   _client
_subclientr  supports_fanoutr  r  rf  r4  r;  r  rg  r   r   r   r   rF  r   PRIORITY_STEPSrr  rj  rk  rl  rm  rq  ro  DEFAULT_HEALTH_CHECK_INTERVALrp  rs  rh  ri  rt   rn  r  r  r   ra  from_transport_optionsr   r6  r0  SSLConnectionr<  r   rT   r  r!  r   r  r  r  r  r  r  r  r<  r  r  r}  r  r5  r|  rU  r  r  r  r  r  r  r  r  r  r
  r  r  r  r  r   r#  r*  rF  rH  rN  rw  r   r   r_  r  r  r   rM   r:  r  ry  r?  r   r   s   @r8   ra  ra  o  s       
CGJHO)O
CHJNMK'' #NN!#O9K M O
 4 )KE 	.		 2 ,1:u''d27A5..T'C 'C 'C 'C 'CR! ! !
$ 
$ 
$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<   - - - W W W Wr6 6 6 6
. . . .
   ( ( ( ^(   X
     X 
 6 6 _6   _
5 5 5( ( ( ; ; X; ; ; ; ;r:   ra  c                       e Zd ZdZeZd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   r   T)directr  r  )r>  exchange_typec                    t           t          d           t                      j        |i | t	                      | _        | j        | j        | _        d S d S )Nz)Missing redis library (pip install redis))r   ImportErrorr   r   r  r  polling_intervalr~  r   s      r8   r   zTransport.__init__A  sd    =IJJJ$)&))) ())
 ,!%!6D -,r:   c                    t           j        S rS   )r   __version__r   s    r8   driver_versionzTransport.driver_versionL  s      r:   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 rS   )r  r  r^  on_tickr  )r   r  looprC  s    r8   _on_disconnectz:Transport.register_with_event_loop.<locals>._on_disconnectV  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 rD   rD   )rw   r  
add_readerrS  s     r8   rz   zMTransport.register_with_event_loop.<locals>.on_poll_start.<locals>.<listcomp>e  s'    AAAZZK,,AAAr:   )r^  )rv  r  cycle_poll_startrS  s   r8   rC  z9Transport.register_with_event_loop.<locals>.on_poll_startc  s7    AAAAAuyAAAAAAr:   r   rp  )r  rG  r  rC  rv  rS  r!  rq  r  call_repeatedlyrI  rM   transport_optionsrM  rc  rO  )
ry   r   rr  rs  rp  rv  r  rw  rC  rS  s
     `  @@@@@r8   register_with_event_loopz"Transport.register_with_event_loopO  s   
4;''' ._
&
	 
	 
	 
	 
	 
	 
	 +9'	B 	B 	B 	B 	B 	B 	B 	B 	'''R!=>>> * 1 C G G#)!
 !
 	!.	
 	
 	
 	
 	
r:   c                :    | j                             |           dS )z1Handle AIO event for one of our file descriptors.N)r  rS  )ry   r%  s     r8   rS  zTransport.on_readableq  s    
v&&&&&r:   )r@   rA   rB   rC   ra  rk  r~  DEFAULT_PORTr8  driver_typedriver_namer   r-   
implementsextend	frozensetr   r9   r%   r&   r   rn  rz  rS  r   r   s   @r8   r-   r-   .  s        GMLKK"-44i = = =>> 5  J
  F,C,C,E,E)>	7 	7 	7 	7 	7! ! ! 
  
  
D' ' ' ' ' ' 'r:   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?   rD   r:   r8   r  r  w  s        	 	 	r:   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.)rF  copyr|   r   rM   altr   rC  r-  r8  r   r7  r   Sentinelr.  r  
master_forr   r   r   )	ry   r>  r(  additional_params	sentinelsurlr-  sentinel_instr  s	            r8   _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
 
 	r:   c                    |                      |          }| j                            |d                   | _        |                     |          S )NrJ  r2  rK  )rF  r  r  r  rM  s      r8   rN  zSentinelChannel._get_pool  sL    !!|!<< $ 5 < <t < M M**<888r:   r  )r@   rA   rB   rC   ra  rd  r   SentinelManagedConnectionr0  r  r<  r  rN  rD   r:   r8   r  r    s         8 %; ? 
 >FOx994;CM77# # # #J9 9 9 9 9 9r:   r  c                      e Zd ZdZdZeZdS )SentinelTransportzRedis Sentinel Transport.ig  N)r@   rA   rB   rC   r8  r  ra  rD   r:   r8   r  r    s        ##LGGGr:   r  )UrC   
__future__r   rP  r  r.   r   collectionsr   
contextlibr   importlib.metadatar   r  r   r	   packaging.versionr
   viner   kombu.exceptionsr   r   	kombu.logr   kombu.utilsr   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/  rj  r   r   loggercriticalr  r  r|  r  rc  rb  r$   r9   r<   r  r>   rQ   rV   rX   r   r   rM   r   r   PubSubr   r   r  ra  r-   r  re  r  r  r  rD   r:   r8   <module>r     sy  4 4l # " " " " "             " " " " " " % % % % % % & & & & & &             % % % % % %       @ @ @ @ @ @ @ @             & & & & & & 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)-&&&.222222222   H
 
+	,	,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 |
; |
; |
;~E' E' E' E' E'! E' E' E'P  
 
 
 
 
.
 
 
M9 M9 M9 M9 M9g M9 M9 M9`    	     s$   %B< <	CCC 	C! C!