瀏覽代碼

Throw error when sendIQ is called and we're not connected

This prevents `onVCardData` being called with no `result` IQ element.
JC Brand 1 年之前
父節點
當前提交
3db11bd887

+ 10 - 3
src/headless/plugins/vcard/utils.js

@@ -10,6 +10,7 @@ import api, { converse } from '../../shared/api/index.js';
 import log from "../../log.js";
 import { initStorage } from '../../utils/storage.js';
 import { shouldClearCache } from '../../utils/session.js';
+import { isElement } from 'utils/html.js';
 
 const { Strophe, $iq, u } = converse.env;
 
@@ -44,6 +45,11 @@ async function onVCardData (iq) {
 }
 
 
+/**
+ * @param {"get"|"set"|"result"} type
+ * @param {string} jid
+ * @param {Element} [vcard_el]
+ */
 export function createStanza (type, jid, vcard_el) {
     const iq = $iq(jid ? {'type': type, 'to': jid} : {'type': type});
     if (!vcard_el) {
@@ -213,11 +219,12 @@ export async function getVCard (jid) {
     let iq;
     try {
         iq = await api.sendIQ(createStanza("get", to))
-    } catch (iq) {
+    } catch (error) {
         return {
             jid,
-            'stanza': iq,
-            'vcard_error': (new Date()).toISOString()
+            error,
+            vcard: isElement(error) ? error : null,
+            vcard_error: (new Date()).toISOString()
         }
     }
     return onVCardData(iq);

+ 1 - 3
src/headless/shared/api/send.js

@@ -58,9 +58,7 @@ export default {
         const { api } = _converse;
 
         if (!api.connection.connected()) {
-            log.warn("Not sending IQ stanza because we're not connected!");
-            log.warn(Strophe.serialize(stanza));
-            return;
+            throw new Error("Not sending IQ stanza because we're not connected!");
         }
 
         const connection = api.connection.get();

+ 8 - 2
src/headless/types/plugins/vcard/utils.d.ts

@@ -1,4 +1,9 @@
-export function createStanza(type: any, jid: any, vcard_el: any): any;
+/**
+ * @param {"get"|"set"|"result"} type
+ * @param {string} jid
+ * @param {Element} [vcard_el]
+ */
+export function createStanza(type: "get" | "set" | "result", jid: string, vcard_el?: Element): any;
 /**
  * @param {ChatRoomOccupant} occupant
  */
@@ -24,7 +29,8 @@ export function getVCard(jid: string): Promise<{
     image_hash: any;
 } | {
     jid: string;
-    stanza: any;
+    error: any;
+    vcard: any;
     vcard_error: string;
 }>;
 export type ChatRoomOccupant = import('../muc/occupant.js').default;

+ 3 - 3
src/plugins/roomslist/tests/grouplists.js

@@ -1,6 +1,6 @@
 /* global mock, converse */
 
-const { $msg, u } = converse.env;
+const { u } = converse.env;
 
 
 describe("The list of MUC domains", function () {
@@ -92,13 +92,13 @@ describe("A MUC domain group", function () {
         await mock.waitForRoster(_converse, 'current', 0);
         await mock.openControlBox(_converse);
         const controlbox = _converse.chatboxviews.get('controlbox');
-        let list = controlbox.querySelector('.list-container--openrooms');
+        const list = controlbox.querySelector('.list-container--openrooms');
         await mock.openChatRoom(_converse, 'room', 'conference.shakespeare.lit', 'JC');
 
         const lview = controlbox.querySelector('converse-rooms-list');
         await u.waitUntil(() => lview.querySelectorAll(".muc-domain-group").length);
         expect(u.hasClass('hidden', list)).toBeFalsy();
-        let group_els = lview.querySelectorAll(".muc-domain-group");
+        const group_els = lview.querySelectorAll(".muc-domain-group");
         expect(group_els.length).toBe(1);
         expect(group_els[0].children[0].innerText.trim()).toBe('conference.shakespeare.lit');