
    Xh                        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 ddl	m
Z
mZ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 Zd ZddZd Z G d de      Z ej<                  e       y# e$ r	 dd	lmZ Y Jw xY w)zKernel connection helpers.    N)Any)Session)WebSocketHandler)FloatInstanceUnicodedefault)LoggingConfigurable)json_default)date_default)extract_dates)_i18n   )KernelWebsocketConnectionABCc                    | j                         } t        | j                  d            }t        j                  | t
              j                  d      }|j                  d|       t        |      }d|dz   z  g}|dd D ]"  }|j                  |d   t        |      z          $ t        j                  d	d
|dz   z  z   |g| }|j                  d|       dj                  |      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_bufs          c/var/www/html/myenv/lib/python3.12/site-packages/jupyter_server/services/kernels/connection/base.pyserialize_binary_messager,      s      ((*C3779%&G::c<077?DNN1dLEEAIGs| /wr{SX-./++cC519$55uGwGKNN1k"88Gr   c           
         t        j                  d| dd       d   }t        t        j                  dd|z  z   | dd|dz   z               }|j                  d       g }t	        |dd |dd       D ]  \  }}|j                  | ||         t        j                  |d   j                  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%   s          r+   deserialize_binary_messager7   5   s     MM$Ra)!,E6==sU{!2DQ%!)_4MNOGNN4D73B<5 &tDt$%&
**T!W^^F+
,C!#h-0CM(_)=>C!"XC	NJr   c                    |r+ || d          || d          || d          || d         g}n| }|j                  d      }g }|j                  ddt        |      z   dz   z         |j                  t        |      |d	   z          |D ]"  }|j                  t        |      |d	   z          $ t        |      j                  dd
      }|D cg c]  }|j                  dd
       }}dj	                  |g|||      }|S c c}w )z*Serialize a message using the v1 protocol.r.   r/   metadatacontentutf-8      r   r   little)	byteorderr   )r   r!   r    to_bytesr$   )	msg_or_listchannelr#   msg_listr(   r%   offset_numberoffsetbin_msgs	            r+   serialize_msg_to_ws_v1rG   P   s   X&'_-.Z()Y'(	
 nnW%GGNN1H-123NN3w<'"+-. /s3x'"+-./L))!x)@MDKL&vqH5LGLhhDDD8DEGN Ms   Dc           
      J   t         j                  | dd d      }t        |      D cg c]'  }t         j                  | d|dz   z  d|dz   z   d      ) }}| |d   |d    j                  d      }t        d|dz
        D cg c]  }| ||   ||dz        }}||fS c c}w c c}w )z,Deserialize a message using the v1 protocol.Nr<   r>   r   r=   r   r;   )int
from_bytesranger3   )ws_msgrD   ir(   rB   rC   s         r+   deserialize_msg_from_ws_v1rN   g   s    NN6"1:x8MMRS`MaHIva1q5kAQK8(CG  WQZ'!*-44W=G=B1mVWFW=XYwqzGAEN3YHYH Zs   ,B B c                      e Zd ZdZ eddd ed            Zed        Zed        Z	ed        Z
ed	        Z e       Z ed
      d        Z eed      Z ed      d        Z ee      Zd Zd ZdeddfdZdedee   ddfdZy)BaseKernelWebsocketConnectionzJA configurable base class for connecting Kernel WebSockets to ZMQ sockets.NTa  Preferred kernel message protocol over websocket to use (default: None). If an empty string is passed, select the legacy protocol. If None, the selected protocol will depend on what the front-end supports (usually the most recent protocol supported by the back-end and the front-end).)
allow_noneconfighelpc                     | j                   S )zThe kernel manager.)parentselfs    r+   kernel_managerz,BaseKernelWebsocketConnection.kernel_manager   s     {{r   c                 .    | j                   j                  S )zThe multi kernel manager.)rX   rU   rV   s    r+   multi_kernel_managerz2BaseKernelWebsocketConnection.multi_kernel_manager   s     "")))r   c                 .    | j                   j                  S )zThe kernel id.)rX   	kernel_idrV   s    r+   r\   z'BaseKernelWebsocketConnection.kernel_id   s     "",,,r   c                 .    | j                   j                   S )zThe session id.)sessionrV   s    r+   
session_idz(BaseKernelWebsocketConnection.session_id   s     ||###r   kernel_info_timeoutc                 .    | j                   j                  S N)rZ   r`   rV   s    r+   _default_kernel_info_timeoutz:BaseKernelWebsocketConnection._default_kernel_info_timeout   s    ((<<<r   )klassrR   r^   c                 .    t        | j                        S )N)rR   )r   rR   rV   s    r+   _default_sessionz.BaseKernelWebsocketConnection._default_session   s    dkk**r   c                    K   t         w)zHandle a connect.NotImplementedErrorrV   s    r+   connectz%BaseKernelWebsocketConnection.connect        !!   	c                    K   t         w)zHandle a disconnect.rh   rV   s    r+   
disconnectz(BaseKernelWebsocketConnection.disconnect   rk   rl   incoming_msgreturnc                     t         )zHandle an incoming message.rh   )rW   ro   s     r+   handle_incoming_messagez5BaseKernelWebsocketConnection.handle_incoming_message       !!r   streamoutgoing_msgc                     t         )zHandle an outgoing message.rh   )rW   rt   ru   s      r+   handle_outgoing_messagez5BaseKernelWebsocketConnection.handle_outgoing_message   rs   r   )__name__
__module____qualname____doc__r   r   kernel_ws_protocolpropertyrX   rZ   r\   r_   r   r`   r	   rc   r   r   r^   rf   r   websocket_handlerrj   rn   strrr   r   r   rw    r   r+   rP   rP   r   s   T 
	   * * - - $ $  '"#= $= WT2GY+ + !!12"""C "D ""c "c "t "r   rP   rb   )r{   r   r"   typingr   jupyter_client.sessionr   tornado.websocketr   	traitletsr   r   r   r	   traitlets.configr
   jupyter_client.jsonutilr   ImportErrorr   r   jupyter_server.transutilsr   abcr   r,   r7   rG   rN   rP   registerr   r   r+   <module>r      s         * . 7 7 0E4 2 + -:6.@"$7 @"F &  % %&C DO  EDEs   A3 3B B