o
    i                     @   sj   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ZG d	d
 d
eeeZde
 efgZdS )z/Tornado handlers for WebSocket <-> ZMQ sockets.    )web)WebSocketHandler)JupyterHandler)WebSocketMixin   )_kernel_id_regexkernelsc                       sh   e Zd ZdZeZedd Zdd Zdd Z	dd	 Z
 fd
dZ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/var/www/edux/Edux_v2/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 }|du r| jd td| j| |dds!td| j| j	}| j
|| | jd| _| ddrA| d| jj_n| jd t| jd	rW| j I dH  dS dS )
zHandle a pre_get.Nz*Couldn't authenticate WebSocket connectioni  executer   )parentwebsocket_handlerconfig
session_idzNo session ID specifiedprepare)current_userlogwarningr   	HTTPError
authorizeris_authorizedkernel_manager
get_kernel	kernel_idr
   r   
connectionget_argumentsessionhasattrr   )r   user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                    s,   | j d| j d | j I dH  dS )zOpen a kernel websocket.zConnecting to kernel .N)r   infor#   r$   connectr,   r   r   r   openE   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_messageK   s   z!KernelWebsocketHandler.on_messagec                 C   s   | j   d| _ dS )zHandle a socket closure.N)r$   
disconnectr   r   r   r   on_closeO   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_subprotocolT   s   z)KernelWebsocketHandler.select_subprotocol)__name__
__module____qualname____doc__AUTH_RESOURCEauth_resourcepropertyr
   r   r   r*   r   r2   r5   r7   r=   __classcell__r   r   r-   r   r	      s    
r	   z/api/kernels/%s/channelsN)rA   tornador   tornado.websocketr   jupyter_server.base.handlersr   jupyter_server.base.websocketr   handlersr   rB   r	   default_handlersr   r   r   r   <module>   s    
Q