diff --git a/IPython/html/static/services/kernels/comm.js b/IPython/html/static/services/kernels/comm.js index 91f3dc8..f25517b 100644 --- a/IPython/html/static/services/kernels/comm.js +++ b/IPython/html/static/services/kernels/comm.js @@ -65,20 +65,40 @@ define([ CommManager.prototype.comm_open = function (msg) { var content = msg.content; - var f = this.targets[content.target_name]; - if (f === undefined) { - console.log("No such target registered: ", content.target_name); - console.log("Available targets are: ", this.targets); - return; - } - var comm = new Comm(content.target_name, content.comm_id); - this.register_comm(comm); - try { - f(comm, msg); - } catch (e) { - console.log("Exception opening new comm:", e, e.stack, msg); - comm.close(); - this.unregister_comm(comm); + var that = this; + + var instantiate_comm = function(target) { + var comm = new Comm(content.target_name, content.comm_id); + that.register_comm(comm); + try { + target(comm, msg); + } catch (e) { + console.log("Exception opening new comm:", e, e.stack, msg); + comm.close(); + that.unregister_comm(comm); + } + }; + + if (content.target_module) { + // Load requirejs module for comm target + require([content.target_module], function(mod) { + var target = mod[content.target_name]; + if (target !== undefined) { + instantiate_comm(target) + } else { + console.log("Comm target " + content.target_name + + " not found in module " + content.target_module); + } + }, function(err) { console.log(err); }); + } else { + // No requirejs module specified: look for target in registry + var f = this.targets[content.target_name]; + if (f === undefined) { + console.log("No such target registered: ", content.target_name); + console.log("Available targets are: ", this.targets); + return; + } + instantiate_comm(f) } }; diff --git a/IPython/kernel/comm/comm.py b/IPython/kernel/comm/comm.py index 4f5660c..3a65cb0 100644 --- a/IPython/kernel/comm/comm.py +++ b/IPython/kernel/comm/comm.py @@ -31,6 +31,8 @@ class Comm(LoggingConfigurable): return self.kernel.session target_name = Unicode('comm') + target_module = Unicode(None, allow_none=True, help="""requirejs module from + which to load comm target.""") topic = Bytes() def _topic_default(self): @@ -91,7 +93,9 @@ class Comm(LoggingConfigurable): try: self._publish_msg('comm_open', data=data, metadata=metadata, buffers=buffers, - target_name=self.target_name) + target_name=self.target_name, + target_module=self.target_module, + ) self._closed = False except: comm_manager.unregister_comm(self)