
    a
i+                        d Z ddlmZ ddlZddlZddlmZ dZdZdZ	dZ
dZdZdZdZd	Zd
ZdZdZ G d de          Z G d d          Z G d d          ZdS )aE  Minimal yamux (Yet Another Multiplexer) client for TCP tunneling.

Implements the client side of the yamux protocol as specified at
https://github.com/hashicorp/yamux/blob/master/spec.md

Only the subset needed for tunnel client operation is implemented:
opening streams, sending/receiving data, flow control, and keepalive.
    )annotationsN)Protocol                  z>BBHIIi   c                  &    e Zd ZddZddZdd	Zd
S )_ReadWriteClosernintreturnbytesc                    d S N )selfr   s     C:\Users\Dell Inspiron 16\Desktop\tws\AgrotaPowerBi\back-agrota-powerbi\mcp-client-agrota\venv\Lib\site-packages\langsmith/sandbox/_yamux.pyreadz_ReadWriteCloser.read,             datac                    d S r   r   r   r   s     r   writez_ReadWriteCloser.write.   r   r   Nonec                    d S r   r   r   s    r   closez_ReadWriteCloser.close0   r   r   Nr   r   r   r   r   r   r   r   r   r   )__name__
__module____qualname__r   r   r    r   r   r   r   r   +   s4        ((((,,,,      r   r   c                  j    e Zd ZdZddZedd	            ZddZddZddZ	ddZ
ddZddZddZdS )YamuxStreamzA single multiplexed stream within a yamux session.

    Streams are created via :meth:`YamuxSession.open_stream` and provide
    blocking read/write/close with per-stream flow control.
    	stream_idr   sessionYamuxSessionr   r   c                   || _         || _        t                      | _        t	          j                    | _        d| _        d| _        t          | _
        t          | _        t	          j                    | _        d| _        d S )NF)_id_session	bytearray	_recv_buf	threading	Condition
_recv_cond_recv_closed_recv_error_INITIAL_WINDOW_SIZE_recv_window_send_window
_send_cond_send_closed)r   r)   r*   s      r   __init__zYamuxStream.__init__?   si    "#-//! 00#-//!r   c                    | j         S r   )r-   r   s    r   r)   zYamuxStream.stream_idM   s	    xr   r   r   c                   d}| j         5  | j        s<| j        s5| j        s.| j                                          | j        s| j        s| j        .| j        r| j        st          d          | j        s	 ddd           dS t          |t          | j                            }t          | j        d|                   }| j        d|= t          | j
        z
  }|t          dz  k    r|}| xj
        |z  c_
        ddd           n# 1 swxY w Y   |dk    r2	 | j                            | j        |           n# t          $ r Y nw xY w|S )zRead up to *n* bytes, blocking until data is available.

        Returns ``b""`` on EOF (FIN received).
        Raises :class:`ConnectionResetError` on RST.
        r   zyamux stream reset by peerNr   r   )r3   r0   r4   r5   waitConnectionResetErrorminlenr   r6   r7   r.   _send_window_updater-   	Exception)r   r   delta_to_sendsizer   consumeds         r   r   zYamuxStream.readQ   s    _ 	. 	.n 'T-> 'tGW '$$&&& n 'T-> 'tGW '  I I*+GHHH> 	. 	. 	. 	. 	. 	. 	. 	. q#dn--..D.//Duu%+d.??H/1444 (!!X-!!#	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	.& 111$(MJJJJ    s+   A)D A7DD
D D6 6
EEr   c           	        | j         rt          d          d}t          |          }|t          |          k     r| j        5  | j        dk    r2| j         s+| j                                         | j        dk    r| j         +| j         rt          d          t          t          |          |z
  | j                  }| xj        |z  c_        ddd           n# 1 swxY w Y   | j        	                    | j
        t          ||||z                                 ||z  }|t          |          k     t          |          S )z7Write *data*, blocking if the send window is exhausted.zyamux stream closed for writingr   N)r:   BrokenPipeError
memoryviewrA   r9   r8   r>   r@   r.   
_send_datar-   r   )r   r   offsetmvchunks        r   r   zYamuxStream.writet   s    	E!"CDDDs4yy   + +'1,,T5F,O((*** '1,,T5F,$ M)*KLLLCII.0ABB!!U*!!+ + + + + + + + + + + + + + + M$$TXuR%8O5P/Q/QRRReOF s4yy   4yys   B	CCCc                   | j         sEd| _         	 | j                            t          t          | j        d           n# t          $ r Y nw xY w| j        5  d| _        | j        	                                 ddd           n# 1 swxY w Y   | j
        5  | j
        	                                 ddd           dS # 1 swxY w Y   dS )z/Close the stream (sends FIN to the remote end).Tr   N)r:   r.   _send_frame
_TYPE_DATA	_FLAG_FINr-   rC   r3   r4   
notify_allr9   r   s    r   r    zYamuxStream.close   sX     	 $D))*i1MMMM    _ 	) 	) $DO&&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) _ 	) 	)O&&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s3   ,= 
A
	A
!BBBB::B>B>c                    | j         5  | j                            |           | xj        t	          |          z  c_        | j                                          d d d            d S # 1 swxY w Y   d S r   )r3   r0   extendr7   rA   rR   r   s     r   _receive_datazYamuxStream._receive_data   s    _ 	) 	)N!!$'''T*O&&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   AA&&A*-A*c                    | j         5  d| _        | j                                          d d d            d S # 1 swxY w Y   d S NT)r3   r4   rR   r   s    r   _receive_finzYamuxStream._receive_fin   s    _ 	) 	) $DO&&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   !6::c                   | j         5  d| _        | j                                          d d d            n# 1 swxY w Y   | j        5  d| _        | j                                         d d d            d S # 1 swxY w Y   d S rW   )r3   r5   rR   r9   r:   r   s    r   _receive_rstzYamuxStream._receive_rst   s   _ 	) 	)#DO&&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) _ 	) 	) $DO&&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   !599!A55A9<A9deltac                    | j         5  | xj        |z  c_        | j                                          d d d            d S # 1 swxY w Y   d S r   )r9   r8   rR   )r   r[   s     r   _update_send_windowzYamuxStream._update_send_window   s    _ 	) 	)&O&&(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   *?AAN)r)   r   r*   r+   r   r   )r   r   r!   r"   r#   )r   r   r   r   )r[   r   r   r   )r$   r%   r&   __doc__r;   propertyr)   r   r   r    rU   rX   rZ   r]   r   r   r   r(   r(   8   s         " " " "    X! ! ! !F   ,) ) ) )") ) ) )) ) ) )
) ) ) )) ) ) ) ) )r   r(   c                      e Zd ZdZddZedd            Zd d
Zd!dZd"dZ	d#dZ
d$dZd!dZd%dZd%dZd&dZd!dZdS )'r+   a  Client-side yamux session over a byte-stream connection.

    The connection must implement ``read(n) -> bytes``, ``write(data) -> int``,
    and ``close() -> None``.  Typically this is a :class:`_WSAdapter` wrapping
    a WebSocket.

    Usage::

        session = YamuxSession(conn)
        stream = session.open_stream()
        stream.write(b"hello")
        data = stream.read(1024)
        stream.close()
        session.close()
    connr   r   r   c                   || _         i | _        d| _        t          j                    | _        t          j                    | _        d| _        t          j                    | _	        t          j
        | j        dd          | _        | j                                         t          j
        | j        dd          | _        | j                                         d S )Nr   FTzyamux-reader)targetdaemonnamezyamux-keepalive)_conn_streams_next_stream_idr1   Lock_lock_write_lock_closedEvent_shutdown_eventThread
_read_loop_reader_threadstart_keepalive_loop_keepalive_thread)r   ra   s     r   r;   zYamuxSession.__init__   s    
02 ^%%
$>++(00'.?4n
 
 
 	!!###!*!1';L"
 "
 "
 	$$&&&&&r   boolc                    | j         S r   )rl   r   s    r   	is_closedzYamuxSession.is_closed   s
    |r   r(   c                   | j         5  | j        rt          d          | j        }| xj        dz  c_        t	          ||           }|| j        |<   ddd           n# 1 swxY w Y   |                     t          t          |d           |S )zgOpen a new multiplexed stream.

        Raises :class:`RuntimeError` if the session is closed.
        zyamux session is closedr   Nr   )	rj   rl   RuntimeErrorrh   r(   rg   rO   _TYPE_WINDOW_UPDATE	_FLAG_SYN)r   r)   streams      r   open_streamzYamuxSession.open_stream   s    
 Z 	. 	.| >"#<===,I  A%   D11F'-DM)$	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	. 	,iAFFFs   AAA #A c                   | j         rdS d| _         | j                                         	 |                     t          ddd           n# t
          $ r Y nw xY w| j        5  | j                                        D ]}|	                                 	 ddd           n# 1 swxY w Y   	 | j
                                         dS # t
          $ r Y dS w xY w)z"Close the session and all streams.NTr   )rl   rn   setrO   _TYPE_GO_AWAYrC   rj   rg   valuesrZ   rf   r    )r   r|   s     r   r    zYamuxSession.close   sF   < 	F  """	]Aq!4444 	 	 	D	 Z 	& 	&-..00 & &##%%%%&	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	& 	&	J 	 	 	DD	s5   A	 	
AA 1BB"%B"*C 
CCmsg_typer   flagsr)   lengthc                    t          j        t          t          ||||          }| j        5  | j                            |           d d d            d S # 1 swxY w Y   d S r   )structpack_HEADER_FMT_VERSIONrk   rf   r   )r   r   r   r)   r   hdrs         r   rO   zYamuxSession._send_frame  s     k+x5)VTT 	" 	"JS!!!	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	"s   AAAr   r   c           
         t          j        t          t          t          d|t          |                    }| j        5  | j                            ||z              d d d            d S # 1 swxY w Y   d S Nr   )	r   r   r   r   rP   rA   rk   rf   r   )r   r)   r   r   s       r   rJ   zYamuxSession._send_data  s    k+xQ	3t99UU 	) 	)JS4Z(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)s   A((A,/A,r[   c                @    |                      t          d||           d S r   )rO   rz   )r   r)   r[   s      r   rB   z YamuxSession._send_window_update  s#    ,aEBBBBBr   c                   	 | j         s| j                            t                    }t	          |          t          k     rnt          j        t          |          \  }}}}}|t          k    r| 	                    |||           nQ|t          k    r|                     |||           n.|t          k    r|                     ||           n|t          k    rn| j         n# t          $ r Y nw xY w| j         ssd| _         | j                                         | j        5  | j                                        D ]}|                                 	 d d d            d S # 1 swxY w Y   d S d S # | j         sqd| _         | j                                         | j        5  | j                                        D ]}|                                 	 d d d            w # 1 swxY w Y   w w xY wrW   )rl   rf   r   _HEADER_SIZErA   r   unpackr   rP   _handle_datarz   _handle_window_update
_TYPE_PING_handle_pingr   rC   rn   r   rj   rg   r   rZ   )r   	hdr_bytes_verr   r   r)   r   r|   s           r   rp   zYamuxSession._read_loop  s   	.l  JOOL99	y>>L00;A=< <8hy& z))%%eY????!444..uiHHHH++%%eV4444..! l "  	 	 	D	 < .#$((***Z . ."&-"6"6"8"8 . .++----.. . . . . . . . . . . . . . . . . .. .4< .#$((***Z . ."&-"6"6"8"8 . .++----.. . . . . . . . . . . . . . . ..s`   CC E) 
C*'E) )C**E) 1EE!E)/G#1G
G#GG#GG#c                n   |dk    r| j                             |          nd}| j        5  | j                            |          }d d d            n# 1 swxY w Y   |d S |r|                    |           |t          z  r|                                 |t          z  r|	                                 d S d S )Nr   r   )
rf   r   rj   rg   getrU   rQ   rX   	_FLAG_RSTrZ   )r   r   r)   r   payloadr|   s         r   r   zYamuxSession._handle_data6  s   -3aZZ$*//&)))SZ 	2 	2]&&y11F	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2>F 	*  )))9 	"!!!9 	"!!!!!	" 	"s   AAAc                2   | j         5  | j                            |          }d d d            n# 1 swxY w Y   |d S |dk    r|                    |           |t          z  r|                                 |t          z  r|                                 d S d S r   )rj   rg   r   r]   rQ   rX   r   rZ   )r   r   r)   r   r|   s        r   r   z"YamuxSession._handle_window_updateE  s    Z 	2 	2]&&y11F	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2>FA::&&v...9 	"!!!9 	"!!!!!	" 	"s   /33opaquec                    |t           z  r6	 |                     t          t          d|           d S # t          $ r Y d S w xY wd S r   )r{   rO   r   	_FLAG_ACKrC   )r   r   r   s      r   r   zYamuxSession._handle_pingR  s`    9 	  Y6BBBBB   	 	s   "0 
>>c                    d}| j                             d          sV|dz  }	 |                     t          t          d|           n# t
          $ r Y d S w xY w| j                             d          Td S d S )Nr      r   )rn   r>   rO   r   r{   rC   )r   ping_ids     r   rs   zYamuxSession._keepalive_loop[  s    &++B// 	qLG  Y7CCCC   	 &++B// 	 	 	 	 	s   "A 
AAN)ra   r   r   r   )r   ru   )r   r(   r#   )
r   r   r   r   r)   r   r   r   r   r   )r)   r   r   r   r   r   )r)   r   r[   r   r   r   )r   r   r)   r   r   r   r   r   )r   r   r   r   r   r   )r$   r%   r&   r^   r;   r_   rw   r}   r    rO   rJ   rB   rp   r   r   r   rs   r   r   r   r+   r+      s         ' ' ' '&    X       ." " " ") ) ) )
C C C C
. . . .:" " " "" " " "        r   r+   )r^   
__future__r   r   r1   typingr   r   rP   rz   r   r   r{   r   rQ   r   r   r   r6   r   r(   r+   r   r   r   <module>r      s!    # " " " " "            
 
				! ! ! ! ! !x ! ! !y) y) y) y) y) y) y) y)Bi i i i i i i i i ir   