
    Xh                       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rddlZ G d deej2                        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Optionalcast)ensure_async)web	websocket)
authorizedws_authenticated)JupyterHandler   )
APIHandlereventsc                  Z     e Zd ZdZeZd Ze fd       Z	 	 	 	 	 	 	 	 ddZ	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      [/var/www/html/myenv/lib/python3.12/site-packages/jupyter_server/services/events/handlers.pypre_getzSubscribeWebsocket.pre_get#   sX     
   'OO))$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<<>***gk4*6*?II  	+ s   AAAAAAc                n   K   t        dd|i|}| j                  t        j                  |             yw)zWrite an event message.	schema_idN )dictwrite_messagejsondumps)r   loggerr&   datacapsules        r   event_listenerz!SubscribeWebsocket.event_listener8   s1      33d34::g./s   35c                P    | j                   j                  | j                         y)zrRoutes events that are emitted by Jupyter Server's
        EventBus to a WebSocket client in the browser.
        listenerN)event_loggeradd_listenerr/   r   s    r   openzSubscribeWebsocket.open?   s!     	&&0C0C&D    c                P    | j                   j                  | j                         y)zHandle a socket close.r1   N)r3   remove_listenerr/   r5   s    r   on_closezSubscribeWebsocket.on_closeE   s    ))43F3F)Gr7   )r,   z!jupyter_events.logger.EventLoggerr&   strr-   dict[str, Any]returnNone)__name__
__module____qualname____doc__AUTH_RESOURCEauth_resourcer   r   r    r/   r6   r:   __classcell__)r$   s   @r   r   r      sW     6!M%  070DG0O]0	0EHr7   r   c                T   h d}|D ]  }|| vsd| d}t        |       t        t        | j                  d            }|j                  |      }t        t        t        | j                  d                  }|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>   r-   versionr&   z	Missing `z` in the JSON request body.r&   rG   zUnregistered version: u   ≠z for ``N)	Exceptionr   r;   r    rG   )r-   registryrequired_keyskeymessager&   schemarG   s           r   validate_modelrO   J   s    
 5M %d?!#&ABGG$$% S$((;/0I \\)$F$sDHHY/01G~~ *7+S8J&QZP[[\]   !r7   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  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   strptimerI   r
   r   )r-   rQ   es      r   get_timestamprU   _   sn    $ ))${*;=STI  I   mm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        t        |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.NrR   zNo JSON data providedr&   r<   r-   )r&   r-   timestamp_override   )get_json_bodyr
   r   rO   r3   schemasemitr   r;   r    rU   
set_statusfinishrI   )r   payloadrT   s      r   postzEventHandler.postv   s      $$&?--%<==	47D$5$5$=$=>""sGKK$<=*GKK,?@#0#9 # 
 OOC KKM 	4 --SV,!3	4s)   )C<BC 
C<	C9 C44C99C<N)
r?   r@   rA   rB   rC   rD   r
   authenticatedr   ra   r'   r7   r   rW   rW   q   s*    %!M4  4r7   rW   z/api/eventsz/api/events/subscribe)r-   r<   rJ   z-jupyter_events.schema_registry.SchemaRegistryr=   r>   )r-   r<   r=   zOptional[datetime])rB   
__future__r   r*   r   typingr   r   r   r   jupyter_core.utilsr	   tornador
   r   jupyter_server.auth.decoratorr   r   jupyter_server.base.handlersr   base.handlersr   rC   jupyter_events.loggerjupyter_eventsWebSocketHandlerr   rO   rU   rW   default_handlersr'   r7   r   <module>rn      s   
 #   5 5 + " F 7 '  ,H,H^!
!$Q!	!*$4: 4: \"12 r7   