o
    BZh'                     @  s   d Z ddlmZ ddlZddlZddlZddlZddlm	Z	 ddl
Z
ejr+ddlmZ edZejeejf Zejejeejf  Zejeje  Zejegdf Zejdegdf ZG dd dZG d	d
 d
Zd
dgZdS )z@Default classes for Comm and CommManager, for usage in IPython.
    )annotationsN)import_item)	ZMQStreamZCommBaseCommc                      s   e Zd ZdZ										d5d6 fddZ			d7d8ddZd9dd Z	d7d:d!d"Z				#d;d<d%d&Z	d7d:d'd(Z	d=d+d,Z
d=d-d.Zd>d1d2Zd>d3d4Z  ZS )?r   zClass for communicating between a Frontend and a Kernel

    Must be subclassed with a publish_msg method implementation which
    sends comm messages through the iopub channel.
    commNTtarget_namestrdata	MaybeDictmetadatabuffersBuffersTypecomm_id
str | Noneprimarybooltarget_moduletopicbytes | None
_open_data_close_datakwargst.AnyreturnNonec                   s   t  jdi | |r|nt j| _|| _|| _|| _|r |nd| j 	d| _
|	r-|	ni | _|
r4|
ni | _d | _d | _d| _| jrM| j|||d d S d| _d S )Nzcomm-%sasciiTr	   r   r   F )super__init__uuiduuid4hexr   r   r   r   encoder   r   r   _msg_callback_close_callback_closedopen)selfr   r	   r   r   r   r   r   r   r   r   r   	__class__r   E/var/www/html/lang_env/lib/python3.10/site-packages/comm/base_comm.pyr   $   s   
zBaseComm.__init__msg_typekeysc                 K  s   d}t |)Nz*publish_msg Comm method is not implemented)NotImplementedError)r(   r,   r	   r   r   r-   msgr   r   r+   publish_msgH   s   zBaseComm.publish_msgc                 C  s<   t t | jdd W d   dS 1 sw   Y  dS )ztrigger close on gcT)deletingN)
contextlibsuppress	Exceptioncloser(   r   r   r+   __del__S   s   "zBaseComm.__del__c                 C  sv   |du r| j }t }|du rd}t|||  z| jd|||| j| jd d| _W dS  t	y:   |
|   w )z+Open the frontend-side version of this commNz.Comms cannot be opened without a comm_manager.	comm_open)r	   r   r   r   r   F)r   r   get_comm_managerRuntimeErrorregister_commr0   r   r   r&   r4   unregister_comm)r(   r	   r   r   Zcomm_managerr/   r   r   r+   r'   \   s*   

zBaseComm.openFr1   c                 C  sJ   | j rdS d| _ |du r| j}| jd|||d |s#t |  dS dS )z,Close the frontend-side version of this commNT
comm_closer   )r&   r   r0   r   r9   r<   )r(   r	   r   r   r1   r   r   r+   r5   w   s   zBaseComm.closec                 C  s   | j d|||d dS )z8Send a message to the frontend-side version of this commcomm_msgr   N)r0   )r(   r	   r   r   r   r   r+   send   s   
zBaseComm.sendcallbackCommCallback | Nonec                 C  
   || _ dS )zRegister a callback for comm_close

        Will be called with the `data` of the close message.

        Call `on_close(None)` to disable an existing callback.
        N)r%   r(   r@   r   r   r+   on_close      
zBaseComm.on_closec                 C  rB   )zRegister a callback for comm_msg

        Will be called with the `data` of any comm_msg messages.

        Call `on_msg(None)` to disable an existing callback.
        N)r$   rC   r   r   r+   on_msg   rE   zBaseComm.on_msgr/   MessageTypec                 C  s(   t d| j| | jr| | dS dS )zHandle a comm_close messagezhandle_close[%s](%s)N)loggerdebugr   r%   )r(   r/   r   r   r+   handle_close   s   zBaseComm.handle_closec                 C  s^   t d| j| | jr+ddlm} | }|r|jd | | |r-|jd dS dS dS )zHandle a comm_msg messagezhandle_msg[%s](%s)r   )get_ipythonZpre_executeZpost_executeN)rH   rI   r   r$   ZIPythonrK   eventstrigger)r(   r/   rK   shellr   r   r+   
handle_msg   s   
zBaseComm.handle_msg)
r   NNNNTNNNN)r   r   r	   r
   r   r
   r   r   r   r   r   r   r   r   r   r   r   r
   r   r
   r   r   r   r   )NNN)r,   r   r	   r
   r   r
   r   r   r-   r   r   r   r   r   )r	   r
   r   r
   r   r   r   r   )NNNF)
r	   r
   r   r
   r   r   r1   r   r   r   )r@   rA   r   r   )r/   rG   r   r   )__name__
__module____qualname____doc__r   r0   r7   r'   r5   r?   rD   rF   rJ   rO   __classcell__r   r   r)   r+   r      s>    '



	
c                   @  sj   e Zd ZdZd%ddZd&d
dZd'ddZd(ddZd)ddZd*ddZ	d+ddZ
d+d d!Zd+d"d#Zd$S ),CommManagerzDDefault CommManager singleton implementation for Comms in the Kernelr   r   c                 C  s   i | _ i | _d S )N)commstargetsr6   r   r   r+   r      s   
zCommManager.__init__r   r   fCommTargetCallback | strc                 C  s(   t |tr	t|}tt|| j|< dS )a  Register a callable f for a given target name

        f will be called with two arguments when a comm_open message is received with `target`:

        - the Comm instance
        - the `comm_open` message itself.

        f can be a Python callable or an import string for one.
        N)
isinstancer   r   tcastCommTargetCallbackrX   r(   r   rY   r   r   r+   register_target   s   

zCommManager.register_targetr^   c                 C  s   | j |S )z5Unregister a callable registered with register_target)rX   popr_   r   r   r+   unregister_target   s   zCommManager.unregister_targetr   r   c                 C  s   |j }|| j|< |S )zRegister a new comm)r   rW   )r(   r   r   r   r   r+   r;      s   
zCommManager.register_commc                 C  s   | j |j}dS )z,Unregister a comm, and close its counterpartN)rW   ra   r   )r(   r   r   r   r+   r<      s   zCommManager.unregister_commr   BaseComm | Nonec              	   C  sP   z| j | W S  ty'   td| ttjr$tdt| j 	  Y dS w )zGet a comm with a particular id

        Returns the comm if found, otherwise None.

        This will not raise an error,
        it will log messages if the comm cannot be found.
        zNo such comm: %szCurrent comms: %sN)
rW   KeyErrorrH   warningisEnabledForloggingDEBUGrI   listr-   )r(   r   r   r   r+   get_comm   s   zCommManager.get_commstreamr   identr/   rG   c           
      C  s   ddl m} |d }|d }|d }| j|d}||d|d}	| |	 |du r0td	| nz||	| W dS  tyI   tjd
|dd Y nw z|	  W dS  tyb   tjddd Y dS w )zHandler for comm_open messagesr   )create_commcontentr   r   NF)r   r   r   z"No such comm target registered: %sz&Exception opening comm with target: %sTexc_infozqCould not close comm during `comm_open` failure
                clean-up.  The comm may not have been opened yet.)	r   rm   rX   getr;   rH   errorr4   r5   )
r(   rk   rl   r/   rm   rn   r   r   rY   r   r   r   r+   r8      s6   

zCommManager.comm_openc                 C  s\   |d }|d }|  |}|du rdS z|| W dS  ty-   tjd|dd Y dS w )zHandler for comm_msg messagesrn   r   NzException in comm_msg for %sTro   )rj   rO   r4   rH   rr   r(   rk   rl   r/   rn   r   r   r   r   r+   r>     s   
zCommManager.comm_msgc                 C  sp   |d }|d }|  |}|du rdS d| j| _| j|= z|| W dS  ty7   tjd|dd Y dS w )zHandler for comm_close messagesrn   r   NTzException in comm_close for %sro   )rj   rW   r&   rJ   r4   rH   rr   rs   r   r   r+   r=   ,  s   
zCommManager.comm_closeNrP   )r   r   rY   rZ   r   r   )r   r   rY   r^   r   r^   )r   r   r   r   )r   r   r   r   )r   r   r   rc   )rk   r   rl   r   r/   rG   r   r   )rQ   rR   rS   rT   r   r`   rb   r;   r<   rj   r8   r>   r=   r   r   r   r+   rV      s    







!rV   )rT   
__future__r   r2   rg   typingr\   r    Ztraitlets.utils.importstringr   r   TYPE_CHECKINGZzmq.eventloop.zmqstreamr   	getLoggerrH   Dictr   AnyrG   Optionalr
   Listbytesr   CallableZCommCallbackr^   r   rV   __all__r   r   r   r+   <module>   s(    
 (y