
    lKj.                       d Z ddlmZ ddlZddlZddl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 ddlmZmZmZ dd	lmZ dd
lmZmZ ddlmZmZ ddlmZ ddl m!Z!m"Z" ddl#m$Z$ ddl%m&Z&  ejN                  de(d        e) ejT                  dd            Z+ G d dee"      Z, G d de      Z- G d de!      Z.ddl/m0Z0 ddl1m2Z2 de0z  e,fde2z  e.fgZ3y) zGateway API handlers.    )annotationsN)Anycast)Session)web)Future)json_decode
url_escapeutf8)HTTPRequest)IOLoopPeriodicCallback)WebSocketHandlerwebsocket_connect)LoggingConfigurable   )
APIHandlerJupyterHandler)url_path_join   )GatewayClientzhThe jupyter_server.gateway.handlers module is deprecated and will not be supported in Jupyter Server 3.0)
stacklevelGATEWAY_WS_PING_INTERVAL_SECS30c                       e Zd ZdZdZdZdZdZddZd Z	d Z
d Zd Z fdZd	 Zdd
Zd Zd fd	Z fdZed        Z xZS )WebSocketChannelsHandlerz$Gateway web socket channels handler.Nc                .    t        j                  | |      S )zCheck origin for the socket.)r   check_origin)selforigins     p/Users/ahmed/devFolder/Ultron/claude-voice/.venv/lib/python3.12/site-packages/jupyter_server/gateway/handlers.pyr   z%WebSocketChannelsHandler.check_origin/   s    **488    c                     y)zVUndo the set_default_headers in JupyterHandler which doesn't make sense for websocketsN r   s    r!   set_default_headersz,WebSocketChannelsHandler.set_default_headers3   s    r"   c                    i S )z+Get the compression options for the socket.r$   r%   s    r!   get_compression_optionsz0WebSocketChannelsHandler.get_compression_options6   s	     	r"   c                4   | j                   0| j                  j                  d       t        j                  d      | j                  dd      r/| j                  J | j                  d      | j                  _        y| j                  j                  d       y)zRun before finishing the GET request

        Extend this method to add logic that should fire before
        the websocket finishes completing.
        Nz*Couldn't authenticate WebSocket connectioni  
session_idzNo session ID specified)current_userlogwarningr   	HTTPErrorget_argumentsessionr%   s    r!   authenticatez%WebSocketChannelsHandler.authenticate;   s|     $HHIJ--$$\40<<+++#'#4#4\#BDLL HH67r"   c                    | j                   j                  d| j                  j                         t	        | j
                        | _        t        t        j                         j                        | _        y)zInitialize the socket.z$Initializing websocket connection %s)config)gateway_urlN)r,   debugrequestpathr   r3   r0   GatewayWebSocketClientr   instanceurlgatewayr%   s    r!   
initializez#WebSocketChannelsHandler.initializeL   sJ    =t||?P?PQdkk2--:P:P:R:V:VWr"   c                x   K   | j                          || _        ||d<   t        |   |i | d{    y7 w)zGet the socket.	kernel_idN)r1   r>   superget)r   r>   argskwargs	__class__s       r!   r@   zWebSocketChannelsHandler.getR   s;     "'{gk4*6***s   /:8:c                    | j                   '| j                  | j                  j                          y| j                  d       y)zSend a ping to the socket.Nr"   )ws_connectionping_callbackstoppingr%   s    r!   	send_pingz"WebSocketChannelsHandler.send_pingY   s9    %$*<*<*H##%		#r"   c                   t        | j                  t        dz        | _        | j                  j	                          | j
                  J | j
                  j                  || j                  | j                                y)z_Handle web socket connection open to notebook server and delegate to gateway web socket handleri  N)r>   message_callbackcompression_options)	r   rI   r   rF   startr;   on_openwrite_messager(   )r   r>   rA   rB   s       r!   openzWebSocketChannelsHandler.opena   sm    -dnn>[^b>bc  "||'''!// $ < < > 	 	
r"   c                V    | j                   J | j                   j                  |       y)z.Forward message to gateway web socket handler.N)r;   
on_message)r   messages     r!   rR   z#WebSocketChannelsHandler.on_messagem   s$    ||'''(r"   c                D   | j                   r$t        |t              rd}t        |   ||       y| j
                  j                  t        j                        rFt        j                  t        t        |                  }| j
                  j                  d|        yy)zdSend message back to notebook client.  This is called via callback from self.gateway._read_messages.T)binaryz?Notebook client closed websocket connection - message dropped: N)rE   
isinstancebytesr?   rO   r,   isEnabledForloggingDEBUGr   _get_message_summaryr	   r   r5   )r   rS   rU   msg_summaryrC   s       r!   rO   z&WebSocketChannelsHandler.write_messager   s    '5)G!'&!9XX""7==12GGTXY`TaHbcKHHNNQR]Q^_ 2r"   c                    | j                   j                  d| j                  j                         | j                  J | j                  j                          t        |           y)zHandle a closing socket.zClosing websocket connection %sN)r,   r5   r6   r7   r;   on_closer?   )r   rC   s    r!   r^   z!WebSocketChannelsHandler.on_close~   sK    8$,,:K:KL||'''r"   c                H   g }| d   }|j                  d|        |dk(  r'|j                  dj                  | d   d                nK|dk(  r5|j                  dj                  | d   d	   | d   d
   | d   d                n|j                  d       dj                  |      S )zGet a summary of a message.msg_typeztype: statusz, state: {}contentexecution_stateerrorz
, {}:{}:{}enameevalue	tracebackz, ... )appendformatjoin)rS   summarymessage_types      r!   r[   z-WebSocketChannelsHandler._get_message_summary   s     z*~./8#NN=//	0BCT0UVWW$NN##I&w/I&x0I&{3 NN7#wwwr"   N)r>   strreturnNone)F)__name__
__module____qualname____doc__r0   r;   r>   rF   r   r&   r(   r1   r<   r@   rI   rP   rR   rO   r^   staticmethodr[   __classcell__rC   s   @r!   r   r   '   sg    .GGIM9e
8"X+

)

    r"   r   c                  R     e Zd ZdZ fdZd Zd Zd Zd Zd Z	d Z
d	 Zd
 Z xZS )r8   z;Proxy web socket connection to a kernel/enterprise gateway.c                x    t         |           d| _        d| _        t	               | _        d| _        d| _        y)z)Initialize the gateway web socket client.NFr   )r?   __init__r>   wsr   	ws_futuredisconnectedretry)r   rB   rC   s     r!   r{   zGatewayWebSocketClient.__init__   s4    &,h!
r"   c                (   K   d _         | _        t        j                         }|j                  J t        |j                  |j                  t        |      d      } j                  j                  d|        i } |j                  di |}t        |fi |}t        dt        |             _         j                  j                   j                          t#        j$                         }|j'                   j                   fd       yw)zConnect to the socket.NchannelszConnecting to zFuture[Any]c                &    j                        S rn   )_read_messages)futurerK   r   s    r!   <lambda>z1GatewayWebSocketClient._connect.<locals>.<lambda>   s    t7J7JK[7\r"   r$   )r|   r>   r   r9   ws_urlr   kernels_endpointr
   r,   infoload_connection_argsr   r   r   r}   add_done_callback_connection_doner   current
add_future)r   r>   rK   clientr   rB   r6   loops   ` `     r!   _connectzGatewayWebSocketClient._connect   s      "'')}}(((MM##y!	
 	vh/0!#,,,6v6f//m->w-GH(()>)>?~~(\]s   DD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: )r~   	exceptionresultr|   r   r,   r5   r-   r>   r   r9   r:   )r   futs     r!   r   z'GatewayWebSocketClient._connection_done   s     !!cmmo&=jjlDGDJHHNN6twwi@AHH##'>>"22\]j]s]s]u]y]y\z|r"   c                   d| _         | j                  | j                  j                          y| j                  j	                         sC| j                  j                          | j                  j                  d| j                           yy)zHandle a disconnect.TNz-_disconnect: future cancelled, disconnected: )r~   r|   closer}   donecancelr,   r5   r%   s    r!   _disconnectz"GatewayWebSocketClient._disconnect   se     77GGMMO$$&NN!!#HHNNJ4K\K\J]^_ 'r"   c                d  K   | j                   d}| j                  sc	 | j                   j                          d{   }|5| j                  s(| j                  j                  d| j                          n ||       nn| j                   | j                  sZ| 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{    t)        j*                         }|j-                  | j.                  | j                  |       yyy7 # t        $ r)}| j                  j                  d|        Y d}~d}~ww xY w7 zw)
z"Read messages from gateway server.Nz*Exception reading message from websocket: zLost connection to Gateway: 
   d   g{Gz?r   r   zKAttempting to re-establish the connection to Gateway in %s secs (%s/%s): %s)r|   r~   read_message	Exceptionr,   rd   r-   r>   r   r   r9   gateway_retry_maxrandomrandintmingateway_retry_intervalgateway_retry_interval_maxr   asynciosleepr   r   spawn_callbackr   )r   callbackrS   ejitterretry_intervalr   s          r!   r   z%GatewayWebSocketClient._read_messages   s    gg!G$$$(GG$8$8$::G
 ?,,((+GGW)XY # gg!(   TZZ-2H2H2J2\2\%\^^B,t3F!**,CCq$**}U!**,GG 	  JJ!OJHHMM]

&&(:: --///>>#Dt~~xH' &] ! ;  HHNNDQCH @ 0sS   H0G9 G6G9  AH0D%H03H.4AH06G9 9	H+H& H0&H++H0c                f    t        j                         }|j                  | j                  ||       y)z2Web socket connection open against gateway server.N)r   r   r   r   )r   r>   rK   rB   r   s        r!   rN   zGatewayWebSocketClient.on_open  s%    ~~DMM96FGr"   c                      j                   5t        j                         }|j                   j                   fd       y j                         y)Send message to gateway server.Nc                &    j                        S rn   )_write_message)r   rS   r   s    r!   r   z3GatewayWebSocketClient.on_message.<locals>.<lambda>  s    4;N;Nw;Wr"   )r|   r   r   r   r}   r   )r   rS   r   s   `` r!   rR   z!GatewayWebSocketClient.on_message
  s9    77?>>#DOODNN,WX(r"   c                    	 | j                   s)| j                  | j                  j                  |       yyy# t        $ r(}| j                  j                  d|        Y d}~yd}~ww xY w)r   Nz(Exception writing message to websocket: )r~   r|   rO   r   r,   rd   )r   rS   r   s      r!   r   z%GatewayWebSocketClient._write_message  sa    	K$$)<%%g. *=$ 	KHHNNEaSIJJ	Ks   38 	A)A$$A)c                $    | j                          y)zWeb socket closed event.N)r   r%   s    r!   r^   zGatewayWebSocketClient.on_close  s    r"   )rr   rs   rt   ru   r{   r   r   r   r   rN   rR   r   r^   rw   rx   s   @r!   r8   r8      s9    E^2	`)IVH
)Kr"   r8   c                  6    e Zd ZdZej
                  dd       Zy)GatewayResourceHandlerzWRetrieves resources for specific kernelspec definitions from kernel/enterprise gateway.c                  K   d}| j                   }|j                  ||       d{   }|#| j                  j                  d| d| d       nt	        j
                  |      d   xs d}| j                  ||       y7 Yw)z(Get a gateway resource by name and path.NzKernelspec resource 'z' for 'z7' not found.  Gateway may not support resource serving.r   z
text/plain)set_content_type)kernel_spec_managerget_kernel_spec_resourcer,   r-   	mimetypes
guess_typefinish)r   kernel_namer7   include_bodymimetypeksmkernel_spec_ress          r!   r@   zGatewayResourceHandler.get"  s       $&& # < <!
 
 "HH'vW[M B% %
 !++D1!4DHOh?
s   $BB ABN)T)rr   rs   rt   ru   r   authenticatedr@   r$   r"   r!   r   r     s    a@ @r"   r   )_kernel_id_regex)kernel_name_regexz/api/kernels/%s/channelsz/kernelspecs/%s/(?P<path>.*))4ru   
__future__r   r   rY   r   osr   warningstypingr   r   jupyter_client.sessionr   tornador   tornado.concurrentr   tornado.escaper	   r
   r   tornado.httpclientr   tornado.ioloopr   r   tornado.websocketr   r   traitlets.config.configurabler   base.handlersr   r   utilsr   gateway_clientr   warnDeprecationWarningintgetenvr   r   r8   r   services.kernels.handlersr   services.kernelspecs.handlersr   default_handlersr$   r"   r!   <module>r      s     #    	    *  % 8 8 * 3 A = 6 ! ) n !$IBII.Mt$T U r / r j@0 @F@Z @* 9 = !#335MN$'88:PQ r"   