Ë
    ÂXÕ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y)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y)Ú_ReadWriteCloserc                 ó   — y ©N© )ÚselfÚns     úd/root/rosshost/parking-map/parking-api/venv/lib/python3.12/site-packages/langsmith/sandbox/_yamux.pyÚreadz_ReadWriteCloser.read,   ó   � ó    c                 ó   — y r   r   ©r   Údatas     r   Úwritez_ReadWriteCloser.write.   r   r   c                 ó   — y r   r   ©r   s    r   Úclosez_ReadWriteCloser.close0   r   r   N©r   ÚintÚreturnÚbytes©r   r    r   r   ©r   ÚNone)Ú__name__Ú
__module__Ú__qualname__r   r   r   r   r   r   r   r   +   s   „ Û(ã,ä r   r   c                  ób   — 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y)ÚYamuxStreamz¾A 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.
    c                óø   — || _         || _        t        «       | _        t	        j
                  «       | _        d| _        d| _        t        | _
        t        | _        t	        j
                  «       | _        d| _        y )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   Ú	stream_idÚsessions      r   Ú__init__zYamuxStream.__init__?   sa   € ØˆŒØˆŒä"›ˆŒÜ#×-Ñ-Ó/ˆŒØ!ˆÔØ ˆÔÜ0ˆÔä0ˆÔÜ#×-Ñ-Ó/ˆŒØ!ˆÕr   c                ó   — | j                   S r   )r*   r   s    r   r8   zYamuxStream.stream_idM   s   € à�x‰xˆr   c                óø  — d}| j                   5  | j                  sW| j                  sK| j                  s?| j                   j	                  «        | j                  s| j                  s| j                  sŒ?| j                  r| j                  st        d«      ‚| j                  s
	 ddd«       yt        |t        | j                  «      «      }t        | j                  d| «      }| j                  d|…= t        | j                  z
  }|t        dz  k\  r|}| xj                  |z  c_
        ddd«       |dkD  r)	 | j                  j                  | j                  |«       S S # 1 sw Y   Œ9xY w# t        $ r Y S w xY w)z¥Read 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   )r0   r-   r1   r2   ÚwaitÚConnectionResetErrorÚminÚlenr    r3   r4   r+   Ú_send_window_updater*   Ú	Exception)r   r   Údelta_to_sendÚsizer   Úconsumeds         r   r   zYamuxStream.readQ   sP  € ð ˆà�_‰_ñ 	.Ø—n’n¨T×->Ò->Àt×GWÒGWØ—‘×$Ñ$Ô&ð —n’n¨T×->Ò->Àt×GWÓGWð ×Ò¨¯ªÜ*Ð+GÓHÐHà—>’>Ø÷	.ð 	.ô �qœ#˜dŸn™nÓ-Ó.ˆDÜ˜Ÿ™¨¨Ð.Ó/ˆDØ—‘˜u ˜uÐ%ä+¨d×.?Ñ.?Ñ?ˆHØÔ/°1Ñ4Ò4Ø (�Ø×!Ò! XÑ-Õ!÷#	.ð& ˜1ÒðØ—‘×1Ñ1°$·(±(¸MÔJð ˆˆtˆ÷3	.ð 	.ûô, ò Øàˆðús+   �A#E Á30E Â,A<E Ä6&E, Å E)Å,	E9Å8E9c           	     óŽ  — | j                   rt        d«      ‚d}t        |«      }|t        |«      k  rý| j                  5  | j
                  dk(  rB| j                   s6| j                  j                  «        | j
                  dk(  r| j                   sŒ6| j                   rt        d«      ‚t        t        |«      |z
  | j
                  «      }| xj
                  |z  c_        ddd«       | j                  j                  | j                  t        |||z    «      «       ||z  }|t        |«      k  rŒýt        |«      S # 1 sw Y   Œ]xY w)z7Write *data*, blocking if the send window is exhausted.zyamux stream closed for writingr   N)r7   ÚBrokenPipeErrorÚ
memoryviewr@   r6   r5   r=   r?   r+   Ú
_send_datar*   r    )r   r   ÚoffsetÚmvÚchunks        r   r   zYamuxStream.writet   s  € à×ÒÜ!Ð"CÓDÐDàˆÜ˜Óˆà”s˜4“yÒ Ø—‘ñ +Ø×'Ñ'¨1Ò,°T×5FÒ5FØ—O‘O×(Ñ(Ô*ð ×'Ñ'¨1Ò,°T×5FÓ5Fà×$Ò$Ü)Ð*KÓLÐLÜœC ›I¨Ñ.°×0AÑ0AÓB�Ø×!Ò! UÑ*Õ!÷+ð �M‰M×$Ñ$ T§X¡X¬u°R¸ÀÈ%ÁÐ5PÓ/QÔRØ�e‰OˆFð ”s˜4“yÓ ô �4‹yÐ÷+ð +ús   ¿AD;ÂAD;Ä;Ec                ó¤  — | j                   s8d| _         	 | j                  j                  t        t        | j
                  d«       | j                  5  d| _        | j                  j                  «        ddd«       | j                  5  | j                  j                  «        ddd«       y# t        $ r Y Œqw xY w# 1 sw Y   ŒHxY w# 1 sw Y   yxY w)z/Close the stream (sends FIN to the remote end).Tr   N)r7   r+   Ú_send_frameÚ
_TYPE_DATAÚ	_FLAG_FINr*   rB   r0   r1   Ú
notify_allr6   r   s    r   r   zYamuxStream.closeŠ   s±   € à× Ò Ø $ˆDÔðØ—‘×)Ñ)¬*´iÀÇÁÈ1ÔMð �_‰_ñ 	)Ø $ˆDÔØ�O‰O×&Ñ&Ô(÷	)ð �_‰_ñ 	)Ø�O‰O×&Ñ&Ô(÷	)ð 	)øô ò Ùðú÷	)ð 	)ú÷	)ð 	)ús)   •0B+ Á"B:ÂCÂ+	B7Â6B7Â:CÃCc                óì   — | j                   5  | j                  j                  |«       | xj                  t	        |«      z  c_        | j                   j                  «        d d d «       y # 1 sw Y   y xY wr   )r0   r-   Úextendr4   r@   rQ   r   s     r   Ú_receive_datazYamuxStream._receive_data›   sU   € Ø�_‰_ñ 	)Ø�N‰N×!Ñ! $Ô'Ø×Ò¤ T£Ñ*ÕØ�O‰O×&Ñ&Ô(÷	)÷ 	)ñ 	)ús   �AA*Á*A3c                óˆ   — | j                   5  d| _        | j                   j                  «        d d d «       y # 1 sw Y   y xY w©NT)r0   r1   rQ   r   s    r   Ú_receive_finzYamuxStream._receive_fin¡   s6   € Ø�_‰_ñ 	)Ø $ˆDÔØ�O‰O×&Ñ&Ô(÷	)÷ 	)ñ 	)ús	   �"8¸Ac                ó  — | j                   5  d| _        | j                   j                  «        d d d «       | j                  5  d| _        | j                  j                  «        d d d «       y # 1 sw Y   Œ@xY w# 1 sw Y   y xY wrV   )r0   r2   rQ   r6   r7   r   s    r   Ú_receive_rstzYamuxStream._receive_rst¦   sq   € Ø�_‰_ñ 	)Ø#ˆDÔØ�O‰O×&Ñ&Ô(÷	)ð �_‰_ñ 	)Ø $ˆDÔØ�O‰O×&Ñ&Ô(÷	)ð 	)÷	)ð 	)ú÷	)ð 	)ús   �"A.Á"A:Á.A7Á:Bc                ó¤   — | j                   5  | xj                  |z  c_        | j                   j                  «        d d d «       y # 1 sw Y   y xY wr   )r6   r5   rQ   )r   Údeltas     r   Ú_update_send_windowzYamuxStream._update_send_window®   s?   € Ø�_‰_ñ 	)Ø×Ò Ñ&ÕØ�O‰O×&Ñ&Ô(÷	)÷ 	)ñ 	)ús   �0AÁAN)r8   r   r9   ÚYamuxSessionr   r#   )r   r   r   r!   r"   )r   r    r   r#   )r[   r   r   r#   )r$   r%   r&   Ú__doc__r:   Úpropertyr8   r   r   r   rT   rW   rY   r\   r   r   r   r(   r(   8   sD   „ ñó"ð òó ðó!ó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y)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()
    c                óÖ  — || _         i | _        d| _        t        j                  «       | _        t        j                  «       | _        d| _        t        j                  «       | _	        t        j                  | j                  dd¬«      | _        | j                  j                  «        t        j                  | j                  dd¬«      | _        | j                  j                  «        y )Nr   FTzyamux-reader)ÚtargetÚdaemonÚnamezyamux-keepalive)Ú_connÚ_streamsÚ_next_stream_idr.   ÚLockÚ_lockÚ_write_lockÚ_closedÚEventÚ_shutdown_eventÚThreadÚ
_read_loopÚ_reader_threadÚstartÚ_keepalive_loopÚ_keepalive_thread)r   Úconns     r   r:   zYamuxSession.__init__Ê   s²   € ØˆŒ
Ø02ˆŒØ ˆÔÜ—^‘^Ó%ˆŒ
Ü$Ÿ>™>Ó+ˆÔØˆŒÜ(Ÿ™Ó0ˆÔä'×.Ñ.Ø—?‘?¨4°nô
ˆÔð 	×Ñ×!Ñ!Ô#ä!*×!1Ñ!1Ø×'Ñ'°Ð;Lô"
ˆÔð 	×Ñ×$Ñ$Õ&r   c                ó   — | j                   S r   )rk   r   s    r   Ú	is_closedzYamuxSession.is_closedÝ   s   € à�|‰|Ðr   c                ó&  — | j                   5  | j                  rt        d«      ‚| j                  }| xj                  dz  c_        t	        || «      }|| j
                  |<   ddd«       | j                  t        t        d«       S # 1 sw Y   Œ'xY w)zgOpen a new multiplexed stream.

        Raises :class:`RuntimeError` if the session is closed.
        zyamux session is closedr   Nr   )	ri   rk   ÚRuntimeErrorrg   r(   rf   rN   Ú_TYPE_WINDOW_UPDATEÚ	_FLAG_SYN)r   r8   Ústreams      r   Úopen_streamzYamuxSession.open_streamá   s…   € ð
 �Z‰Zñ 	.Ø�|Š|Ü"Ð#<Ó=Ð=Ø×,Ñ,ˆIØ× Ò  AÑ%Õ Ü  ¨DÓ1ˆFØ'-ˆD�M‰M˜)Ñ$÷	.ð 	×ÑÔ,¬i¸ÀAÔFØˆ÷	.ð 	.ús   �ABÂBc                ó¦  — | j                   ryd| _         | j                  j                  «        	 | j                  t        ddd«       | j                  5  | j                  j                  «       D ]  }|j                  «        Œ 	 ddd«       	 | j                  j                  «        y# t
        $ r Y Œlw xY w# 1 sw Y   Œ4xY w# t
        $ r Y yw xY w)z"Close the session and all streams.NTr   )rk   rm   ÚsetrN   Ú_TYPE_GO_AWAYrB   ri   rf   ÚvaluesrY   re   r   )r   r{   s     r   r   zYamuxSession.closeñ   sÀ   € à�<Š<ØØˆŒØ×Ñ× Ñ Ô"ð	Ø×Ñœ]¨A¨q°!Ô4ð �Z‰Zñ 	&ØŸ-™-×.Ñ.Ó0ò &�Ø×#Ñ#Õ%ñ&÷	&ð	Ø�J‰J×ÑÕøô ò 	Ùð	ú÷	&ð 	&ûô ò 	Ùð	ús/   °B) Á0B8ÂC Â)	B5Â4B5Â8CÃ	CÃCc                óÀ   — t        j                  t        t        ||||«      }| j                  5  | j
                  j                  |«       d d d «       y # 1 sw Y   y xY wr   )ÚstructÚpackÚ_HEADER_FMTÚ_VERSIONrj   re   r   )r   Úmsg_typeÚflagsr8   ÚlengthÚhdrs         r   rN   zYamuxSession._send_frame  sL   € ô �k‰kœ+¤x°¸5À)ÈVÓTˆØ×Ññ 	"Ø�J‰J×Ñ˜SÔ!÷	"÷ 	"ñ 	"ús   ¯AÁAc           
     óà   — t        j                  t        t        t        d|t        |«      «      }| j                  5  | j                  j                  ||z   «       d d d «       y # 1 sw Y   y xY w©Nr   )	r‚   rƒ   r„   r…   rO   r@   rj   re   r   )r   r8   r   r‰   s       r   rI   zYamuxSession._send_data  sR   € Ü�k‰kœ+¤x´¸QÀ	Ì3ÈtË9ÓUˆØ×Ññ 	)Ø�J‰J×Ñ˜S 4™ZÔ(÷	)÷ 	)ñ 	)ús   ¼A$Á$A-c                ó4   — | j                  t        d||«       y r‹   )rN   ry   )r   r8   r[   s      r   rA   z YamuxSession._send_window_update  s   € Ø×ÑÔ,¨a°¸EÕBr   c                óÀ  — 	 | j                   s¿| j                  j                  t        «      }t	        |«      t        k  rn�t        j                  t        |«      \  }}}}}|t        k(  r| j                  |||«       nC|t        k(  r| j                  |||«       n&|t        k(  r| j                  ||«       n
|t        k(  rn| j                   sŒ¿| j                   sgd| _         | j                   j#                  «        | j$                  5  | j&                  j)                  «       D ]  }|j+                  «        Œ 	 d d d «       y y # t        $ r Y Œw xY w# 1 sw Y   y xY w# | j                   ssd| _         | j                   j#                  «        | j$                  5  | j&                  j)                  «       D ]  }|j+                  «        Œ 	 d d d «       w # 1 sw Y   w xY ww xY wrV   )rk   re   r   Ú_HEADER_SIZEr@   r‚   Úunpackr„   rO   Ú_handle_datary   Ú_handle_window_updateÚ
_TYPE_PINGÚ_handle_pingr   rB   rm   r~   ri   rf   r€   rY   )r   Ú	hdr_bytesÚ_verr†   r‡   r8   rˆ   r{   s           r   ro   zYamuxSession._read_loop  s   € ð	.Ø—l’lØ ŸJ™JŸO™O¬LÓ9�	Ü�y“>¤LÒ0Øä;A¿=¹=Ü ó<Ñ8��h  y°&ð œzÒ)Ø×%Ñ% e¨Y¸Õ?ØÔ!4Ò4Ø×.Ñ.¨u°iÀÕHØ¤Ò+Ø×%Ñ% e¨VÕ4Ø¤Ò.Øð! —l“lð( —<’<Ø#�”Ø×$Ñ$×(Ñ(Ô*Ø—Z‘Zñ .Ø"&§-¡-×"6Ñ"6Ó"8ò .˜Ø×+Ñ+Õ-ñ.÷.ð .ð  øô ò 	Ùð	ú÷.ð .ûð —<’<Ø#�”Ø×$Ñ$×(Ñ(Ô*Ø—Z‘Zñ .Ø"&§-¡-×"6Ñ"6Ó"8ò .˜Ø×+Ñ+Õ-ñ.÷.÷ .ñ .úð  úsH   ‚C
E Ä0EÅ	EÅ
E ÅEÅE ÅEÅ:GÆ0GÇ	GÇGÇGc                óR  — |dkD  r| j                   j                  |«      nd}| j                  5  | j                  j	                  |«      }d d d «       €y |r|j                  |«       |t        z  r|j                  «        |t        z  r|j                  «        y y # 1 sw Y   ŒSxY w)Nr   r   )
re   r   ri   rf   ÚgetrT   rP   rW   Ú	_FLAG_RSTrY   )r   r‡   r8   rˆ   Úpayloadr{   s         r   r�   zYamuxSession._handle_data6  s’   € Ø-3°aªZ�$—*‘*—/‘/ &Ô)¸Sˆà�Z‰Zñ 	2Ø—]‘]×&Ñ& yÓ1ˆF÷	2àˆ>ØáØ× Ñ  Ô)Ø”9ÒØ×ÑÔ!Ø”9ÒØ×ÑÕ!ð ÷	2ð 	2ús   ¯BÂB&c                ó  — | j                   5  | j                  j                  |«      }d d d «       €y |dkD  r|j                  |«       |t        z  r|j                  «        |t        z  r|j                  «        y y # 1 sw Y   ŒVxY wr‹   )ri   rf   r—   r\   rP   rW   r˜   rY   )r   r‡   r8   rˆ   r{   s        r   r‘   z"YamuxSession._handle_window_updateE  s|   € Ø�Z‰Zñ 	2Ø—]‘]×&Ñ& yÓ1ˆF÷	2àˆ>Øà�AŠ:Ø×&Ñ& vÔ.Ø”9ÒØ×ÑÔ!Ø”9ÒØ×ÑÕ!ð ÷	2ð 	2ús   �A>Á>Bc                óp   — |t         z  r	 | j                  t        t        d|«       y y # t        $ r Y y w xY wr‹   )rz   rN   r’   Ú	_FLAG_ACKrB   )r   r‡   Úopaques      r   r“   zYamuxSession._handle_pingR  s<   € Ø”9ÒðØ× Ñ ¤¬Y¸¸6ÕBð øô ò Ùðús   ‹) ©	5´5c                óÚ   — d}| j                   j                  d«      s?|dz  }	 | j                  t        t        d|«       | j                   j                  d«      sŒ>y y # t
        $ r Y y w xY w)Nr   é   r   )rm   r=   rN   r’   rz   rB   )r   Úping_ids     r   rr   zYamuxSession._keepalive_loop[  sg   € ØˆØ×&Ñ&×+Ñ+¨BÔ/Ø�q‰LˆGðØ× Ñ ¤¬Y¸¸7ÔCð ×&Ñ&×+Ñ+¨B×/øô ò Ùðús   ¤A Á	A*Á)A*N)rt   r   r   r#   )r   Úbool)r   r(   r"   )
r†   r   r‡   r   r8   r   rˆ   r   r   r#   )r8   r   r   r    r   r#   )r8   r   r[   r   r   r#   )r‡   r   r8   r   rˆ   r   r   r#   )r‡   r   r�   r   r   r#   )r$   r%   r&   r^   r:   r_   rv   r|   r   rN   rI   rA   ro   r�   r‘   r“   rr   r   r   r   r]   r]   ¹   s{   „ ñó 'ð& òó ðóó ð."Øð"Ø$'ð"Ø47ð"ØADð"à	ó"ó)ó
Có
.ó:"ó"óôr   r]   )r^   Ú
__future__r   r‚   r.   Útypingr   r…   rO   ry   r’   r   rz   rœ   rP   r˜   rŽ   r„   r3   r   r(   r]   r   r   r   ú<module>r¤      s}   ðñõ #ã Û Ý ð €à€
ØÐ Ø€
Ø€à€	Ø€	Ø€	Ø€	à€Ø€à!Ð ô!�xô !÷y)ñ y)÷Biò ir   