
    biw                     <   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 	 dd
lmZ 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!y# e$ r d	 ZY Ww xY w# e$ r	 dd
lmZ Y aw xY w)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    O/home/cdr/jupyterlab/.venv/lib/python3.12/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y)BaseHandlerNmanagerc                     || _         y Nr   selfr   s     r   
initializezBaseHandler.initialize$   	    r   __name__
__module____qualname__r   r   r   r   r   r   r   r   !       G"7 r   r   c                       e Zd ZdZdefdZy)BaseJupyterHandlerNr   c                     || _         y r   r   r   s     r   r   zBaseJupyterHandler.initialize+   r    r   r!   r   r   r   r'   r'   (   r%   r   r'   c                   X     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                 :  K   | j                   }|0| j                  j                  d       t        j                  d      t        | d      syt        | j                  j                  | |dt                     d{   }|st        j                  d      y7 w)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   userr4   s      r   pre_getz&LanguageServerWebSocketHandler.pre_get=   s        <HHIJ--$$t\* +OO))$iO
 
 --$$ 
s   A:B<B=Bc                 ~   K   | j                          d{    t        |   |i |}|| d{    yy7 !7 w)zGet an event socket.N)r7   superget)r   argskwargsres	__class__s       r   r:   z"LanguageServerWebSocketHandler.getP   sE     llngk4*6*?II  	 s   =9=;==c                   K   | j                   j                          d {    || _        | j                   j                  |        | j                  j                  dj                  | j                               t        | !          y 7 iw)Nz[{}] Opened a handler)	r   readyr+   	subscriber0   debugformatr9   open)r   r+   r>   s     r   rD   z#LanguageServerWebSocketHandler.openW   sg     ll  """.t$.55d6J6JKL	 	#s   BBA*Bc                    K   | j                   j                  dj                  | j                               | j                  j                  ||        d {    y 7 w)Nz[{}] Handling a message)r0   rB   rC   r+   r   on_client_message)r   messages     r   
on_messagez)LanguageServerWebSocketHandler.on_message^   sB     0778L8LMNll,,Wd;;;s   AAAAc                     | j                   j                  |        | j                  j                  dj	                  | j
                               y )Nz[{}] Closed a handler)r   unsubscriber0   rB   rC   r+   )r   s    r   on_closez'LanguageServerWebSocketHandler.on_closeb   s6      &.55d6J6JKLr   )r"   r#   r$   __doc__r5   auth_resourcer+   r   r   __annotations__r7   r:   rD   rH   rK   __classcell__)r>   s   @r   r*   r*   /   s7     "M&*OXd^*%&<Mr   r*   c                   F    e Zd ZdZeZeZej                  e
d               Zy)LanguageServersHandlerzsReports the status of all current servers

    Response should conform to schema in schema/servers.schema.json
    c           
      T  K   | j                   j                          d{    d| j                   j                  j                         D ci c]  \  }}||j	                          c}}| j                   j
                  j                         D ci c]  \  }}|t        |       c}}d}t        | j                  j                  |            }|r4| j                  j                  dj                  t        |      |             | j                  |       y7 c c}}w c c}}w w)z4finish with the JSON representations of the sessionsN   )versionsessionsspecsz{} validation errors: {})r   r@   rU   itemsto_jsonall_language_serversr   list	validatoriter_errorsr0   r1   rC   lenfinish)r   r+   sessionkeyspecresponseerrorss          r   r:   zLanguageServersHandler.getp   s      ll  """  150E0E0K0K0M,OW  !22 "&!B!B!H!H!JC ]4((

 dnn00:;HH7>>s6{FSTH' 	#s.   D(D,D(D(*D(D"
(A3D(D(N)r"   r#   r$   rL   r5   rM   r   r[   r	   authenticatedr   r:   r   r   r   rQ   rQ   g   s3    
 "M I  r   rQ   c           	          t        | j                  d      }d}d| j                  i}| j                  j	                  dt        |d      t
        |ft        |d|      t        |fg       y)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_handlersrQ   r*   )nbapplsp_urlre_langserversoptss       r   rl   rl      sj    ENNE*G.Nu445D	MM7H%'=tDgt^4.	

r   N)"rL   typingr   r   jupyter_core.utilsr   jupyter_server.base.handlersr   r   jupyter_server.utilsr   rh   tornador	   tornado.websocketr
   jupyter_server.auth.decoratorr   ImportErrorjupyter_server.base.websocketr   jupyter_server.base.zmqhandlersr   r   schemar   specs.utilsr   r5   r   r'   r*   rQ   rl   r   r   r   <module>r}      s    " + C 7  .8?< + $ &*  5M$&85Mp [  Fy    ?>?s"   A? B ?B
	B
BB