kernel.js
235 lines
| 7.4 KiB
| application/javascript
|
JavascriptLexer
Brian E. Granger
|
r4609 | //---------------------------------------------------------------------------- | ||
// Copyright (C) 2008-2011 The IPython Development Team | ||||
// | ||||
// Distributed under the terms of the BSD License. The full license is in | ||||
// the file COPYING, distributed as part of this software. | ||||
//---------------------------------------------------------------------------- | ||||
Brian E. Granger
|
r4349 | |||
//============================================================================ | ||||
// Kernel | ||||
//============================================================================ | ||||
Brian E. Granger
|
r4352 | var IPython = (function (IPython) { | ||
Brian E. Granger
|
r4349 | |||
Brian E. Granger
|
r4352 | var utils = IPython.utils; | ||
var Kernel = function () { | ||||
this.kernel_id = null; | ||||
Brian E. Granger
|
r4545 | this.shell_channel = null; | ||
this.iopub_channel = null; | ||||
Brian E. Granger
|
r5106 | this.base_url = $('body').data('baseKernelUrl') + "kernels"; | ||
Brian E. Granger
|
r4545 | this.running = false; | ||
MinRK
|
r4694 | this.username = "username"; | ||
this.session_id = utils.uuid(); | ||||
Brian E. Granger
|
r4612 | if (typeof(WebSocket) !== 'undefined') { | ||
Stefan van der Walt
|
r5479 | this.WebSocket = WebSocket; | ||
Brian E. Granger
|
r4612 | } else if (typeof(MozWebSocket) !== 'undefined') { | ||
Stefan van der Walt
|
r5479 | this.WebSocket = MozWebSocket; | ||
Brian E. Granger
|
r4611 | } else { | ||
MinRK
|
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.'); | ||
Brian E. Granger
|
r4611 | }; | ||
Brian E. Granger
|
r4352 | }; | ||
Kernel.prototype.get_msg = function (msg_type, content) { | ||||
var msg = { | ||||
header : { | ||||
msg_id : utils.uuid(), | ||||
MinRK
|
r4694 | username : this.username, | ||
session : this.session_id, | ||||
Brian E. Granger
|
r4352 | msg_type : msg_type | ||
}, | ||||
content : content, | ||||
parent_header : {} | ||||
}; | ||||
return msg; | ||||
Stefan van der Walt
|
r5479 | }; | ||
Brian E. Granger
|
r4352 | |||
Brian E. Granger
|
r4545 | Kernel.prototype.start = function (notebook_id, callback) { | ||
Brian E. Granger
|
r4352 | var that = this; | ||
Brian E. Granger
|
r4545 | if (!this.running) { | ||
var qs = $.param({notebook:notebook_id}); | ||||
Stefan van der Walt
|
r5479 | var url = this.base_url + '?' + qs; | ||
Brian E. Granger
|
r5106 | $.post(url, | ||
Brian E. Granger
|
r4545 | function (kernel_id) { | ||
that._handle_start_kernel(kernel_id, callback); | ||||
}, | ||||
'json' | ||||
); | ||||
}; | ||||
}; | ||||
Kernel.prototype.restart = function (callback) { | ||||
IPython.kernel_status_widget.status_restarting(); | ||||
var url = this.kernel_url + "/restart"; | ||||
var that = this; | ||||
if (this.running) { | ||||
this.stop_channels(); | ||||
$.post(url, | ||||
function (kernel_id) { | ||||
that._handle_start_kernel(kernel_id, callback); | ||||
}, | ||||
'json' | ||||
); | ||||
}; | ||||
Brian E. Granger
|
r4352 | }; | ||
Brian E. Granger
|
r4572 | Kernel.prototype._handle_start_kernel = function (json, callback) { | ||
Brian E. Granger
|
r4545 | this.running = true; | ||
Brian E. Granger
|
r4572 | this.kernel_id = json.kernel_id; | ||
this.ws_url = json.ws_url; | ||||
Brian E. Granger
|
r4352 | this.kernel_url = this.base_url + "/" + this.kernel_id; | ||
Brian E. Granger
|
r4545 | this.start_channels(); | ||
Brian E. Granger
|
r4353 | callback(); | ||
Brian E. Granger
|
r4545 | IPython.kernel_status_widget.status_idle(); | ||
Brian E. Granger
|
r4352 | }; | ||
MinRK
|
r5255 | Kernel.prototype._websocket_closed = function(ws_url, early){ | ||
var msg; | ||||
var parent_item = $('body'); | ||||
if (early) { | ||||
msg = "Websocket connection to " + ws_url + " could not be established.<br/>" + | ||||
" You will NOT be able to run code.<br/>" + | ||||
" Your browser may not be compatible with the websocket version in the server," + | ||||
" or if the url does not look right, there could be an error in the" + | ||||
Stefan van der Walt
|
r5479 | " server's configuration."; | ||
MinRK
|
r5255 | } else { | ||
msg = "Websocket connection closed unexpectedly.<br/>" + | ||||
Stefan van der Walt
|
r5479 | " The kernel will no longer be responsive."; | ||
MinRK
|
r5255 | } | ||
var dialog = $('<div/>'); | ||||
dialog.html(msg); | ||||
parent_item.append(dialog); | ||||
dialog.dialog({ | ||||
resizable: false, | ||||
modal: true, | ||||
title: "Websocket closed", | ||||
buttons : { | ||||
"Okay": function () { | ||||
$(this).dialog('close'); | ||||
} | ||||
} | ||||
}); | ||||
Stefan van der Walt
|
r5479 | }; | ||
Brian E. Granger
|
r4352 | |||
Brian E. Granger
|
r4545 | Kernel.prototype.start_channels = function () { | ||
MinRK
|
r5253 | var that = this; | ||
Brian E. Granger
|
r4545 | this.stop_channels(); | ||
Brian E. Granger
|
r4572 | var ws_url = this.ws_url + this.kernel_url; | ||
console.log("Starting WS:", ws_url); | ||||
Brian E. Granger
|
r4611 | this.shell_channel = new this.WebSocket(ws_url + "/shell"); | ||
this.iopub_channel = new this.WebSocket(ws_url + "/iopub"); | ||||
MinRK
|
r4707 | send_cookie = function(){ | ||
this.send(document.cookie); | ||||
Stefan van der Walt
|
r5479 | }; | ||
MinRK
|
r5253 | var already_called_onclose = false; // only alert once | ||
ws_closed_early = function(evt){ | ||||
if (already_called_onclose){ | ||||
return; | ||||
} | ||||
already_called_onclose = true; | ||||
if ( ! evt.wasClean ){ | ||||
MinRK
|
r5255 | that._websocket_closed(ws_url, true); | ||
MinRK
|
r5253 | } | ||
Stefan van der Walt
|
r5479 | }; | ||
MinRK
|
r5253 | ws_closed_late = function(evt){ | ||
if (already_called_onclose){ | ||||
return; | ||||
} | ||||
already_called_onclose = true; | ||||
if ( ! evt.wasClean ){ | ||||
MinRK
|
r5255 | that._websocket_closed(ws_url, false); | ||
MinRK
|
r5253 | } | ||
Stefan van der Walt
|
r5479 | }; | ||
MinRK
|
r4707 | this.shell_channel.onopen = send_cookie; | ||
MinRK
|
r5253 | this.shell_channel.onclose = ws_closed_early; | ||
MinRK
|
r4707 | this.iopub_channel.onopen = send_cookie; | ||
MinRK
|
r5253 | this.iopub_channel.onclose = ws_closed_early; | ||
// switch from early-close to late-close message after 1s | ||||
setTimeout(function(){ | ||||
that.shell_channel.onclose = ws_closed_late; | ||||
that.iopub_channel.onclose = ws_closed_late; | ||||
}, 1000); | ||||
Brian E. Granger
|
r4545 | }; | ||
Brian E. Granger
|
r4352 | |||
Brian E. Granger
|
r4545 | Kernel.prototype.stop_channels = function () { | ||
if (this.shell_channel !== null) { | ||||
Stefan van der Walt
|
r5479 | this.shell_channel.onclose = function (evt) {}; | ||
Brian E. Granger
|
r4545 | this.shell_channel.close(); | ||
this.shell_channel = null; | ||||
}; | ||||
if (this.iopub_channel !== null) { | ||||
Stefan van der Walt
|
r5479 | this.iopub_channel.onclose = function (evt) {}; | ||
Brian E. Granger
|
r4545 | this.iopub_channel.close(); | ||
this.iopub_channel = null; | ||||
}; | ||||
}; | ||||
Matthias BUSSONNIER
|
r5397 | Kernel.prototype.object_info_request = function (objname) { | ||
Matthias BUSSONNIER
|
r5522 | if(typeof(objname)!=null && objname!=null) | ||
Matthias BUSSONNIER
|
r5409 | { | ||
var content = { | ||||
oname : objname.toString(), | ||||
}; | ||||
var msg = this.get_msg("object_info_request", content); | ||||
this.shell_channel.send(JSON.stringify(msg)); | ||||
return msg.header.msg_id; | ||||
} | ||||
return; | ||||
Matthias BUSSONNIER
|
r5397 | } | ||
Brian E. Granger
|
r4352 | Kernel.prototype.execute = function (code) { | ||
var content = { | ||||
code : code, | ||||
silent : false, | ||||
user_variables : [], | ||||
MinRK
|
r4975 | user_expressions : {}, | ||
Stefan van der Walt
|
r5479 | allow_stdin : false | ||
Brian E. Granger
|
r4352 | }; | ||
var msg = this.get_msg("execute_request", content); | ||||
this.shell_channel.send(JSON.stringify(msg)); | ||||
return msg.header.msg_id; | ||||
Stefan van der Walt
|
r5479 | }; | ||
Brian E. Granger
|
r4352 | |||
Brian Granger
|
r4388 | Kernel.prototype.complete = function (line, cursor_pos) { | ||
var content = { | ||||
text : '', | ||||
line : line, | ||||
cursor_pos : cursor_pos | ||||
}; | ||||
var msg = this.get_msg("complete_request", content); | ||||
this.shell_channel.send(JSON.stringify(msg)); | ||||
return msg.header.msg_id; | ||||
Stefan van der Walt
|
r5479 | }; | ||
Brian Granger
|
r4388 | |||
Brian E. Granger
|
r4352 | Kernel.prototype.interrupt = function () { | ||
Brian E. Granger
|
r4545 | if (this.running) { | ||
$.post(this.kernel_url + "/interrupt"); | ||||
}; | ||||
Brian E. Granger
|
r4349 | }; | ||
Brian E. Granger
|
r4496 | Kernel.prototype.kill = function () { | ||
Brian E. Granger
|
r4545 | if (this.running) { | ||
this.running = false; | ||||
var settings = { | ||||
cache : false, | ||||
Stefan van der Walt
|
r5479 | type : "DELETE" | ||
Brian E. Granger
|
r4545 | }; | ||
$.ajax(this.kernel_url, settings); | ||||
Brian E. Granger
|
r4496 | }; | ||
}; | ||||
Brian E. Granger
|
r4352 | IPython.Kernel = Kernel; | ||
return IPython; | ||||
}(IPython)); | ||||