o
    ip                     @   s   d Z ddlZddlZddlmZ ddlmZ ddlmZm	Z	m
Z
 ddlmZ zddlmZ W n ey=   ddlmZ Y nw dd	lmZ d
dlmZ dd Zdd ZdddZdd ZG dd deZee dS )zKernel connection helpers.    N)Session)WebSocketHandler)FloatInstancedefault)LoggingConfigurable)json_default)date_default)extract_dates   )KernelWebsocketConnectionABCc                 C   s   |   } t| d}tj| tdd}|d| t|}d|d  g}|dd D ]}|	|d t|  q,t
jd	d
|d   |g|R  }|d| d|S )a1  serialize a message as a binary blob

    Header:

    4 bytes: number of msg parts (nbufs) as 32b int
    4 * nbufs bytes: offset for each buffer as integer as 32b int

    Offsets are from the start of the buffer, including the header.

    Returns
    -------
    The message serialized to bytes.

    buffers)r   utf8r      r   N!I    )copylistpopjsondumpsr   encodeinsertlenappendstructpackjoin)msgr   bmsgnbufsoffsetsbufoffsets_buf r&   j/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/jupyter_server/services/kernels/connection/base.pyserialize_binary_message   s    
r(   c              	   C   s   t d| dd d }tt dd|  | dd|d   }|d g }t|dd |dd D ]\}}|| ||  q4t|d d	}t|d
 |d
< t|d |d< |dd |d< |S )a&  deserialize a message from a binary blog

    Header:

    4 bytes: number of msg parts (nbufs) as 32b int
    4 * nbufs bytes: offset for each buffer as integer as 32b int

    Offsets are from the start of the buffer, including the header.

    Returns
    -------
    message dictionary
    z!iNr   r   r   r   r   r   r   headerparent_headerr   )	r   unpackr   r   zipr   loadsdecoder
   )r!   r"   r#   bufsstartstopr    r&   r&   r'   deserialize_binary_message1   s   (
"r2   c                 C   s   |r|| d || d || d || d g}n| }| d}g }|ddt| d   |t||d	   |D ]}|t||d	   q<t|jdd
d}dd |D }d|g||g | }|S )z*Serialize a message using the v1 protocol.r)   r*   metadatacontentutf-8      r   r   little	byteorderc                 S   s   g | ]	}|j d ddqS )r6   r8   r9   )to_bytes).0offsetr&   r&   r'   
<listcomp>^   s    z*serialize_msg_to_ws_v1.<locals>.<listcomp>r   )r   r   r   r;   r   )msg_or_listchannelr   msg_listr#   r    offset_numberbin_msgr&   r&   r'   serialize_msg_to_ws_v1L   s"   




rD   c                    sj   t dd d}fddt|D   d  d  d} fd	dtd|d D }||fS )
z,Deserialize a message using the v1 protocol.Nr6   r8   c              	      s0   g | ]}t  d |d  d |d   dqS )r6   r   r7   r8   )int
from_bytesr<   i)ws_msgr&   r'   r>   f   s    $z.deserialize_msg_from_ws_v1.<locals>.<listcomp>r   r   r5   c                    s$   g | ]} |  |d    qS )r   r&   rG   r#   rI   r&   r'   r>   j   s   $ )rE   rF   ranger.   )rI   rB   r@   rA   r&   rJ   r'   deserialize_msg_from_ws_v1c   s   
rL   c                   @   s   e Zd ZdZedd Zedd Zedd Zedd	 Ze	 Z
ed
dd ZeeddZeddd ZeeZdd Zdd ZdeddfddZdededdfddZdS )BaseKernelWebsocketConnectionzJA configurable base class for connecting Kernel WebSockets to ZMQ sockets.c                 C   s   | j S )zThe kernel manager.)parentselfr&   r&   r'   kernel_managerq   s   z,BaseKernelWebsocketConnection.kernel_managerc                 C      | j jS )zThe multi kernel manager.)rQ   rN   rO   r&   r&   r'   multi_kernel_managerv      z2BaseKernelWebsocketConnection.multi_kernel_managerc                 C   rR   )zThe kernel id.)rQ   	kernel_idrO   r&   r&   r'   rU   {   rT   z'BaseKernelWebsocketConnection.kernel_idc                 C   s   | j j S )zThe session id.)sessionrO   r&   r&   r'   
session_id   rT   z(BaseKernelWebsocketConnection.session_idkernel_info_timeoutc                 C   rR   N)rS   rX   rO   r&   r&   r'   _default_kernel_info_timeout   s   z:BaseKernelWebsocketConnection._default_kernel_info_timeoutT)klassconfigrV   c                 C   s   t | jdS )N)r\   )r   r\   rO   r&   r&   r'   _default_session   s   z.BaseKernelWebsocketConnection._default_sessionc                       t  )zHandle a connect.NotImplementedErrorrO   r&   r&   r'   connect      z%BaseKernelWebsocketConnection.connectc                    r^   )zHandle a disconnect.r_   rO   r&   r&   r'   
disconnect   rb   z(BaseKernelWebsocketConnection.disconnectincoming_msgreturnNc                 C      t  )zHandle an incoming message.r_   )rP   rd   r&   r&   r'   handle_incoming_message      z5BaseKernelWebsocketConnection.handle_incoming_messagestreamoutgoing_msgc                 C   rf   )zHandle an outgoing message.r_   )rP   ri   rj   r&   r&   r'   handle_outgoing_message   rh   z5BaseKernelWebsocketConnection.handle_outgoing_message)__name__
__module____qualname____doc__propertyrQ   rS   rU   rW   r   rX   r   rZ   r   r   rV   r]   r   websocket_handlerra   rc   strrg   r   rk   r&   r&   r&   r'   rM   n   s*    





rM   rY   )ro   r   r   jupyter_client.sessionr   tornado.websocketr   	traitletsr   r   r   traitlets.configr   jupyter_client.jsonutilr   ImportErrorr	   r
   abcr   r(   r2   rD   rL   rM   registerr&   r&   r&   r'   <module>   s(    
6