
    Mhw                     Z   d Z ddlmZmZ ddlmZ ddlmZmZ ddl	m
Z ddlmZ ddlmZ 	 ddlmZ n# e$ r d	 ZY nw xY w	 dd
lmZ n# e$ r	 dd
lmZ Y nw xY wddlmZ ddlmZ ddlmZ dZ G d de          Z G d de          Z G d deee          Z G d de          Z d Z!dS )zF tornado handler for managing and communicating with language servers
    )OptionalText)ensure_async)
APIHandlerJupyterHandler)url_path_join)web)WebSocketHandler)
authorizedc                     | S )z)A no-op fallback for `jupyter_server 1.x` )methods    T/var/www/html/test/jupyter/venv/lib/python3.11/site-packages/jupyter_lsp/handlers.pyr   r      s        )WebSocketMixin   )LanguageServerManager)SERVERS_RESPONSEcensored_speclspc                       e Zd ZdZdefdZdS )BaseHandlerNmanagerc                     || _         d S Nr   selfr   s     r   
initializezBaseHandler.initialize$       r   __name__
__module____qualname__r   r   r    r   r   r   r   r   !   5        G"7      r   r   c                       e Zd ZdZdefdZdS )BaseJupyterHandlerNr   c                     || _         d S r   r   r   s     r   r    zBaseJupyterHandler.initialize+   r!   r   r"   r   r   r   r(   r(   (   r&   r   r(   c                   ^     e Zd ZU dZeZdZee         e	d<   d Z
 fdZ fdZd Zd Z xZS )	LanguageServerWebSocketHandlerad  Setup tornado websocket to route to language server sessions.

    The logic of `get` and `pre_get` methods is derived from jupyter-server ws handlers,
    and should be kept in sync to follow best practice established by upstream; see:
    https://github.com/jupyter-server/jupyter_server/blob/v2.12.5/jupyter_server/services/kernels/websocket.py#L36
    Nlanguage_serverc                 2  K   | j         }|.| j                            d           t          j        d          t          | d          sdS t          | j                            | |dt                               d{V }|st          j        d          dS )zHandle a pre_get.Nz*Couldn't authenticate WebSocket connectioni  
authorizerexecute)
current_userlogwarningr	   	HTTPErrorhasattrr   r.   is_authorizedAUTH_RESOURCE)r   userr5   s      r   pre_getz&LanguageServerWebSocketHandler.pre_get=   s        <HIJJJ-$$$t\** 	F +O))$iOO
 
 
 
 
 
 
 
  	%-$$$	% 	%r   c                    K   |                                   d{V   t                      j        |i |}|
| d{V  dS dS )zGet an event socket.N)r8   superget)r   argskwargsres	__class__s       r   r;   z"LanguageServerWebSocketHandler.getP   sb      llnneggk4*6**?IIIIIIIII ?r   c                 0  K   | j                                          d {V  || _        | j                             |            | j                            d                    | j                             t                                                       d S )Nz[{}] Opened a handler)	r   readyr,   	subscriber1   debugformatr:   open)r   r,   r?   s     r   rE   z#LanguageServerWebSocketHandler.openW   s      l  """"""""".t$$$.55d6JKKLLLr   c                    K   | j                             d                    | j                             | j                            ||            d {V  d S )Nz[{}] Handling a message)r1   rC   rD   r,   r   on_client_message)r   messages     r   
on_messagez)LanguageServerWebSocketHandler.on_message^   s\      0778LMMNNNl,,Wd;;;;;;;;;;;r   c                     | j                             |            | j                            d                    | j                             d S )Nz[{}] Closed a handler)r   unsubscriber1   rC   rD   r,   )r   s    r   on_closez'LanguageServerWebSocketHandler.on_closeb   sD      &&&.55d6JKKLLLLLr   )r#   r$   r%   __doc__r6   auth_resourcer,   r   r   __annotations__r8   r;   rE   rI   rL   __classcell__)r?   s   @r   r+   r+   /   s           "M&*OXd^***% % %&        < < <M M M M M M Mr   r+   c                   J    e Zd ZdZeZeZej	        e
d                         ZdS )LanguageServersHandlerzsReports the status of all current servers

    Response should conform to schema in schema/servers.schema.json
    c                   K   | j                                          d{V  dd | j         j                                        D             d | j         j                                        D             d}t          | j                            |                    }|r;| j        	                    d
                    t          |          |                     |                     |           dS )z4finish with the JSON representations of the sessionsN   c                 >    i | ]\  }}||                                 S r   )to_json).0r,   sessions      r   
<dictcomp>z.LanguageServersHandler.get.<locals>.<dictcomp>x   s8       ,OW  !2!2  r   c                 4    i | ]\  }}|t          |          S r   r   )rW   keyspecs      r   rY   z.LanguageServersHandler.get.<locals>.<dictcomp>|   s6       C ]4((  r   )versionsessionsspecsz{} validation errors: {})r   rA   r^   itemsall_language_serverslist	validatoriter_errorsr1   r2   rD   lenfinish)r   responseerrorss      r   r;   zLanguageServersHandler.getp   s      l  """""""""  040E0K0K0M0M   !%!B!H!H!J!J  

 

 dn00::;; 	UH7>>s6{{FSSTTTHr   N)r#   r$   r%   rM   r6   rN   r   rc   r	   authenticatedr   r;   r   r   r   rR   rR   g   sQ         
 "M I  Z   r   rR   c           	          t          | j        d          }d}d| j        i}| j                            dt          |d          t
          |ft          |d|          t          |fg           dS )zAAdd Language Server routes to the notebook server web applicationr   z(?P<language_server>.*)r   z.*statuswsN)ujoinbase_urllanguage_server_managerweb_appadd_handlersrR   r+   )nbapplsp_urlre_langserversoptss       r   rq   rq      s    ENE**G.Nu45D	M7H%%'=tDgt^44.	

 
 
 
 
r   N)"rM   typingr   r   jupyter_core.utilsr   jupyter_server.base.handlersr   r   jupyter_server.utilsr   rm   tornador	   tornado.websocketr
   jupyter_server.auth.decoratorr   ImportErrorjupyter_server.base.websocketr   jupyter_server.base.zmqhandlersr   r   schemar   specs.utilsr   r6   r   r(   r+   rR   rq   r   r   r   <module>r      s3    " ! ! ! ! ! ! ! + + + + + + C C C C C C C C 7 7 7 7 7 7       . . . . . .8888888       ?<<<<<<< ? ? ?>>>>>>>>? + * * * * * $ $ $ $ $ $ & & & & & &    *          5M 5M 5M 5M 5M$&85M 5M 5Mp         [      F    s   3 >>A	 	AA