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