Convert a few functions to async/await.

This commit is contained in:
Emmanuel Gil Peyrot 2018-10-24 18:28:28 +02:00
parent aac8b741b9
commit 35b7dbe389
10 changed files with 243 additions and 274 deletions

View File

@ -69,15 +69,14 @@ converse.plugins.add('converse-bookmarks', {
close_button.insertAdjacentHTML('afterend', bookmark_button); close_button.insertAdjacentHTML('afterend', bookmark_button);
}, },
renderHeading () { async renderHeading () {
this.__super__.renderHeading.apply(this, arguments); this.__super__.renderHeading.apply(this, arguments);
const { _converse } = this.__super__; const { _converse } = this.__super__;
if (_converse.allow_bookmarks) { if (_converse.allow_bookmarks) {
_converse.checkBookmarksSupport().then((supported) => { const supported = await _converse.checkBookmarksSupport();
if (supported) { if (supported) {
this.renderBookmarkToggle(); this.renderBookmarkToggle();
} }
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
} }
}, },
@ -529,21 +528,19 @@ converse.plugins.add('converse-bookmarks', {
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); }).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
} }
const initBookmarks = function () { const initBookmarks = async function () {
if (!_converse.allow_bookmarks) { if (!_converse.allow_bookmarks) {
return; return;
} }
_converse.checkBookmarksSupport().then((supported) => { const supported = await _converse.checkBookmarksSupport();
if (supported) { if (supported) {
_converse.bookmarks = new _converse.Bookmarks(); _converse.bookmarks = new _converse.Bookmarks();
_converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks}); _converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks});
_converse.bookmarks.fetchBookmarks() await _converse.bookmarks.fetchBookmarks();
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)) _converse.emit('bookmarksInitialized');
.then(() => _converse.emit('bookmarksInitialized')); } else {
} else { _converse.emit('bookmarksInitialized');
_converse.emit('bookmarksInitialized'); }
}
});
} }
u.onMultipleEvents([ u.onMultipleEvents([

View File

@ -229,13 +229,12 @@ converse.plugins.add('converse-chatview', {
} }
}, },
refreshContact (ev) { async refreshContact (ev) {
if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev && ev.preventDefault) { ev.preventDefault(); }
const refresh_icon = this.el.querySelector('.fa-refresh'); const refresh_icon = this.el.querySelector('.fa-refresh');
u.addClass('fa-spin', refresh_icon); u.addClass('fa-spin', refresh_icon);
_converse.api.vcard.update(this.model.contact.vcard, true) await _converse.api.vcard.update(this.model.contact.vcard, true);
.then(() => u.removeClass('fa-spin', refresh_icon)) u.removeClass('fa-spin', refresh_icon);
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
removeContact (ev) { removeContact (ev) {
@ -387,17 +386,16 @@ converse.plugins.add('converse-chatview', {
this.model.sendFiles(evt.target.files); this.model.sendFiles(evt.target.files);
}, },
addFileUploadButton (options) { async addFileUploadButton (options) {
_converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain).then((result) => { const result = await _converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain);
if (result.length) { if (result.length) {
this.el.querySelector('.chat-toolbar').insertAdjacentHTML( this.el.querySelector('.chat-toolbar').insertAdjacentHTML(
'beforeend', 'beforeend',
tpl_toolbar_fileupload({'tooltip_upload_file': __('Choose a file to send')})); tpl_toolbar_fileupload({'tooltip_upload_file': __('Choose a file to send')}));
} }
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
addSpoilerButton (options) { async addSpoilerButton (options) {
/* Asynchronously adds a button for writing spoiler /* Asynchronously adds a button for writing spoiler
* messages, based on whether the contact's client supports * messages, based on whether the contact's client supports
* it. * it.
@ -410,18 +408,17 @@ converse.plugins.add('converse-chatview', {
if (_.isEmpty(resources)) { if (_.isEmpty(resources)) {
return; return;
} }
Promise.all(_.map(_.keys(resources), (resource) => const results = await Promise.all(_.map(_.keys(resources), (resource) =>
_converse.api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${resource}`) _converse.api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${resource}`)
)).then((results) => { ));
if (_.filter(results, 'length').length) { if (_.filter(results, 'length').length) {
const html = tpl_spoiler_button(this.model.toJSON()); const html = tpl_spoiler_button(this.model.toJSON());
if (_converse.visible_toolbar_buttons.emoji) { if (_converse.visible_toolbar_buttons.emoji) {
this.el.querySelector('.toggle-smiley').insertAdjacentHTML('afterEnd', html); this.el.querySelector('.toggle-smiley').insertAdjacentHTML('afterEnd', html);
} else { } else {
this.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html); this.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html);
}
} }
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); }
}, },
insertHeading () { insertHeading () {

View File

@ -154,7 +154,7 @@ converse.plugins.add('converse-controlbox', {
} }
}, },
initialize () { async initialize () {
/* The initialize function gets called as soon as the plugin is /* The initialize function gets called as soon as the plugin is
* loaded by converse.js's plugin machinery. * loaded by converse.js's plugin machinery.
*/ */
@ -238,14 +238,13 @@ converse.plugins.add('converse-controlbox', {
} }
}, },
insertRoster () { async insertRoster () {
if (_converse.authentication === _converse.ANONYMOUS) { if (_converse.authentication === _converse.ANONYMOUS) {
return; return;
} }
/* Place the rosterview inside the "Contacts" panel. */ /* Place the rosterview inside the "Contacts" panel. */
_converse.api.waitUntil('rosterViewInitialized') await _converse.api.waitUntil('rosterViewInitialized');
.then(() => this.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el)) this.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el);
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
createBrandHeadingHTML () { createBrandHeadingHTML () {
@ -506,11 +505,10 @@ converse.plugins.add('converse-controlbox', {
'href': "#" 'href': "#"
}, },
initialize () { async initialize () {
_converse.chatboxviews.insertRowColumn(this.render().el); _converse.chatboxviews.insertRowColumn(this.render().el);
_converse.api.waitUntil('initialized') await _converse.api.waitUntil('initialized');
.then(this.render.bind(this)) this.render.bind(this);
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
render () { render () {
@ -589,10 +587,11 @@ converse.plugins.add('converse-controlbox', {
} }
}); });
Promise.all([ await Promise.all([
_converse.api.waitUntil('connectionInitialized'), _converse.api.waitUntil('connectionInitialized'),
_converse.api.waitUntil('chatBoxViewsInitialized') _converse.api.waitUntil('chatBoxViewsInitialized')
]).then(_converse.addControlBox).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); ]);
_converse.addControlBox();
_converse.on('chatBoxesFetched', () => { _converse.on('chatBoxesFetched', () => {
const controlbox = _converse.chatboxes.get('controlbox') || _converse.addControlBox(); const controlbox = _converse.chatboxes.get('controlbox') || _converse.addControlBox();

View File

@ -229,7 +229,7 @@ converse.plugins.add('converse-minimize', {
); );
}, },
trimChats (newchat) { async trimChats (newchat) {
/* This method is called when a newly created chat box will /* This method is called when a newly created chat box will
* be shown. * be shown.
* *
@ -250,35 +250,34 @@ converse.plugins.add('converse-minimize', {
// fullscreen. In this case we don't trim. // fullscreen. In this case we don't trim.
return; return;
} }
_converse.api.waitUntil('minimizedChatsInitialized').then(() => { await _converse.api.waitUntil('minimizedChatsInitialized');
const minimized_el = _.get(_converse.minimized_chats, 'el'), const minimized_el = _.get(_converse.minimized_chats, 'el'),
new_id = newchat ? newchat.model.get('id') : null; new_id = newchat ? newchat.model.get('id') : null;
if (minimized_el) { if (minimized_el) {
const minimized_width = _.includes(this.model.pluck('minimized'), true) ? const minimized_width = _.includes(this.model.pluck('minimized'), true) ?
u.getOuterWidth(minimized_el, true) : 0; u.getOuterWidth(minimized_el, true) : 0;
const boxes_width = _.reduce( const boxes_width = _.reduce(
this.xget(new_id), this.xget(new_id),
(memo, view) => memo + this.getChatBoxWidth(view), (memo, view) => memo + this.getChatBoxWidth(view),
newchat ? u.getOuterWidth(newchat.el, true) : 0 newchat ? u.getOuterWidth(newchat.el, true) : 0
); );
if ((minimized_width + boxes_width) > body_width) { if ((minimized_width + boxes_width) > body_width) {
const oldest_chat = this.getOldestMaximizedChat([new_id]); const oldest_chat = this.getOldestMaximizedChat([new_id]);
if (oldest_chat) { if (oldest_chat) {
// We hide the chat immediately, because waiting // We hide the chat immediately, because waiting
// for the event to fire (and letting the // for the event to fire (and letting the
// ChatBoxView hide it then) causes race // ChatBoxView hide it then) causes race
// conditions. // conditions.
const view = this.get(oldest_chat.get('id')); const view = this.get(oldest_chat.get('id'));
if (view) { if (view) {
view.hide(); view.hide();
}
oldest_chat.minimize();
} }
oldest_chat.minimize();
} }
} }
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); }
}, },
getOldestMaximizedChat (exclude_ids) { getOldestMaximizedChat (exclude_ids) {
@ -300,7 +299,7 @@ converse.plugins.add('converse-minimize', {
}, },
initialize () { async initialize () {
/* The initialize function gets called as soon as the plugin is /* The initialize function gets called as soon as the plugin is
* loaded by Converse.js's plugin machinery. * loaded by Converse.js's plugin machinery.
*/ */
@ -510,16 +509,12 @@ converse.plugins.add('converse-minimize', {
} }
}); });
Promise.all([ await _converse.api.waitUntil('connectionInitialized');
_converse.api.waitUntil('connectionInitialized'), await _converse.api.waitUntil('chatBoxViewsInitialized');
_converse.api.waitUntil('chatBoxViewsInitialized') _converse.minimized_chats = new _converse.MinimizedChats({
]).then(() => { model: _converse.chatboxes
_converse.minimized_chats = new _converse.MinimizedChats({ });
model: _converse.chatboxes _converse.emit('minimizedChatsInitialized');
});
_converse.emit('minimizedChatsInitialized');
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
_converse.on('registeredGlobalEventHandlers', function () { _converse.on('registeredGlobalEventHandlers', function () {
window.addEventListener("resize", _.debounce(function (ev) { window.addEventListener("resize", _.debounce(function (ev) {

View File

@ -248,18 +248,18 @@ converse.plugins.add('converse-muc-views', {
})); }));
} }
function toggleRoomInfo (ev) { async function toggleRoomInfo (ev) {
/* Show/hide extra information about a groupchat in a listing. */ /* Show/hide extra information about a groupchat in a listing. */
const parent_el = u.ancestor(ev.target, '.room-item'), const parent_el = u.ancestor(ev.target, '.room-item'),
div_el = parent_el.querySelector('div.room-info'); div_el = parent_el.querySelector('div.room-info');
if (div_el) { if (div_el) {
u.slideIn(div_el).then(u.removeElement) await u.slideIn(div_el);
u.removeElement();
parent_el.querySelector('a.room-info').classList.remove('selected'); parent_el.querySelector('a.room-info').classList.remove('selected');
} else { } else {
parent_el.insertAdjacentHTML('beforeend', tpl_spinner()); parent_el.insertAdjacentHTML('beforeend', tpl_spinner());
_converse.api.disco.info(ev.target.getAttribute('data-room-jid'), null) const stanza = await _converse.api.disco.info(ev.target.getAttribute('data-room-jid'), null);
.then((stanza) => insertRoomInfo(parent_el, stanza)) insertRoomInfo(parent_el, stanza);
.catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
} }
} }
@ -1144,7 +1144,7 @@ converse.plugins.add('converse-muc-views', {
this.renderAfterTransition(); this.renderAfterTransition();
}, },
getAndRenderConfigurationForm (ev) { async getAndRenderConfigurationForm (ev) {
/* Start the process of configuring a groupchat, either by /* Start the process of configuring a groupchat, either by
* rendering a configuration form, or by auto-configuring * rendering a configuration form, or by auto-configuring
* based on the "roomconfig" data stored on the * based on the "roomconfig" data stored on the
@ -1160,9 +1160,8 @@ converse.plugins.add('converse-muc-views', {
* the settings. * the settings.
*/ */
this.showSpinner(); this.showSpinner();
this.model.fetchRoomConfiguration() await this.model.fetchRoomConfiguration();
.then(this.renderConfigurationForm.bind(this)) this.renderConfigurationForm();
.catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
}, },
submitNickname (ev) { submitNickname (ev) {

View File

@ -106,17 +106,16 @@ converse.plugins.add("converse-oauth", {
})); }));
}, },
fetchOAuthProfileDataAndLogin () { async fetchOAuthProfileDataAndLogin () {
this.oauth_service.api('me').then((profile) => { const profile = await this.oauth_service.api('me');
const response = this.oauth_service.getAuthResponse(); const response = this.oauth_service.getAuthResponse();
_converse.api.user.login({ _converse.api.user.login({
'jid': `${profile.name}@${this.provider.get('host')}`, 'jid': `${profile.name}@${this.provider.get('host')}`,
'password': response.access_token 'password': response.access_token
});
}); });
}, },
oauthLogin (ev) { async oauthLogin (ev) {
ev.preventDefault(); ev.preventDefault();
const id = ev.target.getAttribute('data-id'); const id = ev.target.getAttribute('data-id');
this.provider = _converse.oauth_providers.get(id); this.provider = _converse.oauth_providers.get(id);
@ -128,10 +127,8 @@ converse.plugins.add("converse-oauth", {
'redirect_uri': '/redirect.html' 'redirect_uri': '/redirect.html'
}); });
this.oauth_service.login().then( await this.oauth_service.login();
() => this.fetchOAuthProfileDataAndLogin(), this.fetchOAuthProfileDataAndLogin();
(error) => _converse.log(error.error_message, Strophe.LogLevel.ERROR)
);
} }
}); });
} }

View File

@ -680,15 +680,14 @@ converse.plugins.add('converse-rosterview', {
this.filterOutContacts(this.getFilterMatches(q, type)); this.filterOutContacts(this.getFilterMatches(q, type));
}, },
toggle (ev) { async toggle (ev) {
if (ev && ev.preventDefault) { ev.preventDefault(); } if (ev && ev.preventDefault) { ev.preventDefault(); }
const icon_el = ev.target.querySelector('.fa'); const icon_el = ev.target.querySelector('.fa');
if (_.includes(icon_el.classList, "fa-caret-down")) { if (_.includes(icon_el.classList, "fa-caret-down")) {
this.model.save({state: _converse.CLOSED}); this.model.save({state: _converse.CLOSED});
this.collapse().then(() => { await this.collapse();
icon_el.classList.remove("fa-caret-down"); icon_el.classList.remove("fa-caret-down");
icon_el.classList.add("fa-caret-right"); icon_el.classList.add("fa-caret-right");
});
} else { } else {
icon_el.classList.remove("fa-caret-right"); icon_el.classList.remove("fa-caret-right");
icon_el.classList.add("fa-caret-down"); icon_el.classList.add("fa-caret-down");

View File

@ -148,27 +148,29 @@ converse.plugins.add('converse-chatboxes', {
}); });
}, },
getRequestSlotURL () { async getRequestSlotURL () {
this.sendSlotRequestStanza().then((stanza) => { let stanza;
const slot = stanza.querySelector('slot'); try {
if (slot) { stanza = await this.sendSlotRequestStanza();
this.save({ } catch (e) {
'get': slot.querySelector('get').getAttribute('url'),
'put': slot.querySelector('put').getAttribute('url'),
});
} else {
return this.save({
'type': 'error',
'message': __("Sorry, could not determine file upload URL.")
});
}
}).catch((e) => {
_converse.log(e, Strophe.LogLevel.ERROR); _converse.log(e, Strophe.LogLevel.ERROR);
return this.save({ return this.save({
'type': 'error', 'type': 'error',
'message': __("Sorry, could not determine upload URL.") 'message': __("Sorry, could not determine upload URL.")
}); });
}); }
const slot = stanza.querySelector('slot');
if (slot) {
this.save({
'get': slot.querySelector('get').getAttribute('url'),
'put': slot.querySelector('put').getAttribute('url'),
});
} else {
return this.save({
'type': 'error',
'message': __("Sorry, could not determine file upload URL.")
});
}
}, },
uploadFile () { uploadFile () {
@ -417,39 +419,38 @@ converse.plugins.add('converse-chatboxes', {
}, },
sendFiles (files) { async sendFiles (files) {
_converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain).then((result) => { const result = await _converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain);
const item = result.pop(), const item = result.pop(),
data = item.dataforms.where({'FORM_TYPE': {'value': Strophe.NS.HTTPUPLOAD, 'type': "hidden"}}).pop(), data = item.dataforms.where({'FORM_TYPE': {'value': Strophe.NS.HTTPUPLOAD, 'type': "hidden"}}).pop(),
max_file_size = window.parseInt(_.get(data, 'attributes.max-file-size.value')), max_file_size = window.parseInt(_.get(data, 'attributes.max-file-size.value')),
slot_request_url = _.get(item, 'id'); slot_request_url = _.get(item, 'id');
if (!slot_request_url) { if (!slot_request_url) {
this.messages.create({ this.messages.create({
'message': __("Sorry, looks like file upload is not supported by your server."), 'message': __("Sorry, looks like file upload is not supported by your server."),
'type': 'error',
});
return;
}
_.each(files, (file) => {
if (!window.isNaN(max_file_size) && window.parseInt(file.size) > max_file_size) {
return this.messages.create({
'message': __('The size of your file, %1$s, exceeds the maximum allowed by your server, which is %2$s.',
file.name, filesize(max_file_size)),
'type': 'error', 'type': 'error',
}); });
return; } else {
this.messages.create(
_.extend(
this.getOutgoingMessageAttributes(), {
'file': file,
'progress': 0,
'slot_request_url': slot_request_url
})
);
} }
_.each(files, (file) => { });
if (!window.isNaN(max_file_size) && window.parseInt(file.size) > max_file_size) {
return this.messages.create({
'message': __('The size of your file, %1$s, exceeds the maximum allowed by your server, which is %2$s.',
file.name, filesize(max_file_size)),
'type': 'error',
});
} else {
this.messages.create(
_.extend(
this.getOutgoingMessageAttributes(), {
'file': file,
'progress': 0,
'slot_request_url': slot_request_url
})
);
}
});
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
getReferencesFromStanza (stanza) { getReferencesFromStanza (stanza) {
@ -653,7 +654,7 @@ converse.plugins.add('converse-chatboxes', {
} }
}, },
onMessage (stanza) { async onMessage (stanza) {
/* Handler method for all incoming single-user chat "message" /* Handler method for all incoming single-user chat "message"
* stanzas. * stanzas.
* *
@ -727,9 +728,8 @@ converse.plugins.add('converse-chatboxes', {
message = msgid && chatbox.messages.findWhere({msgid}); message = msgid && chatbox.messages.findWhere({msgid});
if (!message) { if (!message) {
// Only create the message when we're sure it's not a duplicate // Only create the message when we're sure it's not a duplicate
chatbox.createMessage(stanza, original_stanza) const msg = await chatbox.createMessage(stanza, original_stanza);
.then(msg => chatbox.incrementUnreadMsgCounter(msg)) chatbox.incrementUnreadMsgCounter(msg);
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
} }
} }
_converse.emit('message', {'stanza': original_stanza, 'chatbox': chatbox}); _converse.emit('message', {'stanza': original_stanza, 'chatbox': chatbox});

View File

@ -162,13 +162,14 @@ converse.plugins.add('converse-disco', {
}); });
}, },
queryForItems () { async queryForItems () {
if (_.isEmpty(this.identities.where({'category': 'server'}))) { if (_.isEmpty(this.identities.where({'category': 'server'}))) {
// Don't fetch features and items if this is not a // Don't fetch features and items if this is not a
// server or a conference component. // server or a conference component.
return; return;
} }
_converse.api.disco.items(this.get('jid')).then(stanza => this.onDiscoItems(stanza)); const stanza = await _converse.api.disco.items(this.get('jid'));
this.onDiscoItems(stanza);
}, },
onInfo (stanza) { onInfo (stanza) {
@ -268,7 +269,7 @@ converse.plugins.add('converse-disco', {
_converse.emit('streamFeaturesAdded'); _converse.emit('streamFeaturesAdded');
} }
function initializeDisco () { async function initializeDisco () {
addClientFeatures(); addClientFeatures();
_converse.connection.addHandler(onDiscoInfoRequest, Strophe.NS.DISCO_INFO, 'iq', 'get', null, null); _converse.connection.addHandler(onDiscoInfoRequest, Strophe.NS.DISCO_INFO, 'iq', 'get', null, null);
@ -277,14 +278,13 @@ converse.plugins.add('converse-disco', {
b64_sha1(`converse.disco-entities-${_converse.bare_jid}`) b64_sha1(`converse.disco-entities-${_converse.bare_jid}`)
); );
_converse.disco_entities.fetchEntities().then((collection) => { const collection = await _converse.disco_entities.fetchEntities();
if (collection.length === 0 || !collection.get(_converse.domain)) { if (collection.length === 0 || !collection.get(_converse.domain)) {
// If we don't have an entity for our own XMPP server, // If we don't have an entity for our own XMPP server,
// create one. // create one.
_converse.disco_entities.create({'jid': _converse.domain}); _converse.disco_entities.create({'jid': _converse.domain});
} }
_converse.emit('discoInitialized'); _converse.emit('discoInitialized');
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
} }
_converse.api.listen.on('sessionInitialized', initStreamFeatures); _converse.api.listen.on('sessionInitialized', initStreamFeatures);
@ -513,18 +513,16 @@ converse.plugins.add('converse-disco', {
* @param {boolean} [create] Whether the entity should be created if it doesn't exist. * @param {boolean} [create] Whether the entity should be created if it doesn't exist.
* @example _converse.api.disco.entities.get(jid); * @example _converse.api.disco.entities.get(jid);
*/ */
'get' (jid, create=false) { async 'get' (jid, create=false) {
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => { if (_.isNil(jid)) {
if (_.isNil(jid)) { return _converse.disco_entities;
return _converse.disco_entities; }
} const entity = _converse.disco_entities.get(jid);
const entity = _converse.disco_entities.get(jid); if (entity || !create) {
if (entity || !create) { return entity;
return entity; }
} return _converse.disco_entities.create({'jid': jid});
return _converse.disco_entities.create({'jid': jid});
});
} }
}, },
@ -559,20 +557,18 @@ converse.plugins.add('converse-disco', {
* ); * );
* }); * });
*/ */
'supports' (feature, jid) { async 'supports' (feature, jid) {
if (_.isNil(jid)) { if (_.isNil(jid)) {
throw new TypeError('api.disco.supports: You need to provide an entity JID'); throw new TypeError('api.disco.supports: You need to provide an entity JID');
} }
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => _converse.api.disco.entities.get(jid, true)) let entity = await _converse.api.disco.entities.get(jid, true);
.then(entity => entity.waitUntilFeaturesDiscovered) entity = await entity.waitUntilFeaturesDiscovered;
.then(entity => { const promises = _.concat(
const promises = _.concat( entity.items.map(item => item.hasFeature(feature)),
entity.items.map(item => item.hasFeature(feature)), entity.hasFeature(feature)
entity.hasFeature(feature) );
); return Promise.all(promises);
return Promise.all(promises);
}).then(result => f.filter(f.isObject, result));
}, },
/** /**
@ -585,21 +581,18 @@ converse.plugins.add('converse-disco', {
* @example * @example
* await _converse.api.disco.refreshFeatures('room@conference.example.org'); * await _converse.api.disco.refreshFeatures('room@conference.example.org');
*/ */
'refreshFeatures' (jid) { async 'refreshFeatures' (jid) {
if (_.isNil(jid)) { if (_.isNil(jid)) {
throw new TypeError('api.disco.refreshFeatures: You need to provide an entity JID'); throw new TypeError('api.disco.refreshFeatures: You need to provide an entity JID');
} }
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => _converse.api.disco.entities.get(jid, true)) const entity = await _converse.api.disco.entities.get(jid, true);
.then(entity => { entity.features.reset();
entity.features.reset(); entity.fields.reset();
entity.fields.reset(); entity.identities.reset();
entity.identities.reset(); entity.waitUntilFeaturesDiscovered = utils.getResolveablePromise()
entity.waitUntilFeaturesDiscovered = utils.getResolveablePromise() entity.queryInfo();
entity.queryInfo(); return entity.waitUntilFeaturesDiscovered;
return entity.waitUntilFeaturesDiscovered;
})
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
/** /**
@ -611,15 +604,14 @@ converse.plugins.add('converse-disco', {
* @example * @example
* const features = await _converse.api.disco.getFeatures('room@conference.example.org'); * const features = await _converse.api.disco.getFeatures('room@conference.example.org');
*/ */
'getFeatures' (jid) { async 'getFeatures' (jid) {
if (_.isNil(jid)) { if (_.isNil(jid)) {
throw new TypeError('api.disco.getFeatures: You need to provide an entity JID'); throw new TypeError('api.disco.getFeatures: You need to provide an entity JID');
} }
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => _converse.api.disco.entities.get(jid, true)) let entity = await _converse.api.disco.entities.get(jid, true);
.then(entity => entity.waitUntilFeaturesDiscovered) entity = await entity.waitUntilFeaturesDiscovered;
.then(entity => entity.features) return entity.features;
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
/** /**
@ -633,15 +625,14 @@ converse.plugins.add('converse-disco', {
* @example * @example
* const fields = await _converse.api.disco.getFields('room@conference.example.org'); * const fields = await _converse.api.disco.getFields('room@conference.example.org');
*/ */
'getFields' (jid) { async 'getFields' (jid) {
if (_.isNil(jid)) { if (_.isNil(jid)) {
throw new TypeError('api.disco.getFields: You need to provide an entity JID'); throw new TypeError('api.disco.getFields: You need to provide an entity JID');
} }
return _converse.api.waitUntil('discoInitialized') await _converse.api.waitUntil('discoInitialized');
.then(() => _converse.api.disco.entities.get(jid, true)) let entity = await _converse.api.disco.entities.get(jid, true);
.then(entity => entity.waitUntilFeaturesDiscovered) entity = await entity.waitUntilFeaturesDiscovered;
.then(entity => entity.fields) return entity.fields;
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
}, },
/** /**
@ -675,8 +666,9 @@ converse.plugins.add('converse-disco', {
* } * }
* ).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL)); * ).catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
*/ */
'getIdentity' (category, type, jid) { async 'getIdentity' (category, type, jid) {
return _converse.api.disco.entities.get(jid, true).then(e => e.getIdentity(category, type)); const e = await _converse.api.disco.entities.get(jid, true);
return e.getIdentity(category, type);
} }
} }
}); });

View File

@ -109,20 +109,18 @@ converse.plugins.add('converse-muc', {
_converse.api.promises.add(['roomsAutoJoined']); _converse.api.promises.add(['roomsAutoJoined']);
function openRoom (jid) { async function openRoom (jid) {
if (!u.isValidMUCJID(jid)) { if (!u.isValidMUCJID(jid)) {
return _converse.log( return _converse.log(
`Invalid JID "${jid}" provided in URL fragment`, `Invalid JID "${jid}" provided in URL fragment`,
Strophe.LogLevel.WARN Strophe.LogLevel.WARN
); );
} }
const promises = [_converse.api.waitUntil('roomsAutoJoined')] await _converse.api.waitUntil('roomsAutoJoined');
if (_converse.allow_bookmarks) { if (_converse.allow_bookmarks) {
promises.push( _converse.api.waitUntil('bookmarksInitialized')); await _converse.api.waitUntil('bookmarksInitialized');
} }
Promise.all(promises).then(() => { _converse.api.rooms.open(jid);
_converse.api.rooms.open(jid);
});
} }
_converse.router.route('converse/room?jid=:jid', openRoom); _converse.router.route('converse/room?jid=:jid', openRoom);
@ -770,7 +768,7 @@ converse.plugins.add('converse-muc', {
} }
}, },
checkForReservedNick () { async checkForReservedNick () {
/* Use service-discovery to ask the XMPP server whether /* Use service-discovery to ask the XMPP server whether
* this user has a reserved nickname for this groupchat. * this user has a reserved nickname for this groupchat.
* If so, we'll use that, otherwise we render the nickname form. * If so, we'll use that, otherwise we render the nickname form.
@ -779,7 +777,7 @@ converse.plugins.add('converse-muc', {
* (Function) callback: Callback upon succesful IQ response * (Function) callback: Callback upon succesful IQ response
* (Function) errback: Callback upon error IQ response * (Function) errback: Callback upon error IQ response
*/ */
return _converse.api.sendIQ( const iq = await _converse.api.sendIQ(
$iq({ $iq({
'to': this.get('jid'), 'to': this.get('jid'),
'from': _converse.connection.jid, 'from': _converse.connection.jid,
@ -788,15 +786,14 @@ converse.plugins.add('converse-muc', {
'xmlns': Strophe.NS.DISCO_INFO, 'xmlns': Strophe.NS.DISCO_INFO,
'node': 'x-roomuser-item' 'node': 'x-roomuser-item'
}) })
).then(iq => { );
const identity_el = iq.querySelector('query[node="x-roomuser-item"] identity'), const identity_el = iq.querySelector('query[node="x-roomuser-item"] identity'),
nick = identity_el ? identity_el.getAttribute('name') : null; nick = identity_el ? identity_el.getAttribute('name') : null;
this.save({ this.save({
'reserved_nick': nick, 'reserved_nick': nick,
'nick': nick 'nick': nick
}, {'silent': true}); }, {'silent': true});
return iq; return iq;
});
}, },
async registerNickname () { async registerNickname () {
@ -947,7 +944,7 @@ converse.plugins.add('converse-muc', {
} }
}, },
onMessage (stanza) { async onMessage (stanza) {
/* Handler for all MUC messages sent to this groupchat. /* Handler for all MUC messages sent to this groupchat.
* *
* Parameters: * Parameters:
@ -976,9 +973,8 @@ converse.plugins.add('converse-muc', {
const subject = _.propertyOf(subject_el)('textContent') || ''; const subject = _.propertyOf(subject_el)('textContent') || '';
u.safeSave(this, {'subject': {'author': sender, 'text': subject}}); u.safeSave(this, {'subject': {'author': sender, 'text': subject}});
} }
this.createMessage(stanza, original_stanza) const msg = await this.createMessage(stanza, original_stanza);
.then(msg => this.incrementUnreadMsgCounter(msg)) this.incrementUnreadMsgCounter(msg);
.catch(_.partial(_converse.log, _, Strophe.LogLevel.FATAL));
} }
if (sender !== this.get('nick')) { if (sender !== this.get('nick')) {
// We only emit an event if it's not our own message // We only emit an event if it's not our own message
@ -1149,37 +1145,35 @@ converse.plugins.add('converse-muc', {
} }
}, },
fetchMembers () { async fetchMembers () {
this.chatroom.getJidsWithAffiliations(['member', 'owner', 'admin']) const new_members = await this.chatroom.getJidsWithAffiliations(['member', 'owner', 'admin']);
.then(new_members => { const new_jids = new_members.map(m => m.jid).filter(m => !_.isUndefined(m)),
const new_jids = new_members.map(m => m.jid).filter(m => !_.isUndefined(m)), new_nicks = new_members.map(m => !m.jid && m.nick || undefined).filter(m => !_.isUndefined(m)),
new_nicks = new_members.map(m => !m.jid && m.nick || undefined).filter(m => !_.isUndefined(m)), removed_members = this.filter(m => {
removed_members = this.filter(m => { return f.includes(m.get('affiliation'), ['admin', 'member', 'owner']) &&
return f.includes(m.get('affiliation'), ['admin', 'member', 'owner']) && !f.includes(m.get('nick'), new_nicks) &&
!f.includes(m.get('nick'), new_nicks) && !f.includes(m.get('jid'), new_jids);
!f.includes(m.get('jid'), new_jids); });
});
_.each(removed_members, (occupant) => { _.each(removed_members, (occupant) => {
if (occupant.get('jid') === _converse.bare_jid) { return; } if (occupant.get('jid') === _converse.bare_jid) { return; }
if (occupant.get('show') === 'offline') { if (occupant.get('show') === 'offline') {
occupant.destroy(); occupant.destroy();
} }
}); });
_.each(new_members, (attrs) => { _.each(new_members, (attrs) => {
let occupant; let occupant;
if (attrs.jid) { if (attrs.jid) {
occupant = this.findOccupant({'jid': attrs.jid}); occupant = this.findOccupant({'jid': attrs.jid});
} else { } else {
occupant = this.findOccupant({'nick': attrs.nick}); occupant = this.findOccupant({'nick': attrs.nick});
} }
if (occupant) { if (occupant) {
occupant.save(attrs); occupant.save(attrs);
} else { } else {
this.create(attrs); this.create(attrs);
} }
}); });
}).catch(_.partial(_converse.log, _, Strophe.LogLevel.ERROR));
}, },
findOccupant (data) { findOccupant (data) {