##// END OF EJS Templates
Make the widget property_lock store the JSON state, not the original object...
Make the widget property_lock store the JSON state, not the original object Comparison between arbitrary python objects can get crazy, whereas we really only care about if the JSON state we are syncing is different. So with this change, we store and check against the JSON state.

File last commit:

r17308:60600c30
r17674:60553571
Show More
kernel.js
616 lines | 20.8 KiB | application/javascript | JavascriptLexer
MinRK
allow async output on the most recent request...
r16359 // Copyright (c) IPython Development Team.
// Distributed under the terms of the Modified BSD License.
Brian E. Granger
Splitting notebook.js into muliple files for development ease.
r4349
Jonathan Frederic
Almost done!...
r17198 define([
'base/js/namespace',
Jonathan Frederic
MWE,...
r17200 'jquery',
Jonathan Frederic
Almost done!...
r17198 'base/js/utils',
'services/kernels/js/comm',
'widgets/js/init',
Jonathan Frederic
Fix imports of "modules",...
r17202 ], function(IPython, $, utils, comm, widgetmanager) {
MinRK
Improvements to kernel.js...
r13187 "use strict";
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 // Initialization and connection.
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* A Kernel Class to communicate with the Python kernel
* @Class Kernel
*/
MinRK
pass ws_url to kernel constructor...
r17308 var Kernel = function (kernel_service_url, ws_url, notebook, name) {
Jonathan Frederic
MWE,...
r17200 this.events = notebook.events;
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 this.kernel_id = null;
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 this.shell_channel = null;
this.iopub_channel = null;
MinRK
add stdin to notebook...
r10366 this.stdin_channel = null;
MinRK
fix url encoding in services...
r15242 this.kernel_service_url = kernel_service_url;
Thomas Kluyver
Update JS for kernels and sessions APIs
r17223 this.name = name;
MinRK
pass ws_url to kernel constructor...
r17308 this.ws_url = ws_url || IPython.utils.get_body_data("wsUrl");
MinRK
restore websocket_url configurable...
r17303 if (!this.ws_url) {
// trailing 's' in https will become wss for secure web sockets
this.ws_url = location.protocol.replace('http', 'ws') + "//" + location.host;
}
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 this.running = false;
MinRK
fixup bad rebase
r13102 this.username = "username";
Zachary Sailer
session manager restructuring...
r13035 this.session_id = utils.uuid();
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 this._msg_callbacks = {};
Jason Grout
Change $.post to this.post in the kernel js file...
r16277 this.post = $.post;
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168
Brian E. Granger
Better WebSocket detection added.
r4612 if (typeof(WebSocket) !== 'undefined') {
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 this.WebSocket = WebSocket;
Brian E. Granger
Better WebSocket detection added.
r4612 } else if (typeof(MozWebSocket) !== 'undefined') {
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 this.WebSocket = MozWebSocket;
Brian E. Granger
Adding code to handle MozWebSocket for FF 6.
r4611 } else {
MinRK
alert client on failed and lost web socket connections...
r5253 alert('Your browser does not have WebSocket support, please try Chrome, Safari or Firefox ≥ 6. Firefox 4 and 5 are also supported by you have to enable WebSockets in about:config.');
MinRK
Improvements to kernel.js...
r13187 }
MinRK
bind kernel events in Kernel.bind_events...
r11611 this.bind_events();
MinRK
Improvements to kernel.js...
r13187 this.init_iopub_handlers();
Jonathan Frederic
Almost done!...
r17198 this.comm_manager = new comm.CommManager(this);
Jonathan Frederic
Fix imports of "modules",...
r17202 this.widget_manager = new widgetmanager.WidgetManager(this.comm_manager, notebook);
MinRK
allow async output on the most recent request...
r16359
this.last_msg_id = null;
this.last_msg_callbacks = {};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
MinRK
add message metadata to comm and kernel.send_shell_message
r13217 Kernel.prototype._get_msg = function (msg_type, content, metadata) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var msg = {
header : {
msg_id : utils.uuid(),
MinRK
fix undefined 'session_id' member in kernel.js
r4694 username : this.username,
Zachary Sailer
session manager restructuring...
r13035 session : this.session_id,
MinRK
add version key to js message headers
r16666 msg_type : msg_type,
version : "5.0"
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 },
MinRK
add message metadata to comm and kernel.send_shell_message
r13217 metadata : metadata || {},
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 content : content,
parent_header : {}
};
return msg;
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
MinRK
bind kernel events in Kernel.bind_events...
r11611
MinRK
Improvements to kernel.js...
r13187 Kernel.prototype.bind_events = function () {
MinRK
bind kernel events in Kernel.bind_events...
r11611 var that = this;
Jonathan Frederic
Almost done!...
r17198 this.events.on('send_input_reply.Kernel', function(evt, data) {
MinRK
bind kernel events in Kernel.bind_events...
r11611 that.send_input_reply(data);
});
MinRK
Improvements to kernel.js...
r13187 };
// Initialize the iopub handlers
Kernel.prototype.init_iopub_handlers = function () {
MinRK
pyerr -> error
r16569 var output_msg_types = ['stream', 'display_data', 'execute_result', 'error'];
MinRK
Improvements to kernel.js...
r13187 this._iopub_handlers = {};
this.register_iopub_handler('status', $.proxy(this._handle_status_message, this));
this.register_iopub_handler('clear_output', $.proxy(this._handle_clear_output, this));
MinRK
pyerr -> error
r16569 for (var i=0; i < output_msg_types.length; i++) {
this.register_iopub_handler(output_msg_types[i], $.proxy(this._handle_output_message, this));
MinRK
Improvements to kernel.js...
r13187 }
};
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* Start the Python kernel
* @method start
*/
MinRK
review pass on multidir js
r13103 Kernel.prototype.start = function (params) {
params = params || {};
if (!this.running) {
var qs = $.param(params);
Jason Grout
Change $.post to this.post in the kernel js file...
r16277 this.post(utils.url_join_encode(this.kernel_service_url) + '?' + qs,
MinRK
review pass on multidir js
r13103 $.proxy(this._kernel_started, this),
'json'
);
MinRK
Improvements to kernel.js...
r13187 }
MinRK
review pass on multidir js
r13103 };
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* Restart the python kernel.
*
* Emit a 'status_restarting.Kernel' event with
* the current object as parameter
*
* @method restart
*/
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 Kernel.prototype.restart = function () {
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('status_restarting.Kernel', {kernel: this});
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 if (this.running) {
this.stop_channels();
Jason Grout
Change $.post to this.post in the kernel js file...
r16277 this.post(utils.url_join_encode(this.kernel_url, "restart"),
MinRK
review pass on multidir js
r13103 $.proxy(this._kernel_started, this),
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 'json'
);
MinRK
Improvements to kernel.js...
r13187 }
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 Kernel.prototype._kernel_started = function (json) {
Zachary Sailer
change standard money keys
r13015 console.log("Kernel started: ", json.id);
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 this.running = true;
Zachary Sailer
change standard money keys
r13015 this.kernel_id = json.id;
MinRK
fix url encoding in services...
r15242 this.kernel_url = utils.url_path_join(this.kernel_service_url, this.kernel_id);
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 this.start_channels();
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 Kernel.prototype._websocket_closed = function(ws_url, early) {
this.stop_channels();
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('websocket_closed.Kernel',
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 {ws_url: ws_url, kernel: this, early: early}
);
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* Start the `shell`and `iopub` channels.
* Will stop and restart them if they already exist.
*
* @method start_channels
*/
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 Kernel.prototype.start_channels = function () {
MinRK
alert client on failed and lost web socket connections...
r5253 var that = this;
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 this.stop_channels();
MinRK
restore websocket_url configurable...
r17303 var ws_host_url = this.ws_url + this.kernel_url;
MinRK
remove websocket url...
r15400 console.log("Starting WebSockets:", ws_host_url);
MinRK
fix url encoding in services...
r15242 this.shell_channel = new this.WebSocket(
MinRK
restore websocket_url configurable...
r17303 this.ws_url + utils.url_join_encode(this.kernel_url, "shell")
MinRK
fix url encoding in services...
r15242 );
this.stdin_channel = new this.WebSocket(
MinRK
restore websocket_url configurable...
r17303 this.ws_url + utils.url_join_encode(this.kernel_url, "stdin")
MinRK
fix url encoding in services...
r15242 );
this.iopub_channel = new this.WebSocket(
MinRK
restore websocket_url configurable...
r17303 this.ws_url + utils.url_join_encode(this.kernel_url, "iopub")
MinRK
fix url encoding in services...
r15242 );
MinRK
trigger `Kernel.status_started` after websockets open...
r12254
MinRK
alert client on failed and lost web socket connections...
r5253 var already_called_onclose = false; // only alert once
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var ws_closed_early = function(evt){
MinRK
alert client on failed and lost web socket connections...
r5253 if (already_called_onclose){
return;
}
already_called_onclose = true;
if ( ! evt.wasClean ){
MinRK
fix url encoding in services...
r15242 that._websocket_closed(ws_host_url, true);
MinRK
alert client on failed and lost web socket connections...
r5253 }
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var ws_closed_late = function(evt){
MinRK
alert client on failed and lost web socket connections...
r5253 if (already_called_onclose){
return;
}
already_called_onclose = true;
if ( ! evt.wasClean ){
MinRK
fix url encoding in services...
r15242 that._websocket_closed(ws_host_url, false);
MinRK
alert client on failed and lost web socket connections...
r5253 }
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
MinRK
add stdin to notebook...
r10366 var channels = [this.shell_channel, this.iopub_channel, this.stdin_channel];
for (var i=0; i < channels.length; i++) {
MinRK
trigger `Kernel.status_started` after websockets open...
r12254 channels[i].onopen = $.proxy(this._ws_opened, this);
MinRK
add stdin to notebook...
r10366 channels[i].onclose = ws_closed_early;
}
MinRK
alert client on failed and lost web socket connections...
r5253 // switch from early-close to late-close message after 1s
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 setTimeout(function() {
MinRK
add stdin to notebook...
r10366 for (var i=0; i < channels.length; i++) {
if (channels[i] !== null) {
channels[i].onclose = ws_closed_late;
}
Brian E. Granger
Refactoring WebSocket connection failure logic....
r9222 }
MinRK
alert client on failed and lost web socket connections...
r5253 }, 1000);
MinRK
add stdin to notebook...
r10366 this.shell_channel.onmessage = $.proxy(this._handle_shell_reply, this);
MinRK
Improvements to kernel.js...
r13187 this.iopub_channel.onmessage = $.proxy(this._handle_iopub_message, this);
MinRK
add stdin to notebook...
r10366 this.stdin_channel.onmessage = $.proxy(this._handle_input_request, this);
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
MinRK
trigger `Kernel.status_started` after websockets open...
r12254 * Handle a websocket entering the open state
* sends session and cookie authentication info as first message.
* Once all sockets are open, signal the Kernel.status_started event.
* @method _ws_opened
*/
Kernel.prototype._ws_opened = function (evt) {
// send the session id so the Session object Python-side
// has the same identity
evt.target.send(this.session_id + ':' + document.cookie);
var channels = [this.shell_channel, this.iopub_channel, this.stdin_channel];
for (var i=0; i < channels.length; i++) {
// if any channel is not ready, don't trigger event.
if ( !channels[i].readyState ) return;
}
// all events ready, trigger started event.
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('status_started.Kernel', {kernel: this});
MinRK
trigger `Kernel.status_started` after websockets open...
r12254 };
/**
* Stop the websocket channels.
Matthias BUSSONNIER
start docummenting kernel
r8768 * @method stop_channels
*/
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 Kernel.prototype.stop_channels = function () {
MinRK
add stdin to notebook...
r10366 var channels = [this.shell_channel, this.iopub_channel, this.stdin_channel];
for (var i=0; i < channels.length; i++) {
if ( channels[i] !== null ) {
MinRK
Improvements to kernel.js...
r13187 channels[i].onclose = null;
MinRK
add stdin to notebook...
r10366 channels[i].close();
}
MinRK
Improvements to kernel.js...
r13187 }
MinRK
add stdin to notebook...
r10366 this.shell_channel = this.iopub_channel = this.stdin_channel = null;
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 };
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 // Main public methods.
MinRK
Improvements to kernel.js...
r13187
// send a message on the Kernel's shell channel
MinRK
add message metadata to comm and kernel.send_shell_message
r13217 Kernel.prototype.send_shell_message = function (msg_type, content, callbacks, metadata) {
var msg = this._get_msg(msg_type, content, metadata);
MinRK
Improvements to kernel.js...
r13187 this.shell_channel.send(JSON.stringify(msg));
this.set_callbacks_for_msg(msg.header.msg_id, callbacks);
return msg.header.msg_id;
MinRK
refactor js callbacks...
r13207 };
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
Matthias BUSSONNIER
add js kernel_info request
r14681 * Get kernel info
*
* @param callback {function}
MinRK
s/object_info_request/inspect_request
r16587 * @method kernel_info
Matthias BUSSONNIER
add js kernel_info request
r14681 *
* When calling this method, pass a callback function that expects one argument.
* The callback will be passed the complete `kernel_info_reply` message documented
* [here](http://ipython.org/ipython-doc/dev/development/messaging.html#kernel-info)
*/
Kernel.prototype.kernel_info = function (callback) {
var callbacks;
if (callback) {
callbacks = { shell : { reply : callback } };
}
return this.send_shell_message("kernel_info_request", {}, callbacks);
};
/**
MinRK
only pass shell.reply callback to oinfo / complete...
r13208 * Get info on an object
Matthias BUSSONNIER
start docummenting kernel
r8768 *
MinRK
update completion_ and objection_info_request...
r16580 * @param code {string}
* @param cursor_pos {integer}
MinRK
only pass shell.reply callback to oinfo / complete...
r13208 * @param callback {function}
MinRK
s/object_info_request/inspect_request
r16587 * @method inspect
Matthias BUSSONNIER
start docummenting kernel
r8768 *
MinRK
update callback structure in js commands
r13212 * When calling this method, pass a callback function that expects one argument.
MinRK
s/object_info_request/inspect_request
r16587 * The callback will be passed the complete `inspect_reply` message documented
MinRK
update callback structure in js commands
r13212 * [here](http://ipython.org/ipython-doc/dev/development/messaging.html#object-information)
Matthias BUSSONNIER
start docummenting kernel
r8768 */
MinRK
s/object_info_request/inspect_request
r16587 Kernel.prototype.inspect = function (code, cursor_pos, callback) {
MinRK
only pass shell.reply callback to oinfo / complete...
r13208 var callbacks;
if (callback) {
callbacks = { shell : { reply : callback } };
}
MinRK
update completion_ and objection_info_request...
r16580 var content = {
code : code,
cursor_pos : cursor_pos,
detail_level : 0,
};
MinRK
s/object_info_request/inspect_request
r16587 return this.send_shell_message("inspect_request", content, callbacks);
MinRK
Improvements to kernel.js...
r13187 };
Matthias BUSSONNIER
Add Tootip to notebook....
r5397
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
* Execute given code into kernel, and pass result to callback.
*
* @async
* @method execute
* @param {string} code
MinRK
update callback structure in js commands
r13212 * @param [callbacks] {Object} With the following keys (all optional)
* @param callbacks.shell.reply {function}
* @param callbacks.shell.payload.[payload_name] {function}
* @param callbacks.iopub.output {function}
* @param callbacks.iopub.clear_output {function}
* @param callbacks.input {function}
Matthias BUSSONNIER
start docummenting kernel
r8768 * @param {object} [options]
* @param [options.silent=false] {Boolean}
* @param [options.user_expressions=empty_dict] {Dict}
* @param [options.allow_stdin=false] {Boolean} true|false
*
* @example
*
* The options object should contain the options for the execute call. Its default
* values are:
*
* options = {
* silent : true,
* user_expressions : {},
* allow_stdin : false
* }
*
* When calling this method pass a callbacks structure of the form:
*
* callbacks = {
MinRK
update callback structure in js commands
r13212 * shell : {
* reply : execute_reply_callback,
* payload : {
* set_next_input : set_next_input_callback,
* }
* },
* iopub : {
* output : output_callback,
* clear_output : clear_output_callback,
* },
* input : raw_input_callback
Matthias BUSSONNIER
start docummenting kernel
r8768 * }
*
MinRK
update callback structure in js commands
r13212 * Each callback will be passed the entire message as a single arugment.
* Payload handlers will be passed the corresponding payload and the execute_reply message.
Matthias BUSSONNIER
start docummenting kernel
r8768 */
Brian Granger
Adding options to Kernel.execute with a default of silent=true.
r7176 Kernel.prototype.execute = function (code, callbacks, options) {
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 var content = {
code : code,
Brian Granger
Adding options to Kernel.execute with a default of silent=true.
r7176 silent : true,
MinRK
add missing store_history key to Notebook execute_requests
r11857 store_history : false,
MinRK
fix missing trailing comma in kernel.js
r4975 user_expressions : {},
MinRK
use inline raw_input instead of a dialog
r10368 allow_stdin : false
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 };
Matthias BUSSONNIER
fix callbacks as optional in js kernel.execute...
r10594 callbacks = callbacks || {};
MinRK
refactor js callbacks...
r13207 if (callbacks.input !== undefined) {
MinRK
use inline raw_input instead of a dialog
r10368 content.allow_stdin = true;
}
MinRK
Improvements to kernel.js...
r13187 $.extend(true, content, options);
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('execution_request.Kernel', {kernel: this, content:content});
MinRK
Improvements to kernel.js...
r13187 return this.send_shell_message("execute_request", content, callbacks);
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352
Matthias BUSSONNIER
start docummenting kernel
r8768 /**
MinRK
update callback structure in js commands
r13212 * When calling this method, pass a function to be called with the `complete_reply` message
MinRK
only pass shell.reply callback to oinfo / complete...
r13208 * as its only argument when it arrives.
Matthias BUSSONNIER
start docummenting kernel
r8768 *
MinRK
only pass shell.reply callback to oinfo / complete...
r13208 * `complete_reply` is documented
Matthias BUSSONNIER
start docummenting kernel
r8768 * [here](http://ipython.org/ipython-doc/dev/development/messaging.html#complete)
*
* @method complete
MinRK
update completion_ and objection_info_request...
r16580 * @param code {string}
Matthias BUSSONNIER
start docummenting kernel
r8768 * @param cursor_pos {integer}
MinRK
only pass shell.reply callback to oinfo / complete...
r13208 * @param callback {function}
Matthias BUSSONNIER
start docummenting kernel
r8768 *
*/
MinRK
update completion_ and objection_info_request...
r16580 Kernel.prototype.complete = function (code, cursor_pos, callback) {
MinRK
only pass shell.reply callback to oinfo / complete...
r13208 var callbacks;
if (callback) {
callbacks = { shell : { reply : callback } };
}
Brian Granger
Added complete method of JS kernel object.
r4388 var content = {
MinRK
update completion_ and objection_info_request...
r16580 code : code,
cursor_pos : cursor_pos,
Brian Granger
Added complete method of JS kernel object.
r4388 };
MinRK
Improvements to kernel.js...
r13187 return this.send_shell_message("complete_request", content, callbacks);
Stefan van der Walt
Clean up javascript based on js2-mode feedback.
r5479 };
Brian Granger
Added complete method of JS kernel object.
r4388
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 Kernel.prototype.interrupt = function () {
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 if (this.running) {
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('status_interrupting.Kernel', {kernel: this});
Jason Grout
Change $.post to this.post in the kernel js file...
r16277 this.post(utils.url_join_encode(this.kernel_url, "interrupt"));
MinRK
Improvements to kernel.js...
r13187 }
Brian E. Granger
Splitting notebook.js into muliple files for development ease.
r4349 };
Brian E. Granger
Using beforeunload to save at exit and kill the kernel.
r4496 Kernel.prototype.kill = function () {
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 if (this.running) {
this.running = false;
var settings = {
cache : false,
MinRK
log all failed ajax API requests
r16445 type : "DELETE",
error : utils.log_ajax_error,
Brian E. Granger
Major refactor of kernel connection management in the notebook....
r4545 };
MinRK
fix url encoding in services...
r15242 $.ajax(utils.url_join_encode(this.kernel_url), settings);
MinRK
Improvements to kernel.js...
r13187 }
Brian E. Granger
Using beforeunload to save at exit and kill the kernel.
r4496 };
MinRK
use inline raw_input instead of a dialog
r10368 Kernel.prototype.send_input_reply = function (input) {
MinRK
add stdin to notebook...
r10366 var content = {
value : input,
};
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('input_reply.Kernel', {kernel: this, content:content});
MinRK
add stdin to notebook...
r10366 var msg = this._get_msg("input_reply", content);
this.stdin_channel.send(JSON.stringify(msg));
return msg.header.msg_id;
};
// Reply handlers
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168
MinRK
Improvements to kernel.js...
r13187 Kernel.prototype.register_iopub_handler = function (msg_type, callback) {
this._iopub_handlers[msg_type] = callback;
};
Kernel.prototype.get_iopub_handler = function (msg_type) {
// get iopub handler for a specific message type
return this._iopub_handlers[msg_type];
};
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 Kernel.prototype.get_callbacks_for_msg = function (msg_id) {
MinRK
Improvements to kernel.js...
r13187 // get callbacks for a specific message
MinRK
allow async output on the most recent request...
r16359 if (msg_id == this.last_msg_id) {
return this.last_msg_callbacks;
} else {
return this._msg_callbacks[msg_id];
}
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 };
MinRK
add Kernel.clear_callbacks_for_msg
r12555 Kernel.prototype.clear_callbacks_for_msg = function (msg_id) {
if (this._msg_callbacks[msg_id] !== undefined ) {
delete this._msg_callbacks[msg_id];
}
};
MinRK
refactor js callbacks...
r13207
MinRK
allow async output on the most recent request...
r16359 Kernel.prototype._finish_shell = function (msg_id) {
var callbacks = this._msg_callbacks[msg_id];
if (callbacks !== undefined) {
callbacks.shell_done = true;
if (callbacks.iopub_done) {
this.clear_callbacks_for_msg(msg_id);
}
}
};
Kernel.prototype._finish_iopub = function (msg_id) {
var callbacks = this._msg_callbacks[msg_id];
if (callbacks !== undefined) {
callbacks.iopub_done = true;
MinRK
remove an inappropriate `!`...
r16599 if (callbacks.shell_done) {
MinRK
allow async output on the most recent request...
r16359 this.clear_callbacks_for_msg(msg_id);
}
}
};
MinRK
refactor js callbacks...
r13207 /* Set callbacks for a particular message.
* Callbacks should be a struct of the following form:
* shell : {
*
* }
*/
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 Kernel.prototype.set_callbacks_for_msg = function (msg_id, callbacks) {
MinRK
allow async output on the most recent request...
r16359 this.last_msg_id = msg_id;
MinRK
Improvements to kernel.js...
r13187 if (callbacks) {
MinRK
refactor js callbacks...
r13207 // shallow-copy mapping, because we will modify it at the top level
MinRK
allow async output on the most recent request...
r16359 var cbcopy = this._msg_callbacks[msg_id] = this.last_msg_callbacks = {};
MinRK
refactor js callbacks...
r13207 cbcopy.shell = callbacks.shell;
cbcopy.iopub = callbacks.iopub;
cbcopy.input = callbacks.input;
MinRK
allow async output on the most recent request...
r16359 cbcopy.shell_done = (!callbacks.shell);
cbcopy.iopub_done = (!callbacks.iopub);
} else {
this.last_msg_callbacks = {};
MinRK
Improvements to kernel.js...
r13187 }
MinRK
add Kernel.clear_callbacks_for_msg
r12555 };
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168
Kernel.prototype._handle_shell_reply = function (e) {
Mikhail Korobov
Some bugs in js (mostly scoping bugs) are fixed
r8839 var reply = $.parseJSON(e.data);
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('shell_reply.Kernel', {kernel: this, reply:reply});
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 var content = reply.content;
Jason Grout
Add an optional metadata attribute to all messages and add a session-level default metadata attribute.
r7952 var metadata = reply.metadata;
MinRK
refactor js callbacks...
r13207 var parent_id = reply.parent_header.msg_id;
var callbacks = this.get_callbacks_for_msg(parent_id);
if (!callbacks || !callbacks.shell) {
return;
MinRK
Improvements to kernel.js...
r13187 }
MinRK
refactor js callbacks...
r13207 var shell_callbacks = callbacks.shell;
MinRK
allow async output on the most recent request...
r16359 // signal that shell callbacks are done
this._finish_shell(parent_id);
MinRK
refactor js callbacks...
r13207
if (shell_callbacks.reply !== undefined) {
shell_callbacks.reply(reply);
}
if (content.payload && shell_callbacks.payload) {
this._handle_payloads(content.payload, shell_callbacks.payload, reply);
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 }
};
MinRK
refactor js callbacks...
r13207 Kernel.prototype._handle_payloads = function (payloads, payload_callbacks, msg) {
var l = payloads.length;
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 // Payloads are handled by triggering events because we don't want the Kernel
// to depend on the Notebook or Pager classes.
for (var i=0; i<l; i++) {
MinRK
refactor js callbacks...
r13207 var payload = payloads[i];
var callback = payload_callbacks[payload.source];
if (callback) {
callback(payload, msg);
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 }
MinRK
Improvements to kernel.js...
r13187 }
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 };
MinRK
Improvements to kernel.js...
r13187 Kernel.prototype._handle_status_message = function (msg) {
var execution_state = msg.content.execution_state;
MinRK
allow callbacks on status messages
r13231 var parent_id = msg.parent_header.msg_id;
// dispatch status msg callbacks, if any
var callbacks = this.get_callbacks_for_msg(parent_id);
if (callbacks && callbacks.iopub && callbacks.iopub.status) {
try {
callbacks.iopub.status(msg);
} catch (e) {
Jason Grout
log the error stack for a kernel javascript error message
r14499 console.log("Exception in status msg handler", e, e.stack);
MinRK
allow callbacks on status messages
r13231 }
}
MinRK
Improvements to kernel.js...
r13187 if (execution_state === 'busy') {
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('status_busy.Kernel', {kernel: this});
MinRK
Improvements to kernel.js...
r13187 } else if (execution_state === 'idle') {
MinRK
allow async output on the most recent request...
r16359 // signal that iopub callbacks are (probably) done
// async output may still arrive,
// but only for the most recent request
this._finish_iopub(parent_id);
MinRK
allow callbacks on status messages
r13231 // trigger status_idle event
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('status_idle.Kernel', {kernel: this});
MinRK
Improvements to kernel.js...
r13187 } else if (execution_state === 'restarting') {
// autorestarting is distinct from restarting,
// in that it means the kernel died and the server is restarting it.
// status_restarting sets the notification widget,
// autorestart shows the more prominent dialog.
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('status_autorestarting.Kernel', {kernel: this});
this.events.trigger('status_restarting.Kernel', {kernel: this});
MinRK
Improvements to kernel.js...
r13187 } else if (execution_state === 'dead') {
this.stop_channels();
Jonathan Frederic
Almost done!...
r17198 this.events.trigger('status_dead.Kernel', {kernel: this});
MinRK
Improvements to kernel.js...
r13187 }
};
// handle clear_output message
Kernel.prototype._handle_clear_output = function (msg) {
var callbacks = this.get_callbacks_for_msg(msg.parent_header.msg_id);
MinRK
refactor js callbacks...
r13207 if (!callbacks || !callbacks.iopub) {
MinRK
Improvements to kernel.js...
r13187 return;
}
MinRK
get clear_output callback properly
r13214 var callback = callbacks.iopub.clear_output;
MinRK
refactor js callbacks...
r13207 if (callback) {
callback(msg);
MinRK
Improvements to kernel.js...
r13187 }
};
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168
MinRK
Improvements to kernel.js...
r13187
MinRK
pyout -> execute_result...
r16568 // handle an output message (execute_result, display_data, etc.)
MinRK
Improvements to kernel.js...
r13187 Kernel.prototype._handle_output_message = function (msg) {
var callbacks = this.get_callbacks_for_msg(msg.parent_header.msg_id);
MinRK
refactor js callbacks...
r13207 if (!callbacks || !callbacks.iopub) {
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 return;
}
MinRK
refactor js callbacks...
r13207 var callback = callbacks.iopub.output;
if (callback) {
callback(msg);
MinRK
Improvements to kernel.js...
r13187 }
};
// dispatch IOPub messages to respective handlers.
// each message type should have a handler.
Kernel.prototype._handle_iopub_message = function (e) {
var msg = $.parseJSON(e.data);
var handler = this.get_iopub_handler(msg.header.msg_type);
if (handler !== undefined) {
handler(msg);
}
Brian Granger
Major refactoring of the Notebook, Kernel and CodeCell JavaScript....
r7168 };
MinRK
add stdin to notebook...
r10366 Kernel.prototype._handle_input_request = function (e) {
var request = $.parseJSON(e.data);
var header = request.header;
var content = request.content;
var metadata = request.metadata;
var msg_type = header.msg_type;
if (msg_type !== 'input_request') {
console.log("Invalid input request!", request);
return;
}
MinRK
use inline raw_input instead of a dialog
r10368 var callbacks = this.get_callbacks_for_msg(request.parent_header.msg_id);
MinRK
refactor js callbacks...
r13207 if (callbacks) {
if (callbacks.input) {
callbacks.input(request);
MinRK
use inline raw_input instead of a dialog
r10368 }
MinRK
Improvements to kernel.js...
r13187 }
MinRK
add stdin to notebook...
r10366 };
Jonathan Frederic
MWE,...
r17200 // Backwards compatability.
Brian E. Granger
Implemented module and namespace pattern in js notebook.
r4352 IPython.Kernel = Kernel;
Jonathan Frederic
Return dicts instead of classes,...
r17201 return {'Kernel': Kernel};
Jonathan Frederic
Almost done!...
r17198 });