o
    tfw                     @   s(  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 zddlmZ W n ey?   d	d
 ZY nw zddlmZ W n eyW   ddlmZ Y nw ddlmZ ddlmZ ddlmZ dZG dd deZG dd deZG dd deeeZG dd deZ d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                 C   s   | S )z)A no-op fallback for `jupyter_server 1.x` )methodr   r   ]/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/jupyter_lsp/handlers.pyr
      s   r
   )WebSocketMixin   )LanguageServerManager)SERVERS_RESPONSEcensored_speclspc                   @      e Zd ZdZdefddZdS )BaseHandlerNmanagerc                 C   
   || _ d S Nr   selfr   r   r   r   
initialize$      
zBaseHandler.initialize__name__
__module____qualname__r   r   r   r   r   r   r   r   !       r   c                   @   r   )BaseJupyterHandlerNr   c                 C   r   r   r   r   r   r   r   r   +   r   zBaseJupyterHandler.initializer   r   r   r   r   r$   (   r#   r$   c                       sZ   e Zd ZU dZeZdZee e	d< dd Z
 fddZ fdd	Zd
d Zdd Z  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                    sb   | j }|du r| jd tdt| dsdS t| j| |dt	I dH }|s/t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   userr.   r   r   r   pre_get=   s   



z&LanguageServerWebSocketHandler.pre_getc                    s<   |   I dH  t j|i |}|dur|I dH  dS dS )zGet an event socket.N)r1   superget)r   argskwargsres	__class__r   r   r3   P   s   z"LanguageServerWebSocketHandler.getc                    sF   | j  I d H  || _| j |  | jd| j t   d S )Nz[{}] Opened a handler)	r   readyr&   	subscriber*   debugformatr2   open)r   r&   r7   r   r   r=   W   s   z#LanguageServerWebSocketHandler.openc                    s.   | j d| j | j|| I d H  d S )Nz[{}] Handling a message)r*   r;   r<   r&   r   Zon_client_message)r   messager   r   r   
on_message^   s   z)LanguageServerWebSocketHandler.on_messagec                 C   s$   | j |  | jd| j d S )Nz[{}] Closed a handler)r   Zunsubscriber*   r;   r<   r&   )r   r   r   r   on_closeb   s   z'LanguageServerWebSocketHandler.on_close)r    r!   r"   __doc__r/   auth_resourcer&   r   r   __annotations__r1   r3   r=   r?   r@   __classcell__r   r   r7   r   r%   /   s   
 r%   c                   @   s*   e Zd ZdZeZeZej	e
dd ZdS )LanguageServersHandlerzsReports the status of all current servers

    Response should conform to schema in schema/servers.schema.json
    c                    s|   | j  I dH  ddd | j j D dd | j j D d}t| j|}|r7| j	d
t|| | | dS )z4finish with the JSON representations of the sessionsN   c                 S   s   i | ]	\}}||  qS r   )to_json).0r&   sessionr   r   r   
<dictcomp>x       z.LanguageServersHandler.get.<locals>.<dictcomp>c                 S   s   i | ]	\}}|t |qS r   r   )rH   keyspecr   r   r   rJ   |   rK   )versionsessionsspecsz{} validation errors: {})r   r9   rO   itemsZall_language_serverslist	validatorZiter_errorsr*   r+   r<   lenfinish)r   responseerrorsr   r   r   r3   p   s   

zLanguageServersHandler.getN)r    r!   r"   rA   r/   rB   r   rS   r   authenticatedr
   r3   r   r   r   r   rE   g   s    rE   c                 C   sJ   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_urlZlanguage_server_managerZweb_appadd_handlersrE   r%   )ZnbappZlsp_urlZre_langserversoptsr   r   r   r]      s   

r]   N)"rA   typingr   r   Zjupyter_core.utilsr   Zjupyter_server.base.handlersr   r   Zjupyter_server.utilsr   r[   tornador   Ztornado.websocketr	   Zjupyter_server.auth.decoratorr
   ImportErrorZjupyter_server.base.websocketr   Zjupyter_server.base.zmqhandlersr   r   Zschemar   Zspecs.utilsr   r/   r   r$   r%   rE   r]   r   r   r   r   <module>   s8    
8#