diff --git a/IPython/html/static/base/js/utils.js b/IPython/html/static/base/js/utils.js index d70304ebf..8e2530354 100644 --- a/IPython/html/static/base/js/utils.js +++ b/IPython/html/static/base/js/utils.js @@ -554,43 +554,6 @@ define([ ); }; - var decode_utf8 = function (array) { - // Decode UTF8 Uint8Array to String - // I can't believe Javascript makes us do this - // From http://stackoverflow.com/questions/17191945 - - var out, i, len, c; - var char2, char3; - - out = ""; - len = array.length; - i = 0; - while(i < len) { - c = array[i++]; - switch(c >> 4) { - case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: - // 0xxxxxxx - out += String.fromCharCode(c); - break; - case 12: case 13: - // 110x xxxx 10xx xxxx - char2 = array[i++]; - out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F)); - break; - case 14: - // 1110 xxxx 10xx xxxx 10xx xxxx - char2 = array[i++]; - char3 = array[i++]; - out += String.fromCharCode(((c & 0x0F) << 12) | - ((char2 & 0x3F) << 6) | - ((char3 & 0x3F) << 0)); - break; - } - } - - return out; - }; - var utils = { regex_split : regex_split, uuid : uuid, @@ -616,7 +579,6 @@ define([ ajax_error_msg : ajax_error_msg, log_ajax_error : log_ajax_error, requireCodeMirrorMode : requireCodeMirrorMode, - decode_utf8: decode_utf8, }; // Backwards compatability. diff --git a/IPython/html/static/services/kernels/js/kernel.js b/IPython/html/static/services/kernels/js/kernel.js index e8db4a619..7a24f84ef 100644 --- a/IPython/html/static/services/kernels/js/kernel.js +++ b/IPython/html/static/services/kernels/js/kernel.js @@ -7,7 +7,8 @@ define([ 'base/js/utils', 'services/kernels/js/comm', 'widgets/js/init', -], function(IPython, $, utils, comm, widgetmanager) { + './serialize' +], function(IPython, $, utils, comm, widgetmanager, serialize) { "use strict"; /** @@ -846,57 +847,11 @@ define([ } }; - - Kernel.prototype._deserialize_binary_message = function(blob, callback) { - // deserialize the binary message format - // callback will be called with a message whose buffers attribute - // will be an array of DataViews. - var reader = new FileReader(); - reader.onload = function(e) { - var data = new DataView(this.result); - // read the header: 1 + nbufs 32b integers - var nbufs = data.getInt32(0); - var offsets = []; - var i; - for (i = 1; i <= nbufs; i++) { - offsets.push(data.getInt32(i * 4)); - } - // the first chunk is the message as utf-8 JSON - var msg = $.parseJSON( - utis.decode_utf8( - new Uint8Array(this.result.slice(offsets[0], offsets[1])) - ) - ); - // the remaining chunks are stored as DataViews in msg.buffers - msg.buffers = []; - var start, stop; - for (i = 1; i < nbufs; i++) { - start = offsets[i]; - stop = offsets[i+1]; - msg.buffers.push(new DataView(this.result.slice(start, stop))); - } - callback(msg); - }; - reader.readAsArrayBuffer(blob); - }; - - - Kernel.prototype._deserialize_msg = function (e, callback) { - // deserialze a message and pass the unpacked message object to callback - if (typeof e.data === "string") { - // text JSON message - callback($.parseJSON(e.data)); - } else { - // binary message - this._deserialize_binary_message(e.data, callback); - } - }; - /** * @function _handle_shell_reply */ Kernel.prototype._handle_shell_reply = function (e) { - this._deserialize_msg(e, $.proxy(this._finish_shell_reply, this)); + serialize.deserialize(e.data, $.proxy(this._finish_shell_reply, this)); }; Kernel.prototype._finish_shell_reply = function (reply) { @@ -1027,7 +982,7 @@ define([ * @function _handle_iopub_message */ Kernel.prototype._handle_iopub_message = function (e) { - this._deserialize_msg(e, $.proxy(this._finish_iopub_message, this)); + serialize.deserialize(e.data, $.proxy(this._finish_iopub_message, this)); }; @@ -1042,7 +997,7 @@ define([ * @function _handle_input_request */ Kernel.prototype._handle_input_request = function (e) { - this._deserialize_msg(e, $.proxy(this._finish_input_request, this)); + serialize.deserialize(e.data, $.proxy(this._finish_input_request, this)); }; diff --git a/IPython/html/static/services/kernels/js/serialize.js b/IPython/html/static/services/kernels/js/serialize.js new file mode 100644 index 000000000..6ce8bdb3a --- /dev/null +++ b/IPython/html/static/services/kernels/js/serialize.js @@ -0,0 +1,61 @@ +// Copyright (c) IPython Development Team. +// Distributed under the terms of the Modified BSD License. + +define([ + 'jquery', + 'components/utf8/utf8' + ], function ($, utf8) { + "use strict"; + + var _deserialize_binary = function(blob, callback) { + // deserialize the binary message format + // callback will be called with a message whose buffers attribute + // will be an array of DataViews. + var reader = new FileReader(); + reader.onload = function () { + var buf = this.result; // an ArrayBuffer + var data = new DataView(buf); + // read the header: 1 + nbufs 32b integers + var nbufs = data.getInt32(0); + var offsets = []; + var i; + for (i = 1; i <= nbufs; i++) { + offsets.push(data.getInt32(i * 4)); + } + // have to convert array to string for utf8.js + var bytestring = String.fromCharCode.apply(null, + new Uint8Array(buf.slice(offsets[0], offsets[1])) + ); + var msg = $.parseJSON( + utf8.decode( + bytestring + ) + ); + // the remaining chunks are stored as DataViews in msg.buffers + msg.buffers = []; + var start, stop; + for (i = 1; i < nbufs; i++) { + start = offsets[i]; + stop = offsets[i+1] || buf.byteLength; + msg.buffers.push(new DataView(buf.slice(start, stop))); + } + callback(msg); + }; + reader.readAsArrayBuffer(blob); + }; + + var deserialize = function (data, callback) { + // deserialize a message and pass the unpacked message object to callback + if (typeof data === "string") { + // text JSON message + callback($.parseJSON(data)); + } else { + // binary message + _deserialize_binary(data, callback); + } + }; + + return { + deserialize : deserialize + }; +}); \ No newline at end of file