##// END OF EJS Templates
Fix race condition in javascript kernel message processing...
Jason Grout -
Show More
@@ -41,6 +41,7 b' define(['
41 this.username = "username";
41 this.username = "username";
42 this.session_id = utils.uuid();
42 this.session_id = utils.uuid();
43 this._msg_callbacks = {};
43 this._msg_callbacks = {};
44 this._msg_queue = Promise.resolve();
44 this.info_reply = {}; // kernel_info_reply stored here after starting
45 this.info_reply = {}; // kernel_info_reply stored here after starting
45
46
46 if (typeof(WebSocket) !== 'undefined') {
47 if (typeof(WebSocket) !== 'undefined') {
@@ -854,7 +855,10 b' define(['
854 };
855 };
855
856
856 Kernel.prototype._handle_ws_message = function (e) {
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 Kernel.prototype._finish_ws_message = function (msg) {
864 Kernel.prototype._finish_ws_message = function (msg) {
@@ -30,7 +30,7 b' define(['
30 return msg;
30 return msg;
31 };
31 };
32
32
33 var _deserialize_binary = function(data, callback) {
33 var _deserialize_binary = function(data) {
34 /**
34 /**
35 * deserialize the binary message format
35 * deserialize the binary message format
36 * callback will be called with a message whose buffers attribute
36 * callback will be called with a message whose buffers attribute
@@ -39,28 +39,31 b' define(['
39 if (data instanceof Blob) {
39 if (data instanceof Blob) {
40 // data is Blob, have to deserialize from ArrayBuffer in reader callback
40 // data is Blob, have to deserialize from ArrayBuffer in reader callback
41 var reader = new FileReader();
41 var reader = new FileReader();
42 reader.onload = function () {
42 var promise = new Promise(function(resolve, reject) {
43 var msg = _deserialize_array_buffer(this.result);
43 reader.onload = function () {
44 callback(msg);
44 var msg = _deserialize_array_buffer(this.result);
45 };
45 resolve(msg);
46 };
47 });
46 reader.readAsArrayBuffer(data);
48 reader.readAsArrayBuffer(data);
49 return promise;
47 } else {
50 } else {
48 // data is ArrayBuffer, can deserialize directly
51 // data is ArrayBuffer, can deserialize directly
49 var msg = _deserialize_array_buffer(data);
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 if (typeof data === "string") {
61 if (typeof data === "string") {
59 // text JSON message
62 // text JSON message
60 callback(JSON.parse(data));
63 return Promise.resolve(JSON.parse(data));
61 } else {
64 } else {
62 // binary message
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 serialize: serialize
120 serialize: serialize
118 };
121 };
119 return exports;
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