Browse Source

Use `_coverse.api.sendIQ` instead of `_converse.connection.sendIQ`

So that we know an event will be emitted when the stanza is sent.
JC Brand 6 years ago
parent
commit
cc6aed7c6c

+ 69 - 73
dist/converse.js

@@ -617,7 +617,7 @@ module.exports = Awesomplete;
 
 /**
  * Backbone localStorage and sessionStorage Adapter
- * Version 0.0.3
+ * Version 0.0.4
  *
  * https://github.com/jcbrand/Backbone.browserStorage
  */
@@ -63026,13 +63026,15 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_3__["default"].plugins
       updateRoomsList() {
         /* Send an IQ stanza to the server asking for all groupchats
          */
-        _converse.connection.sendIQ($iq({
+        const iq = $iq({
           'to': this.model.get('muc_domain'),
           'from': _converse.connection.jid,
           'type': "get"
         }).c("query", {
           xmlns: Strophe.NS.DISCO_ITEMS
-        }), this.onRoomsFound.bind(this), this.informNoRoomsFound.bind(this), 5000);
+        });
+
+        _converse.api.sendIQ(iq).then(iq => this.onRoomsFound(iq)).catch(iq => this.informNoRoomsFound());
       },
 
       showRooms(ev) {
@@ -63510,7 +63512,7 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_3__["default"].plugins
           iq.c("reason", reason);
         }
 
-        return _converse.connection.sendIQ(iq, onSuccess, onError);
+        return _converse.api.sendIQ(iq).then(onSuccess).catch(onError);
       },
 
       verifyRoles(roles) {
@@ -73249,6 +73251,8 @@ _converse.api = {
    */
   'send'(stanza) {
     _converse.connection.send(stanza);
+
+    _converse.emit('send', stanza);
   },
 
   /**
@@ -73258,9 +73262,11 @@ _converse.api = {
    * @returns {Promise} A promise which resolves when we receive a `result` stanza
    * or is rejected when we receive an `error` stanza.
    */
-  'sendIQ'(stanza) {
+  'sendIQ'(stanza, timeout) {
     return new es6_promise_dist_es6_promise_auto__WEBPACK_IMPORTED_MODULE_2___default.a((resolve, reject) => {
-      _converse.connection.sendIQ(stanza, resolve, reject, _converse.IQ_TIMEOUT);
+      _converse.connection.sendIQ(stanza, resolve, reject, timeout || _converse.IQ_TIMEOUT);
+
+      _converse.emit('send', stanza);
     });
   }
 
@@ -74289,7 +74295,7 @@ function queryForArchivedMessages(_converse, options, callback, errback) {
     return true;
   }, Strophe.NS.MAM);
 
-  _converse.connection.sendIQ(stanza, function (iq) {
+  _converse.api.sendIQ(stanza, _converse.message_archiving_timeout).then(iq => {
     _converse.connection.deleteHandler(message_handler);
 
     if (_.isFunction(callback)) {
@@ -74306,13 +74312,13 @@ function queryForArchivedMessages(_converse, options, callback, errback) {
 
       callback(messages, rsm);
     }
-  }, function () {
+  }).catch(iq => {
     _converse.connection.deleteHandler(message_handler);
 
     if (_.isFunction(errback)) {
       errback.apply(this, arguments);
     }
-  }, _converse.message_archiving_timeout);
+  });
 }
 
 _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-mam', {
@@ -74550,7 +74556,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-mam
 
     });
 
-    _converse.onMAMError = function (model, iq) {
+    _converse.onMAMError = function (iq) {
       if (iq.querySelectorAll('feature-not-implemented').length) {
         _converse.log("Message Archive Management (XEP-0313) not supported by this server", Strophe.LogLevel.WARN);
       } else {
@@ -74582,20 +74588,16 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-mam
           'default': _converse.message_archiving
         });
 
-        _.each(preference.children, function (child) {
-          stanza.cnode(child).up();
-        });
+        _.each(preference.children, child => stanza.cnode(child).up()); // XXX: Strictly speaking, the server should respond with the updated prefs
+        // (see example 18: https://xmpp.org/extensions/xep-0313.html#config)
+        // but Prosody doesn't do this, so we don't rely on it.
 
-        _converse.connection.sendIQ(stanza, _.partial(function (feature, iq) {
-          // XXX: Strictly speaking, the server should respond with the updated prefs
-          // (see example 18: https://xmpp.org/extensions/xep-0313.html#config)
-          // but Prosody doesn't do this, so we don't rely on it.
-          feature.save({
-            'preferences': {
-              'default': _converse.message_archiving
-            }
-          });
-        }, feature), _converse.onMAMError);
+
+        _converse.api.sendIQ(stanza).then(() => feature.save({
+          'preferences': {
+            'default': _converse.message_archiving
+          }
+        })).catch(_converse.onMAMError);
       } else {
         feature.save({
           'preferences': {
@@ -74613,11 +74615,11 @@ _converse_core__WEBPACK_IMPORTED_MODULE_2__["default"].plugins.add('converse-mam
       if (feature.get('var') === Strophe.NS.MAM && prefs['default'] !== _converse.message_archiving && // eslint-disable-line dot-notation
       !_.isUndefined(_converse.message_archiving)) {
         // Ask the server for archiving preferences
-        _converse.connection.sendIQ($iq({
+        _converse.api.sendIQ($iq({
           'type': 'get'
         }).c('prefs', {
           'xmlns': Strophe.NS.MAM
-        }), _.partial(_converse.onMAMPreferences, feature), _.partial(_converse.onMAMError, feature));
+        })).then(_.partial(_converse.onMAMPreferences, feature)).catch(_converse.onMAMError);
       }
     });
 
@@ -75546,14 +75548,12 @@ _converse_core__WEBPACK_IMPORTED_MODULE_6__["default"].plugins.add('converse-muc
          * Returns a promise which resolves once the response IQ
          * has been received.
          */
-        return new Promise((resolve, reject) => {
-          _converse.connection.sendIQ($iq({
-            'to': this.get('jid'),
-            'type': "get"
-          }).c("query", {
-            xmlns: Strophe.NS.MUC_OWNER
-          }), resolve, reject);
-        });
+        return _converse.api.sendIQ($iq({
+          'to': this.get('jid'),
+          'type': "get"
+        }).c("query", {
+          xmlns: Strophe.NS.MUC_OWNER
+        }));
       },
 
       sendConfiguration(config, callback, errback) {
@@ -75586,7 +75586,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_6__["default"].plugins.add('converse-muc
 
         callback = _.isUndefined(callback) ? _.noop : _.partial(callback, iq.nodeTree);
         errback = _.isUndefined(errback) ? _.noop : _.partial(errback, iq.nodeTree);
-        return _converse.connection.sendIQ(iq, callback, errback);
+        return _converse.api.sendIQ(iq).then(callback).catch(errback);
       },
 
       saveAffiliationAndRole(pres) {
@@ -75626,24 +75626,22 @@ _converse_core__WEBPACK_IMPORTED_MODULE_6__["default"].plugins.add('converse-muc
          *  (Object) member: Map containing the member's jid and
          *      optionally a reason and affiliation.
          */
-        return new Promise((resolve, reject) => {
-          const iq = $iq({
-            to: this.get('jid'),
-            type: "set"
-          }).c("query", {
-            xmlns: Strophe.NS.MUC_ADMIN
-          }).c("item", {
-            'affiliation': member.affiliation || affiliation,
-            'nick': member.nick,
-            'jid': member.jid
-          });
+        const iq = $iq({
+          to: this.get('jid'),
+          type: "set"
+        }).c("query", {
+          xmlns: Strophe.NS.MUC_ADMIN
+        }).c("item", {
+          'affiliation': member.affiliation || affiliation,
+          'nick': member.nick,
+          'jid': member.jid
+        });
 
-          if (!_.isUndefined(member.reason)) {
-            iq.c("reason", member.reason);
-          }
+        if (!_.isUndefined(member.reason)) {
+          iq.c("reason", member.reason);
+        }
 
-          _converse.connection.sendIQ(iq, resolve, reject);
-        });
+        return _converse.api.sendIQ(iq);
       },
 
       setAffiliations(members) {
@@ -77067,7 +77065,7 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins
           subscription: "remove"
         });
 
-        _converse.connection.sendIQ(iq, callback, errback);
+        _converse.api.sendIQ(iq).then(callback).catch(errback);
 
         return this;
       }
@@ -77215,7 +77213,7 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins
           iq.c('group').t(group).up();
         });
 
-        _converse.connection.sendIQ(iq, callback, errback);
+        _converse.api.sendIQ(iq).then(callback).catch(errback);
       },
 
       addContactToRoster(jid, name, groups, attributes) {
@@ -77366,7 +77364,7 @@ _converse_headless_converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins
             reject(new Error(errmsg));
           };
 
-          return _converse.connection.sendIQ(iq, callback, errback);
+          return _converse.api.sendIQ(iq).then(callback).catch(errback);
         });
       },
 
@@ -77828,7 +77826,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins.add('converse-vca
 
     });
 
-    function onVCardData(jid, iq, callback) {
+    async function onVCardData(jid, iq) {
       const vcard = iq.querySelector('vCard');
       let result = {};
 
@@ -77849,23 +77847,11 @@ _converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins.add('converse-vca
 
       if (result.image) {
         const buffer = u.base64ToArrayBuffer(result['image']);
-        crypto.subtle.digest('SHA-1', buffer).then(ab => {
-          result['image_hash'] = u.arrayBufferToHex(ab);
-          if (callback) callback(result);
-        });
-      } else {
-        if (callback) callback(result);
+        const ab = await crypto.subtle.digest('SHA-1', buffer);
+        result['image_hash'] = u.arrayBufferToHex(ab);
       }
-    }
 
-    function onVCardError(jid, iq, errback) {
-      if (errback) {
-        errback({
-          'stanza': iq,
-          'jid': jid,
-          'vcard_error': moment().format()
-        });
-      }
+      return result;
     }
 
     function createStanza(type, jid, vcard_el) {
@@ -77896,7 +77882,7 @@ _converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins.add('converse-vca
       return _converse.api.sendIQ(createStanza("set", jid, vcard_el));
     }
 
-    function getVCard(_converse, jid) {
+    async function getVCard(_converse, jid) {
       /* Request the VCard of another user. Returns a promise.
        *
        * Parameters:
@@ -77904,9 +77890,19 @@ _converse_core__WEBPACK_IMPORTED_MODULE_0__["default"].plugins.add('converse-vca
        *      is being requested.
        */
       const to = Strophe.getBareJidFromJid(jid) === _converse.bare_jid ? null : jid;
-      return new Promise((resolve, reject) => {
-        _converse.connection.sendIQ(createStanza("get", to), _.partial(onVCardData, jid, _, resolve), _.partial(onVCardError, jid, _, resolve), _converse.IQ_TIMEOUT);
-      });
+      let iq;
+
+      try {
+        iq = await _converse.api.sendIQ(createStanza("get", to));
+      } catch (iq) {
+        return {
+          'stanza': iq,
+          'jid': jid,
+          'vcard_error': moment().format()
+        };
+      }
+
+      return onVCardData(jid, iq);
     }
     /* Event handlers */
 

+ 3 - 7
package-lock.json

@@ -3178,16 +3178,13 @@
       "version": "1.3.3",
       "resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz",
       "integrity": "sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk=",
-      "dev": true,
       "requires": {
         "underscore": ">=1.8.3"
       }
     },
     "backbone.browserStorage": {
-      "version": "0.0.4",
-      "resolved": "https://registry.npmjs.org/backbone.browserStorage/-/backbone.browserStorage-0.0.4.tgz",
-      "integrity": "sha512-4LvDP2IkOu9Nt6kj6ft4moKmqKqm3c0WY3c/aie0Cf374wjFuO7vCh/afcKdu1YSuVsryM8yH90/J7yqWbaPHw==",
-      "dev": true,
+      "version": "github:jcbrand/Backbone.browserStorage#03bfa13f68b71f97be361840adc5a5064f57b47e",
+      "from": "github:jcbrand/Backbone.browserStorage#03bfa13f68b71f97be361840adc5a5064f57b47e",
       "requires": {
         "backbone": "~1.x.x",
         "underscore": ">=1.4.0"
@@ -15220,8 +15217,7 @@
     "underscore": {
       "version": "1.8.3",
       "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz",
-      "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=",
-      "dev": true
+      "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI="
     },
     "underscore-contrib": {
       "version": "0.3.0",

+ 0 - 2
package.json

@@ -39,8 +39,6 @@
     "@fortawesome/fontawesome-free": "5.3.1",
     "awesomplete-avoid-xss": "^1.1.2",
     "babel-loader": "^8.0.0",
-    "backbone": "1.3.3",
-    "backbone.browserStorage": "jcbrand/Backbone.browserStorage#03bfa13f68b71f97be361840adc5a5064f57b47e",
     "backbone.nativeview": "^0.3.3",
     "backbone.overview": "^1.0.2",
     "backbone.vdomview": "^1.0.1",

+ 9 - 11
src/converse-muc-views.js

@@ -367,16 +367,14 @@ converse.plugins.add('converse-muc-views', {
             updateRoomsList () {
                 /* Send an IQ stanza to the server asking for all groupchats
                  */
-                _converse.connection.sendIQ(
-                    $iq({
-                        'to': this.model.get('muc_domain'),
-                        'from': _converse.connection.jid,
-                        'type': "get"
-                    }).c("query", {xmlns: Strophe.NS.DISCO_ITEMS}),
-                    this.onRoomsFound.bind(this),
-                    this.informNoRoomsFound.bind(this),
-                    5000
-                );
+                const iq = $iq({
+                    'to': this.model.get('muc_domain'),
+                    'from': _converse.connection.jid,
+                    'type': "get"
+                }).c("query", {xmlns: Strophe.NS.DISCO_ITEMS});
+                _converse.api.sendIQ(iq)
+                    .then(iq => this.onRoomsFound(iq))
+                    .catch(iq => this.informNoRoomsFound())
             },
 
             showRooms (ev) {
@@ -805,7 +803,7 @@ converse.plugins.add('converse-muc-views', {
                 const item = $build("item", {nick, role});
                 const iq = $iq({to: groupchat, type: "set"}).c("query", {xmlns: Strophe.NS.MUC_ADMIN}).cnode(item.node);
                 if (reason !== null) { iq.c("reason", reason); }
-                return _converse.connection.sendIQ(iq, onSuccess, onError);
+                return _converse.api.sendIQ(iq).then(onSuccess).catch(onError);
             },
 
             verifyRoles (roles) {

+ 2 - 2
src/headless/converse-core.js

@@ -1651,9 +1651,9 @@ _converse.api = {
      * @returns {Promise} A promise which resolves when we receive a `result` stanza
      * or is rejected when we receive an `error` stanza.
      */
-    'sendIQ' (stanza) {
+    'sendIQ' (stanza, timeout) {
         return new Promise((resolve, reject) => {
-            _converse.connection.sendIQ(stanza, resolve, reject, _converse.IQ_TIMEOUT);
+            _converse.connection.sendIQ(stanza, resolve, reject, timeout || _converse.IQ_TIMEOUT);
             _converse.emit('send', stanza); 
         });
     }

+ 19 - 26
src/headless/converse-mam.js

@@ -99,9 +99,8 @@ function queryForArchivedMessages (_converse, options, callback, errback) {
         return true;
     }, Strophe.NS.MAM);
 
-    _converse.connection.sendIQ(
-        stanza,
-        function (iq) {
+    _converse.api.sendIQ(stanza, _converse.message_archiving_timeout)
+        .then(iq => {
             _converse.connection.deleteHandler(message_handler);
             if (_.isFunction(callback)) {
                 const set = iq.querySelector('set');
@@ -112,13 +111,12 @@ function queryForArchivedMessages (_converse, options, callback, errback) {
                 }
                 callback(messages, rsm);
             }
-        },
-        function () {
+        }).catch(iq => {
             _converse.connection.deleteHandler(message_handler);
-            if (_.isFunction(errback)) { errback.apply(this, arguments); }
-        },
-        _converse.message_archiving_timeout
-    );
+            if (_.isFunction(errback)) {
+                errback.apply(this, arguments);
+            }
+        });
 }
 
 
@@ -333,7 +331,7 @@ converse.plugins.add('converse-mam', {
             message_archiving_timeout: 8000, // Time (in milliseconds) to wait before aborting MAM request
         });
 
-        _converse.onMAMError = function (model, iq) {
+        _converse.onMAMError = function (iq) {
             if (iq.querySelectorAll('feature-not-implemented').length) {
                 _converse.log(
                     "Message Archive Management (XEP-0313) not supported by this server",
@@ -365,17 +363,14 @@ converse.plugins.add('converse-mam', {
                         'xmlns':Strophe.NS.MAM,
                         'default':_converse.message_archiving
                     });
-                _.each(preference.children, function (child) {
-                    stanza.cnode(child).up();
-                });
-                _converse.connection.sendIQ(stanza, _.partial(function (feature, iq) {
-                        // XXX: Strictly speaking, the server should respond with the updated prefs
-                        // (see example 18: https://xmpp.org/extensions/xep-0313.html#config)
-                        // but Prosody doesn't do this, so we don't rely on it.
-                        feature.save({'preferences': {'default':_converse.message_archiving}});
-                    }, feature),
-                    _converse.onMAMError
-                );
+                _.each(preference.children, child => stanza.cnode(child).up());
+
+                // XXX: Strictly speaking, the server should respond with the updated prefs
+                // (see example 18: https://xmpp.org/extensions/xep-0313.html#config)
+                // but Prosody doesn't do this, so we don't rely on it.
+                _converse.api.sendIQ(stanza)
+                    .then(() => feature.save({'preferences': {'default':_converse.message_archiving}}))
+                    .catch(_converse.onMAMError);
             } else {
                 feature.save({'preferences': {'default':_converse.message_archiving}});
             }
@@ -388,11 +383,9 @@ converse.plugins.add('converse-mam', {
                     prefs['default'] !== _converse.message_archiving && // eslint-disable-line dot-notation
                     !_.isUndefined(_converse.message_archiving) ) {
                 // Ask the server for archiving preferences
-                _converse.connection.sendIQ(
-                    $iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM}),
-                    _.partial(_converse.onMAMPreferences, feature),
-                    _.partial(_converse.onMAMError, feature)
-                );
+                _converse.api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM}))
+                    .then(_.partial(_converse.onMAMPreferences, feature))
+                    .catch(_converse.onMAMError);
             }
         });
 

+ 16 - 24
src/headless/converse-muc.js

@@ -620,16 +620,10 @@ converse.plugins.add('converse-muc', {
                  * Returns a promise which resolves once the response IQ
                  * has been received.
                  */
-                return new Promise((resolve, reject) => {
-                    _converse.connection.sendIQ(
-                        $iq({
-                            'to': this.get('jid'),
-                            'type': "get"
-                        }).c("query", {xmlns: Strophe.NS.MUC_OWNER}),
-                        resolve,
-                        reject
-                    );
-                });
+                return _converse.api.sendIQ(
+                    $iq({'to': this.get('jid'), 'type': "get"})
+                     .c("query", {xmlns: Strophe.NS.MUC_OWNER})
+                );
             },
 
             sendConfiguration (config, callback, errback) {
@@ -652,7 +646,7 @@ converse.plugins.add('converse-muc', {
                 _.each(config || [], function (node) { iq.cnode(node).up(); });
                 callback = _.isUndefined(callback) ? _.noop : _.partial(callback, iq.nodeTree);
                 errback = _.isUndefined(errback) ? _.noop : _.partial(errback, iq.nodeTree);
-                return _converse.connection.sendIQ(iq, callback, errback);
+                return _converse.api.sendIQ(iq).then(callback).catch(errback);
             },
 
             saveAffiliationAndRole (pres) {
@@ -685,19 +679,17 @@ converse.plugins.add('converse-muc', {
                  *  (Object) member: Map containing the member's jid and
                  *      optionally a reason and affiliation.
                  */
-                return new Promise((resolve, reject) => {
-                    const iq = $iq({to: this.get('jid'), type: "set"})
-                        .c("query", {xmlns: Strophe.NS.MUC_ADMIN})
-                        .c("item", {
-                            'affiliation': member.affiliation || affiliation,
-                            'nick': member.nick,
-                            'jid': member.jid
-                        });
-                    if (!_.isUndefined(member.reason)) {
-                        iq.c("reason", member.reason);
-                    }
-                    _converse.connection.sendIQ(iq, resolve, reject);
-                });
+                const iq = $iq({to: this.get('jid'), type: "set"})
+                    .c("query", {xmlns: Strophe.NS.MUC_ADMIN})
+                    .c("item", {
+                        'affiliation': member.affiliation || affiliation,
+                        'nick': member.nick,
+                        'jid': member.jid
+                    });
+                if (!_.isUndefined(member.reason)) {
+                    iq.c("reason", member.reason);
+                }
+                return _converse.api.sendIQ(iq);
             },
 
             setAffiliations (members) {

+ 3 - 3
src/headless/converse-roster.js

@@ -329,7 +329,7 @@ converse.plugins.add('converse-roster', {
                 const iq = $iq({type: 'set'})
                     .c('query', {xmlns: Strophe.NS.ROSTER})
                     .c('item', {jid: this.get('jid'), subscription: "remove"});
-                _converse.connection.sendIQ(iq, callback, errback);
+                _converse.api.sendIQ(iq).then(callback).catch(errback);
                 return this;
             }
         });
@@ -466,7 +466,7 @@ converse.plugins.add('converse-roster', {
                     .c('query', {xmlns: Strophe.NS.ROSTER})
                     .c('item', { jid, name });
                 _.each(groups, function (group) { iq.c('group').t(group).up(); });
-                _converse.connection.sendIQ(iq, callback, errback);
+                _converse.api.sendIQ(iq).then(callback).catch(errback);
             },
 
             addContactToRoster (jid, name, groups, attributes) {
@@ -586,7 +586,7 @@ converse.plugins.add('converse-roster', {
                         _converse.log(errmsg, Strophe.LogLevel.ERROR);
                         reject(new Error(errmsg));
                     }
-                    return _converse.connection.sendIQ(iq, callback, errback);
+                    return _converse.api.sendIQ(iq).then(callback).catch(errback);
                 });
             },
 

+ 16 - 27
src/headless/converse-vcard.js

@@ -56,7 +56,7 @@ converse.plugins.add('converse-vcard', {
         });
 
 
-        function onVCardData (jid, iq, callback) {
+        async function onVCardData (jid, iq) {
             const vcard = iq.querySelector('vCard');
             let result = {};
             if (!_.isNull(vcard)) {
@@ -75,24 +75,10 @@ converse.plugins.add('converse-vcard', {
             }
             if (result.image) {
                 const buffer = u.base64ToArrayBuffer(result['image']);
-                crypto.subtle.digest('SHA-1', buffer)
-                .then(ab => {
-                    result['image_hash'] = u.arrayBufferToHex(ab);
-                    if (callback) callback(result);
-                });
-            } else {
-                if (callback) callback(result);
-            }
-        }
-
-        function onVCardError (jid, iq, errback) {
-            if (errback) {
-                errback({
-                    'stanza': iq,
-                    'jid': jid,
-                    'vcard_error': moment().format()
-                });
+                const ab = await crypto.subtle.digest('SHA-1', buffer);
+                result['image_hash'] = u.arrayBufferToHex(ab);
             }
+            return result;
         }
 
         function createStanza (type, jid, vcard_el) {
@@ -113,7 +99,7 @@ converse.plugins.add('converse-vcard', {
             return _converse.api.sendIQ(createStanza("set", jid, vcard_el));
         }
 
-        function getVCard (_converse, jid) {
+        async function getVCard (_converse, jid) {
             /* Request the VCard of another user. Returns a promise.
              *
              * Parameters:
@@ -121,14 +107,17 @@ converse.plugins.add('converse-vcard', {
              *      is being requested.
              */
             const to = Strophe.getBareJidFromJid(jid) === _converse.bare_jid ? null : jid;
-            return new Promise((resolve, reject) => {
-                _converse.connection.sendIQ(
-                    createStanza("get", to),
-                    _.partial(onVCardData, jid, _, resolve),
-                    _.partial(onVCardError, jid, _, resolve),
-                    _converse.IQ_TIMEOUT
-                );
-            });
+            let iq;
+            try {
+                iq = await _converse.api.sendIQ(createStanza("get", to))
+            } catch (iq) {
+                return {
+                    'stanza': iq,
+                    'jid': jid,
+                    'vcard_error': moment().format()
+                }
+            }
+            return onVCardData(jid, iq);
         }
 
         /* Event handlers */

+ 23 - 4
src/headless/package-lock.json

@@ -4,10 +4,29 @@
 	"lockfileVersion": 1,
 	"requires": true,
 	"dependencies": {
-		"lodash": {
-			"version": "4.17.10",
-			"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz",
-			"integrity": "sha512-UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg=="
+		"backbone.browserStorage": {
+			"version": "0.0.4",
+			"resolved": "https://registry.npmjs.org/backbone.browserStorage/-/backbone.browserStorage-0.0.4.tgz",
+			"integrity": "sha512-4LvDP2IkOu9Nt6kj6ft4moKmqKqm3c0WY3c/aie0Cf374wjFuO7vCh/afcKdu1YSuVsryM8yH90/J7yqWbaPHw==",
+			"requires": {
+				"backbone": "~1.x.x",
+				"underscore": ">=1.4.0"
+			},
+			"dependencies": {
+				"backbone": {
+					"version": "1.3.3",
+					"resolved": "https://registry.npmjs.org/backbone/-/backbone-1.3.3.tgz",
+					"integrity": "sha1-TMgOp8sWMaxHSInOQPL4vGg7KZk=",
+					"requires": {
+						"underscore": ">=1.8.3"
+					}
+				},
+				"underscore": {
+					"version": "1.9.1",
+					"resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.1.tgz",
+					"integrity": "sha512-5/4etnCkd9c8gwgowi5/om/mYO5ajCaOgdzj/oW+0eQV9WxKBDZw5+ycmKmeaTXjInS/W0BzpGLo2xR2aBwZdg=="
+				}
+			}
 		}
 	}
 }

+ 1 - 1
src/headless/package.json

@@ -23,7 +23,7 @@
   "gitHead": "9641dcdc820e029b05930479c242d2b707bbe8e2",
   "dependencies": {
     "backbone": "1.3.3",
-    "backbone.browserStorage": "0.0.4",
+    "backbone.browserStorage": "jcbrand/Backbone.browserStorage#03bfa13f68b71f97be361840adc5a5064f57b47e",
     "es6-promise": "^4.1.0",
     "filesize": "^3.6.1",
     "lodash": "^4.17.10",