##// END OF EJS Templates
Update Widget Events.ipynb
Update Widget Events.ipynb

File last commit:

r19389:0d9eb499
r20620:313bf26c
Show More
comm.js
217 lines | 7.1 KiB | application/javascript | JavascriptLexer
Jonathan Frederic
Almost done!...
r17198 // Copyright (c) IPython Development Team.
// Distributed under the terms of the Modified BSD License.
MinRK
add javascript-side widgets
r13189
Jonathan Frederic
Almost done!...
r17198 define([
'base/js/namespace',
Jonathan Frederic
MWE,...
r17200 'jquery',
Jonathan Frederic
Almost done!...
r17198 'base/js/utils',
Jonathan Frederic
use es6
r18907 ], function(IPython, $, utils) {
MinRK
add javascript-side widgets
r13189 "use strict";
//-----------------------------------------------------------------------
MinRK
rename widget to comm
r13195 // CommManager class
MinRK
add javascript-side widgets
r13189 //-----------------------------------------------------------------------
MinRK
rename widget to comm
r13195 var CommManager = function (kernel) {
this.comms = {};
MinRK
s/target/target_name
r13204 this.targets = {};
MinRK
add javascript-side widgets
r13189 if (kernel !== undefined) {
this.init_kernel(kernel);
}
};
MinRK
rename widget to comm
r13195 CommManager.prototype.init_kernel = function (kernel) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* connect the kernel, and register message handlers
*/
MinRK
add javascript-side widgets
r13189 this.kernel = kernel;
MinRK
rename widget to comm
r13195 var msg_types = ['comm_open', 'comm_msg', 'comm_close'];
MinRK
add javascript-side widgets
r13189 for (var i = 0; i < msg_types.length; i++) {
var msg_type = msg_types[i];
MinRK
fix js/Python WidgetManager symmetry...
r13191 kernel.register_iopub_handler(msg_type, $.proxy(this[msg_type], this));
MinRK
add javascript-side widgets
r13189 }
};
MinRK
don't expose comm_id arg via new_comm
r13233 CommManager.prototype.new_comm = function (target_name, data, callbacks, metadata) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* Create a new Comm, register it, and open its Kernel-side counterpart
* Mimics the auto-registration in `Comm.__init__` in the IPython Comm
*/
MinRK
don't expose comm_id arg via new_comm
r13233 var comm = new Comm(target_name);
MinRK
Add CommManager.new_comm...
r13229 this.register_comm(comm);
comm.open(data, callbacks, metadata);
return comm;
};
MinRK
s/target/target_name
r13204 CommManager.prototype.register_target = function (target_name, f) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* Register a target function for a given target name
*/
MinRK
s/target/target_name
r13204 this.targets[target_name] = f;
MinRK
add javascript-side widgets
r13189 };
MinRK
add unregister_target to CommManagers
r13226 CommManager.prototype.unregister_target = function (target_name, f) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* Unregister a target function for a given target name
*/
MinRK
add unregister_target to CommManagers
r13226 delete this.targets[target_name];
};
MinRK
log exceptions in Comm handlers
r13227
MinRK
rename widget to comm
r13195 CommManager.prototype.register_comm = function (comm) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* Register a comm in the mapping
*/
Jonathan Frederic
Address @takluyver 's comments
r18914 this.comms[comm.comm_id] = Promise.resolve(comm);
MinRK
rename widget to comm
r13195 comm.kernel = this.kernel;
return comm.comm_id;
MinRK
make js / Python widgets symmetrical...
r13192 };
Sylvain Corlay
bad call and missing call to unregister_comm
r17460 CommManager.prototype.unregister_comm = function (comm) {
Jonathan Frederic
Ran function comment conversion tool
r19176 /**
* Remove a comm from the mapping
*/
Sylvain Corlay
bad call and missing call to unregister_comm
r17460 delete this.comms[comm.comm_id];
MinRK
make js / Python widgets symmetrical...
r13192 };
MinRK
rename widget to comm
r13195 // comm message handlers
MinRK
make js / Python widgets symmetrical...
r13192
MinRK
rename widget to comm
r13195 CommManager.prototype.comm_open = function (msg) {
MinRK
add javascript-side widgets
r13189 var content = msg.content;
Thomas Kluyver
Support specifying requirejs modules for comm targets
r18467 var that = this;
Jonathan Frederic
Promise logic is infectious like a disease
r18913 var comm_id = content.comm_id;
this.comms[comm_id] = utils.load_class(content.target_name, content.target_module,
Jonathan Frederic
Add a WrappedError class
r18895 this.targets).then(function(target) {
Jason Grout
Clean up promises code some more.
r18984 var comm = new Comm(content.target_name, comm_id);
comm.kernel = that.kernel;
try {
var response = target(comm, msg);
} catch (e) {
comm.close();
that.unregister_comm(comm);
var wrapped_error = new utils.WrappedError("Exception opening new comm", e);
console.error(wrapped_error);
return Promise.reject(wrapped_error);
Jonathan Frederic
Address @takluyver 's comments
r18914 }
Jason Grout
Clean up promises code some more.
r18984 // Regardless of the target return value, we need to
// then return the comm
return Promise.resolve(response).then(function() {return comm;});
}, utils.reject('Could not open comm', true));
Jonathan Frederic
Promise logic is infectious like a disease
r18913 return this.comms[comm_id];
MinRK
add javascript-side widgets
r13189 };
Jonathan Frederic
Promise logic is infectious like a disease
r18913 CommManager.prototype.comm_close = function(msg) {
MinRK
add javascript-side widgets
r13189 var content = msg.content;
Jonathan Frederic
Address review comments
r18917 if (this.comms[content.comm_id] === undefined) {
Jonathan Frederic
Promise logic is infectious like a disease
r18913 console.error('Comm promise not found for comm id ' + content.comm_id);
MinRK
add javascript-side widgets
r13189 return;
}
Jason Grout
Fix a bug in using promises with comms: this -> that
r19389 var that = this;
Jonathan Frederic
Address review comments
r18917 this.comms[content.comm_id] = this.comms[content.comm_id].then(function(comm) {
Jason Grout
Fix a bug in using promises with comms: this -> that
r19389 that.unregister_comm(comm);
Jonathan Frederic
Promise logic is infectious like a disease
r18913 try {
comm.handle_close(msg);
} catch (e) {
console.log("Exception closing comm: ", e, e.stack, msg);
}
Jason Grout
Clean up promises code some more.
r18984 // don't return a comm, so that further .then() functions
// get an undefined comm input
Jonathan Frederic
Promise logic is infectious like a disease
r18913 });
MinRK
add javascript-side widgets
r13189 };
Jonathan Frederic
Promise logic is infectious like a disease
r18913 CommManager.prototype.comm_msg = function(msg) {
MinRK
add javascript-side widgets
r13189 var content = msg.content;
Jonathan Frederic
Address review comments
r18917 if (this.comms[content.comm_id] === undefined) {
Jonathan Frederic
Promise logic is infectious like a disease
r18913 console.error('Comm promise not found for comm id ' + content.comm_id);
MinRK
add javascript-side widgets
r13189 return;
}
Jonathan Frederic
Promise logic is infectious like a disease
r18913
Jonathan Frederic
Address review comments
r18917 this.comms[content.comm_id] = this.comms[content.comm_id].then(function(comm) {
Jonathan Frederic
Promise logic is infectious like a disease
r18913 try {
comm.handle_msg(msg);
} catch (e) {
console.log("Exception handling comm msg: ", e, e.stack, msg);
}
Jason Grout
Clean up promises code some more.
r18984 return comm;
Jonathan Frederic
Promise logic is infectious like a disease
r18913 });
MinRK
add javascript-side widgets
r13189 };
//-----------------------------------------------------------------------
MinRK
rename widget to comm
r13195 // Comm base class
MinRK
add javascript-side widgets
r13189 //-----------------------------------------------------------------------
MinRK
Add CommManager.new_comm...
r13229 var Comm = function (target_name, comm_id) {
MinRK
s/target/target_name
r13204 this.target_name = target_name;
Jonathan Frederic
Almost done!...
r17198 this.comm_id = comm_id || utils.uuid();
MinRK
open is not an event...
r13205 this._msg_callback = this._close_callback = null;
MinRK
add javascript-side widgets
r13189 };
MinRK
make js / Python widgets symmetrical...
r13192 // methods for sending messages
MinRK
add message metadata to comm and kernel.send_shell_message
r13217 Comm.prototype.open = function (data, callbacks, metadata) {
MinRK
make js / Python widgets symmetrical...
r13192 var content = {
MinRK
rename widget to comm
r13195 comm_id : this.comm_id,
MinRK
s/target/target_name
r13204 target_name : this.target_name,
MinRK
make js / Python widgets symmetrical...
r13192 data : data || {},
};
MinRK
add message metadata to comm and kernel.send_shell_message
r13217 return this.kernel.send_shell_message("comm_open", content, callbacks, metadata);
MinRK
add javascript-side widgets
r13189 };
MinRK
support binary message from javascript
r18332 Comm.prototype.send = function (data, callbacks, metadata, buffers) {
MinRK
add javascript-side widgets
r13189 var content = {
MinRK
rename widget to comm
r13195 comm_id : this.comm_id,
MinRK
make js / Python widgets symmetrical...
r13192 data : data || {},
MinRK
add javascript-side widgets
r13189 };
MinRK
support binary message from javascript
r18332 return this.kernel.send_shell_message("comm_msg", content, callbacks, metadata, buffers);
MinRK
add javascript-side widgets
r13189 };
MinRK
add message metadata to comm and kernel.send_shell_message
r13217 Comm.prototype.close = function (data, callbacks, metadata) {
MinRK
add javascript-side widgets
r13189 var content = {
MinRK
rename widget to comm
r13195 comm_id : this.comm_id,
MinRK
make js / Python widgets symmetrical...
r13192 data : data || {},
MinRK
add javascript-side widgets
r13189 };
MinRK
add message metadata to comm and kernel.send_shell_message
r13217 return this.kernel.send_shell_message("comm_close", content, callbacks, metadata);
MinRK
add javascript-side widgets
r13189 };
MinRK
COMM: mirror Python callback API in Javascript
r13198 // methods for registering callbacks for incoming messages
Comm.prototype._register_callback = function (key, callback) {
this['_' + key + '_callback'] = callback;
};
Comm.prototype.on_msg = function (callback) {
this._register_callback('msg', callback);
};
Comm.prototype.on_close = function (callback) {
this._register_callback('close', callback);
};
MinRK
hook up output for comm messages
r13202
MinRK
make js / Python widgets symmetrical...
r13192 // methods for handling incoming messages
Jonathan Frederic
Address review comments
r18917 Comm.prototype._callback = function (key, msg) {
MinRK
COMM: mirror Python callback API in Javascript
r13198 var callback = this['_' + key + '_callback'];
MinRK
catch errors in comm callbacks
r13230 if (callback) {
try {
callback(msg);
} catch (e) {
Jason Grout
Intermediate changes to javascript side of backbone widgets
r14486 console.log("Exception in Comm callback", e, e.stack, msg);
MinRK
catch errors in comm callbacks
r13230 }
}
MinRK
COMM: mirror Python callback API in Javascript
r13198 };
MinRK
pass whole message to Comm handlers
r13197 Comm.prototype.handle_msg = function (msg) {
Jonathan Frederic
Address review comments
r18917 this._callback('msg', msg);
MinRK
make js / Python widgets symmetrical...
r13192 };
MinRK
pass whole message to Comm handlers
r13197 Comm.prototype.handle_close = function (msg) {
Jonathan Frederic
Address review comments
r18917 this._callback('close', msg);
MinRK
make js / Python widgets symmetrical...
r13192 };
Jonathan Frederic
Almost done!...
r17198 // For backwards compatability.
MinRK
rename widget to comm
r13195 IPython.CommManager = CommManager;
IPython.Comm = Comm;
MinRK
add javascript-side widgets
r13189
Jonathan Frederic
Almost done!...
r17198 return {
'CommManager': CommManager,
'Comm': Comm
};
});