Ë
    :vžj¶  ã                  óÒ   — 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    €ús/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_server/gateway/connections.pyÚ<lambda>z4GatewayWebSocketConnection.connect.<locals>.<lambda>=   s   ø€ °t×7JÑ7JÔ7Ló    © )Ú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  øè ø€ ð ˆŒÜÜ×"Ñ"Ó$×+Ñ+Ò1¨rÜ×"Ñ"Ó$×5Ñ5Ü�t—~‘~Ó&Øó	
ˆð �?Š?Ø˜¤Z°·±Ó%@Ð$AÐBÑBˆFØ�‰�‰˜ v hÐ/Ô0Ø!#ˆØ>”×'Ñ'Ó)×>Ñ>ÑHÀÑHˆä˜fÑ/¨Ñ/ˆÜ˜mÔ->×-PÑ-PÐQXÓ-YÓZˆŒØ�‰×(Ñ(¨×)>Ñ)>Ô?ä�~‰~ÓˆØ�‰˜Ÿ™Ó(LÕMùs   ƒ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‡   € ð ×!Ò! c§m¡m£oÐ&=à—j‘j“lˆDŒGØˆDŒJØ�H‰H�N‰NÐ6°t·w±w°iÐ@ÕAà�H‰H×Ñð#Ø#'§>¡>Ð"2Ð2\Ô]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   € à ˆÔØ�7‰7Ðà�G‰G�M‰M�OØ�^Š^ D§N¡N×$7Ñ$7Ô$9à�N‰N×!Ñ!Ô#Ø�H‰H�N‰NÐJÈ4×K\Ñ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{®Gáz„?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à  è ø€ à�g‰gÐ!ØˆGØ×$Ò$ðØ$(§G¡G×$8Ñ$8Ó$:×:�Gð
 �?Ø×,Ò,ØŸ™×(Ñ(Ð+GÈÏÉÐGWÐ)XÔYØÜ˜g¤uÔ-Ø%Ÿn™n¨VÓ4�GØ×,Ñ,Øõð ð' �g‰gÑ!ð, × Ó  T§Z¡Z´-×2HÑ2HÓ2J×2\Ñ2\Ó%\Ü—^‘^ B¨Ó,¨tÑ3ˆFäÜ!×*Ñ*Ó,×CÑCÀqÈ$Ï*É*Á}ÑUÜ!×*Ñ*Ó,×GÑGóð ñ	ð ð �JŠJ˜!‰O�JØ�H‰H�M‰MØ]ØØ—
‘
Ü×&Ñ&Ó(×:Ñ:Ø—‘ôô —-‘- Ó/×/Ð/Ü—>‘>Ó#ˆDØ×Ñ §¡Õ-ð' &]Ð ð% ;úÜ ò Ø—H‘H—N‘NØDÀQÀCÐH÷ò ûðúðD 0úsR   ‚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ò 	Ø�x‰x×$Ñ$¤W§]¡]Ô3Ü8×MÑMÜ¤ \Ó 2Ó3ó�ð —‘—‘ØUÐVaÐUbÐcöñ	 4ð	ús   ‚ žBB$Â#B$c                óz  ‡ ‡— ‰ j                   €œ‰ j                  ��‰ j                  j                  «       rA‰ j                  j                  «       �'‰ j                  j                  d‰ j                  «       yt        j                  «       }|j                  ‰ j                  ˆˆ fd„«       y‰ j                  ‰«       y)úSend message to gateway server.Nz2Ignoring message on failed connection to kernel %sc                ó&   •— ‰j                  ‰«      S r   )Úhandle_incoming_message)r    r[   r!   s    €€r"   r#   zDGatewayWebSocketConnection.handle_incoming_message.<locals>.<lambda>›   s   ø€ ¸4×;WÑ;WÐX_Ô;`r$   )r&   r1   rE   r<   r,   r@   r*   r   r4   r5   Ú_write_message)r!   r[   r8   s   `` r"   rm   z2GatewayWebSocketConnection.handle_incoming_message’   s„   ù€ à�7‰7ˆ?˜tŸ~™~Ð9Ø�~‰~×"Ñ"Ô$¨¯©×)AÑ)AÓ)CÐ)OØ—‘× Ñ ØHÈ$Ï.É.ôð Ü—>‘>Ó#ˆDØ�O‰O˜DŸN™NÔ,`Õ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Ø�H‰H�N‰NÐEÀaÀSÐ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Ò#Ø�N‰N˜=×/Ñ/°¸	Ñ0BÐCTÑ0UÓVÕWØ˜WÒ$Ø�N‰NØ×#Ñ#Ø˜IÑ& wÑ/Ø˜IÑ& xÑ0Ø˜IÑ& {Ñ3óõð �N‰N˜7Ô#à—7‘7˜7Ó#Ð#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ÑCÐPTÔ	U€Bá˜v°$Ô7€Iá˜“;€Lá�‹F€Eñ
 ! °¸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Ý !Ý )ôc$Ð!>õ c$r$   