2019-06-05 10:01:55 +02:00
|
|
|
// Converse.js
|
|
|
|
// http://conversejs.org
|
|
|
|
//
|
|
|
|
// Copyright (c) The Converse.js developers
|
|
|
|
// Licensed under the Mozilla Public License (MPLv2)
|
2019-07-11 10:48:52 +02:00
|
|
|
/**
|
|
|
|
* @module converse-bosh
|
|
|
|
* @description
|
|
|
|
* Converse.js plugin which add support for XEP-0206: XMPP Over BOSH
|
|
|
|
*/
|
2019-09-24 15:38:34 +02:00
|
|
|
import 'strophe.js/src/bosh';
|
2019-06-05 10:01:55 +02:00
|
|
|
import converse from "./converse-core";
|
2019-11-06 11:01:34 +01:00
|
|
|
import log from "./log";
|
2019-06-05 10:01:55 +02:00
|
|
|
|
2019-10-09 16:01:38 +02:00
|
|
|
const { Backbone, Strophe } = converse.env;
|
2019-06-05 10:01:55 +02:00
|
|
|
|
2019-07-29 10:08:38 +02:00
|
|
|
const BOSH_SESSION_ID = 'converse.bosh-session';
|
|
|
|
|
2019-06-05 10:01:55 +02:00
|
|
|
|
|
|
|
converse.plugins.add('converse-bosh', {
|
|
|
|
|
2018-11-18 19:14:22 +01:00
|
|
|
enabled () {
|
|
|
|
return true;
|
|
|
|
},
|
|
|
|
|
2019-06-05 10:01:55 +02:00
|
|
|
initialize () {
|
|
|
|
const { _converse } = this;
|
|
|
|
|
|
|
|
_converse.api.settings.update({
|
|
|
|
bosh_service_url: undefined,
|
|
|
|
prebind_url: null
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
async function initBOSHSession () {
|
2019-07-29 10:08:38 +02:00
|
|
|
const id = BOSH_SESSION_ID;
|
2019-06-05 10:01:55 +02:00
|
|
|
if (!_converse.bosh_session) {
|
|
|
|
_converse.bosh_session = new Backbone.Model({id});
|
2019-10-11 20:29:12 +02:00
|
|
|
_converse.bosh_session.browserStorage = _converse.createStore(id, "session");
|
2019-06-05 10:01:55 +02:00
|
|
|
await new Promise(resolve => _converse.bosh_session.fetch({'success': resolve, 'error': resolve}));
|
|
|
|
}
|
2018-11-18 19:14:22 +01:00
|
|
|
if (_converse.jid) {
|
|
|
|
if (_converse.bosh_session.get('jid') !== _converse.jid) {
|
|
|
|
const jid = await _converse.setUserJID(_converse.jid);
|
|
|
|
_converse.bosh_session.clear({'silent': true });
|
|
|
|
_converse.bosh_session.save({jid});
|
|
|
|
}
|
|
|
|
} else { // Keepalive
|
|
|
|
const jid = _converse.bosh_session.get('jid');
|
2019-10-14 13:22:34 +02:00
|
|
|
jid && await _converse.setUserJID(jid);
|
2019-06-05 10:01:55 +02:00
|
|
|
}
|
|
|
|
return _converse.bosh_session;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2019-07-29 10:08:38 +02:00
|
|
|
_converse.startNewPreboundBOSHSession = function () {
|
2019-06-05 10:01:55 +02:00
|
|
|
if (!_converse.prebind_url) {
|
2018-11-18 19:14:22 +01:00
|
|
|
throw new Error("startNewPreboundBOSHSession: If you use prebind then you MUST supply a prebind_url");
|
2019-06-05 10:01:55 +02:00
|
|
|
}
|
|
|
|
const xhr = new XMLHttpRequest();
|
|
|
|
xhr.open('GET', _converse.prebind_url, true);
|
|
|
|
xhr.setRequestHeader('Accept', 'application/json, text/javascript');
|
2018-11-18 19:14:22 +01:00
|
|
|
xhr.onload = async function () {
|
2019-06-05 10:01:55 +02:00
|
|
|
if (xhr.status >= 200 && xhr.status < 400) {
|
|
|
|
const data = JSON.parse(xhr.responseText);
|
2018-11-18 19:14:22 +01:00
|
|
|
const jid = await _converse.setUserJID(data.jid);
|
2019-06-05 10:01:55 +02:00
|
|
|
_converse.connection.attach(
|
2018-11-18 19:14:22 +01:00
|
|
|
jid,
|
2019-06-05 10:01:55 +02:00
|
|
|
data.sid,
|
|
|
|
data.rid,
|
|
|
|
_converse.onConnectStatusChanged
|
|
|
|
);
|
|
|
|
} else {
|
|
|
|
xhr.onerror();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
xhr.onerror = function () {
|
|
|
|
delete _converse.connection;
|
|
|
|
/**
|
|
|
|
* Triggered when fetching prebind tokens failed
|
|
|
|
* @event _converse#noResumeableBOSHSession
|
|
|
|
* @type { _converse }
|
|
|
|
* @example _converse.api.listen.on('noResumeableBOSHSession', _converse => { ... });
|
|
|
|
*/
|
|
|
|
_converse.api.trigger('noResumeableBOSHSession', _converse);
|
|
|
|
};
|
|
|
|
xhr.send();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
_converse.restoreBOSHSession = async function () {
|
|
|
|
const jid = (await initBOSHSession()).get('jid');
|
2019-12-03 11:31:28 +01:00
|
|
|
if (jid && (_converse.connection._proto instanceof Strophe.Bosh)) {
|
2019-06-05 10:01:55 +02:00
|
|
|
try {
|
|
|
|
_converse.connection.restore(jid, _converse.onConnectStatusChanged);
|
|
|
|
return true;
|
|
|
|
} catch (e) {
|
2019-11-06 11:01:34 +01:00
|
|
|
log.warn("Could not restore session for jid: "+jid+" Error message: "+e.message);
|
2019-06-05 10:01:55 +02:00
|
|
|
return false;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/************************ BEGIN Event Handlers ************************/
|
|
|
|
_converse.api.listen.on('clearSession', () => {
|
2019-07-29 10:08:38 +02:00
|
|
|
if (_converse.bosh_session === undefined) {
|
|
|
|
// Remove manually, even if we don't have the corresponding
|
|
|
|
// model, to avoid trying to reconnect to a stale BOSH session
|
|
|
|
const id = BOSH_SESSION_ID;
|
|
|
|
sessionStorage.removeItem(id);
|
|
|
|
sessionStorage.removeItem(`${id}-${id}`);
|
|
|
|
} else {
|
2019-06-05 10:01:55 +02:00
|
|
|
_converse.bosh_session.destroy();
|
|
|
|
delete _converse.bosh_session;
|
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
_converse.api.listen.on('setUserJID', () => {
|
2019-07-29 10:08:38 +02:00
|
|
|
if (_converse.bosh_session !== undefined) {
|
2019-06-05 10:01:55 +02:00
|
|
|
_converse.bosh_session.save({'jid': _converse.jid});
|
|
|
|
}
|
|
|
|
});
|
2019-09-24 15:38:34 +02:00
|
|
|
|
2018-11-18 19:14:22 +01:00
|
|
|
_converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.BOSH));
|
2019-09-24 15:38:34 +02:00
|
|
|
|
2019-06-05 10:01:55 +02:00
|
|
|
/************************ END Event Handlers ************************/
|
|
|
|
|
|
|
|
|
|
|
|
/************************ BEGIN API ************************/
|
|
|
|
Object.assign(_converse.api, {
|
|
|
|
/**
|
|
|
|
* This namespace lets you access the BOSH tokens
|
|
|
|
*
|
|
|
|
* @namespace _converse.api.tokens
|
|
|
|
* @memberOf _converse.api
|
|
|
|
*/
|
|
|
|
tokens: {
|
|
|
|
/**
|
|
|
|
* @method _converse.api.tokens.get
|
|
|
|
* @param {string} [id] The type of token to return ('rid' or 'sid').
|
|
|
|
* @returns 'string' A token, either the RID or SID token depending on what's asked for.
|
|
|
|
* @example _converse.api.tokens.get('rid');
|
|
|
|
*/
|
|
|
|
get (id) {
|
2019-07-29 10:08:38 +02:00
|
|
|
if (_converse.connection === undefined) {
|
2019-06-05 10:01:55 +02:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
if (id.toLowerCase() === 'rid') {
|
|
|
|
return _converse.connection.rid || _converse.connection._proto.rid;
|
|
|
|
} else if (id.toLowerCase() === 'sid') {
|
|
|
|
return _converse.connection.sid || _converse.connection._proto.sid;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
/************************ end api ************************/
|
|
|
|
}
|
|
|
|
});
|