Ë
    :vžjã  ã                  óþ   — d Z ddlmZ ddl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 dZerddlZ G d„ deej0                  «      Z	 	 	 	 	 	 dd„Zdd„Z G d„ de«      ZdefdefgZy)zOA Websocket Handler for emitting Jupyter server events.

.. versionadded:: 2.0
é    )ÚannotationsN)Údatetime)ÚTYPE_CHECKINGÚAnyÚcast)Úensure_async)ÚwebÚ	websocket)Ú
authorizedÚws_authenticated)ÚJupyterHandleré   )Ú
APIHandlerÚeventsc                  ó\   ‡ — e Zd ZdZeZd„ Zeˆ fd„«       Z	 	 	 	 	 	 	 	 dd„Z	dd„Z
d„ Zˆ xZS )	ÚSubscribeWebsocketz+Websocket handler for subscribing to eventsc              ƒ  ó´   K  — | j                   }t        | j                  j                  | |dd«      «      ƒ d{  –—† }|st	        j
                  d«      ‚y7 Œ­w)z{Handles authorization when
        attempting to subscribe to events emitted by
        Jupyter Server's eventbus.
        Úexecuter   Ni“  )Úcurrent_userr   Ú
authorizerÚis_authorizedr	   Ú	HTTPError)ÚselfÚuserr   s      úx/workspace/moltex-experiments/.pixi/envs/default/lib/python3.12/site-packages/jupyter_server/services/events/handlers.pyÚpre_getzSubscribeWebsocket.pre_get#   sX   è ø€ ð
 × Ñ ˆä'Ø�O‰O×)Ñ)¨$°°iÀÓJó
÷ 
ˆ
ñ Ü—-‘- Ó$Ð$ð ð
ús   ‚7A¹AºAc              �  ó�   •K  — t        | j                  «       «      ƒ d{  –—†  t        ‰| �  |i |¤Ž}|�|ƒ d{  –—†  yy7 Œ!7 Œ­w)zGet an event socket.N)r   r   ÚsuperÚget)r   ÚargsÚkwargsÚresÚ	__class__s       €r   r   zSubscribeWebsocket.get0   sL   øè ø€ ô ˜4Ÿ<™<›>Ó*×*Ð*Ü‰g‰k˜4Ð* 6Ñ*ˆØˆ?Ø�I‰Ið ð 	+øð ús   ƒA A¡A»A¼AÁAc              ƒ  ó&  K  — t        dd|i|¤Ž}	 | j                  t        j                  |«      «       y# t        j
                  $ rE | j                  j                  d|«       | j                  j                  | j                  ¬«       Y yw xY w­w)u÷  Write an event message to the subscribed WebSocket.

        If the underlying socket has already been closed â€” typically
        because the peer disappeared without a clean close handshake, so
        ``on_close`` never fired â€” Tornado raises
        :class:`~tornado.websocket.WebSocketClosedError` from
        ``write_message``; in that case ``event_listener`` will remove itself from the logger
        so subsequent events don't fan out one failing task per stale
        subscriber.
        Ú	schema_idz9Event WebSocket for %s is closed; removing stale listener©ÚlistenerN© )ÚdictÚwrite_messageÚjsonÚdumpsr
   ÚWebSocketClosedErrorÚlogÚdebugÚevent_loggerÚremove_listenerÚevent_listener)r   Úloggerr%   ÚdataÚcapsules        r   r2   z!SubscribeWebsocket.event_listener8   s‚   è ø€ ô Ñ3 Ð3¨dÑ3ˆð	LØ×ÑœtŸz™z¨'Ó2Õ3øÜ×-Ñ-ò 	LØ�H‰H�N‰NØKØôð ×Ñ×-Ñ-°t×7JÑ7JÐ-ÖKð	Lüs&   ‚B‘$6 µB¶ABÂBÂBÂBc                óP   — | j                   j                  | j                  ¬«       y)zrRoutes events that are emitted by Jupyter Server's
        EventBus to a WebSocket client in the browser.
        r&   N)r0   Úadd_listenerr2   ©r   s    r   ÚopenzSubscribeWebsocket.openO   s!   € ð 	×Ñ×&Ñ&°×0CÑ0CÐ&ÕDó    c                óP   — | j                   j                  | j                  ¬«       y)zHandle a socket close.r&   N)r0   r1   r2   r8   s    r   Úon_closezSubscribeWebsocket.on_closeU   s   € à×Ñ×)Ñ)°4×3FÑ3FÐ)ÕGr:   )r3   z!jupyter_events.logger.EventLoggerr%   Ústrr4   údict[str, Any]ÚreturnÚNone)r?   r@   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__ÚAUTH_RESOURCEÚauth_resourcer   r   r   r2   r9   r<   Ú__classcell__)r#   s   @r   r   r      s\   ø„ ñ 6à!€Mò%ð óó ððLØ7ðLØDGðLØO]ðLà	óLó.EöHr:   r   c                óV  — h d£}|D ]  }|| vsŒd|› d�}t        |«      ‚ t        d| j                  d«      «      }|j                  |«      }t        t        d| j                  d«      «      «      }t        |j                  «      |k7  r!d|›d|j                  ›d	|› d
�}t        |«      ‚y)zoValidates for required fields in the JSON request body and verifies that
    a registered schema/version exists>   r4   Úversionr%   z	Missing `z` in the JSON request body.r=   r%   rI   zUnregistered version: u   â‰ z for `Ú`N)Ú	Exceptionr   r   r=   rI   )r4   ÚregistryÚrequired_keysÚkeyÚmessager%   ÚschemarI   s           r   Úvalidate_modelrQ   Z   s¸   € ò
 5€MÛˆØ�dŠ?Ø! # Ð&AÐBˆGÜ˜GÓ$Ð$ð ô �U˜DŸH™H [Ó1Ó2€Ið �\‰\˜)Ó$€FÜ”$�u˜dŸh™h yÓ1Ó2Ó3€GÜ
ˆ6�>‰>Ó˜gÒ%Ø*¨7¨+°S¸¿¹Ð8JÈ&ÐQZÐP[Ð[\Ð]ˆÜ˜Ó Ð ð &r:   c                óœ   — 	 d| v rt        j                  | d   d«      }|S d}	 |S # t        $ r}t        j                  dd«      |‚d}~ww xY w)z+Parses timestamp from the JSON request bodyÚ	timestampz%Y-%m-%dT%H:%M:%S%zZNé�  z¬Failed to parse timestamp from JSON request body,
            an ISO format datetime string with UTC offset is expected,
            for example, 2022-05-26T13:50:00+05:00Z)r   ÚstrptimerK   r	   r   )r4   rS   Úes      r   Úget_timestamprW   o   sn   € ðØ˜$ÑÜ ×)Ñ)¨$¨{Ñ*;Ð=SÓTˆIð Ðð ‰Ið Ðøô ò Ü�m‰mØð7ó
ð
 ð	ûðús   ‚& ¡& ¦	A¯AÁAc                  óB   — e Zd ZdZeZej                  ed„ «       «       Z	y)ÚEventHandlerzREST api handler for eventsc           	   ƒ  óô  K  — | j                  «       }|€t        j                  dd«      ‚	 t        || j                  j
                  «       | j                  j                  t        d|j                  d«      «      t        d|j                  d«      «      t        |«      ¬«       | j                  d	«       | j                  «        y# t        $ r%}t        j                  dt        |«      «      |‚d}~ww xY w­w)
zEmit an event.NrT   zNo JSON data providedr=   r%   r>   r4   )r%   r4   Útimestamp_overrideéÌ   )Úget_json_bodyr	   r   rQ   r0   ÚschemasÚemitr   r   rW   Ú
set_statusÚfinishrK   r=   )r   ÚpayloadrV   s      r   ÚpostzEventHandler.post†   sÏ   è ø€ ð ×$Ñ$Ó&ˆØˆ?Ü—-‘- Ð%<Ó=Ð=ð	4Ü˜7 D×$5Ñ$5×$=Ñ$=Ô>Ø×Ñ×"Ñ"Ü˜u g§k¡k°+Ó&>Ó?ÜÐ*¨G¯K©K¸Ó,?Ó@Ü#0°Ó#9ð #ô ð
 �O‰O˜CÔ Ø�K‰K�MøÜò 	4ô —-‘- ¤S¨£VÓ,°!Ð3ûð	4üs)   ‚)C8¬BC ÃC8Ã	C5Ã C0Ã0C5Ã5C8N)
rA   rB   rC   rD   rE   rF   r	   Úauthenticatedr   rc   r(   r:   r   rY   rY   �   s*   „ Ù%à!€Mà×ÑØñ4ó ó ñ4r:   rY   z/api/eventsz/api/events/subscribe)r4   r>   rL   z-jupyter_events.schema_registry.SchemaRegistryr?   r@   )r4   r>   r?   zdatetime | None)rD   Ú
__future__r   r+   r   Útypingr   r   r   Újupyter_core.utilsr   Útornador	   r
   Újupyter_server.auth.decoratorr   r   Újupyter_server.base.handlersr   Úbase.handlersr   rE   Újupyter_events.loggerÚjupyter_eventsÚWebSocketHandlerr   rQ   rW   rY   Údefault_handlersr(   r:   r   Ú<module>rp      s™   ðñõ
 #ã Ý ß +Ñ +å +ß "ç FÝ 7å 'à€ñ Û ô<HØØ×Ñô<Hð~!Ø
ð!Ø$Qð!à	ó!ó*ô$4�:ô 4ð: �\Ð"ØÐ1Ð2ðÑ r:   