
    ^h                        S r SSKJr  SSKrSSKrSSKrSSKJrJr  SSK	J
r  SSKJr  SSKJrJrJr  SSKJr  SSKJr  SS	KJrJrJrJr  S
SKJr  S
SKJr  SSKJ r    " S S\5      r!g)zGateway connection classes.    )annotationsN)Anycast)Future)json_decode
url_escapeutf8)HTTPRequest)IOLoop)BoolInstanceIntUnicode   )BaseKernelWebsocketConnection)url_path_join   )GatewayClientc                      \ rS rSrSr\" \R                  SS9r\" \	SS9r
\" S5      r\" S5      r\" SSSS9rS	 rS
 rS rS rSS jrSS jrS r\S 5       rSrg)GatewayWebSocketConnection   zBWeb socket connection that proxies to a kernel/enterprise gateway.T)klass
allow_noneFr    )r   configc                  ^ #    ST l         [        [        R                  " 5       R                  =(       d    S[        R                  " 5       R
                  [        T R                  5      S5      nT R                  (       a  US[        T R                  5       3-  nT R                  R                  SU 35        0 n[        R                  " 5       R                  " S0 UD6n[        U40 UD6n[        S[        R                  " U5      5      T l        T R                   R#                  T R$                  5        [&        R(                  " 5       nUR+                  T R                   U 4S j5        g7f)	zConnect to the socket.Nr   channelsz?session_id=zConnecting to zFuture[Any]c                $   > TR                  5       $ N)_read_messages)futureselfs    \/home/james-whalen/.local/lib/python3.13/site-packages/jupyter_server/gateway/connections.py<lambda>4GatewayWebSocketConnection.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#   connect"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                b   U R                   (       dV  UR                  5       cE  UR                  5       U l        SU l        U R
                  R                  SU R                   35        gU R
                  R                  SU R                   S[        R                  " 5       R                   35        g)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#   r5   +GatewayWebSocketConnection._connection_done?   s     !!cmmo&=jjlDGDJHHNN6twwi@AHH##'>>"22\]j]s]s]u]y]y\z|r&   c                J   SU l         U R                  b  U R                  R                  5         gU R                  (       ac  U R                  R	                  5       (       dC  U R                  R                  5         U R                  R                  SU R                    35        ggg)zHandle a disconnect.TNz-_disconnect: future cancelled, disconnected: )r>   r(   closer3   donecancelr.   rB   )r"   s    r#   
disconnect%GatewayWebSocketConnection.disconnectM   sp     77GGMMO^^DNN$7$7$9$9NN!!#HHNNJ4K\K\J]^_ %:^r&   c                  #    U R                   b  SnU R                  (       d   U R                   R                  5       I Sh  vN nUc:  U R                  (       d(  U R                  R                  SU R                   35        OH[        U[        5      (       a  UR                  S5      nU R                  U5        OOU R                   b  M  U R                  (       GdV  U R                  [        R                  " 5       R                  :  Ga'  [         R"                  " SS5      S-  n[%        [        R                  " 5       R&                  SU R                  -  -  [        R                  " 5       R(                  5      U-   nU =R                  S	-  sl        U R                  R+                  S
UU R                  [        R                  " 5       R                  U R                  5        [,        R.                  " U5      I Sh  vN   [0        R2                  " 5       nUR5                  U R6                  5        ggg GN! [         a)  nU R                  R                  SU 35         SnAGNSnAff = f Np7f)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.   errorrC   r,   
isinstancebytesdecodehandle_outgoing_messagerA   r   r)   gateway_retry_maxrandomrandintmingateway_retry_intervalgateway_retry_interval_maxr/   asynciosleepr   r6   spawn_callbackr;   )r"   messageejitterretry_intervalr:   s         r#   r    )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 0sT   !I/H7 H4H7 BI/D1I/<I-=7I/4H7 7
I*I%I/%I**I/c                Z    U R                   R                  U5        g! [        R                   ax    U R                  R                  [        R                  5      (       aG  [        R                  [        [        U5      5      5      nU R                  R                  SU 35         g gf = f)z$Send message to the notebook client.z?Notebook client closed websocket connection - message dropped: N)websocket_handlerwrite_messager1   WebSocketClosedErrorr.   isEnabledForloggingDEBUGr   _get_message_summaryr   r	   rB   )r"   incoming_msgargsmsg_summarys       r#   rV   2GatewayWebSocketConnection.handle_outgoing_message   s    		""00> 55 	xx$$W]]338MM\ 23 UVaUbc	 4	s    BB*)B*c                   ^ ^ T R                   cD  T R                  b7  [        R                  " 5       nUR	                  T R                  UU 4S j5        gT R                  T5        g)Send message to gateway server.Nc                &   > TR                  T5      $ r   )handle_incoming_message)r!   r`   r"   s    r#   r$   DGatewayWebSocketConnection.handle_incoming_message.<locals>.<lambda>   s    4;W;WX_;`r&   )r(   r3   r   r6   r7   _write_message)r"   r`   r:   s   `` r#   rt   2GatewayWebSocketConnection.handle_incoming_message   sB    77?t~~9>>#DOODNN,`a(r&   c                     U R                   (       d*  U R                  b  U R                  R                  U5        ggg! [         a(  nU R                  R                  SU 35         SnAgSnAff = f)rr   Nz(Exception writing message to websocket: )r>   r(   rg   rQ   r.   rR   )r"   r`   ra   s      r#   rv   )GatewayWebSocketConnection._write_message   sa    	K$$)<%%g. *=$ 	KHHNNEaSIJJ	Ks   9> 
A0A++A0c                L   / nU S   nUR                  SU 35        US:X  a'  UR                  SR                  U S   S   5      5        gUS:X  a5  UR                  SR                  U S   S	   U S   S
   U S   S   5      5        gUR                  S5        SR                  U5      $ )zGet a summary of a message.msg_typeztype: statusz, state: {}contentexecution_staterR   z
, {}:{}:{}enameevalue	tracebackz, ...r   N)appendformatjoin)r`   summarymessage_types      r#   rl   /GatewayWebSocketConnection._get_message_summary   s     z*~./8#NN=//	0BCT0UVWW$NN##I&w/I&x0I&{3 NN7#777##r&   )r>   rA   r(   r3   N)rm   strrn   r   returnNone)r`   r   r   r   )__name__
__module____qualname____firstlineno____doc__r   r1   WebSocketClientConnectionr(   r   r3   r   r>   r   rA   r   kernel_ws_protocolr;   r5   rK   r    rV   rt   rv   staticmethodrl   __static_attributes__r'   r&   r#   r   r      s    L	)CCPT	UBv$7I;LFE
 !TBN.	`+.Z)K $ $r&   r   )"r   
__future__r   r]   rj   rX   typingr   r   tornado.websocket	websocketr1   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&   