ó
    üÞ jÞ+  ã                  óž   • S r SSKJr  SSKrSSKrSSKJr  SrSrSr	Sr
SrSrSrSrS	rS
rSrSr " S S\5      r " S S5      r " S S5      rg)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                  ó2   • \ rS rSrSS jrSS jrS	S jrSrg)
Ú_ReadWriteCloseré+   c                ó   • g ©N© )ÚselfÚns     ÚR/var/www/html/gaurav/venv/lib/python3.13/site-packages/langsmith/sandbox/_yamux.pyÚreadÚ_ReadWriteCloser.read,   s   €  Só    c                ó   • g r   r   ©r   Údatas     r   ÚwriteÚ_ReadWriteCloser.write.   s   € ¨r   c                ó   • g r   r   ©r   s    r   ÚcloseÚ_ReadWriteCloser.close0   s   € ˜Sr   r   N©r   ÚintÚreturnÚbytes©r   r#   r"   r!   ©r"   ÚNone)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r   Ú__static_attributes__r   r   r   r   r   +   s   † Ü(ä,ç r   r   c                  ó|   • \ rS rSrSrSS jr\SS j5       rSS jrSS jr	SS jr
SS jrSS	 jrSS
 jrSS jrSrg)ÚYamuxStreamé8   z²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                óø   • Xl         X l        [        5       U l        [        R
                  " 5       U l        SU l        SU l        [        U l
        [        U l        [        R
                  " 5       U l        SU l        g )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__ÚYamuxStream.__init__?   s]   € ØŒØŒä"›ˆŒÜ#×-Ò-Ó/ˆŒØ!ˆÔØ ˆÔÜ0ˆÔä0ˆÔÜ#×-Ò-Ó/ˆŒØ!ˆÕr   c                ó   • U R                   $ r   )r0   r   s    r   r>   ÚYamuxStream.stream_idM   s   € à�x‰xˆr   c                ód  • SnU R                      U R                  (       dq  U R                  (       d`  U R                  (       dO  U R                   R	                  5         U R                  (       d$  U R                  (       d  U R                  (       d  MO  U R                  (       a  U R                  (       d  [        S5      eU R                  (       d
   SSS5        g[        U[        U R                  5      5      n[        U R                  SU 5      nU R                  SU2	 [        U R                  -
  nU[        S-  :¼  a  UnU =R                  U-  sl
        SSS5        US:”  a)   U R                  R                  U R                  U5        W$ W$ ! , (       d  f       N?= f! [         a     W$ f = f)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   )r6   r3   r7   r8   ÚwaitÚConnectionResetErrorÚminÚlenr#   r9   r:   r1   Ú_send_window_updater0   Ú	Exception)r   r   Údelta_to_sendÚsizer   Úconsumeds         r   r   ÚYamuxStream.readQ   sH  € ð ˆà�_‹_Ø—n—n¨T×->×->Àt×GW×GWØ—‘×$Ñ$Ô&ð —n—n¨T×->×->Àt×GW×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+   �BFÂ?FÃA=FÅ&&F! Æ
FÆ!
F/Æ.F/c           	     óÌ  • U R                   (       a  [        S5      eSn[        U5      nU[        U5      :  Ga  U R                     U R
                  S:X  aN  U R                   (       d=  U R                  R                  5         U R
                  S:X  a  U R                   (       d  M=  U R                   (       a  [        S5      e[        [        U5      U-
  U R
                  5      nU =R
                  U-  sl        SSS5        U R                  R                  U R                  [        X2UW-    5      5        X$-  nU[        U5      :  a  GM  [        U5      $ ! , (       d  f       Nc= f)z7Write *data*, blocking if the send window is exhausted.zyamux stream closed for writingr   N)r=   ÚBrokenPipeErrorÚ
memoryviewrH   r<   r;   rE   rG   r1   Ú
_send_datar0   r#   )r   r   ÚoffsetÚmvÚchunks        r   r   ÚYamuxStream.writet   s  € à××Ü!Ð"CÓDÐDàˆÜ˜Óˆà”s˜4“yÔ Ø—“Ø×'Ñ'¨1Ó,°T×5F×5FØ—O‘O×(Ñ(Ô*ð ×'Ñ'¨1Ó,°T×5F×5FÑ5Fà×$×$Ü)Ð*KÓLÐLÜœC ›I¨Ñ.°×0AÑ0AÓB�Ø×!Ò! UÑ*Õ!÷ !ð �M‰M×$Ñ$ T§X¡X¬u°RÀÈ%ÁÐ5PÓ/QÔRØ‰OˆFð ”s˜4“yÖ ô �4‹yÐ÷ !•ús   ÁAEÂ%AEÅ
E#c                óÄ  • U R                   (       d8  SU l          U R                  R                  [        [        U R
                  S5        U R                     SU l        U R                  R                  5         SSS5        U R                     U R                  R                  5         SSS5        g! [         a     Nrf = f! , (       d  f       NN= f! , (       d  f       g= f)z/Close the stream (sends FIN to the remote end).Tr   N)r=   r1   Ú_send_frameÚ
_TYPE_DATAÚ	_FLAG_FINr0   rJ   r6   r7   Ú
notify_allr<   r   s    r   r   ÚYamuxStream.closeŠ   sž   € à× × Ø $ˆDÔðØ—‘×)Ñ)¬*´iÀÇÁÈ1ÔMð �_‹_Ø $ˆDÔØ�O‰O×&Ñ&Ô(÷ ð �_‹_Ø�O‰O×&Ñ&Ô(÷ ˆ_øô ó Ùðú÷ �_ú÷ �_ús)   š0B0 Á"C ÂCÂ0
B=Â<B=Ã 
CÃ
Cc                óö   • U R                      U R                  R                  U5        U =R                  [	        U5      -  sl        U R                   R                  5         S S S 5        g ! , (       d  f       g = fr   )r6   r3   Úextendr:   rH   r[   r   s     r   Ú_receive_dataÚYamuxStream._receive_data›   sJ   € Ø�_‹_Ø�N‰N×!Ñ! $Ô'Ø×Ò¤ T£Ñ*ÕØ�O‰O×&Ñ&Ô(÷ �_Ž_ús   �AA*Á*
A8c                ó’   • U R                      SU l        U R                   R                  5         S S S 5        g ! , (       d  f       g = f©NT)r6   r7   r[   r   s    r   Ú_receive_finÚYamuxStream._receive_fin¡   s+   € Ø�_‹_Ø $ˆDÔØ�O‰O×&Ñ&Ô(÷ �_Ž_ús	   �"8¸
Ac                ó   • U R                      SU l        U R                   R                  5         S S S 5        U R                     SU l        U R                  R                  5         S S S 5        g ! , (       d  f       NE= f! , (       d  f       g = frb   )r6   r8   r[   r<   r=   r   s    r   Ú_receive_rstÚYamuxStream._receive_rst¦   s^   € Ø�_‹_Ø#ˆDÔØ�O‰O×&Ñ&Ô(÷ ð �_‹_Ø $ˆDÔØ�O‰O×&Ñ&Ô(÷ ˆ_÷ �_ú÷ �_ús   �"A.Á"A?Á.
A<Á?
Bc                ó®   • U R                      U =R                  U-  sl        U R                   R                  5         S S S 5        g ! , (       d  f       g = fr   )r<   r;   r[   )r   Údeltas     r   Ú_update_send_windowÚYamuxStream._update_send_window®   s4   € Ø�_‹_Ø×Ò Ñ&ÕØ�O‰O×&Ñ&Ô(÷ �_Ž_ús   �0AÁ
A)
r0   r3   r7   r6   r8   r:   r=   r<   r;   r1   N)r>   r!   r?   ÚYamuxSessionr"   r&   )r"   r!   r    r$   r%   )r   r#   r"   r&   )ri   r!   r"   r&   )r'   r(   r)   r*   Ú__doc__r@   Úpropertyr>   r   r   r   r_   rc   rf   rj   r+   r   r   r   r-   r-   8   sD   † ñô"ð óó ðô!ôFô,)ô")ô)ô
)÷)r   r-   c                  ó®   • \ rS rSrSrSS jr\SS j5       rSS jrSS jr	          SS jr
SS jrSS	 jrSS
 jrSS jrSS jrSS jrSS jrSrg)rl   é¹   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                óÒ  • Xl         0 U l        SU l        [        R                  " 5       U l        [        R                  " 5       U l        SU l        [        R                  " 5       U l	        [        R                  " U R                  SSS9U l        U R                  R                  5         [        R                  " U R                  SSS9U l        U R                  R                  5         g )Nr   FTzyamux-reader)ÚtargetÚdaemonÚnamezyamux-keepalive)Ú_connÚ_streamsÚ_next_stream_idr4   ÚLockÚ_lockÚ_write_lockÚ_closedÚEventÚ_shutdown_eventÚThreadÚ
_read_loopÚ_reader_threadÚstartÚ_keepalive_loopÚ_keepalive_thread)r   Úconns     r   r@   ÚYamuxSession.__init__Ê   s°   € ØŒ
Ø02ˆŒØ ˆÔÜ—^’^Ó%ˆŒ
Ü$Ÿ>š>Ó+ˆÔØˆŒÜ(ŸšÓ0ˆÔä'×.Ò.Ø—?‘?¨4°nñ
ˆÔð 	×Ñ×!Ñ!Ô#ä!*×!1Ò!1Ø×'Ñ'°Ð;Lñ"
ˆÔð 	×Ñ×$Ñ$Õ&r   c                ó   • U R                   $ r   )r{   r   s    r   Ú	is_closedÚYamuxSession.is_closedÝ   s   € à�|‰|Ðr   c                ó6  • U R                      U R                  (       a  [        S5      eU R                  nU =R                  S-  sl        [	        X5      nX R
                  U'   SSS5        U R                  [        [        WS5        W$ ! , (       d  f       N,= f)zWOpen a new multiplexed stream.

Raises :class:`RuntimeError` if the session is closed.
zyamux session is closedr   Nr   )	ry   r{   ÚRuntimeErrorrw   r-   rv   rX   Ú_TYPE_WINDOW_UPDATEÚ	_FLAG_SYN)r   r>   Ústreams      r   Úopen_streamÚYamuxSession.open_streamá   sy   € ð
 �Z‹ZØ�|�|Ü"Ð#<Ó=Ð=Ø×,Ñ,ˆIØ× Ò  AÑ%Õ Ü  Ó1ˆFØ'-�M‰M˜)Ñ$÷ ð 	×ÑÔ,¬i¸ÀAÔFØˆ÷ �Zús   �AB
Â

Bc                óÀ  • U R                   (       a  gSU l         U R                  R                  5          U R                  [        SSS5        U R                     U R                  R                  5        H  nUR                  5         M     SSS5         U R                  R                  5         g! [
         a     Nnf = f! , (       d  f       N:= f! [
         a     gf = f)z"Close the session and all streams.NTr   )r{   r}   ÚsetrX   Ú_TYPE_GO_AWAYrJ   ry   rv   Úvaluesrf   ru   r   )r   r�   s     r   r   ÚYamuxSession.closeñ   s³   € à�<�<ØØˆŒØ×Ñ× Ñ Ô"ð	Ø×Ñœ]¨A¨q°!Ô4ð �Z‹ZØŸ-™-×.Ñ.Ö0�Ø×#Ñ#Ö%ñ 1÷ ð	Ø�J‰J×ÑÕøô ó 	Ùð	ú÷ �Zûô ó 	Ùð	ús/   µB/ Á2B?ÂC Â/
B<Â;B<Â?
CÃ
CÃCc                óÈ   • [         R                  " [        [        XX45      nU R                     U R
                  R                  U5        S S S 5        g ! , (       d  f       g = fr   )ÚstructÚpackÚ_HEADER_FMTÚ_VERSIONrz   ru   r   )r   Úmsg_typeÚflagsr>   ÚlengthÚhdrs         r   rX   ÚYamuxSession._send_frame  s?   € ô �kŠkœ+¤x°À)ÓTˆØ×ÓØ�J‰J×Ñ˜SÔ!÷ ×Öús   ®AÁ
A!c           
     óê   • [         R                  " [        [        [        SU[        U5      5      nU R                     U R                  R                  X2-   5        S S S 5        g ! , (       d  f       g = f©Nr   )	r–   r—   r˜   r™   rY   rH   rz   ru   r   )r   r>   r   r�   s       r   rR   ÚYamuxSession._send_data  sG   € Ü�kŠkœ+¤x´¸QÀ	Ì3ÈtË9ÓUˆØ×ÓØ�J‰J×Ñ˜S™ZÔ(÷ ×Öús   ½A$Á$
A2c                ó2   • U R                  [        SX5        g r    )rX   r‹   )r   r>   ri   s      r   rI   Ú YamuxSession._send_window_update  s   € Ø×ÑÔ,¨a°ÕBr   c                ó  •  U R                   (       dÆ  U R                  R                  [        5      n[	        U5      [        :  a  O“[
        R                  " [        U5      u  p#pEnU[        :X  a  U R                  XEU5        ODU[        :X  a  U R                  XEU5        O'U[        :X  a  U R                  XF5        OU[        :X  a  OU R                   (       d  MÆ  U R                   (       dh  SU l         U R                   R#                  5         U R$                     U R&                  R)                  5        H  nUR+                  5         M     S S S 5        g g ! [         a     N†f = f! , (       d  f       g = f! U R                   (       dy  SU l         U R                   R#                  5         U R$                     U R&                  R)                  5        H  nUR+                  5         M     S S S 5        f ! , (       d  f       f = ff = frb   )r{   ru   r   Ú_HEADER_SIZErH   r–   Úunpackr˜   rY   Ú_handle_datar‹   Ú_handle_window_updateÚ
_TYPE_PINGÚ_handle_pingr’   rJ   r}   r‘   ry   rv   r“   rf   )r   Ú	hdr_bytesÚ_verrš   r›   r>   rœ   r�   s           r   r   ÚYamuxSession._read_loop  sx  € ð	.Ø—l—lØ ŸJ™JŸO™O¬LÓ9�	Ü�y“>¤LÓ0Øä;A¿=º=Ü ó<Ñ8� °&ð œzÓ)Ø×%Ñ% e¸Õ?ØÔ!4Ó4Ø×.Ñ.¨uÀÕHØ¤Ó+Ø×%Ñ% eÕ4Ø¤Ó.Øð! —l—l‘lð( —<—<Ø#�”Ø×$Ñ$×(Ñ(Ô*Ø—Z“ZØ"&§-¡-×"6Ñ"6Ö"8˜Ø×+Ñ+Ö-ñ #9÷  �Zð  øô ó 	Ùð	ú÷  •Zûð —<—<Ø#�”Ø×$Ñ$×(Ñ(Ô*Ø—Z“ZØ"&§-¡-×"6Ñ"6Ö"8˜Ø×+Ñ+Ö-ñ #9÷  —Z–Zúð  úsa   ‚AE ÁE4 ÁA?E ÃE4 ÃE Ä2E#Å
E ÅE4 ÅE Å E4 Å#
E1Å4?H Æ32G.Ç%	H Ç.
G<Ç8H c                ó~  • US:”  a  U R                   R                  U5      OSnU R                     U R                  R	                  U5      nS S S 5        Wc  g U(       a  UR                  U5        U[        -  (       a  UR                  5         U[        -  (       a  UR                  5         g g ! , (       d  f       Nh= f)Nr   r   )
ru   r   ry   rv   Úgetr_   rZ   rc   Ú	_FLAG_RSTrf   )r   r›   r>   rœ   Úpayloadr�   s         r   r§   ÚYamuxSession._handle_data6  sŠ   € Ø-3°a«Z�$—*‘*—/‘/ &Ô)¸Sˆà�Z‹ZØ—]‘]×&Ñ& yÓ1ˆF÷ à‰>ØæØ× Ñ  Ô)Ø”9×Ø×ÑÔ!Ø”9×Ø×ÑÕ!ð ÷ �Zús   °B.Â.
B<c                ó6  • U R                      U R                  R                  U5      nS S S 5        Wc  g US:”  a  UR                  U5        U[        -  (       a  UR                  5         U[        -  (       a  UR                  5         g g ! , (       d  f       Ng= fr    )ry   rv   r¯   rj   rZ   rc   r°   rf   )r   r›   r>   rœ   r�   s        r   r¨   Ú"YamuxSession._handle_window_updateE  st   € Ø�Z‹ZØ—]‘]×&Ñ& yÓ1ˆF÷ à‰>Øà�A‹:Ø×&Ñ& vÔ.Ø”9×Ø×ÑÔ!Ø”9×Ø×ÑÕ!ð ÷ �Zús   �B
Â

Bc                ó|   • U[         -  (       a   U R                  [        [        SU5        g g ! [         a     g f = fr    )rŒ   rX   r©   Ú	_FLAG_ACKrJ   )r   r›   Úopaques      r   rª   ÚYamuxSession._handle_pingR  s<   € Ø”9×ðØ× Ñ ¤¬Y¸¸6ÕBð øô ó Ùðús   �. ®
;º;c                óò   • SnU R                   R                  S5      (       dE  US-  n U R                  [        [        SU5        U R                   R                  S5      (       d  MD  g g ! [
         a     g f = f)Nr   é   r   )r}   rE   rX   r©   rŒ   rJ   )r   Úping_ids     r   r‚   ÚYamuxSession._keepalive_loop[  sm   € ØˆØ×&Ñ&×+Ñ+¨B×/Ñ/Ø�q‰LˆGðØ× Ñ ¤¬Y¸¸7ÔCð ×&Ñ&×+Ñ+¨B×/Õ/øô ó Ùðús   ©A) Á)
A6Á5A6)	r{   ru   rƒ   ry   rw   r€   r}   rv   rz   N)r„   r   r"   r&   )r"   Úbool)r"   r-   r%   )
rš   r!   r›   r!   r>   r!   rœ   r!   r"   r&   )r>   r!   r   r#   r"   r&   )r>   r!   ri   r!   r"   r&   )r›   r!   r>   r!   rœ   r!   r"   r&   )r›   r!   r·   r!   r"   r&   )r'   r(   r)   r*   rm   r@   rn   r‡   rŽ   r   rX   rR   rI   r   r§   r¨   rª   r‚   r+   r   r   r   rl   rl   ¹   s{   † ñô 'ð& óó ðôô ð."Øð"Ø$'ð"Ø47ð"ØADð"à	ô"ô)ô
Cô
.ô:"ô"ô÷r   rl   )rm   Ú
__future__r   r–   r4   Útypingr   r™   rY   r‹   r©   r’   rŒ   r¶   rZ   r°   r¥   r˜   r9   r   r-   rl   r   r   r   Ú<module>rÀ      s}   ðñõ #ã Û Ý ð €à€
ØÐ Ø€
Ø€à€	Ø€	Ø€	Ø€	à€Ø€à!Ð ô!�xô !÷y)ñ y)÷Biò ir   