Commit c038794f authored by JC Brand's avatar JC Brand

converse-mam: Light refactoring and cleanup

parent c2db6673
...@@ -11,10 +11,11 @@ ...@@ -11,10 +11,11 @@
*/ */
import "./converse-disco"; import "./converse-disco";
import "./converse-rsm"; import "./converse-rsm";
import { intersection, pick } from 'lodash'
import converse from "./converse-core"; import converse from "./converse-core";
import sizzle from "sizzle"; import sizzle from "sizzle";
const { Strophe, $iq, $build, _, dayjs } = converse.env; const { Strophe, $iq, $build, dayjs } = converse.env;
const u = converse.env.utils; const u = converse.env.utils;
// XEP-0313 Message Archive Management // XEP-0313 Message Archive Management
...@@ -64,16 +65,17 @@ converse.plugins.add('converse-mam', { ...@@ -64,16 +65,17 @@ converse.plugins.add('converse-mam', {
const MAMEnabledChat = { const MAMEnabledChat = {
/**
* Fetches messages that might have been archived *after*
* the last archived message in our local cache.
*/
fetchNewestMessages () { fetchNewestMessages () {
/* Fetches messages that might have been archived *after*
* the last archived message in our local cache.
*/
if (this.disable_mam) { if (this.disable_mam) {
return; return;
} }
const most_recent_msg = u.getMostRecentMessage(this); const most_recent_msg = u.getMostRecentMessage(this);
if (_.isNil(most_recent_msg)) { if (!most_recent_msg) {
this.fetchArchivedMessages(); this.fetchArchivedMessages();
} else { } else {
const stanza_id = most_recent_msg.get(`stanza_id ${this.get('jid')}`); const stanza_id = most_recent_msg.get(`stanza_id ${this.get('jid')}`);
...@@ -100,24 +102,14 @@ converse.plugins.add('converse-mam', { ...@@ -100,24 +102,14 @@ converse.plugins.add('converse-mam', {
} else { } else {
message_handler = _converse.chatboxes.onMessage.bind(_converse.chatboxes) message_handler = _converse.chatboxes.onMessage.bind(_converse.chatboxes)
} }
let result = {}; const result = await _converse.api.archive.query(
try { Object.assign({
result = await _converse.api.archive.query( 'groupchat': is_groupchat,
Object.assign({ 'before': '', // Page backwards from the most recent message
'groupchat': is_groupchat, 'max': _converse.archived_messages_page_size,
'before': '', // Page backwards from the most recent message 'with': this.get('jid'),
'max': _converse.archived_messages_page_size, }, options));
'with': this.get('jid'), result.messages.forEach(message_handler);
}, options));
} catch (e) {
_converse.log(
"Error or timeout while trying to fetch "+
"archived messages", Strophe.LogLevel.ERROR);
_converse.log(e, Strophe.LogLevel.ERROR);
}
if (result.messages) {
result.messages.forEach(message_handler);
}
}, },
async findDuplicateFromArchiveID (stanza) { async findDuplicateFromArchiveID (stanza) {
...@@ -165,7 +157,7 @@ converse.plugins.add('converse-mam', { ...@@ -165,7 +157,7 @@ converse.plugins.add('converse-mam', {
} }
}; };
_converse.onMAMPreferences = function (feature, iq) { _converse.onMAMPreferences = function (iq, feature) {
/* Handle returned IQ stanza containing Message Archive /* Handle returned IQ stanza containing Message Archive
* Management (XEP-0313) preferences. * Management (XEP-0313) preferences.
* *
...@@ -184,7 +176,7 @@ converse.plugins.add('converse-mam', { ...@@ -184,7 +176,7 @@ converse.plugins.add('converse-mam', {
'xmlns':Strophe.NS.MAM, 'xmlns':Strophe.NS.MAM,
'default':_converse.message_archiving 'default':_converse.message_archiving
}); });
_.each(preference.children, child => stanza.cnode(child).up()); Array.from(preference.children).forEach(child => stanza.cnode(child).up());
// XXX: Strictly speaking, the server should respond with the updated prefs // XXX: Strictly speaking, the server should respond with the updated prefs
// (see example 18: https://xmpp.org/extensions/xep-0313.html#config) // (see example 18: https://xmpp.org/extensions/xep-0313.html#config)
...@@ -205,7 +197,7 @@ converse.plugins.add('converse-mam', { ...@@ -205,7 +197,7 @@ converse.plugins.add('converse-mam', {
} }
if (prefs['default'] !== _converse.message_archiving) { if (prefs['default'] !== _converse.message_archiving) {
_converse.api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM})) _converse.api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM}))
.then(_.partial(_converse.onMAMPreferences, feature)) .then(iq => _converse.onMAMPreferences(iq, feature))
.catch(_converse.onMAMError); .catch(_converse.onMAMError);
} }
} }
...@@ -418,7 +410,7 @@ converse.plugins.add('converse-mam', { ...@@ -418,7 +410,7 @@ converse.plugins.add('converse-mam', {
* result.messages.forEach(m => this.showMessage(m)); * result.messages.forEach(m => this.showMessage(m));
* *
*/ */
'query': async function (options) { async query (options) {
if (!_converse.api.connection.connected()) { if (!_converse.api.connection.connected()) {
throw new Error('Can\'t call `api.archive.query` before having established an XMPP session'); throw new Error('Can\'t call `api.archive.query` before having established an XMPP session');
} }
...@@ -474,30 +466,29 @@ converse.plugins.add('converse-mam', { ...@@ -474,30 +466,29 @@ converse.plugins.add('converse-mam', {
return true; return true;
} }
const result = message.querySelector('result'); const result = message.querySelector('result');
if (!_.isNull(result) && result.getAttribute('queryid') === queryid) { if (result !== null && result.getAttribute('queryid') === queryid) {
messages.push(message); messages.push(message);
} }
return true; return true;
}, Strophe.NS.MAM); }, Strophe.NS.MAM);
let iq; let iq_result, rsm;
try { try {
iq = await _converse.api.sendIQ(stanza, _converse.message_archiving_timeout) iq_result = await _converse.api.sendIQ(stanza, _converse.message_archiving_timeout)
} catch (e) { } catch (e) {
_converse.connection.deleteHandler(message_handler); _converse.log(
throw(e); "Error or timeout while trying to fetch "+
"archived messages", Strophe.LogLevel.ERROR);
_converse.log(e, Strophe.LogLevel.ERROR);
} }
_converse.connection.deleteHandler(message_handler); _converse.connection.deleteHandler(message_handler);
const set = iq.querySelector('set');
let rsm; const set = iq_result ? iq_result.querySelector('set') : null;
if (!_.isNull(set)) { if (set !== null) {
rsm = new _converse.RSM({'xml': set}); rsm = new _converse.RSM({'xml': set});
Object.assign(rsm, _.pick(options, _.concat(MAM_ATTRIBUTES, ['max']))); Object.assign(rsm, _.pick(options, _.concat(MAM_ATTRIBUTES, ['max'])));
} }
return { return { messages, rsm }
messages,
rsm
}
} }
} }
}); });
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment