o
    ^i                     @   sh   d 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
 d
eee
ZdS )z/Tornado handlers for WebSocket <-> ZMQ sockets.    )ensure_async)web)WebSocketHandler)ws_authenticated)JupyterHandler)WebSocketMixinkernelsc                       sp   e Zd ZdZeZedd Zdd Zdd Z	dd	 Z
e fd
dZ fddZdd Zdd Zdd Z  ZS )KernelWebsocketHandlerz$The kernels websocket should connectc                 C   s   | j dS )z&The kernel websocket connection class.!kernel_websocket_connection_classsettingsgetself r   d/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/jupyter_server/services/kernels/websocket.pyr
      s   z8KernelWebsocketHandler.kernel_websocket_connection_classc                 C   s   dS )zhUndo the set_default_headers in JupyterHandler

        which doesn't make sense for websockets
        Nr   r   r   r   r   set_default_headers   s    z*KernelWebsocketHandler.set_default_headersc                 C   s   | j ddS )z"Get the socket connection options.websocket_compression_optionsNr   r   r   r   r   get_compression_options    s   z.KernelWebsocketHandler.get_compression_optionsc                    s   | j }t| j| |ddI dH }|std| j| j}| j	|| | j
d| _| ddr9| d| jj_n| jd t| jdrO| j I dH  dS dS )	zHandle a pre_get.executer   Ni  )parentwebsocket_handlerconfig
session_idzNo session ID specifiedprepare)current_userr   
authorizeris_authorizedr   	HTTPErrorkernel_manager
get_kernel	kernel_idr
   r   
connectionget_argumentsessionlogwarninghasattrr   )r   user
authorizedkernelr   r   r   pre_get$   s"   

zKernelWebsocketHandler.pre_getc                    s.   || _ |  I dH  t j|dI dH  dS )z"Handle a get request for a kernel.N)r!   )r!   r+   superr   r   r!   	__class__r   r   r   =   s   zKernelWebsocketHandler.getc                    s6   t    | jd| j d | j I dH  dS )zOpen a kernel websocket.zConnecting to kernel .N)r,   openr%   infor!   r"   connectr-   r.   r   r   r1   D   s   
zKernelWebsocketHandler.openc                 C   s   | j | dS )zGGet a kernel message from the websocket and turn it into a ZMQ message.N)r"   handle_incoming_message)r   
ws_messager   r   r   
on_messageM   s   z!KernelWebsocketHandler.on_messagec                 C   s   | j   d| _ dS )zHandle a socket closure.N)r"   
disconnectr   r   r   r   on_closeQ   s   

zKernelWebsocketHandler.on_closec                 C   s:   | j j}|du rd}n|dkrd}||v r|}|S d}|S )z'Select the sub protocol for the socket.Nzv1.kernel.websocket.jupyter.org )r"   kernel_ws_protocol)r   subprotocolspreferred_protocolselected_subprotocolr   r   r   select_subprotocolV   s   z)KernelWebsocketHandler.select_subprotocol)__name__
__module____qualname____doc__AUTH_RESOURCEauth_resourcepropertyr
   r   r   r+   r   r   r1   r6   r8   r>   __classcell__r   r   r.   r   r	      s    
	r	   N)rB   jupyter_core.utilsr   tornador   tornado.websocketr   jupyter_server.auth.decoratorr   jupyter_server.base.handlersr   jupyter_server.base.websocketr   rC   r	   r   r   r   r   <module>   s    