text: /**
   * Caches membership of virtual users to rooms in memory
   * and also stores the state of whether users are registered.
   */
  class MembershipCache {
      constructor () {
          this._membershipMap = {
              // room_id: { user_id: "join|invite|leave|ban|null" }   null=unknown
          };
          this._registeredUsers = new Set();
      }
  
      /**
       * Get's the *cached* state of a user's membership for a room.
       * This DOES NOT check to verify the value is correct (i.e the
       * room may have state reset and left the user from the room).
       * 
       * This only caches users from the appservice.
       * 
       * @param {string}} roomId Room id to check the state of.
       * @param {string} userId The userid to check the state of.
       * @returns {string} The membership state of the user, e.g. "joined"
       */
      getMemberEntry(roomId, userId) {
          if (this._membershipMap[roomId] === undefined) {
              return null;
          }
          return this._membershipMap[roomId][userId];
      };
  
      /**
       * Set the *cached* state of a user's membership for a room.
       * Use this to optimise intents so that they do not attempt
       * to join a room if we know they are joined.
       * This DOES NOT set the actual membership of the room.
       * 
       * This only caches users from the appservice.
       * @param {string} roomId Room id to set the state of.
       * @param {string} userId The userid to set the state of.
       * @param {string} membership The membership value to set for the user
       *                       e.g joined.
       */
      setMemberEntry(roomId, userId, membership) {
          if (this._membershipMap[roomId] === undefined) {
              this._membershipMap[roomId] = {};
          }
  
          // Bans and invites do not mean the user exists.
          if (membership === "join" || membership === "leave") {
              this._registeredUsers.add(userId);
          }
  
          this._membershipMap[roomId][userId] = membership;
      };
  
      isUserRegistered(userId) {
          return this._registeredUsers.has(userId);
      }
  }
  
  module.exports = MembershipCache;
  