Skip to content

Commit e8a26eb

Browse files
committed
Store the roster version
updates #1106
1 parent 43d0932 commit e8a26eb

File tree

3 files changed

+57
-11
lines changed

3 files changed

+57
-11
lines changed

spec/protocol.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@
210210
* </iq>
211211
*/
212212
spyOn(_converse.roster, "updateContact").and.callThrough();
213-
stanza = $iq({'type': 'set', 'from': 'dummy@localhost'})
213+
stanza = $iq({'type': 'set', 'from': _converse.connection.jid})
214214
.c('query', {'xmlns': 'jabber:iq:roster'})
215215
.c('item', {
216216

spec/roster.js

+37
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,43 @@
3535

3636
describe("The Contacts Roster", function () {
3737

38+
it("supports roster versioning",
39+
mock.initConverseWithPromises(
40+
null, ['rosterGroupsFetched'], {},
41+
function (done, _converse) {
42+
43+
var IQ_stanzas = _converse.connection.IQ_stanzas;
44+
var stanza;
45+
46+
test_utils.waitUntil(() => {
47+
const node = _.filter(IQ_stanzas, function (iq) {
48+
return iq.nodeTree.querySelector('iq query[xmlns="jabber:iq:roster"]');
49+
}).pop();
50+
if (node) {
51+
stanza = node.nodeTree;
52+
return true;
53+
}
54+
}).then(() => {
55+
expect(_converse.roster.data.get('version')).toBeUndefined();
56+
expect(stanza.outerHTML).toBe(
57+
`<iq type="get" id="${stanza.getAttribute('id')}" xmlns="jabber:client">`+
58+
`<query xmlns="jabber:iq:roster"/>`+
59+
`</iq>`);
60+
const result = $iq({
61+
'to': _converse.connection.jid,
62+
'type': 'result',
63+
'id': stanza.getAttribute('id')
64+
}).c('query', {
65+
'xmlns': 'jabber:iq:roster',
66+
'ver': 'ver7'
67+
}).c('item', {'jid': '[email protected]'}).up()
68+
.c('item', {'jid': '[email protected]'})
69+
_converse.connection._dataRecv(test_utils.createRequest(result));
70+
expect(_converse.roster.data.get('version')).toBe('ver7');
71+
done();
72+
});
73+
}));
74+
3875
describe("The live filter", function () {
3976

4077
it("will only appear when roster contacts flow over the visible area",

src/converse-roster.js

+19-10
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,13 @@
4848
_converse.roster = new _converse.RosterContacts();
4949
_converse.roster.browserStorage = new Backbone.BrowserStorage[_converse.storage](
5050
b64_sha1(`converse.contacts-${_converse.bare_jid}`));
51+
52+
_converse.roster.data = new Backbone.Model();
53+
const id = b64_sha1(`converse-roster-model-${_converse.bare_jid}`);
54+
_converse.roster.data.id = id;
55+
_converse.roster.data.browserStorage = new Backbone.BrowserStorage[_converse.storage](id);
56+
_converse.roster.data.fetch();
57+
5158
_converse.rostergroups = new _converse.RosterGroups();
5259
_converse.rostergroups.browserStorage = new Backbone.BrowserStorage[_converse.storage](
5360
b64_sha1(`converse.roster.groups${_converse.bare_jid}`));
@@ -330,18 +337,18 @@
330337

331338
onConnected () {
332339
/* Called as soon as the connection has been established
333-
* (either after initial login, or after reconnection).
334-
*
335-
* Use the opportunity to register stanza handlers.
336-
*/
340+
* (either after initial login, or after reconnection).
341+
*
342+
* Use the opportunity to register stanza handlers.
343+
*/
337344
this.registerRosterHandler();
338345
this.registerRosterXHandler();
339346
},
340347

341348
registerRosterHandler () {
342349
/* Register a handler for roster IQ "set" stanzas, which update
343-
* roster contacts.
344-
*/
350+
* roster contacts.
351+
*/
345352
_converse.connection.addHandler((iq) => {
346353
_converse.roster.onRosterPush(iq);
347354
return true;
@@ -350,8 +357,8 @@
350357

351358
registerRosterXHandler () {
352359
/* Register a handler for RosterX message stanzas, which are
353-
* used to suggest roster contacts to a user.
354-
*/
360+
* used to suggest roster contacts to a user.
361+
*/
355362
let t = 0;
356363
_converse.connection.addHandler(
357364
function (msg) {
@@ -560,8 +567,10 @@
560567
/* An IQ stanza containing the roster has been received from
561568
* the XMPP server.
562569
*/
563-
const items = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"] item`, iq);
564-
_.each(items, this.updateContact.bind(this));
570+
const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop(),
571+
items = sizzle(`item`, query);
572+
_.each(items, (item) => this.updateContact(item));
573+
this.data.save('version', query.getAttribute('ver'));
565574
_converse.emit('roster', iq);
566575
},
567576

0 commit comments

Comments
 (0)