
    Te                         d dl Z d dlZ	 d dlZ e j
                  e      Z G d d      Z G d d      Z	y# e$ r d dlZY 2w xY w)    Nc                   4    e Zd Zd Zd Zd Zd Zed        Zy)JsonRpcStreamReaderc                     || _         y N)_rfile)selfrfiles     7/usr/lib/python3/dist-packages/pylsp_jsonrpc/streams.py__init__zJsonRpcStreamReader.__init__   s	        c                 8    | j                   j                          y r   )r   closer   s    r
   r   zJsonRpcStreamReader.close   s    r   c                    | j                   j                  sW	 | j                         }y	  |t        j                  |j                  d                   | j                   j                  sVyy# t        $ r0 | j                   j                  rY yt        j                  d       Y w xY w# t        $ r t        j                  d|       Y w xY w)zBlocking call to listen for messages on the rfile.

        Args:
            message_consumer (fn): function that is passed each message as it is read off the socket.
        NzFailed to read from rfileutf-8zFailed to parse JSON message %s)	r   closed_read_message
ValueErrorlog	exceptionjsonloadsdecode)r   message_consumerrequest_strs      r
   listenzJsonRpcStreamReader.listen   s     ++$$;"002 " K,>,>w,G!HI ++$$  ;;;%%9:;  ?Ms(   A/ *B+ /B(B('B(+CCc                    | j                   j                         }|sy| j                  |      }|r=|j                         r-| j                   j                         }|r|j                         r-|sy| j                   j	                  |      S )zmReads the contents of a message.

        Returns:
            body of message if parsable else None
        N)r   readline_content_lengthstripread)r   linecontent_lengths      r
   r   z!JsonRpcStreamReader._read_message-   sw     {{##%--d3 tzz|;;'')D tzz|  {{//r   c                     | j                  d      r0| j                  d      \  }}|j                         }	 t        |      S y# t        $ r}t	        d|       |d}~ww xY w)z.Extract the content length from an input line.s   Content-Length: zInvalid Content-Length header: N)
startswithsplitr    intr   )r"   _valuees       r
   r   z#JsonRpcStreamReader._content_lengthD   sn     ??./zz"56HAuKKMES5z!   S #B5'!JKQRRSs   
A 	A AA N)	__name__
__module____qualname__r   r   r   r   staticmethodr    r   r
   r   r      s*    .0. 
 
r   r   c                       e Zd Zd Zd Zd Zy)JsonRpcStreamWriterc                 R    || _         t        j                         | _        || _        y r   )_wfile	threadingLock_wfile_lock_json_dumps_args)r   wfilejson_dumps_argss      r
   r   zJsonRpcStreamWriter.__init__S   s     $>>+ /r   c                 z    | j                   5  | j                  j                          d d d        y # 1 sw Y   y xY wr   )r6   r3   r   r   s    r
   r   zJsonRpcStreamWriter.closeX   s0     	 KK	  	  	 s   1:c                    | j                   5  | j                  j                  r
	 d d d        y 	 t        j                  |fi | j
                  }t        |t              rt        |      nt        |j                  d            }d| d| }| j                  j                  |j                  d             | j                  j                          d d d        y # t        $ r t        j                  d|       Y *w xY w# 1 sw Y   y xY w)Nr   zContent-Length: z<
Content-Type: application/vscode-jsonrpc; charset=utf8

z)Failed to write message to output file %s)r6   r3   r   r   dumpsr7   
isinstancebyteslenencodewriteflush	Exceptionr   r   )r   messagebodyr#   responses        r
   rA   zJsonRpcStreamWriter.write\   s     	T{{!!	T 	TTzz'CT-B-BC /9u.ET3t{{[bOcKd '~&6 7Uf  !!(//'":;!!#!	T 	T"  TI7ST#	T 	Ts)   C>B!CC;8C>:C;;C>>DN)r+   r,   r-   r   r   rA   r/   r   r
   r1   r1   R   s    0
 Tr   r1   )
loggingr4   ujsonr   rC   	getLoggerr+   r   r   r1   r/   r   r
   <module>rJ      sW      g!@ @FT TS  s   5 	A A