
    Xh                        d Z ddlmZ ddlZddlZddlZddlmZm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 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   G d de      Z!y)zGateway connection classes.    )annotationsN)Anycast)Future)json_decode
url_escapeutf8)HTTPRequest)IOLoop)BoolInstanceIntUnicode   )BaseKernelWebsocketConnection)url_path_join   )GatewayClientc                      e Zd ZdZ eej                  d      Z eed      Z	 e
d      Z ed      Z eddd      Zd Zd	 Zd
 Zd ZddZddZd Zed        Zy)GatewayWebSocketConnectionzBWeb socket connection that proxies to a kernel/enterprise gateway.T)klass
allow_noneFr    )r   configc                   K   d _         t        t        j                         j                  xs dt        j                         j
                  t         j                        d      } j                  r|dt         j                         z  } j                  j                  d|        i } t        j                         j                  di |}t        |fi |}t        dt        j                  |             _         j                   j#                   j$                         t'        j(                         }|j+                   j                    fd       yw)	zConnect to the socket.Nr   channelsz?session_id=zConnecting to zFuture[Any]c                $    j                         S N)_read_messages)futureselfs    V/var/www/html/myenv/lib/python3.12/site-packages/jupyter_server/gateway/connections.py<lambda>z4GatewayWebSocketConnection.connect.<locals>.<lambda>=   s    t7J7J7L      )wsr   r   instancews_urlkernels_endpointr   	kernel_id
session_idloginfoload_connection_argsr
   r   tornado_websocketwebsocket_connect	ws_futureadd_done_callback_connection_doner   current
add_future)r!   r(   kwargsrequestloops   `    r"   connectz"GatewayWebSocketConnection.connect(   s     ""$++1r""$55t~~&	
 ??Z%@$ABBFvh/0!#>'')>>HHf//m->-P-PQX-YZ(()>)>?~~(LMs   EEc                T   | j                   sU|j                         E|j                         | _        d| _        | j
                  j                  d| j                          y| j
                  j                  d| j                   dt        j                         j                          y)zHandle a finished connection.Nr   zConnection is ready: ws: z]Websocket connection has been closed via client disconnect or due to error.  Kernel with ID 'z*' may not be terminated on GatewayClient: )disconnected	exceptionresultr&   retryr,   debugwarningr*   r   r'   url)r!   futs     r"   r3   z+GatewayWebSocketConnection._connection_done?   s     !!cmmo&=jjlDGDJHHNN6twwi@AHH##'>>"22\]j]s]s]u]y]y\z|r$   c                4   d| _         | j                  | j                  j                          y| j                  r^| j                  j	                         sC| j                  j                          | j                  j                  d| j                           yyy)zHandle a disconnect.TNz-_disconnect: future cancelled, disconnected: )r;   r&   closer1   donecancelr,   r?   )r!   s    r"   
disconnectz%GatewayWebSocketConnection.disconnectM   sm     77GGMMO^^DNN$7$7$9NN!!#HHNNJ4K\K\J]^_ %:^r$   c                  K   | j                   d}| j                  s	 | j                   j                          d{   }|5| j                  s(| j                  j                  d| j                          nAt        |t              r|j                  d      }| j                  |       nn| j                   | j                  sN| j                  t        j                         j                  k  r!t!        j"                  dd      dz  }t%        t        j                         j&                  d| j                  z  z  t        j                         j(                        |z   }| xj                  d	z  c_        | j                  j+                  d
|| j                  t        j                         j                  | j                         t-        j.                  |       d{    t1        j2                         }|j5                  | j6                         yyy7 # t        $ r)}| j                  j                  d|        Y d}~d}~ww xY w7 nw)z"Read messages from gateway server.Nz*Exception reading message from websocket: zLost connection to Gateway: r	   
   d   g{Gz?r   r   zKAttempting to re-establish the connection to Gateway in %s secs (%s/%s): %s)r&   r;   read_message	Exceptionr,   errorr@   r*   
isinstancebytesdecodehandle_outgoing_messager>   r   r'   gateway_retry_maxrandomrandintmingateway_retry_intervalgateway_retry_interval_maxr-   asynciosleepr   r4   spawn_callbackr9   )r!   messageejitterretry_intervalr8   s         r"   r   z)GatewayWebSocketConnection._read_messagesX   s    gg!G$$$(GG$8$8$::G
 ?,,((+GGW)XYgu-%nnV4G,, ' gg!,   TZZ-2H2H2J2\2\%\^^B,t3F!**,CCq$**}U!**,GG 	  JJ!OJHHMM]

&&(:: --///>>#D-' &] % ;  HHNNDQCH D 0sR   IH HH  A7I8D%II6IH 	I	 I>II		Ic                N   	 | j                   j                  |       y# t        j                  $ rs | j                  j                  t        j                        rGt        j                  t        t        |                  }| j                  j                  d|        Y yY yw xY w)z$Send message to the notebook client.z?Notebook client closed websocket connection - message dropped: N)websocket_handlerwrite_messager/   WebSocketClosedErrorr,   isEnabledForloggingDEBUGr   _get_message_summaryr   r	   r?   )r!   incoming_msgargsmsg_summarys       r"   rQ   z2GatewayWebSocketConnection.handle_outgoing_message   s    		""00> 55 	xx$$W]]38MM\ 23 UVaUbc	 4	s    BB$#B$c                      j                   A j                  5t        j                         }|j	                   j                   fd       y j                         y)Send message to gateway server.Nc                &    j                        S r   )handle_incoming_message)r    r[   r!   s    r"   r#   zDGatewayWebSocketConnection.handle_incoming_message.<locals>.<lambda>   s    4;W;WX_;` r$   )r&   r1   r   r4   r5   _write_message)r!   r[   r8   s   `` r"   rm   z2GatewayWebSocketConnection.handle_incoming_message   sB    77?t~~9>>#DOODNN,`a(r$   c                    	 | j                   s)| j                  | j                  j                  |       yyy# t        $ r(}| j                  j                  d|        Y d}~yd}~ww xY w)rk   Nz(Exception writing message to websocket: )r;   r&   ra   rL   r,   rM   )r!   r[   r\   s      r"   rn   z)GatewayWebSocketConnection._write_message   sa    	K$$)<%%g. *=$ 	KHHNNEaSIJJ	Ks   38 	A)A$$A)c                H   g }| d   }|j                  d|        |dk(  r'|j                  dj                  | d   d                y|dk(  r5|j                  dj                  | d   d	   | d   d
   | d   d                y|j                  d       dj                  |      S )zGet a summary of a message.msg_typeztype: statusz, state: {}contentexecution_staterM   z
, {}:{}:{}enameevalue	tracebackz, ...r   N)appendformatjoin)r[   summarymessage_types      r"   rf   z/GatewayWebSocketConnection._get_message_summary   s     z*~./8#NN=//	0BCT0UVWW$NN##I&w/I&x0I&{3 NN7#777##r$   N)rg   strrh   r   returnNone)r[   r}   r~   r   )__name__
__module____qualname____doc__r   r/   WebSocketClientConnectionr&   r   r1   r   r;   r   r>   r   kernel_ws_protocolr9   r3   rG   r   rQ   rm   rn   staticmethodrf   r%   r$   r"   r   r      s    L	)CCPT	UBv$7I;LFE
 !TBN.	`+.Z)K $ $r$   r   )"r   
__future__r   rX   rd   rS   typingr   r   tornado.websocket	websocketr/   tornado.concurrentr   tornado.escaper   r   r	   tornado.httpclientr
   tornado.ioloopr   	traitletsr   r   r   r    services.kernels.connection.baser   utilsr   gateway_clientr   r   r%   r$   r"   <module>r      sI    ! #     - % 8 8 * ! 2 2 L ! )^$!> ^$r$   