static async getUserCache (userId, cb) {
    // If we have the cache just cb/return it
    const entry = User.#usersCache.get(userId);
    if (entry && entry._timeStamp > Date.now() - User.#userCacheTimeout) {
      if (cb) {
        return cb(null, entry.user);
      } else {
        return entry.user;
      }
    }

    // Promise version
    if (!cb) {
      return new Promise((resolve, reject) => {
        User.getUser(userId, (err, user) => {
          if (err) { return reject(err); }
          if (!user) { return resolve(user); }

          User.#usersCache.set(userId, { _timeStamp: Date.now(), user });
          return resolve(user);
        });
      });
    }

    // CB version
    User.getUser(userId, (err, user) => {
      if (err || !user) {
        return cb(err, user);
      }

      User.#usersCache.set(userId, { _timeStamp: Date.now(), user });
      cb(null, user);
    });
  }
Return a user checking cache first. Supports both promise and cb.
@param userId the user to fetch
@param cb the callback to use in cb mode