Ë
    >ØïiFÑ  ã                   óô  — d Z ddlZddlZddlZddlZddlZddlZddlZddlZddl	Z	ddl
Z
ddlmZmZ ddlZddlZej"                  ej$                  fZej(                  ej$                  fZ ej,                  e«      Zej2                  j5                  e«      Zd„ Zd„ Zd„ Z G d„ de«      Z  G d	„ d
e«      Z! G d„ de«      Z" G d„ de«      Z# G d„ de«      Z$ G d„ de«      Z% G d„ de%«      Z& G d„ de%«      Z'y)z^Utilities for implementing `nbio_interface.AbstractIOServices` for
pika connection adapters.

é    N)ÚAbstractIOReferenceÚAbstractStreamTransportc                 óP   — t        | «      st        dj                  || «      «      ‚y)z£Raise TypeError if callback is not callable

    :param callback: callback to check
    :param name: Name to include in exception text
    :raises TypeError:

    z!{} must be callable, but got {!r}N)ÚcallableÚ	TypeErrorÚformat)ÚcallbackÚnames     ú_/var/www/html/aiagents/fe/lib/python3.12/site-packages/pika/adapters/utils/io_services_utils.pyÚcheck_callback_argr   ,   s1   € ô �HÔÜÐ;×BÑBØ�(óó ð 	ð ó    c                 ól   — t        | t        j                  «      st        dj	                  | «      «      ‚y)zqRaise TypeError if file descriptor is not an integer

    :param fd: file descriptor
    :raises TypeError:

    z0Paramter must be a file descriptor, but got {!r}N)Ú
isinstanceÚnumbersÚIntegralr   r   )Úfds    r   Úcheck_fd_argr   9   s6   € ô �bœ'×*Ñ*Ô+ÜØ>×EÑEÀbÓIóKð 	Kð ,r   c                 óB   ‡ — t        j                  ‰ «      ˆ fd„«       }|S )z0Function decorator for retrying on SIGINT.

    c                  ó¨   •— 	 	  ‰| i |¤ŽS # t         j                  j                  $ r(}|j                  t        j                  k(  rY d}~ŒI‚ d}~ww xY w)zWrapper for decorated functionN)ÚpikaÚcompatÚSOCKET_ERRORÚerrnoÚEINTR)ÚargsÚkwargsÚerrorÚfuncs      €r   Úretry_sigint_wrapz+_retry_on_sigint.<locals>.retry_sigint_wrapJ   sM   ø€ ð ðÙ˜TÐ, VÑ,Ð,øÜ—;‘;×+Ñ+ò Ø—;‘;¤%§+¡+Ò-Üàûð	ús   „ ŒA©AÁAÁA)Ú	functoolsÚwraps)r   r   s   ` r   Ú_retry_on_sigintr"   E   s(   ø€ ô
 ‡_�_�TÓó	ó ð	ð Ðr   c                   ó   — e Zd ZdZd„ Zy)ÚSocketConnectionMixinzúImplements
    `pika.adapters.utils.nbio_interface.AbstractIOServices.connect_socket()`
    on top of
    `pika.adapters.utils.nbio_interface.AbstractFileDescriptorServices` and
    basic `pika.adapters.utils.nbio_interface.AbstractIOServices`.

    c                 ó<   — t        | |||¬«      j                  «       S )z[Implement
        :py:meth:`.nbio_interface.AbstractIOServices.connect_socket()`.

        )ÚnbioÚsockÚresolved_addrÚon_done)Ú_AsyncSocketConnectorÚstart)Úselfr'   r(   r)   s       r   Úconnect_socketz$SocketConnectionMixin.connect_socketb   s"   € ô
 %Ø˜D°Øôç"™U›Wð	%r   N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r-   © r   r   r$   r$   Y   s   „ ñó%r   r$   c                   ó   — e Zd ZdZ	 	 dd„Zy)ÚStreamingConnectionMixinzÒImplements
    `.nbio_interface.AbstractIOServices.create_streaming_connection()` on
    top of `.nbio_interface.AbstractFileDescriptorServices` and basic
    `nbio_interface.AbstractIOServices` services.

    Nc                 ó  — 	 t        | |||||¬«      j                  «       S # t        $ r[}t        j	                  d||«       	 |j                  «        ‚ # t        $ r!}t        j	                  d||«       Y d}~‚ d}~ww xY wd}~ww xY w)zhImplement
        :py:meth:`.nbio_interface.AbstractIOServices.create_streaming_connection()`.

        )r&   Úprotocol_factoryr'   Ússl_contextÚserver_hostnamer)   z*create_streaming_connection(%s) failed: %rz%s.close() failed: %rN)Ú_AsyncStreamConnectorr+   Ú	ExceptionÚ_LOGGERr   Úclose)r,   r6   r'   r)   r7   r8   r   s          r   Úcreate_streaming_connectionz4StreamingConnectionMixin.create_streaming_connectiont   s•   € ð	Ü(ØØ!1ØØ'Ø /Øô!÷ "'¡£ð)øô ò 	Ü�M‰MÐFÈØô!ðDØ—
‘
”ð øô ò Dô —‘Ð5°t¸U×CÐCàûðDþð	ús>   ‚! ¡	BªB ÁAÁB Á	A=ÁA8Á3B Á8A=Á=B Â B)NN)r.   r/   r0   r1   r=   r2   r   r   r4   r4   l   s   „ ñð 15Ø48ôr   r4   c                   ó   — e Zd ZdZd„ Zd„ Zy)Ú_AsyncServiceAsyncHandlezGThis module's adaptation of `.nbio_interface.AbstractIOReference`

    c                 ó&   — |j                   | _        y)zZ
        :param subject: subject of the reference containing a `cancel()` method

        N)ÚcancelÚ_cancel)r,   Úsubjects     r   Ú__init__z!_AsyncServiceAsyncHandle.__init__š   s   € ð
 —~‘~ˆ�r   c                 ó"   — | j                  «       S )z�Cancel pending operation

        :returns: False if was already done or cancelled; True otherwise
        :rtype: bool

        )rB   ©r,   s    r   rA   z_AsyncServiceAsyncHandle.cancel¡   s   € ð �|‰|‹~Ðr   N)r.   r/   r0   r1   rD   rA   r2   r   r   r?   r?   •   s   „ ñò&ór   r?   c                   ór   — e Zd ZdZdZdZdZdZd„ Ze	d„ «       Z
d„ Zd	„ Ze	d
„ «       Ze	d„ «       Ze	d„ «       Zy)r*   zúConnects the given non-blocking socket asynchronously using
    `.nbio_interface.AbstractFileDescriptorServices` and basic
    `.nbio_interface.AbstractIOServices`. Used for implementing
    `.nbio_interface.AbstractIOServices.connect_socket()`.
    r   é   é   é   c                 óª  — t        |d«       	 t        j                  |j                  |d   «       || _        || _        || _        || _        | j                  | _        d| _        y# t        $ rc}t        t        d«      st        j                  d«       n3dj                  |||«      }t        j                  |«       t        |«      ‚Y d}~Œœd}~ww xY w)a  
        :param AbstractIOServices | AbstractFileDescriptorServices nbio:
        :param socket.socket sock: non-blocking socket that needs to be
            connected via `socket.socket.connect()`
        :param tuple resolved_addr: resolved destination address/port two-tuple
            which is compatible with the given's socket's address family
        :param callable on_done: user callback that takes None upon successful
            completion or exception upon error (check for `BaseException`) as
            its only arg. It will not be called if the operation was cancelled.
        :raises ValueError: if host portion of `resolved_addr` is not an IP
            address or is inconsistent with the socket's address family as
            validated via `socket.inet_pton()`
        r)   r   Ú	inet_ptonz8Unable to check resolved address: no socket.inet_pton().z9Invalid or unresolved IP address {!r} for socket {}: {!r}NF)r   ÚsocketrL   Úfamilyr:   Úhasattrr;   Údebugr   r   Ú
ValueErrorÚ_nbioÚ_sockÚ_addrÚ_on_doneÚ_STATE_NOT_STARTEDÚ_stateÚ_watching_socket_events)r,   r&   r'   r(   r)   r   Úmsgs          r   rD   z_AsyncSocketConnector.__init__·   sÄ   € ô 	˜7 IÔ.ð	&Ü×Ñ˜TŸ[™[¨-¸Ñ*:Ô;ð ˆŒ
ØˆŒ
Ø"ˆŒ
ØˆŒØ×-Ñ-ˆŒØ',ˆÕ$øô! ò 		&Üœ6 ;Ô/Ü—‘ØNõPð2ß39±6Ø(¨$°ó47ð ô —‘˜cÔ"Ü  “oÐ%ôPûð		&ús   Ž#A& Á&	CÁ/ACÃCc                 ó’   — | j                   r;d| _         | j                  j                  | j                  j	                  «       «       yy)z'Remove socket watcher, if any

        FN)rX   rR   Úremove_writerrS   ÚfilenorF   s    r   Ú_cleanupz_AsyncSocketConnector._cleanupÛ   s9   € ð
 ×'Ò'Ø+0ˆDÔ(Ø�J‰J×$Ñ$ T§Z¡Z×%6Ñ%6Ó%8Õ9ð (r   c                 óÜ   — | j                   | j                  k(  sJ d| j                   f«       ‚| j                  | _         | j                  j	                  | j
                  «       t        | «      S )zZStart asynchronous connection establishment.

        :rtype: AbstractIOReference
        z:_AsyncSocketConnector.start(): expected _STATE_NOT_STARTED)rW   rV   Ú_STATE_ACTIVErR   Úadd_callback_threadsafeÚ_start_asyncr?   rF   s    r   r+   z_AsyncSocketConnector.startä   sf   € ð
 �{‰{˜d×5Ñ5Ò5ð 	ØHØ�K‰Kð8ó 	Ð5ð ×(Ñ(ˆŒð 	�
‰
×*Ñ*¨4×+<Ñ+<Ô=ä'¨Ó-Ð-r   c                 ó&  — | j                   | j                  k(  rM| j                  | _         t        j	                  d| j
                  | j                  «       | j                  «        yt        j	                  d| j                   | j
                  «       y)ú¾Cancel pending connection request without calling user's completion
        callback.

        :returns: False if was already done or cancelled; True otherwise
        :rtype: bool

        z-User canceled connection request for %s to %sTzD_AsyncSocketConnector cancel requested when not ACTIVE: state=%s; %sF)rW   r_   Ú_STATE_CANCELEDr;   rP   rS   rT   r]   rF   s    r   rA   z_AsyncSocketConnector.cancelõ   sn   € ð �;‰;˜$×,Ñ,Ò,Ø×.Ñ.ˆDŒKÜ�M‰MÐIØŸ*™* d§j¡jô2à�M‰MŒOØä�‰ðØ ŸK™K¨¯©ô	5ð r   c                 óJ  — t         j                  d|| j                  «       t        |t        t        d«      f«      s	J d|f«       ‚| j                  | j                  k(  sJ d| j                  f«       ‚| j                  | _        | j                  «        | j                  |«       y)z¹Advance to COMPLETED state, remove socket watcher, and invoke user's
        completion callback.

        :param BaseException | None result: value to pass in user's callback

        z0_AsyncSocketConnector._report_completion(%r); %sNzP_AsyncSocketConnector._report_completion() expected exception or None as result.zF_AsyncSocketConnector._report_completion() expected _STATE_NOT_STARTED)r;   rP   rS   r   ÚBaseExceptionÚtyperW   r_   Ú_STATE_COMPLETEDr]   rU   ©r,   Úresults     r   Ú_report_completionz(_AsyncSocketConnector._report_completion	  s¢   € ô 	�‰ÐHØ˜dŸj™jô	*ô ˜&¤=´$°t³*Ð"=Ô>ð 	'ðØ%ðA'ó 	'Ð>ð �{‰{˜d×0Ñ0Ò0ð 	/ð!Ø"&§+¡+ð3/ó 	/Ð0ð ×+Ñ+ˆŒØ�‰Œà�‰�fÕr   c                 ó   — | j                   | j                  k7  r7t        j                  d| j                  | j
                  | j                   «       y	 | j                  j                  | j
                  «       	 | j                   j#                  | j                  j%                  «       | j&                  «       d| _        t        j                  d| j                  «       y# t        t        j                  j                  f$ r„}t        |t        j                  j                  «      r|j                  t        v rnBt        j                  d| j                  | j
                  |«       | j                  |«       Y d}~yY d}~�Œ	d}~ww xY w# t        $ r<}t        j+                  d| j                  |«       | j                  |«       Y d}~yd}~ww xY w)z“Called as callback from I/O loop to kick-start the workflow, so it's
        safe to call user's completion callback from here, if needed

        zJAbandoning sock=%s connection establishment to %s due to inactive state=%sNz%s.connect(%s) failed: %rTz/Connection-establishment is in progress for %s.zasync.set_writer(%s) failed: %r)rW   r_   r;   rP   rS   rT   Úconnectr:   r   r   r   r   r   Ú(_CONNECTION_IN_PROGRESS_SOCK_ERROR_CODESr   rk   rR   Ú
set_writerr\   Ú_on_writablerX   Ú	exception©r,   r   s     r   ra   z"_AsyncSocketConnector._start_async   s\  € ð �;‰;˜$×,Ñ,Ò,ä�M‰Mð+Ø,0¯J©J¸¿
¹
ÀDÇKÁKôQð ð	Ø�J‰J×Ñ˜tŸz™zÔ*ð
	&Ø�J‰J×!Ñ! $§*¡*×"3Ñ"3Ó"5°t×7HÑ7HÔIð ,0ˆDÔ(Ü�M‰MÐKØŸ*™*õ&øô+ œ4Ÿ;™;×3Ñ3Ð4ò 		Ü˜5¤$§+¡+×":Ñ":Ô;Ø—K‘KÔ#KÑKàä—‘Ð9¸4¿:¹:Ø"Ÿj™j¨%ô1à×'Ñ'¨Ô.Üõ ûð			ûô ò 	Ü×ÑÐ?ÀÇÁØ#ô%à×#Ñ# EÔ*Üûð		ús1   Á%C Á8>F Ã#FÄA4F Æ FÆ	GÆ2GÇGc                 ó  — | j                   | j                  k7  r,t        j                  d| j                  | j                   «       y| j                  j                  t        j                  t        j                  «      }|s#t        j                  d| j                  «       d}nWt        j                  |«      }t        j                  d| j                  ||«       t        j                  j                  ||«      }| j                  |«       y)zwCalled when socket connects or fails to. Check for predicament and
        invoke user's completion callback.

        z_Socket connection-establishment event watcher called in inactive state (ignoring): %s; state=%sNzSocket connected: %sz+Socket failed to connect: %s; error=%s (%s))rW   r_   r;   r   rS   Ú
getsockoptrM   Ú
SOL_SOCKETÚSO_ERRORÚinfoÚosÚstrerrorr   r   r   rk   )r,   Ú
error_coderj   Ú	error_msgs       r   rp   z"_AsyncSocketConnector._on_writableG  sÆ   € ð �;‰;˜$×,Ñ,Ò,ô �M‰MðDØEIÇZÁZØ—‘ôð ð —Z‘Z×*Ñ*¬6×+<Ñ+<¼f¿o¹oÓNˆ
ÙÜ�L‰LÐ/°·±Ô<Ø‰FäŸ™ JÓ/ˆIÜ�M‰MÐGØŸ*™* j°)ô=ä—[‘[×-Ñ-¨j¸)ÓDˆFà×Ñ Õ'r   N)r.   r/   r0   r1   rV   r_   rd   rh   rD   Ú_log_exceptionsr]   r+   rA   rk   ra   rp   r2   r   r   r*   r*   «   s€   „ ñð ÐØ€MØ€OØÐò"-ðH ñ:ó ð:ò.ò"ð( ñó ðð, ñ$&ó ð$&ðL ñ(ó ñ(r   r*   c                   ó‚   — e Zd ZdZdZdZdZdZd„ Ze	d„ «       Z
d„ Zd	„ Ze	d
„ «       Ze	d„ «       Ze	d„ «       Ze	d„ «       Zy)r9   zùPerforms asynchronous SSL session establishment, if requested, on the
    already-connected socket and links the streaming transport to protocol.
    Used for implementing
    `.nbio_interface.AbstractIOServices.create_streaming_connection()`.

    r   rH   rI   rJ   c                 óÎ  — t        |d«       t        |d«       t        |t        d«      t        j                  f«      st        dj                  |«      «      ‚|�|€t        d«      ‚	 |j                  «        || _	        || _
        || _        || _        || _        || _        | j                  | _        d| _        y# t        $ r }t        dj                  ||«      «      ‚d}~ww xY w)a  
        NOTE: We take ownership of the given socket upon successful completion
        of the constructor.

        See `AbstractIOServices.create_streaming_connection()` for detailed
        documentation of the corresponding args.

        :param AbstractIOServices | AbstractFileDescriptorServices nbio:
        :param callable protocol_factory:
        :param socket.socket sock:
        :param ssl.SSLContext | None ssl_context:
        :param str | None server_hostname:
        :param callable on_done:

        r6   r)   Nz8Expected ssl_context=None | ssl.SSLContext, but got {!r}z?Non-None server_hostname must not be passed without ssl contextzEExpected connected socket, but getpeername() failed: error={!r}; {}; F)r   r   rg   ÚsslÚ
SSLContextrQ   r   Úgetpeernamer:   rR   Ú_protocol_factoryrS   Ú_ssl_contextÚ_server_hostnamerU   rV   rW   Ú_watching_socket)r,   r&   r6   r'   r7   r8   r)   r   s           r   rD   z_AsyncStreamConnector.__init__p  sñ   € ô" 	Ð+Ð-?Ô@Ü˜7 IÔ.ä˜+¬¨T«
´C·N±NÐ'CÔDÜð (ß(.©¨{Ó(;ó=ð =ð Ð&¨;Ð+>Üð 3ó 4ð 4ð	8Ø×ÑÔð ˆŒ
Ø!1ˆÔØˆŒ
Ø'ˆÔØ /ˆÔØˆŒà×-Ñ-ˆŒØ %ˆÕøô ò 	8Üð#ß#)¡6¨%°Ó#6ó8ð 8ûð	8ús   Á(B; Â;	C$ÃCÃC$c                 óú  — t         j                  d|«       | j                  rŽt         j                  d|| j                  «       d| _        | j                  j                  | j                  j                  «       «       | j                  j                  | j                  j                  «       «       	 |r<t         j                  d|| j                  «       	 | j                  j                  «        d| _        d| _        d| _        d| _        d| _        d| _        y# t        $ r'}t         j                  d|| j                  «       ‚ d}~ww xY w# d| _        d| _        d| _        d| _        d| _        d| _        w xY w)zeCancel pending async operations, if any

        :param bool close: close the socket if true
        z"_AsyncStreamConnector._cleanup(%r)z5_AsyncStreamConnector._cleanup(%r): removing RdWr; %sFz6_AsyncStreamConnector._cleanup(%r): closing socket; %sz"_sock.close() failed: error=%r; %sN)r;   rP   r…   rS   rR   Úremove_readerr\   r[   r<   r:   rq   r‚   rƒ   r„   rU   )r,   r<   r   s      r   r]   z_AsyncStreamConnector._cleanup   s?  € ô 	�‰Ð:¸EÔBà× Ò Ü�M‰MØGÈØ—
‘
ôð %*ˆDÔ!Ø�J‰J×$Ñ$ T§Z¡Z×%6Ñ%6Ó%8Ô9Ø�J‰J×$Ñ$ T§Z¡Z×%6Ñ%6Ó%8Ô9ð	!ÙÜ—‘ØLØ˜4Ÿ:™:ô'ðØ—J‘J×$Ñ$Ô&ð ˆDŒJØˆDŒJØ%)ˆDÔ"Ø $ˆDÔØ$(ˆDÔ!Ø ˆD�Møô !ò Ü×%Ñ%Ð&JØ&+¨T¯Z©Zô9àûðûð
 ˆDŒJØˆDŒJØ%)ˆDÔ"Ø $ˆDÔØ$(ˆDÔ!Ø ˆD�Mús*   Â2#E ÃD Ä	EÄ$"EÅEÅE Å,E:c                 ó  — t         j                  d| j                  «       | j                  | j                  k(  sJ d| j                  f«       ‚| j
                  | _        | j                  j                  | j                  «       t        | «      S )zCKick off the workflow

        :rtype: AbstractIOReference
        z!_AsyncStreamConnector.start(); %sz9_AsyncStreamConnector.start() expected _STATE_NOT_STARTED)
r;   rP   rS   rW   rV   r_   rR   r`   ra   r?   rF   s    r   r+   z_AsyncStreamConnector.startÃ  s{   € ô
 	�‰Ð9¸4¿:¹:ÔFà�{‰{˜d×5Ñ5Ò5ð 	/ð!Ø"&§+¡+ð8/ó 	/Ð5ð ×(Ñ(ˆŒð 	�
‰
×*Ñ*¨4×+<Ñ+<Ô=ä'¨Ó-Ð-r   c                 ó  — | j                   | j                  k(  rD| j                  | _         t        j	                  d| j
                  «       | j                  d¬«       yt        j	                  d| j                   | j
                  «       y)rc   z%User canceled streaming linkup for %sT©r<   zD_AsyncStreamConnector cancel requested when not ACTIVE: state=%s; %sF)rW   r_   rd   r;   rP   rS   r]   rF   s    r   rA   z_AsyncStreamConnector.cancelÖ  sj   € ð �;‰;˜$×,Ñ,Ò,Ø×.Ñ.ˆDŒKÜ�M‰MÐAÀ4Ç:Á:ÔNà�M‰M ˆMÔ%Øä�‰ðØ ŸK™K¨¯©ô	5ð r   c                 ó"  — t         j                  d|| j                  «       t        |t        t
        f«      sJ d|| j                  f«       ‚| j                  | j                  k(  sJ d| j                  f«       ‚| j                  | _        	 | j                  |«       	 | j                  t        |t        «      ¬«       y# t        $ r# t         j                  d| j                  |«       ‚ w xY w# | j                  t        |t        «      ¬«       w xY w)a  Advance to COMPLETED state, cancel async operation(s), and invoke
        user's completion callback.

        :param BaseException | tuple result: value to pass in user's callback.
            `tuple(transport, protocol)` on success, exception on error

        z0_AsyncStreamConnector._report_completion(%r); %szQ_AsyncStreamConnector._report_completion() expected exception or tuple as result.zA_AsyncStreamConnector._report_completion() expected _STATE_ACTIVEz%r: _on_done(%r) failed.rŠ   N)r;   rP   rS   r   rf   ÚtuplerW   r_   rh   rU   r:   rq   rk   r]   ri   s     r   rk   z(_AsyncStreamConnector._report_completionê  sÿ   € ô 	�‰ÐHØ˜dŸj™jô	*ô ˜&¤=´%Ð"8Ô9ð 	5ðØ &¨¯©ð<5ó 	5Ð9ð �{‰{˜d×0Ñ0Ò0ð 	*ðØ!Ÿ[™[ð3*ó 	*Ð0ð ×+Ñ+ˆŒð	CØ�M‰M˜&Õ!ð �M‰M¤
¨6´=Ó AˆMÕBøô ò 	Ü×ÑÐ8Ø"×5Ñ5°vô?àð	ûð �M‰M¤
¨6´=Ó AˆMÕBús   Â
B= Â=,C)Ã)C, Ã,"Dc                 ól  — t         j                  d| j                  «       | j                  | j                  k7  r,t         j                  d| j                  | j                  «       y| j
                  €| j                  «        yt         j                  d| j                  «       	 | j
                  j                  | j                  ddd| j                  ¬«      | _        | j                  «        y# t        $ r<}t         j                  d| j                  |«       | j                  |«       Y d}~yd}~ww xY w)z’Called as callback from I/O loop to kick-start the workflow, so it's
        safe to call user's completion callback from here if needed

        z(_AsyncStreamConnector._start_async(); %szMAbandoning streaming linkup due to inactive state transition; state=%s; %s; .NzStarting SSL handshake on %sF)Úserver_sideÚdo_handshake_on_connectÚsuppress_ragged_eofsr8   zSSL wrap_socket(%s) failed: %r)r;   rP   rS   rW   r_   rƒ   Ú_linkupÚwrap_socketr„   r:   rq   rk   Ú_do_ssl_handshakerr   s     r   ra   z"_AsyncStreamConnector._start_async
  sý   € ô 	�‰Ð@À$Ç*Á*ÔMà�;‰;˜$×,Ñ,Ò,ä�M‰Mð.Ø/3¯{©{¸D¿J¹JôHð ð ×ÑÐ$Ø�L‰L�Nä�M‰MÐ8¸$¿*¹*ÔEðØ!×.Ñ.×:Ñ:Ø—J‘JØ %Ø,1Ø).Ø$(×$9Ñ$9ð ;ó ;�”
ð ×"Ñ"Õ$øô ò Ü×!Ñ!Ð"BÀDÇJÁJØ"'ô)à×'Ñ'¨Ô.Üûð	ús   Â$9C. Ã.	D3Ã72D.Ä.D3c                 ój  — t         j                  d«       d}	 	 | j                  «       }| j                  €#	 t        | j
                  || j                  «      }n"	 t        | j
                  || j                  «      }t         j                  d|«       	 |j                  |«       t         j                  d||«       ||f}| j                  |«       y# t        $ r'}t         j	                  d|| j
                  «       ‚ d}~ww xY w# t        $ r'}t         j	                  d|| j
                  «       ‚ d}~ww xY w# t        $ r'}t         j	                  d|| j
                  «       ‚ d}~ww xY w# t        $ r(}t         j	                  d||| j
                  «       ‚ d}~ww xY w# t        $ r}|}Y d}~Œïd}~ww xY w)	z}Connection is ready: instantiate and link up transport and protocol,
        and invoke user's completion callback.

        z_AsyncStreamConnector._linkup()Nz'protocol_factory() failed: error=%r; %sz%PlainTransport() failed: error=%r; %sz#SSLTransport() failed: error=%r; %sz_linkup(): created transport %rz1protocol.connection_made(%r) failed: error=%r; %sz2_linkup(): introduced transport to protocol %r; %r)r;   rP   r‚   r:   rq   rS   rƒ   Ú_AsyncPlaintextTransportrR   Ú_AsyncSSLTransportÚconnection_maderk   )r,   Ú	transportÚprotocolr   rj   s        r   r‘   z_AsyncStreamConnector._linkup0  s   € ô 	�‰Ð7Ô8àˆ	ð,	+ðØ×1Ñ1Ó3�ð × Ñ Ð(ðÜ 8ØŸ
™
 H¨d¯j©jó!:‘IðÜ 2°4·:±:¸xØ37·:±:ó!?�Iô �M‰MÐ;¸YÔGðØ×(Ñ(¨Ô3ô �M‰MÐNØ# Xô/ð
   Ð*ˆFà×Ñ Õ'øôU ò Ü×!Ñ!Ð"KØ"'¨¯©ô5àûðûô !ò Ü×%Ñ%Ð&MØ&+¨T¯Z©Zô9àûðûô !ò Ü×%Ñ%Ð&KØ&+¨T¯Z©Zô9àûðûô ò Ü×!Ñ!ØGØ˜u d§j¡jô2ð ûð	ûô ò 	Ø�Fûð	úsŸ   šC ªF ·!D ÁF Á!D6 Á;F ÂE) Â#F Ã	D Ã"C;Ã;D Ä F Ä	D3Ä"D.Ä.D3Ä3F Ä6	E&Ä?"E!Å!E&Å&F Å)	FÅ2#FÆFÆF Æ	F2Æ&F-Æ-F2c                 óf  — t         j                  d«       | j                  | j                  k7  r,t         j                  d| j                  | j                  «       yd}	 	 | j                  j                  «        d}t         j                  d| j                  «       |r¾t         j                  d
| j                  «       | j                  j'                  | j                  j                  «       «       | j                  j!                  | j                  j                  «       «       d| _        t         j                  d| j                  «       | j/                  «        yy# t        j                  $ �rx}|j                  t        j                  k(  r™t         j                  d| j                  «       d| _        | j                  j                  | j                  j                  «       | j                  «       | j                  j!                  | j                  j                  «       «       n·|j                  t        j"                  k(  r™t         j                  d| j                  «       d| _        | j                  j%                  | j                  j                  «       | j                  «       | j                  j'                  | j                  j                  «       «       n‚ Y d}~�ŒHd}~ww xY w# t(        $ r<}t         j+                  d	|| j                  «       | j-                  |«       Y d}~yd}~ww xY w)zJPerform asynchronous SSL handshake on the already wrapped socket

        z)_AsyncStreamConnector._do_ssl_handshake()z`_do_ssl_handshake: Abandoning streaming linkup due to inactive state transition; state=%s; %s; .NFTz(SSL handshake completed successfully: %szSSL handshake wants read; %s.zSSL handshake wants write. %sz%SSL do_handshake failed: error=%r; %sz8_do_ssl_handshake: removing watchers ahead of linkup: %sz=_do_ssl_handshake: pre-linkup removal of watchers is done; %s)r;   rP   rW   r_   rS   Údo_handshakerw   r   ÚSSLErrorr   ÚSSL_ERROR_WANT_READr…   rR   Ú
set_readerr\   r“   r[   ÚSSL_ERROR_WANT_WRITEro   r‡   r:   rq   rk   r‘   )r,   Údoner   s      r   r“   z'_AsyncStreamConnector._do_ssl_handshakej  sU  € ô
 	�‰ÐAÔBà�;‰;˜$×,Ñ,Ò,Ü�M‰Mð@ØAEÇÁØ—
‘
ôð àˆð	ð)Ø—
‘
×'Ñ'Ô)ð$ �Ü—‘ÐGØ!ŸZ™Zô)ñ ä�M‰MØJØ—
‘
ôð �J‰J×$Ñ$ T§Z¡Z×%6Ñ%6Ó%8Ô9Ø�J‰J×$Ñ$ T§Z¡Z×%6Ñ%6Ó%8Ô9ð %*ˆDÔ!Ü�M‰MØOØ—
‘
ôð �L‰L�Nð øô5 —<‘<ó Ø—;‘;¤#×"9Ñ"9Ò9Ü—M‘MÐ"AÀ4Ç:Á:ÔNØ,0�DÔ)Ø—J‘J×)Ñ)¨$¯*©*×*;Ñ*;Ó*=Ø*.×*@Ñ*@ôBà—J‘J×,Ñ,¨T¯Z©Z×->Ñ->Ó-@ÕAØ—[‘[¤C×$<Ñ$<Ò<Ü—M‘MÐ"AÀ4Ç:Á:ÔNØ,0�DÔ)Ø—J‘J×)Ñ)¨$¯*©*×*;Ñ*;Ó*=Ø*.×*@Ñ*@ôBà—J‘J×,Ñ,¨T¯Z©Z×->Ñ->Ó-@ÕAð ÿùðûô( ò 	Ü×ÑÐEÀuØ"Ÿj™jô*à×#Ñ# EÔ*Üûð		ús=   ÁE Á9"K+ ÅK(Å0E-K#ËK+ Ë#K(Ë(K+ Ë+	L0Ë42L+Ì+L0N)r.   r/   r0   r1   rV   r_   rd   rh   rD   r|   r]   r+   rA   rk   ra   r‘   r“   r2   r   r   r9   r9   d  s˜   „ ñð ÐØ€MØ€OØÐò.&ð` ñ !ó ð !òD.ò&ð( ñCó ðCð> ñ#%ó ð#%ðJ ñ7(ó ð7(ðr ñ:ó ñ:r   r9   c                   óÜ   — e Zd ZdZdZdZdZdZdZdZ	 G d„ d	e
«      Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zeed„ «       «       Zeed„ «       «       Zed„ «       Zed„ «       Zed„ «       Zed„ «       Zy)Ú_AsyncTransportBasezIBase class for `_AsyncPlaintextTransport` and `_AsyncSSLTransport`.

    rH   rI   rJ   é   i   i � c                   ó"   ‡ — e Zd ZdZˆ fd„Zˆ xZS )ú_AsyncTransportBase.RxEndOfFilezNWe raise this internally when EOF (empty read) is detected on input.

        c                 óB   •— t         t        j                  | �  dd«       y )NéÿÿÿÿzEnd of input stream (EOF))Úsuperr¢   ÚRxEndOfFilerD   )r,   Ú	__class__s    €r   rD   z(_AsyncTransportBase.RxEndOfFile.__init__½  s   ø€ ÜÔ%×1Ñ1°4ÑAØÐ/õ1r   )r.   r/   r0   r1   rD   Ú__classcell__©rª   s   @r   r©   r¥   ¸  s   ø„ ñ	÷	1ð 	1r   r©   c                 ó¼   — t         j                  d|«       || _        || _        || _        | j
                  | _        t        j                  «       | _	        d| _
        y)a~  

        :param socket.socket | ssl.SSLSocket sock: connected socket
        :param pika.adapters.utils.nbio_interface.AbstractStreamProtocol protocol:
            corresponding protocol in this transport/protocol pairing; the
            protocol already had its `connection_made()` method called.
        :param AbstractIOServices | AbstractFileDescriptorServices nbio:

        z _AsyncTransportBase.__init__: %sr   N)r;   rP   rS   Ú	_protocolrR   r_   rW   ÚcollectionsÚdequeÚ_tx_buffersÚ_tx_buffered_byte_count)r,   r'   r™   r&   s       r   rD   z_AsyncTransportBase.__init__Á  sN   € ô 	�‰Ð8¸$Ô?ØˆŒ
Ø!ˆŒØˆŒ
à×(Ñ(ˆŒÜ&×,Ñ,Ó.ˆÔØ'(ˆÕ$r   c                 ó|   — t         j                  d| j                  | j                  «       | j	                  d«       y)a  Close connection abruptly without waiting for pending I/O to
        complete. Will invoke the corresponding protocol's `connection_lost()`
        method asynchronously (not in context of the abort() call).

        :raises Exception: Exception-based exception on error
        z+Aborting transport connection: state=%s; %sN)r;   rw   rW   rS   Ú_initiate_abortrF   s    r   Úabortz_AsyncTransportBase.abortÔ  s0   € ô 	�‰ÐBÀDÇKÁKØ—Z‘Zô	!ð 	×Ñ˜TÕ"r   c                 ó   — | j                   S )z�Return the protocol linked to this transport.

        :rtype: pika.adapters.utils.nbio_interface.AbstractStreamProtocol
        )r®   rF   s    r   Úget_protocolz _AsyncTransportBase.get_protocolà  s   € ð
 �~‰~Ðr   c                 ó   — | j                   S )ze
        :returns: Current size of output data buffered by the transport
        :rtype: int
        )r²   rF   s    r   Úget_write_buffer_sizez)_AsyncTransportBase.get_write_buffer_sizeç  s   € ð
 ×+Ñ+Ð+r   c                 óŽ  — |sEt         j                  d| j                  | j                  «       t	        dj                  |«      «      ‚| j                  | j                  k7  r,t         j                  d| j                  | j                  «       y| j                  j                  |«       | xj                  t        |«      z  c_
        y)ú–Buffer the given data until it can be sent asynchronously.

        :param bytes data:
        :raises ValueError: if called with empty data

        z,write() called with empty data: state=%s; %sz#write() called with empty data {!r}ú;Ignoring write() called during inactive state: state=%s; %sN)r;   r   rW   rS   rQ   r   r_   rP   r±   Úappendr²   Úlen)r,   Údatas     r   Ú_buffer_tx_dataz#_AsyncTransportBase._buffer_tx_dataî  s˜   € ñ Ü�M‰MÐHØŸ+™+ t§z¡zô3äÐB×IÑIÈ$ÓOÓPÐPà�;‰;˜$×,Ñ,Ò,Ü�M‰MðØ $§¡¨T¯Z©Zô9ð à×Ñ×Ñ Ô%Ø×$Ò$¬¨D«	Ñ1Ö$r   c                 ó  — d}| j                   | j                  k(  r½|| j                  k  r­| j                  | j                  | j
                  «      }|t        |«      z  }|s0t        j                  d| j                  «       | j                  «       ‚	 | j                  j                  |«       | j                   | j                  k(  r|| j                  k  rŒ«yyyy# t        $ r'}t        j                  d|| j                  «       ‚ d}~ww xY w)aï  Utility method for use by subclasses to ingest data from socket and
        dispatch it to protocol's `data_received()` method socket-specific
        "try again" exception, per-event data consumption limit is reached,
        transport becomes inactive, or a fatal failure.

        Consumes up to `self._MAX_CONSUME_BYTES` to prevent event starvation or
        until state becomes inactive (e.g., `protocol.data_received()` callback
        aborts the transport)

        :raises: Whatever the corresponding `sock.recv()` raises except the
                 socket error with errno.EINTR
        :raises: Whatever the `protocol.data_received()` callback raises
        :raises _AsyncTransportBase.RxEndOfFile: upon shutdown of input stream

        r   zSocket EOF; %sz-protocol.data_received() failed: error=%r; %sN)rW   r_   Ú_MAX_CONSUME_BYTESÚ_sigint_safe_recvrS   Ú_MAX_RECV_BYTESr¾   r;   r   r©   r®   Údata_receivedr:   rq   )r,   Úbytes_consumedr¿   r   s       r   Ú_consumez_AsyncTransportBase._consume  sñ   € ð  ˆà�{‰{˜d×0Ñ0Ò0Ø × 7Ñ 7Ò7Ø×)Ñ)¨$¯*©*°d×6JÑ6JÓKˆDØœc $›iÑ'ˆNñ Ü—‘Ð.°·
±
Ô;Ø×&Ñ&Ó(Ð(ðØ—‘×,Ñ,¨TÔ2ð �{‰{˜d×0Ñ0Ò0Ø × 7Ñ 7Ô7ð 1Ø7ð 1øô ò Ü×!Ñ!ØCÀUØ—J‘Jô ð ûð	ús   ÂC Ã	D
Ã#"DÄD
c                 óÚ  — | j                   rß| j                  | j                  | j                   d   «      }| j                   j                  «       }|t	        |«      k  r>t
        j                  d|t	        |«      «       | j                   j                  ||d «       | xj                  |z  c_        | j                  dk\  sJ d| j                  | j                  f«       ‚| j                   rŒÞyy)a  Utility method for use by subclasses to emit data from tx_buffers.
        This method sends chunks from `tx_buffers` until all chunks are
        exhausted or sending is interrupted by an exception. Maintains integrity
        of `self.tx_buffers`.

        :raises: whatever the corresponding `sock.send()` raises except the
                 socket error with errno.EINTR

        r   z/Partial send, requeing remaining data; %s of %sNz7_AsyncTransportBase._produce() tx buffer size underflow)
r±   Ú_sigint_safe_sendrS   Úpopleftr¾   r;   rP   Ú
appendleftr²   rW   )r,   Únum_bytes_sentÚchunks      r   Ú_producez_AsyncTransportBase._produce(  sÕ   € ð ×ÒØ!×3Ñ3°D·J±JØ48×4DÑ4DÀQÑ4GóIˆNð ×$Ñ$×,Ñ,Ó.ˆEØ¤ E£
Ò*Ü—‘ÐOØ,¬c°%«jô:à× Ñ ×+Ñ+¨E°.°/Ð,BÔCà×(Ò(¨NÑ:Õ(Ø×/Ñ/°1Ò4ð ;ØIØ×,Ñ,¨d¯k©kð7;ó ;Ð4ð ×Õr   c                 ó$   — | j                  |«      S )am  Receive data from socket, retrying on SIGINT.

        :param sock: stream or SSL socket
        :param max_bytes: maximum number of bytes to receive
        :returns: received data or empty bytes uppon end of file
        :rtype: bytes
        :raises: whatever the corresponding `sock.recv()` raises except socket
                 error with errno.EINTR

        )Úrecv)r'   Ú	max_bytess     r   rÃ   z%_AsyncTransportBase._sigint_safe_recvA  s   € ð �y‰y˜Ó#Ð#r   c                 ó$   — | j                  |«      S )a@  Send data to socket, retrying on SIGINT.

        :param sock: stream or SSL socket
        :param data: data bytes to send
        :returns: number of bytes actually sent
        :rtype: int
        :raises: whatever the corresponding `sock.send()` raises except socket
                 error with errno.EINTR

        )Úsend)r'   r¿   s     r   rÉ   z%_AsyncTransportBase._sigint_safe_sendP  s   € ð �y‰y˜‹Ðr   c                 óŽ  — | j                   | j                  k(  r¬t        j                  d| j                   | j                  «       | j
                  j                  | j                  j                  «       «       | j
                  j                  | j                  j                  «       «       | j                  j                  «        yy)z2Unregister the transport from I/O events

        z$Deactivating transport: state=%s; %sN)rW   r_   r;   rw   rS   rR   r‡   r\   r[   r±   ÚclearrF   s    r   Ú_deactivatez_AsyncTransportBase._deactivate_  s‡   € ð
 �;‰;˜$×,Ñ,Ò,Ü�L‰LÐ?ÀÇÁØŸ™ô%à�J‰J×$Ñ$ T§Z¡Z×%6Ñ%6Ó%8Ô9Ø�J‰J×$Ñ$ T§Z¡Z×%6Ñ%6Ó%8Ô9Ø×Ñ×"Ñ"Õ$ð -r   c                 ó¨  — | j                   | j                  k7  r–t        j                  d| j                   | j                  «       	 | j                  j                  t        j                  «       | j                  j                  «        d| _        d| _        d| _        | j                  | _         yy# t        j                  j                  $ r Y Œaw xY w)z{Close the transport's socket and unlink the transport it from
        references to other assets (protocol, etc.)

        z4Closing transport socket and unlinking: state=%s; %sN)rW   rh   r;   rw   rS   ÚshutdownrM   Ú	SHUT_RDWRr   r   r   r<   r®   rR   rF   s    r   Ú_close_and_finalizez'_AsyncTransportBase._close_and_finalizek  s¦   € ð �;‰;˜$×/Ñ/Ò/Ü�L‰LÐOØŸ™ d§j¡jô2ðØ—
‘
×#Ñ#¤F×$4Ñ$4Ô5ð �J‰J×ÑÔØˆDŒJØ!ˆDŒNØˆDŒJØ×/Ñ/ˆD�Kð 0øô
 —;‘;×+Ñ+ò Ùðús   Á)B1 Â1CÃCc                 ó®  — t         j                  d| j                  || j                  «       | j                  | j                  k7  sJ d| j                  f«       ‚| j                  | j                  k(  ry| j                  «        |€A| j                  | j                  k(  rt         j                  d«       y| j                  | _        nW| j                  | j                  k7  r-| j                  | j                  k(  sJ d| j                  f«       ‚y| j                  | _        | j                  j                  t        j                  | j                  |«      «       y)a£  Initiate asynchronous abort of the transport that concludes with a
        call to the protocol's `connection_lost()` method. No flushing of
        output buffers will take place.

        :param BaseException | None error: None if being canceled by user,
            including via falsie return value from protocol.eof_received;
            otherwise the exception corresponding to the the failed connection.
        zo_AsyncTransportBase._initate_abort(): Initiating abrupt asynchronous transport shutdown: state=%s; error=%r; %szB_AsyncTransportBase._initate_abort() expected non-_STATE_COMPLETEDNzM_AsyncTransportBase._initiate_abort(): ignoring - user-abort already pending.zD_AsyncTransportBase._initate_abort() expected _STATE_ABORTED_BY_USER)r;   rw   rW   rS   rh   rÖ   Ú_STATE_ABORTED_BY_USERrP   r_   Ú_STATE_FAILEDrR   r`   r    ÚpartialÚ_connection_lost_notify_asyncrr   s     r   r´   z#_AsyncTransportBase._initiate_abort~  s<  € ô 	�‰ðFà�K‰K˜ §
¡
ô	,ð
 �{‰{˜d×3Ñ3Ò3ð 	1ð#Ø$(§K¡Kð61ó 	1Ð3ð �;‰;˜$×/Ñ/Ò/Øà×ÑÔð ˆ=ð �{‰{˜d×9Ñ9Ò9ä—‘ð Gô Hàð ×5Ñ5ˆD�Kð �{‰{˜d×0Ñ0Ò0Ø—{‘{ d×&AÑ&AÒAð ;ð-Ø.2¯k©kðD;ó ;ÐAð à×,Ñ,ˆDŒKð 	�
‰
×*Ñ*Ü×Ñ˜d×@Ñ@À%ÓHõ	Jr   c                 óö  — t         j                  d| j                  |«       | j                  | j                  k(  ry|�F| j                  | j                  k7  r-| j                  | j
                  k(  sJ d| j                  f«       ‚y	 | j                  j                  |«       	 | j                  «        y# t        $ r(}t         j                  d||| j                  «       ‚ d}~ww xY w# | j                  «        w xY w)až  Handle aborting of transport either due to socket error or user-
        initiated `abort()` call. Must be called from an I/O loop callback owned
        by us in order to avoid reentry into user code from user's API call into
        the transport.

        :param BaseException | None error: None if being canceled by user;
            otherwise the exception corresponding to the the failed connection.
        z1Concluding transport shutdown: state=%s; error=%rNzS_AsyncTransportBase._connection_lost_notify_async() expected _STATE_ABORTED_BY_USERz/protocol.connection_lost(%r) failed: exc=%r; %s)r;   rP   rW   rh   rÝ   rÜ   r®   Úconnection_lostr:   rq   rS   rÚ   )r,   r   Úexcs      r   rß   z1_AsyncTransportBase._connection_lost_notify_async³  sê   € ô 	�‰ÐIØ—k‘k 5ô	*ð �;‰;˜$×/Ñ/Ò/ØàÐ §¡°×0BÑ0BÒ!Bà—;‘; $×"=Ñ"=Ò=ð @ð2Ø37·;±;ð@@ó @Ð=ð ð		'Ø�N‰N×*Ñ*¨5Õ1ð ×$Ñ$Õ&øô ò 	Ü×ÑÐOØ# S¨$¯*©*ô6ð ûð	ûð ×$Ñ$Õ&ús$   ÂB2 Â2	C#Â;#CÃC#Ã#C& Ã&C8N)r.   r/   r0   r1   r_   rÝ   rÜ   rh   rÄ   rÂ   ÚOSErrorr©   rD   rµ   r·   r¹   rÀ   rÇ   rÎ   Ústaticmethodr"   rÃ   rÉ   r|   rÖ   rÚ   r´   rß   r2   r   r   r¢   r¢   ¨  sç   „ ñð €MØ€MØÐØÐà€Oð $Ðô1�gô 1ò)ò&
#òò,ò2ò*#òJ;ð2 Øñ$ó ó ð$ð Øñó ó ðð ñ	%ó ð	%ð ñ0ó ð0ð$ ñ2Jó ð2Jðh ñ 'ó ñ 'r   r¢   c                   óH   ‡ — e Zd ZdZˆ fd„Zd„ Zed„ «       Zed„ «       Zˆ xZ	S )r•   z`Implementation of `nbio_interface.AbstractStreamTransport` for a
    plaintext connection.

    c                 ó¬   •— t         t        | �  |||«       | j                  j	                  | j
                  j                  «       | j                  «       y)a{  

        :param socket.socket sock: non-blocking connected socket
        :param pika.adapters.utils.nbio_interface.AbstractStreamProtocol protocol:
            corresponding protocol in this transport/protocol pairing; the
            protocol already had its `connection_made()` method called.
        :param AbstractIOServices | AbstractFileDescriptorServices nbio:

        N)r¨   r•   rD   rR   rž   rS   r\   Ú_on_socket_readable©r,   r'   r™   r&   rª   s       €r   rD   z!_AsyncPlaintextTransport.__init__Ý  sB   ø€ ô 	Ô&¨Ñ6°t¸XÀtÔLð 	�
‰
×Ñ˜dŸj™j×/Ñ/Ó1°4×3KÑ3KÕLr   c                 óÄ  — | j                   | j                  k7  r,t        j                  d| j                   | j                  «       y|sJ d|| j                   f«       ‚| j                  «       dk(  }| j                  |«       |r_| j                  j                  | j                  j                  «       | j                  «       t        j                  d| j                  «       yy)r»   r¼   Nz7_AsyncPlaintextTransport.write(): empty data from user.r   ú!Turned on writability watcher: %s)rW   r_   r;   rP   rS   r¹   rÀ   rR   ro   r\   Ú_on_socket_writable©r,   r¿   Útx_buffer_was_emptys      r   Úwritez_AsyncPlaintextTransport.writeí  s¿   € ð �;‰;˜$×,Ñ,Ò,Ü�M‰MðØ $§¡¨T¯Z©Zô9ð áð 	)ÐOØ˜DŸK™Kð)ó 	)ˆtð #×8Ñ8Ó:¸aÑ?Ðà×Ñ˜TÔ"áØ�J‰J×!Ñ! $§*¡*×"3Ñ"3Ó"5°t×7OÑ7OÔPÜ�M‰MÐ=¸t¿z¹zÕJð r   c                 ó  — | j                   | j                  k7  r,t        j                  d| j                   | j                  «       y	 | j                  «        | j                   | j                  k7  r,t        j                  d| j                   | j                  «       yy# | j                  $ rï 	 | j                  j                  «       }|rUt        j                  d| j                  «       | j                  j                  | j                  j                  «       «       Y yt        j                  d| j                  «       | j                  d«       Y y# t        $ r=}t        j                  d|| j                  «       | j                  |«       Y d}~Y yd}~ww xY wt        t         j"                  j$                  f$ rÊ}t'        |t         j"                  j$                  «      r3|j(                  t*        v r!t        j                  d| j                  «       nit        j                  d|| j                  d	j-                  t/        j0                  t3        j4                  «       Ž «      «       | j                  |«       Y d}~yY d}~yd}~ww xY w)
zÜIngest data from socket and dispatch it to protocol until exception
        occurs (typically EAGAIN or EWOULDBLOCK), per-event data consumption
        limit is reached, transport becomes inactive, or failure.

        úEIgnoring readability notification due to inactive state: state=%s; %sNz>Leaving Plaintext consumer due to inactive state: state=%s; %sz0protocol.eof_received() elected to keep open: %sz,protocol.eof_received() elected to close: %sz,protocol.eof_received() failed: error=%r; %szRecv would block on %súa_AsyncBaseTransport._consume() failed, aborting connection: error=%r; sock=%s; Caller's stack:
%sÚ )rW   r_   r;   rP   rS   rÇ   r©   r®   Úeof_receivedrw   rR   r‡   r\   r´   r:   rq   r   r   r   r   r   Ú_TRY_IO_AGAIN_SOCK_ERROR_CODESÚjoinÚ	tracebackÚformat_exceptionÚsysÚexc_info)r,   Ú	keep_openr   s      r   rç   z,_AsyncPlaintextTransport._on_socket_readable	  sõ  € ð �;‰;˜$×,Ñ,Ò,Ü�M‰Mð&Ø'+§{¡{°D·J±Jô@ð ð%	DØ�M‰MŒOð> �{‰{˜d×0Ñ0Ò0ô —‘ð*Ø+/¯;©;¸¿
¹
õDð 1øð= ×Ñò 	/ð/Ø ŸN™N×7Ñ7Ó9�	ñ Ü—L‘LØJØŸ
™
ô$ð —J‘J×,Ñ,¨T¯Z©Z×->Ñ->Ó-@ÖAä—L‘LÐ!OØ!%§¡ô-à×(Ñ(¨Ö.øô ò ,Ü×!Ñ!ØBÀEØ—J‘Jô ð ×$Ñ$ U×+Ò+ûð	,úô œ4Ÿ;™;×3Ñ3Ð4ò 
	,Ü˜5¤$§+¡+×":Ñ":Ô;Ø—K‘KÔ#AÑAÜ—‘Ð6¸¿
¹
ÕCä×!Ñ!ðJà˜4Ÿ:™: r§w¡wÜ!×2Ñ2´C·L±L³NÐCó(EôFð
 ×$Ñ$ U×+Ñ+ô Dûð
	,úsJ   ÁB ÂJÂ-EÃAJÄ1JÅ	FÅ2FÆJÆFÆ%JÆ<B;JÊJc                 óŽ  — | j                   | j                  k7  r,t        j                  d| j                   | j                  «       y| j
                  sJ d| j                   f«       ‚	 | j                  «        | j
                  sT| j                  j                  | j                  j                  «       «       t        j                  d| j                  «       yy# t        t        j                  j                  f$ rÊ}t        |t        j                  j                  «      r3|j                  t         v r!t        j                  d| j                  «       nit        j#                  d|| j                  dj%                  t'        j(                  t+        j,                  «       Ž «      «       | j/                  |«       Y d}~yY d}~yd}~ww xY w)ú-Handle writable socket notification

        úEIgnoring writability notification due to inactive state: state=%s; %sNzP_AsyncPlaintextTransport._on_socket_writable() called, but _tx_buffers is empty.z"Turned off writability watcher: %szSend would block on %súa_AsyncBaseTransport._produce() failed, aborting connection: error=%r; sock=%s; Caller's stack:
%srò   )rW   r_   r;   rP   rS   r±   rÎ   rR   r[   r\   r:   r   r   r   r   r   rô   rq   rõ   rö   r÷   rø   rù   r´   rr   s     r   rë   z,_AsyncPlaintextTransport._on_socket_writable=  s`  € ð
 �;‰;˜$×,Ñ,Ò,Ü�M‰Mð&Ø'+§{¡{°D·J±Jô@ð ð ×Òð 	6ð(Ø)-¯©ð"6ó 	6Ðð	Pà�M‰MŒOð ×#Ò#Ø—
‘
×(Ñ(¨¯©×):Ñ):Ó)<Ô=Ü—‘ÐBÀDÇJÁJÕOð $øô œ4Ÿ;™;×3Ñ3Ð4ò 
	,Ü˜5¤$§+¡+×":Ñ":Ô;Ø—K‘KÔ#AÑAÜ—‘Ð6¸¿
¹
ÕCä×!Ñ!ðJà˜4Ÿ:™: r§w¡wÜ!×2Ñ2´C·L±L³NÐCó(EôFð
 ×$Ñ$ U×+Ñ+ô Dûð
	,ús   Á&C Ã#GÃ:B;F?Æ?G)
r.   r/   r0   r1   rD   rî   r|   rç   rë   r«   r¬   s   @r   r•   r•   ×  sA   ø„ ñô
Mò Kð8 ñ1Dó ð1Dðf ñ Pó ô Pr   r•   c                   óp   ‡ — e Zd ZdZˆ fd„Zd„ Zed„ «       Zed„ «       Zeˆ fd„«       Z	eˆ fd„«       Z
ˆ xZS )r–   z\Implementation of `.nbio_interface.AbstractStreamTransport` for an SSL
    connection.

    c                 ó&  •— t         t        | �  |||«       | j                  | _        d| _        | j                  j                  | j                  j                  «       | j                  «       | j                  j                  | j                  «       y)a{  

        :param ssl.SSLSocket sock: non-blocking connected socket
        :param pika.adapters.utils.nbio_interface.AbstractStreamProtocol protocol:
            corresponding protocol in this transport/protocol pairing; the
            protocol already had its `connection_made()` method called.
        :param AbstractIOServices | AbstractFileDescriptorServices nbio:

        N)r¨   r–   rD   rÇ   Ú_ssl_readable_actionÚ_ssl_writable_actionrR   rž   rS   r\   rç   r`   rè   s       €r   rD   z_AsyncSSLTransport.__init__g  sn   ø€ ô 	Ô  $Ñ0°°xÀÔFà$(§M¡MˆÔ!Ø$(ˆÔ!ð 	�
‰
×Ñ˜dŸj™j×/Ñ/Ó1°4×3KÑ3KÔLà�
‰
×*Ñ*¨4×+CÑ+CÕDr   c                 ó   — | j                   | j                  k7  r,t        j                  d| j                   | j                  «       y|sJ d|| j                   f«       ‚| j                  «       dk(  }| j                  |«       |r}| j                  €p| j                  | _        | j                  j                  | j                  j                  «       | j                  «       t        j                  d| j                  «       yyy)r»   r¼   Nz1_AsyncSSLTransport.write(): empty data from user.r   rê   )rW   r_   r;   rP   rS   r¹   rÀ   r  rÎ   rR   ro   r\   rë   rì   s      r   rî   z_AsyncSSLTransport.write{  sÚ   € ð �;‰;˜$×,Ñ,Ò,Ü�M‰MðØ $§¡¨T¯Z©Zô9ð áð 	)ÐIØ˜DŸK™Kð)ó 	)ˆtð #×8Ñ8Ó:¸aÑ?Ðà×Ñ˜TÔ"á 4×#<Ñ#<Ð#DØ(,¯©ˆDÔ%Ø�J‰J×!Ñ! $§*¡*×"3Ñ"3Ó"5°t×7OÑ7OÔPÜ�M‰MÐ=¸t¿z¹zÕJð $EÐr   c                 ón  — | j                   | j                  k7  r,t        j                  d| j                   | j                  «       y| j
                  r	 | j                  «        yt        j                  d| j                  | j                  «       y# t        $ r}| j                  |«       Y d}~yd}~ww xY w)z+Handle readable socket indication

        rð   Nz>SSL readable action was suppressed: ssl_writable_action=%r; %s)	rW   r_   r;   rP   rS   r  r:   r´   r  rr   s     r   rç   z&_AsyncSSLTransport._on_socket_readable˜  óš   € ð
 �;‰;˜$×,Ñ,Ò,Ü�M‰Mð&Ø'+§{¡{°D·J±Jô@ð à×$Ò$ð,Ø×)Ñ)Õ+ô �M‰Mð-Ø.2×.GÑ.GØ—
‘
õøô ò ,Ø×$Ñ$ U×+Ñ+ûð,úó   ÁB Â	B4ÂB/Â/B4c                 ón  — | j                   | j                  k7  r,t        j                  d| j                   | j                  «       y| j
                  r	 | j                  «        yt        j                  d| j                  | j                  «       y# t        $ r}| j                  |«       Y d}~yd}~ww xY w)rü   rý   Nz>SSL writable action was suppressed: ssl_readable_action=%r; %s)	rW   r_   r;   rP   rS   r  r:   r´   r  rr   s     r   rë   z&_AsyncSSLTransport._on_socket_writable®  r  r  c                 ó`  •— d}	 t         t        | �  «        | j                  | j                  k7  r,t
        j                  d| j                  | j                  «       y| j                  j                  | j                  «       |r¯| j,                  s>| j                  j/                  | j                  j1                  «       | j                  «       | j                  | _        | j2                  | j                  k(  rÜ| j                  j5                  | j                  j1                  «       «       d| _        n¡| j2                  s>| j                  j7                  | j                  j1                  «       | j8                  «       | j                  | _        | j,                  r:| j                  j;                  | j                  j1                  «       «       d| _        | j<                  r]| j2                  sP| j>                  | _        | j                  j7                  | j                  j1                  «       | j8                  «       yyy# t        j                  $ rÝ}|j                  t        j                  k(  r!t
        j                  d| j                  «       n”|j                  t        j                  k(  r#t
        j                  d| j                  «       d}nTt
        j!                  d|| j                  dj#                  t%        j&                  t)        j*                  «       Ž «      «       ‚ Y d}~�Œ§d}~ww xY w)	a“  [override] Ingest data from socket and dispatch it to protocol until
        exception occurs (typically ssl.SSLError with
        SSL_ERROR_WANT_READ/WRITE), per-event data consumption limit is reached,
        transport becomes inactive, or failure.

        Update consumer/producer registration.

        :raises Exception: error that signals that connection needs to be
            aborted
        Tz8Leaving SSL consumer due to inactive state: state=%s; %sNzSSL ingester wants read: %szSSL ingester wants write: %sFrñ   rò   ) r¨   r–   rÇ   rW   r_   r;   rP   rS   rR   r`   rç   r   rœ   r   r�   rŸ   rq   rõ   rö   r÷   rø   rù   r  rž   r\   r  r[   ro   rë   r‡   r±   rÎ   )r,   Únext_consume_on_readabler   rª   s      €r   rÇ   z_AsyncSSLTransport._consumeÄ  s^  ø€ ð $(Ð ð	IÜÔ$ dÑ4Ô6ð  �{‰{˜d×0Ñ0Ò0ô —‘ð*Ø+/¯;©;¸¿
¹
ôDð ð �J‰J×.Ñ.¨t×/GÑ/GÔHñ $Ø×,Ò,Ø—
‘
×%Ñ% d§j¡j×&7Ñ&7Ó&9Ø&*×&>Ñ&>ô@à(,¯©ˆDÔ%ð ×(Ñ(¨D¯M©MÒ9Ø—
‘
×(Ñ(¨¯©×):Ñ):Ó)<Ô=Ø,0�Õ)ð ×,Ò,Ø—
‘
×%Ñ% d§j¡j×&7Ñ&7Ó&9Ø&*×&>Ñ&>ô@à(,¯©ˆDÔ%à×(Ò(Ø—
‘
×(Ñ(¨¯©×):Ñ):Ó)<Ô=Ø,0�Ô)ð ×Ò D×$=Ò$=Ø(,¯©ˆDÔ%Ø�J‰J×!Ñ! $§*¡*×"3Ñ"3Ó"5°t×7OÑ7OÕPð %>Ðøôk �|‰|ò 	Ø�{‰{œc×5Ñ5Ò5Ü—‘Ð;¸T¿Z¹ZÕHØ—‘¤× 8Ñ 8Ò8ä—‘Ð<¸d¿j¹jÔIØ+0Ñ(ä×!Ñ!ðJà˜4Ÿ:™: r§w¡wÜ!×2Ñ2´C·L±L³NÐCó(EôFð
 ÿùð	ús   …H= È=L-ÉCL(Ì(L-c                 óØ  •— d}	 t         t        | �  «        | j                  rJ dt	        | j                  «      f«       ‚| j                  �rk|€J d	| j&                  f«       ‚|r±| j(                  s>| j*                  j-                  | j                  j/                  «       | j0                  «       | j                  | _        | j2                  | j                  k(  �rÝ| j*                  j5                  | j                  j/                  «       «       d| _        �n¡| j2                  s>| j*                  j7                  | j                  j/                  «       | j8                  «       | j                  | _        | j(                  �r9| j*                  j;                  | j                  j/                  «       «       d| _        nþ| j2                  | j                  k(  rf| j*                  j5                  | j                  j/                  «       «       d| _        | j(                  | j                  k7  s’J d
| j&                  f«       ‚| j(                  | j                  k(  s,J dd| j(                  d| j2                  d| j&                  f«       ‚d| _        | j*                  j;                  | j                  j/                  «       «       | j2                  su| j<                  | _        | j*                  j7                  | j                  j/                  «       | j8                  «       | j*                  j?                  | j8                  «       y| j                  jA                  «       r&| j*                  j?                  | j8                  «       yy# t
        j                  $ rß}|j                  t
        j                  k(  r#t        j                  d| j                  «       d}n”|j                  t
        j                  k(  r#t        j                  d| j                  «       d}nTt        j                  d|| j                  dj                  t        j                   t#        j$                  «       Ž «      «       ‚ Y d}~�Œ%d}~ww xY w)aI  [override] Emit data from tx_buffers all chunks are exhausted or
        sending is interrupted by an exception (typically ssl.SSLError with
        SSL_ERROR_WANT_READ/WRITE).

        Update consumer/producer registration.

        :raises Exception: error that signals that connection needs to be
            aborted

        Nz__AsyncSSLTransport._produce(): no exception from parent class, but data remains in _tx_buffers.zSSL emitter wants read: %sFzSSL emitter wants write: %sTrþ   rò   zE_AsyncSSLTransport._produce(): next_produce_on_writable is still Nonezr_AsyncSSLTransport._produce(): with empty tx_buffers, writable_action cannot be _produce when readable is _producez_AsyncSSLTransport._produce(): with empty tx_buffers, expected writable_action as _produce when readable_action is not _producezwritable_action:zreadable_action:zstate:)!r¨   r–   rÎ   r±   r¾   r   rœ   r   r�   r;   rP   rS   rŸ   rq   rõ   rö   r÷   rø   rù   rW   r  rR   ro   r\   rë   r  r‡   rž   rç   r[   rÇ   r`   Úpending)r,   Únext_produce_on_writabler   rª   s      €r   rÎ   z_AsyncSSLTransport._produce  sŠ  ø€ ð $(Ð ð	'ÜÔ$ dÑ4Ô6ð$ ×'Ò'ð 'ð:Ü;>Ø×$Ñ$ó<&ð*'ó 'Ð'ð ×ÓØ+Ð7ð +ðØ"Ÿk™kð:+ó +Ð7ñ (Ø×0Ò0Ø—J‘J×)Ñ)¨$¯*©*×*;Ñ*;Ó*=Ø*.×*BÑ*BôDà,0¯M©M�Ô)ð ×,Ñ,°·±Ó=Ø—J‘J×,Ñ,¨T¯Z©Z×->Ñ->Ó-@ÔAØ04�DÖ-ð ×0Ò0Ø—J‘J×)Ñ)¨$¯*©*×*;Ñ*;Ó*=Ø*.×*BÑ*BôDà,0¯M©M�Ô)à×,Ó,Ø—J‘J×,Ñ,¨T¯Z©Z×->Ñ->Ó-@ÔAØ04�DÕ-ð ×(Ñ(¨D¯M©MÒ9Ø—
‘
×(Ñ(¨¯©×):Ñ):Ó)<Ô=Ø,0�Ô)Ø×0Ñ0°D·M±MÒAð -ðà $§¡ðD-ó -ÐAð ×0Ñ0°D·M±MÒAð Fð&à'9Ø×-Ñ-Ð/AØ×-Ñ-¨x¸¿¹ðDFó FÐAð -1�Ô)Ø—
‘
×(Ñ(¨¯©×):Ñ):Ó)<Ô=ð ×(Ò(Ø(,¯©ˆDÔ%Ø�J‰J×!Ñ! $§*¡*×"3Ñ"3Ó"5°t×7OÑ7OÔPà�J‰J×.Ñ.¨t×/GÑ/GÕHØ�Z‰Z×ÑÔ!Ø�J‰J×.Ñ.¨t×/GÑ/GÕHð "øôU �|‰|ò 	Ø�{‰{œc×5Ñ5Ò5ä—‘Ð:¸D¿J¹JÔGØ+0Ñ(Ø—‘¤× 8Ñ 8Ò8Ü—‘Ð;¸T¿Z¹ZÔHØ+/Ñ(ä×!Ñ!ðJà˜4Ÿ:™: r§w¡wÜ!×2Ñ2´C·L±L³NÐCó(EôFð
 ÿùð	ús   …M7 Í7Q)Î
CQ$Ñ$Q))r.   r/   r0   r1   rD   rî   r|   rç   rë   rÇ   rÎ   r«   r¬   s   @r   r–   r–   a  sm   ø„ ñô
Eò(Kð: ñó ðð* ñó ðð* óFQó ðFQðP óZIó ôZIr   r–   )(r1   r¯   r   r    Úloggingr   rx   rM   r   rø   rö   Ú"pika.adapters.utils.nbio_interfacer   r   Úpika.compatr   Úpika.diagnostic_utilsÚEAGAINÚEWOULDBLOCKrô   ÚEINPROGRESSrn   Ú	getLoggerr.   r;   Údiagnostic_utilsÚcreate_log_exception_decoratorr|   r   r   r"   Úobjectr$   r4   r?   r*   r9   r¢   r•   r–   r2   r   r   ú<module>r     s  ðñó
 Û Û Û Û Û 	Û Û 
Û 
Û ÷Iã Û ð 
‡L�LØ	×Ñð"Ð ð 
×ÑØ	×Ñð,Ð (ð
 ˆ'×
Ñ
˜HÓ
%€ð ×'Ñ'×FÑFÀwÓO€ò
ò	Kòô(%˜Fô %ô&&˜vô &ôRÐ2ô ô,v(˜Fô v(ôrA˜Fô AôH
l'Øôl'ô^	GPÐ2ô GPôTGIÐ,õ GIr   