##// END OF EJS Templates
Fix race condition in javascript kernel message processing...
Jason Grout -
Show More
@@ -41,6 +41,7 b' define(['
41 41 this.username = "username";
42 42 this.session_id = utils.uuid();
43 43 this._msg_callbacks = {};
44 this._msg_queue = Promise.resolve();
44 45 this.info_reply = {}; // kernel_info_reply stored here after starting
45 46
46 47 if (typeof(WebSocket) !== 'undefined') {
@@ -854,7 +855,10 b' define(['
854 855 };
855 856
856 857 Kernel.prototype._handle_ws_message = function (e) {
857 serialize.deserialize(e.data, $.proxy(this._finish_ws_message, this));
858 this._msg_queue = this._msg_queue.then(function() {
859 return serialize.deserialize(e.data);
860 }).then($.proxy(this._finish_ws_message, this))
861 .catch(utils.reject("Couldn't process kernel message", true));
858 862 };
859 863
860 864 Kernel.prototype._finish_ws_message = function (msg) {
@@ -30,7 +30,7 b' define(['
30 30 return msg;
31 31 };
32 32
33 var _deserialize_binary = function(data, callback) {
33 var _deserialize_binary = function(data) {
34 34 /**
35 35 * deserialize the binary message format
36 36 * callback will be called with a message whose buffers attribute
@@ -39,28 +39,31 b' define(['
39 39 if (data instanceof Blob) {
40 40 // data is Blob, have to deserialize from ArrayBuffer in reader callback
41 41 var reader = new FileReader();
42 reader.onload = function () {
43 var msg = _deserialize_array_buffer(this.result);
44 callback(msg);
45 };
42 var promise = new Promise(function(resolve, reject) {
43 reader.onload = function () {
44 var msg = _deserialize_array_buffer(this.result);
45 resolve(msg);
46 };
47 });
46 48 reader.readAsArrayBuffer(data);
49 return promise;
47 50 } else {
48 51 // data is ArrayBuffer, can deserialize directly
49 52 var msg = _deserialize_array_buffer(data);
50 callback(msg);
53 return msg;
51 54 }
52 55 };
53 56
54 var deserialize = function (data, callback) {
57 var deserialize = function (data) {
55 58 /**
56 * deserialize a message and pass the unpacked message object to callback
59 * deserialize a message and return a promise for the unpacked message
57 60 */
58 61 if (typeof data === "string") {
59 62 // text JSON message
60 callback(JSON.parse(data));
63 return Promise.resolve(JSON.parse(data));
61 64 } else {
62 65 // binary message
63 _deserialize_binary(data, callback);
66 return Promise.resolve(_deserialize_binary(data));
64 67 }
65 68 };
66 69
@@ -117,4 +120,4 b' define(['
117 120 serialize: serialize
118 121 };
119 122 return exports;
120 }); No newline at end of file
123 });
General Comments 0
You need to be logged in to leave comments. Login now