##// END OF EJS Templates
Make it possible for msg.buffers in javascript to be either ArrayBuffers or views
Make it possible for msg.buffers in javascript to be either ArrayBuffers or views

File last commit:

r20621:f936f880
r20824:0a285e33
Show More
comm.js
219 lines | 7.2 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 });
Jason Grout
Handle kernel messages synchronously...
r20621 return this.comms[content.comm_id];
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 });
Jason Grout
Handle kernel messages synchronously...
r20621 return this.comms[content.comm_id];
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
};
});