diff --git a/spec/mock.js b/spec/mock.js index eac516030..5e30a788d 100644 --- a/spec/mock.js +++ b/spec/mock.js @@ -590,7 +590,7 @@ window.addEventListener('converse-loaded', () => { }; function clearIndexedDB () { - const promise = u.getResolveablePromise(); + const promise = u.getOpenPromise(); const db_request = window.indexedDB.open("converse-test-persistent"); db_request.onsuccess = function () { const db = db_request.result; diff --git a/src/headless/core.js b/src/headless/core.js index 8199a1ded..d0542fbfb 100644 --- a/src/headless/core.js +++ b/src/headless/core.js @@ -35,6 +35,7 @@ import { Model } from '@converse/skeletor/src/model.js'; import { Strophe, $build, $iq, $msg, $pres } from 'strophe.js/src/strophe'; import { TimeoutError } from '@converse/headless/shared/errors'; import { createStore, replacePromise } from '@converse/headless/shared/utils'; +import { getOpenPromise } from '@converse/openpromise'; import { html } from 'lit-element'; import { sprintf } from 'sprintf-js'; @@ -355,7 +356,7 @@ export const api = _converse.api = { */ await api.trigger('beforeLogout', {'synchronous': true}); - const promise = u.getResolveablePromise(); + const promise = getOpenPromise(); const complete = () => { // Recreate all the promises Object.keys(_converse.promises).forEach(replacePromise); @@ -563,7 +564,7 @@ export const api = _converse.api = { add (promises, replace=true) { promises = Array.isArray(promises) ? promises : [promises]; promises.forEach(name => { - const promise = u.getResolveablePromise(); + const promise = getOpenPromise(); promise.replace = replace; _converse.promises[name] = promise; }); diff --git a/src/headless/plugins/bookmarks/collection.js b/src/headless/plugins/bookmarks/collection.js index b4eb7e7cf..73fce81a5 100644 --- a/src/headless/plugins/bookmarks/collection.js +++ b/src/headless/plugins/bookmarks/collection.js @@ -3,6 +3,7 @@ import Bookmark from './model.js'; import log from "@converse/headless/log.js"; import { __ } from 'i18n'; import { _converse, api, converse } from "@converse/headless/core"; +import { getOpenPromise } from '@converse/openpromise'; import { initStorage } from '@converse/headless/shared/utils.js'; const { Strophe, $iq, sizzle } = converse.env; @@ -40,7 +41,7 @@ const Bookmarks = { }, fetchBookmarks () { - const deferred = u.getResolveablePromise(); + const deferred = getOpenPromise(); if (window.sessionStorage.getItem(this.fetched_flag)) { this.fetch({ 'success': () => deferred.resolve(), diff --git a/src/headless/plugins/chat/message.js b/src/headless/plugins/chat/message.js index bbd742a03..f805bc9e2 100644 --- a/src/headless/plugins/chat/message.js +++ b/src/headless/plugins/chat/message.js @@ -1,6 +1,7 @@ import ModelWithContact from './model-with-contact.js'; import log from '../../log.js'; import { _converse, api, converse } from '../../core.js'; +import { getOpenPromise } from '@converse/openpromise'; const u = converse.env.utils; const { Strophe } = converse.env; @@ -26,7 +27,7 @@ const MessageMixin = { if (!this.checkValidity()) { return; } - this.initialized = u.getResolveablePromise(); + this.initialized = getOpenPromise(); if (this.get('type') === 'chat') { ModelWithContact.prototype.initialize.apply(this, arguments); this.setRosterContact(Strophe.getBareJidFromJid(this.get('from'))); diff --git a/src/headless/plugins/chat/model-with-contact.js b/src/headless/plugins/chat/model-with-contact.js index 24869e13c..67f83a2e6 100644 --- a/src/headless/plugins/chat/model-with-contact.js +++ b/src/headless/plugins/chat/model-with-contact.js @@ -1,13 +1,11 @@ -import { api, converse } from "../../core.js"; import { Model } from '@converse/skeletor/src/model.js'; - -const u = converse.env.utils; - +import { api } from "../../core.js"; +import { getOpenPromise } from '@converse/openpromise'; const ModelWithContact = Model.extend({ initialize () { - this.rosterContactAdded = u.getResolveablePromise(); + this.rosterContactAdded = getOpenPromise(); }, async setRosterContact (jid) { diff --git a/src/headless/plugins/chat/model.js b/src/headless/plugins/chat/model.js index 54edeed2b..dcbddc231 100644 --- a/src/headless/plugins/chat/model.js +++ b/src/headless/plugins/chat/model.js @@ -6,6 +6,7 @@ import log from '@converse/headless/log'; import pick from "lodash/pick"; import { Model } from '@converse/skeletor/src/model.js'; import { _converse, api, converse } from "../../core.js"; +import { getOpenPromise } from '@converse/openpromise'; import { initStorage } from '@converse/headless/shared/utils.js'; import { parseMessage } from './parsers.js'; import { sendMarker } from '@converse/headless/shared/actions'; @@ -39,7 +40,7 @@ const ChatBox = ModelWithContact.extend({ }, async initialize () { - this.initialized = u.getResolveablePromise(); + this.initialized = getOpenPromise(); ModelWithContact.prototype.initialize.apply(this, arguments); const jid = this.get('jid'); @@ -84,7 +85,7 @@ const ChatBox = ModelWithContact.extend({ initMessages () { this.messages = this.getMessagesCollection(); - this.messages.fetched = u.getResolveablePromise(); + this.messages.fetched = getOpenPromise(); this.messages.fetched.then(() => { /** * Triggered whenever a `_converse.ChatBox` instance has fetched its messages from @@ -244,7 +245,7 @@ const ChatBox = ModelWithContact.extend({ } finally { delete this.msg_chain; delete this.messages.fetched_flag; - this.messages.fetched = u.getResolveablePromise(); + this.messages.fetched = getOpenPromise(); } }, diff --git a/src/headless/plugins/disco/api.js b/src/headless/plugins/disco/api.js index 11d1ca66b..255a24fad 100644 --- a/src/headless/plugins/disco/api.js +++ b/src/headless/plugins/disco/api.js @@ -1,8 +1,9 @@ -import { _converse, api, converse } from "@converse/headless/core.js"; import isObject from "lodash-es/isObject"; import log from "@converse/headless/log.js"; +import { _converse, api, converse } from "@converse/headless/core.js"; +import { getOpenPromise } from '@converse/openpromise'; -const { Strophe, $iq, utils } = converse.env; +const { Strophe, $iq } = converse.env; export default { @@ -310,7 +311,7 @@ export default { entity.fields.reset(); entity.identities.reset(); if (!entity.waitUntilFeaturesDiscovered.isPending) { - entity.waitUntilFeaturesDiscovered = utils.getResolveablePromise() + entity.waitUntilFeaturesDiscovered = getOpenPromise() } entity.queryInfo(); } else { diff --git a/src/headless/plugins/disco/entity.js b/src/headless/plugins/disco/entity.js index e34c98af9..1c92292eb 100644 --- a/src/headless/plugins/disco/entity.js +++ b/src/headless/plugins/disco/entity.js @@ -3,8 +3,9 @@ import sizzle from "sizzle"; import { Collection } from "@converse/skeletor/src/collection"; import { Model } from '@converse/skeletor/src/model.js'; import { _converse, api, converse } from "@converse/headless/core.js"; +import { getOpenPromise } from '@converse/openpromise'; -const { Strophe, utils } = converse.env; +const { Strophe } = converse.env; /** * @class @@ -19,7 +20,7 @@ const DiscoEntity = Model.extend({ idAttribute: 'jid', initialize (attrs, options) { - this.waitUntilFeaturesDiscovered = utils.getResolveablePromise(); + this.waitUntilFeaturesDiscovered = getOpenPromise(); this.dataforms = new Collection(); let id = `converse.dataforms-${this.get('jid')}`; diff --git a/src/headless/plugins/emoji/index.js b/src/headless/plugins/emoji/index.js index f81b11d79..3a3ed1153 100644 --- a/src/headless/plugins/emoji/index.js +++ b/src/headless/plugins/emoji/index.js @@ -6,13 +6,14 @@ import { ASCII_REPLACE_REGEX, CODEPOINTS_REGEX } from './regexes.js'; import { Model } from '@converse/skeletor/src/model.js'; import { _converse, api, converse } from "../../core.js"; +import { getOpenPromise } from '@converse/openpromise'; import { html } from 'lit-html'; const u = converse.env.utils; converse.emojis = { 'initialized': false, - 'initialized_promise': u.getResolveablePromise() + 'initialized_promise': getOpenPromise() }; diff --git a/src/headless/plugins/muc/muc.js b/src/headless/plugins/muc/muc.js index 334aaaad7..3f5995b1b 100644 --- a/src/headless/plugins/muc/muc.js +++ b/src/headless/plugins/muc/muc.js @@ -11,6 +11,7 @@ import { Model } from '@converse/skeletor/src/model.js'; import { Strophe, $build, $iq, $msg, $pres } from 'strophe.js/src/strophe'; import { _converse, api, converse } from '../../core.js'; import { computeAffiliationsDelta, setAffiliations, getAffiliationList } from './affiliations/utils.js'; +import { getOpenPromise } from '@converse/openpromise'; import { initStorage } from '@converse/headless/shared/utils.js'; import { isArchived } from '@converse/headless/shared/parsers'; import { parseMUCMessage, parseMUCPresence } from './parsers.js'; @@ -84,7 +85,7 @@ const ChatRoomMixin = { }, async initialize () { - this.initialized = u.getResolveablePromise(); + this.initialized = getOpenPromise(); this.debouncedRejoin = debounce(this.rejoin, 250); this.set('box_id', `box-${this.get('jid')}`); this.initNotifications(); @@ -674,7 +675,7 @@ const ChatRoomMixin = { id = this.getUniqueId('sendIQ'); el.setAttribute('id', id); } - const promise = u.getResolveablePromise(); + const promise = getOpenPromise(); const timeoutHandler = _converse.connection.addTimedHandler(_converse.STANZA_TIMEOUT, () => { _converse.connection.deleteHandler(handler); promise.reject(new _converse.TimeoutError('Timeout Error: No response from server')); diff --git a/src/headless/plugins/roster/contact.js b/src/headless/plugins/roster/contact.js index b5018110f..5faedc55a 100644 --- a/src/headless/plugins/roster/contact.js +++ b/src/headless/plugins/roster/contact.js @@ -1,7 +1,8 @@ -import { _converse, api, converse } from "@converse/headless/core"; import { Model } from '@converse/skeletor/src/model.js'; +import { _converse, api, converse } from "@converse/headless/core"; +import { getOpenPromise } from '@converse/openpromise'; -const { Strophe, $iq, $pres, u } = converse.env; +const { Strophe, $iq, $pres } = converse.env; /** * @class @@ -17,7 +18,7 @@ const RosterContact = Model.extend({ }, async initialize (attributes) { - this.initialized = u.getResolveablePromise(); + this.initialized = getOpenPromise(); this.setPresence(); const { jid } = attributes; const bare_jid = Strophe.getBareJidFromJid(jid).toLowerCase(); diff --git a/src/headless/plugins/smacks.js b/src/headless/plugins/smacks.js index 1b5e5f821..a33105e3c 100644 --- a/src/headless/plugins/smacks.js +++ b/src/headless/plugins/smacks.js @@ -1,11 +1,11 @@ /** - * @module converse-smacks * @copyright The Converse.js contributors * @license Mozilla Public License (MPLv2) * @description Converse.js plugin which adds support for XEP-0198: Stream Management */ -import { _converse, api, converse } from "../core.js"; import log from "../log.js"; +import { _converse, api, converse } from "../core.js"; +import { getOpenPromise } from '@converse/openpromise'; const { Strophe } = converse.env; const u = converse.env.utils; @@ -158,7 +158,7 @@ function onResumedStanza (el) { } async function sendResumeStanza () { - const promise = u.getResolveablePromise(); + const promise = getOpenPromise(); _converse.connection._addSysHandler(el => promise.resolve(onResumedStanza(el)), Strophe.NS.SM, 'resumed'); _converse.connection._addSysHandler(el => promise.resolve(onFailedStanza(el)), Strophe.NS.SM, 'failed'); @@ -175,7 +175,7 @@ async function sendEnableStanza () { return; } if (await isStreamManagementSupported()) { - const promise = u.getResolveablePromise(); + const promise = getOpenPromise(); _converse.connection._addSysHandler(el => promise.resolve(saveSessionData(el)), Strophe.NS.SM, 'enabled'); _converse.connection._addSysHandler(el => promise.resolve(onFailedStanza(el)), Strophe.NS.SM, 'failed'); diff --git a/src/headless/shared/_converse.js b/src/headless/shared/_converse.js index 70fa32327..23df11932 100644 --- a/src/headless/shared/_converse.js +++ b/src/headless/shared/_converse.js @@ -1,11 +1,11 @@ import i18n from '@converse/headless/shared/i18n'; import log from '@converse/headless/log'; -import u from '@converse/headless/utils/core'; import { CONNECTION_STATUS } from '@converse/headless/shared/constants'; import { Router } from '@converse/skeletor/src/router.js'; import { TimeoutError } from '@converse/headless/shared/errors'; import { createStore, getDefaultStore } from '@converse/headless/shared/utils.js'; import { getInitSettings } from '@converse/headless/shared/settings'; +import { getOpenPromise } from '@converse/openpromise'; /** @@ -19,7 +19,7 @@ const _converse = { CONNECTION_STATUS, templates: {}, promises: { - 'initialized': u.getResolveablePromise() + 'initialized': getOpenPromise() }, STATUS_WEIGHTS: { diff --git a/src/headless/shared/connection.js b/src/headless/shared/connection.js index 3ea7e8e74..d1c36790b 100644 --- a/src/headless/shared/connection.js +++ b/src/headless/shared/connection.js @@ -2,9 +2,9 @@ import debounce from 'lodash/debounce'; import isElement from 'lodash/isElement'; import log from "../log.js"; import sizzle from 'sizzle'; -import u from '@converse/headless/utils/core'; import { Strophe } from 'strophe.js/src/core'; import { _converse, api, clearSession, tearDown } from "../core.js"; +import { getOpenPromise } from '@converse/openpromise'; const BOSH_WAIT = 59; @@ -331,7 +331,7 @@ export class Connection extends Strophe.Connection { restoreWorkerSession () { this.attach(this.onConnectStatusChanged); - this.worker_attach_promise = u.getResolveablePromise(); + this.worker_attach_promise = getOpenPromise(); return this.worker_attach_promise; } } diff --git a/src/headless/shared/utils.js b/src/headless/shared/utils.js index 1df518521..7ab253ed6 100644 --- a/src/headless/shared/utils.js +++ b/src/headless/shared/utils.js @@ -1,7 +1,7 @@ import Storage from '@converse/skeletor/src/storage.js'; import log from '@converse/headless/log'; -import u from '@converse/headless/utils/core'; import { _converse, api } from '@converse/headless/core'; +import { getOpenPromise } from '@converse/openpromise'; export function getDefaultStore () { if (_converse.config.get('trusted')) { @@ -38,7 +38,7 @@ export function replacePromise (name) { throw new Error(`Tried to replace non-existing promise: ${name}`); } if (existing_promise.replace) { - const promise = u.getResolveablePromise(); + const promise = getOpenPromise(); promise.replace = existing_promise.replace; _converse.promises[name] = promise; } else { diff --git a/src/headless/utils/core.js b/src/headless/utils/core.js index 45885ce3b..f000220a5 100644 --- a/src/headless/utils/core.js +++ b/src/headless/utils/core.js @@ -11,6 +11,7 @@ import log from "@converse/headless/log"; import sizzle from "sizzle"; import { Model } from '@converse/skeletor/src/model.js'; import { Strophe } from 'strophe.js/src/strophe'; +import { getOpenPromise } from '@converse/openpromise'; /** * The utils object @@ -328,38 +329,8 @@ u.isPersistableModel = function (model) { return model.collection && model.collection.browserStorage; }; -/** - * Returns a promise object on which `resolve` or `reject` can be called. - * @private - * @method u#getResolveablePromise - */ -u.getResolveablePromise = function () { - const wrapper = { - isResolved: false, - isPending: true, - isRejected: false - }; - const promise = new Promise((resolve, reject) => { - wrapper.resolve = resolve; - wrapper.reject = reject; - }) - Object.assign(promise, wrapper); - promise.then( - function (v) { - promise.isResolved = true; - promise.isPending = false; - promise.isRejected = false; - return v; - }, - function (e) { - promise.isResolved = false; - promise.isPending = false; - promise.isRejected = true; - throw (e); - } - ); - return promise; -}; +u.getResolveablePromise = getOpenPromise; +u.getOpenPromise = getOpenPromise; u.interpolate = function (string, o) { return string.replace(/{{{([^{}]*)}}}/g, @@ -576,7 +547,7 @@ u.waitUntil = function (func, max_wait=300, check_delay=3) { return Promise.reject(e); } - const promise = u.getResolveablePromise(); + const promise = getOpenPromise(); const timeout_err = new Error(); function checker () { diff --git a/src/modals/confirm.js b/src/modals/confirm.js index 411a90d20..7e080ff2a 100644 --- a/src/modals/confirm.js +++ b/src/modals/confirm.js @@ -1,8 +1,6 @@ import BootstrapModal from './base.js'; import tpl_prompt from "./templates/prompt.js"; -import { converse } from "@converse/headless/core"; - -const u = converse.env.utils; +import { getOpenPromise } from '@converse/openpromise'; const Confirm = BootstrapModal.extend({ @@ -12,7 +10,7 @@ const Confirm = BootstrapModal.extend({ }, initialize () { - this.confirmation = u.getResolveablePromise(); + this.confirmation = getOpenPromise(); BootstrapModal.prototype.initialize.apply(this, arguments); this.listenTo(this.model, 'change', this.render) this.el.addEventListener('closed.bs.modal', () => this.confirmation.reject(), false);