o
    ^i                     @  s   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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rHddlZG dd deejZdddZd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
    )annotationsN)datetime)TYPE_CHECKINGAnyOptionalcast)ensure_async)web	websocket)
authorizedws_authenticated)JupyterHandler   )
APIHandlereventsc                      sJ   e Zd ZdZeZdd Ze fddZdddZ	dd Z
dd Z  ZS )SubscribeWebsocketz+Websocket handler for subscribing to eventsc                   s6   | j }t| j| |ddI dH }|stddS )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    r   b/home/ubuntu/hpml_nyu/venv/lib/python3.10/site-packages/jupyter_server/services/events/handlers.pypre_get#   s   

zSubscribeWebsocket.pre_getc                   s@   t |  I dH  t j|i |}|dur|I dH  dS dS )zGet an event socket.N)r   r   superget)r   argskwargsres	__class__r   r   r   0   s   zSubscribeWebsocket.getlogger!jupyter_events.logger.EventLogger	schema_idstrdatadict[str, Any]returnNonec                   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_listener8   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_listenerr0   r   r   r   r   open?   s   zSubscribeWebsocket.openc                 C  r1   )zHandle a socket close.r2   N)r4   remove_listenerr0   r6   r   r   r   on_closeE   s   zSubscribeWebsocket.on_close)r#   r$   r%   r&   r'   r(   r)   r*   )__name__
__module____qualname____doc__AUTH_RESOURCEauth_resourcer   r   r   r0   r7   r9   __classcell__r   r   r!   r   r      s    
r   r'   r(   registry-jupyter_events.schema_registry.SchemaRegistryr)   r*   c                 C  s   h d}|D ]}|| vrd| d}t |qtt| d}||}ttt| d}|j|krDd|d|jd| d	}t |d
S )zoValidates for required fields in the JSON request body and verifies that
    a registered schema/version exists>   r'   versionr%   z	Missing `z` in the JSON request body.r%   rC   zUnregistered version: u   ≠z for ``N)	Exceptionr   r&   r   rC   )r'   rA   required_keyskeymessager%   schemarC   r   r   r   validate_modelJ   s   

rJ   Optional[datetime]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%zZN  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   strptimerE   r	   r   )r'   rL   er   r   r   get_timestamp_   s   	rP   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 | jjtt|	dtd|	dt
|d | d |   W dS  tyN } z	tdt||d}~ww )	zEmit an event.NrM   zNo JSON data providedr%   r(   r'   )r%   r'   timestamp_override   )get_json_bodyr	   r   rJ   r4   schemasemitr   r&   r   rP   
set_statusfinishrE   )r   payloadrO   r   r   r   postv   s"   
zEventHandler.postN)
r:   r;   r<   r=   r>   r?   r	   authenticatedr   rZ   r   r   r   r   rQ   q   s    rQ   z/api/eventsz/api/events/subscribe)r'   r(   rA   rB   r)   r*   )r'   r(   r)   rK   )r=   
__future__r   r-   r   typingr   r   r   r   jupyter_core.utilsr   tornador	   r
   jupyter_server.auth.decoratorr   r   jupyter_server.base.handlersr   base.handlersr   r>   jupyter_events.loggerjupyter_eventsWebSocketHandlerr   rJ   rP   rQ   default_handlersr   r   r   r   <module>   s.    

/
