Split smacks plugin up into multiple files

This commit is contained in:
JC Brand 2021-04-28 18:50:54 +02:00
parent 3d58b67517
commit 754f1fcb25
5 changed files with 61 additions and 62 deletions

View File

@ -35,7 +35,6 @@ module.exports = function(config) {
{ pattern: "spec/protocol.js", type: 'module' }, { pattern: "spec/protocol.js", type: 'module' },
{ pattern: "spec/push.js", type: 'module' }, { pattern: "spec/push.js", type: 'module' },
{ pattern: "spec/retractions.js", type: 'module' }, { pattern: "spec/retractions.js", type: 'module' },
{ pattern: "spec/smacks.js", type: 'module' },
{ pattern: "spec/styling.js", type: 'module' }, { pattern: "spec/styling.js", type: 'module' },
{ pattern: "spec/unfurls.js", type: 'module' }, { pattern: "spec/unfurls.js", type: 'module' },
{ pattern: "spec/user-details-modal.js", type: 'module' }, { pattern: "spec/user-details-modal.js", type: 'module' },
@ -45,6 +44,7 @@ module.exports = function(config) {
{ pattern: "src/headless/plugins/disco/tests/disco.js", type: 'module' }, { pattern: "src/headless/plugins/disco/tests/disco.js", type: 'module' },
{ pattern: "src/headless/plugins/muc/tests/affiliations.js", type: 'module' }, { pattern: "src/headless/plugins/muc/tests/affiliations.js", type: 'module' },
{ pattern: "src/headless/plugins/ping/tests/ping.js", type: 'module' }, { pattern: "src/headless/plugins/ping/tests/ping.js", type: 'module' },
{ pattern: "src/headless/plugins/smacks/tests/smacks.js", type: 'module' },
{ pattern: "src/plugins/bookmark-views/tests/bookmarks.js", type: 'module' }, { pattern: "src/plugins/bookmark-views/tests/bookmarks.js", type: 'module' },
{ pattern: "src/plugins/chatview/tests/chatbox.js", type: 'module' }, { pattern: "src/plugins/chatview/tests/chatbox.js", type: 'module' },
{ pattern: "src/plugins/chatview/tests/corrections.js", type: 'module' }, { pattern: "src/plugins/chatview/tests/corrections.js", type: 'module' },

View File

@ -16,7 +16,7 @@ import "./plugins/muc/index.js"; // XEP-0045 Multi-user chat
import "./plugins/ping/index.js"; // XEP-0199 XMPP Ping import "./plugins/ping/index.js"; // XEP-0199 XMPP Ping
import "./plugins/pubsub.js"; // XEP-0060 Pubsub import "./plugins/pubsub.js"; // XEP-0060 Pubsub
import "./plugins/roster/index.js"; // RFC-6121 Contacts Roster import "./plugins/roster/index.js"; // RFC-6121 Contacts Roster
import "./plugins/smacks.js"; // XEP-0198 Stream Management import "./plugins/smacks/index.js"; // XEP-0198 Stream Management
import "./plugins/status.js"; // XEP-0199 XMPP Ping import "./plugins/status.js"; // XEP-0199 XMPP Ping
import "./plugins/vcard.js"; // XEP-0054 VCard-temp import "./plugins/vcard.js"; // XEP-0054 VCard-temp
/* END: Removable components */ /* END: Removable components */

View File

@ -0,0 +1,28 @@
/**
* @copyright The Converse.js contributors
* @license Mozilla Public License (MPLv2)
* @description Converse.js plugin which adds support for XEP-0198: Stream Management
*/
import { api, converse } from '@converse/headless/core.js';
import { enableStreamManagement, initSessionData, sendEnableStanza, onStanzaSent } from './utils.js';
const { Strophe } = converse.env;
Strophe.addNamespace('SM', 'urn:xmpp:sm:3');
converse.plugins.add('converse-smacks', {
initialize () {
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
api.settings.extend({
'enable_smacks': true,
'smacks_max_unacked_stanzas': 5
});
api.listen.on('afterResourceBinding', sendEnableStanza);
api.listen.on('beforeResourceBinding', enableStreamManagement);
api.listen.on('send', onStanzaSent);
api.listen.on('userSessionInitialized', initSessionData);
}
});

View File

@ -1,19 +1,10 @@
/** import log from '@converse/headless/log.js';
* @copyright The Converse.js contributors import { _converse, api, converse } from '@converse/headless/core.js';
* @license Mozilla Public License (MPLv2)
* @description Converse.js plugin which adds support for XEP-0198: Stream Management
*/
import log from "../log.js";
import { _converse, api, converse } from "../core.js";
import { getOpenPromise } from '@converse/openpromise'; import { getOpenPromise } from '@converse/openpromise';
const { Strophe } = converse.env; const { Strophe } = converse.env;
const u = converse.env.utils; const u = converse.env.utils;
Strophe.addNamespace('SM', 'urn:xmpp:sm:3');
function isStreamManagementSupported () { function isStreamManagementSupported () {
if (api.connection.isType('bosh') && !_converse.isTestEnv()) { if (api.connection.isType('bosh') && !_converse.isTestEnv()) {
return false; return false;
@ -30,17 +21,17 @@ function handleAck (el) {
const delta = handled - last_known_handled; const delta = handled - last_known_handled;
if (delta < 0) { if (delta < 0) {
const err_msg = `New reported stanza count lower than previous. `+ const err_msg =
`New: ${handled} - Previous: ${last_known_handled}` `New reported stanza count lower than previous. ` + `New: ${handled} - Previous: ${last_known_handled}`;
log.error(err_msg); log.error(err_msg);
} }
const unacked_stanzas = _converse.session.get('unacked_stanzas'); const unacked_stanzas = _converse.session.get('unacked_stanzas');
if (delta > unacked_stanzas.length) { if (delta > unacked_stanzas.length) {
const err_msg = const err_msg =
`Higher reported acknowledge count than unacknowledged stanzas. `+ `Higher reported acknowledge count than unacknowledged stanzas. ` +
`Reported Acknowledged Count: ${delta} -`+ `Reported Acknowledged Count: ${delta} -` +
`Unacknowledged Stanza Count: ${unacked_stanzas.length} -`+ `Unacknowledged Stanza Count: ${unacked_stanzas.length} -` +
`New: ${handled} - Previous: ${last_known_handled}` `New: ${handled} - Previous: ${last_known_handled}`;
log.error(err_msg); log.error(err_msg);
} }
_converse.session.save({ _converse.session.save({
@ -51,7 +42,7 @@ function handleAck (el) {
return true; return true;
} }
function sendAck() { function sendAck () {
if (_converse.session.get('smacks_enabled')) { if (_converse.session.get('smacks_enabled')) {
const h = _converse.session.get('num_stanzas_handled'); const h = _converse.session.get('num_stanzas_handled');
const stanza = u.toStanza(`<a xmlns="${Strophe.NS.SM}" h="${h}"/>`); const stanza = u.toStanza(`<a xmlns="${Strophe.NS.SM}" h="${h}"/>`);
@ -62,15 +53,15 @@ function sendAck() {
function stanzaHandler (el) { function stanzaHandler (el) {
if (_converse.session.get('smacks_enabled')) { if (_converse.session.get('smacks_enabled')) {
if (u.isTagEqual(el, 'iq') || u.isTagEqual(el, 'presence') || u.isTagEqual(el, 'message')) { if (u.isTagEqual(el, 'iq') || u.isTagEqual(el, 'presence') || u.isTagEqual(el, 'message')) {
const h = _converse.session.get('num_stanzas_handled'); const h = _converse.session.get('num_stanzas_handled');
_converse.session.save('num_stanzas_handled', h+1); _converse.session.save('num_stanzas_handled', h + 1);
} }
} }
return true; return true;
} }
function initSessionData () { export function initSessionData () {
_converse.session.save({ _converse.session.save({
'smacks_enabled': _converse.session.get('smacks_enabled') || false, 'smacks_enabled': _converse.session.get('smacks_enabled') || false,
'num_stanzas_handled': _converse.session.get('num_stanzas_handled') || 0, 'num_stanzas_handled': _converse.session.get('num_stanzas_handled') || 0,
@ -81,17 +72,18 @@ function initSessionData () {
} }
function resetSessionData () { function resetSessionData () {
_converse.session && _converse.session.save({ _converse.session &&
'smacks_enabled': false, _converse.session.save({
'num_stanzas_handled': 0, 'smacks_enabled': false,
'num_stanzas_handled_by_server': 0, 'num_stanzas_handled': 0,
'num_stanzas_since_last_ack': 0, 'num_stanzas_handled_by_server': 0,
'unacked_stanzas': [] 'num_stanzas_since_last_ack': 0,
}); 'unacked_stanzas': []
});
} }
function saveSessionData (el) { function saveSessionData (el) {
const data = {'smacks_enabled': true}; const data = { 'smacks_enabled': true };
if (['1', 'true'].includes(el.getAttribute('resume'))) { if (['1', 'true'].includes(el.getAttribute('resume'))) {
data['smacks_stream_id'] = el.getAttribute('id'); data['smacks_stream_id'] = el.getAttribute('id');
} }
@ -107,8 +99,9 @@ function onFailedStanza (el) {
// //
// After resource binding, sendEnableStanza will be called // After resource binding, sendEnableStanza will be called
// based on the afterResourceBinding event. // based on the afterResourceBinding event.
log.warn('Could not resume previous SMACKS session, session id not found. '+ log.warn(
'A new session will be established.'); 'Could not resume previous SMACKS session, session id not found. ' + 'A new session will be established.'
);
} else { } else {
log.error('Failed to enable stream management'); log.error('Failed to enable stream management');
log.error(el.outerHTML); log.error(el.outerHTML);
@ -118,7 +111,7 @@ function onFailedStanza (el) {
* Triggered when the XEP-0198 stream could not be resumed. * Triggered when the XEP-0198 stream could not be resumed.
* @event _converse#streamResumptionFailed * @event _converse#streamResumptionFailed
*/ */
api.trigger('streamResumptionFailed'); api.trigger('streamResumptionFailed');
return true; return true;
} }
@ -170,7 +163,7 @@ async function sendResumeStanza () {
await promise; await promise;
} }
async function sendEnableStanza () { export async function sendEnableStanza () {
if (!api.settings.get('enable_smacks') || _converse.session.get('smacks_enabled')) { if (!api.settings.get('enable_smacks') || _converse.session.get('smacks_enabled')) {
return; return;
} }
@ -179,7 +172,7 @@ async function sendEnableStanza () {
_converse.connection._addSysHandler(el => promise.resolve(saveSessionData(el)), Strophe.NS.SM, 'enabled'); _converse.connection._addSysHandler(el => promise.resolve(saveSessionData(el)), Strophe.NS.SM, 'enabled');
_converse.connection._addSysHandler(el => promise.resolve(onFailedStanza(el)), Strophe.NS.SM, 'failed'); _converse.connection._addSysHandler(el => promise.resolve(onFailedStanza(el)), Strophe.NS.SM, 'failed');
const resume = (api.connection.isType('websocket') || _converse.isTestEnv()); const resume = api.connection.isType('websocket') || _converse.isTestEnv();
const stanza = u.toStanza(`<enable xmlns="${Strophe.NS.SM}" resume="${resume}"/>`); const stanza = u.toStanza(`<enable xmlns="${Strophe.NS.SM}" resume="${resume}"/>`);
api.send(stanza); api.send(stanza);
_converse.connection.flush(); _converse.connection.flush();
@ -189,7 +182,7 @@ async function sendEnableStanza () {
const smacks_handlers = []; const smacks_handlers = [];
async function enableStreamManagement () { export async function enableStreamManagement () {
if (!api.settings.get('enable_smacks')) { if (!api.settings.get('enable_smacks')) {
return; return;
} }
@ -210,7 +203,7 @@ async function enableStreamManagement () {
} }
} }
function onStanzaSent (stanza) { export function onStanzaSent (stanza) {
if (!_converse.session) { if (!_converse.session) {
log.warn('No _converse.session!'); log.warn('No _converse.session!');
return; return;
@ -218,10 +211,7 @@ function onStanzaSent (stanza) {
if (!_converse.session.get('smacks_enabled')) { if (!_converse.session.get('smacks_enabled')) {
return; return;
} }
if (u.isTagEqual(stanza, 'iq') || if (u.isTagEqual(stanza, 'iq') || u.isTagEqual(stanza, 'presence') || u.isTagEqual(stanza, 'message')) {
u.isTagEqual(stanza, 'presence') ||
u.isTagEqual(stanza, 'message')) {
const stanza_string = Strophe.serialize(stanza); const stanza_string = Strophe.serialize(stanza);
_converse.session.save( _converse.session.save(
'unacked_stanzas', 'unacked_stanzas',
@ -234,26 +224,7 @@ function onStanzaSent (stanza) {
// Request confirmation of sent stanzas // Request confirmation of sent stanzas
api.send(u.toStanza(`<r xmlns="${Strophe.NS.SM}"/>`)); api.send(u.toStanza(`<r xmlns="${Strophe.NS.SM}"/>`));
} }
_converse.session.save({'num_stanzas_since_last_ack': num}); _converse.session.save({ 'num_stanzas_since_last_ack': num });
} }
} }
} }
converse.plugins.add('converse-smacks', {
initialize () {
// Configuration values for this plugin
// ====================================
// Refer to docs/source/configuration.rst for explanations of these
// configuration settings.
api.settings.extend({
'enable_smacks': true,
'smacks_max_unacked_stanzas': 5,
});
api.listen.on('afterResourceBinding', sendEnableStanza);
api.listen.on('beforeResourceBinding', enableStreamManagement);
api.listen.on('send', onStanzaSent);
api.listen.on('userSessionInitialized', initSessionData);
}
});