From 2b5b0939f22a6c7641e2fe3a2fd6940beaf3fea0 Mon Sep 17 00:00:00 2001 From: Boris Kocherov <bk@raskon.org> Date: Thu, 17 Mar 2016 03:02:50 +0300 Subject: [PATCH] erp5_web_jabber_client: fix messages loss, thx @cedric.leninivin --- .../web_page_module/jabber_gadget_jio_js.js | 63 +++++++++++++++++-- .../web_page_module/jabber_gadget_jio_js.xml | 4 +- 2 files changed, 60 insertions(+), 7 deletions(-) diff --git a/bt5/erp5_web_jabber_client/PathTemplateItem/web_page_module/jabber_gadget_jio_js.js b/bt5/erp5_web_jabber_client/PathTemplateItem/web_page_module/jabber_gadget_jio_js.js index 71cb12a7df..ba26a315d0 100644 --- a/bt5/erp5_web_jabber_client/PathTemplateItem/web_page_module/jabber_gadget_jio_js.js +++ b/bt5/erp5_web_jabber_client/PathTemplateItem/web_page_module/jabber_gadget_jio_js.js @@ -43,6 +43,30 @@ return gadget.state_parameter_dict.my_jid + '-' + jid; } + function enqueueDefer(gadget, callback) { + var deferred = gadget.props.current_deferred; + + // Unblock queue + if (deferred !== undefined) { + deferred.resolve("Another event added"); + } + + // Add next callback + try { + gadget.props.service_queue.push(callback); + } catch (error) { + throw new Error("Connection gadget already crashed... " + + gadget.props.service_queue.rejectedReason.toString()); + } + + // Block the queue + deferred = RSVP.defer(); + gadget.props.current_deferred = deferred; + gadget.props.service_queue.push(function () { + return deferred.promise; + }); + } + function getLog(gadget, jid, options) { return wrapJioCall(gadget, 'getAttachment', [getStorageIdFromJid(gadget, jid), 'enclosure', options]) .push(undefined, function (error) { @@ -55,11 +79,21 @@ } function addLog(gadget, jid, text, is_incoming) { - return getLog(gadget, jid, {format: 'text'}) - .push(function (result) { - var new_history = result + getLogString(text, is_incoming); - return wrapJioCall(gadget, 'putAttachment', [getStorageIdFromJid(gadget, jid), 'enclosure', new_history]); - }); + var deferred = RSVP.defer(); + enqueueDefer(gadget, function () { + return getLog(gadget, jid, {format: 'text'}) + .push(function (result) { + var new_history = result + getLogString(text, is_incoming); + return wrapJioCall(gadget, 'putAttachment', [getStorageIdFromJid(gadget, jid), 'enclosure', new_history]); + }) + .push(function () { + deferred.resolve(); + return true; + }); + }); + return new RSVP.Queue().push(function () { + return deferred.promise; + }); } function dropConnectionGadget(gadget) { @@ -160,6 +194,9 @@ } rJS(window) + .ready(function (g) { + g.props = {}; + }) .allowPublicAcquisition("notifyXMPPConnecting", function () { return; @@ -431,6 +468,22 @@ throw new Error('Unsupported putAttachment: ' + id + ' ' + name); }) + .declareService(function () { + // queue for addLog + var context = this; + + context.props.service_queue = new RSVP.Queue(); + enqueueDefer(context); + + return new RSVP.Queue() + .push(function () { + return context.props.service_queue; + }) + .push(function () { + throw new Error("Service should not have been stopped!"); + }); + }) + .declareService(function () { return loopEventListener( window, diff --git a/bt5/erp5_web_jabber_client/PathTemplateItem/web_page_module/jabber_gadget_jio_js.xml b/bt5/erp5_web_jabber_client/PathTemplateItem/web_page_module/jabber_gadget_jio_js.xml index bf1427cb0c..2824aca442 100644 --- a/bt5/erp5_web_jabber_client/PathTemplateItem/web_page_module/jabber_gadget_jio_js.xml +++ b/bt5/erp5_web_jabber_client/PathTemplateItem/web_page_module/jabber_gadget_jio_js.xml @@ -230,7 +230,7 @@ </item> <item> <key> <string>serial</string> </key> - <value> <string>949.36462.22852.4232</string> </value> + <value> <string>949.57481.62457.42496</string> </value> </item> <item> <key> <string>state</string> </key> @@ -248,7 +248,7 @@ </tuple> <state> <tuple> - <float>1457082886.14</float> + <float>1458172700.61</float> <string>UTC</string> </tuple> </state> -- 2.30.9