
    Fhw                         S r SSKrSSKrSSKrSSKJr  SSKJrJrJ	r	  SSK
Jr  SSKJr  SSKJr  SSKJr  SS	KJr  SS
KJrJrJr  SSKJr  SSKJr   " S S\5      r " S S\5      r " S S\5      rg)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                   l   ^  \ rS rSrSrSr\" \R                  SS9r	\" \
SS9rS rU 4S jrS	 rS
rU =r$ )LspStdIoBase   zGNon-blocking, queued base for communicating with stdio Language ServersNzthe stream to read/writehelpzqueue to get/putc                 b    SR                  U R                  R                  U R                  5      $ )Nz<{}(parent={})>)format	__class____name__parentselfs    dC:\Users\julio\OneDrive\Documentos\Trabajo\Ideas Frescas\venv\Lib\site-packages\jupyter_lsp/stdio.py__repr__LspStdIoBase.__repr__'   s#     ''(?(?MM    c                 z   > [         TU ]  " S0 UD6  U R                  R                  SU 5        [	        SS9U l        g )Nz%s initializedr   )max_workers )super__init__logdebugr   executor)r   kwargsr   s     r   r&   LspStdIoBase.__init__*   s2    "6"'.*q9r!   c                 p    U R                   R                  5         U R                  R                  SU 5        g )Nz	%s closed)streamcloser'   r(   r   s    r   r.   LspStdIoBase.close/   s$    {D)r!   )r)   )r   
__module____qualname____firstlineno____doc__r)   r   io	RawIOBaser-   r   queuer   r&   r.   __static_attributes____classcell__)r   s   @r   r   r      sC    QH
5F U!34EN:
* *r!   r   c                      \ rS rSrSr\" SS9R                  SS9r\" SSS9R                  SS9r\" SS	S9R                  SS9r	\
" S
5      S 5       rS rS rSS jr SS\S\\   4S jjrS\4S jr\S\4S j5       rSrg)LspStdIoReader4   zLanguage 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                 L    [         R                  S:X  a  S$ U R                  S-  $ )Nntg?   )osnamemin_waitr   s    r   _default_max_wait LspStdIoReader._default_max_wait?   s     ggos<4==1+<<r!   c                 
  #    U R                   R                  (       a  g[        U R                  S-  U R                  5      U l         [
        R                  " U R                  5      I Sh  vN   g N! [         a     gf = f7f)z'Simple exponential backoff for sleepingNr@   )r-   closedmin	next_waitr=   asynciosleep	Exceptionr   s    r   rK   LspStdIoReader.sleepC   s\     ;;T^^a/?	--/// 		s<   AB#A3 +A1,A3 0B1A3 3
B =B?B  Bc                 &    U R                   U l        g)zReset the wait timeN)rC   waitr   s    r   wakeLspStdIoReader.wakeM   s    MM	r!   returnNc                 T  #    [        U R                  5        U R                  R                  (       d  Sn U R                  5       I Sh  vN nU(       d  U R	                  5       I Sh  vN   MW  U R                  5         [        R                  " 5       R                  U R                  R                  U5        U R                  R                  (       d  M  gg N Np! [         a@  nU R                  R                  SXU5        U R	                  5       I Sh  vN     SnANhSnAff = f7f)z.Read from a Language Server until it is closedNz$%s couldn't enqueue message: %s (%s))r   r-   rG   read_onerK   rP   r
   currentadd_callbackr6   
put_nowaitrL   r'   	exception)r   messagees      r   readLspStdIoReader.readQ   s     $++&++$$G# $/**,&&IIK --djj.C.CWM ++$$$ 0 '  #"":D1 jjl""	#sq   3D(C 	C
C (C)C -D(/A	C 8D(D(C C 
D%%0D DD D( D%%D(lengthc           
        #    Sn/ nSnXa:  a  [        U5      U:  a  US:  a}  Sn U R                  R                  X-
  5      nUc  US-  nU R	                  5       I Sh  vN   M\  U[        U5      -  nUR                  U5        Xa:  a  [        U5      U:  a  US:  a  M}  U(       aP  SR                  U5      n[        U5      U:w  a0  U R                  R                  S[        U5       SU SU SU 35        U$ ! [         a     Nf = f N7f)	aR  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-   r[   OSErrorrK   appendjoinr'   warning)r   r]   	max_partsmax_emptiesraw	raw_partsreceived_sizeparts           r   _read_contentLspStdIoReader._read_contentg   s"    & !#	$Y))CVWD{{''(>? |q jjl""SY&MT" $Y))CVW ((9%C3x6!  ;CH:T& R**56I)V
 
#   #s;   #DC9 DD	?D AD9
DDDDc                 N  #    Sn[        5       n[        U R                  5       5      I Sh  vN nU(       a  U(       ae  UR                  5       (       aP  UR	                  U5        [        U R                  5       5      I Sh  vN nU(       a  UR                  5       (       a  MP  [        UR                  SS5      5      nU(       aX  U R                  US9I Sh  vN nUb!  UR                  S5      R                  5       nU$ U R                  R                  SU U5        U$  N N NK7f)zRead a single message Nzcontent-length0)r]   utf-8z&%s failed to read message of length %s)r	   r   	_readlinestrip
parse_lineintgetrj   decoder'   rc   )r   rY   headerslinecontent_lengthrf   s         r   rT   LspStdIoReader.read_one   s     -$T^^%5664::<<""4(,T^^-=>> 4::<< !-=s!CDN ..n.EE?!jj1779G  HH$$@& ) 7
 ?
 Fs;   )D%DAD% D! D%#4D%D#AD%!D%#D%c                      U R                   R                  5       R                  S5      R                  5       $ ! [         a     gf = f)z(Read a line (or immediately return None)ro   rm   )r-   readlineru   rq   r`   r   s    r   rp   LspStdIoReader._readline   s@    	;;'')009??AA 		s   69 
AA)rI   rO   rR   N)i     )r   r0   r1   r2   r3   r   tagr=   rC   rI   r   rD   rK   rP   r[   rs   r   bytesrj   r   rT   r   rp   r7   r$   r!   r   r:   r:   4   s     ?@DDDDQHT EFJJRVJWHd!CDHHPTHUIZ= ="#. 8;++	%+Z 6 4  r!   r:   c                   6    \ rS rSrSrSS jr\SS j5       rSrg)LspStdIoWriter   zLanguage Server stdio WriterNc                 R  #    U R                   R                  (       d  U R                  R                  5       I Sh  vN n UR	                  S5      nSR                  [        U5      U5      n[        U R                  UR	                  S5      5      5      I Sh  vN   U R                  R                  5         U R                   R                  (       d  M  gg N N?! [         a     U R                  R                  SU W5         Nff = f! U R                  R                  5         f = f7f)z*Write to a Language Server until it closesNro   zContent-Length: {}

{}z%s couldn't write message: %s)r-   rG   r6   rt   encoder   r_   r   
_write_onerL   r'   rX   	task_done)r   rY   bodyresponses       r   writeLspStdIoWriter.write   s     ++$$ JJNN,,G'~~g.9@@TGT%doohoog6N&OPPP 

$$& ++$$$, Q T""#BD(ST 

$$&sX   9D'CD'AC CC 5D'D'C 'DD DD D$$D'c                 n    U R                   R                  U5        U R                   R                  5         g )N)r-   r   flush)r   rY   s     r   r   LspStdIoWriter._write_one   s$    '"r!   r$   r}   )	r   r0   r1   r2   r3   r   r   r   r7   r$   r!   r   r   r      s    &'  r!   r   )r3   rJ   r4   rA   concurrent.futuresr   typingr   r   r   tornado.concurrentr   tornado.genr   tornado.httputilr	   tornado.ioloopr
   tornado.queuesr   	traitletsr   r   r   traitlets.configr   non_blockingr   r   r:   r   r$   r!   r   <module>r      sa     	 	 1 ' ' . ' ( !   . . 0 +*& *.A\ AH\ r!   