static initialize (options) {
    if (ArkimeConfig.debug > 1) {
      console.log('User.initialize', options);
    }
    readOnly = options.readOnly ?? false;
    getCurrentUserCB = options.getCurrentUserCB;

    if (!options.url) {
      User.#implementation = new UserESImplementation(options);
    } else if (options.url.startsWith('lmdb')) {
      User.#implementation = new UserLMDBImplementation(options);
    } else if (options.url.startsWith('redis')) {
      User.#implementation = new UserRedisImplementation(options);
    } else {
      User.#implementation = new UserESImplementation(options);
    }

    if (!options.noUsersCheck && !Auth.isAnonymousMode()) {
      setImmediate(async () => {
        const count = await User.numberOfUsers();
        if (count === 0) {
          console.log('WARNING\nWARNING - No users are defined, use `/opt/arkime/bin/arkime_add_user.sh` to add one\nWARNING');
        }
      });
    }

    User.#demoMode = ArkimeConfig.get('demoMode', false);
    if (typeof User.#demoMode !== 'boolean') {
      User.#demoMode = new Set(ArkimeConfig.getArray('demoMode'));
    }

    const userRoleMappings = ArkimeConfig.getSection('user-role-mappings');
    if (userRoleMappings) {
      User.#dynamicRolesFuncs = {};
      for (const [role, func] of Object.entries(userRoleMappings)) {
        if (!systemRolesMapping[role] && !role.startsWith('role:')) {
          console.log(`ERROR - user-role-mappings ${role} must start with role- or be a system role`);
          process.exit();
        }
        User.#dynamicRolesFuncs[role] = new Function('vals', `return ${func};`);
      }
    }
  }
Initialize the User subsystem
@param {string} options.url The url that represents which DB implementation to use
@param {boolean} options.readOnly=false If true don't set the last used time
@param {function} options.getCurrentUserCB Optional function that can modify a user object when fetching
@param {boolean} options.noUsersCheck=false If true don't check if the users DB is empty