o
    ^i                     @  s   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 deZ!dS )zGateway connection classes.    )annotationsN)Anycast)Future)json_decode
url_escapeutf8)HTTPRequest)IOLoop)BoolInstanceIntUnicode   )BaseKernelWebsocketConnection)url_path_join   )GatewayClientc                   @  s   e Zd ZdZeejddZeeddZ	e
dZedZeddddZdd	 Zd
d Zdd Zdd Zd ddZd!ddZdd Zedd ZdS )"GatewayWebSocketConnectionzBWeb socket connection that proxies to a kernel/enterprise gateway.T)klass
allow_noneFr    )r   configc                   s   d _ tt jpdt jt jd} jr#|dt j 7 } j	
d|  i }t jd	i |}t|fi |}tdt| _ j j t }| j fdd dS )
zConnect to the socket.Nr   channelsz?session_id=zConnecting to zFuture[Any]c                   s      S N)_read_messagesfutureself ]/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/jupyter_server/gateway/connections.py<lambda>=   s    z4GatewayWebSocketConnection.connect.<locals>.<lambda>r    )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loopr    r   r!   connect(   s$   z"GatewayWebSocketConnection.connectc                 C  s^   | j s| du r| | _d| _| jd| j  dS | jd| j dt	
 j  dS )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   futr    r    r!   r0   ?   s   
z+GatewayWebSocketConnection._connection_donec                 C  sX   d| _ | jdur| j  dS | jr(| j s*| j  | jd| j   dS dS dS )zHandle a disconnect.TNz-_disconnect: future cancelled, disconnected: )r7   r#   closer.   donecancelr)   r;   r   r    r    r!   
disconnectM   s   

z%GatewayWebSocketConnection.disconnectc              
     sX  | j durYd}| jsSz
| j  I dH }W n ty0 } z| jd|  W Y d}~nd}~ww |du rC| jsB| jd| j  nt|t	rM|
d}| | nn| j dus| js| jt jk rtddd }tt jd| j  t j| }|  jd	7  _| jd
|| jt j| j t|I dH  t }|| j dS dS dS )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#   r7   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
   r1   spawn_callbackr6   )r   messageejitterretry_intervalr5   r    r    r!   r   X   sX   



z)GatewayWebSocketConnection._read_messagesincoming_msgstrargsr   returnNonec                 G  sb   z	| j | W dS  tjy0   | jtjr-t	t
t|}| jd|  Y dS Y dS 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   rY   r[   msg_summaryr    r    r!   rK      s   

z2GatewayWebSocketConnection.handle_outgoing_messagerU   c                   sF   j du rjdurt }|j fdd dS   dS )Send message to gateway server.Nc                   s
     S r   )handle_incoming_messager   rU   r   r    r!   r"      s   
 zDGatewayWebSocketConnection.handle_incoming_message.<locals>.<lambda>)r#   r.   r
   r1   r2   _write_message)r   rU   r5   r    rh   r!   rg      s   z2GatewayWebSocketConnection.handle_incoming_messagec              
   C  sh   z| j s| jdur| j| W dS W dS W dS  ty3 } z| jd|  W Y d}~dS d}~ww )rf   Nz(Exception writing message to websocket: )r7   r#   r_   rF   r)   rG   )r   rU   rV   r    r    r!   ri      s    z)GatewayWebSocketConnection._write_messagec                 C  s   g }| d }| d|  |dkr | d| d d  dS |dkr<| d| d d	 | d d
 | d d  dS | d d|S )zGet a summary of a message.msg_typeztype: statusz, state: {}contentexecution_staterG   z
, {}:{}:{}enameevalue	tracebackz, ...r   N)appendformatjoin)rU   summarymessage_typer    r    r!   rd      s   




z/GatewayWebSocketConnection._get_message_summaryN)rY   rZ   r[   r   r\   r]   )rU   rZ   r\   r]   )__name__
__module____qualname____doc__r   r,   WebSocketClientConnectionr#   r   r.   r   r7   r   r:   r   kernel_ws_protocolr6   r0   rB   r   rK   rg   ri   staticmethodrd   r    r    r    r!   r      s     
-
r   )"ry   
__future__r   rR   rb   rM   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    r!   <module>   s     