
    Ke                        d Z ddlZddlmZ ddlmZmZmZm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
Z G d deej                  Zdeeef         ddfdZdeeef         dee         fdZ G d de          ZdefdefgZdS )zOA Websocket Handler for emitting Jupyter server events.

.. versionadded:: 2.0
    N)datetime)AnyDictOptionalcast)web	websocket)
authorized)JupyterHandler   )
APIHandlereventsc                   d     e Zd ZdZeZd Z fdZdej	        j
        dededdfd	Zd
 Zd Z xZS )SubscribeWebsocketz+Websocket handler for subscribing to eventsc                     | j         }|.| j                            d           t          j        d          | j                            | |dd          st          j        d          dS )zHandles authentication/authorization when
        attempting to subscribe to events emitted by
        Jupyter Server's eventbus.
        Nz*Couldn't authenticate WebSocket connectioni  executer   )current_userlogwarningr   	HTTPError
authorizeris_authorized)selfusers     Glib/python3.11/site-packages/jupyter_server/services/events/handlers.pypre_getzSubscribeWebsocket.pre_get   sr      <HIJJJ-$$$ ,,T4HMM 	%-$$$	% 	%    c                 ~   K   |                                    t                      j        |i |}|
| d{V  dS dS )zGet an event socket.N)r   superget)r   argskwargsres	__class__s       r   r    zSubscribeWebsocket.get+   sO      eggk4*6**?IIIIIIIII ?r   logger	schema_iddatareturnNc                 t   K   t          dd|i|}|                     t          j        |                     dS )zWrite an event message.r&   N )dictwrite_messagejsondumps)r   r%   r&   r'   capsules        r   event_listenerz!SubscribeWebsocket.event_listener2   sD       333d334:g../////r   c                 F    | j                             | j                   dS )zrRoutes events that are emitted by Jupyter Server's
        EventBus to a WebSocket client in the browser.
        listenerN)event_loggeradd_listenerr0   r   s    r   openzSubscribeWebsocket.open9   s'     	&&0C&DDDDDr   c                 F    | j                             | j                   dS )zHandle a socket close.r2   N)r4   remove_listenerr0   r6   s    r   on_closezSubscribeWebsocket.on_close?   s%    ))43F)GGGGGr   )__name__
__module____qualname____doc__AUTH_RESOURCEauth_resourcer   r    jupyter_eventsr%   EventLoggerstrr+   r0   r7   r:   __classcell__)r$   s   @r   r   r      s         65!M% % %    0$+70DG0OS0	0 0 0 0E E EH H H H H H Hr   r   r'   r(   c                 R    h d}|D ]}|| vrt          j        dd| d           dS )z6Validates for required fields in the JSON request body>   r'   versionr&     z	Missing `z` in the JSON request body.N)r   r   )r'   required_keyskeys      r   validate_modelrJ   D   sV    444M S Sd??-%Q%Q%Q%QRRR S Sr   c                     	 d| v rt          j        | d         d          }nd}n(# t          $ r}t          j        dd          |d}~ww xY w|S )z+Parses timestamp from the JSON request body	timestampz%Y-%m-%dT%H:%M:%S%zZNrG   zFailed 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   strptime	Exceptionr   r   )r'   rL   es      r   get_timestamprP   L   sz    $ )${*;=STTIII   m7
 

 	 s   "% 
A
AA
c                   F    e Zd ZdZeZej        ed                         Z	dS )EventHandlerzREST api handler for eventsc           	      <  K   |                                  }|t          j        dd          	 t          |           | j                            t          t          |                    d                    t          d|                    d                    t          |                     | 
                    d           |                                  dS # t          j        $ r  t          $ r(}t          j        d	t          |                    |d}~ww xY w)
zEmit an event.NrG   zNo JSON data providedr&   zDict[str, Any]r'   )r&   r'   timestamp_override   i  )get_json_bodyr   r   rJ   r4   emitr   rC   r    rP   
set_statusfinishrN   )r   payloadrO   s      r   postzEventHandler.postc   s      $$&&?-%<===	47###""sGKK$<$<==*GKK,?,?@@#0#9#9 #   
 OOC   KKMMMMM} 	 	 	 	4 	4 	4-SVV,,!3	4s   B)C D3#DDN)
r;   r<   r=   r>   r?   r@   r   authenticatedr
   r[   r*   r   r   rR   rR   ^   sF        %%!M4 4 Z 4 4 4r   rR   z/api/eventsz/api/events/subscribe)r>   r-   r   typingr   r   r   r   jupyter_events.loggerrA   tornador   r	   jupyter_server.auth.decoratorr
   jupyter_server.base.handlersr   base.handlersr   r?   WebSocketHandlerr   rC   rJ   rP   rR   default_handlersr*   r   r   <module>re      s           , , , , , , , , , , , ,     " " " " " " " " 4 4 4 4 4 4 7 7 7 7 7 7 ' ' ' ' ' '-H -H -H -H -H-H -H -H`Sc3h SD S S S SS#X 8H+=    $4 4 4 4 4: 4 4 4: \"12   r   