Ë
    :vžjw  ã                   óê   — d Z ddlZddlZddlZddlmZ ddlmZmZm	Z	 ddl
mZ ddlmZ ddlmZ ddlmZ dd	lmZ dd
lmZmZmZ ddlmZ ddlmZ  G d„ de«      Z G d„ de«      Z G d„ de«      Zy)a·   Language Server stdio-mode readers

Parts of this code are derived from:

> https://github.com/palantir/python-jsonrpc-server/blob/0.2.0/pyls_jsonrpc/streams.py#L83   # noqa
> https://github.com/palantir/python-jsonrpc-server/blob/45ed1931e4b2e5100cc61b3992c16d6f68af2e80/pyls_jsonrpc/streams.py  # noqa
> > MIT License   https://github.com/palantir/python-jsonrpc-server/blob/0.2.0/LICENSE
> > Copyright 2018 Palantir Technologies, Inc.
é    N)ÚThreadPoolExecutor)ÚListÚOptionalÚText)Úrun_on_executor)Úconvert_yielded)ÚHTTPHeaders)ÚIOLoop)ÚQueue)ÚFloatÚInstanceÚdefault)ÚLoggingConfigurableé   )Úmake_non_blockingc                   ón   ‡ — e Zd ZdZdZ eej                  d¬«      Z ee	d¬«      Z
d„ Zˆ fd„Zd„ Zˆ xZS )	ÚLspStdIoBasezGNon-blocking, queued base for communicating with stdio Language ServersNzthe stream to read/write©Úhelpzqueue to get/putc                 ób   — dj                  | j                  j                  | j                  «      S )Nz<{}(parent={})>)ÚformatÚ	__class__Ú__name__Úparent©Úselfs    úb/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_lsp/stdio.pyÚ__repr__zLspStdIoBase.__repr__'   s#   € Ø ×'Ñ'¨¯©×(?Ñ(?ÀÇÁÓMÐMó    c                 ó~   •— t        ‰| �  di |¤Ž | j                  j                  d| «       t	        d¬«      | _        y )Nz%s initializedr   )Úmax_workers© )ÚsuperÚ__init__ÚlogÚdebugr   Úexecutor)r   Úkwargsr   s     €r   r$   zLspStdIoBase.__init__*   s2   ø€ Ü‰ÑÑ"˜6Ò"Ø�‰�‰Ð'¨Ô.Ü*°qÔ9ˆ�r   c                 óp   — | j                   j                  «        | j                  j                  d| «       y )Nz	%s closed)ÚstreamÚcloser%   r&   r   s    r   r+   zLspStdIoBase.close/   s$   € Ø�‰×ÑÔØ�‰�‰�{ DÕ)r   )r   Ú
__module__Ú__qualname__Ú__doc__r'   r   ÚioÚ	RawIOBaser*   r   Úqueuer   r$   r+   Ú__classcell__)r   s   @r   r   r      s>   ø„ ÙQà€HáØ
�‰Ð5ô€Fñ �UÐ!3Ô4€EòNô:ö
*r   r   c                   ó  — e Zd ZdZ ed¬«      j                  d¬«      Z edd¬«      j                  d¬«      Z edd¬«      j                  d¬«      Z e	d	«      d
„ «       Z
d„ Zd„ Zdd„Z	 ddedee   fd„Zdefd„Zedefd„«       Zy)ÚLspStdIoReaderzŒLanguage Server stdio Reader

    Because non-blocking (but still synchronous) IO is used, rudimentary
    exponential backoff is used.
    z#maximum time to wait on idle streamr   T)Úconfiggš™™™™™©?z#minimum time to wait on idle streamz next time to wait on idle streamÚmax_waitc                 óJ   — t         j                  dk(  rdS | j                  dz  S )NÚntgš™™™™™¹?é   )ÚosÚnameÚmin_waitr   s    r   Ú_default_max_waitz LspStdIoReader._default_max_wait?   s    € ä—g‘g ’oˆsÐ<¨4¯=©=¸1Ñ+<Ð<r   c              ƒ   óü   K  — | j                   j                  ryt        | j                  dz  | j                  «      | _        	 t        j                  | j                  «      ƒ d{  –—†  y7 Œ# t        $ r Y yw xY w­w)z'Simple exponential backoff for sleepingNr9   )r*   ÚclosedÚminÚ	next_waitr6   ÚasyncioÚsleepÚ	Exceptionr   s    r   rC   zLspStdIoReader.sleepC   s]   è ø€ à�;‰;×ÒØÜ˜TŸ^™^¨aÑ/°·±Ó?ˆŒð	Ü—-‘- §¡Ó/×/Ò/ùÜò 	Ùð	üs<   ‚A A<Á"A- Á%A+Á&A- Á*A<Á+A- Á-	A9Á6A<Á8A9Á9A<c                 ó&   — | j                   | _        y)zReset the wait timeN)r<   Úwaitr   s    r   ÚwakezLspStdIoReader.wakeM   s   € à—M‘Mˆ�	r   ÚreturnNc              ƒ   ó0  K  — t        | j                  «       | j                  j                  s–d}	 | j                  «       ƒ d{  –—† }|s| j	                  «       ƒ d{  –—†  ŒL| j                  «        t        j                  «       j                  | j                  j                  |«       | j                  j                  sŒ•yy7 Œ€7 Œh# t        $ rA}| j                  j                  d| ||«       | j	                  «       ƒ d{  –—†7   Y d}~Œbd}~ww xY w­w)z.Read from a Language Server until it is closedNz$%s couldn't enqueue message: %s (%s))r   r*   r?   Úread_onerC   rG   r
   ÚcurrentÚadd_callbackr1   Ú
put_nowaitrD   r%   Ú	exception)r   ÚmessageÚes      r   ÚreadzLspStdIoReader.readQ   sÍ   è ø€ ä˜$Ÿ+™+Ô&à—+‘+×$Ò$ØˆGð#Ø $§¡£×/�áØŸ*™*›,×&Ð&Øà—I‘I”Kä—‘Ó ×-Ñ-¨d¯j©j×.CÑ.CÀWÔMð —+‘+×$Õ$ð 0øð 'ùô ò #Ø—‘×"Ñ"Ø:¸DÀ'È1ôð —j‘j“l×"Ö"ûð	#üsq   ‚.D±C	 ÁCÁC	 ÁCÁC	 Á#DÁ$AC	 Â,DÃDÃC	 ÃC	 Ã		DÃ1DÄDÄDÄ	DÄDÄDÚlengthc           
   ƒ   ó   K  — d}g }d}||k  rŒt        |«      |k  r~|dkD  ryd}	 | j                  j                  ||z
  «      }|€|dz  }| j	                  «       ƒ d{  –—†  ŒY|t        |«      z  }|j                  |«       ||k  rt        |«      |k  r|dkD  rŒy|rOdj                  |«      }t        |«      |k7  r0| j                  j                  dt        |«      › d|› d|› d|› �«       |S # t        $ r Y Œ¶w xY w7 ŒŸ­w)	a²  Read the full length of the message unless exceeding max_parts or
           max_empties empty reads occur.

        See https://github.com/jupyter-lsp/jupyterlab-lsp/issues/450

        Crucial docs or read():
            "If the argument is positive, and the underlying raw
             stream is not interactive, multiple raw reads may be issued
             to satisfy the byte count (unless EOF is reached first)"

        Args:
           - length: the content length
           - max_parts: prevent absurdly long messages (1000 parts is several MBs):
             1 part is usually sufficient but not enough for some long
             messages 2 or 3 parts are often needed.
        Nr   r   r   z%Readout and content-length mismatch: z vs z;remaining empties: z; remaining parts: )	Úlenr*   rQ   ÚOSErrorrC   ÚappendÚjoinr%   Úwarning)r   rR   Ú	max_partsÚmax_emptiesÚrawÚ	raw_partsÚreceived_sizeÚparts           r   Ú_read_contentzLspStdIoReader._read_contentg   s)  è ø€ ð& ˆØ!#ˆ	ØˆØ˜fÒ$¬¨Y«¸)Ò)CÈÐVWÊØˆDðØ—{‘{×'Ñ'¨°Ñ(>Ó?�ð ˆ|Ø˜qÑ �Ø—j‘j“l×"Ð"ØØœS ›YÑ&ˆMØ×Ñ˜TÔ"ð ˜fÒ$¬¨Y«¸)Ò)CÈÐVWËñ Ø—(‘(˜9Ó%ˆCÜ�3‹x˜6Ò!Ø—‘× Ñ Ø;¼CÀ»H¸:ÀTÈ&Èð R*Ø*5¨Ð6IÈ)ÈðVôð
 ˆ
øô# ò Ùðúð #ús;   ‚!C>¤C- ÁC>ÁC<Á<C>ÂAC>Ã-	C9Ã6C>Ã8C9Ã9C>c              ƒ   ó  K  — d}t        «       }t        | j                  «       «      ƒ d{  –—† }|rÎ|rU|j                  «       rE|j	                  |«       t        | j                  «       «      ƒ d{  –—† }|r|j                  «       rŒEt        |j                  dd«      «      }|rZ| j                  |¬«      ƒ d{  –—† }|�!|j                  d«      j                  «       }|S | j                  j                  d| |«       |S 7 ŒÖ7 Œ’7 ŒJ­w)zRead a single messageÚ Nzcontent-lengthÚ0)rR   úutf-8z&%s failed to read message of length %s)r	   r   Ú	_readlineÚstripÚ
parse_lineÚintÚgetr_   Údecoder%   rX   )r   rO   ÚheadersÚlineÚcontent_lengthr[   s         r   rJ   zLspStdIoReader.read_one”   sí   è ø€ àˆÜ“-ˆä$ T§^¡^Ó%5Ó6×6ˆáÙ˜4Ÿ:™:œ<Ø×"Ñ" 4Ô(Ü,¨T¯^©^Ó-=Ó>×>�ñ ˜4Ÿ:™:�<ô ! §¡Ð-=¸sÓ!CÓDˆNáØ ×.Ñ.°nÐ.ÓE×E�Ø�?Ø!Ÿj™j¨Ó1×7Ñ7Ó9�Gð ˆð —H‘H×$Ñ$Ø@ØØ&ôð ˆð) 7øð
 ?øð
 Fús;   ‚)D«D¬ADÁ1DÁ2DÂ	2DÂ;DÂ<ADÄDÄDc                 ó�   — 	 | j                   j                  «       j                  d«      j                  «       S # t        $ r Y yw xY w)z(Read a line (or immediately return None)rc   ra   )r*   Úreadlineri   re   rU   r   s    r   rd   zLspStdIoReader._readline¯   s@   € ð	Ø—;‘;×'Ñ'Ó)×0Ñ0°Ó9×?Ñ?ÓAÐAøÜò 	Ùð	ús   ‚69 ¹	AÁA©rH   N)iè  éÈ   )r   r,   r-   r.   r   Útagr6   r<   rA   r   r=   rC   rG   rQ   rg   r   Úbytesr_   r   rJ   r   rd   r"   r   r   r4   r4   4   sÆ   „ ññ Ð?Ô@×DÑDÈDÐDÓQ€HÙ�TÐ EÔF×JÑJÐRVÐJÓW€HÙ�dÐ!CÔD×HÑHÐPTÐHÓU€IáˆZÓñ=ó ð=òò"ó#ð. 8;ñ+Øð+à	�%‰ó+ðZ ó ð6 ð˜4ò ó ñr   r4   c                   ó*   — e Zd ZdZdd„Zedd„«       Zy)ÚLspStdIoWriterzLanguage Server stdio WriterNc              ƒ   ó:  K  — | j                   j                  s²| j                  j                  «       ƒ d{  –—† }	 |j	                  d«      }dj                  t        |«      |«      }t        | j                  |j	                  d«      «      «      ƒ d{  –—†  | j                  j                  «        | j                   j                  sŒ±yy7 Œ•7 Œ9# t        $ r  | j                  j                  d| «       Y Œ_w xY w# | j                  j                  «        w xY w­w)z*Write to a Language Server until it closesNrc   zContent-Length: {}

{}z%s couldn't write message: %s)r*   r?   r1   rh   Úencoder   rT   r   Ú
_write_onerD   r%   rN   Ú	task_done)r   rO   ÚbodyÚresponses       r   ÚwritezLspStdIoWriter.write»   sÔ   è ø€ à—+‘+×$Ò$Ø ŸJ™JŸN™NÓ,×,ˆGð'Ø—~‘~ gÓ.�Ø9×@Ñ@ÄÀTÃÈGÓT�Ü% d§o¡o°h·o±oÀgÓ6NÓ&OÓP×PÐPð —
‘
×$Ñ$Ô&ð —+‘+×$Õ$Ø,øð QùÜò TØ—‘×"Ñ"Ð#BÀDÈ(ÖSðTûð —
‘
×$Ñ$Õ&üsW   ‚4D¶C·D¼AC ÂCÂC Â0DÃ
DÃC Ã&C9Ã6C< Ã8C9Ã9C< Ã<DÄDc                 ón   — | j                   j                  |«       | j                   j                  «        y )N)r*   r{   Úflush)r   rO   s     r   rw   zLspStdIoWriter._write_oneÈ   s$   € à�‰×Ñ˜'Ô"Ø�‰×ÑÕr   ro   )r   r,   r-   r.   r{   r   rw   r"   r   r   rt   rt   ¸   s   „ Ù&ó'ð òó ñr   rt   )r.   rB   r/   r:   Úconcurrent.futuresr   Útypingr   r   r   Útornado.concurrentr   Útornado.genr   Útornado.httputilr	   Útornado.ioloopr
   Útornado.queuesr   Ú	traitletsr   r   r   Útraitlets.configr   Únon_blockingr   r   r4   rt   r"   r   r   Ú<module>rˆ      sa   ðñó Û 	Û 	Ý 1ß 'Ñ 'å .Ý 'Ý (Ý !Ý  ß .Ñ .Ý 0å +ô*Ð&ô *ô.A�\ô AôH�\õ r   