diff --git a/src/headless/plugins/carbons.js b/src/headless/plugins/carbons.js index de1a88e03..0d3f031e2 100644 --- a/src/headless/plugins/carbons.js +++ b/src/headless/plugins/carbons.js @@ -5,38 +5,46 @@ * @description Implements support for XEP-0280 Message Carbons */ -import log from '@converse/headless/log'; +import log from '@converse/headless/log.js'; import { Strophe } from 'strophe.js/src/strophe'; import { _converse, api, converse } from "../core.js"; +const { u } = converse.env; -/* Ask the XMPP server to enable Message Carbons - * See XEP-0280 https://xmpp.org/extensions/xep-0280.html#enabling + +/** + * Ask the XMPP server to enable Message Carbons + * See [XEP-0280](https://xmpp.org/extensions/xep-0280.html#enabling) */ -function enableCarbons (reconnecting) { - if (reconnecting) { - _converse.session?.set({'carbons_enabled': false}) +async function enableCarbons (reconnecting) { + if (reconnecting && _converse.session.get('carbons_enabled')) { + if (_converse.session.get('smacks_enabled')) { + // No need to re-enable carbons when resuming a XEP-0198 stream + return; + } + _converse.session.set({'carbons_enabled': false}) } + if (!api.settings.get("message_carbons") || _converse.session?.get('carbons_enabled')) { return; } - const carbons_iq = new Strophe.Builder('iq', { - 'from': _converse.connection.jid, - 'id': 'enablecarbons', - 'type': 'set' - }) - .c('enable', {xmlns: Strophe.NS.CARBONS}); - _converse.connection.addHandler((iq) => { - if (iq.querySelectorAll('error').length > 0) { - log.warn('An error occurred while trying to enable message carbons.'); - } else { - _converse.session.set({'carbons_enabled': true}); - log.debug('Message carbons have been enabled.'); - } - _converse.session.save(); // Gather multiple sets into one save - }, null, "iq", null, "enablecarbons"); - _converse.connection.send(carbons_iq); + const iq = new Strophe.Builder('iq', { + 'from': _converse.connection.jid, + 'type': 'set' + }).c('enable', {xmlns: Strophe.NS.CARBONS}); + + const result = await api.sendIQ(iq, null, false); + if (result === null) { + log.warn(`A timeout occurred while trying to enable carbons`); + } else if (u.isErrorStanza(result)) { + log.warn('An error occurred while trying to enable message carbons.'); + log.error(result); + } else { + _converse.session.set({'carbons_enabled': true}); + log.debug('Message carbons have been enabled.'); + } + _converse.session.save(); // Gather multiple sets into one save } @@ -47,6 +55,7 @@ converse.plugins.add('converse-carbons', { message_carbons: true }); - api.listen.on('afterResourceBinding', enableCarbons); + api.listen.on('connected', () => enableCarbons()); + api.listen.on('reconnected', () => enableCarbons(true)); } });