Przeglądaj źródła

Use `api` shortcut instead of `_converse.api`

JC Brand 5 lat temu
rodzic
commit
030c26a8ab

+ 9 - 9
src/converse-bookmark-views.js

@@ -65,14 +65,14 @@ converse.plugins.add('converse-bookmark-views', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
         // Configuration values for this plugin
         // ====================================
         // Refer to docs/source/configuration.rst for explanations of these
         // configuration settings.
-        _converse.api.settings.update({
+        api.settings.update({
             hide_open_bookmarks: true,
-            muc_respect_autojoin: true
         });
 
 
@@ -96,7 +96,7 @@ converse.plugins.add('converse-bookmark-views', {
                  */
                 ev.preventDefault();
                 const jid = ev.target.getAttribute('data-room-jid');
-                _converse.api.rooms.open(jid, {'bring_to_foreground': true});
+                api.rooms.open(jid, {'bring_to_foreground': true});
                 _converse.chatboxviews.get(jid).renderBookmarkForm();
             },
         });
@@ -203,7 +203,7 @@ converse.plugins.add('converse-bookmark-views', {
             },
 
             toHTML () {
-                const is_hidden = b => !!(_converse.api.settings.get('hide_open_bookmarks') && _converse.chatboxes.get(b.get('jid')));
+                const is_hidden = b => !!(api.settings.get('hide_open_bookmarks') && _converse.chatboxes.get(b.get('jid')));
                 return tpl_bookmarks_list({
                     '_converse': _converse,
                     'bookmarks': this.model,
@@ -231,7 +231,7 @@ converse.plugins.add('converse-bookmark-views', {
                 const data = {
                     'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid
                 }
-                _converse.api.rooms.open(jid, data, true);
+                api.rooms.open(jid, data, true);
             },
 
             removeBookmark: _converse.removeBookmarkViaEvent,
@@ -255,7 +255,7 @@ converse.plugins.add('converse-bookmark-views', {
 
         /************************ BEGIN Event Handlers ************************/
         const initBookmarkViews = async function () {
-            await _converse.api.waitUntil('roomsPanelRendered');
+            await api.waitUntil('roomsPanelRendered');
             _converse.bookmarksview = new _converse.BookmarksView({'model': _converse.bookmarks});
             /**
              * Triggered once the _converse.Bookmarks collection and _converse.BookmarksView view
@@ -263,11 +263,11 @@ converse.plugins.add('converse-bookmark-views', {
              * @event _converse#bookmarkViewsInitialized
              * @example _converse.api.listen.on('bookmarkViewsInitialized', () => { ... });
              */
-            _converse.api.trigger('bookmarkViewsInitialized');
+            api.trigger('bookmarkViewsInitialized');
         }
 
-        _converse.api.listen.on('bookmarksInitialized', initBookmarkViews);
-        _converse.api.listen.on('chatRoomViewInitialized', view => view.setBookmarkState());
+        api.listen.on('bookmarksInitialized', initBookmarkViews);
+        api.listen.on('chatRoomViewInitialized', view => view.setBookmarkState());
         /************************ END Event Handlers ************************/
     }
 });

+ 11 - 10
src/converse-chatboxviews.js

@@ -48,14 +48,15 @@ converse.plugins.add('converse-chatboxviews', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
-        _converse.api.promises.add(['chatBoxViewsInitialized']);
+        api.promises.add(['chatBoxViewsInitialized']);
 
         // Configuration values for this plugin
         // ====================================
         // Refer to docs/source/configuration.rst for explanations of these
         // configuration settings.
-        _converse.api.settings.update({
+        api.settings.update({
             'animate': true,
             'theme': 'default'
         });
@@ -74,7 +75,7 @@ converse.plugins.add('converse-chatboxviews', {
                     if (el === null) {
                         el = document.createElement('div');
                         el.setAttribute('id', 'conversejs');
-                        u.addClass(`theme-${_converse.api.settings.get('theme')}`, el);
+                        u.addClass(`theme-${api.settings.get('theme')}`, el);
                         const body = _converse.root.querySelector('body');
                         if (body) {
                             body.appendChild(el);
@@ -97,9 +98,9 @@ converse.plugins.add('converse-chatboxviews', {
                     bg.innerHTML = tpl_background_logo();
                 }
                 const body = document.querySelector('body');
-                body.classList.add(`converse-${_converse.api.settings.get("view_mode")}`);
-                this.el.classList.add(`converse-${_converse.api.settings.get("view_mode")}`);
-                if (_converse.api.settings.get("singleton")) {
+                body.classList.add(`converse-${api.settings.get("view_mode")}`);
+                this.el.classList.add(`converse-${api.settings.get("view_mode")}`);
+                if (api.settings.get("singleton")) {
                     this.el.classList.add(`converse-singleton`);
                 }
                 this.render();
@@ -133,7 +134,7 @@ converse.plugins.add('converse-chatboxviews', {
 
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('chatBoxesInitialized', () => {
+        api.listen.on('chatBoxesInitialized', () => {
             _converse.chatboxviews = new _converse.ChatBoxViews({
                 'model': _converse.chatboxes
             });
@@ -142,17 +143,17 @@ converse.plugins.add('converse-chatboxviews', {
              * @event _converse#chatBoxViewsInitialized
              * @example _converse.api.listen.on('chatBoxViewsInitialized', () => { ... });
              */
-            _converse.api.trigger('chatBoxViewsInitialized');
+            api.trigger('chatBoxViewsInitialized');
         });
 
-        _converse.api.listen.on('clearSession', () => _converse.chatboxviews.closeAllChatBoxes());
+        api.listen.on('clearSession', () => _converse.chatboxviews.closeAllChatBoxes());
 
 
         function calculateViewportHeightUnit () {
             const vh = window.innerHeight * 0.01;
             document.documentElement.style.setProperty('--vh', `${vh}px`);
         }
-        _converse.api.listen.on('chatBoxViewsInitialized', () => calculateViewportHeightUnit());
+        api.listen.on('chatBoxViewsInitialized', () => calculateViewportHeightUnit());
         window.addEventListener('resize', () => calculateViewportHeightUnit());
         /************************ END Event Handlers ************************/
     }

+ 45 - 44
src/converse-chatview.js

@@ -56,9 +56,10 @@ converse.plugins.add('converse-chatview', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
         const { __ } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'auto_focus': true,
             'message_limit': 0,
             'show_send_button': false,
@@ -91,7 +92,7 @@ converse.plugins.add('converse-chatview', {
                  * @type { _converse.ChatBox }
                  * @example _converse.api.listen.on('userDetailsModalInitialized', chatbox => { ... });
                  */
-                _converse.api.trigger('userDetailsModalInitialized', this.model);
+                api.trigger('userDetailsModalInitialized', this.model);
             },
 
             toHTML () {
@@ -126,7 +127,7 @@ converse.plugins.add('converse-chatview', {
                 const refresh_icon = this.el.querySelector('.fa-refresh');
                 u.addClass('fa-spin', refresh_icon);
                 try {
-                    await _converse.api.vcard.update(this.model.contact.vcard, true);
+                    await api.vcard.update(this.model.contact.vcard, true);
                 } catch (e) {
                     log.fatal(e);
                     this.alert(__('Sorry, something went wrong while trying to refresh'), 'danger');
@@ -149,7 +150,7 @@ converse.plugins.add('converse-chatview', {
                             () => this.model.contact.destroy(),
                             (err) => {
                                 log.error(err);
-                                _converse.api.alert('error', __('Error'), [
+                                api.alert('error', __('Error'), [
                                     __('Sorry, there was an error while trying to remove %1$s as a contact.',
                                     this.model.contact.getDisplayName())
                                 ]);
@@ -229,7 +230,7 @@ converse.plugins.add('converse-chatview', {
                  * @type { _converse.HeadlinesBoxView }
                  * @example _converse.api.listen.on('chatBoxViewInitialized', view => { ... });
                  */
-                _converse.api.trigger('chatBoxViewInitialized', this);
+                api.trigger('chatBoxViewInitialized', this);
             },
 
             initDebounced () {
@@ -269,7 +270,7 @@ converse.plugins.add('converse-chatview', {
             },
 
             renderToolbar () {
-                if (!_converse.api.settings.get('show_toolbar')) {
+                if (!api.settings.get('show_toolbar')) {
                     return this;
                 }
                 const options = Object.assign(
@@ -285,7 +286,7 @@ converse.plugins.add('converse-chatview', {
                  * @type { _converse.ChatBoxView }
                  * @example _converse.api.listen.on('renderToolbar', view => { ... });
                  */
-                _converse.api.trigger('renderToolbar', this);
+                api.trigger('renderToolbar', this);
                 return this;
             },
 
@@ -294,13 +295,13 @@ converse.plugins.add('converse-chatview', {
                 form_container.innerHTML = tpl_chatbox_message_form(
                     Object.assign(this.model.toJSON(), {
                         '__': __,
-                        'message_limit': _converse.api.settings.get('message_limit'),
+                        'message_limit': api.settings.get('message_limit'),
                         'hint_value': this.el.querySelector('.spoiler-hint')?.value,
                         'label_message': this.model.get('composing_spoiler') ? __('Hidden message') : __('Message'),
                         'label_spoiler_hint': __('Optional hint'),
                         'message_value': this.el.querySelector('.chat-textarea')?.value,
-                        'show_send_button': _converse.api.settings.get('show_send_button'),
-                        'show_toolbar': _converse.api.settings.get('show_toolbar'),
+                        'show_send_button': api.settings.get('show_send_button'),
+                        'show_toolbar': api.settings.get('show_toolbar'),
                         'unread_msgs': __('You have unread messages')
                     }));
                 this.el.addEventListener('focusin', ev => this.emitFocused(ev));
@@ -346,7 +347,7 @@ converse.plugins.add('converse-chatview', {
             },
 
             async addFileUploadButton () {
-                if (await _converse.api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain)) {
+                if (await api.disco.supports(Strophe.NS.HTTPUPLOAD, _converse.domain)) {
                     if (this.el.querySelector('.chat-toolbar .upload-file')) {
                         return;
                     }
@@ -372,7 +373,7 @@ converse.plugins.add('converse-chatview', {
                 }
                 const results = await Promise.all(
                     this.model.presence.resources.map(
-                        r => _converse.api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${r.get('name')}`)
+                        r => api.disco.supports(Strophe.NS.SPOILER, `${contact_jid}/${r.get('name')}`)
                     )
                 );
                 const all_resources_support_spolers = results.reduce((acc, val) => (acc && val), true);
@@ -429,9 +430,9 @@ converse.plugins.add('converse-chatview', {
                     'i18n_title': __('See more information about this person'),
                     'icon_class': 'fa-id-card',
                     'name': 'details',
-                    'standalone': _converse.api.settings.get("view_mode") === 'overlayed',
+                    'standalone': api.settings.get("view_mode") === 'overlayed',
                 }];
-                if (!_converse.api.settings.get("singleton")) {
+                if (!api.settings.get("singleton")) {
                     buttons.push({
                         'a_class': 'close-chatbox-button',
                         'handler': ev => this.close(ev),
@@ -439,7 +440,7 @@ converse.plugins.add('converse-chatview', {
                         'i18n_title': __('Close and end this conversation'),
                         'icon_class': 'fa-times',
                         'name': 'close',
-                        'standalone': _converse.api.settings.get("view_mode") === 'overlayed',
+                        'standalone': api.settings.get("view_mode") === 'overlayed',
                     });
                 }
                 return buttons;
@@ -456,9 +457,9 @@ converse.plugins.add('converse-chatview', {
                     'label_clear': __('Clear all messages'),
                     'label_message_limit': __('Message characters remaining'),
                     'label_toggle_spoiler': label_toggle_spoiler,
-                    'message_limit': _converse.api.settings.get('message_limit'),
-                    'show_call_button': _converse.api.settings.get('visible_toolbar_buttons').call,
-                    'show_spoiler_button': _converse.api.settings.get('visible_toolbar_buttons').spoiler,
+                    'message_limit': api.settings.get('message_limit'),
+                    'show_call_button': api.settings.get('visible_toolbar_buttons').call,
+                    'show_spoiler_button': api.settings.get('visible_toolbar_buttons').spoiler,
                     'tooltip_start_call': __('Start a call')
                 }
             },
@@ -476,7 +477,7 @@ converse.plugins.add('converse-chatview', {
                  * @type {_converse.ChatBoxView | _converse.ChatRoomView}
                  * @example _converse.api.listen.on('afterMessagesFetched', view => { ... });
                  */
-                _converse.api.trigger('afterMessagesFetched', this);
+                api.trigger('afterMessagesFetched', this);
             },
 
             insertIntoDOM () {
@@ -487,7 +488,7 @@ converse.plugins.add('converse-chatview', {
                  * @type { _converse.ChatBoxView | _converse.HeadlinesBoxView }
                  * @example _converse.api.listen.on('chatBoxInsertedIntoDOM', view => { ... });
                  */
-                _converse.api.trigger('chatBoxInsertedIntoDOM', this);
+                api.trigger('chatBoxInsertedIntoDOM', this);
                 return this;
             },
 
@@ -631,7 +632,7 @@ converse.plugins.add('converse-chatview', {
                  * @property { string } message - The message text
                  * @example _converse.api.listen.on('contactStatusMessageChanged', obj => { ... });
                  */
-                _converse.api.trigger('contactStatusMessageChanged', {
+                api.trigger('contactStatusMessageChanged', {
                     'contact': item.attributes,
                     'message': item.get('status')
                 });
@@ -792,7 +793,7 @@ converse.plugins.add('converse-chatview', {
                  * @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model
                  * @example _converse.api.listen.on('messageAdded', data => { ... });
                  */
-                _converse.api.trigger('messageAdded', {
+                api.trigger('messageAdded', {
                     'message': message,
                     'chatbox': this.model
                 });
@@ -824,7 +825,7 @@ converse.plugins.add('converse-chatview', {
                 ev.preventDefault();
                 const textarea = this.el.querySelector('.chat-textarea');
                 const message_text = textarea.value.trim();
-                if (_converse.api.settings.get('message_limit') && message_text.length > _converse.api.settings.get('message_limit') ||
+                if (api.settings.get('message_limit') && message_text.length > api.settings.get('message_limit') ||
                         !message_text.replace(/\s/g, '').length) {
                     return;
                 }
@@ -833,7 +834,7 @@ converse.plugins.add('converse-chatview', {
                         ['Sorry, the connection has been lost, and your message could not be sent'],
                         'error'
                     );
-                    _converse.api.connection.reconnect();
+                    api.connection.reconnect();
                     return;
                 }
                 let spoiler_hint, hint_el = {};
@@ -860,9 +861,9 @@ converse.plugins.add('converse-chatview', {
                      * @type { _converse.Message }
                      * @example _converse.api.listen.on('messageSend', message => { ... });
                      */
-                    _converse.api.trigger('messageSend', message);
+                    api.trigger('messageSend', message);
                 }
-                if (_converse.api.settings.get("view_mode") === 'overlayed') {
+                if (api.settings.get("view_mode") === 'overlayed') {
                     // XXX: Chrome flexbug workaround. The .chat-content area
                     // doesn't resize when the textarea is resized to its original size.
                     this.msgs_container.parentElement.style.display = 'none';
@@ -870,7 +871,7 @@ converse.plugins.add('converse-chatview', {
                 textarea.removeAttribute('disabled');
                 u.removeClass('disabled', textarea);
 
-                if (_converse.api.settings.get("view_mode") === 'overlayed') {
+                if (api.settings.get("view_mode") === 'overlayed') {
                     // XXX: Chrome flexbug workaround.
                     this.msgs_container.parentElement.style.display = '';
                 }
@@ -881,9 +882,9 @@ converse.plugins.add('converse-chatview', {
             },
 
             updateCharCounter (chars) {
-                if (_converse.api.settings.get('message_limit')) {
+                if (api.settings.get('message_limit')) {
                     const message_limit = this.el.querySelector('.message-limit');
-                    const counter = _converse.api.settings.get('message_limit') - chars.length;
+                    const counter = api.settings.get('message_limit') - chars.length;
                     message_limit.textContent = counter;
                     if (counter < 1) {
                         u.addClass('error', message_limit);
@@ -992,10 +993,10 @@ converse.plugins.add('converse-chatview', {
                         "be removed everywhere.");
 
                 const messages = [__('Are you sure you want to retract this message?')];
-                if (_converse.api.settings.get('show_retraction_warning')) {
+                if (api.settings.get('show_retraction_warning')) {
                     messages[1] = retraction_warning;
                 }
-                const result = await _converse.api.confirm(__('Confirm'), messages);
+                const result = await api.confirm(__('Confirm'), messages);
                 if (result) {
                     this.model.retractOwnMessage(message);
                 }
@@ -1138,7 +1139,7 @@ converse.plugins.add('converse-chatview', {
                  * @property { _converse.ChatBox | _converse.ChatRoom } _converse.connection - The XMPP Connection object
                  * @example _converse.api.listen.on('callButtonClicked', (connection, model) => { ... });
                  */
-                _converse.api.trigger('callButtonClicked', {
+                api.trigger('callButtonClicked', {
                     connection: _converse.connection,
                     model: this.model
                 });
@@ -1207,7 +1208,7 @@ converse.plugins.add('converse-chatview', {
                 if (_converse.router.history.getFragment() === "converse/chat?jid="+this.model.get('jid')) {
                     _converse.router.navigate('');
                 }
-                if (_converse.api.connection.connected()) {
+                if (api.connection.connected()) {
                     // Immediately sending the chat state, because the
                     // model is going to be destroyed afterwards.
                     this.model.setChatState(_converse.INACTIVE);
@@ -1221,7 +1222,7 @@ converse.plugins.add('converse-chatview', {
                  * @type { _converse.ChatBoxView | _converse.ChatRoomView }
                  * @example _converse.api.listen.on('chatBoxClosed', view => { ... });
                  */
-                _converse.api.trigger('chatBoxClosed', this);
+                api.trigger('chatBoxClosed', this);
                 return this;
             },
 
@@ -1236,7 +1237,7 @@ converse.plugins.add('converse-chatview', {
                  * @type { _converse.ChatBoxView | _converse.ChatRoomView }
                  * @example _converse.api.listen.on('chatBoxBlurred', (view, event) => { ... });
                  */
-                _converse.api.trigger('chatBoxBlurred', this, ev);
+                api.trigger('chatBoxBlurred', this, ev);
             },
 
             emitFocused (ev) {
@@ -1250,7 +1251,7 @@ converse.plugins.add('converse-chatview', {
                  * @type { _converse.ChatBoxView | _converse.ChatRoomView }
                  * @example _converse.api.listen.on('chatBoxFocused', (view, event) => { ... });
                  */
-                _converse.api.trigger('chatBoxFocused', this, ev);
+                api.trigger('chatBoxFocused', this, ev);
             },
 
             focus () {
@@ -1262,7 +1263,7 @@ converse.plugins.add('converse-chatview', {
             },
 
             maybeFocus () {
-                _converse.api.settings.get('auto_focus') && this.focus();
+                api.settings.get('auto_focus') && this.focus();
             },
 
             hide () {
@@ -1289,9 +1290,9 @@ converse.plugins.add('converse-chatview', {
                  * @type {object}
                  * @property { _converse.ChatBoxView | _converse.ChatRoomView } view
                  */
-                _converse.api.trigger('beforeShowingChatView', this);
+                api.trigger('beforeShowingChatView', this);
 
-                if (_converse.api.settings.get('animate')) {
+                if (api.settings.get('animate')) {
                     u.fadeIn(this.el, () => this.afterShown());
                 } else {
                     u.showElement(this.el);
@@ -1363,7 +1364,7 @@ converse.plugins.add('converse-chatview', {
                  * @property { _converse.ChatBox | _converse.ChatRoom } chatbox - The chat model
                  * @example _converse.api.listen.on('chatBoxScrolledDown', obj => { ... });
                  */
-                _converse.api.trigger('chatBoxScrolledDown', {'chatbox': this.model}); // TODO: clean up
+                api.trigger('chatBoxScrolledDown', {'chatbox': this.model}); // TODO: clean up
             },
 
             onWindowStateChanged (state) {
@@ -1381,7 +1382,7 @@ converse.plugins.add('converse-chatview', {
             }
         });
 
-        _converse.api.listen.on('chatBoxViewsInitialized', () => {
+        api.listen.on('chatBoxViewsInitialized', () => {
             const views = _converse.chatboxviews;
             _converse.chatboxes.on('add', async item => {
                 if (!views.get(item.get('id')) && item.get('type') === _converse.PRIVATE_CHAT_TYPE) {
@@ -1402,13 +1403,13 @@ converse.plugins.add('converse-chatview', {
                 });
             }
         }
-        _converse.api.listen.on('windowStateChanged', onWindowStateChanged);
-        _converse.api.listen.on('connected', () => _converse.api.disco.own.features.add(Strophe.NS.SPOILER));
+        api.listen.on('windowStateChanged', onWindowStateChanged);
+        api.listen.on('connected', () => api.disco.own.features.add(Strophe.NS.SPOILER));
         /************************ END Event Handlers ************************/
 
 
         /************************ BEGIN API ************************/
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * The "chatview" namespace groups methods pertaining to views
              * for one-on-one chats.

+ 44 - 43
src/converse-controlbox.js

@@ -98,10 +98,11 @@ converse.plugins.add('converse-controlbox', {
         /* The initialize function gets called as soon as the plugin is
          * loaded by converse.js's plugin machinery.
          */
-        const { _converse } = this,
-            { __ } = _converse;
+        const { _converse } = this;
+        const { api } = _converse;
+        const { __ } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             allow_logout: true,
             default_domain: undefined,
             locked_domain: undefined,
@@ -109,7 +110,7 @@ converse.plugins.add('converse-controlbox', {
             sticky_controlbox: false
         });
 
-        _converse.api.promises.add('controlBoxInitialized');
+        api.promises.add('controlBoxInitialized');
 
 
         _converse.ControlBox = _converse.ChatBox.extend({
@@ -119,7 +120,7 @@ converse.plugins.add('converse-controlbox', {
                     'bookmarked': false,
                     'box_id': 'controlbox',
                     'chat_state': undefined,
-                    'closed': !_converse.api.settings.get('show_controlbox_by_default'),
+                    'closed': !api.settings.get('show_controlbox_by_default'),
                     'num_unread': 0,
                     'time_opened': this.get('time_opened') || (new Date()).getTime(),
                     'type': _converse.CONTROLBOX_TYPE,
@@ -137,7 +138,7 @@ converse.plugins.add('converse-controlbox', {
 
             validate (attrs) {
                 if (attrs.type === _converse.CONTROLBOX_TYPE) {
-                    if (_converse.api.settings.get("view_mode") === 'embedded' && _converse.api.settings.get("singleton"))  {
+                    if (api.settings.get("view_mode") === 'embedded' && api.settings.get("singleton"))  {
                         return 'Controlbox not relevant in embedded view mode';
                     }
                     return;
@@ -191,13 +192,13 @@ converse.plugins.add('converse-controlbox', {
                  * @type { _converse.ControlBoxView }
                  * @example _converse.api.listen.on('controlBoxInitialized', view => { ... });
                  */
-                _converse.api.trigger('controlBoxInitialized', this);
+                api.trigger('controlBoxInitialized', this);
             },
 
             render () {
                 if (this.model.get('connected')) {
                     if (this.model.get('closed') === undefined) {
-                        this.model.set('closed', !_converse.api.settings.get('show_controlbox_by_default'));
+                        this.model.set('closed', !api.settings.get('show_controlbox_by_default'));
                     }
                 }
                 this.el.innerHTML = tpl_controlbox(Object.assign(this.model.toJSON()));
@@ -225,7 +226,7 @@ converse.plugins.add('converse-controlbox', {
 
              createBrandHeadingHTML () {
                 return tpl_brand_heading({
-                    'sticky_controlbox': _converse.api.settings.get('sticky_controlbox')
+                    'sticky_controlbox': api.settings.get('sticky_controlbox')
                 });
             },
 
@@ -285,10 +286,10 @@ converse.plugins.add('converse-controlbox', {
                 if (ev && ev.preventDefault) { ev.preventDefault(); }
                 if (ev?.name === 'closeAllChatBoxes' &&
                         (_converse.disconnection_cause !== _converse.LOGOUT ||
-                         _converse.api.settings.get('show_controlbox_by_default'))) {
+                         api.settings.get('show_controlbox_by_default'))) {
                     return;
                 }
-                if (_converse.api.settings.get('sticky_controlbox')) {
+                if (api.settings.get('sticky_controlbox')) {
                     return;
                 }
                 const connection = _converse?.connection || {};
@@ -302,7 +303,7 @@ converse.plugins.add('converse-controlbox', {
                 } else {
                     this.model.trigger('hide');
                 }
-                _converse.api.trigger('controlBoxClosed', this);
+                api.trigger('controlBoxClosed', this);
                 return this;
             },
 
@@ -315,13 +316,13 @@ converse.plugins.add('converse-controlbox', {
             },
 
             hide (callback) {
-                if (_converse.api.settings.get('sticky_controlbox')) {
+                if (api.settings.get('sticky_controlbox')) {
                     return;
                 }
                 u.addClass('hidden', this.el);
-                _converse.api.trigger('chatBoxClosed', this);
+                api.trigger('chatBoxClosed', this);
 
-                if (!_converse.api.connection.connected()) {
+                if (!api.connection.connected()) {
                     _converse.controlboxtoggle.render();
                 }
                 _converse.controlboxtoggle.show(callback);
@@ -336,7 +337,7 @@ converse.plugins.add('converse-controlbox', {
                  * @event _converse#controlBoxOpened
                  * @type {_converse.ControlBox}
                  */
-                _converse.api.trigger('controlBoxOpened', this);
+                api.trigger('controlBoxOpened', this);
             },
 
             show () {
@@ -387,12 +388,12 @@ converse.plugins.add('converse-controlbox', {
                         'LOGIN': _converse.LOGIN,
                         'PREBIND': _converse.PREBIND,
                         'auto_login': _converse.auto_login,
-                        'authentication': _converse.api.settings.get("authentication"),
+                        'authentication': api.settings.get("authentication"),
                         'connection_status': connection_status,
                         'conn_feedback_class': feedback_class,
                         'conn_feedback_subject': pretty_status,
                         'conn_feedback_message': _converse.connfeedback.get('message'),
-                        'placeholder_username': (_converse.api.settings.get('locked_domain') || _converse.api.settings.get('default_domain')) &&
+                        'placeholder_username': (api.settings.get('locked_domain') || api.settings.get('default_domain')) &&
                                                 __('Username') || __('user@domain'),
                         'show_trust_checkbox': _converse.trusted !== 'on' && _converse.trusted !== 'off'
                     })
@@ -402,8 +403,8 @@ converse.plugins.add('converse-controlbox', {
             initPopovers () {
                 Array.from(this.el.querySelectorAll('[data-title]')).forEach(el => {
                     new bootstrap.Popover(el, {
-                        'trigger': _converse.api.settings.get("view_mode") === 'mobile' && 'click' || 'hover',
-                        'dismissible': _converse.api.settings.get("view_mode") === 'mobile' && true || false,
+                        'trigger': api.settings.get("view_mode") === 'mobile' && 'click' || 'hover',
+                        'dismissible': api.settings.get("view_mode") === 'mobile' && true || false,
                         'container': this.el.parentElement.parentElement.parentElement
                     })
                 });
@@ -413,8 +414,8 @@ converse.plugins.add('converse-controlbox', {
                 const form = this.el.querySelector('form');
                 const jid_element = form.querySelector('input[name=jid]');
                 if (jid_element.value &&
-                        !_converse.api.settings.get('locked_domain') &&
-                        !_converse.api.settings.get('default_domain') &&
+                        !api.settings.get('locked_domain') &&
+                        !api.settings.get('default_domain') &&
                         !u.isValidJID(jid_element.value)) {
                     jid_element.setCustomValidity(__('Please enter a valid XMPP address'));
                     return false;
@@ -427,7 +428,7 @@ converse.plugins.add('converse-controlbox', {
                 /* Authenticate the user based on a form submission event.
                  */
                 if (ev && ev.preventDefault) { ev.preventDefault(); }
-                if (_converse.api.settings.get("authentication") === _converse.ANONYMOUS) {
+                if (api.settings.get("authentication") === _converse.ANONYMOUS) {
                     return this.connect(_converse.jid, null);
                 }
                 if (!this.validate()) { return; }
@@ -447,14 +448,14 @@ converse.plugins.add('converse-controlbox', {
                 }
 
                 let jid = form_data.get('jid');
-                if (_converse.api.settings.get('locked_domain')) {
-                    const last_part = '@' + _converse.api.settings.get('locked_domain');
+                if (api.settings.get('locked_domain')) {
+                    const last_part = '@' + api.settings.get('locked_domain');
                     if (jid.endsWith(last_part)) {
                         jid = jid.substr(0, jid.length - last_part.length);
                     }
                     jid = Strophe.escapeNode(jid) + last_part;
-                } else if (_converse.api.settings.get('default_domain') && !jid.includes('@')) {
-                    jid = jid + '@' + _converse.api.settings.get('default_domain');
+                } else if (api.settings.get('default_domain') && !jid.includes('@')) {
+                    jid = jid + '@' + api.settings.get('default_domain');
                 }
                this.connect(jid, form_data.get('password'));
             },
@@ -464,7 +465,7 @@ converse.plugins.add('converse-controlbox', {
                     _converse.router.navigate('', {'replace': true});
                 }
                 _converse.connection && _converse.connection.reset();
-                _converse.api.user.login(jid, password);
+                api.user.login(jid, password);
             }
         });
 
@@ -480,7 +481,7 @@ converse.plugins.add('converse-controlbox', {
                  * @type { _converse.ControlBoxPane }
                  * @example _converse.api.listen.on('controlBoxPaneInitialized', view => { ... });
                  */
-                _converse.api.trigger('controlBoxPaneInitialized', this);
+                api.trigger('controlBoxPaneInitialized', this);
             }
         });
 
@@ -498,7 +499,7 @@ converse.plugins.add('converse-controlbox', {
 
             initialize () {
                 _converse.chatboxviews.insertRowColumn(this.render().el);
-                _converse.api.waitUntil('initialized')
+                api.waitUntil('initialized')
                     .then(this.render.bind(this))
                     .catch(e => log.fatal(e));
             },
@@ -509,7 +510,7 @@ converse.plugins.add('converse-controlbox', {
                 // artifacts (i.e. on page load the toggle is shown only to then
                 // seconds later be hidden in favor of the controlbox).
                 this.el.innerHTML = tpl_controlbox_toggle({
-                    'label_toggle': _converse.api.connection.connected() ? __('Chat Contacts') : __('Toggle chat')
+                    'label_toggle': api.connection.connected() ? __('Chat Contacts') : __('Toggle chat')
                 })
                 return this;
             },
@@ -532,7 +533,7 @@ converse.plugins.add('converse-controlbox', {
                 if (!controlbox) {
                     controlbox = addControlBox();
                 }
-                if (_converse.api.connection.connected()) {
+                if (api.connection.connected()) {
                     controlbox.save({'closed': false});
                 } else {
                     controlbox.trigger('show');
@@ -543,7 +544,7 @@ converse.plugins.add('converse-controlbox', {
                 e.preventDefault();
                 if (u.isVisible(_converse.root.querySelector("#controlbox"))) {
                     const controlbox = _converse.chatboxes.get('controlbox');
-                    if (_converse.api.connection.connected) {
+                    if (api.connection.connected) {
                         controlbox.save({closed: true});
                     } else {
                         controlbox.trigger('hide');
@@ -557,7 +558,7 @@ converse.plugins.add('converse-controlbox', {
 
         /******************** Event Handlers ********************/
 
-        _converse.api.listen.on('chatBoxViewsInitialized', () => {
+        api.listen.on('chatBoxViewsInitialized', () => {
             _converse.chatboxes.on('add', item => {
                 if (item.get('type') === _converse.CONTROLBOX_TYPE) {
                     const views = _converse.chatboxviews;
@@ -572,7 +573,7 @@ converse.plugins.add('converse-controlbox', {
             });
         });
 
-        _converse.api.listen.on('clearSession', () => {
+        api.listen.on('clearSession', () => {
             const chatboxviews = _converse?.chatboxviews;
             const view = chatboxviews && chatboxviews.get('controlbox');
             if (view) {
@@ -585,11 +586,11 @@ converse.plugins.add('converse-controlbox', {
         });
 
 
-        _converse.api.waitUntil('chatBoxViewsInitialized')
+        api.waitUntil('chatBoxViewsInitialized')
            .then(addControlBox)
            .catch(e => log.fatal(e));
 
-        _converse.api.listen.on('chatBoxesFetched', () => {
+        api.listen.on('chatBoxesFetched', () => {
             const controlbox = _converse.chatboxes.get('controlbox') || addControlBox();
             controlbox.save({'connected': true});
         });
@@ -603,12 +604,12 @@ converse.plugins.add('converse-controlbox', {
             view.model.set({'connected': false});
             return view;
         };
-        _converse.api.listen.on('disconnected', () => disconnect().renderLoginPanel());
-        _converse.api.listen.on('will-reconnect', disconnect);
+        api.listen.on('disconnected', () => disconnect().renderLoginPanel());
+        api.listen.on('will-reconnect', disconnect);
 
         /************************ API ************************/
 
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * The "controlbox" namespace groups methods pertaining to the
              * controlbox view
@@ -623,9 +624,9 @@ converse.plugins.add('converse-controlbox', {
                  * @returns { Promise<_converse.ControlBox> }
                  */
                 async open () {
-                    await _converse.api.waitUntil('chatBoxesFetched');
-                    const model = await _converse.api.chatboxes.get('controlbox') ||
-                      _converse.api.chatboxes.create('controlbox', {}, _converse.Controlbox);
+                    await api.waitUntil('chatBoxesFetched');
+                    const model = await api.chatboxes.get('controlbox') ||
+                      api.chatboxes.create('controlbox', {}, _converse.Controlbox);
                     model.trigger('show');
                     return model;
                 },

+ 13 - 12
src/converse-dragresize.js

@@ -134,8 +134,9 @@ converse.plugins.add('converse-dragresize', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'allow_dragresize': true,
         });
 
@@ -252,7 +253,7 @@ converse.plugins.add('converse-dragresize', {
             },
 
             onStartVerticalResize (ev, trigger=true) {
-                if (!_converse.api.settings.get('allow_dragresize')) {
+                if (!api.settings.get('allow_dragresize')) {
                     return true;
                 }
                 // Record element attributes for mouseMove().
@@ -270,12 +271,12 @@ converse.plugins.add('converse-dragresize', {
                      * @event _converse#startVerticalResize
                      * @example _converse.api.listen.on('startVerticalResize', (view) => { ... });
                      */
-                    _converse.api.trigger('startVerticalResize', this);
+                    api.trigger('startVerticalResize', this);
                 }
             },
 
             onStartHorizontalResize (ev, trigger=true) {
-                if (!_converse.api.settings.get('allow_dragresize')) {
+                if (!api.settings.get('allow_dragresize')) {
                     return true;
                 }
                 const flyout = this.el.querySelector('.box-flyout'),
@@ -292,7 +293,7 @@ converse.plugins.add('converse-dragresize', {
                      * @event _converse#startHorizontalResize
                      * @example _converse.api.listen.on('startHorizontalResize', (view) => { ... });
                      */
-                    _converse.api.trigger('startHorizontalResize', this);
+                    api.trigger('startHorizontalResize', this);
                 }
 
             },
@@ -306,7 +307,7 @@ converse.plugins.add('converse-dragresize', {
                  * @event _converse#startDiagonalResize
                  * @example _converse.api.listen.on('startDiagonalResize', (view) => { ... });
                  */
-                _converse.api.trigger('startDiagonalResize', this);
+                api.trigger('startDiagonalResize', this);
             },
         };
         Object.assign(_converse.ChatBoxView.prototype, dragResizable);
@@ -332,7 +333,7 @@ converse.plugins.add('converse-dragresize', {
 
 
         function onMouseMove (ev) {
-            if (!_converse.resizing || !_converse.api.settings.get('allow_dragresize')) {
+            if (!_converse.resizing || !api.settings.get('allow_dragresize')) {
                 return true;
             }
             ev.preventDefault();
@@ -341,7 +342,7 @@ converse.plugins.add('converse-dragresize', {
 
 
         function onMouseUp (ev) {
-            if (!_converse.resizing || !_converse.api.settings.get('allow_dragresize')) {
+            if (!_converse.resizing || !api.settings.get('allow_dragresize')) {
                 return true;
             }
             ev.preventDefault();
@@ -353,7 +354,7 @@ converse.plugins.add('converse-dragresize', {
                     _converse.resizing.chatbox.width,
                     _converse.resizing.chatbox.model.get('default_width')
             );
-            if (_converse.api.connection.connected()) {
+            if (api.connection.connected()) {
                 _converse.resizing.chatbox.model.save({'height': height});
                 _converse.resizing.chatbox.model.save({'width': width});
             } else {
@@ -374,9 +375,9 @@ converse.plugins.add('converse-dragresize', {
             document.removeEventListener('mouseup', onMouseUp);
         }
 
-        _converse.api.listen.on('registeredGlobalEventHandlers', registerGlobalEventHandlers);
-        _converse.api.listen.on('unregisteredGlobalEventHandlers', unregisterGlobalEventHandlers);
-        _converse.api.listen.on('beforeShowingChatView', view => view.initDragResize().setDimensions());
+        api.listen.on('registeredGlobalEventHandlers', registerGlobalEventHandlers);
+        api.listen.on('unregisteredGlobalEventHandlers', unregisterGlobalEventHandlers);
+        api.listen.on('beforeShowingChatView', view => view.initDragResize().setDimensions());
         /************************ END Event Handlers ************************/
     }
 });

+ 10 - 9
src/converse-emoji-views.js

@@ -68,9 +68,10 @@ converse.plugins.add('converse-emoji-views', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
         const { __ } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'use_system_emojis': true,
             'visible_toolbar_buttons': {
                 'emoji': true
@@ -91,7 +92,7 @@ converse.plugins.add('converse-emoji-views', {
             },
 
             async createEmojiPicker () {
-                await _converse.api.emojis.initialize()
+                await api.emojis.initialize()
 
                 const id = `converse.emoji-${_converse.bare_jid}-${this.model.get('jid')}`;
                 const emojipicker = new _converse.EmojiPicker({'id': id});
@@ -151,7 +152,7 @@ converse.plugins.add('converse-emoji-views', {
                     Object.assign(
                         this.model.toJSON(), {
                             '_converse': _converse,
-                            'emoji_categories': _converse.api.settings.get('emoji_categories'),
+                            'emoji_categories': api.settings.get('emoji_categories'),
                             'emojis_by_category': _converse.emojis.json,
                             'onSkintonePicked': ev => this.chooseSkinTone(ev),
                             'onEmojiPicked': ev => this.insertEmoji(ev),
@@ -415,18 +416,18 @@ converse.plugins.add('converse-emoji-views', {
 
         /************************ BEGIN Event Handlers ************************/
 
-        _converse.api.listen.on('chatBoxClosed', view => view.emoji_picker_view && view.emoji_picker_view.remove());
+        api.listen.on('chatBoxClosed', view => view.emoji_picker_view && view.emoji_picker_view.remove());
 
-        _converse.api.listen.on('renderToolbar', view => {
-            if (_converse.api.settings.get('visible_toolbar_buttons').emoji) {
+        api.listen.on('renderToolbar', view => {
+            if (api.settings.get('visible_toolbar_buttons').emoji) {
                 const html = tpl_emoji_button({'tooltip_insert_smiley': __('Insert emojis')});
                 view.el.querySelector('.chat-toolbar').insertAdjacentHTML('afterBegin', html);
             }
         });
 
-        _converse.api.listen.on('headlinesBoxInitialized', () => _converse.api.emojis.initialize());
-        _converse.api.listen.on('chatRoomInitialized', () => _converse.api.emojis.initialize());
-        _converse.api.listen.on('chatBoxInitialized', () => _converse.api.emojis.initialize());
+        api.listen.on('headlinesBoxInitialized', () => api.emojis.initialize());
+        api.listen.on('chatRoomInitialized', () => api.emojis.initialize());
+        api.listen.on('chatBoxInitialized', () => api.emojis.initialize());
 
         /************************ END Event Handlers ************************/
     }

+ 4 - 3
src/converse-headlines-view.js

@@ -48,6 +48,7 @@ converse.plugins.add('converse-headlines-view', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
 
         const viewWithHeadlinesPanel = {
@@ -62,7 +63,7 @@ converse.plugins.add('converse-headlines-view', {
                  * @event _converse#headlinesPanelRendered
                  * @example _converse.api.listen.on('headlinesPanelRendered', () => { ... });
                  */
-                _converse.api.trigger('headlinesPanelRendered');
+                api.trigger('headlinesPanelRendered');
                 return this.headlinepanel;
             }
         }
@@ -150,7 +151,7 @@ converse.plugins.add('converse-headlines-view', {
                  * @type { _converse.HeadlinesBoxView }
                  * @example _converse.api.listen.on('headlinesBoxViewInitialized', view => { ... });
                  */
-                _converse.api.trigger('headlinesBoxViewInitialized', this);
+                api.trigger('headlinesBoxViewInitialized', this);
             },
 
             render () {
@@ -177,7 +178,7 @@ converse.plugins.add('converse-headlines-view', {
 
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('chatBoxViewsInitialized', () => {
+        api.listen.on('chatBoxViewsInitialized', () => {
             const views = _converse.chatboxviews;
             _converse.chatboxes.on('add', item => {
                 if (!views.get(item.get('id')) && item.get('type') === _converse.HEADLINES_TYPE) {

+ 9 - 8
src/converse-message-view.js

@@ -32,6 +32,7 @@ converse.plugins.add('converse-message-view', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
         const { __ } = _converse;
 
 
@@ -65,7 +66,7 @@ converse.plugins.add('converse-message-view', {
         }
 
 
-        _converse.api.settings.update({
+        api.settings.update({
             'show_images_inline': true,
             'time_format': 'HH:mm',
         });
@@ -153,7 +154,7 @@ converse.plugins.add('converse-message-view', {
             },
 
             fadeOut () {
-                if (_converse.api.settings.get('animate')) {
+                if (api.settings.get('animate')) {
                     setTimeout(() => this.remove(), 600);
                     u.addClass('fade-out', this.el);
                 } else {
@@ -204,10 +205,10 @@ converse.plugins.add('converse-message-view', {
                  * @param { string } text - The message text
                  * @example _converse.api.listen.on('beforeMessageBodyTransformed', (view, text) => { ... });
                  */
-                await _converse.api.trigger('beforeMessageBodyTransformed', this, text, {'Synchronous': true});
+                await api.trigger('beforeMessageBodyTransformed', this, text, {'Synchronous': true});
                 text = this.model.isMeCommand() ? text.substring(4) : text;
                 text = xss.filterXSS(text, {'whiteList': {}, 'onTag': onTagFoundDuringXSSFilter});
-                text = u.geoUriToHttp(text, _converse.api.settings.get("geouri_replacement"));
+                text = u.geoUriToHttp(text, api.settings.get("geouri_replacement"));
                 text = u.addMentionsMarkup(text, this.model.get('references'), this.model.collection.chatbox);
                 text = u.addHyperlinks(text);
                 text = u.renderNewLines(text);
@@ -220,12 +221,12 @@ converse.plugins.add('converse-message-view', {
                  * @param { string } text - The message text
                  * @example _converse.api.listen.on('afterMessageBodyTransformed', (view, text) => { ... });
                  */
-                await _converse.api.trigger('afterMessageBodyTransformed', this, text, {'Synchronous': true});
+                await api.trigger('afterMessageBodyTransformed', this, text, {'Synchronous': true});
                 return text;
             },
 
             async renderChatMessage () {
-                await _converse.api.waitUntil('emojisInitialized');
+                await api.waitUntil('emojisInitialized');
                 const time = dayjs(this.model.get('time'));
                 const role = this.model.vcard ? this.model.vcard.get('role') : null;
                 const roles = role ? role.split(',') : [];
@@ -243,7 +244,7 @@ converse.plugins.add('converse-message-view', {
                         'is_me_message': this.model.isMeCommand(),
                         'label_show': __('Show more'),
                         'occupant': this.model.occupant,
-                        'pretty_time': time.format(_converse.api.settings.get('time_format')),
+                        'pretty_time': time.format(api.settings.get('time_format')),
                         'retraction_text': is_retracted ? this.getRetractionText() : null,
                         'roles': roles,
                         'time': time.toISOString(),
@@ -259,7 +260,7 @@ converse.plugins.add('converse-message-view', {
                     const msg_content = msg.querySelector('.chat-msg__text');
                     if (text && text !== url) {
                         msg_content.innerHTML = await this.transformBodyText(text);
-                        if (_converse.api.settings.get('show_images_inline')) {
+                        if (api.settings.get('show_images_inline')) {
                             u.renderImageURLs(_converse, msg_content).then(() => this.triggerRendered());
                         }
                     }

+ 15 - 14
src/converse-minimize.js

@@ -165,8 +165,9 @@ converse.plugins.add('converse-minimize', {
          */
         const { _converse } = this;
         const { __ } = _converse;
+        const { api } = _converse;
 
-        _converse.api.settings.update({'no_trimming': false});
+        api.settings.update({'no_trimming': false});
 
         const minimizableChatBox = {
             maximize () {
@@ -210,7 +211,7 @@ converse.plugins.add('converse-minimize', {
                  * @type { _converse.ChatBoxView }
                  * @example _converse.api.listen.on('chatBoxMaximized', view => { ... });
                  */
-                _converse.api.trigger('chatBoxMaximized', this);
+                api.trigger('chatBoxMaximized', this);
                 return this;
             },
 
@@ -239,7 +240,7 @@ converse.plugins.add('converse-minimize', {
                  * @type { _converse.ChatBoxView }
                  * @example _converse.api.listen.on('chatBoxMinimized', view => { ... });
                  */
-                _converse.api.trigger('chatBoxMinimized', this);
+                api.trigger('chatBoxMinimized', this);
                 return this;
             },
 
@@ -314,7 +315,7 @@ converse.plugins.add('converse-minimize', {
              * @param { _converse.ChatBoxView|_converse.ChatRoomView|_converse.ControlBoxView|_converse.HeadlinesBoxView } [newchat]
              */
             async trimChats (newchat) {
-                if (_converse.api.settings.get('no_trimming') || !_converse.api.connection.connected() || _converse.api.settings.get("view_mode") !== 'overlayed') {
+                if (api.settings.get('no_trimming') || !api.connection.connected() || api.settings.get("view_mode") !== 'overlayed') {
                     return;
                 }
                 const shown_chats = this.getShownChats();
@@ -328,7 +329,7 @@ converse.plugins.add('converse-minimize', {
                     // fullscreen. In this case we don't trim.
                     return;
                 }
-                await _converse.api.waitUntil('minimizedChatsInitialized');
+                await api.waitUntil('minimizedChatsInitialized');
                 const minimized_el = _converse.minimized_chats?.el;
                 if (minimized_el) {
                     while ((this.getMinimizedWidth() + this.getBoxesWidth(newchat)) > body_width) {
@@ -369,7 +370,7 @@ converse.plugins.add('converse-minimize', {
         Object.assign(_converse.ChatBoxViews.prototype, chatTrimmer);
 
 
-        _converse.api.promises.add('minimizedChatsInitialized');
+        api.promises.add('minimizedChatsInitialized');
 
         _converse.MinimizedChatBoxView = View.extend({
             tagName: 'div',
@@ -390,7 +391,7 @@ converse.plugins.add('converse-minimize', {
                  * @type { _converse.MinimizedChatBoxView }
                  * @example _converse.api.listen.on('minimizedChatViewInitialized', view => { ... });
                  */
-                _converse.api.trigger('minimizedChatViewInitialized', this);
+                api.trigger('minimizedChatViewInitialized', this);
             },
 
             render () {
@@ -413,7 +414,7 @@ converse.plugins.add('converse-minimize', {
                     view.close();
                 } else {
                     this.model.destroy();
-                    _converse.api.trigger('chatBoxClosed', this);
+                    api.trigger('chatBoxClosed', this);
                 }
                 return this;
             },
@@ -562,17 +563,17 @@ converse.plugins.add('converse-minimize', {
              * @event _converse#minimizedChatsInitialized
              * @example _converse.api.listen.on('minimizedChatsInitialized', () => { ... });
              */
-            _converse.api.trigger('minimizedChatsInitialized');
+            api.trigger('minimizedChatsInitialized');
         }
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('chatBoxViewsInitialized', () => initMinimizedChats());
-        _converse.api.listen.on('chatBoxInsertedIntoDOM', view => _converse.chatboxviews.trimChats(view));
-        _converse.api.listen.on('controlBoxOpened', view => _converse.chatboxviews.trimChats(view));
+        api.listen.on('chatBoxViewsInitialized', () => initMinimizedChats());
+        api.listen.on('chatBoxInsertedIntoDOM', view => _converse.chatboxviews.trimChats(view));
+        api.listen.on('controlBoxOpened', view => _converse.chatboxviews.trimChats(view));
 
         const debouncedTrimChats = debounce(() => _converse.chatboxviews.trimChats(), 250);
-        _converse.api.listen.on('registeredGlobalEventHandlers', () => window.addEventListener("resize", debouncedTrimChats));
-        _converse.api.listen.on('unregisteredGlobalEventHandlers', () => window.removeEventListener("resize", debouncedTrimChats));
+        api.listen.on('registeredGlobalEventHandlers', () => window.addEventListener("resize", debouncedTrimChats));
+        api.listen.on('unregisteredGlobalEventHandlers', () => window.removeEventListener("resize", debouncedTrimChats));
         /************************ END Event Handlers ************************/
     }
 });

+ 32 - 31
src/converse-muc-views.js

@@ -90,14 +90,15 @@ converse.plugins.add('converse-muc-views', {
 
     initialize () {
         const { _converse } = this;
+        const { api } = _converse;
 
-        _converse.api.promises.add(['roomsPanelRendered']);
+        api.promises.add(['roomsPanelRendered']);
 
         // Configuration values for this plugin
         // ====================================
         // Refer to docs/source/configuration.rst for explanations of these
         // configuration settings.
-        _converse.api.settings.update({
+        api.settings.update({
             'auto_list_rooms': false,
             'cache_muc_messages': true,
             'locked_muc_nickname': false,
@@ -142,7 +143,7 @@ converse.plugins.add('converse-muc-views', {
                  * @event _converse#roomsPanelRendered
                  * @example _converse.api.listen.on('roomsPanelRendered', () => { ... });
                  */
-                _converse.api.trigger('roomsPanelRendered');
+                api.trigger('roomsPanelRendered');
                 return this.roomspanel;
             },
 
@@ -216,7 +217,7 @@ converse.plugins.add('converse-muc-views', {
                 parent_el.querySelector('a.room-info').classList.remove('selected');
             } else {
                 parent_el.insertAdjacentHTML('beforeend', tpl_spinner());
-                _converse.api.disco.info(ev.target.getAttribute('data-room-jid'), null)
+                api.disco.info(ev.target.getAttribute('data-room-jid'), null)
                     .then(stanza => insertRoomInfo(parent_el, stanza))
                     .catch(e => log.error(e));
             }
@@ -449,7 +450,7 @@ converse.plugins.add('converse-muc-views', {
                 const jid = ev.target.getAttribute('data-room-jid');
                 const name = ev.target.getAttribute('data-room-name');
                 this.modal.hide();
-                _converse.api.rooms.open(jid, {'name': name});
+                api.rooms.open(jid, {'name': name});
             },
 
             toggleRoomInfo (ev) {
@@ -516,7 +517,7 @@ converse.plugins.add('converse-muc-views', {
                     'from': _converse.connection.jid,
                     'type': "get"
                 }).c("query", {xmlns: Strophe.NS.DISCO_ITEMS});
-                _converse.api.sendIQ(iq)
+                api.sendIQ(iq)
                     .then(iq => this.onRoomsFound(iq))
                     .catch(() => this.informNoRoomsFound())
             },
@@ -606,7 +607,7 @@ converse.plugins.add('converse-muc-views', {
                     jid = data.jid
                     this.model.setDomain(jid);
                 }
-                _converse.api.rooms.open(jid, Object.assign(data, {jid}));
+                api.rooms.open(jid, Object.assign(data, {jid}));
                 this.modal.hide();
                 ev.target.reset();
             },
@@ -735,7 +736,7 @@ converse.plugins.add('converse-muc-views', {
                  * @type { _converse.ChatRoomView }
                  * @example _converse.api.listen.on('chatRoomViewInitialized', view => { ... });
                  */
-                _converse.api.trigger('chatRoomViewInitialized', this);
+                api.trigger('chatRoomViewInitialized', this);
             },
 
             render () {
@@ -990,7 +991,7 @@ converse.plugins.add('converse-muc-views', {
                     if (_converse.show_retraction_warning) {
                         messages[1] = retraction_warning;
                     }
-                    const result = await _converse.api.confirm(__('Confirm'), messages);
+                    const result = await api.confirm(__('Confirm'), messages);
                     if (result) {
                         this.retractOwnMessage(message);
                     }
@@ -1000,7 +1001,7 @@ converse.plugins.add('converse-muc-views', {
                         if (_converse.show_retraction_warning) {
                             messages = [messages[0], retraction_warning, messages[1]]
                         }
-                        if (await _converse.api.confirm(__('Confirm'), messages)) {
+                        if (await api.confirm(__('Confirm'), messages)) {
                             this.retractOtherMessage(message);
                         }
                     } else {
@@ -1011,7 +1012,7 @@ converse.plugins.add('converse-muc-views', {
                         if (_converse.show_retraction_warning) {
                             messages = [messages[0], retraction_warning, messages[1]]
                         }
-                        const reason = await _converse.api.prompt(
+                        const reason = await api.prompt(
                             __('Message Retraction'),
                             messages,
                             __('Optional reason')
@@ -1022,7 +1023,7 @@ converse.plugins.add('converse-muc-views', {
                     }
                 } else {
                     const err_msg = __(`Sorry, you're not allowed to retract this message`);
-                    _converse.api.alert('error', __('Error'), err_msg);
+                    api.alert('error', __('Error'), err_msg);
                 }
             },
 
@@ -1057,13 +1058,13 @@ converse.plugins.add('converse-muc-views', {
                 const result = await this.model.retractOtherMessage(message, reason);
                 if (result === null) {
                     const err_msg = __(`A timeout occurred while trying to retract the message`);
-                    _converse.api.alert('error', __('Error'), err_msg);
-                    _converse.log(err_msg, Strophe.LogLevel.WARN);
+                    api.alert('error', __('Error'), err_msg);
+                    log(err_msg, Strophe.LogLevel.WARN);
                 } else if (u.isErrorStanza(result)) {
                     const err_msg = __(`Sorry, you're not allowed to retract this message.`);
-                    _converse.api.alert('error', __('Error'), err_msg);
-                    _converse.log(err_msg, Strophe.LogLevel.WARN);
-                    _converse.log(result, Strophe.LogLevel.WARN);
+                    api.alert('error', __('Error'), err_msg);
+                    log(err_msg, Strophe.LogLevel.WARN);
+                    log(result, Strophe.LogLevel.WARN);
                 }
             },
 
@@ -1225,17 +1226,17 @@ converse.plugins.add('converse-muc-views', {
                     });
                 }
 
-                if (!_converse.api.settings.get("singleton")) {
+                if (!api.settings.get("singleton")) {
                     buttons.push({
                         'i18n_text': __('Leave'),
                         'i18n_title': __('Leave and close this groupchat'),
                         'handler': async ev => {
                             const messages = [__('Are you sure you want to leave this groupchat?')];
-                            const result = await _converse.api.confirm(__('Confirm'), messages);
+                            const result = await api.confirm(__('Confirm'), messages);
                             result && this.close(ev);
                         },
                         'a_class': 'close-chatbox-button',
-                        'standalone': _converse.api.settings.get("view_mode") === 'overlayed',
+                        'standalone': api.settings.get("view_mode") === 'overlayed',
                         'icon_class': 'fa-sign-out-alt',
                         'name': 'signout'
                     });
@@ -1547,7 +1548,7 @@ converse.plugins.add('converse-muc-views', {
 
             async destroy (reason, new_jid) {
                 const message = [__('Are you sure you want to destroy this groupchat?')];
-                if (await _converse.api.confirm(__('Confirm'), message)) {
+                if (await api.confirm(__('Confirm'), message)) {
                     return this.model.sendDestroyIQ(reason, new_jid).then(() => this.close())
                 }
             },
@@ -1646,7 +1647,7 @@ converse.plugins.add('converse-muc-views', {
                             this.showErrorMessage(__('Your nickname is "%1$s"', this.model.get('nick')))
                         } else {
                             const jid = Strophe.getBareJidFromJid(this.model.get('jid'));
-                            _converse.api.send($pres({
+                            api.send($pres({
                                 from: _converse.connection.jid,
                                 to: `${jid}/${args}`,
                                 id: u.getUniqueId()
@@ -1825,7 +1826,7 @@ converse.plugins.add('converse-muc-views', {
                 if (switch_el) {
                     switch_el.addEventListener('click', async ev => {
                         ev.preventDefault();
-                        const room = await _converse.api.rooms.get(moved_jid, null, true);
+                        const room = await api.rooms.get(moved_jid, null, true);
                         room.maybeShow(true);
                         this.model.destroy();
                     });
@@ -2359,8 +2360,8 @@ converse.plugins.add('converse-muc-views', {
                     });
                 }
             }
-            _converse.api.waitUntil('discoInitialized').then(() => {
-                _converse.api.listen.on('serviceDiscovered', featureAdded);
+            api.waitUntil('discoInitialized').then(() => {
+                api.listen.on('serviceDiscovered', featureAdded);
                 // Features could have been added before the controlbox was
                 // initialized. We're only interested in MUC
                 _converse.disco_entities.each(entity => featureAdded(entity.features.findWhere({'var': Strophe.NS.MUC })));
@@ -2381,11 +2382,11 @@ converse.plugins.add('converse-muc-views', {
 
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('chatBoxViewsInitialized', () => {
+        api.listen.on('chatBoxViewsInitialized', () => {
 
             function openChatRoomFromURIClicked (ev) {
                 ev.preventDefault();
-                _converse.api.rooms.open(ev.target.href);
+                api.rooms.open(ev.target.href);
             }
             _converse.chatboxviews.delegate('click', 'a.open-chatroom', openChatRoomFromURIClicked);
 
@@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc-views', {
             _converse.chatboxes.on('add', addView);
         });
 
-        _converse.api.listen.on('clearSession', () => {
+        api.listen.on('clearSession', () => {
             const view = _converse.chatboxviews.get('controlbox');
             if (view && view.roomspanel) {
                 view.roomspanel.model.destroy();
@@ -2411,7 +2412,7 @@ converse.plugins.add('converse-muc-views', {
             }
         });
 
-        _converse.api.listen.on('controlBoxInitialized', (view) => {
+        api.listen.on('controlBoxInitialized', (view) => {
             if (!_converse.allow_muc) {
                 return;
             }
@@ -2454,10 +2455,10 @@ converse.plugins.add('converse-muc-views', {
                  */
                 get (jids) {
                     if (Array.isArray(jids)) {
-                        const views = _converse.api.chatviews.get(jids);
+                        const views = api.chatviews.get(jids);
                         return views.filter(v => v.model.get('type') === _converse.CHATROOMS_TYPE)
                     } else {
-                        const view = _converse.api.chatviews.get(jids);
+                        const view = api.chatviews.get(jids);
                         if (view.model.get('type') === _converse.CHATROOMS_TYPE) {
                             return view;
                         } else {

+ 12 - 11
src/converse-notification.js

@@ -20,17 +20,18 @@ converse.plugins.add('converse-notification', {
          */
         const { _converse } = this;
         const { __ } = _converse;
+        const { api } = _converse;
 
         _converse.supports_html5_notification = "Notification" in window;
 
-        _converse.api.settings.update({
+        api.settings.update({
             notify_all_room_messages: false,
             show_desktop_notifications: true,
             show_chat_state_notifications: false,
             chatstate_notification_blacklist: [],
             // ^ a list of JIDs to ignore concerning chat state notifications
             play_sounds: true,
-            sounds_path: _converse.api.settings.get("assets_path")+'/sounds/',
+            sounds_path: api.settings.get("assets_path")+'/sounds/',
             notification_icon: 'logo/conversejs-filled.svg',
             notification_delay: 5000
         });
@@ -135,7 +136,7 @@ converse.plugins.add('converse-notification', {
             const full_from_jid = message.getAttribute('from'),
                   from_jid = Strophe.getBareJidFromJid(full_from_jid);
             if (message.getAttribute('type') === 'headline') {
-                if (!from_jid.includes('@') || _converse.api.settings.get("allow_non_roster_messaging")) {
+                if (!from_jid.includes('@') || api.settings.get("allow_non_roster_messaging")) {
                     title = __("Notification from %1$s", from_jid);
                 } else {
                     return;
@@ -154,7 +155,7 @@ converse.plugins.add('converse-notification', {
                 if (roster_item !== undefined) {
                     title = __("%1$s says", roster_item.getDisplayName());
                 } else {
-                    if (_converse.api.settings.get("allow_non_roster_messaging")) {
+                    if (api.settings.get("allow_non_roster_messaging")) {
                         title = __("%1$s says", from_jid);
                     } else {
                         return;
@@ -262,7 +263,7 @@ converse.plugins.add('converse-notification', {
              * @type { XMLElement }
              * @example _converse.api.listen.on('messageNotification', stanza => { ... });
              */
-            _converse.api.trigger('messageNotification', message);
+            api.trigger('messageNotification', message);
             _converse.playSoundNotification();
             _converse.showMessageNotification(message);
         };
@@ -286,15 +287,15 @@ converse.plugins.add('converse-notification', {
             }
         };
 
-        _converse.api.listen.on('pluginsInitialized', function () {
+        api.listen.on('pluginsInitialized', function () {
             // We only register event handlers after all plugins are
             // registered, because other plugins might override some of our
             // handlers.
-            _converse.api.listen.on('contactRequest',  _converse.handleContactRequestNotification);
-            _converse.api.listen.on('contactPresenceChanged',  _converse.handleChatStateNotification);
-            _converse.api.listen.on('message',  _converse.handleMessageNotification);
-            _converse.api.listen.on('feedback', _converse.handleFeedback);
-            _converse.api.listen.on('connected', _converse.requestPermission);
+            api.listen.on('contactRequest',  _converse.handleContactRequestNotification);
+            api.listen.on('contactPresenceChanged',  _converse.handleChatStateNotification);
+            api.listen.on('message',  _converse.handleMessageNotification);
+            api.listen.on('feedback', _converse.handleFeedback);
+            api.listen.on('connected', _converse.requestPermission);
         });
     }
 });

+ 8 - 6
src/converse-oauth.js

@@ -55,8 +55,9 @@ converse.plugins.add("converse-oauth", {
 
             render () {
                 const { _converse } = this.__super__;
+                const { api } = _converse;
                 const result = this.__super__.render.apply(this, arguments);
-                if (_converse.oauth_providers && !_converse.api.settings.get("auto_login")) {
+                if (_converse.oauth_providers && !api.settings.get("auto_login")) {
                     this.insertOAuthProviders();
                 }
                 return result;
@@ -68,10 +69,11 @@ converse.plugins.add("converse-oauth", {
         /* The initialize function gets called as soon as the plugin is
          * loaded by converse.js's plugin machinery.
          */
-        const { _converse } = this,
-              { __ } = _converse;
+        const { _converse } = this;
+        const { api } = _converse;
+        const { __ } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'oauth_providers': {},
         });
 
@@ -79,7 +81,7 @@ converse.plugins.add("converse-oauth", {
             'sync': function sync () {},
 
             initialize () {
-                _converse.api.settings.get('oauth_providers').forEach(provider => {
+                api.settings.get('oauth_providers').forEach(provider => {
                     const item = new Model(Object.assign(provider, {
                         'login_text': __('Log in with %1$s', provider.name)
                     }));
@@ -102,7 +104,7 @@ converse.plugins.add("converse-oauth", {
             async fetchOAuthProfileDataAndLogin () {
                 const profile = await this.oauth_service.api('me');
                 const response = this.oauth_service.getAuthResponse();
-                _converse.api.user.login(
+                api.user.login(
                     `${profile.name}@${this.provider.get('host')}`,
                     response.access_token
                 );

+ 25 - 24
src/converse-omemo.js

@@ -242,12 +242,13 @@ converse.plugins.add('converse-omemo', {
          */
         const { _converse } = this;
         const { __ } = _converse;
+        const { api } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'omemo_default': false,
         });
 
-        _converse.api.promises.add(['OMEMOInitialized']);
+        api.promises.add(['OMEMOInitialized']);
 
         _converse.NUM_PREKEYS = 100; // Set here so that tests can override
 
@@ -306,7 +307,7 @@ converse.plugins.add('converse-omemo', {
             },
 
             reportDecryptionError (e) {
-                if (_converse.api.settings.get("loglevel") === 'debug') {
+                if (api.settings.get("loglevel") === 'debug') {
                     const { __ } = _converse;
                     this.createMessage({
                         'message': __("Sorry, could not decrypt a received OMEMO message due to an error.") + ` ${e.name} ${e.message}`,
@@ -414,10 +415,10 @@ converse.plugins.add('converse-omemo', {
                         err_msgs.push(__("Unable to send an encrypted message due to an unexpected error."));
                         err_msgs.push(e.iq.outerHTML);
                     }
-                    _converse.api.alert('error', __('Error'), err_msgs);
+                    api.alert('error', __('Error'), err_msgs);
                     log.error(e);
                 } else if (e.user_facing) {
-                    _converse.api.alert('error', __('Error'), [e.message]);
+                    api.alert('error', __('Error'), [e.message]);
                     log.error(e);
                 } else {
                     throw e;
@@ -471,7 +472,7 @@ converse.plugins.add('converse-omemo', {
                             this.model.contact.getDisplayName()
                         )];
                     }
-                    return _converse.api.alert('error', __('Error'), messages);
+                    return api.alert('error', __('Error'), messages);
                 }
                 ev.preventDefault();
                 this.model.save({'omemo_active': !this.model.get('omemo_active')});
@@ -500,7 +501,7 @@ converse.plugins.add('converse-omemo', {
         }
 
         async function getDevicesForContact (jid) {
-            await _converse.api.waitUntil('OMEMOInitialized');
+            await api.waitUntil('OMEMOInitialized');
             const devicelist = _converse.devicelists.get(jid) || _converse.devicelists.create({'jid': jid});
             await devicelist.fetchDevices();
             return devicelist.devices;
@@ -828,7 +829,7 @@ converse.plugins.add('converse-omemo', {
 
                 Object.values(this.get('prekeys')).forEach((prekey, id) => item.c('preKeyPublic', {'preKeyId': id}).t(prekey.pubKey).up());
                 const options = {'pubsub#access_model': 'open'};
-                return _converse.api.pubsub.publish(null, node, item, options, false);
+                return api.pubsub.publish(null, node, item, options, false);
             },
 
             async generateMissingPreKeys () {
@@ -933,7 +934,7 @@ converse.plugins.add('converse-omemo', {
 
                 let iq;
                 try {
-                    iq = await _converse.api.sendIQ(stanza)
+                    iq = await api.sendIQ(stanza)
                 } catch (iq) {
                     throw new IQError("Could not fetch bundle", iq);
                 }
@@ -1037,7 +1038,7 @@ converse.plugins.add('converse-omemo', {
 
                 let iq;
                 try {
-                    iq = await _converse.api.sendIQ(stanza);
+                    iq = await api.sendIQ(stanza);
                 } catch (e) {
                     log.error(e);
                     return [];
@@ -1054,7 +1055,7 @@ converse.plugins.add('converse-omemo', {
                 const item = $build('item').c('list', {'xmlns': Strophe.NS.OMEMO})
                 this.devices.filter(d => d.get('active')).forEach(d => item.c('device', {'id': d.get('id')}).up());
                 const options = {'pubsub#access_model': 'open'};
-                return _converse.api.pubsub.publish(null, Strophe.NS.OMEMO_DEVICELIST, item, options, false);
+                return api.pubsub.publish(null, Strophe.NS.OMEMO_DEVICELIST, item, options, false);
             },
 
             removeOwnDevices (device_ids) {
@@ -1193,7 +1194,7 @@ converse.plugins.add('converse-omemo', {
              * @event _converse#OMEMOInitialized
              * @example _converse.api.listen.on('OMEMOInitialized', () => { ... });
              */
-            _converse.api.trigger('OMEMOInitialized');
+            api.trigger('OMEMOInitialized');
         }
 
         async function onOccupantAdded (chatroom, occupant) {
@@ -1216,20 +1217,20 @@ converse.plugins.add('converse-omemo', {
         async function checkOMEMOSupported (chatbox) {
             let supported;
             if (chatbox.get('type') === _converse.CHATROOMS_TYPE) {
-                await _converse.api.waitUntil('OMEMOInitialized');
+                await api.waitUntil('OMEMOInitialized');
                 supported = chatbox.features.get('nonanonymous') && chatbox.features.get('membersonly');
             } else if (chatbox.get('type') === _converse.PRIVATE_CHAT_TYPE) {
                 supported = await _converse.contactHasOMEMOSupport(chatbox.get('jid'));
             }
             chatbox.set('omemo_supported', supported);
-            if (supported && _converse.api.settings.get('omemo_default')) {
+            if (supported && api.settings.get('omemo_default')) {
                 chatbox.set('omemo_active', true);
             }
         }
 
         /******************** Event Handlers ********************/
 
-        _converse.api.waitUntil('chatBoxesInitialized').then(() =>
+        api.waitUntil('chatBoxesInitialized').then(() =>
             _converse.chatboxes.on('add', chatbox => {
                 checkOMEMOSupported(chatbox);
                 if (chatbox.get('type') === _converse.CHATROOMS_TYPE) {
@@ -1239,24 +1240,24 @@ converse.plugins.add('converse-omemo', {
             })
         );
 
-        _converse.api.listen.on('connected', registerPEPPushHandler);
-        _converse.api.listen.on('renderToolbar', view => view.renderOMEMOToolbarButton());
-        _converse.api.listen.on('statusInitialized', initOMEMO);
-        _converse.api.listen.on('addClientFeatures',
-            () => _converse.api.disco.own.features.add(`${Strophe.NS.OMEMO_DEVICELIST}+notify`));
+        api.listen.on('connected', registerPEPPushHandler);
+        api.listen.on('renderToolbar', view => view.renderOMEMOToolbarButton());
+        api.listen.on('statusInitialized', initOMEMO);
+        api.listen.on('addClientFeatures',
+            () => api.disco.own.features.add(`${Strophe.NS.OMEMO_DEVICELIST}+notify`));
 
-        _converse.api.listen.on('userDetailsModalInitialized', (contact) => {
+        api.listen.on('userDetailsModalInitialized', (contact) => {
             const jid = contact.get('jid');
             _converse.generateFingerprints(jid).catch(e => log.error(e));
         });
 
-        _converse.api.listen.on('profileModalInitialized', () => {
+        api.listen.on('profileModalInitialized', () => {
             _converse.generateFingerprints(_converse.bare_jid).catch(e => log.error(e));
         });
 
-        _converse.api.listen.on('afterTearDown', () => (delete _converse.omemo_store));
+        api.listen.on('afterTearDown', () => (delete _converse.omemo_store));
 
-        _converse.api.listen.on('clearSession', () => {
+        api.listen.on('clearSession', () => {
             if (_converse.shouldClearCache() && _converse.devicelists) {
                 _converse.devicelists.clearStore();
                 delete _converse.devicelists;

+ 11 - 10
src/converse-profile.js

@@ -27,10 +27,11 @@ converse.plugins.add('converse-profile', {
         /* The initialize function gets called as soon as the plugin is
          * loaded by converse.js's plugin machinery.
          */
-        const { _converse } = this,
-              { __ } = _converse;
+        const { _converse } = this;
+        const { api } = _converse;
+        const { __ } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'show_client_info': true
         });
 
@@ -52,7 +53,7 @@ converse.plugins.add('converse-profile', {
                  * @type { _converse.XMPPStatus }
                  * @example _converse.api.listen.on('profileModalInitialized', status => { ... });
                  */
-                _converse.api.trigger('profileModalInitialized', this.model);
+                api.trigger('profileModalInitialized', this.model);
             },
 
             toHTML () {
@@ -84,11 +85,11 @@ converse.plugins.add('converse-profile', {
             },
 
             setVCard (data) {
-                _converse.api.vcard.set(_converse.bare_jid, data)
-                .then(() => _converse.api.vcard.update(this.model.vcard, true))
+                api.vcard.set(_converse.bare_jid, data)
+                .then(() => api.vcard.update(this.model.vcard, true))
                 .catch((err) => {
                     log.fatal(err);
-                    _converse.api.show('error', __('Error'), [
+                    api.show('error', __('Error'), [
                         __("Sorry, an error happened while trying to save your profile data."),
                         __("You can check your browser's developer console for any error output.")
                     ]);
@@ -251,7 +252,7 @@ converse.plugins.add('converse-profile', {
                 ev.preventDefault();
                 const result = confirm(__("Are you sure you want to log out?"));
                 if (result === true) {
-                    _converse.api.user.logout();
+                    api.user.logout();
                 }
             },
 
@@ -274,8 +275,8 @@ converse.plugins.add('converse-profile', {
 
 
         /******************** Event Handlers ********************/
-        _converse.api.listen.on('controlBoxPaneInitialized', async view => {
-            await _converse.api.waitUntil('VCardsInitialized');
+        api.listen.on('controlBoxPaneInitialized', async view => {
+            await api.waitUntil('VCardsInitialized');
             _converse.xmppstatusview = new _converse.XMPPStatusView({'model': _converse.xmppstatus});
             view.el.insertAdjacentElement('afterBegin', _converse.xmppstatusview.render().el);
         });

+ 13 - 12
src/converse-push.js

@@ -22,8 +22,9 @@ converse.plugins.add('converse-push', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'push_app_servers': [],
             'enable_muc_push': false
         });
@@ -32,7 +33,7 @@ converse.plugins.add('converse-push', {
             if (!push_app_server.jid) {
                 return;
             }
-            if (!(await _converse.api.disco.supports(Strophe.NS.PUSH, domain || _converse.bare_jid))) {
+            if (!(await api.disco.supports(Strophe.NS.PUSH, domain || _converse.bare_jid))) {
                 log.warn(`Not disabling push app server "${push_app_server.jid}", no disco support from your server.`);
                 return;
             }
@@ -47,7 +48,7 @@ converse.plugins.add('converse-push', {
             if (push_app_server.node) {
                 stanza.attrs({'node': push_app_server.node});
             }
-            _converse.api.sendIQ(stanza)
+            api.sendIQ(stanza)
             .catch(e => {
                 log.error(`Could not disable push app server for ${push_app_server.jid}`);
                 log.error(e);
@@ -58,15 +59,15 @@ converse.plugins.add('converse-push', {
             if (!push_app_server.jid || !push_app_server.node) {
                 return;
             }
-            const identity = await _converse.api.disco.getIdentity('pubsub', 'push', push_app_server.jid);
+            const identity = await api.disco.getIdentity('pubsub', 'push', push_app_server.jid);
             if (!identity) {
                 return log.warn(
                     `Not enabling push the service "${push_app_server.jid}", it doesn't have the right disco identtiy.`
                 );
             }
             const result = await Promise.all([
-                _converse.api.disco.supports(Strophe.NS.PUSH, push_app_server.jid),
-                _converse.api.disco.supports(Strophe.NS.PUSH, domain)
+                api.disco.supports(Strophe.NS.PUSH, push_app_server.jid),
+                api.disco.supports(Strophe.NS.PUSH, domain)
             ]);
             if (!result[0] && !result[1]) {
                 log.warn(`Not enabling push app server "${push_app_server.jid}", no disco support from your server.`);
@@ -88,7 +89,7 @@ converse.plugins.add('converse-push', {
                     .c('field', {'var': 'secret'})
                         .c('value').t(push_app_server.secret);
             }
-            return _converse.api.sendIQ(stanza);
+            return api.sendIQ(stanza);
         }
 
         async function enablePush (domain) {
@@ -97,8 +98,8 @@ converse.plugins.add('converse-push', {
             if (push_enabled.includes(domain)) {
                 return;
             }
-            const enabled_services = reject(_converse.api.settings.get('push_app_servers'), 'disable');
-            const disabled_services = filter(_converse.api.settings.get('push_app_servers'), 'disable');
+            const enabled_services = reject(api.settings.get('push_app_servers'), 'disable');
+            const disabled_services = filter(api.settings.get('push_app_servers'), 'disable');
             const enabled = enabled_services.map(s => enablePushAppServer(domain, s));
             const disabled = disabled_services.map(s => disablePushAppServer(domain, s));
             try {
@@ -111,15 +112,15 @@ converse.plugins.add('converse-push', {
             }
             _converse.session.save('push_enabled', push_enabled);
         }
-        _converse.api.listen.on('statusInitialized', () => enablePush());
+        api.listen.on('statusInitialized', () => enablePush());
 
         function onChatBoxAdded (model) {
             if (model.get('type') == _converse.CHATROOMS_TYPE) {
                 enablePush(Strophe.getDomainFromJid(model.get('jid')));
             }
         }
-        if (_converse.api.settings.get('enable_muc_push')) {
-            _converse.api.listen.on('chatBoxesInitialized',  () => _converse.chatboxes.on('add', onChatBoxAdded));
+        if (api.settings.get('enable_muc_push')) {
+            api.listen.on('chatBoxesInitialized',  () => _converse.chatboxes.on('add', onChatBoxAdded));
         }
     }
 });

+ 18 - 17
src/converse-register.js

@@ -7,6 +7,7 @@
  * @license Mozilla Public License (MPLv2)
  */
 import "converse-controlbox";
+import { __ } from '@converse/headless/i18n';
 import { View } from "skeletor.js/src/view";
 import { pick } from "lodash";
 import converse from "@converse/headless/converse-core";
@@ -63,15 +64,15 @@ converse.plugins.add('converse-register', {
         /* The initialize function gets called as soon as the plugin is
          * loaded by converse.js's plugin machinery.
          */
-        const { _converse } = this,
-            { __ } = _converse;
+        const { _converse } = this;
+        const { api } = _converse;
 
         _converse.CONNECTION_STATUS[Strophe.Status.REGIFAIL] = 'REGIFAIL';
         _converse.CONNECTION_STATUS[Strophe.Status.REGISTERED] = 'REGISTERED';
         _converse.CONNECTION_STATUS[Strophe.Status.CONFLICT] = 'CONFLICT';
         _converse.CONNECTION_STATUS[Strophe.Status.NOTACCEPTABLE] = 'NOTACCEPTABLE';
 
-        _converse.api.settings.update({
+        api.settings.update({
             'allow_registration': true,
             'domain_placeholder': __(" e.g. conversejs.org"),  // Placeholder text shown in the domain input on the registration form
             'providers_link': 'https://compliance.conversations.im/', // Link to XMPP providers shown on registration page
@@ -95,7 +96,7 @@ converse.plugins.add('converse-register', {
             },
 
             renderRegistrationPanel () {
-                if (_converse.api.settings.get('allow_registration')) {
+                if (api.settings.get('allow_registration')) {
                     this.registerpanel = new _converse.RegisterPanel({
                         'model': this.model
                     });
@@ -113,7 +114,7 @@ converse.plugins.add('converse-register', {
 
 
         function setActiveForm (value) {
-            _converse.api.waitUntil('controlBoxInitialized').then(() => {
+            api.waitUntil('controlBoxInitialized').then(() => {
                 const controlbox = _converse.chatboxes.get('controlbox')
                 controlbox.set({'active-form': value});
             }).catch(e => log.fatal(e));
@@ -138,22 +139,22 @@ converse.plugins.add('converse-register', {
 
             initialize () {
                 this.reset();
-                _converse.api.listen.on('connectionInitialized', () => this.registerHooks());
+                api.listen.on('connectionInitialized', () => this.registerHooks());
             },
 
             render () {
                 this.model.set('registration_form_rendered', false);
                 this.el.innerHTML = tpl_register_panel({
                     '__': __,
-                    'default_domain': _converse.api.settings.get('registration_domain'),
+                    'default_domain': api.settings.get('registration_domain'),
                     'label_register': __('Fetch registration form'),
                     'help_providers': __('Tip: A list of public XMPP providers is available'),
                     'help_providers_link': __('here'),
-                    'href_providers': _converse.api.settings.get('providers_link'),
-                    'domain_placeholder': _converse.api.settings.get('domain_placeholder')
+                    'href_providers': api.settings.get('providers_link'),
+                    'domain_placeholder': api.settings.get('domain_placeholder')
                 });
-                if (_converse.api.settings.get('registration_domain')) {
-                    this.fetchRegistrationForm(_converse.api.settings.get('registration_domain'));
+                if (api.settings.get('registration_domain')) {
+                    this.fetchRegistrationForm(api.settings.get('registration_domain'));
                 }
                 return this;
             },
@@ -324,7 +325,7 @@ converse.plugins.add('converse-register', {
                     'beforeend',
                     tpl_registration_request({
                         '__': _converse.__,
-                        'cancel': _converse.api.settings.get('registration_domain'),
+                        'cancel': api.settings.get('registration_domain'),
                     })
                 );
             },
@@ -447,11 +448,11 @@ converse.plugins.add('converse-register', {
             renderRegistrationForm (stanza) {
                 const form = this.el.querySelector('form');
                 form.innerHTML = tpl_registration_form({
-                    '__': _converse.__,
+                    '__': __,
                     'domain': this.domain,
                     'title': this.title,
                     'instructions': this.instructions,
-                    'registration_domain': _converse.api.settings.get('registration_domain')
+                    'registration_domain': api.settings.get('registration_domain')
                 });
 
                 const buttons = form.querySelector('fieldset.buttons');
@@ -522,9 +523,9 @@ converse.plugins.add('converse-register', {
                 _converse.connection._proto._abortAllRequests();
                 _converse.connection.reset();
                 if (this.model.get('registration_form_rendered')) {
-                    if (_converse.api.settings.get('registration_domain') && this.model.get('registration_form_rendered')) {
+                    if (api.settings.get('registration_domain') && this.model.get('registration_form_rendered')) {
                         this.fetchRegistrationForm(
-                            _converse.api.settings.get('registration_domain')
+                            api.settings.get('registration_domain')
                         );
                     }
                 } else {
@@ -645,7 +646,7 @@ converse.plugins.add('converse-register', {
         });
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('controlBoxInitialized', view => {
+        api.listen.on('controlBoxInitialized', view => {
             view.model.on('change:active-form', view.showLoginOrRegisterForm, view);
         });
         /************************ END Event Handlers ************************/

+ 10 - 9
src/converse-roomslist.js

@@ -38,9 +38,10 @@ converse.plugins.add('converse-roomslist', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
         // Promises exposed by this plugin
-        _converse.api.promises.add('roomsListInitialized');
+        api.promises.add('roomsListInitialized');
 
 
         _converse.RoomsList = Model.extend({
@@ -121,8 +122,8 @@ converse.plugins.add('converse-roomslist', {
                 const data = {
                     'name': name || Strophe.unescapeNode(Strophe.getNodeFromJid(jid)) || jid
                 }
-                await _converse.api.rooms.open(jid, data, true);
-                _converse.api.chatviews.get(jid).maybeFocus();
+                await api.rooms.open(jid, data, true);
+                api.chatviews.get(jid).maybeFocus();
             },
 
             closeRoom (ev) {
@@ -164,22 +165,22 @@ converse.plugins.add('converse-roomslist', {
              * @event _converse#roomsListInitialized
              * @example _converse.api.listen.on('roomsListInitialized', status => { ... });
              */
-            _converse.api.trigger('roomsListInitialized');
+            api.trigger('roomsListInitialized');
         };
 
-        _converse.api.listen.on('connected', async () =>  {
+        api.listen.on('connected', async () =>  {
             if (_converse.allow_bookmarks) {
-                await _converse.api.waitUntil('bookmarksInitialized');
+                await api.waitUntil('bookmarksInitialized');
             } else {
                 await Promise.all([
-                    _converse.api.waitUntil('chatBoxesFetched'),
-                    _converse.api.waitUntil('roomsPanelRendered')
+                    api.waitUntil('chatBoxesFetched'),
+                    api.waitUntil('roomsPanelRendered')
                 ]);
             }
             initRoomsListView();
         });
 
-        _converse.api.listen.on('reconnected', initRoomsListView);
+        api.listen.on('reconnected', initRoomsListView);
     }
 });
 

+ 31 - 30
src/converse-rosterview.js

@@ -33,10 +33,11 @@ converse.plugins.add('converse-rosterview', {
         /* The initialize function gets called as soon as the plugin is
          * loaded by converse.js's plugin machinery.
          */
-        const { _converse } = this,
-              { __ } = _converse;
+        const { _converse } = this;
+        const { api } = _converse;
+        const { __ } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'autocomplete_add_contact': true,
             'allow_chat_pending_contacts': true,
             'allow_contact_removal': true,
@@ -44,7 +45,7 @@ converse.plugins.add('converse-rosterview', {
             'roster_groups': true,
             'xhr_user_search_url': null,
         });
-        _converse.api.promises.add('rosterViewInitialized');
+        api.promises.add('rosterViewInitialized');
 
         const STATUSES = {
             'dnd': __('This contact is busy'),
@@ -68,7 +69,7 @@ converse.plugins.add('converse-rosterview', {
             },
 
             toHTML () {
-                const label_nickname = _converse.api.settings.get('xhr_user_search_url') ? __('Contact name') : __('Optional nickname');
+                const label_nickname = api.settings.get('xhr_user_search_url') ? __('Contact name') : __('Optional nickname');
                 return tpl_add_contact_modal(Object.assign(this.model.toJSON(), {
                     '_converse': _converse,
                     'label_nickname': label_nickname,
@@ -76,7 +77,7 @@ converse.plugins.add('converse-rosterview', {
             },
 
             afterRender () {
-                if (_converse.api.settings.get('xhr_user_search_url') && isString(_converse.api.settings.get('xhr_user_search_url'))) {
+                if (api.settings.get('xhr_user_search_url') && isString(api.settings.get('xhr_user_search_url'))) {
                     this.initXHRAutoComplete();
                 } else {
                     this.initJIDAutoComplete();
@@ -86,7 +87,7 @@ converse.plugins.add('converse-rosterview', {
             },
 
             initJIDAutoComplete () {
-                if (!_converse.api.settings.get('autocomplete_add_contact')) {
+                if (!api.settings.get('autocomplete_add_contact')) {
                     return;
                 }
                 const el = this.el.querySelector('.suggestion-box__jid').parentElement;
@@ -98,7 +99,7 @@ converse.plugins.add('converse-rosterview', {
             },
 
             initXHRAutoComplete () {
-                if (!_converse.api.settings.get('autocomplete_add_contact')) {
+                if (!api.settings.get('autocomplete_add_contact')) {
                     return this.initXHRFetch();
                 }
                 const el = this.el.querySelector('.suggestion-box__name').parentElement;
@@ -119,7 +120,7 @@ converse.plugins.add('converse-rosterview', {
                 };
                 const input_el = this.el.querySelector('input[name="name"]');
                 input_el.addEventListener('input', debounce(() => {
-                    xhr.open("GET", `${_converse.api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
+                    xhr.open("GET", `${api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
                     xhr.send()
                 } , 300));
                 this.name_auto_complete.on('suggestion-box-selectcomplete', ev => {
@@ -176,9 +177,9 @@ converse.plugins.add('converse-rosterview', {
                 const data = new FormData(ev.target),
                       jid = (data.get('jid') || '').trim();
 
-                if (!jid && _converse.api.settings.get('xhr_user_search_url') && isString(_converse.api.settings.get('xhr_user_search_url'))) {
+                if (!jid && api.settings.get('xhr_user_search_url') && isString(api.settings.get('xhr_user_search_url'))) {
                     const input_el = this.el.querySelector('input[name="name"]');
-                    this.xhr.open("GET", `${_converse.api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
+                    this.xhr.open("GET", `${api.settings.get('xhr_user_search_url')}q=${encodeURIComponent(input_el.value)}`, true);
                     this.xhr.send()
                     return;
                 }
@@ -357,7 +358,7 @@ converse.plugins.add('converse-rosterview', {
                         Object.assign(this.model.toJSON(), {
                             display_name,
                             'desc_remove': __('Click to remove %1$s as a contact', display_name),
-                            'allow_chat_pending_contacts': _converse.api.settings.get('allow_chat_pending_contacts')
+                            'allow_chat_pending_contacts': api.settings.get('allow_chat_pending_contacts')
                         })
                     );
                 } else if (requesting === true) {
@@ -368,7 +369,7 @@ converse.plugins.add('converse-rosterview', {
                             display_name,
                             'desc_accept': __("Click to accept the contact request from %1$s", display_name),
                             'desc_decline': __("Click to decline the contact request from %1$s", display_name),
-                            'allow_chat_pending_contacts': _converse.api.settings.get('allow_chat_pending_contacts')
+                            'allow_chat_pending_contacts': api.settings.get('allow_chat_pending_contacts')
                         })
                     );
                 } else if (subscription === 'both' || subscription === 'to' || _converse.rosterview.isSelf(jid)) {
@@ -419,7 +420,7 @@ converse.plugins.add('converse-rosterview', {
                         'desc_status': STATUSES[show],
                         'desc_chat': __('Click to chat with %1$s (JID: %2$s)', display_name, item.get('jid')),
                         'desc_remove': __('Click to remove %1$s as a contact', display_name),
-                        'allow_contact_removal': _converse.api.settings.get('allow_contact_removal'),
+                        'allow_contact_removal': api.settings.get('allow_contact_removal'),
                         'num_unread': item.get('num_unread') || 0,
                         classes: ''
                     })
@@ -438,7 +439,7 @@ converse.plugins.add('converse-rosterview', {
              */
             mayBeShown () {
                 const chatStatus = this.model.presence.get('show');
-                if (_converse.api.settings.get('hide_offline_users') && chatStatus === 'offline') {
+                if (api.settings.get('hide_offline_users') && chatStatus === 'offline') {
                     // If pending or requesting, show
                     if ((this.model.get('ask') === 'subscribe') ||
                             (this.model.get('subscription') === 'from') ||
@@ -453,12 +454,12 @@ converse.plugins.add('converse-rosterview', {
             openChat (ev) {
                 if (ev && ev.preventDefault) { ev.preventDefault(); }
                 const attrs = this.model.attributes;
-                _converse.api.chats.open(attrs.jid, attrs, true);
+                api.chats.open(attrs.jid, attrs, true);
             },
 
             async removeContact (ev) {
                 if (ev && ev.preventDefault) { ev.preventDefault(); }
-                if (!_converse.api.settings.get('allow_contact_removal')) { return; }
+                if (!api.settings.get('allow_contact_removal')) { return; }
                 if (!confirm(__("Are you sure you want to remove this contact?"))) { return; }
 
                 try {
@@ -471,7 +472,7 @@ converse.plugins.add('converse-rosterview', {
                     }
                 } catch (e) {
                     log.error(e);
-                    _converse.api.alert('error', __('Error'),
+                    api.alert('error', __('Error'),
                         [__('Sorry, there was an error while trying to remove %1$s as a contact.', this.model.getDisplayName())]
                     );
                 }
@@ -744,9 +745,9 @@ converse.plugins.add('converse-rosterview', {
                 // just this group's) have been fetched from browser
                 // storage or the XMPP server and once they've been
                 // assigned to their various groups.
-                _converse.api.listen.on('rosterGroupsFetched', this.sortAndPositionAllItems.bind(this));
+                api.listen.on('rosterGroupsFetched', this.sortAndPositionAllItems.bind(this));
 
-                _converse.api.listen.on('rosterContactsFetched', () => {
+                api.listen.on('rosterContactsFetched', () => {
                     _converse.roster.each(contact => this.addRosterContact(contact, {'silent': true}));
                     this.update();
                     this.updateFilter();
@@ -892,7 +893,7 @@ converse.plugins.add('converse-rosterview', {
 
             addExistingContact (contact, options) {
                 let groups;
-                if (_converse.api.settings.get('roster_groups')) {
+                if (api.settings.get('roster_groups')) {
                     groups = contact.get('groups');
                     groups = (groups.length === 0) ? [_converse.HEADER_UNGROUPED] : groups;
                 } else {
@@ -931,7 +932,7 @@ converse.plugins.add('converse-rosterview', {
         });
 
         /* -------- Event Handlers ----------- */
-        _converse.api.listen.on('chatBoxesInitialized', () => {
+        api.listen.on('chatBoxesInitialized', () => {
             function highlightRosterItem (chatbox) {
                 const contact = _converse.roster && _converse.roster.findWhere({'jid': chatbox.get('jid')});
                 if (contact !== undefined) {
@@ -943,13 +944,13 @@ converse.plugins.add('converse-rosterview', {
         });
 
 
-        _converse.api.listen.on('controlBoxInitialized', (view) => {
+        api.listen.on('controlBoxInitialized', (view) => {
             function insertRoster () {
-                if (!view.model.get('connected') || _converse.api.settings.get("authentication") === _converse.ANONYMOUS) {
+                if (!view.model.get('connected') || api.settings.get("authentication") === _converse.ANONYMOUS) {
                     return;
                 }
                 /* Place the rosterview inside the "Contacts" panel. */
-                _converse.api.waitUntil('rosterViewInitialized')
+                api.waitUntil('rosterViewInitialized')
                     .then(() => view.controlbox_pane.el.insertAdjacentElement('beforeEnd', _converse.rosterview.el))
                     .catch(e => log.fatal(e));
             }
@@ -962,7 +963,7 @@ converse.plugins.add('converse-rosterview', {
             /* Create an instance of RosterView once the RosterGroups
              * collection has been created (in @converse/headless/converse-core.js)
              */
-            if (_converse.api.settings.get("authentication") === _converse.ANONYMOUS) {
+            if (api.settings.get("authentication") === _converse.ANONYMOUS) {
                 return;
             }
             _converse.rosterview = new _converse.RosterView({
@@ -974,12 +975,12 @@ converse.plugins.add('converse-rosterview', {
              * @event _converse#rosterViewInitialized
              * @example _converse.api.listen.on('rosterViewInitialized', () => { ... });
              */
-            _converse.api.trigger('rosterViewInitialized');
+            api.trigger('rosterViewInitialized');
         }
-        _converse.api.listen.on('rosterInitialized', initRosterView);
-        _converse.api.listen.on('rosterReadyAfterReconnection', initRosterView);
+        api.listen.on('rosterInitialized', initRosterView);
+        api.listen.on('rosterReadyAfterReconnection', initRosterView);
 
-        _converse.api.listen.on('afterTearDown', () => {
+        api.listen.on('afterTearDown', () => {
             if (converse.rosterview) {
                 converse.rosterview.model.off().reset();
                 converse.rosterview.each(groupview => groupview.removeAll().remove());

+ 21 - 20
src/headless/converse-bookmarks.js

@@ -60,20 +60,21 @@ converse.plugins.add('converse-bookmarks', {
         /* The initialize function gets called as soon as the plugin is
          * loaded by converse.js's plugin machinery.
          */
-        const { _converse } = this,
-              { __ } = _converse;
+        const { _converse } = this;
+        const { api } = _converse;
+        const { __ } = _converse;
 
         // Configuration values for this plugin
         // ====================================
         // Refer to docs/source/configuration.rst for explanations of these
         // configuration settings.
-        _converse.api.settings.update({
+        api.settings.update({
             allow_bookmarks: true,
             allow_public_bookmarks: false,
             muc_respect_autojoin: true
         });
 
-        _converse.api.promises.add('bookmarksInitialized');
+        api.promises.add('bookmarksInitialized');
 
         /**
           * Check if the user has a bookmark with a saved nickanme
@@ -82,7 +83,7 @@ converse.plugins.add('converse-bookmarks', {
           * @method _converse#getNicknameFromBookmark
           */
         _converse.getNicknameFromBookmark = function (jid) {
-            if (!_converse.bookmarks || !_converse.api.settings.get('allow_bookmarks')) {
+            if (!_converse.bookmarks || !api.settings.get('allow_bookmarks')) {
                 return null;
             }
             const bookmark = _converse.bookmarks.findWhere({'jid': jid});
@@ -116,8 +117,8 @@ converse.plugins.add('converse-bookmarks', {
             },
 
             async openBookmarkedRoom (bookmark) {
-                if ( _converse.api.settings.get('muc_respect_autojoin') && bookmark.get('autojoin')) {
-                    const groupchat = await _converse.api.rooms.create(bookmark.get('jid'), bookmark.get('nick'));
+                if ( api.settings.get('muc_respect_autojoin') && bookmark.get('autojoin')) {
+                    const groupchat = await api.rooms.create(bookmark.get('jid'), bookmark.get('nick'));
                     groupchat.maybeShow();
                 }
                 return bookmark;
@@ -166,13 +167,13 @@ converse.plugins.add('converse-bookmarks', {
                             .c('value').t('true').up().up()
                         .c('field', {'var':'pubsub#access_model'})
                             .c('value').t('whitelist');
-                return _converse.api.sendIQ(stanza);
+                return api.sendIQ(stanza);
             },
 
             onBookmarkError (iq, options) {
                 log.error("Error while trying to add bookmark");
                 log.error(iq);
-                _converse.api.alert(
+                api.alert(
                     'error', __('Error'), [__("Sorry, something went wrong while trying to save your bookmark.")]
                 );
                 this.findWhere({'jid': options.jid}).destroy();
@@ -184,7 +185,7 @@ converse.plugins.add('converse-bookmarks', {
                     'type': 'get',
                 }).c('pubsub', {'xmlns': Strophe.NS.PUBSUB})
                     .c('items', {'node': 'storage:bookmarks'});
-                _converse.api.sendIQ(stanza)
+                api.sendIQ(stanza)
                     .then(iq => this.onBookmarksReceived(deferred, iq))
                     .catch(iq => this.onBookmarksReceivedError(deferred, iq)
                 );
@@ -231,7 +232,7 @@ converse.plugins.add('converse-bookmarks', {
             onBookmarksReceivedError (deferred, iq) {
                 if (iq === null) {
                     log.error('Error: timeout while fetching bookmarks');
-                    _converse.api.alert('error', __('Timeout Error'),
+                    api.alert('error', __('Timeout Error'),
                         [__("The server did not return your bookmarks within the allowed time. "+
                             "You can reload the page to request them again.")]
                     );
@@ -263,16 +264,16 @@ converse.plugins.add('converse-bookmarks', {
         });
 
         _converse.checkBookmarksSupport = async function () {
-            const identity = await _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid);
+            const identity = await api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid);
             if (_converse.allow_public_bookmarks) {
                 return !!identity;
             } else {
-                return _converse.api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid);
+                return api.disco.supports(Strophe.NS.PUBSUB+'#publish-options', _converse.bare_jid);
             }
         }
 
         const initBookmarks = async function () {
-            if (!_converse.api.settings.get('allow_bookmarks')) {
+            if (!api.settings.get('allow_bookmarks')) {
                 return;
             }
             if (await _converse.checkBookmarksSupport()) {
@@ -284,11 +285,11 @@ converse.plugins.add('converse-bookmarks', {
                  * @event _converse#bookmarksInitialized
                  * @example _converse.api.listen.on('bookmarksInitialized', () => { ... });
                  */
-                _converse.api.trigger('bookmarksInitialized');
+                api.trigger('bookmarksInitialized');
             }
         }
 
-        _converse.api.listen.on('clearSession', () => {
+        api.listen.on('clearSession', () => {
             if (_converse.bookmarks !== undefined) {
                 _converse.bookmarks.clearStore({'silent': true});
                 window.sessionStorage.removeItem(_converse.bookmarks.fetched_flag);
@@ -296,19 +297,19 @@ converse.plugins.add('converse-bookmarks', {
             }
         });
 
-        _converse.api.listen.on('reconnected', initBookmarks);
+        api.listen.on('reconnected', initBookmarks);
 
-        _converse.api.listen.on('connected', async () =>  {
+        api.listen.on('connected', async () =>  {
             // Add a handler for bookmarks pushed from other connected clients
             _converse.connection.addHandler(message => {
                 if (sizzle('event[xmlns="'+Strophe.NS.PUBSUB+'#event"] items[node="storage:bookmarks"]', message).length) {
-                    _converse.api.waitUntil('bookmarksInitialized')
+                    api.waitUntil('bookmarksInitialized')
                         .then(() => _converse.bookmarks.createBookmarksFromStanza(message))
                         .catch(e => log.fatal(e));
                 }
             }, null, 'message', 'headline', null, _converse.bare_jid);
 
-            await Promise.all([_converse.api.waitUntil('chatBoxesFetched')]);
+            await Promise.all([api.waitUntil('chatBoxesFetched')]);
             initBookmarks();
         });
     }

+ 12 - 11
src/headless/converse-bosh.js

@@ -22,8 +22,9 @@ converse.plugins.add('converse-bosh', {
 
     initialize () {
         const { _converse } = this;
+        const { api } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             bosh_service_url: undefined,
             prebind_url: null
         });
@@ -51,11 +52,11 @@ converse.plugins.add('converse-bosh', {
 
 
         _converse.startNewPreboundBOSHSession = function () {
-            if (!_converse.api.settings.get('prebind_url')) {
+            if (!api.settings.get('prebind_url')) {
                 throw new Error("startNewPreboundBOSHSession: If you use prebind then you MUST supply a prebind_url");
             }
             const xhr = new XMLHttpRequest();
-            xhr.open('GET', _converse.api.settings.get('prebind_url'), true);
+            xhr.open('GET', api.settings.get('prebind_url'), true);
             xhr.setRequestHeader('Accept', 'application/json, text/javascript');
             xhr.onload = async function () {
                 if (xhr.status >= 200 && xhr.status < 400) {
@@ -79,7 +80,7 @@ converse.plugins.add('converse-bosh', {
                  * @type { _converse }
                  * @example _converse.api.listen.on('noResumeableBOSHSession', _converse => { ... });
                  */
-                _converse.api.trigger('noResumeableBOSHSession', _converse);
+                api.trigger('noResumeableBOSHSession', _converse);
             };
             xhr.send();
         }
@@ -101,7 +102,7 @@ converse.plugins.add('converse-bosh', {
 
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('clearSession', () => {
+        api.listen.on('clearSession', () => {
             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
@@ -114,28 +115,28 @@ converse.plugins.add('converse-bosh', {
             }
         });
 
-        _converse.api.listen.on('setUserJID', () => {
+        api.listen.on('setUserJID', () => {
             if (_converse.bosh_session !== undefined) {
                 _converse.bosh_session.save({'jid': _converse.jid});
             }
         });
 
-        _converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.BOSH));
+        api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.BOSH));
 
         /************************ END Event Handlers ************************/
 
 
         /************************ BEGIN API ************************/
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * This namespace lets you access the BOSH tokens
              *
-             * @namespace _converse.api.tokens
-             * @memberOf _converse.api
+             * @namespace api.tokens
+             * @memberOf api
              */
             tokens: {
                 /**
-                 * @method _converse.api.tokens.get
+                 * @method 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');

+ 60 - 59
src/headless/converse-chat.js

@@ -35,13 +35,14 @@ converse.plugins.add('converse-chat', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
         const { __ } = _converse;
 
         // Configuration values for this plugin
         // ====================================
         // Refer to docs/source/configuration.rst for explanations of these
         // configuration settings.
-        _converse.api.settings.update({
+        api.settings.update({
             'allow_message_corrections': 'all',
             'allow_message_retraction': 'all',
             'auto_join_private_chats': [],
@@ -58,7 +59,7 @@ converse.plugins.add('converse-chat', {
             },
 
             async setRosterContact (jid) {
-                const contact = await _converse.api.contacts.get(jid);
+                const contact = await api.contacts.get(jid);
                 if (contact) {
                     this.contact = contact;
                     this.set('nickname', contact.get('nickname'));
@@ -103,7 +104,7 @@ converse.plugins.add('converse-chat', {
                  * @type { _converse.Message}
                  * @example _converse.api.listen.on('messageInitialized', model => { ... });
                  */
-                await _converse.api.trigger('messageInitialized', this, {'Synchronous': true});
+                await api.trigger('messageInitialized', this, {'Synchronous': true});
                 this.initialized.resolve();
             },
 
@@ -151,7 +152,7 @@ converse.plugins.add('converse-chat', {
              */
             mayBeRetracted () {
                 const is_own_message = this.get('sender') === 'me';
-                return is_own_message && ['all', 'own'].includes(_converse.api.settings.get('allow_message_retraction'));
+                return is_own_message && ['all', 'own'].includes(api.settings.get('allow_message_retraction'));
             },
 
             safeDestroy () {
@@ -212,7 +213,7 @@ converse.plugins.add('converse-chat', {
                     'size': this.file.size,
                     'content-type': this.file.type
                 })
-                return _converse.api.sendIQ(iq);
+                return api.sendIQ(iq);
             },
 
             async getRequestSlotURL () {
@@ -306,7 +307,7 @@ converse.plugins.add('converse-chat', {
                 return {
                     'bookmarked': false,
                     'chat_state': undefined,
-                    'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")),
+                    'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")),
                     'message_type': 'chat',
                     'nickname': undefined,
                     'num_unread': 0,
@@ -347,7 +348,7 @@ converse.plugins.add('converse-chat', {
                  * @type { _converse.ChatBox}
                  * @example _converse.api.listen.on('chatBoxInitialized', model => { ... });
                  */
-                await _converse.api.trigger('chatBoxInitialized', this, {'Synchronous': true});
+                await api.trigger('chatBoxInitialized', this, {'Synchronous': true});
                 this.initialized.resolve();
             },
 
@@ -361,7 +362,7 @@ converse.plugins.add('converse-chat', {
                 this.messages.browserStorage = _converse.createStore(this.getMessagesCacheKey());
                 this.listenTo(this.messages, 'change:upload', message => {
                     if (message.get('upload') === _converse.SUCCESS) {
-                        _converse.api.send(this.createMessageStanza(message));
+                        api.send(this.createMessageStanza(message));
                     }
                 });
             },
@@ -378,7 +379,7 @@ converse.plugins.add('converse-chat', {
                  * @type {_converse.ChatBox | _converse.ChatRoom}
                  * @example _converse.api.listen.on('afterMessagesFetched', view => { ... });
                  */
-                _converse.api.trigger('afterMessagesFetched', this);
+                api.trigger('afterMessagesFetched', this);
             },
 
             fetchMessages () {
@@ -453,7 +454,7 @@ converse.plugins.add('converse-chat', {
                 } catch (e) {
                     log.error(e);
                 } finally {
-                    if (_converse.api.settings.get('clear_messages_on_reconnection')) {
+                    if (api.settings.get('clear_messages_on_reconnection')) {
                         await this.clearMessages();
                     }
                 }
@@ -466,11 +467,11 @@ converse.plugins.add('converse-chat', {
                  * @type {_converse.ChatBox | _converse.ChatRoom}
                  * @example _converse.api.listen.on('onChatReconnected', chatbox => { ... });
                  */
-                _converse.api.trigger('chatReconnected', this);
+                api.trigger('chatReconnected', this);
             },
 
             async onReconnection () {
-                if (_converse.api.settings.get('clear_messages_on_reconnection')) {
+                if (api.settings.get('clear_messages_on_reconnection')) {
                     await this.clearMessages();
                 }
                 this.announceReconnection();
@@ -481,8 +482,8 @@ converse.plugins.add('converse-chat', {
                     return 'Ignored ChatBox without JID';
                 }
                 const room_jids = _converse.auto_join_rooms.map(s => isObject(s) ? s.jid : s);
-                const auto_join = _converse.api.settings.get('auto_join_private_chats').concat(room_jids);
-                if (_converse.api.settings.get("singleton") && !auto_join.includes(attrs.jid) && !_converse.auto_join_on_invite) {
+                const auto_join = api.settings.get('auto_join_private_chats').concat(room_jids);
+                if (api.settings.get("singleton") && !auto_join.includes(attrs.jid) && !_converse.auto_join_on_invite) {
                     const msg = `${attrs.jid} is not allowed because singleton is true and it's not being auto_joined`;
                     log.warn(msg);
                     return msg;
@@ -793,7 +794,7 @@ converse.plugins.add('converse-chat', {
                     'to': to_jid,
                     'type': 'chat',
                 }).c(type, {'xmlns': Strophe.NS.MARKERS, 'id': id});
-                _converse.api.send(stanza);
+                api.send(stanza);
             },
 
             handleChatMarker (stanza, from_jid) {
@@ -836,7 +837,7 @@ converse.plugins.add('converse-chat', {
                     'type': 'chat',
                 }).c('received', {'xmlns': Strophe.NS.RECEIPTS, 'id': id}).up()
                 .c('store', {'xmlns': Strophe.NS.HINTS}).up();
-                _converse.api.send(receipt_stanza);
+                api.send(receipt_stanza);
             },
 
             handleReceipt (stanza, original_stanza, from_jid) {
@@ -936,7 +937,7 @@ converse.plugins.add('converse-chat', {
 
             /**
              * Responsible for setting the editable attribute of messages.
-             * If _converse.api.settings.get('allow_message_corrections') is "last", then only the last
+             * If api.settings.get('allow_message_corrections') is "last", then only the last
              * message sent from me will be editable. If set to "all" all messages
              * will be editable. Otherwise no messages will be editable.
              * @method _converse.ChatBox#setEditable
@@ -951,9 +952,9 @@ converse.plugins.add('converse-chat', {
                 if (u.isEmptyMessage(attrs) || attrs.sender !== 'me') {
                     return;
                 }
-                if (_converse.api.settings.get('allow_message_corrections') === 'all') {
+                if (api.settings.get('allow_message_corrections') === 'all') {
                     attrs.editable = !(attrs.file || attrs.retracted || 'oob_url' in attrs);
-                } else if ((_converse.api.settings.get('allow_message_corrections') === 'last') && (send_time > this.get('time_sent'))) {
+                } else if ((api.settings.get('allow_message_corrections') === 'last') && (send_time > this.get('time_sent'))) {
                     this.set({'time_sent': send_time});
                     const msg = this.messages.findWhere({'editable': true});
                     if (msg) {
@@ -981,7 +982,7 @@ converse.plugins.add('converse-chat', {
              * @param { String } spoiler_hint - An optional hint, if the message being sent is a spoiler
              * @returns { _converse.Message }
              * @example
-             * const chat = _converse.api.chats.get('buddy1@example.com');
+             * const chat = api.chats.get('buddy1@example.com');
              * chat.sendMessage('hello world');
              */
             async sendMessage (text, spoiler_hint) {
@@ -1004,7 +1005,7 @@ converse.plugins.add('converse-chat', {
                     this.setEditable(attrs, (new Date()).toISOString());
                     message = await this.createMessage(attrs);
                 }
-                _converse.api.send(this.createMessageStanza(message));
+                api.send(this.createMessageStanza(message));
                 return message;
             },
 
@@ -1015,12 +1016,12 @@ converse.plugins.add('converse-chat', {
              * @method _converse.ChatBox#sendChatState
              */
             sendChatState () {
-                if (_converse.api.settings.get('send_chat_state_notifications') && this.get('chat_state')) {
-                    const allowed = _converse.api.settings.get('send_chat_state_notifications');
+                if (api.settings.get('send_chat_state_notifications') && this.get('chat_state')) {
+                    const allowed = api.settings.get('send_chat_state_notifications');
                     if (Array.isArray(allowed) && !allowed.includes(this.get('chat_state'))) {
                         return;
                     }
-                    _converse.api.send(
+                    api.send(
                         $msg({
                             'id': u.getUniqueId(),
                             'to': this.get('jid'),
@@ -1034,7 +1035,7 @@ converse.plugins.add('converse-chat', {
 
 
             async sendFiles (files) {
-                const result = await _converse.api.disco.features.get(Strophe.NS.HTTPUPLOAD, _converse.domain);
+                const result = await api.disco.features.get(Strophe.NS.HTTPUPLOAD, _converse.domain);
                 const item = result.pop();
                 if (!item) {
                     this.createMessage({
@@ -1141,7 +1142,7 @@ converse.plugins.add('converse-chat', {
 
         function rejectMessage (stanza, text) {
             // Reject an incoming message by replying with an error message of type "cancel".
-            _converse.api.send(
+            api.send(
                 $msg({
                     'to': stanza.getAttribute('from'),
                     'type': 'error',
@@ -1160,7 +1161,7 @@ converse.plugins.add('converse-chat', {
             if (utils.isSameBareJID(from_jid, _converse.bare_jid)) {
                 return;
             }
-            const chatbox = await _converse.api.chatboxes.get(from_jid);
+            const chatbox = await api.chatboxes.get(from_jid);
             if (!chatbox) {
                 return;
             }
@@ -1184,7 +1185,7 @@ converse.plugins.add('converse-chat', {
             let to_jid = stanza.getAttribute('to');
             const to_resource = Strophe.getResourceFromJid(to_jid);
 
-            if (_converse.api.settings.get('filter_by_resource') && (to_resource && to_resource !== _converse.resource)) {
+            if (api.settings.get('filter_by_resource') && (to_resource && to_resource !== _converse.resource)) {
                 return log.info(`handleMessageStanza: Ignoring incoming message intended for a different resource: ${to_jid}`);
             } else if (utils.isHeadlineMessage(_converse, stanza)) {
                 // XXX: Prosody sends headline messages with the
@@ -1229,15 +1230,15 @@ converse.plugins.add('converse-chat', {
                 return log.error(`Don't know how to handle message stanza without 'to' attribute. ${stanza.outerHTML}`);
             }
             const contact_jid = is_me ? Strophe.getBareJidFromJid(to_jid) : from_bare_jid;
-            const contact = await _converse.api.contacts.get(contact_jid);
-            if (contact === undefined && !_converse.api.settings.get("allow_non_roster_messaging")) {
+            const contact = await api.contacts.get(contact_jid);
+            if (contact === undefined && !api.settings.get("allow_non_roster_messaging")) {
                 log.error(`Blocking messaging with a JID not in our roster because allow_non_roster_messaging is false.`);
                 return log.error(stanza);
             }
             // Get chat box, but only create when the message has something to show to the user
             const has_body = sizzle(`body, encrypted[xmlns="${Strophe.NS.OMEMO}"]`, stanza).length > 0;
             const roster_nick = contact?.attributes?.nickname;
-            const chatbox = await _converse.api.chats.get(contact_jid, {'nickname': roster_nick}, has_body);
+            const chatbox = await api.chats.get(contact_jid, {'nickname': roster_nick}, has_body);
             chatbox && await chatbox.queueMessage(stanza, original_stanza, from_jid);
             /**
              * Triggered when a message stanza is been received and processed.
@@ -1247,7 +1248,7 @@ converse.plugins.add('converse-chat', {
              * @property { XMLElement } stanza
              * @example _converse.api.listen.on('message', obj => { ... });
              */
-            _converse.api.trigger('message', {'stanza': original_stanza, 'chatbox': chatbox});
+            api.trigger('message', {'stanza': original_stanza, 'chatbox': chatbox});
         }
 
 
@@ -1287,12 +1288,12 @@ converse.plugins.add('converse-chat', {
         function autoJoinChats () {
             // Automatically join private chats, based on the
             // "auto_join_private_chats" configuration setting.
-            _converse.api.settings.get('auto_join_private_chats').forEach(jid => {
+            api.settings.get('auto_join_private_chats').forEach(jid => {
                 if (_converse.chatboxes.where({'jid': jid}).length) {
                     return;
                 }
                 if (isString(jid)) {
-                    _converse.api.chats.open(jid);
+                    api.chats.open(jid);
                 } else {
                     log.error('Invalid jid criteria specified for "auto_join_private_chats"');
                 }
@@ -1305,7 +1306,7 @@ converse.plugins.add('converse-chat', {
              * @example _converse.api.listen.on('privateChatsAutoJoined', () => { ... });
              * @example _converse.api.waitUntil('privateChatsAutoJoined').then(() => { ... });
              */
-            _converse.api.trigger('privateChatsAutoJoined');
+            api.trigger('privateChatsAutoJoined');
         }
 
 
@@ -1314,17 +1315,17 @@ converse.plugins.add('converse-chat', {
             if (!utils.isValidJID(jid)) {
                 return log.warn(`Invalid JID "${jid}" provided in URL fragment`);
             }
-            _converse.api.chats.open(jid);
+            api.chats.open(jid);
         }
         _converse.router.route('converse/chat?jid=:jid', openChat);
         /************************ END Route Handlers ************************/
 
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('chatBoxesFetched', autoJoinChats);
-        _converse.api.listen.on('presencesInitialized', registerMessageHandlers);
+        api.listen.on('chatBoxesFetched', autoJoinChats);
+        api.listen.on('presencesInitialized', registerMessageHandlers);
 
-        _converse.api.listen.on('clearSession', () => {
+        api.listen.on('clearSession', () => {
             if (_converse.shouldClearCache()) {
                 return Promise.all(_converse.chatboxes.map(c => c.messages && c.messages.clearStore({'silent': true})));
             }
@@ -1333,26 +1334,26 @@ converse.plugins.add('converse-chat', {
 
 
         /************************ BEGIN API ************************/
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * The "chats" namespace (used for one-on-one chats)
              *
-             * @namespace _converse.api.chats
-             * @memberOf _converse.api
+             * @namespace api.chats
+             * @memberOf api
              */
             chats: {
                 /**
-                 * @method _converse.api.chats.create
+                 * @method api.chats.create
                  * @param {string|string[]} jid|jids An jid or array of jids
                  * @param {object} [attrs] An object containing configuration attributes.
                  */
                 async create (jids, attrs) {
                     if (isString(jids)) {
                         if (attrs && !attrs?.fullname) {
-                            const contact = await _converse.api.contacts.get(jids);
+                            const contact = await api.contacts.get(jids);
                             attrs.fullname = contact?.attributes?.fullname;
                         }
-                        const chatbox = _converse.api.chats.get(jids, attrs, true);
+                        const chatbox = api.chats.get(jids, attrs, true);
                         if (!chatbox) {
                             log.error("Could not open chatbox for JID: "+jids);
                             return;
@@ -1361,9 +1362,9 @@ converse.plugins.add('converse-chat', {
                     }
                     if (Array.isArray(jids)) {
                         return Promise.all(jids.forEach(async jid => {
-                            const contact = await _converse.api.contacts.get(jids);
+                            const contact = await api.contacts.get(jids);
                             attrs.fullname = contact?.attributes?.fullname;
-                            return _converse.api.chats.get(jid, attrs, true).maybeShow();
+                            return api.chats.get(jid, attrs, true).maybeShow();
                         }));
                     }
                     log.error("chats.create: You need to provide at least one JID");
@@ -1373,7 +1374,7 @@ converse.plugins.add('converse-chat', {
                 /**
                  * Opens a new one-on-one chat.
                  *
-                 * @method _converse.api.chats.open
+                 * @method api.chats.open
                  * @param {String|string[]} name - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
                  * @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
                  * @param {Boolean} [attrs.minimized] - Should the chat be created in minimized state.
@@ -1392,7 +1393,7 @@ converse.plugins.add('converse-chat', {
                  *     initialize: function() {
                  *         const _converse = this._converse;
                  *         // Note, buddy@example.org must be in your contacts roster!
-                 *         _converse.api.chats.open('buddy@example.com').then(chat => {
+                 *         api.chats.open('buddy@example.com').then(chat => {
                  *             // Now you can do something with the chat model
                  *         });
                  *     }
@@ -1404,7 +1405,7 @@ converse.plugins.add('converse-chat', {
                  *     initialize: function () {
                  *         const _converse = this._converse;
                  *         // Note, these users must first be in your contacts roster!
-                 *         _converse.api.chats.open(['buddy1@example.com', 'buddy2@example.com']).then(chats => {
+                 *         api.chats.open(['buddy1@example.com', 'buddy2@example.com']).then(chats => {
                  *             // Now you can do something with the chat models
                  *         });
                  *     }
@@ -1412,14 +1413,14 @@ converse.plugins.add('converse-chat', {
                  */
                 async open (jids, attrs, force) {
                     if (isString(jids)) {
-                        const chat = await _converse.api.chats.get(jids, attrs, true);
+                        const chat = await api.chats.get(jids, attrs, true);
                         if (chat) {
                             return chat.maybeShow(force);
                         }
                         return chat;
                     } else if (Array.isArray(jids)) {
                         return Promise.all(
-                            jids.map(j => _converse.api.chats.get(j, attrs, true).then(c => c && c.maybeShow(force)))
+                            jids.map(j => api.chats.get(j, attrs, true).then(c => c && c.maybeShow(force)))
                                 .filter(c => c)
                         );
                     }
@@ -1431,7 +1432,7 @@ converse.plugins.add('converse-chat', {
                 /**
                  * Retrieves a chat or all chats.
                  *
-                 * @method _converse.api.chats.get
+                 * @method api.chats.get
                  * @param {String|string[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
                  * @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
                  * @param {Boolean} [create=false] - Whether the chat should be created if it's not found.
@@ -1439,22 +1440,22 @@ converse.plugins.add('converse-chat', {
                  *
                  * @example
                  * // To return a single chat, provide the JID of the contact you're chatting with in that chat:
-                 * const model = await _converse.api.chats.get('buddy@example.com');
+                 * const model = await api.chats.get('buddy@example.com');
                  *
                  * @example
                  * // To return an array of chats, provide an array of JIDs:
-                 * const models = await _converse.api.chats.get(['buddy1@example.com', 'buddy2@example.com']);
+                 * const models = await api.chats.get(['buddy1@example.com', 'buddy2@example.com']);
                  *
                  * @example
                  * // To return all open chats, call the method without any parameters::
-                 * const models = await _converse.api.chats.get();
+                 * const models = await api.chats.get();
                  *
                  */
                 async get (jids, attrs={}, create=false) {
                     async function _get (jid) {
-                        let model = await _converse.api.chatboxes.get(jid);
+                        let model = await api.chatboxes.get(jid);
                         if (!model && create) {
-                            model = await _converse.api.chatboxes.create(jid, attrs, _converse.ChatBox);
+                            model = await api.chatboxes.create(jid, attrs, _converse.ChatBox);
                         } else {
                             model = (model && model.get('type') === _converse.PRIVATE_CHAT_TYPE) ? model : null;
                             if (model && Object.keys(attrs).length) {
@@ -1464,7 +1465,7 @@ converse.plugins.add('converse-chat', {
                         return model;
                     }
                     if (jids === undefined) {
-                        const chats = await _converse.api.chatboxes.get();
+                        const chats = await api.chatboxes.get();
                         return chats.filter(c => (c.get('type') === _converse.PRIVATE_CHAT_TYPE));
                     } else if (isString(jids)) {
                         return _get(jids);

+ 19 - 18
src/headless/converse-chatboxes.js

@@ -26,8 +26,9 @@ converse.plugins.add('converse-chatboxes', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
-        _converse.api.promises.add([
+        api.promises.add([
             'chatBoxesFetched',
             'chatBoxesInitialized',
             'privateChatsAutoJoined'
@@ -78,7 +79,7 @@ converse.plugins.add('converse-chatboxes', {
                  * @example _converse.api.listen.on('message', obj => { ... });
                  * @example _converse.api.waitUntil('chatBoxesFetched').then(() => { ... });
                  */
-                _converse.api.trigger('chatBoxesFetched');
+                api.trigger('chatBoxesFetched');
             },
 
             onConnected (reconnecting) {
@@ -114,13 +115,13 @@ converse.plugins.add('converse-chatboxes', {
 
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('addClientFeatures', () => {
-            _converse.api.disco.own.features.add(Strophe.NS.MESSAGE_CORRECT);
-            _converse.api.disco.own.features.add(Strophe.NS.HTTPUPLOAD);
-            _converse.api.disco.own.features.add(Strophe.NS.OUTOFBAND);
+        api.listen.on('addClientFeatures', () => {
+            api.disco.own.features.add(Strophe.NS.MESSAGE_CORRECT);
+            api.disco.own.features.add(Strophe.NS.HTTPUPLOAD);
+            api.disco.own.features.add(Strophe.NS.OUTOFBAND);
         });
 
-        _converse.api.listen.on('pluginsInitialized', () => {
+        api.listen.on('pluginsInitialized', () => {
             _converse.chatboxes = new _converse.ChatBoxes();
             /**
              * Triggered once the _converse.ChatBoxes collection has been initialized.
@@ -128,32 +129,32 @@ converse.plugins.add('converse-chatboxes', {
              * @example _converse.api.listen.on('chatBoxesInitialized', () => { ... });
              * @example _converse.api.waitUntil('chatBoxesInitialized').then(() => { ... });
              */
-            _converse.api.trigger('chatBoxesInitialized');
+            api.trigger('chatBoxesInitialized');
         });
 
-        _converse.api.listen.on('presencesInitialized', (reconnecting) => _converse.chatboxes.onConnected(reconnecting));
-        _converse.api.listen.on('reconnected', () => _converse.chatboxes.forEach(m => m.onReconnection()));
-        _converse.api.listen.on('windowStateChanged', d => (d.state === 'visible') && _converse.clearMsgCounter());
+        api.listen.on('presencesInitialized', (reconnecting) => _converse.chatboxes.onConnected(reconnecting));
+        api.listen.on('reconnected', () => _converse.chatboxes.forEach(m => m.onReconnection()));
+        api.listen.on('windowStateChanged', d => (d.state === 'visible') && _converse.clearMsgCounter());
         /************************ END Event Handlers ************************/
 
 
         /************************ BEGIN API ************************/
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * The "chatboxes" namespace.
              *
-             * @namespace _converse.api.chatboxes
-             * @memberOf _converse.api
+             * @namespace api.chatboxes
+             * @memberOf api
              */
             chatboxes: {
                 /**
-                 * @method _converse.api.chats.create
+                 * @method api.chats.create
                  * @param { String|String[] } jids - A JID or array of JIDs
                  * @param { Object } [attrs] An object containing configuration attributes
                  * @param { Model } model - The type of chatbox that should be created
                  */
                 async create (jids=[], attrs={}, model) {
-                    await _converse.api.waitUntil('chatBoxesFetched');
+                    await api.waitUntil('chatBoxesFetched');
                     if (isString(jids)) {
                         return createChatBox(jids, attrs, model);
                     } else {
@@ -162,11 +163,11 @@ converse.plugins.add('converse-chatboxes', {
                 },
 
                 /**
-                 * @method _converse.api.chats.get
+                 * @method api.chats.get
                  * @param { String|String[] } jids - A JID or array of JIDs
                  */
                 async get (jids) {
-                    await _converse.api.waitUntil('chatBoxesFetched');
+                    await api.waitUntil('chatBoxesFetched');
                     if (jids === undefined) {
                         return _converse.chatboxes.models;
                     } else if (isString(jids)) {

+ 88 - 87
src/headless/converse-disco.js

@@ -20,10 +20,11 @@ converse.plugins.add('converse-disco', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
         // Promises exposed by this plugin
-        _converse.api.promises.add('discoInitialized');
-        _converse.api.promises.add('streamFeaturesAdded');
+        api.promises.add('discoInitialized');
+        api.promises.add('streamFeaturesAdded');
 
 
         /**
@@ -106,7 +107,7 @@ converse.plugins.add('converse-disco', {
                  * @type { Model }
                  * @example _converse.api.listen.on('featuresDiscovered', feature => { ... });
                  */
-                _converse.api.trigger('serviceDiscovered', feature);
+                api.trigger('serviceDiscovered', feature);
             },
 
             onFieldAdded (field) {
@@ -117,7 +118,7 @@ converse.plugins.add('converse-disco', {
                  * @event _converse#discoExtensionFieldDiscovered
                  * @example _converse.api.listen.on('discoExtensionFieldDiscovered', () => { ... });
                  */
-                _converse.api.trigger('discoExtensionFieldDiscovered', field);
+                api.trigger('discoExtensionFieldDiscovered', field);
             },
 
             async fetchFeatures (options) {
@@ -144,7 +145,7 @@ converse.plugins.add('converse-disco', {
             async queryInfo () {
                 let stanza;
                 try {
-                    stanza = await _converse.api.disco.info(this.get('jid'), null);
+                    stanza = await api.disco.info(this.get('jid'), null);
                 } catch (iq) {
                     log.error(iq);
                     this.waitUntilFeaturesDiscovered.resolve(this);
@@ -178,7 +179,7 @@ converse.plugins.add('converse-disco', {
                     // server or a conference component.
                     return;
                 }
-                const stanza = await _converse.api.disco.items(this.get('jid'));
+                const stanza = await api.disco.items(this.get('jid'));
                 this.onDiscoItems(stanza);
             },
 
@@ -246,13 +247,13 @@ converse.plugins.add('converse-disco', {
 
         function addClientFeatures () {
             // See https://xmpp.org/registrar/disco-categories.html
-            _converse.api.disco.own.identities.add('client', 'web', 'Converse');
+            api.disco.own.identities.add('client', 'web', 'Converse');
 
-            _converse.api.disco.own.features.add(Strophe.NS.CHATSTATES);
-            _converse.api.disco.own.features.add(Strophe.NS.DISCO_INFO);
-            _converse.api.disco.own.features.add(Strophe.NS.ROSTERX); // Limited support
-            if (_converse.api.settings.get("message_carbons")) {
-                _converse.api.disco.own.features.add(Strophe.NS.CARBONS);
+            api.disco.own.features.add(Strophe.NS.CHATSTATES);
+            api.disco.own.features.add(Strophe.NS.DISCO_INFO);
+            api.disco.own.features.add(Strophe.NS.ROSTERX); // Limited support
+            if (api.settings.get("message_carbons")) {
+                api.disco.own.features.add(Strophe.NS.CARBONS);
             }
             /**
              * Triggered in converse-disco once the core disco features of
@@ -260,7 +261,7 @@ converse.plugins.add('converse-disco', {
              * @event _converse#addClientFeatures
              * @example _converse.api.listen.on('addClientFeatures', () => { ... });
              */
-            _converse.api.trigger('addClientFeatures');
+            api.trigger('addClientFeatures');
             return this;
         }
 
@@ -274,7 +275,7 @@ converse.plugins.add('converse-disco', {
             if (!_converse.stream_features) {
                 const bare_jid = Strophe.getBareJidFromJid(_converse.jid);
                 const id = `converse.stream-features-${bare_jid}`;
-                _converse.api.promises.add('streamFeaturesAdded');
+                api.promises.add('streamFeaturesAdded');
                 _converse.stream_features = new Collection();
                 _converse.stream_features.browserStorage = _converse.createStore(id, "session");
             }
@@ -306,7 +307,7 @@ converse.plugins.add('converse-disco', {
              * @event _converse#streamFeaturesAdded
              * @example _converse.api.listen.on('streamFeaturesAdded', () => { ... });
              */
-            _converse.api.trigger('streamFeaturesAdded');
+            api.trigger('streamFeaturesAdded');
         }
 
 
@@ -339,7 +340,7 @@ converse.plugins.add('converse-disco', {
                 iqresult.c('identity', attrs).up();
             });
             plugin._features.forEach(feature => iqresult.c('feature', {'var': feature}).up());
-            _converse.api.send(iqresult.tree());
+            api.send(iqresult.tree());
             return true;
         }
 
@@ -364,12 +365,12 @@ converse.plugins.add('converse-disco', {
              * @event _converse#discoInitialized
              * @example _converse.api.listen.on('discoInitialized', () => { ... });
              */
-            _converse.api.trigger('discoInitialized');
+            api.trigger('discoInitialized');
         }
 
         /******************** Event Handlers ********************/
 
-        _converse.api.listen.on('userSessionInitialized', async () => {
+        api.listen.on('userSessionInitialized', async () => {
             initStreamFeatures();
             if (_converse.connfeedback.get('connection_status') === Strophe.Status.ATTACHED) {
                 // When re-attaching to a BOSH session, we fetch the stream features from the cache.
@@ -377,20 +378,20 @@ converse.plugins.add('converse-disco', {
                 notifyStreamFeaturesAdded();
             }
         });
-        _converse.api.listen.on('beforeResourceBinding', populateStreamFeatures);
+        api.listen.on('beforeResourceBinding', populateStreamFeatures);
 
-        _converse.api.listen.on('reconnected', initializeDisco);
-        _converse.api.listen.on('connected', initializeDisco);
+        api.listen.on('reconnected', initializeDisco);
+        api.listen.on('connected', initializeDisco);
 
-        _converse.api.listen.on('beforeTearDown', async () => {
-            _converse.api.promises.add('streamFeaturesAdded')
+        api.listen.on('beforeTearDown', async () => {
+            api.promises.add('streamFeaturesAdded')
             if (_converse.stream_features) {
                 await _converse.stream_features.clearStore();
                 delete _converse.stream_features;
             }
         });
 
-        _converse.api.listen.on('clearSession', () => {
+        api.listen.on('clearSession', () => {
             if (_converse.shouldClearCache() && _converse.disco_entities) {
                 Array.from(_converse.disco_entities.models).forEach(e => e.features.clearStore());
                 Array.from(_converse.disco_entities.models).forEach(e => e.identities.clearStore());
@@ -404,34 +405,34 @@ converse.plugins.add('converse-disco', {
 
         /************************ API ************************/
 
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * The XEP-0030 service discovery API
              *
              * This API lets you discover information about entities on the
              * XMPP network.
              *
-             * @namespace _converse.api.disco
-             * @memberOf _converse.api
+             * @namespace api.disco
+             * @memberOf api
              */
             disco: {
                 /**
-                 * @namespace _converse.api.disco.stream
-                 * @memberOf _converse.api.disco
+                 * @namespace api.disco.stream
+                 * @memberOf api.disco
                  */
                 stream: {
                     /**
-                     * @method _converse.api.disco.stream.getFeature
+                     * @method api.disco.stream.getFeature
                      * @param {String} name The feature name
                      * @param {String} xmlns The XML namespace
                      * @example _converse.api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver')
                      */
                     async getFeature (name, xmlns) {
-                        await _converse.api.waitUntil('streamFeaturesAdded');
+                        await api.waitUntil('streamFeaturesAdded');
                         if (!name || !xmlns) {
                             throw new Error("name and xmlns need to be provided when calling disco.stream.getFeature");
                         }
-                        if (_converse.stream_features === undefined && !_converse.api.connection.connected()) {
+                        if (_converse.stream_features === undefined && !api.connection.connected()) {
                             // Happens during tests when disco lookups happen asynchronously after teardown.
                             const msg = `Tried to get feature ${name} ${xmlns} but _converse.stream_features has been torn down`;
                             log.warn(msg);
@@ -442,18 +443,18 @@ converse.plugins.add('converse-disco', {
                 },
 
                 /**
-                 * @namespace _converse.api.disco.own
-                 * @memberOf _converse.api.disco
+                 * @namespace api.disco.own
+                 * @memberOf api.disco
                  */
                 own: {
                     /**
-                     * @namespace _converse.api.disco.own.identities
-                     * @memberOf _converse.api.disco.own
+                     * @namespace api.disco.own.identities
+                     * @memberOf api.disco.own
                      */
                     identities: {
                         /**
                          * Lets you add new identities for this client (i.e. instance of Converse)
-                         * @method _converse.api.disco.own.identities.add
+                         * @method api.disco.own.identities.add
                          *
                          * @param {String} category - server, client, gateway, directory, etc.
                          * @param {String} type - phone, pc, web, etc.
@@ -475,7 +476,7 @@ converse.plugins.add('converse-disco', {
                         },
                         /**
                          * Clears all previously registered identities.
-                         * @method _converse.api.disco.own.identities.clear
+                         * @method api.disco.own.identities.clear
                          * @example _converse.api.disco.own.identities.clear();
                          */
                         clear () {
@@ -484,8 +485,8 @@ converse.plugins.add('converse-disco', {
                         /**
                          * Returns all of the identities registered for this client
                          * (i.e. instance of Converse).
-                         * @method _converse.api.disco.identities.get
-                         * @example const identities = _converse.api.disco.own.identities.get();
+                         * @method api.disco.identities.get
+                         * @example const identities = api.disco.own.identities.get();
                          */
                         get () {
                             return plugin._identities;
@@ -493,13 +494,13 @@ converse.plugins.add('converse-disco', {
                     },
 
                     /**
-                     * @namespace _converse.api.disco.own.features
-                     * @memberOf _converse.api.disco.own
+                     * @namespace api.disco.own.features
+                     * @memberOf api.disco.own
                      */
                     features: {
                         /**
                          * Lets you register new disco features for this client (i.e. instance of Converse)
-                         * @method _converse.api.disco.own.features.add
+                         * @method api.disco.own.features.add
                          * @param {String} name - e.g. http://jabber.org/protocol/caps
                          * @example _converse.api.disco.own.features.add("http://jabber.org/protocol/caps");
                          */
@@ -511,7 +512,7 @@ converse.plugins.add('converse-disco', {
                         },
                         /**
                          * Clears all previously registered features.
-                         * @method _converse.api.disco.own.features.clear
+                         * @method api.disco.own.features.clear
                          * @example _converse.api.disco.own.features.clear();
                          */
                         clear () {
@@ -519,8 +520,8 @@ converse.plugins.add('converse-disco', {
                         },
                         /**
                          * Returns all of the features registered for this client (i.e. instance of Converse).
-                         * @method _converse.api.disco.own.features.get
-                         * @example const features = _converse.api.disco.own.features.get();
+                         * @method api.disco.own.features.get
+                         * @example const features = api.disco.own.features.get();
                          */
                         get () {
                             return plugin._features;
@@ -531,7 +532,7 @@ converse.plugins.add('converse-disco', {
                 /**
                  * Query for information about an XMPP entity
                  *
-                 * @method _converse.api.disco.info
+                 * @method api.disco.info
                  * @param {string} jid The Jabber ID of the entity to query
                  * @param {string} [node] A specific node identifier associated with the JID
                  * @returns {promise} Promise which resolves once we have a result from the server.
@@ -546,13 +547,13 @@ converse.plugins.add('converse-disco', {
                         'to':jid,
                         'type':'get'
                     }).c('query', attrs);
-                    return _converse.api.sendIQ(info);
+                    return api.sendIQ(info);
                 },
 
                 /**
                  * Query for items associated with an XMPP entity
                  *
-                 * @method _converse.api.disco.items
+                 * @method api.disco.items
                  * @param {string} jid The Jabber ID of the entity to query for items
                  * @param {string} [node] A specific node identifier associated with the JID
                  * @returns {promise} Promise which resolves once we have a result from the server.
@@ -562,7 +563,7 @@ converse.plugins.add('converse-disco', {
                     if (node) {
                         attrs.node = node;
                     }
-                    return _converse.api.sendIQ(
+                    return api.sendIQ(
                         $iq({
                             'from': _converse.connection.jid,
                             'to':jid,
@@ -574,24 +575,24 @@ converse.plugins.add('converse-disco', {
                 /**
                  * Namespace for methods associated with disco entities
                  *
-                 * @namespace _converse.api.disco.entities
-                 * @memberOf _converse.api.disco
+                 * @namespace api.disco.entities
+                 * @memberOf api.disco
                  */
                 entities: {
                     /**
                      * Get the corresponding `DiscoEntity` instance.
                      *
-                     * @method _converse.api.disco.entities.get
+                     * @method api.disco.entities.get
                      * @param {string} jid The Jabber ID of the entity
                      * @param {boolean} [create] Whether the entity should be created if it doesn't exist.
                      * @example _converse.api.disco.entities.get(jid);
                      */
                     async get (jid, create=false) {
-                        await _converse.api.waitUntil('discoInitialized');
+                        await api.waitUntil('discoInitialized');
                         if (!jid) {
                             return _converse.disco_entities;
                         }
-                        if (_converse.disco_entities === undefined && !_converse.api.connection.connected()) {
+                        if (_converse.disco_entities === undefined && !api.connection.connected()) {
                             // Happens during tests when disco lookups happen asynchronously after teardown.
                             const msg = `Tried to look up entity ${jid} but _converse.disco_entities has been torn down`;
                             log.warn(msg);
@@ -601,7 +602,7 @@ converse.plugins.add('converse-disco', {
                         if (entity || !create) {
                             return entity;
                         }
-                        return _converse.api.disco.entities.create(jid);
+                        return api.disco.entities.create(jid);
                     },
 
                     /**
@@ -612,7 +613,7 @@ converse.plugins.add('converse-disco', {
                      * Fetching from cache can be disabled by passing in
                      * `ignore_cache: true` in the options parameter.
                      *
-                     * @method _converse.api.disco.entities.create
+                     * @method api.disco.entities.create
                      * @param {string} jid The Jabber ID of the entity
                      * @param {object} [options] Additional options
                      * @param {boolean} [options.ignore_cache]
@@ -625,14 +626,14 @@ converse.plugins.add('converse-disco', {
                 },
 
                 /**
-                 * @namespace _converse.api.disco.features
-                 * @memberOf _converse.api.disco
+                 * @namespace api.disco.features
+                 * @memberOf api.disco
                  */
                 features: {
                     /**
                      * Return a given feature of a disco entity
                      *
-                     * @method _converse.api.disco.features.get
+                     * @method api.disco.features.get
                      * @param {string} feature The feature that might be
                      *     supported. In the XML stanza, this is the `var`
                      *     attribute of the `<feature>` element. For
@@ -644,16 +645,16 @@ converse.plugins.add('converse-disco', {
                      *     itself or those items associated with the entity if
                      *     they support the given feature.
                      * @example
-                     * _converse.api.disco.features.get(Strophe.NS.MAM, _converse.bare_jid);
+                     * api.disco.features.get(Strophe.NS.MAM, _converse.bare_jid);
                      */
                     async get (feature, jid) {
                         if (!jid) {
                             throw new TypeError('You need to provide an entity JID');
                         }
-                        await _converse.api.waitUntil('discoInitialized');
-                        let entity = await _converse.api.disco.entities.get(jid, true);
+                        await api.waitUntil('discoInitialized');
+                        let entity = await api.disco.entities.get(jid, true);
 
-                        if (_converse.disco_entities === undefined && !_converse.api.connection.connected()) {
+                        if (_converse.disco_entities === undefined && !api.connection.connected()) {
                             // Happens during tests when disco lookups happen asynchronously after teardown.
                             const msg = `Tried to get feature ${feature} for ${jid} but _converse.disco_entities has been torn down`;
                             log.warn(msg);
@@ -669,7 +670,7 @@ converse.plugins.add('converse-disco', {
                 /**
                  * Used to determine whether an entity supports a given feature.
                  *
-                 * @method _converse.api.disco.supports
+                 * @method api.disco.supports
                  * @param {string} feature The feature that might be
                  *     supported. In the XML stanza, this is the `var`
                  *     attribute of the `<feature>` element. For
@@ -678,32 +679,32 @@ converse.plugins.add('converse-disco', {
                  *     (and its associated items) which should be queried
                  * @returns {promise} A promise which resolves with `true` or `false`.
                  * @example
-                 * if (await _converse.api.disco.supports(Strophe.NS.MAM, _converse.bare_jid)) {
+                 * if (await api.disco.supports(Strophe.NS.MAM, _converse.bare_jid)) {
                  *     // The feature is supported
                  * } else {
                  *     // The feature is not supported
                  * }
                  */
                 async supports (feature, jid) {
-                    const features = await _converse.api.disco.features.get(feature, jid);
+                    const features = await api.disco.features.get(feature, jid);
                     return features.length > 0;
                 },
 
                 /**
                  * Refresh the features, fields and identities associated with a
                  * disco entity by refetching them from the server
-                 * @method _converse.api.disco.refresh
+                 * @method api.disco.refresh
                  * @param {string} jid The JID of the entity whose features are refreshed.
                  * @returns {promise} A promise which resolves once the features have been refreshed
                  * @example
-                 * await _converse.api.disco.refresh('room@conference.example.org');
+                 * await api.disco.refresh('room@conference.example.org');
                  */
                 async refresh (jid) {
                     if (!jid) {
                         throw new TypeError('api.disco.refresh: You need to provide an entity JID');
                     }
-                    await _converse.api.waitUntil('discoInitialized');
-                    let entity = await _converse.api.disco.entities.get(jid);
+                    await api.waitUntil('discoInitialized');
+                    let entity = await api.disco.entities.get(jid);
                     if (entity) {
                         entity.features.reset();
                         entity.fields.reset();
@@ -714,34 +715,34 @@ converse.plugins.add('converse-disco', {
                         entity.queryInfo();
                     } else {
                         // Create it if it doesn't exist
-                        entity = await _converse.api.disco.entities.create(jid, {'ignore_cache': true});
+                        entity = await api.disco.entities.create(jid, {'ignore_cache': true});
                     }
                     return entity.waitUntilFeaturesDiscovered;
                 },
 
                 /**
-                 * @deprecated Use {@link _converse.api.disco.refresh} instead.
-                 * @method _converse.api.disco.refreshFeatures
+                 * @deprecated Use {@link api.disco.refresh} instead.
+                 * @method api.disco.refreshFeatures
                  */
                 refreshFeatures (jid) {
-                    return _converse.api.refresh(jid);
+                    return api.refresh(jid);
                 },
 
                 /**
                  * Return all the features associated with a disco entity
                  *
-                 * @method _converse.api.disco.getFeatures
+                 * @method api.disco.getFeatures
                  * @param {string} jid The JID of the entity whose features are returned.
                  * @returns {promise} A promise which resolves with the returned features
                  * @example
-                 * const features = await _converse.api.disco.getFeatures('room@conference.example.org');
+                 * const features = await api.disco.getFeatures('room@conference.example.org');
                  */
                 async getFeatures (jid) {
                     if (!jid) {
                         throw new TypeError('api.disco.getFeatures: You need to provide an entity JID');
                     }
-                    await _converse.api.waitUntil('discoInitialized');
-                    let entity = await _converse.api.disco.entities.get(jid, true);
+                    await api.waitUntil('discoInitialized');
+                    let entity = await api.disco.entities.get(jid, true);
                     entity = await entity.waitUntilFeaturesDiscovered;
                     return entity.features;
                 },
@@ -752,17 +753,17 @@ converse.plugins.add('converse-disco', {
                  *
                  * See [XEP-0129: Service Discovery Extensions](https://xmpp.org/extensions/xep-0128.html)
                  *
-                 * @method _converse.api.disco.getFields
+                 * @method api.disco.getFields
                  * @param {string} jid The JID of the entity whose fields are returned.
                  * @example
-                 * const fields = await _converse.api.disco.getFields('room@conference.example.org');
+                 * const fields = await api.disco.getFields('room@conference.example.org');
                  */
                 async getFields (jid) {
                     if (!jid) {
                         throw new TypeError('api.disco.getFields: You need to provide an entity JID');
                     }
-                    await _converse.api.waitUntil('discoInitialized');
-                    let entity = await _converse.api.disco.entities.get(jid, true);
+                    await api.waitUntil('discoInitialized');
+                    let entity = await api.disco.entities.get(jid, true);
                     entity = await entity.waitUntilFeaturesDiscovered;
                     return entity.fields;
                 },
@@ -775,7 +776,7 @@ converse.plugins.add('converse-disco', {
                  * `category='pubsub'` and `type='pep'` as explained in this section of
                  * XEP-0163: https://xmpp.org/extensions/xep-0163.html#support
                  *
-                 * @method _converse.api.disco.getIdentity
+                 * @method api.disco.getIdentity
                  * @param {string} The identity category.
                  *     In the XML stanza, this is the `category`
                  *     attribute of the `<identity>` element.
@@ -788,7 +789,7 @@ converse.plugins.add('converse-disco', {
                  * @returns {promise} A promise which resolves with a map indicating
                  *     whether an identity with a given type is provided by the entity.
                  * @example
-                 * _converse.api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then(
+                 * api.disco.getIdentity('pubsub', 'pep', _converse.bare_jid).then(
                  *     function (identity) {
                  *         if (identity) {
                  *             // The entity DOES have this identity
@@ -799,8 +800,8 @@ converse.plugins.add('converse-disco', {
                  * ).catch(e => log.error(e));
                  */
                 async getIdentity (category, type, jid) {
-                    const e = await _converse.api.disco.entities.get(jid, true);
-                    if (e === undefined && !_converse.api.connection.connected()) {
+                    const e = await api.disco.entities.get(jid, true);
+                    if (e === undefined && !api.connection.connected()) {
                         // Happens during tests when disco lookups happen asynchronously after teardown.
                         const msg = `Tried to look up category ${category} for ${jid} but _converse.disco_entities has been torn down`;
                         log.warn(msg);

+ 10 - 9
src/headless/converse-emoji.js

@@ -61,9 +61,10 @@ converse.plugins.add('converse-emoji', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
         const { ___ } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'emoji_image_path': twemoji.default.base,
             'emoji_categories': {
                 "smileys": ":grinning:",
@@ -98,8 +99,8 @@ converse.plugins.add('converse-emoji', {
         });
 
         _converse.emojis = {};
-        _converse.api.promises.add('emojisInitialized', false);
-        twemoji.default.base = _converse.api.settings.get('emoji_image_path');
+        api.promises.add('emojisInitialized', false);
+        twemoji.default.base = api.settings.get('emoji_image_path');
 
 
         /**
@@ -162,7 +163,7 @@ converse.plugins.add('converse-emoji', {
                     }
                 };
                 const transform = u.shortnamesToEmojis;
-                return _converse.api.settings.get('use_system_emojis') ? transform : text => twemoji.default.parse(transform(text), how);
+                return api.settings.get('use_system_emojis') ? transform : text => twemoji.default.parse(transform(text), how);
             },
 
             /**
@@ -263,18 +264,18 @@ converse.plugins.add('converse-emoji', {
 
         /************************ BEGIN API ************************/
         // We extend the default converse.js API to add methods specific to MUC groupchats.
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * The "rooms" namespace groups methods relevant to chatrooms
              * (aka groupchats).
              *
-             * @namespace _converse.api.rooms
-             * @memberOf _converse.api
+             * @namespace api.rooms
+             * @memberOf api
              */
             emojis: {
                 /**
                  * Initializes Emoji support by downloading the emojis JSON (and any applicable images).
-                 * @method _converse.api.emojis.initialize
+                 * @method api.emojis.initialize
                  * @returns {Promise}
                  */
                 async initialize () {
@@ -300,7 +301,7 @@ converse.plugins.add('converse-emoji', {
                      * fetched and its save to start calling emoji utility methods.
                      * @event _converse#emojisInitialized
                      */
-                    _converse.api.trigger('emojisInitialized');
+                    api.trigger('emojisInitialized');
                 }
             }
         });

+ 14 - 13
src/headless/converse-headlines.js

@@ -47,6 +47,7 @@ converse.plugins.add('converse-headlines', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
         /**
          * Shows headline messages
@@ -58,7 +59,7 @@ converse.plugins.add('converse-headlines', {
             defaults () {
                 return {
                     'bookmarked': false,
-                    'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")),
+                    'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")),
                     'message_type': 'headline',
                     'num_unread': 0,
                     'time_opened': this.get('time_opened') || (new Date()).getTime(),
@@ -75,7 +76,7 @@ converse.plugins.add('converse-headlines', {
                  * @type { _converse.HeadlinesBox }
                  * @example _converse.api.listen.on('headlinesBoxInitialized', model => { ... });
                  */
-                _converse.api.trigger('headlinesBoxInitialized', this);
+                api.trigger('headlinesBoxInitialized', this);
             }
         });
 
@@ -85,7 +86,7 @@ converse.plugins.add('converse-headlines', {
                 const from_jid = message.getAttribute('from');
                 if (from_jid.includes('@') &&
                         !_converse.roster.get(from_jid) &&
-                        !_converse.api.settings.get("allow_non_roster_messaging")) {
+                        !api.settings.get("allow_non_roster_messaging")) {
                     return;
                 }
                 if (message.querySelector('body') === null) {
@@ -100,7 +101,7 @@ converse.plugins.add('converse-headlines', {
                 });
                 const attrs = await chatbox.getMessageAttributesFromStanza(message, message);
                 await chatbox.createMessage(attrs);
-                _converse.api.trigger('message', {'chatbox': chatbox, 'stanza': message});
+                api.trigger('message', {'chatbox': chatbox, 'stanza': message});
             }
         }
 
@@ -112,26 +113,26 @@ converse.plugins.add('converse-headlines', {
                 return true
             }, null, 'message');
         }
-        _converse.api.listen.on('connected', registerHeadlineHandler);
-        _converse.api.listen.on('reconnected', registerHeadlineHandler);
+        api.listen.on('connected', registerHeadlineHandler);
+        api.listen.on('reconnected', registerHeadlineHandler);
         /************************ END Event Handlers ************************/
 
 
         /************************ BEGIN API ************************/
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * The "headlines" namespace, which is used for headline-channels
              * which are read-only channels containing messages of type
              * "headline".
              *
-             * @namespace _converse.api.headlines
-             * @memberOf _converse.api
+             * @namespace api.headlines
+             * @memberOf api
              */
             headlines: {
                 /**
                  * Retrieves a headline-channel or all headline-channels.
                  *
-                 * @method _converse.api.headlines.get
+                 * @method api.headlines.get
                  * @param {String|String[]} jids - e.g. 'buddy@example.com' or ['buddy1@example.com', 'buddy2@example.com']
                  * @param {Object} [attrs] - Attributes to be set on the _converse.ChatBox model.
                  * @param {Boolean} [create=false] - Whether the chat should be created if it's not found.
@@ -139,9 +140,9 @@ converse.plugins.add('converse-headlines', {
                  */
                 async get (jids, attrs={}, create=false) {
                     async function _get (jid) {
-                        let model = await _converse.api.chatboxes.get(jid);
+                        let model = await api.chatboxes.get(jid);
                         if (!model && create) {
-                            model = await _converse.api.chatboxes.create(jid, attrs, _converse.HeadlinesBox);
+                            model = await api.chatboxes.create(jid, attrs, _converse.HeadlinesBox);
                         } else {
                             model = (model && model.get('type') === _converse.HEADLINES_TYPE) ? model : null;
                             if (model && Object.keys(attrs).length) {
@@ -151,7 +152,7 @@ converse.plugins.add('converse-headlines', {
                         return model;
                     }
                     if (jids === undefined) {
-                        const chats = await _converse.api.chatboxes.get();
+                        const chats = await api.chatboxes.get();
                         return chats.filter(c => (c.get('type') === _converse.HEADLINES_TYPE));
                     } else if (isString(jids)) {
                         return _get(jids);

+ 37 - 36
src/headless/converse-mam.js

@@ -28,8 +28,9 @@ converse.plugins.add('converse-mam', {
          * loaded by Converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             archived_messages_page_size: '50',
             message_archiving: undefined, // Supported values are 'always', 'never', 'roster' (https://xmpp.org/extensions/xep-0313.html#prefs)
             message_archiving_timeout: 20000, // Time (in milliseconds) to wait before aborting MAM request
@@ -85,18 +86,18 @@ converse.plugins.add('converse-mam', {
                 }
                 const is_groupchat = this.get('type') === _converse.CHATROOMS_TYPE;
                 const mam_jid = is_groupchat ? this.get('jid') : _converse.bare_jid;
-                if (!(await _converse.api.disco.supports(Strophe.NS.MAM, mam_jid))) {
+                if (!(await api.disco.supports(Strophe.NS.MAM, mam_jid))) {
                     return;
                 }
                 const msg_handler = is_groupchat ? s => this.queueMessage(s) : s => _converse.handleMessageStanza(s);
 
                 const query = Object.assign({
                         'groupchat': is_groupchat,
-                        'max': _converse.api.settings.get('archived_messages_page_size'),
+                        'max': api.settings.get('archived_messages_page_size'),
                         'with': this.get('jid'),
                     }, options);
 
-                const result = await _converse.api.archive.query(query);
+                const result = await api.archive.query(query);
                 /* eslint-disable no-await-in-loop */
                 for (const message of result.messages) {
                     try {
@@ -113,9 +114,9 @@ converse.plugins.add('converse-mam', {
 
                 if (page && result.rsm) {
                     if (page === 'forwards') {
-                        options = result.rsm.next(_converse.api.settings.get('archived_messages_page_size'), options.before);
+                        options = result.rsm.next(api.settings.get('archived_messages_page_size'), options.before);
                     } else if (page === 'backwards') {
-                        options = result.rsm.previous(_converse.api.settings.get('archived_messages_page_size'), options.after);
+                        options = result.rsm.previous(api.settings.get('archived_messages_page_size'), options.after);
                     }
                     return this.fetchArchivedMessages(options, page);
                 } else {
@@ -150,32 +151,32 @@ converse.plugins.add('converse-mam', {
              */
             const preference = sizzle(`prefs[xmlns="${Strophe.NS.MAM}"]`, iq).pop();
             const default_pref = preference.getAttribute('default');
-            if (default_pref !== _converse.api.settings.get('message_archiving')) {
+            if (default_pref !== api.settings.get('message_archiving')) {
                 const stanza = $iq({'type': 'set'})
                     .c('prefs', {
                         'xmlns':Strophe.NS.MAM,
-                        'default':_converse.api.settings.get('message_archiving')
+                        'default':api.settings.get('message_archiving')
                     });
                 Array.from(preference.children).forEach(child => stanza.cnode(child).up());
 
                 // XXX: Strictly speaking, the server should respond with the updated prefs
                 // (see example 18: https://xmpp.org/extensions/xep-0313.html#config)
                 // but Prosody doesn't do this, so we don't rely on it.
-                _converse.api.sendIQ(stanza)
-                    .then(() => feature.save({'preferences': {'default':_converse.api.settings.get('message_archiving')}}))
+                api.sendIQ(stanza)
+                    .then(() => feature.save({'preferences': {'default':api.settings.get('message_archiving')}}))
                     .catch(_converse.onMAMError);
             } else {
-                feature.save({'preferences': {'default':_converse.api.settings.get('message_archiving')}});
+                feature.save({'preferences': {'default':api.settings.get('message_archiving')}});
             }
         };
 
         function getMAMPrefsFromFeature (feature) {
             const prefs = feature.get('preferences') || {};
-            if (feature.get('var') !== Strophe.NS.MAM || _converse.api.settings.get('message_archiving') === undefined) {
+            if (feature.get('var') !== Strophe.NS.MAM || api.settings.get('message_archiving') === undefined) {
                 return;
             }
-            if (prefs['default'] !== _converse.api.settings.get('message_archiving')) {
-                _converse.api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM}))
+            if (prefs['default'] !== api.settings.get('message_archiving')) {
+                api.sendIQ($iq({'type': 'get'}).c('prefs', {'xmlns': Strophe.NS.MAM}))
                     .then(iq => _converse.onMAMPreferences(iq, feature))
                     .catch(_converse.onMAMError);
             }
@@ -193,26 +194,26 @@ converse.plugins.add('converse-mam', {
         }
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.MAM));
-        _converse.api.listen.on('serviceDiscovered', getMAMPrefsFromFeature);
-        _converse.api.listen.on('chatRoomViewInitialized', view => {
+        api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.MAM));
+        api.listen.on('serviceDiscovered', getMAMPrefsFromFeature);
+        api.listen.on('chatRoomViewInitialized', view => {
             if (_converse.muc_show_logs_before_join) {
                 // If we want to show MAM logs before entering the MUC, we need
                 // to be informed once it's clear that this MUC supports MAM.
                 view.model.features.on('change:mam_enabled', preMUCJoinMAMFetch(view.model));
             }
         });
-        _converse.api.listen.on('enteredNewRoom', room => room.features.get('mam_enabled') && room.fetchNewestMessages());
+        api.listen.on('enteredNewRoom', room => room.features.get('mam_enabled') && room.fetchNewestMessages());
 
 
-        _converse.api.listen.on('chatReconnected', chat => {
+        api.listen.on('chatReconnected', chat => {
             // XXX: For MUCs, we listen to enteredNewRoom instead
             if (chat.get('type') === _converse.PRIVATE_CHAT_TYPE) {
                 chat.fetchNewestMessages();
             }
         });
 
-        _converse.api.listen.on('afterMessagesFetched', chat => {
+        api.listen.on('afterMessagesFetched', chat => {
             // XXX: We don't want to query MAM every time this is triggered
             // since it's not necessary when the chat is restored from cache.
             // (given that BOSH or SMACKS will ensure that you get messages
@@ -226,7 +227,7 @@ converse.plugins.add('converse-mam', {
 
 
         /************************ BEGIN API ************************/
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * The [XEP-0313](https://xmpp.org/extensions/xep-0313.html) Message Archive Management API
              *
@@ -236,8 +237,8 @@ converse.plugins.add('converse-mam', {
              * option in the configuration settings section, which you'll
              * usually want to use in conjunction with this API.
              *
-             * @namespace _converse.api.archive
-             * @memberOf _converse.api
+             * @namespace api.archive
+             * @memberOf api
              */
             'archive': {
                  /**
@@ -246,7 +247,7 @@ converse.plugins.add('converse-mam', {
                   * The options parameter can also be an instance of
                   * _converse.RSM to enable easy querying between results pages.
                   *
-                  * @method _converse.api.archive.query
+                  * @method api.archive.query
                   * @param {(Object|_converse.RSM)} options Query parameters, either
                   *      MAM-specific or also for Result Set Management.
                   *      Can be either an object or an instance of _converse.RSM.
@@ -276,7 +277,7 @@ converse.plugins.add('converse-mam', {
                   *
                   * let result;
                   * try {
-                  *     result = await _converse.api.archive.query();
+                  *     result = await api.archive.query();
                   * } catch (e) {
                   *     // The query was not successful, perhaps inform the user?
                   *     // The IQ stanza returned by the XMPP server is passed in, so that you
@@ -296,7 +297,7 @@ converse.plugins.add('converse-mam', {
                   * // For a particular user
                   * let result;
                   * try {
-                  *    result = await _converse.api.archive.query({'with': 'john@doe.net'});
+                  *    result = await api.archive.query({'with': 'john@doe.net'});
                   * } catch (e) {
                   *     // The query was not successful
                   * }
@@ -304,7 +305,7 @@ converse.plugins.add('converse-mam', {
                   * // For a particular room
                   * let result;
                   * try {
-                  *    result = await _converse.api.archive.query({'with': 'discuss@conference.doglovers.net', 'groupchat': true});
+                  *    result = await api.archive.query({'with': 'discuss@conference.doglovers.net', 'groupchat': true});
                   * } catch (e) {
                   *     // The query was not successful
                   * }
@@ -324,7 +325,7 @@ converse.plugins.add('converse-mam', {
                   *  };
                   * let result;
                   * try {
-                  *    result = await _converse.api.archive.query(options);
+                  *    result = await api.archive.query(options);
                   * } catch (e) {
                   *     // The query was not successful
                   * }
@@ -339,7 +340,7 @@ converse.plugins.add('converse-mam', {
                   * // Return maximum 10 archived messages
                   * let result;
                   * try {
-                  *     result = await _converse.api.archive.query({'with': 'john@doe.net', 'max':10});
+                  *     result = await api.archive.query({'with': 'john@doe.net', 'max':10});
                   * } catch (e) {
                   *     // The query was not successful
                   * }
@@ -363,7 +364,7 @@ converse.plugins.add('converse-mam', {
                   *
                   * let result;
                   * try {
-                  *     result = await _converse.api.archive.query({'with': 'john@doe.net', 'max':10});
+                  *     result = await api.archive.query({'with': 'john@doe.net', 'max':10});
                   * } catch (e) {
                   *     // The query was not successful
                   * }
@@ -372,7 +373,7 @@ converse.plugins.add('converse-mam', {
                   *
                   * while (result.rsm) {
                   *     try {
-                  *         result = await _converse.api.archive.query(rsm.next(10));
+                  *         result = await api.archive.query(rsm.next(10));
                   *     } catch (e) {
                   *         // The query was not successful
                   *     }
@@ -391,7 +392,7 @@ converse.plugins.add('converse-mam', {
                   *
                   * let result;
                   * try {
-                  *     result = await _converse.api.archive.query({'before': '', 'max':5});
+                  *     result = await api.archive.query({'before': '', 'max':5});
                   * } catch (e) {
                   *     // The query was not successful
                   * }
@@ -400,7 +401,7 @@ converse.plugins.add('converse-mam', {
                   *
                   * // Now we query again, to get the previous batch.
                   * try {
-                  *      result = await _converse.api.archive.query(rsm.previous(5););
+                  *      result = await api.archive.query(rsm.previous(5););
                   * } catch (e) {
                   *     // The query was not successful
                   * }
@@ -409,7 +410,7 @@ converse.plugins.add('converse-mam', {
                   *
                   */
                 async query (options) {
-                    if (!_converse.api.connection.connected()) {
+                    if (!api.connection.connected()) {
                         throw new Error('Can\'t call `api.archive.query` before having established an XMPP session');
                     }
                     const attrs = {'type':'set'};
@@ -423,7 +424,7 @@ converse.plugins.add('converse-mam', {
                     }
 
                     const jid = attrs.to || _converse.bare_jid;
-                    const supported = await _converse.api.disco.supports(Strophe.NS.MAM, jid);
+                    const supported = await api.disco.supports(Strophe.NS.MAM, jid);
                     if (!supported) {
                         log.warn(`Did not fetch MAM archive for ${jid} because it doesn't support ${Strophe.NS.MAM}`);
                         return {'messages': []};
@@ -479,7 +480,7 @@ converse.plugins.add('converse-mam', {
                     }, Strophe.NS.MAM);
 
                     let error;
-                    const iq_result = await _converse.api.sendIQ(stanza, _converse.api.settings.get('message_archiving_timeout'), false)
+                    const iq_result = await api.sendIQ(stanza, api.settings.get('message_archiving_timeout'), false)
                     if (iq_result === null) {
                         const err_msg = "Timeout while trying to fetch archived messages.";
                         log.error(err_msg);

+ 98 - 97
src/headless/converse-muc.js

@@ -102,13 +102,14 @@ converse.plugins.add('converse-muc', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
         const { __, ___ } = _converse;
 
         // Configuration values for this plugin
         // ====================================
         // Refer to docs/source/configuration.rst for explanations of these
         // configuration settings.
-        _converse.api.settings.update({
+        api.settings.update({
             'allow_muc': true,
             'allow_muc_invitations': true,
             'auto_join_on_invite': false,
@@ -122,9 +123,9 @@ converse.plugins.add('converse-muc', {
             'muc_nickname_from_jid': false,
             'muc_show_logs_before_join': false
         });
-        _converse.api.promises.add(['roomsAutoJoined']);
+        api.promises.add(['roomsAutoJoined']);
 
-        if (_converse.api.settings.get('locked_muc_domain') && !isString(_converse.api.settings.get('muc_domain'))) {
+        if (api.settings.get('locked_muc_domain') && !isString(api.settings.get('muc_domain'))) {
             throw new Error("Config Error: it makes no sense to set locked_muc_domain "+
                             "to true when muc_domain is not set");
         }
@@ -188,11 +189,11 @@ converse.plugins.add('converse-muc', {
             if (!u.isValidMUCJID(jid)) {
                 return log.warn(`invalid jid "${jid}" provided in url fragment`);
             }
-            await _converse.api.waitUntil('roomsAutoJoined');
+            await api.waitUntil('roomsAutoJoined');
             if (_converse.allow_bookmarks) {
-                await _converse.api.waitUntil('bookmarksInitialized');
+                await api.waitUntil('bookmarksInitialized');
             }
-            _converse.api.rooms.open(jid);
+            api.rooms.open(jid);
         }
         _converse.router.route('converse/room?jid=:jid', openRoom);
 
@@ -207,7 +208,7 @@ converse.plugins.add('converse-muc', {
             const nick = _converse.xmppstatus.getNickname();
             if (nick) {
                 return nick;
-            } else if (_converse.api.settings.get('muc_nickname_from_jid')) {
+            } else if (api.settings.get('muc_nickname_from_jid')) {
                 return Strophe.unescapeNode(Strophe.getNodeFromJid(_converse.bare_jid));
             }
         }
@@ -219,7 +220,7 @@ converse.plugins.add('converse-muc', {
              */
             settings.type = _converse.CHATROOMS_TYPE;
             settings.id = jid;
-            const chatbox = await _converse.api.rooms.get(jid, settings, true);
+            const chatbox = await api.rooms.get(jid, settings, true);
             chatbox.maybeShow(true);
             return chatbox;
         }
@@ -247,7 +248,7 @@ converse.plugins.add('converse-muc', {
                  * @type { _converse.ChatRoomMessages}
                  * @example _converse.api.listen.on('chatRoomMessageInitialized', model => { ... });
                  */
-                _converse.api.trigger('chatRoomMessageInitialized', this);
+                api.trigger('chatRoomMessageInitialized', this);
             },
 
             /**
@@ -259,7 +260,7 @@ converse.plugins.add('converse-muc', {
              * @returns { Boolean }
              */
             mayBeModerated () {
-                return ['all', 'moderator'].includes(_converse.api.settings.get('allow_message_retraction')) &&
+                return ['all', 'moderator'].includes(api.settings.get('allow_message_retraction')) &&
                     this.collection.chatbox.canModerateMessages();
             },
 
@@ -351,7 +352,7 @@ converse.plugins.add('converse-muc', {
                     'num_unread_general': 0,
                     'bookmarked': false,
                     'chat_state': undefined,
-                    'hidden': ['mobile', 'fullscreen'].includes(_converse.api.settings.get("view_mode")),
+                    'hidden': ['mobile', 'fullscreen'].includes(api.settings.get("view_mode")),
                     'message_type': 'groupchat',
                     'name': '',
                     'num_unread': 0,
@@ -386,7 +387,7 @@ converse.plugins.add('converse-muc', {
                  * @type { _converse.ChatRoom }
                  * @example _converse.api.listen.on('chatRoomInitialized', model => { ... });
                  */
-                await _converse.api.trigger('chatRoomInitialized', this, {'Synchronous': true});
+                await api.trigger('chatRoomInitialized', this, {'Synchronous': true});
                 this.initialized.resolve();
             },
 
@@ -427,7 +428,7 @@ converse.plugins.add('converse-muc', {
                 nick = await this.getAndPersistNickname(nick);
                 if (!nick) {
                     u.safeSave(this.session, {'connection_status': converse.ROOMSTATUS.NICKNAME_REQUIRED});
-                    if (_converse.api.settings.get('muc_show_logs_before_join')) {
+                    if (api.settings.get('muc_show_logs_before_join')) {
                         await this.fetchMessages();
                     }
                     return this;
@@ -436,13 +437,13 @@ converse.plugins.add('converse-muc', {
                     'from': _converse.connection.jid,
                     'to': this.getRoomJIDAndNick()
                 }).c("x", {'xmlns': Strophe.NS.MUC})
-                  .c("history", {'maxstanzas': this.features.get('mam_enabled') ? 0 : _converse.api.settings.get('muc_history_max_stanzas')}).up();
+                  .c("history", {'maxstanzas': this.features.get('mam_enabled') ? 0 : api.settings.get('muc_history_max_stanzas')}).up();
 
                 if (password) {
                     stanza.cnode(Strophe.xmlElement("password", [], password));
                 }
                 this.session.save('connection_status', converse.ROOMSTATUS.CONNECTING);
-                _converse.api.send(stanza);
+                api.send(stanza);
                 return this;
             },
 
@@ -491,10 +492,10 @@ converse.plugins.add('converse-muc', {
                      * @type { _converse.ChatRoom}
                      * @example _converse.api.listen.on('enteredNewRoom', model => { ... });
                      */
-                    _converse.api.trigger('enteredNewRoom', this);
+                    api.trigger('enteredNewRoom', this);
 
-                    if (_converse.api.settings.get('auto_register_muc_nickname') &&
-                            await _converse.api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid'))) {
+                    if (api.settings.get('auto_register_muc_nickname') &&
+                            await api.disco.supports(Strophe.NS.MUC_REGISTER, this.get('jid'))) {
                         this.registerNickname()
                     }
                 }
@@ -618,7 +619,7 @@ converse.plugins.add('converse-muc', {
             },
 
             invitesAllowed () {
-                return _converse.api.settings.get('allow_muc_invitations') &&
+                return api.settings.get('allow_muc_invitations') &&
                     (this.features.get('open') ||
                         this.getOwnAffiliation() === "owner"
                     );
@@ -628,7 +629,7 @@ converse.plugins.add('converse-muc', {
                 const name = this.get('name');
                 if (name) {
                     return name;
-                } else if (_converse.api.settings.get('locked_muc_domain') === 'hidden') {
+                } else if (api.settings.get('locked_muc_domain') === 'hidden') {
                     return Strophe.getNodeFromJid(this.get('jid'));
                 } else {
                     return this.get('jid');
@@ -671,7 +672,7 @@ converse.plugins.add('converse-muc', {
                         promise.reject(stanza);
                     }
                 }, null, 'message', ['error', 'groupchat'], id);
-                _converse.api.send(el)
+                api.send(el)
                 return promise;
             },
 
@@ -771,7 +772,7 @@ converse.plugins.add('converse-muc', {
                     }).c('moderate', {xmlns: Strophe.NS.MODERATE})
                         .c('retract', {xmlns: Strophe.NS.RETRACT}).up()
                         .c('reason').t(reason || '');
-                return _converse.api.sendIQ(iq, null, false);
+                return api.sendIQ(iq, null, false);
             },
 
             /**
@@ -795,7 +796,7 @@ converse.plugins.add('converse-muc', {
                 if (reason && reason.length > 0) {
                     iq.c("reason", reason);
                 }
-                return _converse.api.sendIQ(iq);
+                return api.sendIQ(iq);
             },
 
             /**
@@ -813,7 +814,7 @@ converse.plugins.add('converse-muc', {
                         await new Promise((success, error) => disco_entity.destroy({success, error}));
                     }
                 }
-                if (_converse.api.connection.connected()) {
+                if (api.connection.connected()) {
                     this.sendUnavailablePresence(exit_msg);
                 }
                 u.safeSave(this.session, {'connection_status': converse.ROOMSTATUS.DISCONNECTED});
@@ -836,7 +837,7 @@ converse.plugins.add('converse-muc', {
 
             canModerateMessages () {
                 const self = this.getOwnOccupant();
-                return self && self.isModerator() && _converse.api.disco.supports(Strophe.NS.MODERATE, this.get('jid'));
+                return self && self.isModerator() && api.disco.supports(Strophe.NS.MODERATE, this.get('jid'));
             },
 
             sendUnavailablePresence (exit_msg) {
@@ -986,7 +987,7 @@ converse.plugins.add('converse-muc', {
                     // <gone/> is not applicable within MUC context
                     return;
                 }
-                _converse.api.send(
+                api.send(
                     $msg({'to':this.get('jid'), 'type': 'groupchat'})
                         .c(chat_state, {'xmlns': Strophe.NS.CHATSTATES}).up()
                         .c('no-store', {'xmlns': Strophe.NS.HINTS}).up()
@@ -1020,7 +1021,7 @@ converse.plugins.add('converse-muc', {
                     'to': recipient,
                     'id': u.getUniqueId()
                 }).c('x', attrs);
-                _converse.api.send(invitation);
+                api.send(invitation);
                 /**
                  * After the user has sent out a direct invitation (as per XEP-0249),
                  * to a roster contact, asking them to join a room.
@@ -1031,7 +1032,7 @@ converse.plugins.add('converse-muc', {
                  * @property {string} reason - The original reason for the invitation
                  * @example _converse.api.listen.on('chatBoxMaximized', view => { ... });
                  */
-                _converse.api.trigger('roomInviteSent', {
+                api.trigger('roomInviteSent', {
                     'room': this,
                     'recipient': recipient,
                     'reason': reason
@@ -1046,7 +1047,7 @@ converse.plugins.add('converse-muc', {
              * @returns {Promise}
              */
             refreshDiscoInfo () {
-                return _converse.api.disco.refresh(this.get('jid'))
+                return api.disco.refresh(this.get('jid'))
                     .then(() => this.getDiscoInfo())
                     .catch(e => log.error(e));
             },
@@ -1059,7 +1060,7 @@ converse.plugins.add('converse-muc', {
              * @returns {Promise}
              */
             getDiscoInfo () {
-                return _converse.api.disco.getIdentity('conference', 'text', this.get('jid'))
+                return api.disco.getIdentity('conference', 'text', this.get('jid'))
                     .then(identity => this.save({'name': identity && identity.get('name')}))
                     .then(() => this.getDiscoInfoFields())
                     .then(() => this.getDiscoInfoFeatures())
@@ -1075,7 +1076,7 @@ converse.plugins.add('converse-muc', {
              * @returns {Promise}
              */
             async getDiscoInfoFields () {
-                const fields = await _converse.api.disco.getFields(this.get('jid'));
+                const fields = await api.disco.getFields(this.get('jid'));
                 const config = fields.reduce((config, f) => {
                     const name = f.get('var');
                     if (name && name.startsWith('muc#roominfo_')) {
@@ -1095,7 +1096,7 @@ converse.plugins.add('converse-muc', {
              * @returns {Promise}
              */
             async getDiscoInfoFeatures () {
-                const features = await _converse.api.disco.getFeatures(this.get('jid'));
+                const features = await api.disco.getFeatures(this.get('jid'));
                 const attrs = Object.assign(
                     zipObject(converse.ROOM_FEATURES, converse.ROOM_FEATURES.map(() => false)),
                     {'fetched': (new Date()).toISOString()}
@@ -1194,7 +1195,7 @@ converse.plugins.add('converse-muc', {
              * @returns { Promise<XMLElement> }
              */
             fetchRoomConfiguration () {
-                return _converse.api.sendIQ(
+                return api.sendIQ(
                     $iq({'to': this.get('jid'), 'type': "get"})
                      .c("query", {xmlns: Strophe.NS.MUC_OWNER})
                 );
@@ -1213,7 +1214,7 @@ converse.plugins.add('converse-muc', {
                     .c("query", {xmlns: Strophe.NS.MUC_OWNER})
                     .c("x", {xmlns: Strophe.NS.XFORM, type: "submit"});
                 config.forEach(node => iq.cnode(node).up());
-                return _converse.api.sendIQ(iq);
+                return api.sendIQ(iq);
             },
 
             /**
@@ -1267,7 +1268,7 @@ converse.plugins.add('converse-muc', {
                 if (member.reason !== undefined) {
                     iq.c("reason", member.reason);
                 }
-                return _converse.api.sendIQ(iq);
+                return api.sendIQ(iq);
             },
 
             /**
@@ -1309,7 +1310,7 @@ converse.plugins.add('converse-muc', {
                 if (reason !== null) {
                     iq.c("reason", reason);
                 }
-                return _converse.api.sendIQ(iq).then(onSuccess).catch(onError);
+                return api.sendIQ(iq).then(onSuccess).catch(onError);
             },
 
             /**
@@ -1388,7 +1389,7 @@ converse.plugins.add('converse-muc', {
                 const iq = $iq({to: this.get('jid'), type: "get"})
                     .c("query", {xmlns: Strophe.NS.MUC_ADMIN})
                         .c("item", {'affiliation': affiliation});
-                const result = await _converse.api.sendIQ(iq, null, false);
+                const result = await api.sendIQ(iq, null, false);
                 if (result === null) {
                     const err_msg = `Error: timeout while fetching ${affiliation} list for MUC ${this.get('jid')}`;
                     const err = new Error(err_msg);
@@ -1466,7 +1467,7 @@ converse.plugins.add('converse-muc', {
                     'xmlns': Strophe.NS.DISCO_INFO,
                     'node': 'x-roomuser-item'
                 })
-                const result = await _converse.api.sendIQ(stanza, null, false);
+                const result = await api.sendIQ(stanza, null, false);
                 if (u.isErrorObject(result)) {
                     throw result;
                 }
@@ -1480,7 +1481,7 @@ converse.plugins.add('converse-muc', {
                 const jid = this.get('jid');
                 let iq, err_msg;
                 try {
-                    iq = await _converse.api.sendIQ(
+                    iq = await api.sendIQ(
                         $iq({
                             'to': jid,
                             'from': _converse.connection.jid,
@@ -1501,7 +1502,7 @@ converse.plugins.add('converse-muc', {
                     return log.error(`Can't register the user register in the groupchat ${jid} due to the required fields`);
                 }
                 try {
-                    await _converse.api.sendIQ($iq({
+                    await api.sendIQ($iq({
                             'to': jid,
                             'from': _converse.connection.jid,
                             'type': 'set'
@@ -1675,7 +1676,7 @@ converse.plugins.add('converse-muc', {
              * @param { String } value
              */
             setSubject(value='') {
-                _converse.api.send(
+                api.send(
                     $msg({
                         to: this.get('jid'),
                         from: _converse.connection.jid,
@@ -1749,7 +1750,7 @@ converse.plugins.add('converse-muc', {
                     'type': "get"
                 }).c("ping", {'xmlns': Strophe.NS.PING});
                 try {
-                    await _converse.api.sendIQ(ping);
+                    await api.sendIQ(ping);
                 } catch (e) {
                     if (e === null) {
                         log.error(`Timeout error while checking whether we're joined to MUC: ${this.get('jid')}`);
@@ -1950,14 +1951,14 @@ converse.plugins.add('converse-muc', {
                     this.updateMessage(message, original_stanza);
                 }
                 if (message || stanza_utils.isReceipt(stanza) || stanza_utils.isChatMarker(stanza)) {
-                    return _converse.api.trigger('message', {'stanza': original_stanza});
+                    return api.trigger('message', {'stanza': original_stanza});
                 }
 
                 if (await this.handleRetraction(attrs) ||
                         await this.handleModeration(attrs) ||
                         this.subjectChangeHandled(attrs) ||
                         this.ignorableCSN(attrs)) {
-                    return _converse.api.trigger('message', {'stanza': original_stanza});
+                    return api.trigger('message', {'stanza': original_stanza});
                 }
                 this.setEditable(attrs, attrs.time);
 
@@ -1968,7 +1969,7 @@ converse.plugins.add('converse-muc', {
                     const msg = this.handleCorrection(attrs) || await this.createMessage(attrs);
                     this.incrementUnreadMsgCounter(msg);
                 }
-                _converse.api.trigger('message', {'stanza': original_stanza, 'chatbox': this});
+                api.trigger('message', {'stanza': original_stanza, 'chatbox': this});
             },
 
             handleModifyError(pres) {
@@ -2089,7 +2090,7 @@ converse.plugins.add('converse-muc', {
 
 
             onNicknameClash (presence) {
-                if (_converse.api.settings.get('muc_nickname_from_jid')) {
+                if (api.settings.get('muc_nickname_from_jid')) {
                     const nick = presence.getAttribute('from').split('/')[1];
                     if (nick === _converse.getDefaultMUCNickname()) {
                         this.join(nick + '-2');
@@ -2216,7 +2217,7 @@ converse.plugins.add('converse-muc', {
                     if (locked_room) {
                         if (this.get('auto_configure')) {
                             this.autoConfigureChatRoom().then(() => this.refreshDiscoInfo());
-                        } else if (_converse.api.settings.get('muc_instant_rooms')) {
+                        } else if (api.settings.get('muc_instant_rooms')) {
                             // Accept default configuration
                             this.sendConfiguration().then(() => this.refreshDiscoInfo());
                         } else {
@@ -2320,7 +2321,7 @@ converse.plugins.add('converse-muc', {
 
                 vcards.filter(v => v).forEach(vcard => {
                     if (hash && vcard.get('image_hash') !== hash) {
-                        _converse.api.vcard.update(vcard, true);
+                        api.vcard.update(vcard, true);
                     }
                 });
             },
@@ -2359,7 +2360,7 @@ converse.plugins.add('converse-muc', {
             },
 
             getAutoFetchedAffiliationLists () {
-                const affs = _converse.api.settings.get('muc_fetch_members');
+                const affs = api.settings.get('muc_fetch_members');
                 return Array.isArray(affs) ? affs :  (affs ? ['member', 'admin', 'owner'] : []);
             },
 
@@ -2402,7 +2403,7 @@ converse.plugins.add('converse-muc', {
                  * @event _converse#membersFetched
                  * @example _converse.api.listen.on('membersFetched', () => { ... });
                  */
-                _converse.api.trigger('membersFetched');
+                api.trigger('membersFetched');
             },
 
             findOccupant (data) {
@@ -2426,13 +2427,13 @@ converse.plugins.add('converse-muc', {
         _converse.RoomsPanelModel = Model.extend({
             defaults: function () {
                 return {
-                    'muc_domain': _converse.api.settings.get('muc_domain'),
+                    'muc_domain': api.settings.get('muc_domain'),
                     'nick': _converse.getDefaultMUCNickname()
                 }
             },
 
             setDomain (jid) {
-                if (!_converse.api.settings.get('locked_muc_domain')) {
+                if (!api.settings.get('locked_muc_domain')) {
                     this.save('muc_domain', Strophe.getDomainFromJid(jid));
                 }
             }
@@ -2453,7 +2454,7 @@ converse.plugins.add('converse-muc', {
                 reason = x_el.getAttribute('reason');
 
             let result;
-            if (_converse.api.settings.get('auto_join_on_invite')) {
+            if (api.settings.get('auto_join_on_invite')) {
                 result = true;
             } else {
                 // Invite request might come from someone not your roster list
@@ -2478,7 +2479,7 @@ converse.plugins.add('converse-muc', {
             }
         };
 
-        if (_converse.api.settings.get('allow_muc_invitations')) {
+        if (api.settings.get('allow_muc_invitations')) {
             const registerDirectInvitationHandler = function () {
                 _converse.connection.addHandler(
                     (message) =>  {
@@ -2486,15 +2487,15 @@ converse.plugins.add('converse-muc', {
                         return true;
                     }, 'jabber:x:conference', 'message');
             };
-            _converse.api.listen.on('connected', registerDirectInvitationHandler);
-            _converse.api.listen.on('reconnected', registerDirectInvitationHandler);
+            api.listen.on('connected', registerDirectInvitationHandler);
+            api.listen.on('reconnected', registerDirectInvitationHandler);
         }
 
         const createChatRoom = function (jid, attrs) {
             if (jid.startsWith('xmpp:') && jid.endsWith('?join')) {
                 jid = jid.replace(/^xmpp:/, '').replace(/\?join$/, '');
             }
-            return _converse.api.rooms.get(jid, attrs, true);
+            return api.rooms.get(jid, attrs, true);
         };
 
         /**
@@ -2504,14 +2505,14 @@ converse.plugins.add('converse-muc', {
          * settings).
          */
         function autoJoinRooms () {
-            _converse.api.settings.get('auto_join_rooms').forEach(groupchat => {
+            api.settings.get('auto_join_rooms').forEach(groupchat => {
                 if (isString(groupchat)) {
                     if (_converse.chatboxes.where({'jid': groupchat}).length) {
                         return;
                     }
-                    _converse.api.rooms.open(groupchat);
+                    api.rooms.open(groupchat);
                 } else if (isObject(groupchat)) {
-                    _converse.api.rooms.open(groupchat.jid, clone(groupchat));
+                    api.rooms.open(groupchat.jid, clone(groupchat));
                 } else {
                     log.error('Invalid groupchat criteria specified for "auto_join_rooms"');
                 }
@@ -2523,40 +2524,40 @@ converse.plugins.add('converse-muc', {
              * @example _converse.api.listen.on('roomsAutoJoined', () => { ... });
              * @example _converse.api.waitUntil('roomsAutoJoined').then(() => { ... });
              */
-            _converse.api.trigger('roomsAutoJoined');
+            api.trigger('roomsAutoJoined');
         }
 
         async function onWindowStateChanged (data) {
-            if (data.state === 'visible' && _converse.api.connection.connected()) {
-                const rooms = await _converse.api.rooms.get();
+            if (data.state === 'visible' && api.connection.connected()) {
+                const rooms = await api.rooms.get();
                 rooms.forEach(room => room.rejoinIfNecessary());
             }
         }
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('beforeTearDown', () => {
+        api.listen.on('beforeTearDown', () => {
             const groupchats = _converse.chatboxes.where({'type': _converse.CHATROOMS_TYPE});
             groupchats.forEach(muc => u.safeSave(muc.session, {'connection_status': converse.ROOMSTATUS.DISCONNECTED}));
         });
 
-        _converse.api.listen.on('windowStateChanged', onWindowStateChanged);
+        api.listen.on('windowStateChanged', onWindowStateChanged);
 
-        _converse.api.listen.on('addClientFeatures', () => {
-            if (_converse.api.settings.get('allow_muc')) {
-                _converse.api.disco.own.features.add(Strophe.NS.MUC);
+        api.listen.on('addClientFeatures', () => {
+            if (api.settings.get('allow_muc')) {
+                api.disco.own.features.add(Strophe.NS.MUC);
             }
-            if (_converse.api.settings.get('allow_muc_invitations')) {
-                _converse.api.disco.own.features.add('jabber:x:conference'); // Invites
+            if (api.settings.get('allow_muc_invitations')) {
+                api.disco.own.features.add('jabber:x:conference'); // Invites
             }
         });
-        _converse.api.listen.on('chatBoxesFetched', autoJoinRooms);
+        api.listen.on('chatBoxesFetched', autoJoinRooms);
 
 
-        _converse.api.listen.on('beforeResourceBinding', () => {
+        api.listen.on('beforeResourceBinding', () => {
             _converse.connection.addHandler(stanza => {
                 const muc_jid = Strophe.getBareJidFromJid(stanza.getAttribute('from'));
                 if (!_converse.chatboxes.get(muc_jid)) {
-                    _converse.api.waitUntil('chatBoxesFetched')
+                    api.waitUntil('chatBoxesFetched')
                         .then(async () => {
                             const muc = _converse.chatboxes.get(muc_jid);
                             if (muc) {
@@ -2580,11 +2581,11 @@ converse.plugins.add('converse-muc', {
                 .filter(m => (m.get('type') === _converse.CHATROOMS_TYPE))
                 .forEach(m => m.session.save({'connection_status': converse.ROOMSTATUS.DISCONNECTED}));
         }
-        _converse.api.listen.on('disconnected', disconnectChatRooms);
+        api.listen.on('disconnected', disconnectChatRooms);
 
-        _converse.api.listen.on('statusInitialized', () => {
+        api.listen.on('statusInitialized', () => {
             window.addEventListener(_converse.unloadevent, () => {
-                const using_websocket = _converse.api.connection.isType('websocket');
+                const using_websocket = api.connection.isType('websocket');
                 if (using_websocket &&
                         (!_converse.enable_smacks || !_converse.session.get('smacks_stream_id'))) {
                     // For non-SMACKS websocket connections, or non-resumeable
@@ -2601,22 +2602,22 @@ converse.plugins.add('converse-muc', {
         converse.env.muc_utils = muc_utils;
 
         // We extend the default converse.js API to add methods specific to MUC groupchats.
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * The "rooms" namespace groups methods relevant to chatrooms
              * (aka groupchats).
              *
-             * @namespace _converse.api.rooms
-             * @memberOf _converse.api
+             * @namespace api.rooms
+             * @memberOf api
              */
             rooms: {
                 /**
                  * Creates a new MUC chatroom (aka groupchat)
                  *
-                 * Similar to {@link _converse.api.rooms.open}, but creates
+                 * Similar to {@link api.rooms.open}, but creates
                  * the chatroom in the background (i.e. doesn't cause a view to open).
                  *
-                 * @method _converse.api.rooms.create
+                 * @method api.rooms.create
                  * @param {(string[]|string)} jid|jids The JID or array of
                  *     JIDs of the chatroom(s) to create
                  * @param {object} [attrs] attrs The room attributes
@@ -2624,7 +2625,7 @@ converse.plugins.add('converse-muc', {
                  */
                 create (jids, attrs={}) {
                     attrs = isString(attrs) ? {'nick': attrs} : (attrs || {});
-                    if (!attrs.nick && _converse.api.settings.get('muc_nickname_from_jid')) {
+                    if (!attrs.nick && api.settings.get('muc_nickname_from_jid')) {
                         attrs.nick = Strophe.getNodeFromJid(_converse.bare_jid);
                     }
                     if (jids === undefined) {
@@ -2638,9 +2639,9 @@ converse.plugins.add('converse-muc', {
                 /**
                  * Opens a MUC chatroom (aka groupchat)
                  *
-                 * Similar to {@link _converse.api.chats.open}, but for groupchats.
+                 * Similar to {@link api.chats.open}, but for groupchats.
                  *
-                 * @method _converse.api.rooms.open
+                 * @method api.rooms.open
                  * @param {string} jid The room JID or JIDs (if not specified, all
                  *     currently open rooms will be returned).
                  * @param {string} attrs A map  containing any extra room attributes.
@@ -2667,19 +2668,19 @@ converse.plugins.add('converse-muc', {
                  * @returns {Promise} Promise which resolves with the Model representing the chat.
                  *
                  * @example
-                 * this._converse.api.rooms.open('group@muc.example.com')
+                 * this.api.rooms.open('group@muc.example.com')
                  *
                  * @example
                  * // To return an array of rooms, provide an array of room JIDs:
-                 * _converse.api.rooms.open(['group1@muc.example.com', 'group2@muc.example.com'])
+                 * api.rooms.open(['group1@muc.example.com', 'group2@muc.example.com'])
                  *
                  * @example
                  * // To setup a custom nickname when joining the room, provide the optional nick argument:
-                 * _converse.api.rooms.open('group@muc.example.com', {'nick': 'mycustomnick'})
+                 * api.rooms.open('group@muc.example.com', {'nick': 'mycustomnick'})
                  *
                  * @example
                  * // For example, opening a room with a specific default configuration:
-                 * _converse.api.rooms.open(
+                 * api.rooms.open(
                  *     'myroom@conference.example.org',
                  *     { 'nick': 'coolguy69',
                  *       'auto_configure': true,
@@ -2695,17 +2696,17 @@ converse.plugins.add('converse-muc', {
                  * );
                  */
                 async open (jids, attrs, force=false) {
-                    await _converse.api.waitUntil('chatBoxesFetched');
+                    await api.waitUntil('chatBoxesFetched');
                     if (jids === undefined) {
                         const err_msg = 'rooms.open: You need to provide at least one JID';
                         log.error(err_msg);
                         throw(new TypeError(err_msg));
                     } else if (isString(jids)) {
-                        const room = await _converse.api.rooms.create(jids, attrs);
+                        const room = await api.rooms.create(jids, attrs);
                         room && room.maybeShow(force);
                         return room;
                     } else {
-                        const rooms = await Promise.all(jids.map(jid => _converse.api.rooms.create(jid, attrs)));
+                        const rooms = await Promise.all(jids.map(jid => api.rooms.create(jid, attrs)));
                         rooms.forEach(r => r.maybeShow(force));
                         return rooms;
                     }
@@ -2714,7 +2715,7 @@ converse.plugins.add('converse-muc', {
                 /**
                  * Fetches the object representing a MUC chatroom (aka groupchat)
                  *
-                 * @method _converse.api.rooms.get
+                 * @method api.rooms.get
                  * @param {string} [jid] The room JID (if not specified, all rooms will be returned).
                  * @param {object} attrs A map containing any extra room attributes For example, if you want
                  *     to specify the nickname, use `{'nick': 'bloodninja'}`. Previously (before
@@ -2726,9 +2727,9 @@ converse.plugins.add('converse-muc', {
                  *     if not found (default: `false`)
                  * @returns { Promise<_converse.ChatRoom> }
                  * @example
-                 * _converse.api.waitUntil('roomsAutoJoined').then(() => {
+                 * api.waitUntil('roomsAutoJoined').then(() => {
                  *     const create_if_not_found = true;
-                 *     _converse.api.rooms.get(
+                 *     api.rooms.get(
                  *         'group@muc.example.com',
                  *         {'nick': 'dread-pirate-roberts'},
                  *         create_if_not_found
@@ -2737,9 +2738,9 @@ converse.plugins.add('converse-muc', {
                  */
                 async get (jids, attrs={}, create=false) {
                     async function _get (jid) {
-                        let model = await _converse.api.chatboxes.get(jid);
+                        let model = await api.chatboxes.get(jid);
                         if (!model && create) {
-                            model = await _converse.api.chatboxes.create(jid, attrs, _converse.ChatRoom);
+                            model = await api.chatboxes.create(jid, attrs, _converse.ChatRoom);
                         } else {
                             model = (model && model.get('type') === _converse.CHATROOMS_TYPE) ? model : null;
                             if (model && Object.keys(attrs).length) {
@@ -2749,7 +2750,7 @@ converse.plugins.add('converse-muc', {
                         return model;
                     }
                     if (jids === undefined) {
-                        const chats = await _converse.api.chatboxes.get();
+                        const chats = await api.chatboxes.get();
                         return chats.filter(c => (c.get('type') === _converse.CHATROOMS_TYPE));
                     } else if (isString(jids)) {
                         return _get(jids);

+ 17 - 15
src/headless/converse-ping.js

@@ -22,9 +22,11 @@ converse.plugins.add('converse-ping', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
+
         let lastStanzaDate;
 
-        _converse.api.settings.update({
+        api.settings.update({
             ping_interval: 60 //in seconds
         });
 
@@ -39,14 +41,14 @@ converse.plugins.add('converse-ping', {
 
         function registerPongHandler () {
             if (_converse.connection.disco !== undefined) {
-                _converse.api.disco.own.features.add(Strophe.NS.PING);
+                api.disco.own.features.add(Strophe.NS.PING);
             }
             return _converse.connection.addHandler(pong, Strophe.NS.PING, "iq", "get");
         }
 
         function registerPingHandler () {
             _converse.connection.addHandler(() => {
-                if (_converse.api.settings.get('ping_interval') > 0) {
+                if (api.settings.get('ping_interval') > 0) {
                     // Handler on each stanza, saves the received date
                     // in order to ping only when needed.
                     lastStanzaDate = new Date();
@@ -56,13 +58,13 @@ converse.plugins.add('converse-ping', {
         }
 
         setTimeout(() => {
-            if (_converse.api.settings.get('ping_interval') > 0) {
+            if (api.settings.get('ping_interval') > 0) {
                 const now = new Date();
                 if (!lastStanzaDate) {
                     lastStanzaDate = now;
                 }
-                if ((now - lastStanzaDate)/1000 > _converse.api.settings.get('ping_interval')) {
-                    return _converse.api.ping();
+                if ((now - lastStanzaDate)/1000 > api.settings.get('ping_interval')) {
+                    return api.ping();
                 }
                 return true;
             }
@@ -75,25 +77,25 @@ converse.plugins.add('converse-ping', {
             registerPongHandler();
             registerPingHandler();
         };
-        _converse.api.listen.on('connected', onConnected);
-        _converse.api.listen.on('reconnected', onConnected);
+        api.listen.on('connected', onConnected);
+        api.listen.on('reconnected', onConnected);
 
 
         function onWindowStateChanged (data) {
-            if (data.state === 'visible' && _converse.api.connection.connected()) {
-                _converse.api.ping(null, 5000);
+            if (data.state === 'visible' && api.connection.connected()) {
+                api.ping(null, 5000);
             }
         }
-        _converse.api.listen.on('windowStateChanged', onWindowStateChanged);
+        api.listen.on('windowStateChanged', onWindowStateChanged);
         /************************ END Event Handlers ************************/
 
 
         /************************ BEGIN API ************************/
-        Object.assign(_converse.api, {
+        Object.assign(api, {
             /**
              * Pings the service represented by the passed in JID by sending an IQ stanza.
              * @private
-             * @method _converse.api.ping
+             * @method api.ping
              * @param { String } [jid] - The JID of the service to ping
              * @param { Integer } [timeout] - The amount of time in
              *  milliseconds to wait for a response. The default is 10000;
@@ -112,11 +114,11 @@ converse.plugins.add('converse-ping', {
                             'id': u.getUniqueId('ping')
                         }).c('ping', {'xmlns': Strophe.NS.PING});
 
-                    const result = await _converse.api.sendIQ(iq, timeout || 10000, false);
+                    const result = await api.sendIQ(iq, timeout || 10000, false);
                     if (result === null) {
                         log.warn(`Timeout while pinging ${jid}`);
                         if (jid === Strophe.getDomainFromJid(_converse.bare_jid)) {
-                            _converse.api.connection.reconnect();
+                            api.connection.reconnect();
                         }
                     } else if (u.isErrorStanza(result)) {
                         log.error(`Error while pinging ${jid}`);

+ 4 - 3
src/headless/converse-pubsub.js

@@ -21,6 +21,7 @@ converse.plugins.add('converse-pubsub', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
 
         /************************ BEGIN API ************************/
@@ -58,7 +59,7 @@ converse.plugins.add('converse-pubsub', {
 
                     if (options) {
                         jid = jid || _converse.bare_jid;
-                        if (await _converse.api.disco.supports(Strophe.NS.PUBSUB + '#publish-options', jid)) {
+                        if (await api.disco.supports(Strophe.NS.PUBSUB + '#publish-options', jid)) {
                             stanza.c('publish-options')
                                 .c('x', {'xmlns': Strophe.NS.XFORM, 'type': 'submit'})
                                     .c('field', {'var': 'FORM_TYPE', 'type': 'hidden'})
@@ -71,7 +72,7 @@ converse.plugins.add('converse-pubsub', {
                         }
                     }
                     try {
-                        _converse.api.sendIQ(stanza);
+                        api.sendIQ(stanza);
                     } catch (iq) {
                         if (iq instanceof Element &&
                                 strict_options &&
@@ -82,7 +83,7 @@ converse.plugins.add('converse-pubsub', {
                             const el = stanza.nodeTree;
                             el.querySelector('publish-options').outerHTML = '';
                             log.warn(`PubSub: Republishing without publish options. ${el.outerHTML}`);
-                            _converse.api.sendIQ(el);
+                            api.sendIQ(el);
                         } else {
                             throw iq;
                         }

+ 41 - 40
src/headless/converse-roster.js

@@ -22,16 +22,17 @@ converse.plugins.add('converse-roster', {
         /* The initialize function gets called as soon as the plugin is
          * loaded by converse.js's plugin machinery.
          */
-        const { _converse } = this,
-              { __ } = _converse;
+        const { _converse } = this;
+        const { api } = _converse;
+        const { __ } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             'allow_contact_requests': true,
             'auto_subscribe': false,
             'synchronize_availability': true,
         });
 
-        _converse.api.promises.add([
+        api.promises.add([
             'cachedRoster',
             'roster',
             'rosterContactsFetched',
@@ -73,7 +74,7 @@ converse.plugins.add('converse-roster', {
         _converse.rejectPresenceSubscription = function (jid, message) {
             const pres = $pres({to: jid, type: "unsubscribed"});
             if (message && message !== "") { pres.c("status").t(message); }
-            _converse.api.send(pres);
+            api.send(pres);
         };
 
 
@@ -107,9 +108,9 @@ converse.plugins.add('converse-roster', {
                  * @example _converse.api.listen.on('rosterGroupsFetched', () => { ... });
                  * @example _converse.api.waitUntil('rosterGroupsFetched').then(() => { ... });
                  */
-                _converse.api.trigger('rosterGroupsFetched');
+                api.trigger('rosterGroupsFetched');
                 await _converse.roster.fetchRosterContacts();
-                _converse.api.trigger('rosterContactsFetched');
+                api.trigger('rosterContactsFetched');
             } catch (reason) {
                 log.error(reason);
             } finally {
@@ -231,14 +232,14 @@ converse.plugins.add('converse-roster', {
                  * @type { _converse.RosterContact }
                  * @example _converse.api.listen.on('contactPresenceChanged', contact => { ... });
                  */
-                this.listenTo(this.presence, 'change:show', () => _converse.api.trigger('contactPresenceChanged', this));
+                this.listenTo(this.presence, 'change:show', () => api.trigger('contactPresenceChanged', this));
                 this.listenTo(this.presence, 'change:show', () => this.trigger('presenceChanged'));
                 /**
                  * Synchronous event which provides a hook for further initializing a RosterContact
                  * @event _converse#rosterContactInitialized
                  * @param { _converse.RosterContact } contact
                  */
-                await _converse.api.trigger('rosterContactInitialized', this, {'Synchronous': true});
+                await api.trigger('rosterContactInitialized', this, {'Synchronous': true});
                 this.initialized.resolve();
             },
 
@@ -277,7 +278,7 @@ converse.plugins.add('converse-roster', {
                 if (nick) {
                     pres.c('nick', {'xmlns': Strophe.NS.NICK}).t(nick).up();
                 }
-                _converse.api.send(pres);
+                api.send(pres);
                 this.save('ask', "subscribe"); // ask === 'subscribe' Means we have asked to subscribe to them.
                 return this;
             },
@@ -291,7 +292,7 @@ converse.plugins.add('converse-roster', {
              * @method _converse.RosterContacts#ackSubscribe
              */
             ackSubscribe () {
-                _converse.api.send($pres({
+                api.send($pres({
                     'type': 'subscribe',
                     'to': this.get('jid')
                 }));
@@ -308,7 +309,7 @@ converse.plugins.add('converse-roster', {
              * @param { String } jid - The Jabber ID of the user who is unsubscribing
              */
             ackUnsubscribe () {
-                _converse.api.send($pres({'type': 'unsubscribe', 'to': this.get('jid')}));
+                api.send($pres({'type': 'unsubscribe', 'to': this.get('jid')}));
                 this.removeFromRoster();
                 this.destroy();
             },
@@ -335,7 +336,7 @@ converse.plugins.add('converse-roster', {
                 if (message && message !== "") {
                     pres.c("status").t(message);
                 }
-                _converse.api.send(pres);
+                api.send(pres);
                 return this;
             },
 
@@ -349,7 +350,7 @@ converse.plugins.add('converse-roster', {
                 const iq = $iq({type: 'set'})
                     .c('query', {xmlns: Strophe.NS.ROSTER})
                     .c('item', {jid: this.get('jid'), subscription: "remove"});
-                return _converse.api.sendIQ(iq);
+                return api.sendIQ(iq);
             }
         });
 
@@ -441,7 +442,7 @@ converse.plugins.add('converse-roster', {
                      * @example _converse.api.listen.on('cachedRoster', (items) => { ... });
                      * @example _converse.api.waitUntil('cachedRoster').then(items => { ... });
                      */
-                    _converse.api.trigger('cachedRoster', result);
+                    api.trigger('cachedRoster', result);
                 } else {
                     _converse.send_initial_presence = true;
                     return _converse.roster.fetchFromServer();
@@ -498,7 +499,7 @@ converse.plugins.add('converse-roster', {
                     .c('query', {'xmlns': Strophe.NS.ROSTER})
                     .c('item', { jid, name });
                 groups.forEach(g => iq.c('group').t(g).up());
-                return _converse.api.sendIQ(iq);
+                return api.sendIQ(iq);
             },
 
             /**
@@ -513,7 +514,7 @@ converse.plugins.add('converse-roster', {
              * @param { Object } attributes - Any additional attributes to be stored on the user's model.
              */
             async addContactToRoster (jid, name, groups, attributes) {
-                await _converse.api.waitUntil('rosterContactsFetched');
+                await api.waitUntil('rosterContactsFetched');
                 groups = groups || [];
                 try {
                     await this.sendContactAddIQ(jid, name, groups);
@@ -573,7 +574,7 @@ converse.plugins.add('converse-roster', {
                     );
                     return;
                 }
-                _converse.api.send($iq({type: 'result', id, from: _converse.connection.jid}));
+                api.send($iq({type: 'result', id, from: _converse.connection.jid}));
 
                 const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop();
                 this.data.save('version', query.getAttribute('ver'));
@@ -595,12 +596,12 @@ converse.plugins.add('converse-roster', {
                  * @type { XMLElement }
                  * @example _converse.api.listen.on('rosterPush', iq => { ... });
                  */
-                _converse.api.trigger('rosterPush', iq);
+                api.trigger('rosterPush', iq);
                 return;
             },
 
             rosterVersioningSupported () {
-                return _converse.api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver') && this.data.get('version');
+                return api.disco.stream.getFeature('ver', 'urn:xmpp:features:rosterver') && this.data.get('version');
             },
 
             /**
@@ -617,7 +618,7 @@ converse.plugins.add('converse-roster', {
                 if (this.rosterVersioningSupported()) {
                     stanza.attrs({'ver': this.data.get('version')});
                 }
-                const iq = await _converse.api.sendIQ(stanza, null, false);
+                const iq = await api.sendIQ(stanza, null, false);
                 if (iq.getAttribute('type') !== 'error') {
                     const query = sizzle(`query[xmlns="${Strophe.NS.ROSTER}"]`, iq).pop();
                     if (query) {
@@ -641,7 +642,7 @@ converse.plugins.add('converse-roster', {
                  * @example _converse.api.listen.on('roster', iq => { ... });
                  * @example _converse.api.waitUntil('roster').then(iq => { ... });
                  */
-                _converse.api.trigger('roster', iq);
+                api.trigger('roster', iq);
             },
 
             /* Update or create RosterContact models based on the given `item` XML
@@ -701,7 +702,7 @@ converse.plugins.add('converse-roster', {
                  * @type { _converse.RosterContact }
                  * @example _converse.api.listen.on('contactRequest', contact => { ... });
                  */
-                _converse.api.trigger('contactRequest', this.create(user_data));
+                api.trigger('contactRequest', this.create(user_data));
             },
 
 
@@ -710,13 +711,13 @@ converse.plugins.add('converse-roster', {
                     bare_jid = Strophe.getBareJidFromJid(jid),
                     contact = this.get(bare_jid);
 
-                if (!_converse.api.settings.get('allow_contact_requests')) {
+                if (!api.settings.get('allow_contact_requests')) {
                     _converse.rejectPresenceSubscription(
                         jid,
                         __("This client does not allow presence subscriptions")
                     );
                 }
-                if (_converse.api.settings.get('auto_subscribe')) {
+                if (api.settings.get('auto_subscribe')) {
                     if ((!contact) || (contact.get('subscription') !== 'to')) {
                         this.subscribeBack(bare_jid, presence);
                     } else {
@@ -742,8 +743,8 @@ converse.plugins.add('converse-roster', {
 
                 if ((_converse.connection.jid !== jid) &&
                         (presence_type !== 'unavailable') &&
-                        (_converse.api.settings.get('synchronize_availability') === true ||
-                        _converse.api.settings.get('synchronize_availability') === resource)) {
+                        (api.settings.get('synchronize_availability') === true ||
+                         api.settings.get('synchronize_availability') === resource)) {
                     // Another resource has changed its status and
                     // synchronize_availability option set to update,
                     // we'll update ours as well.
@@ -889,7 +890,7 @@ converse.plugins.add('converse-roster', {
             }
         }
 
-        _converse.api.listen.on('chatBoxesInitialized', () => {
+        api.listen.on('chatBoxesInitialized', () => {
             _converse.chatboxes.on('change:num_unread', updateUnreadCounter);
 
             _converse.chatboxes.on('add', chatbox => {
@@ -899,9 +900,9 @@ converse.plugins.add('converse-roster', {
             });
         });
 
-        _converse.api.listen.on('beforeTearDown', () => _converse.unregisterPresenceHandler());
+        api.listen.on('beforeTearDown', () => _converse.unregisterPresenceHandler());
 
-        _converse.api.waitUntil('rosterContactsFetched').then(() => {
+        api.waitUntil('rosterContactsFetched').then(() => {
             _converse.roster.on('add', (contact) => {
                 /* When a new contact is added, check if we already have a
                  * chatbox open for it, and if so attach it to the chatbox.
@@ -917,9 +918,9 @@ converse.plugins.add('converse-roster', {
             _converse.presences && await _converse.presences.clearStore();
         }
 
-        _converse.api.listen.on('streamResumptionFailed', () => _converse.session.set('roster_cached', false));
+        api.listen.on('streamResumptionFailed', () => _converse.session.set('roster_cached', false));
 
-        _converse.api.listen.on('clearSession', async () => {
+        api.listen.on('clearSession', async () => {
             await clearPresences();
             if (_converse.shouldClearCache()) {
                 if (_converse.rostergroups) {
@@ -934,7 +935,7 @@ converse.plugins.add('converse-roster', {
             }
         });
 
-        _converse.api.listen.on('statusInitialized', async reconnecting => {
+        api.listen.on('statusInitialized', async reconnecting => {
             if (reconnecting) {
                 // When reconnecting and not resuming a previous session,
                 // we clear all cached presence data, since it might be stale
@@ -957,14 +958,14 @@ converse.plugins.add('converse-roster', {
              * @type { bool }
              * @example _converse.api.listen.on('presencesInitialized', reconnecting => { ... });
              */
-            _converse.api.trigger('presencesInitialized', reconnecting);
+            api.trigger('presencesInitialized', reconnecting);
         });
 
 
         async function initRoster () {
             // Initialize the Bakcbone collections that represent the contats
             // roster and the roster groups.
-            await _converse.api.waitUntil('VCardsInitialized');
+            await api.waitUntil('VCardsInitialized');
             _converse.roster = new _converse.RosterContacts();
             let id = `converse.contacts-${_converse.bare_jid}`;
             _converse.roster.browserStorage = _converse.createStore(id);
@@ -986,10 +987,10 @@ converse.plugins.add('converse-roster', {
              * @example _converse.api.listen.on('rosterInitialized', () => { ... });
              * @example _converse.api.waitUntil('rosterInitialized').then(() => { ... });
              */
-            _converse.api.trigger('rosterInitialized');
+            api.trigger('rosterInitialized');
         }
 
-        _converse.api.listen.on('presencesInitialized', async (reconnecting) => {
+        api.listen.on('presencesInitialized', async (reconnecting) => {
             if (reconnecting) {
                 /**
                  * Similar to `rosterInitialized`, but instead pertaining to reconnection.
@@ -998,7 +999,7 @@ converse.plugins.add('converse-roster', {
                  * @event _converse#rosterReadyAfterReconnection
                  * @example _converse.api.listen.on('rosterReadyAfterReconnection', () => { ... });
                  */
-                _converse.api.trigger('rosterReadyAfterReconnection');
+                api.trigger('rosterReadyAfterReconnection');
             } else {
                 await initRoster();
             }
@@ -1050,7 +1051,7 @@ converse.plugins.add('converse-roster', {
                  * });
                  */
                 async get (jids) {
-                    await _converse.api.waitUntil('rosterContactsFetched');
+                    await api.waitUntil('rosterContactsFetched');
                     const _getter = jid => _converse.roster.get(Strophe.getBareJidFromJid(jid));
                     if (jids === undefined) {
                         jids = _converse.roster.pluck('jid');
@@ -1073,7 +1074,7 @@ converse.plugins.add('converse-roster', {
                  *     _converse.api.contacts.add('buddy@example.com', 'Buddy')
                  */
                 async add (jid, name) {
-                    await _converse.api.waitUntil('rosterContactsFetched');
+                    await api.waitUntil('rosterContactsFetched');
                     if (!isString(jid) || !jid.includes('@')) {
                         throw new TypeError('contacts.add: invalid jid');
                     }

+ 18 - 17
src/headless/converse-smacks.js

@@ -18,21 +18,22 @@ converse.plugins.add('converse-smacks', {
 
     initialize () {
         const { _converse } = this;
+        const { api } = _converse;
 
         // Configuration values for this plugin
         // ====================================
         // Refer to docs/source/configuration.rst for explanations of these
         // configuration settings.
-        _converse.api.settings.update({
+        api.settings.update({
             'enable_smacks': true,
             'smacks_max_unacked_stanzas': 5,
         });
 
         function isStreamManagementSupported () {
-            if (_converse.api.connection.isType('bosh') && !_converse.isTestEnv()) {
+            if (api.connection.isType('bosh') && !_converse.isTestEnv()) {
                 return false;
             }
-            return _converse.api.disco.stream.getFeature('sm', Strophe.NS.SM);
+            return api.disco.stream.getFeature('sm', Strophe.NS.SM);
         }
 
         function handleAck (el) {
@@ -69,7 +70,7 @@ converse.plugins.add('converse-smacks', {
             if (_converse.session.get('smacks_enabled')) {
                 const h = _converse.session.get('num_stanzas_handled');
                 const stanza = u.toStanza(`<a xmlns="${Strophe.NS.SM}" h="${h}"/>`);
-                _converse.api.send(stanza);
+                api.send(stanza);
             }
             return true;
         }
@@ -132,7 +133,7 @@ converse.plugins.add('converse-smacks', {
              * Triggered when the XEP-0198 stream could not be resumed.
              * @event _converse#streamResumptionFailed
              */
-             _converse.api.trigger('streamResumptionFailed');
+             api.trigger('streamResumptionFailed');
             return true;
         }
 
@@ -158,7 +159,7 @@ converse.plugins.add('converse-smacks', {
             // service worker or handling IQ[type="result"] stanzas
             // differently, more like push stanzas, so that they don't need
             // explicit handlers.
-            stanzas.forEach(s => _converse.api.send(s));
+            stanzas.forEach(s => api.send(s));
         }
 
         function onResumedStanza (el) {
@@ -179,13 +180,13 @@ converse.plugins.add('converse-smacks', {
             const previous_id = _converse.session.get('smacks_stream_id');
             const h = _converse.session.get('num_stanzas_handled');
             const stanza = u.toStanza(`<resume xmlns="${Strophe.NS.SM}" h="${h}" previd="${previous_id}"/>`);
-            _converse.api.send(stanza);
+            api.send(stanza);
             _converse.connection.flush();
             await promise;
         }
 
         async function sendEnableStanza () {
-            if (!_converse.api.settings.get('enable_smacks') || _converse.session.get('smacks_enabled')) {
+            if (!api.settings.get('enable_smacks') || _converse.session.get('smacks_enabled')) {
                 return;
             }
             if (await isStreamManagementSupported()) {
@@ -193,16 +194,16 @@ converse.plugins.add('converse-smacks', {
                 _converse.connection._addSysHandler(el => promise.resolve(saveSessionData(el)), Strophe.NS.SM, 'enabled');
                 _converse.connection._addSysHandler(el => promise.resolve(onFailedStanza(el)), Strophe.NS.SM, 'failed');
 
-                const resume = (_converse.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}"/>`);
-                _converse.api.send(stanza);
+                api.send(stanza);
                 _converse.connection.flush();
                 await promise;
             }
         }
 
         async function enableStreamManagement () {
-            if (!_converse.api.settings.get('enable_smacks')) {
+            if (!api.settings.get('enable_smacks')) {
                 return;
             }
             if (!(await isStreamManagementSupported())) {
@@ -235,21 +236,21 @@ converse.plugins.add('converse-smacks', {
                     'unacked_stanzas',
                     (_converse.session.get('unacked_stanzas') || []).concat([stanza_string])
                 );
-                const max_unacked = _converse.api.settings.get('smacks_max_unacked_stanzas');
+                const max_unacked = api.settings.get('smacks_max_unacked_stanzas');
                 if (max_unacked > 0) {
                     const num = _converse.session.get('num_stanzas_since_last_ack') + 1;
                     if (num % max_unacked === 0) {
                         // Request confirmation of sent stanzas
-                        _converse.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.api.listen.on('userSessionInitialized', initSessionData);
-        _converse.api.listen.on('beforeResourceBinding', enableStreamManagement);
-        _converse.api.listen.on('afterResourceBinding', sendEnableStanza);
-        _converse.api.listen.on('send', onStanzaSent);
+        api.listen.on('userSessionInitialized', initSessionData);
+        api.listen.on('beforeResourceBinding', enableStreamManagement);
+        api.listen.on('afterResourceBinding', sendEnableStanza);
+        api.listen.on('send', onStanzaSent);
     }
 });

+ 25 - 24
src/headless/converse-status.js

@@ -14,8 +14,9 @@ converse.plugins.add('converse-status', {
 
     initialize () {
         const { _converse } = this;
+        const { api } = _converse;
 
-        _converse.api.settings.update({
+        api.settings.update({
             auto_away: 0, // Seconds after which user status is set to 'away'
             auto_xa: 0, // Seconds after which user status is set to 'xa'
             csi_waiting_time: 0, // Support for XEP-0352. Seconds before client is considered idle and CSI is sent out.
@@ -25,7 +26,7 @@ converse.plugins.add('converse-status', {
 
         _converse.XMPPStatus = Model.extend({
             defaults () {
-                return {"status":  _converse.api.settings.get("default_state")}
+                return {"status":  api.settings.get("default_state")}
             },
 
             initialize () {
@@ -50,7 +51,7 @@ converse.plugins.add('converse-status', {
 
             constructPresence (type, status_message) {
                 let presence;
-                type = isString(type) ? type : (this.get('status') || _converse.api.settings.get("default_state"));
+                type = isString(type) ? type : (this.get('status') || api.settings.get("default_state"));
                 status_message = isString(status_message) ? status_message : this.get('status_message');
                 // Most of these presence types are actually not explicitly sent,
                 // but I add all of them here for reference and future proofing.
@@ -73,7 +74,7 @@ converse.plugins.add('converse-status', {
                     presence.c('status').t(status_message).up();
                 }
 
-                const priority = _converse.api.settings.get("priority");
+                const priority = api.settings.get("priority");
                 presence.c('priority').t(isNaN(Number(priority)) ? 0 : priority).up();
                 if (_converse.idle) {
                     const idle_since = new Date();
@@ -84,7 +85,7 @@ converse.plugins.add('converse-status', {
             },
 
             sendPresence (type, status_message) {
-                _converse.api.send(this.constructPresence(type, status_message));
+                api.send(this.constructPresence(type, status_message));
             }
         });
 
@@ -97,7 +98,7 @@ converse.plugins.add('converse-status', {
          * @param { String } stat - The user's chat status
          */
         _converse.sendCSI = function (stat) {
-            _converse.api.send($build(stat, {xmlns: Strophe.NS.CSI}));
+            api.send($build(stat, {xmlns: Strophe.NS.CSI}));
             _converse.inactive = (stat === _converse.INACTIVE) ? true : false;
         };
 
@@ -123,7 +124,7 @@ converse.plugins.add('converse-status', {
                 _converse.auto_changed_status = false;
                 // XXX: we should really remember the original state here, and
                 // then set it back to that...
-                _converse.xmppstatus.set('status', _converse.api.settings.get("default_state"));
+                _converse.xmppstatus.set('status', api.settings.get("default_state"));
             }
         };
 
@@ -138,24 +139,24 @@ converse.plugins.add('converse-status', {
             }
             const stat = _converse.xmppstatus.get('status');
             _converse.idle_seconds++;
-            if (_converse.api.settings.get("csi_waiting_time") > 0 &&
-                    _converse.idle_seconds > _converse.api.settings.get("csi_waiting_time") &&
+            if (api.settings.get("csi_waiting_time") > 0 &&
+                    _converse.idle_seconds > api.settings.get("csi_waiting_time") &&
                     !_converse.inactive) {
                 _converse.sendCSI(_converse.INACTIVE);
             }
-            if (_converse.api.settings.get("idle_presence_timeout") > 0 &&
-                    _converse.idle_seconds > _converse.api.settings.get("idle_presence_timeout") &&
+            if (api.settings.get("idle_presence_timeout") > 0 &&
+                    _converse.idle_seconds > api.settings.get("idle_presence_timeout") &&
                     !_converse.idle) {
                 _converse.idle = true;
                 _converse.xmppstatus.sendPresence();
             }
-            if (_converse.api.settings.get("auto_away") > 0 &&
-                    _converse.idle_seconds > _converse.api.settings.get("auto_away") &&
+            if (api.settings.get("auto_away") > 0 &&
+                    _converse.idle_seconds > api.settings.get("auto_away") &&
                     stat !== 'away' && stat !== 'xa' && stat !== 'dnd') {
                 _converse.auto_changed_status = true;
                 _converse.xmppstatus.set('status', 'away');
-            } else if (_converse.api.settings.get("auto_xa") > 0 &&
-                    _converse.idle_seconds > _converse.api.settings.get("auto_xa") &&
+            } else if (api.settings.get("auto_xa") > 0 &&
+                    _converse.idle_seconds > api.settings.get("auto_xa") &&
                     stat !== 'xa' && stat !== 'dnd') {
                 _converse.auto_changed_status = true;
                 _converse.xmppstatus.set('status', 'xa');
@@ -167,10 +168,10 @@ converse.plugins.add('converse-status', {
              * Required for the auto_away, auto_xa and csi_waiting_time features.
              */
             if (
-                _converse.api.settings.get("auto_away") < 1 &&
-                _converse.api.settings.get("auto_xa") < 1 &&
-                _converse.api.settings.get("csi_waiting_time") < 1 &&
-                _converse.api.settings.get("idle_presence_timeout") < 1
+                api.settings.get("auto_away") < 1 &&
+                api.settings.get("auto_xa") < 1 &&
+                api.settings.get("csi_waiting_time") < 1 &&
+                api.settings.get("idle_presence_timeout") < 1
             ) {
                 // Waiting time of less then one second means features aren't used.
                 return;
@@ -192,7 +193,7 @@ converse.plugins.add('converse-status', {
         };
 
 
-        _converse.api.listen.on('presencesInitialized', (reconnecting) => {
+        api.listen.on('presencesInitialized', (reconnecting) => {
             if (!reconnecting) {
                 _converse.registerIntervalHandler();
             }
@@ -206,7 +207,7 @@ converse.plugins.add('converse-status', {
              * @example _converse.api.listen.on('statusInitialized', status => { ... });
              * @example _converse.api.waitUntil('statusInitialized').then(() => { ... });
              */
-            _converse.api.trigger('statusInitialized', reconnecting);
+            api.trigger('statusInitialized', reconnecting);
         }
 
 
@@ -230,15 +231,15 @@ converse.plugins.add('converse-status', {
 
 
         /************************ BEGIN Event Handlers ************************/
-        _converse.api.listen.on('clearSession', () => {
+        api.listen.on('clearSession', () => {
             if (_converse.shouldClearCache() && _converse.xmppstatus) {
                 _converse.xmppstatus.destroy();
                 delete _converse.xmppstatus;
             }
         });
 
-        _converse.api.listen.on('connected', () => initStatus(false));
-        _converse.api.listen.on('reconnected', () => initStatus(true));
+        api.listen.on('connected', () => initStatus(false));
+        api.listen.on('reconnected', () => initStatus(true));
         /************************ END Event Handlers ************************/
 
 

+ 17 - 16
src/headless/converse-vcard.js

@@ -65,8 +65,9 @@ converse.plugins.add('converse-vcard', {
          * loaded by converse.js's plugin machinery.
          */
         const { _converse } = this;
+        const { api } = _converse;
 
-        _converse.api.promises.add('VCardsInitialized');
+        api.promises.add('VCardsInitialized');
 
 
         _converse.VCard = Model.extend({
@@ -105,7 +106,7 @@ converse.plugins.add('converse-vcard', {
 
             initialize () {
                 this.on('add', vcard => {
-                    _converse.api.vcard.update(vcard);
+                    api.vcard.update(vcard);
                 });
             }
         });
@@ -152,7 +153,7 @@ converse.plugins.add('converse-vcard', {
             const to = Strophe.getBareJidFromJid(jid) === _converse.bare_jid ? null : jid;
             let iq;
             try {
-                iq = await _converse.api.sendIQ(createStanza("get", to))
+                iq = await api.sendIQ(createStanza("get", to))
             } catch (iq) {
                 return {
                     'stanza': iq,
@@ -174,7 +175,7 @@ converse.plugins.add('converse-vcard', {
             } else {
                 jid = model.get('jid');
             }
-            await _converse.api.waitUntil('VCardsInitialized');
+            await api.waitUntil('VCardsInitialized');
             model.vcard = _converse.vcards.findWhere({'jid': jid});
             if (!model.vcard) {
                 model.vcard = _converse.vcards.create({'jid': jid});
@@ -202,7 +203,7 @@ converse.plugins.add('converse-vcard', {
 
 
         async function setVCardOnMUCMessage (message) {
-            await _converse.api.waitUntil('VCardsInitialized');
+            await api.waitUntil('VCardsInitialized');
             if (['error', 'info'].includes(message.get('type'))) {
                 return;
             } else {
@@ -229,13 +230,13 @@ converse.plugins.add('converse-vcard', {
              * Triggered as soon as the `_converse.vcards` collection has been initialized and populated from cache.
              * @event _converse#VCardsInitialized
              */
-            _converse.api.trigger('VCardsInitialized');
+            api.trigger('VCardsInitialized');
         }
 
 
         function clearVCardsSession () {
             if (_converse.shouldClearCache()) {
-                _converse.api.promises.add('VCardsInitialized');
+                api.promises.add('VCardsInitialized');
                 if (_converse.vcards) {
                     _converse.vcards.clearStore();
                     delete _converse.vcards;
@@ -246,14 +247,14 @@ converse.plugins.add('converse-vcard', {
 
         /************************ BEGIN Event Handlers ************************/
 
-        _converse.api.listen.on('chatBoxInitialized', m => setVCardOnModel(m));
-        _converse.api.listen.on('chatRoomInitialized', m => setVCardOnModel(m));
-        _converse.api.listen.on('chatRoomMessageInitialized', m => setVCardOnMUCMessage(m));
-        _converse.api.listen.on('addClientFeatures', () => _converse.api.disco.own.features.add(Strophe.NS.VCARD));
-        _converse.api.listen.on('clearSession', () => clearVCardsSession());
-        _converse.api.listen.on('messageInitialized', m => setVCardOnModel(m));
-        _converse.api.listen.on('rosterContactInitialized', m => setVCardOnModel(m));
-        _converse.api.listen.on('statusInitialized', _converse.initVCardCollection);
+        api.listen.on('chatBoxInitialized', m => setVCardOnModel(m));
+        api.listen.on('chatRoomInitialized', m => setVCardOnModel(m));
+        api.listen.on('chatRoomMessageInitialized', m => setVCardOnMUCMessage(m));
+        api.listen.on('addClientFeatures', () => api.disco.own.features.add(Strophe.NS.VCARD));
+        api.listen.on('clearSession', () => clearVCardsSession());
+        api.listen.on('messageInitialized', m => setVCardOnModel(m));
+        api.listen.on('rosterContactInitialized', m => setVCardOnModel(m));
+        api.listen.on('statusInitialized', _converse.initVCardCollection);
 
 
         /************************ BEGIN API ************************/
@@ -289,7 +290,7 @@ converse.plugins.add('converse-vcard', {
                         throw Error("No jid provided for the VCard data");
                     }
                     const vcard_el = Strophe.xmlHtmlNode(tpl_vcard(data)).firstElementChild;
-                    return _converse.api.sendIQ(createStanza("set", jid, vcard_el));
+                    return api.sendIQ(createStanza("set", jid, vcard_el));
                 },
 
                 /**