Ë
    UV.jm  ã                  óÌ  — d Z ddlmZ ddlZddlZddlZddlZddlmZm	Z	m
Z
mZ ddlmZ ddlmZ ddlmZ ddlmZ dd	lmZmZ dd
lmZmZ ddlmZ ddlmZ ddlmZmZ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l0m1Z2 ddl3m4Z4 ddl5m6Z6 ddl7m8Z8m9Z9 ddl:m;Z;m<Z< ddl=m>Z> ddl?m@Z@  e6d«      ZA eBej†                  «      h d£z
  ZD eEd«       eEd«      ieDD � ci c]  }  eE| «       eEd«      “Œ c} ¥ZF G d „ d!«      ZG G d"„ d#«      ZHej’                   G d$„ d%«      «       ZJ G d&„ d'e@j–                  «      ZK G d(„ d)e@j˜                  «      ZLyc c} w )*ap  GCP Pub/Sub transport module for kombu.

More information about GCP Pub/Sub:
https://cloud.google.com/pubsub

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

Connection String
=================

Connection string has the following formats:

.. code-block::

    gcpubsub://projects/project-name

Transport Options
=================
* ``queue_name_prefix``: (str) Prefix for queue names.
* ``ack_deadline_seconds``: (int) The maximum time after receiving a message
  and acknowledging it before pub/sub redelivers the message.
* ``expiration_seconds``: (int) Subscriptions without any subscriber
  activity or changes made to their properties are removed after this period.
  Examples of subscriber activities include open connections,
  active pulls, or successful pushes.
* ``wait_time_seconds``: (int) The maximum time to wait for new messages.
  Defaults to 10.
* ``retry_timeout_seconds``: (int) The maximum time to wait before retrying.
* ``bulk_max_messages``: (int) The maximum number of messages to pull in bulk.
  Defaults to 32.
é    )ÚannotationsN)ÚFIRST_COMPLETEDÚFutureÚThreadPoolExecutorÚwait)Úsuppress)Úgetpid)ÚEmpty)ÚLock)Ú	monotonicÚsleep)ÚNAMESPACE_OIDÚuuid3)Úgethostname©Útimeout)ÚAlreadyExistsÚDeadlineExceededÚPermissionDenied)ÚRetry)Úmonitoring_v3)Úquery)ÚPublisherClientÚSubscriberClient)Ú
exceptions)Úgapic_version)ÚTRANSIENT_DELIVERY_MODE)Ú
get_logger)Úbytes_to_strÚsafe_str)ÚdumpsÚloads)Úcached_propertyé   )Úvirtualzkombu.transport.gcpubsub>   Ú-Ú.Ú_r'   r&   r(   c                  ó>   — e Zd ZdZd„ Zd„ Zd
d„Zdd„Zd„ Zd„ Z	d„ Z
y	)Ú
UnackedIdszThreadsafe list of ack_ids.c                ó0   — g | _         t        «       | _        y ©N)Ú_listr   Ú_lock©Úselfs    úZC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\kombu/transport/gcpubsub.pyÚ__init__zUnackedIds.__init__Z   s   € ØˆŒ
Ü“Vˆ�
ó    c                ó:   — | j                   j                  |«       y r,   )r-   Úappend©r0   Úvals     r1   r5   zUnackedIds.append^   s   € à�
‰
×Ñ˜#Õr3   c                ó:   — | j                   j                  |«       y r,   )r-   Úextend)r0   Úvalss     r1   r9   zUnackedIds.extendb   s   € à�
‰
×Ñ˜$Õr3   c                ó|   — | j                   5  | j                  j                  |«      cd d d «       S # 1 sw Y   y xY wr,   )r.   r-   Úpop)r0   Úindexs     r1   r<   zUnackedIds.popf   s#   € Ø�Z‹ZØ—:‘:—>‘> %Ó(÷ �ZŠZús   �2²;c                óÄ   — | j                   5  t        t        «      5  | j                  j	                  |«       d d d «       d d d «       y # 1 sw Y   ŒxY w# 1 sw Y   y xY wr,   )r.   r   Ú
ValueErrorr-   Úremover6   s     r1   r@   zUnackedIds.removej   s7   € Ø�Z‹Zœ¤*Õ-Ø�J‰J×Ñ˜cÔ"÷ .�ZˆZ×-Ð-ú�ZˆZús!   �A�A
¹AÁ
A	ÁAÁAc                óp   — | j                   5  t        | j                  «      cd d d «       S # 1 sw Y   y xY wr,   )r.   Úlenr-   r/   s    r1   Ú__len__zUnackedIds.__len__n   s   € Ø�Z‹ZÜ�t—z‘z“?÷ �ZŠZús   �,¬5c                ó    — | j                   |   S r,   )r-   )r0   Úitems     r1   Ú__getitem__zUnackedIds.__getitem__r   s   € à�z‰z˜$ÑÐr3   N)r:   Úlist)éÿÿÿÿ)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r2   r5   r9   r<   r@   rC   rF   © r3   r1   r*   r*   W   s(   „ Ù%òòó ó)ò#ò#ó r3   r*   c                  ó.   — e Zd ZdZdd„Zdd„Zdd„Zd„ Zy)	ÚAtomicCounterzIThreadsafe counter.

    Returns the value after inc/dec operations.
    c                ó0   — || _         t        «       | _        y r,   )Ú_valuer   r.   )r0   Úinitials     r1   r2   zAtomicCounter.__init__}   s   € ØˆŒÜ“Vˆ�
r3   c                óˆ   — | j                   5  | xj                  |z  c_        | j                  cd d d «       S # 1 sw Y   y xY wr,   ©r.   rQ   ©r0   Úns     r1   ÚinczAtomicCounter.inc�   ó(   € Ø�Z‹ZØ�KŠK˜1Ñ�KØ—;‘;÷ �ZŠZúó	   �!8¸Ac                óˆ   — | j                   5  | xj                  |z  c_        | j                  cd d d «       S # 1 sw Y   y xY wr,   rT   rU   s     r1   ÚdeczAtomicCounter.dec†   rX   rY   c                ó^   — | j                   5  | j                  cd d d «       S # 1 sw Y   y xY wr,   rT   r/   s    r1   ÚgetzAtomicCounter.get‹   s   € Ø�Z‹ZØ—;‘;÷ �ZŠZús   �#£,N)r   )r$   )rI   rJ   rK   rL   r2   rW   r[   r]   rM   r3   r1   rO   rO   w   s   „ ñó
óó
ó
r3   rO   c                  ój   — e Zd ZU dZded<   ded<   ded<   ded<    ej                  e¬«      Zded	<   y
)ÚQueueDescriptorzPub/Sub queue descriptor.ÚstrÚnameÚ
topic_pathÚsubscription_idÚsubscription_path)Údefault_factoryr*   Úunacked_idsN)	rI   rJ   rK   rL   Ú__annotations__ÚdataclassesÚfieldr*   rf   rM   r3   r1   r_   r_   �   s2   … á#à
ƒIØƒOØÓØÓØ/˜k×/Ñ/À
ÔK€K�ÔKr3   r_   c                  óR  ‡ — e Zd ZU dZdZdZdZdZdZdZ	dZ
dZ e«       Zd	Zd
ed<    ej"                  «       Z e«       Zi Zded<    e«       Zded<   ˆ fd„Zefd1d„Zd„ Z	 d2	 	 	 	 	 	 	 d3d„Zd4d„Z	 	 	 	 	 	 d5	 	 	 	 	 	 	 	 	 	 	 d6d„Zd„ Zd„ Zd„ Z d2d7d„Z!d8d„Z"d7d„Z#d9d„Z$d2ˆ fd„	Z%d:d„Z&d;ˆ fd„	Z'd<d „Z(d=d!„Z)d"„ Z*d=d#„Z+e,d$„ «       Z-e,d%„ «       Z.e,d&„ «       Z/e0d'„ «       Z1e0d(„ «       Z2e,d)„ «       Z3e,d*„ «       Z4e,d+„ «       Z5e,d,„ «       Z6e,d-„ «       Z7e,d.„ «       Z8ˆ fd/„Z9e:d0„ «       Z;ˆ xZ<S )>ÚChannelzGCP Pub/Sub channel.TFé
   éð   i€Q i,  é    Nzthreading.ThreadÚ_unacked_extenderzdict[str, QueueDescriptor]Ú_queue_cachezset[str]Ú_tmp_subscriptionsc                óò  •— t        ‰| �  |i |¤Ž t        «       | _        t        j                  d| j                  j                  «       t        j                  | j                  j                  «      | _
        | j                  j                  «       dk(  rct        j                  | j                  d¬«      t         _        | j$                  j'                  «        t         j"                  j)                  «        y y )Nznew GCP pub/sub channel: %sr$   T)ÚtargetÚdaemon)Úsuperr2   r   ÚpoolÚloggerÚinfoÚconninfoÚhostnameÚ	TransportÚ	parse_uriÚ
project_idÚ_n_channelsrW   Ú	threadingÚThreadÚ_extend_unacked_deadlinerk   ro   Ú_stop_extenderÚclearÚstart)r0   ÚargsÚkwargsÚ	__class__s      €r1   r2   zChannel.__init__®   sµ   ø€ Ü‰Ñ˜$Ð) &Ò)Ü&Ó(ˆŒ	Ü�‰Ð1°4·=±=×3IÑ3IÔJä#×-Ñ-¨d¯m©m×.DÑ.DÓEˆŒØ×Ñ×ÑÓ! QÒ&Ü(1×(8Ñ(8Ø×4Ñ4Øô)ŒGÔ%ð ×Ñ×%Ñ%Ô'Ü×%Ñ%×+Ñ+Õ-ð 'r3   c                óœ   — |j                  | j                  «      s| j                  |z   }t        t        |«      «      j	                  |«      S )z7Format AMQP queue name into a valid Pub/Sub queue name.)Ú
startswithÚqueue_name_prefixr`   r    Ú	translate)r0   ra   Útables      r1   Úentity_namezChannel.entity_name¼   s>   € à�‰˜t×5Ñ5Ô6Ø×)Ñ)¨DÑ0ˆDä”8˜D“>Ó"×,Ñ,¨UÓ3Ð3r3   c                óò  — | j                  |«      j                  }| j                  |«      }t        j	                  d||||«       i }|dk(  r;dd|› d�i}| j
                  j                  | j                  |«      }| j                  }n |dk(  rŒt        t        t        «       › dt        «       › �«      › }	|› d|	› �}
| j
                  j                  | j                  |
«      }| j                  j                  |«       | j                  j                  |«       d	}nt!        d
|› d�«      ‚| j#                  | j                  ||«      }| j%                  ||||¬«       t'        ||||¬«      }|| j(                  |<   y )Nz9binding queue: %s to %s exchange: %s with routing_key: %sÚdirectÚfilterzattributes.routing_key="Ú"Úfanoutr'   r&   iX  zexchange type z not implemented)rb   rd   Úfilter_argsÚmsg_retention)ra   rb   rc   rd   )ÚtypeofÚtyper�   rw   ÚdebugÚ
subscriberrd   r}   Úexpiration_secondsr   r   r   r	   rq   ÚaddÚ_fanout_exchangesÚNotImplementedErrorÚ_create_topicÚ_create_subscriptionr_   rp   )r0   ÚexchangeÚrouting_keyÚpatternÚqueueÚexchange_typer“   rd   Úmessage_retention_durationÚuidÚuniq_sub_nameÚexchange_topicÚqdescs                r1   Ú_queue_bindzChannel._queue_bindÃ   s   € ØŸ™ HÓ-×2Ñ2ˆØ× Ñ  Ó'ˆÜ�‰ØGØØØØô	
ð ˆØ˜HÒ$ð Ð4°[°MÀÐCðˆKð !%§¡× AÑ AØ—‘ ó!Ðð *.×)@Ñ)@Ñ&Ø˜hÒ&ô œ=¬[«]¨O¸1¼V»X¸JÐ*GÓHÐIˆCØ$˜g Q s eÐ,ˆMØ $§¡× AÑ AØ—‘ ó!Ðð ×#Ñ#×'Ñ'Ð(9Ô:Ø×"Ñ"×&Ñ& xÔ0Ø),Ñ&ä%Ø   Ð/?Ð@óð ð ×+Ñ+Ø�O‰O˜XÐ'Aó
ˆð 	×!Ñ!Ø%Ø/Ø#Ø4ð	 	"ô 	
ô  ØØ%Ø!Ø/ô	
ˆð $)ˆ×Ñ˜%Ò r3   c                ó2  — | j                   j                  ||«      }| j                  |«      rt        j	                  d|«       |S 	 t        j	                  d|«       d|i}|r|› d�|d<   | j                   j                  |¬«       |S # t        $ r Y |S w xY w)Nztopic: %s existszcreating topic: %sra   Úsr¤   ©Úrequest)Ú	publisherrb   Ú_is_topic_existsrw   r—   Úcreate_topicr   )r0   r}   Útopic_idr¤   rb   r­   s         r1   r�   zChannel._create_topic  s±   € ð —^‘^×.Ñ.¨z¸8ÓDˆ
Ø× Ñ  Ô,ä�L‰LÐ+¨ZÔ8ØÐð		Ü�L‰LÐ-¨zÔ:Ø˜zÐ*ˆGÙ)ð 2Ð2°!Ð4ð Ø0ñð �N‰N×'Ñ'°Ð'Ô8ð Ðøô ò 	ØàÐð	ús   ÁA B	 Â		BÂBc                óŠ   — | j                   j                  dd| j                  › �i¬«      }|D ]  }|j                  |k(  sŒ y y)NÚprojectz	projects/r¬   TF)r®   Úlist_topicsr}   ra   )r0   rb   ÚtopicsÚts       r1   r¯   zChannel._is_topic_exists  sO   € Ø—‘×+Ñ+Ø )¨D¯O©OÐ+<Ð =Ð>ð ,ó 
ˆó ˆAØ�v‰v˜Ó#Ùð ð r3   c                ó”  — |xs& | j                   j                  | j                  |«      }|xs | j                  j	                  ||«      }	 t
        j                  d|||«       |xs | j                  }| j                   j                  ||| j                  d| j                  › d�i|› d�dœ|xs i ¥¬«       |S # t        $ r Y |S w xY w)Nz0creating subscription: %s, topic: %s, filter: %sÚttlr«   )ra   ÚtopicÚack_deadline_secondsÚexpiration_policyr¤   r¬   )r˜   rd   r}   r®   rb   rw   r—   r™   Úcreate_subscriptionrº   r   )r0   r}   r±   rb   rd   r“   r”   s          r1   rž   zChannel._create_subscription#  sü   € ð ò LØ�‰×0Ñ0°·±À(ÓKð 	ð  ò 
 4§>¡>×#<Ñ#<Ø˜ó$
ˆ
ð	Ü�L‰LØBØ!ØØô	ð *ÒD¨T×-DÑ-DˆMØ�O‰O×/Ñ/à-Ø'Ø,0×,EÑ,Eà $×"9Ñ"9Ð!:¸!Ð<ð*ð 6C°OÀ1Ð2Eñ	ð #Ò( bð	ð 0ô ð !Ð øô ò 	ØØ Ð ð	ús   ÁA,B: Â:	CÃCc                ó  — | j                  |«      }t        j                  d|«       | j                  j	                  |«      }|sy| j
                  j                  d|j                  i¬«       | j                  j                  |d«       y)zDelete a queue by name.zdeleting queue: %sNÚsubscriptionr¬   )	r�   rw   rx   rp   r]   r˜   Údelete_subscriptionrd   r<   )r0   r¢   r…   r†   r¨   s        r1   Ú_deletezChannel._deleteK  sz   € à× Ñ  Ó'ˆÜ�‰Ð(¨%Ô0Ø×!Ñ!×%Ñ% eÓ,ˆÙØØ�‰×+Ñ+Ø# U×%<Ñ%<Ð=ð 	,ô 	
ð 	×Ñ×Ñ˜e TÕ*r3   c                ó.  — | j                  |«      }| j                  |   }| j                  |«      }t        j	                  d||j
                  |«       t        |«      }| j                  j                  |j
                  |j                  d«      |¬«       y)zPut a message onto the queue.z8putting message to queue: %s, topic: %s, routing_key: %súutf-8)r    N)
r�   rp   Ú_get_routing_keyrw   r—   rb   r!   r®   ÚpublishÚencode)r0   r¢   Úmessager†   r¨   r    Úencoded_messages          r1   Ú_putzChannel._putW  sŒ   € à× Ñ  Ó'ˆØ×!Ñ! %Ñ(ˆØ×+Ñ+¨GÓ4ˆÜ�‰ØFØØ×ÑØô		
ô   ›.ˆØ�‰×ÑØ×ÑØ×"Ñ" 7Ó+Ø#ð 	õ 	
r3   c                ó:  — | j                  ||«       | j                  j                  | j                  |«      }t        j                  d||«       t        |«      }| j                  j                  ||j                  d«      t        | j                  ¬«      ¬«       y)z#Put a message onto fanout exchange.z-putting msg to fanout exchange: %s, topic: %srÂ   ©Údeadline)ÚretryN)Ú_lookupr®   rb   r}   rw   r—   r!   rÄ   rÅ   r   Úretry_timeout_seconds)r0   rŸ   rÆ   r    r†   rb   rÇ   s          r1   Ú_put_fanoutzChannel._put_fanouti  s€   € à�‰�X˜{Ô+Ø—^‘^×.Ñ.¨t¯©ÀÓIˆ
Ü�‰Ø;ØØô	
ô
   ›.ˆØ�‰×ÑØØ×"Ñ" 7Ó+Ü ×!;Ñ!;Ô<ð 	õ 	
r3   c                ó&  — | j                  |«      }| j                  |   }	 | j                  j                  |j                  ddœt        | j                  ¬«      |xs | j                  ¬«      }t        |j                  «      dk(  r
t        «       ‚|j                  d   }|j                  }t        |j                  j                  «      }|d   d   }t         j#                  d|||d   «       | j%                  |d   «      r5t         j#                  d	|«       | j'                  |g|j                  «       |S |||j                  j(                  |j                  d
œ|d<   |j*                  j-                  |«       |S # t        $ r t        «       ‚w xY w)z(Retrieves a single message from a queue.r$   ©r¾   Úmax_messagesrÊ   ©r­   rÌ   r   r   Ú
propertiesÚdelivery_infoz-queue:%s got message, ack_id: %s, payload: %szauto acking message ack_id: %s©r¢   Úack_idÚ
message_idrd   Úgcpubsub_message)r�   rp   r˜   Úpullrd   r   rÎ   Úwait_time_secondsr   r
   rB   Úreceived_messagesr×   r"   rÆ   Údatarw   r—   Ú_is_auto_ackÚ_do_ackrØ   rf   r5   )	r0   r¢   r   r¨   ÚresponserÆ   r×   ÚpayloadrÕ   s	            r1   Ú_getzChannel._gety  sƒ  € à× Ñ  Ó'ˆØ×!Ñ! %Ñ(ˆð
	Ø—‘×+Ñ+à$)×$;Ñ$;Ø$%ñô  T×%?Ñ%?Ô@ØÒ9 4×#9Ñ#9ð ,ó ˆHô ˆx×)Ñ)Ó*¨aÒ/Ü“'ˆMà×,Ñ,¨QÑ/ˆØ—‘ˆÜ˜Ÿ™×,Ñ,Ó-ˆØ Ñ-¨oÑ>ˆÜ�‰Ø;ØØØ�LÑ!ô		
ð ×Ñ˜W \Ñ2Ô3Ü�L‰LÐ9¸6ÔBØ�L‰L˜&˜ 5×#:Ñ#:Ô;ð ˆð Ø Ø%Ÿo™o×8Ñ8Ø%*×%<Ñ%<ñ	1ˆMÐ,Ñ-ð ×Ñ×$Ñ$ VÔ,àˆøô9  ò 	Ü“'ˆMð	ús   ¢AE< Å<Fc                óN   — |d   d   }|d   }|t         k(  xs || j                  v S )NrÕ   rŸ   Údelivery_mode)r   r›   )r0   Úpayload_propertiesrŸ   rä   s       r1   rÞ   zChannel._is_auto_ack¤  s<   € Ø% oÑ6°zÑBˆØ*¨?Ñ;ˆàÔ4Ñ4ò 2Ø˜4×1Ñ1Ð1ð	
r3   c                ó¾  — | j                  |«      }| j                  |   }| j                  «       }|s
t        «       ‚	 | j                  j                  |j                  |dœt        | j                  ¬«      |xs | j                  ¬«      }|j                  }t        |«      dk(  r
t        «       ‚g }g }	t        j                  dt        |«      |«       |D ]¸  }
|
j                  }t!        t#        |
j$                  j&                  «      «      }|d   d   }|||
j$                  j(                  |j                  dœ|d	<   | j+                  |d   «      r|j-                  |«       n|j.                  j-                  |«       |	j-                  |«       Œº |r2t        j                  d
|«       | j1                  ||j                  «       ||	fS # t        $ r t        «       ‚w xY w)z(Retrieves bulk of messages from a queue.rÑ   rÊ   rÓ   r   z#batching %d messages from queue: %srÔ   rÕ   rÖ   rÙ   zauto acking ack_ids: %s)r�   rp   Ú_get_max_messages_estimater
   r˜   rÚ   rd   r   rÎ   rÛ   r   rÜ   rB   rw   r—   r×   r"   r   rÆ   rÝ   rØ   rÞ   r5   rf   rß   )r0   r¢   r   Úprefixed_queuer¨   rÒ   rà   rÜ   Úauto_ack_idsÚret_payloadsrÆ   r×   rá   rÕ   s                 r1   Ú	_get_bulkzChannel._get_bulk¬  sÆ  € à×)Ñ)¨%Ó0ˆØ×!Ñ! .Ñ1ˆØ×6Ñ6Ó8ˆÙÜ“'ˆMð
	Ø—‘×+Ñ+à$)×$;Ñ$;Ø$0ñô  T×%?Ñ%?Ô@ØÒ9 4×#9Ñ#9ð ,ó ˆHð %×6Ñ6ÐÜÐ Ó! QÒ&Ü“'ˆMàˆØˆÜ�‰Ø1ÜÐ!Ó"Øô	
ó
 )ˆGØ—^‘^ˆFÜœL¨¯©×)=Ñ)=Ó>Ó?ˆGØ# LÑ1°/ÑBˆMà'Ø Ø%Ÿo™o×8Ñ8Ø%*×%<Ñ%<ñ	1ˆMÐ,Ñ-ð × Ñ  ¨Ñ!6Ô7Ø×#Ñ# FÕ+à×!Ñ!×(Ñ(¨Ô0Ø×Ñ Õ(ð )ñ Ü�L‰LÐ2°LÔAØ�L‰L˜ u×'>Ñ'>Ô?à�lÐ"Ð"øôC  ò 	Ü“'ˆMð	ús   ¾AG ÇGc                óZ   — | j                   j                  «       }| j                  }|€|S |S r,   )ÚqosÚcan_consume_max_estimateÚbulk_max_messages)r0   Úmax_allowedÚmax_if_unlimiteds      r1   rç   z"Channel._get_max_messages_estimateß  s1   € Ø—h‘h×7Ñ7Ó9ˆØ×1Ñ1ÐØ#.Ð#6ÐÐG¸KÐGr3   c                ó:  •— | j                   j                  j                  |i «      }|st        ‰| �  |||«      S | j                  |«      j                  | j                  |«      |||«      }|r|S t        j                  d|«       | j                  |||«       |gS )Nz3no queues bound to exchange: %s, binding on the fly)ÚstateÚ	exchangesr]   ru   rÍ   r•   ÚlookupÚ	get_tablerw   r—   Ú
queue_bind)r0   rŸ   r    ÚdefaultÚexchange_infoÚretr‡   s         €r1   rÍ   zChannel._lookupä  s™   ø€ ØŸ
™
×,Ñ,×0Ñ0°¸2Ó>ˆÙÜ‘7‘? 8¨[¸'ÓBÐBØ�k‰k˜(Ó#×*Ñ*Ø�N‰N˜8Ó$ØØØó	
ˆñ ØˆJÜ�‰ØAØô	
ð 	�‰˜ (¨KÔ8ØˆzÐr3   c                ó–  — | j                  |«      }|| j                  vry| j                  |   }t        j                  | j                  | j
                  dt        j                  j                  «       d¬«      j                  |j                  ¬«      }t        t        «      5  t        d„ |D «       «      cddd«       S # 1 sw Y   yxY w)	zŠReturn the number of messages in a queue.

        This is a *rough* estimation, as Pub/Sub doesn't provide
        an exact API.
        r   z;pubsub.googleapis.com/subscription/num_undelivered_messagesr$   )Úend_timeÚminutes)rc   c              3  ób   K  — | ]'  }|j                   d    j                  j                  –— Œ) y­w)r   N)ÚpointsÚvalueÚint64_value)Ú.0Úcontents     r1   Ú	<genexpr>z Channel._size.<locals>.<genexpr>  s)   è ø€ ð ÙCI¸�—‘˜qÑ!×'Ñ'×3Õ3Á6ùs   ‚-/NrH   )r�   rp   r   ÚQueryÚmonitorr}   ÚdatetimeÚnowÚselect_resourcesrc   r   r   Úsum)r0   r¢   r¨   Úresults       r1   Ú_sizezChannel._size÷  s³   € ð × Ñ  Ó'ˆØ˜×)Ñ)Ñ)ØØ×!Ñ! %Ñ(ˆÜ—‘Ø�L‰LØ�O‰OØIÜ×&Ñ&×*Ñ*Ó,Øô
÷ Ñ
¨5×+@Ñ+@Ð
Ó
Að 	ô Ô&Õ'Üñ ÙCIóó ÷ (×'Ñ'ð ús   Â#B?Â?Cc                óX  •— |rt        d«      ‚| j                  j                  |«      j                  }|d   }|d   }|d   }t        j                  d||«       |d   }| j                  |g|«       | j                  |   }|j                  j                  |«       t        ‰	| �-  |«       y)zAcknowledge one message.zmultiple acks not implementedrÙ   r×   r¢   z!ack message. queue: %s ack_id: %srd   N)rœ   rí   r]   rÕ   rw   r—   rß   rp   rf   r@   ru   Ú	basic_ack)
r0   Údelivery_tagÚmultiplerÕ   Úpubsub_messager×   r¢   rd   r¨   r‡   s
            €r1   r  zChannel.basic_ack  s¨   ø€ áÜ%Ð&EÓFÐFàŸ™Ÿ™ \Ó2×@Ñ@ˆØ&Ð'9Ñ:ˆØ Ñ)ˆØ˜wÑ'ˆÜ�‰Ð8¸%ÀÔHØ*Ð+>Ñ?ÐØ�‰�f�XÐ0Ô1Ø×!Ñ! %Ñ(ˆØ×Ñ× Ñ  Ô(Ü‰Ñ˜,Õ'r3   c                ól   — | j                   j                  ||dœt        | j                  ¬«      ¬«       y )N)r¾   Úack_idsrÊ   )r­   rÌ   )r˜   Úacknowledger   rÎ   )r0   r  rd   s      r1   rß   zChannel._do_ack#  s/   € Ø�‰×#Ñ#Ø%6À7ÑKÜ ×!;Ñ!;Ô<ð 	$õ 	
r3   c                ó  — | j                  |«      }| j                  j                  |«      }|sy| j                  |«      }| j                  j                  |j                  t        j                  j                  «       dœ¬«       |S )z'Delete all current messages in a queue.N)r¾   Útimer¬   )	r�   rp   r]   r  r˜   Úseekrd   r  r  )r0   r¢   r¨   rV   s       r1   Ú_purgezChannel._purge)  sz   € à× Ñ  Ó'ˆØ×!Ñ!×%Ñ% eÓ,ˆÙØà�J‰J�uÓˆØ�‰×Ñà %× 7Ñ 7Ü ×)Ñ)×-Ñ-Ó/ñð 	ô 	
ð ˆr3   c           
     ó�  — t        j                  «       }t        j                  d|«       | j                  dz  }t        || j                  dz  «      }| j                  j                  |«      �s| j                  j                  «       D ]Í  }t        |j                  «      dk(  r"t        j                  d||j                  «       Œ=t        j                  d||j                  t        |j                  «      t        |j                  «      «       	 | j                   j#                  |j                  t        |j                  «      | j                  dœ¬«       ŒÏ | j                  j                  |«      s�Œt        j                  d|«       y # t$        $ r/}t        j'                  d	||j                  |d
¬«       Y d }~�Œ7d }~ww xY w)Nz/unacked deadline extension thread: [%s] startedé   é   r   z'thread [%s]: no unacked messages for %sz5thread [%s]: extend ack deadline for %s: %d msgs [%s])r¾   r  rº   r¬   z5thread [%s]: failed to extend ack deadline for %s: %sT)Úexc_infoz.unacked deadline extension thread [%s] stopped)r   Úget_native_idrw   rx   Ú_min_ack_deadlineÚmaxrº   r‚   r   rp   ÚvaluesrB   rf   r—   rd   rG   r˜   Úmodify_ack_deadlineÚ	ExceptionÚerror)r0   Ú	thread_idÚmin_deadline_sleepÚ
sleep_timer¨   Úexcs         r1   r�   z Channel._extend_unacked_deadline9  sŒ  € Ü×+Ñ+Ó-ˆ	Ü�‰Ø=Øô	
ð "×3Ñ3°aÑ7ÐÜÐ+¨T×-FÑ-FÈÑ-JÓKˆ
Ø×%Ñ%×*Ñ*¨:Õ6Ø×*Ñ*×1Ñ1Ö3�Ü�u×(Ñ(Ó)¨QÒ.Ü—L‘LØAØ!Ø×/Ñ/ôð
 Ü—‘ØKØØ×+Ñ+Ü˜×)Ñ)Ó*Ü˜×*Ñ*Ó+ôðØ—O‘O×7Ñ7à,1×,CÑ,CÜ'+¨E×,=Ñ,=Ó'>Ø48×4MÑ4Mñ!ð 8õ ð! 4ð ×%Ñ%×*Ñ*¨:Ö6ô@ 	�‰Ø<¸iõ	
øô !ò Ü—L‘LØOØ!Ø×/Ñ/ØØ!%ð !÷ ò ûðús   ÄAFÆ	GÆ$G Ç Gc                óÖ   — | j                  |«      }| j                  j                  | j                  |«      }t        j                  d||«       | j                  j                  |«       y )Nz0after_reply_message_received: queue: %s, sub: %s)r�   r˜   rd   r}   rw   r—   rq   rš   )r0   r¢   Úsubs      r1   Úafter_reply_message_receivedz$Channel.after_reply_message_receivede  sU   € Ø× Ñ  Ó'ˆØ�o‰o×/Ñ/°·±ÀÓGˆÜ�‰Ø>ÀÀsô	
ð 	×Ñ×#Ñ# CÕ(r3   c                ó   — t        «       S r,   )r   r/   s    r1   r˜   zChannel.subscriberm  s   € äÓ!Ð!r3   c                ó   — t        «       S r,   )r   r/   s    r1   r®   zChannel.publisherq  s   € äÓ Ð r3   c                ó*   — t        j                  «       S r,   )r   ÚMetricServiceClientr/   s    r1   r  zChannel.monitoru  s   € ä×0Ñ0Ó2Ð2r3   c                ó.   — | j                   j                  S r,   )Ú
connectionÚclientr/   s    r1   ry   zChannel.conninfoy  s   € à�‰×%Ñ%Ð%r3   c                óB   — | j                   j                  j                  S r,   )r0  r1  Útransport_optionsr/   s    r1   r3  zChannel.transport_options}  s   € à�‰×%Ñ%×7Ñ7Ð7r3   c                óN   — | j                   j                  d| j                  «      S )NrÛ   )r3  r]   Údefault_wait_time_secondsr/   s    r1   rÛ   zChannel.wait_time_seconds�  ó&   € à×%Ñ%×)Ñ)Ø ×!?Ñ!?ó
ð 	
r3   c                óN   — | j                   j                  d| j                  «      S )NrÎ   )r3  r]   Údefault_retry_timeout_secondsr/   s    r1   rÎ   zChannel.retry_timeout_seconds‡  s&   € à×%Ñ%×)Ñ)Ø# T×%GÑ%Gó
ð 	
r3   c                óN   — | j                   j                  d| j                  «      S )Nrº   )r3  r]   Údefault_ack_deadline_secondsr/   s    r1   rº   zChannel.ack_deadline_seconds�  s&   € à×%Ñ%×)Ñ)Ø" D×$EÑ$Eó
ð 	
r3   c                ó:   — | j                   j                  dd«      S )NrŠ   zkombu-)r3  r]   r/   s    r1   rŠ   zChannel.queue_name_prefix“  s   € à×%Ñ%×)Ñ)Ð*=¸xÓHÐHr3   c                óN   — | j                   j                  d| j                  «      S )Nr™   )r3  r]   Údefault_expiration_secondsr/   s    r1   r™   zChannel.expiration_seconds—  s&   € à×%Ñ%×)Ñ)Ø  $×"AÑ"Aó
ð 	
r3   c                óN   — | j                   j                  d| j                  «      S )Nrï   )r3  r]   Údefault_bulk_max_messagesr/   s    r1   rï   zChannel.bulk_max_messages�  r6  r3   c                ó  •— t         j                  d«       | j                  rs| j                  j                  «       }t	        t
        «      5  t         j                  d|«       | j                  j                  d|i¬«       ddd«       | j                  rŒs| j                  j                  «       s8| j                  j                  «        t        j                  j                  «        t        ‰| �A  «        y# 1 sw Y   ŒwxY w)zClose the channel.zclosing channelzdeleting subscription: %sr¾   r¬   N)rw   r—   rq   r<   r   r"  r˜   r¿   r~   r[   r‚   Úsetrk   ro   Újoinru   Úclose)r0   r)  r‡   s     €r1   rC  zChannel.close£  s½   ø€ ä�‰Ð&Ô'Ø×%Ò%Ø×)Ñ)×-Ñ-Ó/ˆCÜœ)Õ$Ü—‘Ð8¸#Ô>Ø—‘×3Ñ3Ø+¨SÐ1ð 4ô ÷ %ð ×%Ó%ð ×Ñ×#Ñ#Ô%Ø×Ñ×#Ñ#Ô%Ü×%Ñ%×*Ñ*Ô,Ü‰‰�÷ %Ð$ús   Á5C7Ã7D c                óP   — | d   j                  di «      j                  dd«      }|S )NrÔ   rÕ   r    Ú )r]   )rÆ   r    s     r1   rÃ   zChannel._get_routing_key²  s1   € ð �LÑ!ß‰S� "Ó%ß‰S� Ó#ð 	ð
 Ðr3   )ra   r`   Úreturnr`   r,   )r}   r`   r±   r`   r¤   ÚintrF  r`   )rb   r`   rF  Úbool)NNNNNN)r}   r`   r±   r`   rb   r`   rd   r`   r”   rG  rF  r`   )r¢   r`   r   Úfloat)rå   Údict)rF  rG  )r¢   r`   rF  rG  )F)r  z	list[str]rd   r`   )r¢   r`   )=rI   rJ   rK   rL   Úsupports_fanoutÚ
do_restorer5  r:  r=  r8  r?  r  rA  r›   ro   rg   r   ÚEventr‚   rO   r~   rp   rq   r2   ÚCHARS_REPLACE_TABLEr�   r©   r�   r¯   rž   rÀ   rÈ   rÏ   râ   rÞ   rë   rç   rÍ   r  r  rß   r  r�   r*  r#   r˜   r®   r  Úpropertyry   r3  rÛ   rÎ   rº   rŠ   r™   rï   rC  ÚstaticmethodrÃ   Ú__classcell__©r‡   s   @r1   rk   rk   ›   sT  ø… Ùà€OØ€JØ "ÐØ#&Ð Ø!&ÐØ$'Ð!Ø "ÐàÐÙ›ÐØ*.ÐÐ'Ó.Ø$�Y—_‘_Ó&€NÙ“/€KØ/1€LÐ,Ó1Ù#&£5Ð˜Ó(ô.ð ,?ô 4ò=)ðF +/ð	àðð ðð %(ð	ð
 
óó0ð ØØØ!%ØØ!ð&!àð&!ð ð&!ð ð	&!ð
 ð&!ð ð&!ð 
ó&!òP
+ò
ò$
ô )óV
ó1#ófHõ
ó&õ8(ó 
óò *
óX)ð ñ"ó ð"ð ñ!ó ð!ð ñ3ó ð3ð ñ&ó ð&ð ñ8ó ð8ð ñ
ó ð
ð
 ñ
ó ð
ð
 ñ
ó ð
ð
 ñIó ðIð ñ
ó ð
ð
 ñ
ó ð
ô
ð ñó ôr3   rk   c                  óÜ  ‡ — e Zd ZdZeZdZdZej                  j                  e
j                  fz   Z	ej                  j                  ej                  ej                  ej                   ej                  ej"                  fz   ej&                  fz   ZdZdZej                  j,                  j/                   eddg«      ¬«      Zˆ fd	„Zd
„ Zedd„«       Zeddd„«       Zdd„Zd„ Z d„ Z!d„ Z"ˆ xZ#S )r{   zGCP Pub/Sub transport.Tgš™™™™™¹?ÚgcpubsubÚ	pubsub_v1r�   r’   )r£   c                ób   •— t        ‰| �  |fi |¤Ž t        «       | _        t	        «       | _        y r,   )ru   r2   r   Ú_poolrJ  Ú_get_bulk_future_to_queue)r0   r1  r†   r‡   s      €r1   r2   zTransport.__init__Ù  s)   ø€ Ü‰Ñ˜Ñ* 6Ò*Ü'Ó)ˆŒ
Ü<@»FˆÕ&r3   c                ó"   — t         j                  S r,   )Úpackage_versionÚ__version__r/   s    r1   Údriver_versionzTransport.driver_versionÞ  s   € Ü×*Ñ*Ð*r3   c                óL   — | j                  d«      d   }|j                  d«      S )Nzgcpubsub://projects/r$   Ú/)ÚsplitÚstrip)Úurir³   s     r1   r|   zTransport.parse_uriá  s'   € ð
 —)‘)Ð2Ó3°AÑ6ˆØ�}‰}˜SÓ!Ð!r3   c                ó   — |xs dS )Nzgcpubsub://rM   )r0   ra  Úinclude_passwordÚmasks       r1   Úas_urizTransport.as_urié  s   € àÒ#�mÐ#r3   c                óà   — t        «       }| j                  }|r	|r||kD  r|}	 	 | j                  |¬«       y # t        $ r, |rt        «       |z
  |k\  r
t	        «       ‚|rt        |«       Y nw xY wŒM)Nr   )r   Úpolling_intervalÚ_drain_from_active_queuesr
   Úsocket_timeoutr   )r0   r0  r   Ú
time_startrg  s        r1   Údrain_eventszTransport.drain_eventsí  s„   € Ü“[ˆ
Ø×0Ñ0ÐÙÑ'Ð,<¸wÒ,FØ&ÐØðØ×.Ñ.°wÐ.Ô?ð øô ò ,Ùœy›{¨ZÑ7¸7ÒBÜ(Ó*Ð*Ù#ÜÐ*Ô+ùð	,úð s   ¤7 ·2A,Á+A,c                óŠ  — | j                  «        | j                  d¬«       t        | j                  |t        ¬«      \  }}|D �ch c]  }|j                  «       sŒ|’Œ }}||z  }|D ]  }| j                  j                  |d «       Œ  |s
t        «       ‚t        j                  dt        |«      «       |D ]…  }|j                  «       \  }}|D ]O  }t        j                  d|«       || j                  vrt        j                  d|«       Œ>| j                  ||«       ŒQ | j                  j                  |d «       Œ‡ y c c}w )Nrl   r   )r   Úreturn_whenzgot %d done get_bulk tasksz consuming message from queue: %sz&Message for queue %s without consumers)Ú_rm_empty_bulk_requestsÚ_submit_get_bulk_requestsr   rX  r   Ú	exceptionr<   r
   rw   r—   rB   r  Ú
_callbacksÚwarningÚ_deliver)	r0   r   Údoner(   ÚfÚemptyr¢   Úpayloadsrá   s	            r1   rh  z#Transport._drain_from_active_queuesý  s#  € à×$Ñ$Ô&ð
 	×&Ñ&¨rÐ&Ô2äØ×*Ñ*ØÜ'ô
‰ˆˆañ
 !Ó2™D�q A§K¡K¥M’˜DˆÐ2Ø�‰ˆÛˆAØ×*Ñ*×.Ñ.¨q°$Õ7ð ñ Ü“'ˆMä�‰Ð1´3°t³9Ô=ÛˆAØŸh™h›j‰OˆE�8Û#�Ü—‘Ð?ÀÔGØ §¡Ñ/Ü—N‘NØ@À%ôð Ø—‘˜g uÕ-ð $ð ×*Ñ*×.Ñ.¨q°$Õ7ñ ùò 3s   ÁE ÁE c                óÆ   — | j                   D �ch c]$  }|j                  «       r|j                  «       r|’Œ& }}|D ]  }| j                   j                  |d «       Œ  y c c}w r,   )rX  rt  rp  r<   )r0   ru  rv  s      r1   rn  z!Transport._rm_empty_bulk_requests   sb   € ð ×3Ò3ó
á3�Ø�v‰vŒx˜AŸK™KœMò Ø3ð 	ð 
ó
 ˆAØ×*Ñ*×.Ñ.¨q°$Õ7ñ ùò
s   �)Ac                ó  — t        | j                  j                  «       «      }| j                  D ]N  }|j                  D ]=  }||v rŒ| j
                  j                  |j                  ||«      }|| j                  |<   Œ? ŒP y r,   )rA  rX  r   ÚchannelsÚ_active_queuesrW  Úsubmitrë   )r0   r   Úqueues_with_submitted_get_bulkÚchannelr¢   Úfutures         r1   ro  z#Transport._submit_get_bulk_requests)  sy   € Ü),Ø×*Ñ*×1Ñ1Ó3ó*
Ð&ð —}”}ˆGØ ×/Ô/�ØÐ:Ñ:ØØŸ™×*Ñ*¨7×+<Ñ+<¸eÀWÓM�Ø9>�×.Ñ.¨vÒ6ñ	 0ñ %r3   )ra  r`   rF  r`   )Fz**r,   )$rI   rJ   rK   rL   rk   Úcan_parse_urlrg  r%   r{   Úconnection_errorsÚpubsub_exceptionsÚTimeoutErrorÚchannel_errorsÚpublisher_exceptionsÚFlowControlLimitErrorÚMessageTooLargeErrorÚPublishErrorÚ#PublishToPausedOrderingKeyExceptionÚsubscriber_exceptionsÚAcknowledgeErrorÚdriver_typeÚdriver_nameÚ
implementsr9   Ú	frozensetr2   r\  rP  r|   Úclassmethodre  rk  rh  rn  ro  rQ  rR  s   @r1   r{   r{   ¼  s  ø„ Ù à€Gà€MØÐØ×)Ñ)×;Ñ;Ø×&Ñ&ð?ñ Ðð 	×Ñ×(Ñ(à ×6Ñ6Ø ×5Ñ5Ø ×-Ñ-Ø ×-Ñ-Ø ×DÑDð
ñ	
ð !×1Ñ1Ð
3ñ	4ð ð €KØ€Kà×"Ñ"×-Ñ-×4Ñ4Ù ¨8Ð 4Ó5ð 5ó €JôCò
+ð ò"ó ð"ð ó$ó ð$óò !8òF8ö
?r3   r{   )MrL   Ú
__future__r   rh   r  Ústringr   Úconcurrent.futuresr   r   r   r   Ú
contextlibr   Úosr	   r¢   r
   r   r  r   r   Úuuidr   r   Ú_socketr   r   ri  Úgoogle.api_core.exceptionsr   r   r   Úgoogle.api_core.retryr   Úgoogle.cloudr   Úgoogle.cloud.monitoring_v3r   Úgoogle.cloud.pubsub_v1r   r   r   r‚  Ú google.cloud.pubsub_v1.publisherr…  Ú!google.cloud.pubsub_v1.subscriberrŠ  Úgoogle.pubsub_v1r   rZ  Úkombu.entityr   Ú	kombu.logr   Úkombu.utils.encodingr   r    Úkombu.utils.jsonr!   r"   Úkombu.utils.objectsr#   rE  r%   rw   rA  ÚpunctuationÚPUNCTUATIONS_TO_REPLACEÚordrN  r*   rO   Ú	dataclassr_   rk   r{   )Úcs   0r1   Ú<module>rª     s6  ðñ%õN #ã Û Û Û ÷&ó &å Ý Ý Ý ß !ß %å Ý -÷:ñ :å 'Ý &Ý ,ß DÝ BÝ Oõ(å =å 0Ý  ß 7ß )Ý /å á	Ð.Ó	/€ñ ˜f×0Ñ0Ó1²OÑCÐ áˆƒH‰c�#‹hðá!8Ó9Ñ!8˜A�sˆ1ƒv‰s�3‹xÑÐ!8Ñ9ðÐ ÷ ñ  ÷@ñ ð2 ×Ñ÷Lð Ló ðLô^ˆg�o‰oô ^ôBw?�×!Ñ!õ w?ùòS :s   Ã/E!