UNPKG

matrix-react-sdk

Version:
119 lines (113 loc) 15.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.doMaybeLocalRoomAction = doMaybeLocalRoomAction; exports.waitForRoomReadyAndApplyAfterCreateCallbacks = waitForRoomReadyAndApplyAfterCreateCallbacks; var _logger = require("matrix-js-sdk/src/logger"); var _matrix = require("matrix-js-sdk/src/matrix"); var _dispatcher = _interopRequireDefault(require("../dispatcher/dispatcher")); var _LocalRoom = require("../models/LocalRoom"); var _isLocalRoom = require("./localRoom/isLocalRoom"); var _isRoomReady = require("./localRoom/isRoomReady"); /* Copyright 2024 New Vector Ltd. Copyright 2022 The Matrix.org Foundation C.I.C. SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only Please see LICENSE files in the repository root for full details. */ const isActualRoomIdDefined = actualRoomId => { if (actualRoomId === undefined) { // should not happen throw new Error("Local room in CREATED state without actual room Id occurred"); } return true; }; /** * Does a room action: * For non-local rooms it calls fn directly. * For local rooms it adds the callback function to the room's afterCreateCallbacks and * dispatches a "local_room_event". * * @async * @template T * @param {string} roomId Room ID of the target room * @param {(actualRoomId: string) => Promise<T>} fn Callback to be called directly or collected at the local room * @param {MatrixClient} [client] * @returns {Promise<T>} Promise that gets resolved after the callback has finished */ async function doMaybeLocalRoomAction(roomId, fn, client) { if ((0, _isLocalRoom.isLocalRoom)(roomId)) { const room = client.getRoom(roomId); if (room.isCreated && isActualRoomIdDefined(room.actualRoomId)) { return fn(room.actualRoomId); } return new Promise((resolve, reject) => { room.afterCreateCallbacks.push(newRoomId => { fn(newRoomId).then(resolve).catch(reject); }); _dispatcher.default.dispatch({ action: "local_room_event", roomId: room.roomId }); }); } return fn(roomId); } /** * Waits until a room is ready and then applies the after-create local room callbacks. * Also implements a stopgap timeout after that a room is assumed to be ready. * * @see isRoomReady * @async * @param {MatrixClient} client * @param {LocalRoom} localRoom * @param actualRoomId Id of the actual room * @returns {Promise<string>} Resolved to the actual room id */ async function waitForRoomReadyAndApplyAfterCreateCallbacks(client, localRoom, actualRoomId) { if ((0, _isRoomReady.isRoomReady)(client, localRoom)) { return applyAfterCreateCallbacks(localRoom, actualRoomId).then(() => { localRoom.state = _LocalRoom.LocalRoomState.CREATED; client.emit(_matrix.ClientEvent.Room, localRoom); return Promise.resolve(actualRoomId); }); } return new Promise((resolve, reject) => { const finish = () => { if (checkRoomStateIntervalHandle) clearInterval(checkRoomStateIntervalHandle); if (stopgapTimeoutHandle) clearTimeout(stopgapTimeoutHandle); applyAfterCreateCallbacks(localRoom, actualRoomId).then(() => { localRoom.state = _LocalRoom.LocalRoomState.CREATED; client.emit(_matrix.ClientEvent.Room, localRoom); resolve(actualRoomId); }).catch(err => { reject(err); }); }; const stopgapFinish = () => { _logger.logger.warn(`Assuming local room ${localRoom.roomId} is ready after hitting timeout`); finish(); }; const checkRoomStateIntervalHandle = window.setInterval(() => { if ((0, _isRoomReady.isRoomReady)(client, localRoom)) finish(); }, 500); const stopgapTimeoutHandle = window.setTimeout(stopgapFinish, 5000); }); } /** * Applies the after-create callback of a local room. * * @async * @param {LocalRoom} localRoom * @param {string} roomId * @returns {Promise<void>} Resolved after all callbacks have been called */ async function applyAfterCreateCallbacks(localRoom, roomId) { for (const afterCreateCallback of localRoom.afterCreateCallbacks) { await afterCreateCallback(roomId); } localRoom.afterCreateCallbacks = []; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbG9nZ2VyIiwicmVxdWlyZSIsIl9tYXRyaXgiLCJfZGlzcGF0Y2hlciIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJfTG9jYWxSb29tIiwiX2lzTG9jYWxSb29tIiwiX2lzUm9vbVJlYWR5IiwiaXNBY3R1YWxSb29tSWREZWZpbmVkIiwiYWN0dWFsUm9vbUlkIiwidW5kZWZpbmVkIiwiRXJyb3IiLCJkb01heWJlTG9jYWxSb29tQWN0aW9uIiwicm9vbUlkIiwiZm4iLCJjbGllbnQiLCJpc0xvY2FsUm9vbSIsInJvb20iLCJnZXRSb29tIiwiaXNDcmVhdGVkIiwiUHJvbWlzZSIsInJlc29sdmUiLCJyZWplY3QiLCJhZnRlckNyZWF0ZUNhbGxiYWNrcyIsInB1c2giLCJuZXdSb29tSWQiLCJ0aGVuIiwiY2F0Y2giLCJkZWZhdWx0RGlzcGF0Y2hlciIsImRpc3BhdGNoIiwiYWN0aW9uIiwid2FpdEZvclJvb21SZWFkeUFuZEFwcGx5QWZ0ZXJDcmVhdGVDYWxsYmFja3MiLCJsb2NhbFJvb20iLCJpc1Jvb21SZWFkeSIsImFwcGx5QWZ0ZXJDcmVhdGVDYWxsYmFja3MiLCJzdGF0ZSIsIkxvY2FsUm9vbVN0YXRlIiwiQ1JFQVRFRCIsImVtaXQiLCJDbGllbnRFdmVudCIsIlJvb20iLCJmaW5pc2giLCJjaGVja1Jvb21TdGF0ZUludGVydmFsSGFuZGxlIiwiY2xlYXJJbnRlcnZhbCIsInN0b3BnYXBUaW1lb3V0SGFuZGxlIiwiY2xlYXJUaW1lb3V0IiwiZXJyIiwic3RvcGdhcEZpbmlzaCIsImxvZ2dlciIsIndhcm4iLCJ3aW5kb3ciLCJzZXRJbnRlcnZhbCIsInNldFRpbWVvdXQiLCJhZnRlckNyZWF0ZUNhbGxiYWNrIl0sInNvdXJjZXMiOlsiLi4vLi4vc3JjL3V0aWxzL2xvY2FsLXJvb20udHMiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbkNvcHlyaWdodCAyMDI0IE5ldyBWZWN0b3IgTHRkLlxuQ29weXJpZ2h0IDIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgbG9nZ2VyIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL2xvZ2dlclwiO1xuaW1wb3J0IHsgQ2xpZW50RXZlbnQsIE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcblxuaW1wb3J0IGRlZmF1bHREaXNwYXRjaGVyIGZyb20gXCIuLi9kaXNwYXRjaGVyL2Rpc3BhdGNoZXJcIjtcbmltcG9ydCB7IExvY2FsUm9vbSwgTG9jYWxSb29tU3RhdGUgfSBmcm9tIFwiLi4vbW9kZWxzL0xvY2FsUm9vbVwiO1xuaW1wb3J0IHsgaXNMb2NhbFJvb20gfSBmcm9tIFwiLi9sb2NhbFJvb20vaXNMb2NhbFJvb21cIjtcbmltcG9ydCB7IGlzUm9vbVJlYWR5IH0gZnJvbSBcIi4vbG9jYWxSb29tL2lzUm9vbVJlYWR5XCI7XG5cbmNvbnN0IGlzQWN0dWFsUm9vbUlkRGVmaW5lZCA9IChhY3R1YWxSb29tSWQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IGFjdHVhbFJvb21JZCBpcyBzdHJpbmcgPT4ge1xuICAgIGlmIChhY3R1YWxSb29tSWQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAvLyBzaG91bGQgbm90IGhhcHBlblxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJMb2NhbCByb29tIGluIENSRUFURUQgc3RhdGUgd2l0aG91dCBhY3R1YWwgcm9vbSBJZCBvY2N1cnJlZFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8qKlxuICogRG9lcyBhIHJvb20gYWN0aW9uOlxuICogRm9yIG5vbi1sb2NhbCByb29tcyBpdCBjYWxscyBmbiBkaXJlY3RseS5cbiAqIEZvciBsb2NhbCByb29tcyBpdCBhZGRzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byB0aGUgcm9vbSdzIGFmdGVyQ3JlYXRlQ2FsbGJhY2tzIGFuZFxuICogZGlzcGF0Y2hlcyBhIFwibG9jYWxfcm9vbV9ldmVudFwiLlxuICpcbiAqIEBhc3luY1xuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7c3RyaW5nfSByb29tSWQgUm9vbSBJRCBvZiB0aGUgdGFyZ2V0IHJvb21cbiAqIEBwYXJhbSB7KGFjdHVhbFJvb21JZDogc3RyaW5nKSA9PiBQcm9taXNlPFQ+fSBmbiBDYWxsYmFjayB0byBiZSBjYWxsZWQgZGlyZWN0bHkgb3IgY29sbGVjdGVkIGF0IHRoZSBsb2NhbCByb29tXG4gKiBAcGFyYW0ge01hdHJpeENsaWVudH0gW2NsaWVudF1cbiAqIEByZXR1cm5zIHtQcm9taXNlPFQ+fSBQcm9taXNlIHRoYXQgZ2V0cyByZXNvbHZlZCBhZnRlciB0aGUgY2FsbGJhY2sgaGFzIGZpbmlzaGVkXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkb01heWJlTG9jYWxSb29tQWN0aW9uPFQ+KFxuICAgIHJvb21JZDogc3RyaW5nLFxuICAgIGZuOiAoYWN0dWFsUm9vbUlkOiBzdHJpbmcpID0+IFByb21pc2U8VD4sXG4gICAgY2xpZW50OiBNYXRyaXhDbGllbnQsXG4pOiBQcm9taXNlPFQ+IHtcbiAgICBpZiAoaXNMb2NhbFJvb20ocm9vbUlkKSkge1xuICAgICAgICBjb25zdCByb29tID0gY2xpZW50LmdldFJvb20ocm9vbUlkKSBhcyBMb2NhbFJvb207XG5cbiAgICAgICAgaWYgKHJvb20uaXNDcmVhdGVkICYmIGlzQWN0dWFsUm9vbUlkRGVmaW5lZChyb29tLmFjdHVhbFJvb21JZCkpIHtcbiAgICAgICAgICAgIHJldHVybiBmbihyb29tLmFjdHVhbFJvb21JZCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2U8VD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcm9vbS5hZnRlckNyZWF0ZUNhbGxiYWNrcy5wdXNoKChuZXdSb29tSWQ6IHN0cmluZykgPT4ge1xuICAgICAgICAgICAgICAgIGZuKG5ld1Jvb21JZCkudGhlbihyZXNvbHZlKS5jYXRjaChyZWplY3QpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBkZWZhdWx0RGlzcGF0Y2hlci5kaXNwYXRjaCh7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBcImxvY2FsX3Jvb21fZXZlbnRcIixcbiAgICAgICAgICAgICAgICByb29tSWQ6IHJvb20ucm9vbUlkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBmbihyb29tSWQpO1xufVxuXG4vKipcbiAqIFdhaXRzIHVudGlsIGEgcm9vbSBpcyByZWFkeSBhbmQgdGhlbiBhcHBsaWVzIHRoZSBhZnRlci1jcmVhdGUgbG9jYWwgcm9vbSBjYWxsYmFja3MuXG4gKiBBbHNvIGltcGxlbWVudHMgYSBzdG9wZ2FwIHRpbWVvdXQgYWZ0ZXIgdGhhdCBhIHJvb20gaXMgYXNzdW1lZCB0byBiZSByZWFkeS5cbiAqXG4gKiBAc2VlIGlzUm9vbVJlYWR5XG4gKiBAYXN5bmNcbiAqIEBwYXJhbSB7TWF0cml4Q2xpZW50fSBjbGllbnRcbiAqIEBwYXJhbSB7TG9jYWxSb29tfSBsb2NhbFJvb21cbiAqIEBwYXJhbSBhY3R1YWxSb29tSWQgSWQgb2YgdGhlIGFjdHVhbCByb29tXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBSZXNvbHZlZCB0byB0aGUgYWN0dWFsIHJvb20gaWRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHdhaXRGb3JSb29tUmVhZHlBbmRBcHBseUFmdGVyQ3JlYXRlQ2FsbGJhY2tzKFxuICAgIGNsaWVudDogTWF0cml4Q2xpZW50LFxuICAgIGxvY2FsUm9vbTogTG9jYWxSb29tLFxuICAgIGFjdHVhbFJvb21JZDogc3RyaW5nLFxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBpZiAoaXNSb29tUmVhZHkoY2xpZW50LCBsb2NhbFJvb20pKSB7XG4gICAgICAgIHJldHVybiBhcHBseUFmdGVyQ3JlYXRlQ2FsbGJhY2tzKGxvY2FsUm9vbSwgYWN0dWFsUm9vbUlkKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvY2FsUm9vbS5zdGF0ZSA9IExvY2FsUm9vbVN0YXRlLkNSRUFURUQ7XG4gICAgICAgICAgICBjbGllbnQuZW1pdChDbGllbnRFdmVudC5Sb29tLCBsb2NhbFJvb20pO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShhY3R1YWxSb29tSWQpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBjb25zdCBmaW5pc2ggPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBpZiAoY2hlY2tSb29tU3RhdGVJbnRlcnZhbEhhbmRsZSkgY2xlYXJJbnRlcnZhbChjaGVja1Jvb21TdGF0ZUludGVydmFsSGFuZGxlKTtcbiAgICAgICAgICAgIGlmIChzdG9wZ2FwVGltZW91dEhhbmRsZSkgY2xlYXJUaW1lb3V0KHN0b3BnYXBUaW1lb3V0SGFuZGxlKTtcblxuICAgICAgICAgICAgYXBwbHlBZnRlckNyZWF0ZUNhbGxiYWNrcyhsb2NhbFJvb20sIGFjdHVhbFJvb21JZClcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvY2FsUm9vbS5zdGF0ZSA9IExvY2FsUm9vbVN0YXRlLkNSRUFURUQ7XG4gICAgICAgICAgICAgICAgICAgIGNsaWVudC5lbWl0KENsaWVudEV2ZW50LlJvb20sIGxvY2FsUm9vbSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoYWN0dWFsUm9vbUlkKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHN0b3BnYXBGaW5pc2ggPSAoKTogdm9pZCA9PiB7XG4gICAgICAgICAgICBsb2dnZXIud2FybihgQXNzdW1pbmcgbG9jYWwgcm9vbSAke2xvY2FsUm9vbS5yb29tSWR9IGlzIHJlYWR5IGFmdGVyIGhpdHRpbmcgdGltZW91dGApO1xuICAgICAgICAgICAgZmluaXNoKCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgY2hlY2tSb29tU3RhdGVJbnRlcnZhbEhhbmRsZSA9IHdpbmRvdy5zZXRJbnRlcnZhbCgoKSA9PiB7XG4gICAgICAgICAgICBpZiAoaXNSb29tUmVhZHkoY2xpZW50LCBsb2NhbFJvb20pKSBmaW5pc2goKTtcbiAgICAgICAgfSwgNTAwKTtcbiAgICAgICAgY29uc3Qgc3RvcGdhcFRpbWVvdXRIYW5kbGUgPSB3aW5kb3cuc2V0VGltZW91dChzdG9wZ2FwRmluaXNoLCA1MDAwKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIHRoZSBhZnRlci1jcmVhdGUgY2FsbGJhY2sgb2YgYSBsb2NhbCByb29tLlxuICpcbiAqIEBhc3luY1xuICogQHBhcmFtIHtMb2NhbFJvb219IGxvY2FsUm9vbVxuICogQHBhcmFtIHtzdHJpbmd9IHJvb21JZFxuICogQHJldHVybnMge1Byb21pc2U8dm9pZD59IFJlc29sdmVkIGFmdGVyIGFsbCBjYWxsYmFja3MgaGF2ZSBiZWVuIGNhbGxlZFxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseUFmdGVyQ3JlYXRlQ2FsbGJhY2tzKGxvY2FsUm9vbTogTG9jYWxSb29tLCByb29tSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGZvciAoY29uc3QgYWZ0ZXJDcmVhdGVDYWxsYmFjayBvZiBsb2NhbFJvb20uYWZ0ZXJDcmVhdGVDYWxsYmFja3MpIHtcbiAgICAgICAgYXdhaXQgYWZ0ZXJDcmVhdGVDYWxsYmFjayhyb29tSWQpO1xuICAgIH1cblxuICAgIGxvY2FsUm9v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