o
    tfb                     @  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	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   ZchannelszConnecting to zFuture[Any]c                   s      S N)_read_messagesfutureself k/var/www/html/software/conda/envs/catlas/lib/python3.10/site-packages/jupyter_server/gateway/connections.py<lambda>;   s    z4GatewayWebSocketConnection.connect.<locals>.<lambda>r   )wsr   r   instancews_urlZkernels_endpointr   	kernel_idloginfoZload_connection_argsr	   r   tornado_websocketZ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    r+   =   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: )r2   r"   closer)   donecancelr&   r6   r   r   r   r    
disconnectK   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"   r2   Zread_message	Exceptionr&   errorr7   r%   
isinstancebytesdecodehandle_outgoing_messager5   r   r#   Zgateway_retry_maxrandomrandintminZgateway_retry_intervalZgateway_retry_interval_maxr'   asynciosleepr
   r,   Zspawn_callbackr1   )r   messageejitterZretry_intervalr0   r   r   r    r   V   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)Zwebsocket_handlerwrite_messager(   ZWebSocketClosedErrorr&   isEnabledForloggingDEBUGr   _get_message_summaryr   r   r6   )r   rN   rP   Zmsg_summaryr   r   r    rE      s   

z2GatewayWebSocketConnection.handle_outgoing_messagerK   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   rK   r   r   r    r!      s   
 zDGatewayWebSocketConnection.handle_incoming_message.<locals>.<lambda>)r"   r)   r
   r,   r-   _write_message)r   rK   r0   r   rZ   r    rY      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 )rX   Nz(Exception writing message to websocket: )r2   r"   rS   r@   r&   rA   )r   rK   rL   r   r   r    r[      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: {}contentZexecution_staterA   z
, {}:{}:{}ZenameZevalue	tracebackz, ...r   N)appendformatjoin)rK   summaryZmessage_typer   r   r    rW      s   




z/GatewayWebSocketConnection._get_message_summaryN)rN   rO   rP   r   rQ   rR   )rK   rO   rQ   rR   )__name__
__module____qualname____doc__r   r(   ZWebSocketClientConnectionr"   r   r)   r   r2   r   r5   r   Zkernel_ws_protocolr1   r+   r=   r   rE   rY   r[   staticmethodrW   r   r   r   r    r      s     
-
r   )"rg   
__future__r   rI   rU   rF   typingr   r   Ztornado.websocketZ	websocketr(   Ztornado.concurrentr   Ztornado.escaper   r   r   Ztornado.httpclientr	   Ztornado.ioloopr
   Z	traitletsr   r   r   r   Z services.kernels.connection.baser   utilsr   Zgateway_clientr   r   r   r   r   r    <module>   s     