You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			63 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
			
		
		
	
	
			63 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
"""Base class to manage comms"""
 | 
						|
 | 
						|
# Copyright (c) IPython Development Team.
 | 
						|
# Distributed under the terms of the Modified BSD License.
 | 
						|
 | 
						|
import logging
 | 
						|
 | 
						|
import comm.base_comm
 | 
						|
import traitlets
 | 
						|
import traitlets.config
 | 
						|
 | 
						|
from .comm import Comm
 | 
						|
 | 
						|
logger = logging.getLogger("ipykernel.comm")
 | 
						|
 | 
						|
 | 
						|
class CommManager(comm.base_comm.CommManager, traitlets.config.LoggingConfigurable):  # type:ignore[misc]
 | 
						|
    """A comm manager."""
 | 
						|
 | 
						|
    kernel = traitlets.Instance("ipykernel.kernelbase.Kernel")
 | 
						|
    comms = traitlets.Dict()
 | 
						|
    targets = traitlets.Dict()
 | 
						|
 | 
						|
    def __init__(self, **kwargs):
 | 
						|
        """Initialize the manager."""
 | 
						|
        # CommManager doesn't take arguments, so we explicitly forward arguments
 | 
						|
        comm.base_comm.CommManager.__init__(self)
 | 
						|
        traitlets.config.LoggingConfigurable.__init__(self, **kwargs)
 | 
						|
 | 
						|
    def comm_open(self, stream, ident, msg):
 | 
						|
        """Handler for comm_open messages"""
 | 
						|
        # This is for backward compatibility, the comm_open creates a a new ipykernel.comm.Comm
 | 
						|
        # but we should let the base class create the comm with comm.create_comm in a major release
 | 
						|
        content = msg["content"]
 | 
						|
        comm_id = content["comm_id"]
 | 
						|
        target_name = content["target_name"]
 | 
						|
        f = self.targets.get(target_name, None)
 | 
						|
        comm = Comm(
 | 
						|
            comm_id=comm_id,
 | 
						|
            primary=False,
 | 
						|
            target_name=target_name,
 | 
						|
            show_warning=False,
 | 
						|
        )
 | 
						|
        self.register_comm(comm)
 | 
						|
        if f is None:
 | 
						|
            logger.error("No such comm target registered: %s", target_name)
 | 
						|
        else:
 | 
						|
            try:
 | 
						|
                f(comm, msg)
 | 
						|
                return
 | 
						|
            except Exception:
 | 
						|
                logger.error("Exception opening comm with target: %s", target_name, exc_info=True)  # noqa: G201
 | 
						|
 | 
						|
        # Failure.
 | 
						|
        try:
 | 
						|
            comm.close()
 | 
						|
        except Exception:
 | 
						|
            logger.error(  # noqa: G201
 | 
						|
                """Could not close comm during `comm_open` failure
 | 
						|
                clean-up.  The comm may not have been opened yet.""",
 | 
						|
                exc_info=True,
 | 
						|
            )
 |