
    Ke                        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
mZ ddlmZ 	 ddlmZ n# e$ r	 ddlmZ Y nw xY w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           dS )zKernel connection helpers.    N)Session)WebSocketHandler)FloatInstanceUnicodedefault)LoggingConfigurable)json_default)date_default)extract_dates)_i18n   )KernelWebsocketConnectionABCc                 $   |                                  } t          |                     d                    }t          j        | t
                                        d          }|                    d|           t          |          }d|dz   z  g}|dd         D ]-}|	                    |d         t          |          z              .t          j        d	d
|dz   z  z   |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_bufs          Olib/python3.11/site-packages/jupyter_server/services/kernels/connection/base.pyserialize_binary_messager+      s     ((**C3779%%&&G:c<00077??DNN1dLLEEAIGss| / /wr{SXX-....+cC519$55uGwGGGKNN1k"""88Gr   c           
      @   t          j        d| dd                   d         }t          t          j        dd|z  z   | dd|dz   z                               }|                    d           g }t	          |dd         |dd                   D ]"\  }}|                    | ||                    #t          j        |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$   s          r*   deserialize_binary_messager6   3   s    M$RaR))!,E6=sU{!2DQ%!)_9L4MNNOOGNN4D73B3<55 & &tDt$%%%%
*T!W^^F++
,
,C!#h-00CM(_)=>>C!""XC	NJr   c                 f   |rC || d                    || d                    || d                    || d                   g}n| }|                     d          }g }|                    ddt          |          z   dz   z             |                    t          |          |d	         z              |D ]-}|                    t          |          |d	         z              .t          |                              dd
          }d |D             }d                    |g|||          }|S )z*Serialize a message using the v1 protocol.r-   r.   metadatacontentutf-8      r   r   little	byteorderc                 <    g | ]}|                     d d          S )r;   r=   r>   )to_bytes).0offsets     r*   
<listcomp>z*serialize_msg_to_ws_v1.<locals>.<listcomp>`   s(    LLL&vqH55LLLr   r   )r   r    r   rA   r#   )msg_or_listchannelr"   msg_listr'   r$   offset_numberbin_msgs           r*   serialize_msg_to_ws_v1rJ   N   sL    DX&''D_-..DZ())DY'((	
 nnW%%GGNN1H-12333NN3w<<'"+-... / /s3xx'"+-....LL))!x)@@MLLGLLLGhhDDD8DEEGNr   c                     t                                dd         d          } fdt          |          D              d         d                                      d          } fdt          d|dz
            D             }||fS )	z,Deserialize a message using the v1 protocol.Nr;   r=   c           	      n    g | ]1}t                               d |dz   z  d |dz   z           d          2S )r;   r   r<   r=   )int
from_bytes)rB   iws_msgs     r*   rD   z.deserialize_msg_from_ws_v1.<locals>.<listcomp>h   sN       HIva1q5kAQK78(CC  r   r   r   r:   c                 B    g | ]}|         |d z                     S )r    )rB   rO   r'   rP   s     r*   rD   z.deserialize_msg_from_ws_v1.<locals>.<listcomp>l   s/    YYYwqzGAEN23YYYr   )rM   rN   ranger2   )rP   rH   rF   rG   r'   s   `   @r*   deserialize_msg_from_ws_v1rT   e   s    NN6"1":x88M   MRS`MaMa  G WQZ'!*,-44W==GYYYYYU1mVWFW=X=XYYYHHr   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ddfdZdS )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.)r^   r[   r\   s    r*   multi_kernel_managerz2BaseKernelWebsocketConnection.multi_kernel_manager   s     "))r   c                     | j         j        S )zThe kernel id.)r^   	kernel_idr\   s    r*   rb   z'BaseKernelWebsocketConnection.kernel_id   s     ",,r   c                     | j         j         S )zThe session id.)sessionr\   s    r*   
session_idz(BaseKernelWebsocketConnection.session_id   s     |##r   kernel_info_timeoutc                     | j         j        S N)r`   rf   r\   s    r*   _default_kernel_info_timeoutz:BaseKernelWebsocketConnection._default_kernel_info_timeout   s    (<<r   )klassrX   rd   c                 ,    t          | j                  S )N)rX   )r   rX   r\   s    r*   _default_sessionz.BaseKernelWebsocketConnection._default_session   s    dk****r   c                 "   K   t                      )zHandle a connect.NotImplementedErrorr\   s    r*   connectz%BaseKernelWebsocketConnection.connect         !###r   c                 "   K   t                      )zHandle a disconnect.rn   r\   s    r*   
disconnectz(BaseKernelWebsocketConnection.disconnect   rq   r   incoming_msgreturnc                     t                      )zHandle an incoming message.rn   )r]   rt   s     r*   handle_incoming_messagez5BaseKernelWebsocketConnection.handle_incoming_message       !###r   streamoutgoing_msgc                     t                      )zHandle an outgoing message.rn   )r]   ry   rz   s      r*   handle_outgoing_messagez5BaseKernelWebsocketConnection.handle_outgoing_message   rx   r   )__name__
__module____qualname____doc__r   r   kernel_ws_protocolpropertyr^   r`   rb   re   r   rf   r   ri   r   r   rd   rl   r   websocket_handlerrp   rs   strrw   r   r|   rR   r   r*   rV   rV   p   s       TT U
 
	     X * * X* - - X- $ $ X$  %''W"##= = $#= hWT222GWY+ + + !!122$ $ $$ $ $$C $D $ $ $ $$c $ $$ $ $ $ $ $ $r   rV   rh   )r   r   r!   jupyter_client.sessionr   tornado.websocketr   	traitletsr   r   r   r   traitlets.configr	   jupyter_client.jsonutilr
   ImportErrorr   r   jupyter_server.transutilsr   abcr   r+   r6   rJ   rT   rV   registerrR   r   r*   <module>r      s         * * * * * * . . . . . . 7 7 7 7 7 7 7 7 7 7 7 7 0 0 0 0 0 0E4444444 E E EDDDDDDDDE 2 1 1 1 1 1 + + + + + + - - - - - -  :  6   .  @$ @$ @$ @$ @$$7 @$ @$ @$F &  %&C D D D D Ds   1 ??