Просмотр исходного кода

WIP: cache and handle SMACKS received messages

JC Brand 5 лет назад
Родитель
Сommit
79acee44d1
5 измененных файлов с 77 добавлено и 13 удалено
  1. 7 7
      package-lock.json
  2. 64 0
      spec/smacks.js
  3. 0 4
      src/headless/converse-mam.js
  4. 5 1
      src/headless/converse-smacks.js
  5. 1 1
      webpack.html

+ 7 - 7
package-lock.json

@@ -14188,7 +14188,7 @@
 				},
 				"camelcase-keys": {
 					"version": "2.1.0",
-					"resolved": "http://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
+					"resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz",
 					"integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=",
 					"dev": true,
 					"requires": {
@@ -14198,7 +14198,7 @@
 				},
 				"chalk": {
 					"version": "1.1.3",
-					"resolved": "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+					"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
 					"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
 					"dev": true,
 					"requires": {
@@ -14240,7 +14240,7 @@
 				},
 				"load-json-file": {
 					"version": "1.1.0",
-					"resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+					"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
 					"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
 					"dev": true,
 					"requires": {
@@ -14259,7 +14259,7 @@
 				},
 				"meow": {
 					"version": "3.7.0",
-					"resolved": "http://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
+					"resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz",
 					"integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=",
 					"dev": true,
 					"requires": {
@@ -19126,7 +19126,7 @@
 		},
 		"pinkie-promise": {
 			"version": "2.0.1",
-			"resolved": "http://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+			"resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
 			"integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
 			"dev": true,
 			"requires": {
@@ -20617,7 +20617,7 @@
 				},
 				"load-json-file": {
 					"version": "1.1.0",
-					"resolved": "http://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
+					"resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz",
 					"integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=",
 					"dev": true,
 					"requires": {
@@ -20630,7 +20630,7 @@
 				},
 				"os-locale": {
 					"version": "1.4.0",
-					"resolved": "http://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
+					"resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz",
 					"integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=",
 					"dev": true,
 					"requires": {

+ 64 - 0
spec/smacks.js

@@ -3,6 +3,7 @@
 } (this, function (jasmine, mock, test_utils) {
     "use strict";
     const $iq = converse.env.$iq;
+    const $msg = converse.env.$msg;
     const Strophe = converse.env.Strophe;
     const sizzle = converse.env.sizzle;
     const u = converse.env.utils;
@@ -178,5 +179,68 @@
             await test_utils.waitForRoster(_converse, 'current', 1);
             done();
         }));
+
+
+        it("will handle MUC messages sent during disconnection",
+            mock.initConverse(
+                ['chatBoxesInitialized'],
+                { 'auto_login': false,
+                  'enable_smacks': true,
+                  'show_controlbox_by_default': true,
+                  'blacklisted_plugins': 'converse-mam',
+                  'smacks_max_unacked_stanzas': 2
+                },
+                async function (done, _converse) {
+
+
+            const key = "converse-test-session/converse.session-romeo@montague.lit-converse.session-romeo@montague.lit";
+            sessionStorage.setItem(
+                key,
+                JSON.stringify({
+                    "id": "converse.session-romeo@montague.lit",
+                    "jid": "romeo@montague.lit/converse.js-100020907",
+                    "bare_jid": "romeo@montague.lit",
+                    "resource": "converse.js-100020907",
+                    "domain": "montague.lit",
+                    "active": false,
+                    "smacks_enabled": true,
+                    "num_stanzas_handled": 580,
+                    "num_stanzas_handled_by_server": 525,
+                    "num_stanzas_since_last_ack": 0,
+                    "unacked_stanzas": [],
+                    "smacks_stream_id": "some-long-sm-id",
+                    "push_enabled": ["romeo@montague.lit"],
+                    "carbons_enabled": true,
+                    "roster_cached": true
+                })
+            )
+            _converse.api.user.login('romeo@montague.lit', 'secret');
+            const sent_stanzas = _converse.connection.sent_stanzas;
+            const stanza = await u.waitUntil(() => sent_stanzas.filter(s => (s.tagName === 'resume')).pop());
+            expect(Strophe.serialize(stanza)).toEqual('<resume h="580" previd="some-long-sm-id" xmlns="urn:xmpp:sm:3"/>');
+
+            const result = u.toStanza(`<resumed xmlns="urn:xmpp:sm:3" h="another-sequence-number" previd="some-long-sm-id"/>`);
+            _converse.connection._dataRecv(test_utils.createRequest(result));
+            expect(_converse.session.get('smacks_enabled')).toBe(true);
+
+            const muc_jid = 'lounge@montague.lit/some1';
+            // A MUC message gets received
+            const msg = $msg({
+                    from: muc_jid,
+                    id: u.getUniqueId(),
+                    to: 'romeo@montague.lit',
+                    type: 'groupchat'
+                }).c('body').t('First message').tree();
+            _converse.connection._dataRecv(test_utils.createRequest(msg));
+            expect(_converse.session.get('smacks_received_stanzas').length).toBe(1);
+
+            await _converse.api.waitUntil('statusInitialized');
+
+            // Test now that when a MUC gets opened, it checks whether there
+            // are SMACKS messages waiting for it.
+            await test_utils.openAndEnterChatRoom(_converse, muc_jid, 'romeo');
+            await u.waitUntil(() => view.el.querySelectorAll('.chat-msg').length === 1);
+            done();
+        }));
     });
 }));

+ 0 - 4
src/headless/converse-mam.js

@@ -130,10 +130,6 @@ converse.plugins.add('converse-mam', {
         Object.assign(_converse.ChatBox.prototype, MAMEnabledChat);
 
 
-        Object.assign(_converse.ChatRoom.prototype, {
-        });
-
-
         _converse.onMAMError = function (iq) {
             if (iq && iq.querySelectorAll('feature-not-implemented').length) {
                 log.warn("Message Archive Management (XEP-0313) not supported by this server");

+ 5 - 1
src/headless/converse-smacks.js

@@ -78,7 +78,11 @@ converse.plugins.add('converse-smacks', {
             if (_converse.session.get('smacks_enabled')) {
                 if (u.isTagEqual(el, 'iq') || u.isTagEqual(el, 'presence') || u.isTagEqual(el, 'message'))  {
                     const h = _converse.session.get('num_stanzas_handled');
-                    _converse.session.save('num_stanzas_handled', h+1);
+                    const r = _converse.session.get('smacks_received_stanzas') || [];
+                    _converse.session.save({
+                        'smacks_received_stanzas': [...r, el],
+                        'num_stanzas_handled': h+1
+                    });
                 }
             }
             return true;

+ 1 - 1
webpack.html

@@ -29,7 +29,7 @@
         persistent_store: 'IndexedDB',
         muc_domain: 'conference.chat.example.org',
         muc_respect_autojoin: true,
-        view_mode: 'overlayed',
+        view_mode: 'fullscreen',
         websocket_url: 'ws://chat.example.org:5380/xmpp-websocket',
         // bosh_service_url: 'http://chat.example.org:5280/http-bind',
         muc_show_logs_before_join: true,