o
    i,                     @   s   d 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 ddlmZ d	d
lmZ dZG dd deejZdeeef ddfddZdeeef dee fddZG d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)EventLogger)web	websocket)
authorized)JupyterHandler   )
APIHandlereventsc                       sV   e Zd ZdZeZdd Z fddZdede	de
d	d
fddZdd Zdd Z  ZS )SubscribeWebsocketz+Websocket handler for subscribing to eventsc                 C   sD   | j }|du r| jd td| j| |dds t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user r   b/var/www/edux/Edux_v2/venv/lib/python3.10/site-packages/jupyter_server/services/events/handlers.pypre_get   s   

zSubscribeWebsocket.pre_getc                    s*   |    t j|i |}|I dH  dS )zGet an event socket.N)r   superget)r   argskwargsres	__class__r   r   r   +   s   zSubscribeWebsocket.getlogger	schema_iddatareturnNc                    s(   t dd|i|}| t| dS )zWrite an event message.r#   Nr   )dictwrite_messagejsondumps)r   r"   r#   r$   capsuler   r   r   event_listener1   s   z!SubscribeWebsocket.event_listenerc                 C      | j j| jd dS )zrRoutes events that are emitted by Jupyter Server's
        EventBus to a WebSocket client in the browser.
        listenerN)event_loggeradd_listenerr+   r   r   r   r   open6   s   zSubscribeWebsocket.openc                 C   r,   )zHandle a socket close.r-   N)r/   remove_listenerr+   r1   r   r   r   on_close<   s   zSubscribeWebsocket.on_close)__name__
__module____qualname____doc__AUTH_RESOURCEauth_resourcer   r   r   strr&   r+   r2   r4   __classcell__r   r   r    r   r      s    r   r$   r%   c                 C   s2   h d}|D ]}|| vrt dd| dq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keyr   r   r   validate_modelA   s   rA   c              
   C   sP   zd| v rt | d d}W |S d}W |S  ty' } ztdd|d}~ww )z+Parses timestamp from the JSON request body	timestampz%Y-%m-%dT%H:%M:%S%zZNr>   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$   rB   er   r   r   get_timestampI   s   	rF   c                   @   s&   e Zd ZdZeZejedd Z	dS )EventHandlerzREST api handler for eventsc              
      s   |   }|du rtddz!t| | jj|d|dt|d | d | 	  W dS  t
yE } z	tdt||d}~ww )	zEmit an event.Nr>   zNo JSON data providedr#   r$   )r#   r$   timestamp_override   i  )get_json_bodyr   r   rA   r/   emitr   rF   
set_statusfinishrD   r;   )r   payloadrE   r   r   r   post`   s"   
zEventHandler.postN)
r5   r6   r7   r8   r9   r:   r   authenticatedr	   rO   r   r   r   r   rG   [   s    rG   z/api/eventsz/api/events/subscribe)r8   r(   r   typingr   r   r   jupyter_eventsr   tornador   r   jupyter_server.authr	   jupyter_server.base.handlersr
   base.handlersr   r9   WebSocketHandlerr   r;   rA   rF   rG   default_handlersr   r   r   r   <module>   s(    
-