UNPKG

matrix-react-sdk

Version:
104 lines (99 loc) 14.3 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.EffectiveMembership = void 0; exports.getEffectiveMembership = getEffectiveMembership; exports.getEffectiveMembershipTag = getEffectiveMembershipTag; exports.isJoinedOrNearlyJoined = isJoinedOrNearlyJoined; exports.isKnockDenied = isKnockDenied; exports.splitRoomsByMembership = splitRoomsByMembership; exports.waitForMember = waitForMember; var _matrix = require("matrix-js-sdk/src/matrix"); var _types = require("matrix-js-sdk/src/types"); var _MatrixClientPeg = require("../MatrixClientPeg"); var _SettingsStore = _interopRequireDefault(require("../settings/SettingsStore")); /* Copyright 2024 New Vector Ltd. Copyright 2020-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. */ /** * Approximation of a membership status for a given room. */ let EffectiveMembership = exports.EffectiveMembership = /*#__PURE__*/function (EffectiveMembership) { EffectiveMembership["Join"] = "JOIN"; EffectiveMembership["Invite"] = "INVITE"; EffectiveMembership["Leave"] = "LEAVE"; return EffectiveMembership; }({}); function splitRoomsByMembership(rooms) { const split = { [EffectiveMembership.Invite]: [], [EffectiveMembership.Join]: [], [EffectiveMembership.Leave]: [] }; for (const room of rooms) { const membership = room.getMyMembership(); // Filter out falsey relationship as this will be peeked rooms if (!!membership) { split[getEffectiveMembershipTag(room)].push(room); } } return split; } function getEffectiveMembership(membership) { if (membership === _types.KnownMembership.Invite) { return EffectiveMembership.Invite; } else if (membership === _types.KnownMembership.Join || _SettingsStore.default.getValue("feature_ask_to_join") && membership === _types.KnownMembership.Knock) { return EffectiveMembership.Join; } else { // Probably a leave, kick, or ban return EffectiveMembership.Leave; } } function isKnockDenied(room) { const memberId = _MatrixClientPeg.MatrixClientPeg.get()?.getSafeUserId(); const member = memberId ? room.getMember(memberId) : null; const previousMembership = member?.events.member?.getPrevContent().membership; return member?.isKicked() && previousMembership === _types.KnownMembership.Knock; } function getEffectiveMembershipTag(room, membership) { return isKnockDenied(room) ? EffectiveMembership.Join : getEffectiveMembership(membership ?? room.getMyMembership()); } function isJoinedOrNearlyJoined(membership) { const effective = getEffectiveMembership(membership); return effective === EffectiveMembership.Join || effective === EffectiveMembership.Invite; } /** * Try to ensure the user is in the room (invited or joined) before continuing */ async function waitForMember(client, roomId, userId, opts = { timeout: 1500 }) { const { timeout } = opts; let handler; // check if the user is in the room before we start -- in which case, no need to wait. if ((client.getRoom(roomId)?.getMember(userId) ?? null) !== null) { return true; } return new Promise(resolve => { // eslint-disable-next-line @typescript-eslint/naming-convention handler = function (_, __, member) { if (member.userId !== userId) return; if (member.roomId !== roomId) return; resolve(true); }; client.on(_matrix.RoomStateEvent.NewMember, handler); /* We don't want to hang if this goes wrong, so we proceed and hope the other user is already in the room */ window.setTimeout(resolve, timeout, false); }).finally(() => { client.removeListener(_matrix.RoomStateEvent.NewMember, handler); }); } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl90eXBlcyIsIl9NYXRyaXhDbGllbnRQZWciLCJfU2V0dGluZ3NTdG9yZSIsIl9pbnRlcm9wUmVxdWlyZURlZmF1bHQiLCJFZmZlY3RpdmVNZW1iZXJzaGlwIiwiZXhwb3J0cyIsInNwbGl0Um9vbXNCeU1lbWJlcnNoaXAiLCJyb29tcyIsInNwbGl0IiwiSW52aXRlIiwiSm9pbiIsIkxlYXZlIiwicm9vbSIsIm1lbWJlcnNoaXAiLCJnZXRNeU1lbWJlcnNoaXAiLCJnZXRFZmZlY3RpdmVNZW1iZXJzaGlwVGFnIiwicHVzaCIsImdldEVmZmVjdGl2ZU1lbWJlcnNoaXAiLCJLbm93bk1lbWJlcnNoaXAiLCJTZXR0aW5nc1N0b3JlIiwiZ2V0VmFsdWUiLCJLbm9jayIsImlzS25vY2tEZW5pZWQiLCJtZW1iZXJJZCIsIk1hdHJpeENsaWVudFBlZyIsImdldCIsImdldFNhZmVVc2VySWQiLCJtZW1iZXIiLCJnZXRNZW1iZXIiLCJwcmV2aW91c01lbWJlcnNoaXAiLCJldmVudHMiLCJnZXRQcmV2Q29udGVudCIsImlzS2lja2VkIiwiaXNKb2luZWRPck5lYXJseUpvaW5lZCIsImVmZmVjdGl2ZSIsIndhaXRGb3JNZW1iZXIiLCJjbGllbnQiLCJyb29tSWQiLCJ1c2VySWQiLCJvcHRzIiwidGltZW91dCIsImhhbmRsZXIiLCJnZXRSb29tIiwiUHJvbWlzZSIsInJlc29sdmUiLCJfIiwiX18iLCJvbiIsIlJvb21TdGF0ZUV2ZW50IiwiTmV3TWVtYmVyIiwid2luZG93Iiwic2V0VGltZW91dCIsImZpbmFsbHkiLCJyZW1vdmVMaXN0ZW5lciJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9tZW1iZXJzaGlwLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIwLTIwMjIgVGhlIE1hdHJpeC5vcmcgRm91bmRhdGlvbiBDLkkuQy5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgUm9vbSwgUm9vbU1lbWJlciwgUm9vbVN0YXRlLCBSb29tU3RhdGVFdmVudCwgTWF0cml4RXZlbnQsIE1hdHJpeENsaWVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IEtub3duTWVtYmVyc2hpcCwgTWVtYmVyc2hpcCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy90eXBlc1wiO1xuXG5pbXBvcnQgeyBNYXRyaXhDbGllbnRQZWcgfSBmcm9tIFwiLi4vTWF0cml4Q2xpZW50UGVnXCI7XG5pbXBvcnQgU2V0dGluZ3NTdG9yZSBmcm9tIFwiLi4vc2V0dGluZ3MvU2V0dGluZ3NTdG9yZVwiO1xuXG4vKipcbiAqIEFwcHJveGltYXRpb24gb2YgYSBtZW1iZXJzaGlwIHN0YXR1cyBmb3IgYSBnaXZlbiByb29tLlxuICovXG5leHBvcnQgZW51bSBFZmZlY3RpdmVNZW1iZXJzaGlwIHtcbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBpcyBlZmZlY3RpdmVseSBqb2luZWQgdG8gdGhlIHJvb20uIEZvciBleGFtcGxlLCBhY3R1YWxseSBqb2luZWRcbiAgICAgKiBvciBrbm9ja2luZyBvbiB0aGUgcm9vbSAod2hlbiB0aGF0IGJlY29tZXMgcG9zc2libGUpLlxuICAgICAqL1xuICAgIEpvaW4gPSBcIkpPSU5cIixcblxuICAgIC8qKlxuICAgICAqIFRoZSB1c2VyIGlzIGVmZmVjdGl2ZWx5IGludml0ZWQgdG8gdGhlIHJvb20uIEN1cnJlbnRseSB0aGlzIGlzIGEgZGlyZWN0IG1hcFxuICAgICAqIHRvIHRoZSBpbnZpdGUgbWVtYmVyc2hpcCBhcyBubyBvdGhlciBtZW1iZXJzaGlwIHN0YXRlcyBhcmUgZWZmZWN0aXZlbHlcbiAgICAgKiBpbnZpdGVzLlxuICAgICAqL1xuICAgIEludml0ZSA9IFwiSU5WSVRFXCIsXG5cbiAgICAvKipcbiAgICAgKiBUaGUgdXNlciBpcyBlZmZlY3RpdmVseSBubyBsb25nZXIgaW4gdGhlIHJvb20uIEZvciBleGFtcGxlLCBraWNrZWQsXG4gICAgICogYmFubmVkLCBvciB2b2x1bnRhcmlseSBsZWZ0LlxuICAgICAqL1xuICAgIExlYXZlID0gXCJMRUFWRVwiLFxufVxuXG5leHBvcnQgdHlwZSBNZW1iZXJzaGlwU3BsaXQgPSB7XG4gICAgW3N0YXRlIGluIEVmZmVjdGl2ZU1lbWJlcnNoaXBdOiBSb29tW107XG59O1xuXG5leHBvcnQgZnVuY3Rpb24gc3BsaXRSb29tc0J5TWVtYmVyc2hpcChyb29tczogUm9vbVtdKTogTWVtYmVyc2hpcFNwbGl0IHtcbiAgICBjb25zdCBzcGxpdDogTWVtYmVyc2hpcFNwbGl0ID0ge1xuICAgICAgICBbRWZmZWN0aXZlTWVtYmVyc2hpcC5JbnZpdGVdOiBbXSxcbiAgICAgICAgW0VmZmVjdGl2ZU1lbWJlcnNoaXAuSm9pbl06IFtdLFxuICAgICAgICBbRWZmZWN0aXZlTWVtYmVyc2hpcC5MZWF2ZV06IFtdLFxuICAgIH07XG5cbiAgICBmb3IgKGNvbnN0IHJvb20gb2Ygcm9vbXMpIHtcbiAgICAgICAgY29uc3QgbWVtYmVyc2hpcCA9IHJvb20uZ2V0TXlNZW1iZXJzaGlwKCk7XG4gICAgICAgIC8vIEZpbHRlciBvdXQgZmFsc2V5IHJlbGF0aW9uc2hpcCBhcyB0aGlzIHdpbGwgYmUgcGVla2VkIHJvb21zXG4gICAgICAgIGlmICghIW1lbWJlcnNoaXApIHtcbiAgICAgICAgICAgIHNwbGl0W2dldEVmZmVjdGl2ZU1lbWJlcnNoaXBUYWcocm9vbSldLnB1c2gocm9vbSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3BsaXQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBnZXRFZmZlY3RpdmVNZW1iZXJzaGlwKG1lbWJlcnNoaXA6IE1lbWJlcnNoaXApOiBFZmZlY3RpdmVNZW1iZXJzaGlwIHtcbiAgICBpZiAobWVtYmVyc2hpcCA9PT0gS25vd25NZW1iZXJzaGlwLkludml0ZSkge1xuICAgICAgICByZXR1cm4gRWZmZWN0aXZlTWVtYmVyc2hpcC5JbnZpdGU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgbWVtYmVyc2hpcCA9PT0gS25vd25NZW1iZXJzaGlwLkpvaW4gfHxcbiAgICAgICAgKFNldHRpbmdzU3RvcmUuZ2V0VmFsdWUoXCJmZWF0dXJlX2Fza190b19qb2luXCIpICYmIG1lbWJlcnNoaXAgPT09IEtub3duTWVtYmVyc2hpcC5Lbm9jaylcbiAgICApIHtcbiAgICAgICAgcmV0dXJuIEVmZmVjdGl2ZU1lbWJlcnNoaXAuSm9pbjtcbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBQcm9iYWJseSBhIGxlYXZlLCBraWNrLCBvciBiYW5cbiAgICAgICAgcmV0dXJuIEVmZmVjdGl2ZU1lbWJlcnNoaXAuTGVhdmU7XG4gICAgfVxufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNLbm9ja0RlbmllZChyb29tOiBSb29tKTogYm9vbGVhbiB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgbWVtYmVySWQgPSBNYXRyaXhDbGllbnRQZWcuZ2V0KCk/LmdldFNhZmVVc2VySWQoKTtcbiAgICBjb25zdCBtZW1iZXIgPSBtZW1iZXJJZCA/IHJvb20uZ2V0TWVtYmVyKG1lbWJlcklkKSA6IG51bGw7XG4gICAgY29uc3QgcHJldmlvdXNNZW1iZXJzaGlwID0gbWVtYmVyPy5ldmVudHMubWVtYmVyPy5nZXRQcmV2Q29udGVudCgpLm1lbWJlcnNoaXA7XG5cbiAgICByZXR1cm4gbWVtYmVyPy5pc0tpY2tlZCgpICYmIHByZXZpb3VzTWVtYmVyc2hpcCA9PT0gS25vd25NZW1iZXJzaGlwLktub2NrO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ2V0RWZmZWN0aXZlTWVtYmVyc2hpcFRhZyhyb29tOiBSb29tLCBtZW1iZXJzaGlwPzogc3RyaW5nKTogRWZmZWN0aXZlTWVtYmVyc2hpcCB7XG4gICAgcmV0dXJuIGlzS25vY2tEZW5pZWQocm9vbSlcbiAgICAgICAgPyBFZmZlY3RpdmVNZW1iZXJzaGlwLkpvaW5cbiAgICAgICAgOiBnZXRFZmZlY3RpdmVNZW1iZXJzaGlwKG1lbWJlcnNoaXAgPz8gcm9vbS5nZXRNeU1lbWJlcnNoaXAoKSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc0pvaW5lZE9yTmVhcmx5Sm9pbmVkKG1lbWJlcnNoaXA6IE1lbWJlcnNoaXApOiBib29sZWFuIHtcbiAgICBjb25zdCBlZmZlY3RpdmUgPSBnZXRFZmZlY3RpdmVNZW1iZXJzaGlwKG1lbWJlcnNoaXApO1xuICAgIHJldHVybiBlZmZlY3RpdmUgPT09IEVmZmVjdGl2ZU1lbWJlcnNoaXAuSm9pbiB8fCBlZmZlY3RpdmUgPT09IEVmZmVjdGl2ZU1lbWJlcnNoaXAuSW52aXRlO1xufVxuXG4vKipcbiAqIFRyeSB0byBlbnN1cmUgdGhlIHVzZXIgaXMgaW4gdGhlIHJvb20gKGludml0ZWQgb3Igam9pbmVkKSBiZWZvcmUgY29udGludWluZ1xuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gd2FpdEZvck1lbWJlcihcbiAgICBjbGllbnQ6IE1hdHJpeENsaWVudCxcbiAgICByb29tSWQ6IHN0cmluZyxcbiAgICB1c2VySWQ6IHN0cmluZyxcbiAgICBvcHRzID0geyB0aW1lb3V0OiAxNTAwIH0sXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgICBjb25zdCB7IHRpbWVvdXQgfSA9IG9wdHM7XG4gICAgbGV0IGhhbmRsZXI6IChldmVudDogTWF0cml4RXZlbnQsIHN0YXRlOiBSb29tU3RhdGUsIG1lbWJlcjogUm9vbU1lbWJlcikgPT4gdm9pZDtcblxuICAgIC8vIGNoZWNrIGlmIHRoZSB1c2VyIGlzIGluIHRoZSByb29tIGJlZm9yZSB3ZSBzdGFydCAtLSBpbiB3aGljaCBjYXNlLCBubyBuZWVkIHRvIHdhaXQuXG4gICAgaWYgKChjbGllbnQuZ2V0Um9vbShyb29tSWQpPy5nZXRNZW1iZXIodXNlcklkKSA/PyBudWxsKSAhPT0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uYW1pbmctY29udmVudGlvblxuICAgICAgICBoYW5kbGVyID0gZnVuY3Rpb24gKF8sIF9fLCBtZW1iZXI6IFJvb21NZW1iZXIpIHtcbiAgICAgICAgICAgIGlmIChtZW1iZXIudXNlcklkICE9PSB1c2VySWQpIHJldHVybjtcbiAgICAgICAgICAgIGlmIChtZW1iZXIucm9vbUlkICE9PSByb29tSWQpIHJldHVybjtcbiAgICAgICAgICAgIHJlc29sdmUodHJ1ZSk7XG4gICAgICAgIH07XG4gICAgICAgIGNsaWVudC5vbihSb29tU3RhdGVFdmVudC5OZXdNZW1iZXIsIGhhbmRsZXIpO1xuXG4gICAgICAgIC8qIFdlIGRvbid0IHdhbnQgdG8gaGFuZyBpZiB0aGlzIGdvZXMgd3JvbmcsIHNvIHdlIHByb2NlZWQgYW5kIGhvcGUgdGhlIG90aGVyXG4gICAgICAgICAgIHVzZXIgaXMgYWxyZWFkeSBpbiB0aGUgcm9vbSAqL1xuICAgICAgICB3aW5kb3cuc2V0VGltZW91dChyZXNvbHZlLCB0aW1lb3V0LCBmYWxzZSk7XG4gICAgfSkuZmluYWxseSgoKSA9PiB7XG4gICAgICAgIGNsaWVudC5yZW1vdmVMaXN0ZW5lcihSb29tU3RhdGVFdmVudC5OZXdNZW1iZXIsIGhhbmRsZXIpO1xuICAgIH0pO1xufVxuIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7O0FBUUEsSUFBQUEsT0FBQSxHQUFBQyxPQUFBO0FBQ0EsSUFBQUMsTUFBQSxHQUFBRCxPQUFBO0FBRUEsSUFBQUUsZ0JBQUEsR0FBQUYsT0FBQTtBQUNBLElBQUFHLGNBQUEsR0FBQUMsc0JBQUEsQ0FBQUosT0FBQTtBQVpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FB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