insite-users-server 2.1.5 → 2.1.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bun.lock CHANGED
@@ -472,7 +472,7 @@
472
472
 
473
473
  "insite-subscriptions-server": ["insite-subscriptions-server@2.1.3", "", { "dependencies": { "insite-common": "^2.1.2", "insite-db": "^2.1.2", "insite-users-server-ws": "^2.1.3", "insite-ws": "^2.1.3", "sift": "^16.0.1" } }, "sha512-6ZNmgQd9hVRtdbd8J9bncqLpEd957vD1vhJsX+OMT5DzDLDtv7CwlAEd7oFFVRNINVToO3idwddBZcsJyIgMpg=="],
474
474
 
475
- "insite-users-server": ["insite-users-server@2.1.4", "", { "dependencies": { "@nesvet/n": "^1.1.23", "argon2": "^0.40.3", "eventemitter3": "^5.0.1", "insite-common": "^2.1.2", "insite-db": "^2.1.2", "insite-subscriptions-server": "^2.1.3", "insite-ws": "^2.1.3", "insite-ws-transfers": "^2.1.3" } }, "sha512-a/0Mc60u8q71j7Qp78dM06YC/VFInCND2oPTxd2rZ085XWmkK65SybvvEm2+X36yeqzhaktMlNAf02uKU5b/Eg=="],
475
+ "insite-users-server": ["insite-users-server@2.1.5", "", { "dependencies": { "@nesvet/n": "^1.1.23", "argon2": "^0.40.3", "eventemitter3": "^5.0.1", "insite-common": "^2.1.2", "insite-db": "^2.1.2", "insite-subscriptions-server": "^2.1.3", "insite-ws": "^2.1.3", "insite-ws-transfers": "^2.1.3" } }, "sha512-Kk3Mdx5QQaumef5CmZ8kNSjmRB35CRuTIKh4r1rKHujUSVGEoZxINVm6qPIyyr1E/8ExouMOWPmde8hyaQyG7w=="],
476
476
 
477
477
  "insite-users-server-ws": ["insite-users-server-ws@2.1.3", "", { "dependencies": { "@nesvet/n": "^1.1.23", "insite-common": "^2.1.2", "insite-db": "^2.1.2", "insite-subscriptions-server": "^2.1.3", "insite-users-server": "^2.1.3", "insite-ws": "^2.1.3", "insite-ws-transfers": "^2.1.3" } }, "sha512-Abw4ZnD0bM+Vb4Mg5HFwRTH2dOVIbRB6/C6fhitTaOrBORZH3QskW+9gF/Ve8NLnUwqV7s7Q6UoTRH517wYgCQ=="],
478
478
 
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/abilities/Error.ts", "../src/abilities/Map.ts", "../src/abilities/types.ts", "../src/roles/Error.ts", "../src/roles/Roles.ts", "../src/roles/Role.ts", "../src/lib/regexps.ts", "../src/roles/schema.ts", "../src/users/errors.ts", "../src/users/Users.ts", "../src/orgs/Orgs.ts", "../src/orgs/Org.ts", "../src/orgs/schema.ts", "../src/sessions/Sessions.ts", "../src/sessions/schema.ts", "../src/sessions/Session.ts", "../src/users/avatars/Avatars.ts", "../src/users/avatars/schema.ts", "../src/users/schema.ts", "../src/users/User.ts"],
4
- "sourcesContent": ["import { Err } from \"@nesvet/n\";\n\n\nexport class AbilityError extends Err {\n\tconstructor(payload?: object);\n\tconstructor(longId: string, payload?: object);\n\tconstructor(longId?: object | string, payload?: object) {\n\t\tif (typeof longId == \"object\") {\n\t\t\tpayload = longId;\n\t\t\tlongId = undefined;\n\t\t}\n\t\t\n\t\tsuper(\"User lacks ability\", \"lacksability\", {\n\t\t\t...longId && { ability: longId },\n\t\t\t...payload\n\t\t});\n\t\t\n\t}\n\t\n\tname = \"AbilityError\";\n\t\n}\n", "import {\n\tadd,\n\tassignPath,\n\tdeletePath,\n\tempty,\n\tgetPath,\n\tintersection,\n\tpick,\n\tsetPath\n} from \"@nesvet/n\";\nimport type { Abilities, AbilitiesSchema, AbilityParamSchema } from \"insite-common\";\nimport {\n\tisAbilityObject,\n\tisAbilityParamItems,\n\tisAbilityParamNumber,\n\ttype Ability,\n\ttype AbilityObject,\n\ttype AbilityParam,\n\ttype AbilityParamItems,\n\ttype AbilityParamNumber,\n\ttype AbilitySchema,\n\ttype GenericAbilities\n} from \"./types\";\n\n\nconst schemaParentMap = new Map<AbilitySchema, AbilitySchema | null>();\n\n\nexport class AbilitiesMap<AS extends AbilitiesSchema> extends Map<string, AbilitySchema> {\n\tconstructor(abilitiesSchema: AS) {\n\t\tsuper();\n\t\t\n\t\tfor (const subSchema of abilitiesSchema) {\n\t\t\tdelete subSchema.top;/* The first level is always top */\n\t\t\t\n\t\t\tthis.#hierarchical.push(subSchema as AbilitySchema);\n\t\t}\n\t\t\n\t\t(function parse(this: AbilitiesMap<AS>, schemas: AbilitiesSchema, parent: AbilitySchema | null, level: number) {\n\t\t\tfor (const schema of schemas as AbilitySchema[]) {\n\t\t\t\tschemaParentMap.set(schema, parent);\n\t\t\t\t\n\t\t\t\tschema.level = level;\n\t\t\t\t\n\t\t\t\tif (!parent || schema.top) {\n\t\t\t\t\tschema.longId = schema._id;\n\t\t\t\t\t\n\t\t\t\t\tif (this.has(schema._id))\n\t\t\t\t\t\tthrow new Error(`Top-level ability duplicate: ${schema._id}`);\n\t\t\t\t\t\n\t\t\t\t\tthis.set(schema._id, schema);\n\t\t\t\t} else\n\t\t\t\t\tschema.longId = parent ? `${parent.longId}.${schema._id}` : schema._id;\n\t\t\t\t\n\t\t\t\tif (schema.abilities)\n\t\t\t\t\tparse.call(this, schema.abilities, schema, level + 1);\n\t\t\t}\n\t\t\t\n\t\t}).call(this, abilitiesSchema, null, 0);\n\t\t\n\t}\n\t\n\t#hierarchical: AbilitySchema[] = [];\n\t\n\tget(longId: string, parent?: AbilitySchema | null) {\n\t\tconst subIds = longId.split(\".\");\n\t\tlet schema = parent ?? super.get(subIds.shift()!);\n\t\t\n\t\tif (schema && subIds.length)\n\t\t\tfor (const subId of subIds) {\n\t\t\t\tschema = schema?.abilities?.find(({ _id, top }) => !top && _id === subId);\n\t\t\t\tif (!schema)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\treturn schema;\n\t}\n\t\n\tgetSchema = this.get;\n\t\n\tgetParamSchema(longId: string, paramId: string) {\n\t\treturn this.get(longId)?.params?.find(({ _id }) => _id === paramId);\n\t}\n\t\n\tgetDefaultParam(longId: string, paramId: string, max?: boolean): AbilityParam | undefined;\n\tgetDefaultParam(schema: AbilityParamSchema, max?: boolean): AbilityParam;\n\tgetDefaultParam(schemaOrLongId: AbilityParamSchema | string, paramIdOrMax?: boolean | string, max?: boolean) {\n\t\tif (paramIdOrMax === undefined || typeof paramIdOrMax == \"boolean\")\n\t\t\tmax = paramIdOrMax;\n\t\t\n\t\tconst schema = typeof schemaOrLongId == \"string\" ? this.getParamSchema(schemaOrLongId, paramIdOrMax as string) : schemaOrLongId;\n\t\t\n\t\tif (schema)\n\t\t\tswitch (schema.type) {\n\t\t\t\tcase \"number\":\n\t\t\t\t\treturn max ?\n\t\t\t\t\t\t(schema.max ?? Infinity) :\n\t\t\t\t\t\t(schema.min ?? 0);\n\t\t\t\t\n\t\t\t\tcase \"items\":\n\t\t\t\t\treturn max ?\n\t\t\t\t\t\tschema.items.map(({ _id }) => _id) :\n\t\t\t\t\t\t[];\n\t\t\t}\n\t\t\n\t\treturn undefined;// eslint-disable-line unicorn/no-useless-undefined\n\t}\n\t\n\tgetDefaultAbility(schema: string, max?: boolean): Ability | undefined;\n\tgetDefaultAbility(schema: AbilitySchema, max?: boolean): Ability;\n\tgetDefaultAbility(schema: AbilitySchema | string, max: boolean = !schema): Ability | undefined {\n\t\tif (typeof schema == \"string\")\n\t\t\tschema = this.get(schema)!;\n\t\t\n\t\tif (schema) {\n\t\t\tif (schema.abilities || schema.params) {\n\t\t\t\tconst ability = {} as AbilityObject;\n\t\t\t\t\n\t\t\t\tif (schema.params)\n\t\t\t\t\tfor (const paramSchema of schema.params)\n\t\t\t\t\t\tability[paramSchema._id] = this.getDefaultParam(paramSchema, max);\n\t\t\t\t\n\t\t\t\tif (max && schema.abilities)\n\t\t\t\t\tfor (const subSchema of schema.abilities)\n\t\t\t\t\t\tif (!subSchema.top)\n\t\t\t\t\t\t\tability[subSchema._id] = this.getDefaultAbility(subSchema, max);\n\t\t\t\t\n\t\t\t\treturn ability;\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn undefined;\n\t}\n\t\n\tgetDefaultAbilities(): Abilities<AS>;\n\tgetDefaultAbilities(schemas: AbilitySchema[], max?: boolean): Abilities<AS>;\n\tgetDefaultAbilities(schema: AbilitySchema, max?: boolean): Abilities<AS>;\n\tgetDefaultAbilities(longIds: string[], max?: boolean): Abilities<AS>;\n\tgetDefaultAbilities(longId: string, max?: boolean): Abilities<AS>;\n\tgetDefaultAbilities(schemasOrIds?: (AbilitySchema | string)[] | AbilitySchema | string, max: boolean = !schemasOrIds) {\n\t\t\n\t\tconst schemas = (\n\t\t\tschemasOrIds ?\n\t\t\t\t(Array.isArray(schemasOrIds) ? schemasOrIds : [ schemasOrIds ])\n\t\t\t\t\t.map(schema => (typeof schema == \"string\" ? this.get(schema) : schema))\n\t\t\t\t\t.filter(Boolean) as AbilitySchema[] :\n\t\t\t\t[ ...this.values() ]\n\t\t).sort((a, b) => a.level - b.level);\n\t\t\n\t\tconst schemaMaxMap = new Map<AbilitySchema, boolean>();\n\t\t\n\t\tfor (const schema of schemas) {\n\t\t\t(function resolve(_schema) {\n\t\t\t\tconst parentSchema = schemaParentMap.get(_schema);\n\t\t\t\t\n\t\t\t\tif (parentSchema) {\n\t\t\t\t\tresolve(parentSchema);\n\t\t\t\t\t\n\t\t\t\t\tif (!schemaMaxMap.has(parentSchema))\n\t\t\t\t\t\tschemaMaxMap.set(parentSchema, false);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t})(schema);\n\t\t\t\n\t\t\tif (max)\n\t\t\t\t(function resolve(_schema) {\n\t\t\t\t\tif (!schemaMaxMap.has(_schema))\n\t\t\t\t\t\tschemaMaxMap.set(_schema, true);\n\t\t\t\t\t\n\t\t\t\t\tif (_schema.abilities)\n\t\t\t\t\t\tfor (const subSchema of _schema.abilities)\n\t\t\t\t\t\t\tif (subSchema.top)\n\t\t\t\t\t\t\t\tresolve(subSchema);\n\t\t\t\t\t\n\t\t\t\t})(schema);\n\t\t\telse\n\t\t\t\tif (!schemaMaxMap.has(schema))\n\t\t\t\t\tschemaMaxMap.set(schema, false);\n\t\t}\n\t\t\n\t\treturn assignPath(\n\t\t\t{},\n\t\t\tObject.fromEntries(\n\t\t\t\t[ ...schemaMaxMap ]\n\t\t\t\t\t.map(([ schema, _max ]) => [ schema.longId, this.getDefaultAbility(schema, _max) ])\n\t\t\t)\n\t\t);\n\t}\n\t\n\tgetSchemeFor(abilities: GenericAbilities) {\n\t\tabilities = this.adjust(structuredClone(abilities));\n\t\t\n\t\treturn (function resolve(subSchemas: AbilitySchema[], subAbilities: GenericAbilities) {\n\t\t\tfor (let i = 0; i < subSchemas.length; i++) {\n\t\t\t\tconst schema = subSchemas[i];\n\t\t\t\tconst ability = schema.top ? abilities[schema._id] : subAbilities[schema._id];\n\t\t\t\t\n\t\t\t\tif (ability) {\n\t\t\t\t\tif (schema.params)\n\t\t\t\t\t\tfor (const paramSchema of schema.params) {\n\t\t\t\t\t\t\tconst abilityParam = (ability as AbilityObject)[paramSchema._id];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tswitch (paramSchema.type) {\n\t\t\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\t\t\tparamSchema.max = abilityParam as AbilityParamNumber;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\t\t\t\tparamSchema.items = paramSchema.items.filter(({ _id }) => (abilityParam as AbilityParamItems).includes(_id));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (schema.abilities) {\n\t\t\t\t\t\tresolve(schema.abilities, ability as GenericAbilities);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!schema.abilities.length)\n\t\t\t\t\t\t\tdelete schema.abilities;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tsubSchemas.splice(i--, 1);\n\t\t\t}\n\t\t\t\n\t\t\treturn subSchemas;\n\t\t})(structuredClone(this.#hierarchical), abilities);\n\t}\n\t\n\tgetParam(abilities: GenericAbilities, longId: string, paramId: string) {\n\t\tif (this.getParamSchema(longId, paramId)) {\n\t\t\tconst value = getPath(abilities, `${longId}.${paramId}`) as AbilityParam;\n\t\t\t\n\t\t\tif (this.isParamFits(longId, paramId, value))\n\t\t\t\treturn value;\n\t\t\t\n\t\t\treturn this.getDefaultParam(longId, paramId)!;\n\t\t}\n\t\t\n\t\treturn undefined;// eslint-disable-line unicorn/no-useless-undefined\n\t}\n\t\n\tsetParam(abilities: GenericAbilities, longId: string, paramId: string, value: AbilityParam): Abilities<AS> {\n\t\tconst schema = this.getParamSchema(longId, paramId);\n\t\t\n\t\tif (!schema)\n\t\t\tthrow new Error(`No such ability param: ${longId}.${paramId}`);\n\t\t\n\t\tsetPath(abilities, `${longId}.${paramId}`, this.adjustParam(schema, value));\n\t\t\n\t\treturn abilities as Abilities<AS>;\n\t}\n\t\n\tisParamFits(longId: string, paramId: string, value: AbilityParam, referenceValue?: AbilityParam) {\n\t\tif (value !== undefined) {\n\t\t\tconst paramSchema = this.getParamSchema(longId, paramId);\n\t\t\t\n\t\t\tif (paramSchema)\n\t\t\t\tswitch (paramSchema.type) {\n\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tisAbilityParamNumber(value) &&\n\t\t\t\t\t\t\t(paramSchema.min === undefined || value >= paramSchema.min) && (\n\t\t\t\t\t\t\t\treferenceValue === undefined ?\n\t\t\t\t\t\t\t\t\t(paramSchema.max === undefined || value <= paramSchema.max) :\n\t\t\t\t\t\t\t\t\tvalue <= (referenceValue as AbilityParamNumber)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tisAbilityParamItems(value) &&\n\t\t\t\t\t\t\tvalue.length === new Set(value).size && (\n\t\t\t\t\t\t\t\treferenceValue === undefined ?\n\t\t\t\t\t\t\t\t\tvalue.every(itemId => paramSchema.items.find(({ _id }) => _id === itemId)) :\n\t\t\t\t\t\t\t\t\tvalue.every(itemId => (referenceValue as AbilityParamItems).includes(itemId))\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tadjustParam(paramSchema: AbilityParamSchema, value: AbilityParam) {\n\t\tswitch (paramSchema.type) {\n\t\t\tcase \"number\":\n\t\t\t\treturn (\n\t\t\t\t\tisAbilityParamNumber(value) ?\n\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\tMath.min(\n\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\tparamSchema.max ?? Infinity\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tparamSchema.min ?? 0\n\t\t\t\t\t\t) :\n\t\t\t\t\t\tparamSchema.min ?? 0\n\t\t\t\t) as AbilityParamNumber;\n\t\t\t\n\t\t\tdefault/* paramSchema.type === \"items\" */:\n\t\t\t\treturn (\n\t\t\t\t\tisAbilityParamItems(value) ?\n\t\t\t\t\t\tintersection(paramSchema.items.map(item => item._id), value) :\n\t\t\t\t\t\t[]\n\t\t\t\t) as AbilityParamItems;\n\t\t}\n\t\t\n\t}\n\t\n\tadjust(abilities: GenericAbilities, parent?: AbilitySchema | null): Abilities<AS> {\n\t\tconst adjustedAbilities: GenericAbilities = {};\n\t\t\n\t\tfor (const [ _id, ability ] of Object.entries(abilities) as [ string, Ability ][]) {\n\t\t\tconst schema = this.get(_id, parent);\n\t\t\t\n\t\t\tif (schema)\n\t\t\t\tif (schema.params || schema.abilities) {\n\t\t\t\t\tconst adjustedAbility: AbilityObject = {};\n\t\t\t\t\t\n\t\t\t\t\tif (schema.params)\n\t\t\t\t\t\tif (isAbilityObject(ability))\n\t\t\t\t\t\t\tfor (const paramSchema of schema.params)\n\t\t\t\t\t\t\t\tadjustedAbility[paramSchema._id] = this.adjustParam(paramSchema, ability[paramSchema._id] as AbilityParam);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfor (const paramSchema of schema.params)\n\t\t\t\t\t\t\t\tadjustedAbility[paramSchema._id] = this.getDefaultParam(paramSchema);\n\t\t\t\t\t\n\t\t\t\t\tif (schema.abilities && isAbilityObject(ability))\n\t\t\t\t\t\tObject.assign(\n\t\t\t\t\t\t\tadjustedAbility,\n\t\t\t\t\t\t\tthis.adjust(\n\t\t\t\t\t\t\t\tpick(\n\t\t\t\t\t\t\t\t\tability,\n\t\t\t\t\t\t\t\t\tschema.abilities\n\t\t\t\t\t\t\t\t\t\t.filter(subSchema => !subSchema.top)\n\t\t\t\t\t\t\t\t\t\t.map(subSchema => subSchema._id)\n\t\t\t\t\t\t\t\t) as GenericAbilities,\n\t\t\t\t\t\t\t\tschema\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\tadjustedAbilities[_id] = adjustedAbility;\n\t\t\t\t} else\n\t\t\t\t\tadjustedAbilities[_id] = true;\n\t\t}\n\t\t\n\t\treturn Object.assign(empty(abilities), adjustedAbilities) as Abilities<AS>;\n\t}\n\t\n\tmerge(target: GenericAbilities, source: GenericAbilities, parent?: AbilitySchema | null): Abilities<AS> {\n\t\tif (!parent) {\n\t\t\tthis.adjust(target);\n\t\t\tsource = this.adjust(structuredClone(source));\n\t\t}\n\t\t\n\t\tfor (const [ _id, ability ] of Object.entries(source)) {\n\t\t\tconst schema = this.get(_id, parent);\n\t\t\t\n\t\t\tif (schema && schema.isInheritable !== false)\n\t\t\t\tif (_id in target && (schema.params || schema.abilities)) {\n\t\t\t\t\tconst targetAbility = target[_id] as AbilityObject;\n\t\t\t\t\tconst sourceAbility = ability as AbilityObject;\n\t\t\t\t\t\n\t\t\t\t\tif (schema.params)\n\t\t\t\t\t\tfor (const paramSchema of schema.params)\n\t\t\t\t\t\t\tif (paramSchema.isInheritable !== false)\n\t\t\t\t\t\t\t\tswitch (paramSchema.type) {\n\t\t\t\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\t\t\t\ttargetAbility[paramSchema._id] =\n\t\t\t\t\t\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\t\t\t\t\t\ttargetAbility[paramSchema._id] as AbilityParamNumber,\n\t\t\t\t\t\t\t\t\t\t\t\tsourceAbility[paramSchema._id] as AbilityParamNumber\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\t\t\t\t\tadd(\n\t\t\t\t\t\t\t\t\t\t\ttargetAbility[paramSchema._id] as AbilityParamItems,\n\t\t\t\t\t\t\t\t\t\t\t...sourceAbility[paramSchema._id] as AbilityParamItems\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (schema.abilities)\n\t\t\t\t\t\tthis.merge(targetAbility as GenericAbilities, sourceAbility as GenericAbilities, schema);\n\t\t\t\t} else\n\t\t\t\t\ttarget[_id] = ability;\n\t\t}\n\t\t\n\t\treturn target as Abilities<AS>;\n\t}\n\t\n\thasAbility(abilities: GenericAbilities, longId: string) {\n\t\treturn Boolean(getPath(abilities, longId));\n\t}\n\t\n\tsetAbility(target: GenericAbilities, schema: AbilitySchema): Abilities<AS>;\n\tsetAbility(target: GenericAbilities, longId: string): Abilities<AS>;\n\tsetAbility(target: GenericAbilities, schemaOrLongId: AbilitySchema | string) {\n\t\tconst schema = typeof schemaOrLongId == \"string\" ? this.get(schemaOrLongId) : schemaOrLongId;\n\t\t\n\t\tif (!schema)\n\t\t\tthrow new Error(`No such ability: ${schemaOrLongId}`);\n\t\t\n\t\tthis.merge(target, this.getDefaultAbilities(schema));\n\t\t\n\t\treturn target as Abilities<AS>;\n\t}\n\t\n\tunsetAbility(target: GenericAbilities, schema: AbilitySchema): Abilities<AS>;\n\tunsetAbility(target: GenericAbilities, longId: string): Abilities<AS>;\n\tunsetAbility(target: GenericAbilities, schemaOrLongId: AbilitySchema | string) {\n\t\tconst schema = typeof schemaOrLongId == \"string\" ? this.get(schemaOrLongId) : schemaOrLongId;\n\t\t\n\t\tif (!schema)\n\t\t\tthrow new Error(`No such ability: ${schemaOrLongId}`);\n\t\t\n\t\t(function resolve(_schema) {\n\t\t\tdeletePath(target, _schema.longId);\n\t\t\t\n\t\t\tif (_schema.abilities)\n\t\t\t\tfor (const subSchema of _schema.abilities)\n\t\t\t\t\tresolve(subSchema);\n\t\t\t\n\t\t})(schema);\n\t\t\n\t\treturn target;\n\t}\n\t\n}\n", "import type { AbilitySchema as OriginalAbilitySchema } from \"insite-common\";\n\n\ntype AbilityParamItem = string;\nexport type AbilityParamItems = AbilityParamItem[];\nexport type AbilityParamNumber = number;\nexport type AbilityParam = AbilityParamItems | AbilityParamNumber;\n\nexport type AbilityWithParams = Record<string, AbilityParam>;\nexport type AbilityObject = Record<string, Ability | AbilityParam>;\nexport type AbilityBoolean = true;\nexport type Ability = AbilityBoolean | { [key: string]: Ability | AbilityParam };\n\nexport type AbilitySchema = Omit<OriginalAbilitySchema, \"abilities\"> & {\n\tlevel: number;\n\tlongId: string;\n\tabilities?: AbilitySchema[];\n};\n\nexport type GenericAbilities = Record<string, Ability>;\n\nexport function isAbilityObject(value: Ability): value is AbilityObject {\n\treturn typeof value == \"object\";\n}\n\nexport function isAbilityParamNumber(value: AbilityParam): value is AbilityParamNumber {\n\treturn typeof value == \"number\";\n}\n\nexport function isAbilityParamItems(value: AbilityParam): value is AbilityParamItems {\n\treturn Array.isArray(value);\n}\n", "import { Err } from \"@nesvet/n\";\n\n\nexport class RolesError extends Err {\n\tconstructor(roleId: string, payload?: object);\n\tconstructor(roleIds: string[], payload?: object);\n\tconstructor(stringOrArray: string[] | object | string, payload?: object) {\n\t\tsuper(`User lacks role${Array.isArray(stringOrArray) ? \"s\" : \"\"}`, \"lacksroles\", {\n\t\t\troles: Array.isArray(stringOrArray) ? stringOrArray : [ stringOrArray ],\n\t\t\t...payload\n\t\t});\n\t\t\n\t}\n\t\n\tname = \"RolesError\";\n\t\n}\n", "import {\n\tdebounce,\n\tdeleteProps,\n\tgetAll,\n\tintersection,\n\treAdd,\n\tremoveAll\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport type { CollectionIndexes, WatchedCollection } from \"insite-db\";\nimport type { AbilityParam, GenericAbilities } from \"../abilities/types\";\nimport type { Users } from \"../users\";\nimport { Role } from \"./Role\";\nimport { basisSchema } from \"./schema\";\nimport type { RoleDoc, RolesOptions } from \"./types\";\n\n\nconst indexes: CollectionIndexes = [\n\t[ { involves: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.deleteRole instead.\");\n}\n\n\nexport class Roles<AS extends AbilitiesSchema> extends Map<string, Role<AS>> {\n\tconstructor(users: Users<AS>, options: RolesOptions = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\troot: rootProps,\n\t\t\t...initOptions\n\t\t} = options;\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\tthis.abilities = users.abilities;\n\t\t\n\t\tthis.root = new Role<AS>(this, {\n\t\t\t...rootProps,\n\t\t\t_id: \"root\",\n\t\t\tinvolves: [],\n\t\t\tabilities: this.abilities.getDefaultAbilities(),\n\t\t\ttitle: \"Root\",\n\t\t\tdescription: \"Root\",\n\t\t\tmeta: {},\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t\t\n\t\tthis.initOptions = initOptions;\n\t\t\n\t}\n\t\n\tusers;\n\tcollections;\n\tcollection!: WatchedCollection<RoleDoc> & {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use roles.deleteRole instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use roles.deleteRole instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t};\n\t\n\tabilities;\n\troot;\n\tprivate initOptions?;\n\t\n\t#isInited = false;\n\t\n\tasync init() {\n\t\t\n\t\tif (!this.#isInited) {\n\t\t\tthis.#isInited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\tschema: customSchema,\n\t\t\t\tindexes: customIndexes\n\t\t\t} = this.initOptions!;\n\t\t\t\n\t\t\tif (customSchema) {\n\t\t\t\tif (customSchema.required)\n\t\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\t\tif (customSchema.properties)\n\t\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t\t}\n\t\t\t\n\t\t\tconst jsonSchema = {\n\t\t\t\t...basisSchema,\n\t\t\t\t...customSchema,\n\t\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t\t};\n\t\t\t\n\t\t\tthis.collection = Object.assign(\n\t\t\t\tawait this.collections.ensure<RoleDoc>(\"roles\", { jsonSchema }),\n\t\t\t\t{\n\t\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t\t\n\t\t\tfor (const roleDoc of await this.collection.find().toArray()) {\n\t\t\t\tif (this.abilities.adjust(roleDoc.abilities))\n\t\t\t\t\tawait this.collection.updateOne({ _id: roleDoc._id }, { $set: { abilities: roleDoc.abilities } });\n\t\t\t\t\n\t\t\t\tthis.load(roleDoc);\n\t\t\t}\n\t\t\t\n\t\t\tthis.update();\n\t\t\t\n\t\t\tthis.collection.changeListeners.add(next => {\n\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\tcase \"insert\": {\n\t\t\t\t\t\tconst role = new Role<AS>(this, next.fullDocument);\n\t\t\t\t\t\tthis.users.emit(\"roles-role-update\", role, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\t\tthis.users.emit(\"roles-role-update\", null, next);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\t\n\t\t\tdelete this.initOptions;\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.updateMany({ meta: { $exists: false } }, { $set: { meta: {} } });\n\t\t\n\t}\n\t\n\tload(roleDoc: RoleDoc) {\n\t\tnew Role<AS>(this, roleDoc);\n\t\t\n\t}\n\t\n\tresolve(role: Role<AS>, involvedBy: Role<AS>[]) {\n\t\tinvolvedBy = [ role, ...involvedBy ];\n\t\t\n\t\tfor (const involvedRoleId of role.ownInvolveIds) {\n\t\t\tconst involvedRole = this.get(involvedRoleId);\n\t\t\tif (involvedRole) {\n\t\t\t\tfor (const involvedByRole of involvedBy) {\n\t\t\t\t\treAdd(involvedByRole.involves, involvedRole);\n\t\t\t\t\tthis.abilities.merge(involvedByRole.inheritedAbilities as GenericAbilities, involvedRole.abilities as GenericAbilities);\n\t\t\t\t}\n\t\t\t\tif (involvedRole !== role)\n\t\t\t\t\tthis.resolve(involvedRole, involvedBy);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tsorted: Role<AS>[] = [];\n\t\n\t#sortRoles(a: Role<AS>, b: Role<AS>) {\n\t\treturn (\n\t\t\t(b.involves.size - a.involves.size) || (\n\t\t\t\t(a.title && b.title) ?\n\t\t\t\t\ta.title > b.title ? 1 : a.title < b.title ? -1 : 0 :\n\t\t\t\t\ta.title ?\n\t\t\t\t\t\t-1 :\n\t\t\t\t\t\tb.title ?\n\t\t\t\t\t\t\t1 :\n\t\t\t\t\t\t\ta._id > b._id ?\n\t\t\t\t\t\t\t\t1 :\n\t\t\t\t\t\t\t\ta._id < b._id ?\n\t\t\t\t\t\t\t\t\t-1 :\n\t\t\t\t\t\t\t\t\t0\n\t\t\t)\n\t\t);\n\t}\n\t\n\tupdate() {\n\t\t\n\t\tconst array = [ ...this.values() ];\n\t\t\n\t\tthis.root.ownInvolveIds = [];\n\t\tfor (const role of array) {\n\t\t\tif (role !== this.root && !array.some(anotherRole => anotherRole.ownInvolveIds.includes(role._id)))\n\t\t\t\tthis.root.ownInvolveIds.push(role._id);\n\t\t\trole.involves.clear();\n\t\t\trole.abilities = structuredClone(role.ownAbilities);\n\t\t\trole.inheritedAbilities = {};\n\t\t}\n\t\t\n\t\tthis.root.involves.add(this.root);\n\t\tthis.resolve(this.root, []);\n\t\t\n\t\tfor (const role of array)\n\t\t\trole.ownInvolves = getAll(this, role.ownInvolveIds, true).sort(this.#sortRoles).reverse();\n\t\t\n\t\tconst sorted = [ this.root ];\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst role = sorted[i];\n\t\t\tfor (const involvedRole of role.ownInvolves) {\n\t\t\t\tconst involvedRoleIndex = sorted.indexOf(involvedRole);\n\t\t\t\tif (~involvedRoleIndex) {\n\t\t\t\t\tsorted.splice(involvedRoleIndex, 1);\n\t\t\t\t\ti--;\n\t\t\t\t}\n\t\t\t\tsorted.splice(i + 1, 0, involvedRole);\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet _o = 0;\n\t\tfor (const role of sorted) {\n\t\t\tthis.abilities.merge(role.abilities as GenericAbilities, role.inheritedAbilities as GenericAbilities);\n\t\t\trole._o = _o++;\n\t\t}\n\t\t\n\t\tthis.sorted = sorted;\n\t\t\n\t\tthis.users.emit(\"roles-update\");\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.users.updateDebounced.clear();\n\t\t\tthis.users.update(true);\n\t\t}\n\t\t\n\t}\n\t\n\tupdateDebounced = debounce(this.update, 100);\n\t\n\tcreate({ _id, involves, title, description, ...restProps }: Omit<RoleDoc, \"abilities\" | \"createdAt\">) {\n\t\treturn this.collection.insertOne({\n\t\t\t_id,\n\t\t\tinvolves: involves || [],\n\t\t\tabilities: {},\n\t\t\ttitle: title ?? \"\",\n\t\t\tdescription: description ?? \"\",\n\t\t\tmeta: {},\n\t\t\t...deleteProps(restProps, [ \"abilities\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tasync updateRole(roleId: string, updates: Omit<RoleDoc, \"abilities\" | \"createdAt\">) {\n\t\tconst role = this.get(roleId);\n\t\t\n\t\tif (!role)\n\t\t\treturn false;\n\t\t\n\t\tif (updates.involves) {\n\t\t\tremoveAll(updates.involves, [ roleId ]);\n\t\t\t\n\t\t\tfor (const involvedRoleId of updates.involves)\n\t\t\t\tif (this.get(involvedRoleId)?.involves.has(role))\n\t\t\t\t\tremoveAll(updates.involves, [ involvedRoleId ]);\n\t\t\t\n\t\t\tupdates.involves = this.cleanUpIds(updates.involves);\n\t\t}\n\t\t\n\t\tawait this.collection.updateOne({ _id: roleId }, { $set: updates });\n\t\t\n\t\treturn true;\n\t}\n\t\n\tdeleteRole(role: Role<AS> | string) {\n\t\tconst _id = typeof role == \"string\" ? role : role._id;\n\t\t\n\t\treturn this.collection.bulkWrite([\n\t\t\t{ updateMany: { filter: { involves: _id }, update: { $pullAll: { involves: [ _id ] } } } },\n\t\t\t{ deleteOne: { filter: { _id } } }\n\t\t]);\n\t}\n\t\n\tcleanUpIds(ids: string[]) {\n\t\tconst roles = intersection(this.sorted, getAll(this, ids, true));\n\t\t\n\t\tconst cleanedUpIds = [];\n\t\t\n\t\tfor (const role of roles)\n\t\t\tif (roles.every(anotherRole => anotherRole === role || !anotherRole.involves.has(role)))\n\t\t\t\tcleanedUpIds.push(role._id);\n\t\t\n\t\treturn cleanedUpIds;\n\t}\n\t\n\tasync setAbility(roleId: string, abilityLongId: string, set: boolean) {\n\t\tconst role = this.get(roleId);\n\t\t\n\t\tif (!role)\n\t\t\treturn false;\n\t\t\n\t\tawait this.collection.updateOne({ _id: roleId }, { $set: {\n\t\t\tabilities:\n\t\t\t\tset ?\n\t\t\t\t\tthis.abilities.setAbility(role.ownAbilities, abilityLongId) :\n\t\t\t\t\tthis.abilities.unsetAbility(role.ownAbilities, abilityLongId)\n\t\t} });\n\t\t\n\t\treturn true;\n\t}\n\t\n\tasync setAbilityParam(roleId: string, abilityLongId: string, paramId: string, value: AbilityParam) {\n\t\tconst role = this.get(roleId);\n\t\t\n\t\tif (!role)\n\t\t\treturn false;\n\t\t\n\t\tawait this.collection.updateOne({ _id: roleId }, { $set: {\n\t\t\tabilities: this.abilities.setParam(role.ownAbilities, abilityLongId, paramId, value)\n\t\t} });\n\t\t\n\t\treturn true;\n\t}\n\t\n}\n", "import type { Abilities, AbilitiesSchema } from \"insite-common\";\nimport type { ChangeStreamDocument } from \"insite-db\";\nimport { Roles } from \"./Roles\";\nimport { RoleDoc } from \"./types\";\n\n\nconst snapshots = new Map();\n\n\nexport class Role<AS extends AbilitiesSchema> {\n\tconstructor(roles: Roles<AS>, roleDoc: RoleDoc) {\n\t\tthis.#roles = roles;\n\t\t\n\t\tthis._id = roleDoc._id;\n\t\troles.set(this._id, this);\n\t\t\n\t\tthis.update(roleDoc);\n\t\t\n\t}\n\t\n\t#roles;\n\t\n\t_id;\n\townInvolveIds!: string[];\n\townAbilities!: Abilities<AS>;\n\ttitle = \"\";\n\tdisplayTitle = \"\";\n\t_o = 0;\n\t\n\townInvolves: Role<AS>[] = [];\n\tinvolves = new Set<Role<AS>>();\n\tabilities: Abilities<AS> = {};\n\tinheritedAbilities: Abilities<AS> = {};\n\t\n\tupdate({ _id, involves: ownInvolveIds, abilities: ownAbilities, title, ...restProps }: Partial<RoleDoc>, next?: ChangeStreamDocument<RoleDoc>) {\n\t\tObject.assign(this, restProps);\n\t\t\n\t\tif (ownInvolveIds)\n\t\t\tthis.ownInvolveIds = ownInvolveIds;\n\t\t\n\t\tif (ownAbilities)\n\t\t\tthis.ownAbilities = ownAbilities as Abilities<AS>;\n\t\t\n\t\tif (title !== undefined) {\n\t\t\tthis.title = title;\n\t\t\tthis.displayTitle = title || this._id;\n\t\t}\n\t\t\n\t\tif (ownInvolveIds || ownAbilities) {\n\t\t\tconst snapshot = [\n\t\t\t\tthis.ownInvolveIds.join(\",\"),\n\t\t\t\tJSON.stringify(this.ownAbilities)\n\t\t\t].join(\"\\n\");\n\t\t\t\n\t\t\tif (snapshot !== snapshots.get(this._id)) {\n\t\t\t\tsnapshots.set(this._id, snapshot);\n\t\t\t\t\n\t\t\t\tif (this.#roles.users.isInited)\n\t\t\t\t\tthis.#roles.updateDebounced()\n\t\t\t\t\t\t.then(() => this.#roles.users.emit(\"roles-role-update\", this, next));\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tthis.#roles.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\tthis.#roles.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "export const regexps = {\n\t_id: /^[\\dA-Fa-f]{24}$/,\n\temail: /^[^\\s@]{1,63}@[^\\s@]{1,63}\\.[^\\s@]{1,63}$/,\n\targon2: /^\\$argon2(?:i|d|id)\\$v=\\d+\\$m=\\d+,t=\\d+,p=\\d+(?:\\$[\\d+/A-Za-z]+){2}$/,\n\tsessionId: /^[\\dA-Fa-f]{16,32}\\$[\\dA-Fa-f]{16,32}$/,\n\trole: /^[\\d_a-z-]{1,64}$/,\n\tip: /^(?:\\d{1,3}\\.){3}\\d{1,3}$/\n};\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"involves\",\n\t\t\"abilities\",\n\t\t\"title\",\n\t\t\"description\",\n\t\t\"meta\",\n\t\t\"createdAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.role.source,\n\t\t\tnot: { enum: [ \"root\" ] }\n\t\t},\n\t\tinvolves: {\n\t\t\tbsonType: \"array\",\n\t\t\tuniqueItems: true,\n\t\t\titems: {\n\t\t\t\tbsonType: \"string\",\n\t\t\t\tpattern: regexps.role.source,\n\t\t\t\tnot: { enum: [ \"root\" ] }\n\t\t\t},\n\t\t\tadditionalItems: false\n\t\t},\n\t\tabilities: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\ttitle: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 256\n\t\t},\n\t\tdescription: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 10240\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import { Err } from \"@nesvet/n\";\n\n\ntype Type = \"_id\" | \"permissiveIds\" | \"slaveIds\";\n\n\nexport class SubordinationError extends Err {\n\tconstructor(payload?: object);\n\tconstructor(type: Type, payload?: object);\n\tconstructor(type: Type, ids: string[] | string, payload?: object);\n\tconstructor(type?: Type | object, ids?: string[] | object | string, payload?: object) {\n\t\tswitch (arguments.length) {\n\t\t\tcase 1:\n\t\t\t\tpayload = type as object;\n\t\t\t\ttype = undefined;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 2:\n\t\t\t\tpayload = ids as object;\n\t\t\t\tids = undefined;\n\t\t}\n\t\t\n\t\tsuper(\"Insubordination attempt\", \"subordination\", {\n\t\t\t...type && { type },\n\t\t\t...ids && { ids: Array.isArray(ids) ? ids : [ ids ] },\n\t\t\t...payload\n\t\t});\n\t\t\n\t}\n\t\n\tname = \"SubordinationError\";\n\t\n}\n\nexport class PermissionError extends Err {\n\tconstructor(payload?: object) {\n\t\tsuper(\"Insufficient permissions\", \"permissions\", payload);\n\t\t\n\t}\n\t\n\tname = \"PermissionError\";\n\t\n}\n\n", "import * as argon2 from \"argon2\";\nimport EventEmitter from \"eventemitter3\";\nimport {\n\t_ids,\n\tdebounce,\n\tdeleteProps,\n\tremoveAll,\n\tStatefulPromise,\n\twithout\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport {\n\tCollectionIndexes,\n\tCollections,\n\tCollectionSchema,\n\tnewObjectIdString,\n\tWatchedCollection\n} from \"insite-db\";\nimport { AbilitiesMap } from \"../abilities\";\nimport { Orgs } from \"../orgs\";\nimport { Org } from \"../orgs/Org\";\nimport { Roles } from \"../roles\";\nimport { Sessions } from \"../sessions\";\nimport { Session } from \"../sessions/Session\";\nimport type { OrgsOptions } from \"../orgs/types\";\nimport type { RolesOptions } from \"../roles/types\";\nimport type { SessionDoc, SessionsOptions } from \"../sessions/types\";\nimport { Avatars/* , AvatarsOptions */ } from \"./avatars\";\nimport { basisSchema } from \"./schema\";\nimport { User } from \"./User\";\nimport type { UserDoc } from \"./types\";\n\n\nconst indexes: CollectionIndexes = [\n\t[ { email: 1 }, { unique: true } ],\n\t[ { org: 1 } ]\n];\n\n\nexport type Options<AS> = {\n\tabilities: AS;\n\tindexes?: CollectionIndexes;\n\tschema?: CollectionSchema;\n\tinitialRoot?: Partial<UserDoc>;\n\troles?: RolesOptions;\n\torgs?: OrgsOptions;\n\tsessions?: SessionsOptions;\n\t// avatars?: AvatarsOptions;\n};\n\n\nexport class Users<AS extends AbilitiesSchema> extends Map<string, User<AS>> {\n\tconstructor(collections: Collections, options: Options<AS>) {\n\t\tsuper();\n\t\t\n\t\tconst eventEmitter = new EventEmitter() as EventEmitter & {\n\t\t\t_events: Record<string, object>;\n\t\t\t_eventsCount: number;\n\t\t};\n\t\tthis._events = eventEmitter._events;\n\t\tthis._eventsCount = eventEmitter._eventsCount;\n\t\tthis.emit = eventEmitter.emit;\n\t\tthis.on = eventEmitter.on;\n\t\tthis.once = eventEmitter.once;\n\t\tthis.addListener = eventEmitter.addListener;\n\t\tthis.off = eventEmitter.off;\n\t\tthis.removeListener = eventEmitter.removeListener;\n\t\t\n\t\tthis.collections = collections;\n\t\t\n\t\tthis.abilities = new AbilitiesMap<AS>(options.abilities);\n\t\t\n\t\tthis.initOptions = options;\n\t\t\n\t\tthis.init();\n\t\t\n\t}\n\t\n\t_events;\n\t_eventsCount;\n\temit;\n\ton;\n\tonce;\n\taddListener;\n\toff;\n\tremoveListener;\n\t\n\tprivate initOptions?;\n\t\n\tcollections;\n\tabilities;\n\t\n\tcollection!: WatchedCollection<UserDoc>;\n\troles!: Roles<AS>;\n\tsessions!: Sessions<AS>;\n\torgs!: Orgs<AS>;\n\tavatars!: Avatars<AS>;\n\t\n\tbyEmail = new Map();\n\tbySessionId = new Map();\n\tsorted: User<AS>[] = [];\n\t\n\tisSortRequired = false;\n\t\n\t#isPreinited = false;\n\t\n\tasync preinit() {\n\t\t\n\t\tif (!this.#isPreinited) {\n\t\t\tthis.#isPreinited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\tindexes: customIndexes,\n\t\t\t\tschema: customSchema,\n\t\t\t\tinitialRoot: initialRootProps\n\t\t\t\t// avatars: avatarsOptions\n\t\t\t} = this.initOptions!;\n\t\t\t\n\t\t\tif (customSchema) {\n\t\t\t\tif (customSchema.required)\n\t\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\t\tif (customSchema.properties)\n\t\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t\t}\n\t\t\t\n\t\t\tconst jsonSchema = {\n\t\t\t\t...basisSchema,\n\t\t\t\t...customSchema,\n\t\t\t\trequired: [ ...basisSchema.required as string [], ...customSchema?.required as string[] ?? [] ],\n\t\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t\t};\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure<UserDoc>(\"users\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tif (!await this.collection.countDocuments({ roles: \"root\" }))\n\t\t\t\tawait this.create({\n\t\t\t\t\temail: process.env.INSITE_ROOT_EMAIL ?? \"insite@root.email\",\n\t\t\t\t\tpassword: process.env.INSITE_ROOT_PASSWORD ?? \"inSiteRootPassword\",\n\t\t\t\t\tname: { first: \"Root\" },\n\t\t\t\t\tjob: \"Root\",\n\t\t\t\t\t...initialRootProps,\n\t\t\t\t\troles: [ \"root\" ],\n\t\t\t\t\torg: null,\n\t\t\t\t\tmeta: {}\n\t\t\t\t});\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t\t\n\t\t\tfor (const userDoc of await this.collection.find().toArray())\n\t\t\t\tthis.load(userDoc);\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.updateMany({ meta: { $exists: false } }, { $set: { meta: {} } });\n\t\t\n\t}\n\t\n\tisInited = false;\n\t\n\tprotected async init() {\n\t\t\n\t\tif (!this.isInited) {\n\t\t\tthis.isInited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\troles: rolesOptions,\n\t\t\t\torgs: orgsOptions,\n\t\t\t\tsessions: sessionsOptions\n\t\t\t\t// avatars: avatarsOptions\n\t\t\t} = this.initOptions!;\n\t\t\t\n\t\t\tthis.roles = new Roles<AS>(this, rolesOptions);\n\t\t\tthis.orgs = new Orgs<AS>(this, orgsOptions);\n\t\t\tthis.sessions = new Sessions<AS>(this, sessionsOptions);\n\t\t\tthis.avatars = new Avatars<AS>(this/* , avatarsOptions */);\n\t\t\t\n\t\t\tawait this.roles.init();\n\t\t\tawait this.orgs.preinit();\n\t\t\tawait this.preinit();\n\t\t\tawait this.orgs.init();\n\t\t\tawait this.avatars.init();\n\t\t\t\n\t\t\tthis.update(true);\n\t\t\t\n\t\t\tthis.collection.changeListeners.add(next => {\n\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\tnew User<AS>(this, next.fullDocument);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\t\n\t\t\tawait this.sessions.init();\n\t\t\t\n\t\t\tdelete this.initOptions;\n\t\t\t\n\t\t\tthis.#initPromise.resolve(this);\n\t\t}\n\t\t\n\t}\n\t\n\t\n\tload(userDoc: UserDoc) {\n\t\tnew User<AS>(this, userDoc);\n\t\t\n\t}\n\t\n\tsort() {\n\t\t\n\t\tthis.isSortRequired = false;\n\t\t\n\t\tthis.sorted = [ ...this.values() ].sort((a, b) => a.name.last > b.name.last ? 1 : a.name.last < b.name.last ? -1 : 0);\n\t\t\n\t}\n\t\n\tsortDebounced = debounce(() => this.sort(), 250);\n\t\n\tupdate(shouldUpdateRoles?: boolean) {\n\t\tif (shouldUpdateRoles)\n\t\t\tfor (const user of this.values())\n\t\t\t\tuser.updateRoles();\n\t\t\n\t\tfor (const user of this.values())\n\t\t\tuser.updatePermissions();\n\t\t\n\t\tif (this.isSortRequired)\n\t\t\tthis.sort();\n\t\t\n\t}\n\t\n\tupdateDebounced = debounce(() => this.update(), 250);\n\t\n\t#initPromise = new StatefulPromise<this>();\n\t\n\twhenReady() {\n\t\treturn this.#initPromise;\n\t}\n\t\n\tasync create({ email, password, roles, name, org, job, ...restProps }: Omit<UserDoc, \"_id\" | \"createdAt\">) {\n\t\tif (this.byEmail.has(email))\n\t\t\tthrow new Error(\"User exists\");\n\t\t\n\t\tawait this.collection.insertOne({\n\t\t\t_id: newObjectIdString(),\n\t\t\temail,\n\t\t\tpassword: await argon2.hash(password),\n\t\t\troles: this.isInited ? this.roles.cleanUpIds(roles) : roles,\n\t\t\tname: {\n\t\t\t\tfirst: name.first ?? \"\",\n\t\t\t\tmiddle: name.middle ?? \"\",\n\t\t\t\tlast: name.last ?? \"\"\n\t\t\t},\n\t\t\torg: org ?? null,\n\t\t\tjob: job ?? \"\",\n\t\t\tmeta: {},\n\t\t\t...deleteProps(restProps, [ \"_id\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t\t\n\t\treturn true;\n\t}\n\t\n\tasync updateUser(_id: string, updates: Omit<UserDoc, \"_id\" | \"createdAt\">, byUser?: User<AS>) {\n\t\tconst user = this.get(_id)!;\n\t\t\n\t\tif (!user)\n\t\t\treturn false;\n\t\t\n\t\tif (updates.roles)\n\t\t\tupdates.roles =\n\t\t\t\tuser.isRoot ?\n\t\t\t\t\t[ \"root\" ] :\n\t\t\t\t\tthis.roles.cleanUpIds(\n\t\t\t\t\t\tbyUser ?\n\t\t\t\t\t\t\twithout(user.ownRoleIds, byUser.slaveRoleIds).concat(updates.roles) :\n\t\t\t\t\t\t\tupdates.roles\n\t\t\t\t\t);\n\t\t\n\t\tawait this.collection.updateOne({ _id }, { $set: updates });\n\t\t\n\t\treturn true;\n\t}\n\t\n\tasync changePassword(_id: string, newPassword: string) {\n\t\tif (!this.has(_id))\n\t\t\tthrow new Error(\"usernotfound\");\n\t\t\n\t\tif (!newPassword)\n\t\t\tthrow new Error(\"emptypasswordisnotallowed\");\n\t\t\n\t\tawait Promise.all([\n\t\t\tthis.collection.updateOne({ _id }, { $set: { password: await argon2.hash(newPassword) } }),\n\t\t\tthis.sessions.collection.deleteMany({ user: _id })\n\t\t]);\n\t\t\n\t}\n\t\n\tasync login(email: string, password: string, sessionProps: Partial<SessionDoc>) {\n\t\tconst user = this.byEmail.get(email);\n\t\t\n\t\tif (!user)\n\t\t\tthrow new Error(\"usernotfound\");\n\t\t\n\t\tif (!await argon2.verify(user.password, password))\n\t\t\tthrow new Error(\"incorrectpassword\");\n\t\t\n\t\tif (!user.abilities.login)\n\t\t\tthrow new Error(\"userisnotabletologin\");\n\t\t\n\t\treturn this.sessions.create(user, sessionProps);\n\t}\n\t\n\tlogout(session: Session<AS>) {\n\t\tsession.delete();\n\t\t\n\t\treturn this.sessions.collection.deleteOne({ _id: session._id });\n\t}\n\t\n\t#sortUsersAndOrgs(a: Org<AS> | User<AS>, b: Org<AS> | User<AS>) {\n\t\treturn (\n\t\t\t(a instanceof User && b instanceof User) ?\n\t\t\t\t(a.name.last && b.name.last) ?\n\t\t\t\t\ta.name.last > b.name.last ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta.name.last < b.name.last ? -1 : 0 :\n\t\t\t\t\t(!a.name.last && !b.name.last) ?\n\t\t\t\t\t\ta.displayLabel > b.displayLabel ?\n\t\t\t\t\t\t\t1 :\n\t\t\t\t\t\t\ta.displayLabel < b.displayLabel ? -1 : 0 :\n\t\t\t\t\t\ta.name.last ? -1 : 1 :\n\t\t\t\t(a instanceof Org && b instanceof Org) ?\n\t\t\t\t\ta.title > b.title ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta.title < b.title ? -1 : 0 :\n\t\t\t\t\ta instanceof Org ? -1 : 1\n\t\t);\n\t}\n\t\n\tsortIds(ids: string[]) {\n\t\treturn _ids((\n\t\t\tids\n\t\t\t\t.map(_id => this.get(_id) || this.orgs.get(_id))\n\t\t\t\t.filter(Boolean) as (Org<AS> | User<AS>)[]\n\t\t).sort(this.#sortUsersAndOrgs));\n\t}\n\t\n\treplaceMap = new Map<string, string>();\n\t\n\treplaceHandlers = new Set<(fromId: string, toId: string | null) => Promise<void> | void>();\n\t\n\tasync replace(fromId: string) {\n\t\tconst toId = this.replaceMap.get(fromId) ?? null;\n\t\tif (toId)\n\t\t\tthis.replaceMap.delete(fromId);\n\t\t\n\t\tfor (const handler of this.replaceHandlers)\n\t\t\tawait handler(fromId, toId);\n\t\t\n\t}\n\t\n\tasync deleteUser(_id: string) {\n\t\tconst { deletedCount } = await this.collection.deleteOne({ _id });\n\t\t\n\t\treturn Boolean(deletedCount);\n\t}\n\t\n\t\n\tstatic init<IAS extends AbilitiesSchema>(collections: Collections, options: Options<IAS>) {\n\t\tconst users = new Users(collections, options);\n\t\t\n\t\treturn users.whenReady();\n\t}\n\t\n}\n", "import {\n\t_ids,\n\tdebounce,\n\tdeleteProps,\n\tEmptyArray,\n\tEmptySet,\n\tremoveAll,\n\tsort,\n\tunion,\n\twithout\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport { CollectionIndexes, newObjectIdString, WatchedCollection } from \"insite-db\";\nimport type { User, Users } from \"../users\";\nimport { Org } from \"./Org\";\nimport { basisSchema } from \"./schema\";\nimport type { OrgDoc, OrgsOptions } from \"./types\";\n\n\nconst indexes: CollectionIndexes = [\n\t[ { owners: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of orgs collection.deleteOne or .deleteMany is forbidden. Use orgs.deleteOrg instead.\");\n}\n\n\nexport class Orgs<AS extends AbilitiesSchema> extends Map<string, Org<AS>> {\n\tconstructor(users: Users<AS>, options: OrgsOptions = {}) {\n\t\tsuper();\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tthis.preinitOptions = options;\n\t\t\n\t}\n\t\n\tusers;\n\tcollections;\n\tprivate preinitOptions?;\n\t\n\tcollection!: WatchedCollection<OrgDoc> & {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use orgs.deleteOrg instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use orgs.deleteOrg instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t};\n\t\n\tnull!: Org<AS> & { _id: null };\n\t\n\t#isPreinited = false;\n\t\n\tasync preinit() {\n\t\t\n\t\tif (!this.#isPreinited) {\n\t\t\tthis.#isPreinited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\tschema: customSchema,\n\t\t\t\tindexes: customIndexes,\n\t\t\t\tnull: nullProps\n\t\t\t} = this.preinitOptions!;\n\t\t\t\n\t\t\tif (customSchema) {\n\t\t\t\tif (customSchema.required)\n\t\t\t\t\tremoveAll(customSchema.required as string [], basisSchema.required as string[]);\n\t\t\t\tif (customSchema.properties)\n\t\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t\t}\n\t\t\t\n\t\t\tconst jsonSchema = {\n\t\t\t\t...basisSchema,\n\t\t\t\t...customSchema,\n\t\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t\t};\n\t\t\t\n\t\t\tthis.collection = Object.assign(\n\t\t\t\tawait this.collections.ensure<OrgDoc>(\"orgs\", { jsonSchema }),\n\t\t\t\t{\n\t\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tthis.null = Object.assign(\n\t\t\t\tnew Org<AS>(this, {\n\t\t\t\t\t...nullProps,\n\t\t\t\t\t_id: \"\",\n\t\t\t\t\ttitle: \"\",\n\t\t\t\t\tnote: \"\",\n\t\t\t\t\towners: [],\n\t\t\t\t\tmeta: {},\n\t\t\t\t\tcreatedAt: Date.now()\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\t_id: null,\n\t\t\t\t\townerIds: new EmptyArray(),\n\t\t\t\t\townerOrgs: new EmptySet(),\n\t\t\t\t\townerUsers: new EmptySet(),\n\t\t\t\t\tslaveOrgs: new EmptySet()\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t\t\n\t\t\tfor (const orgDoc of await this.collection.find().toArray())\n\t\t\t\tthis.load(orgDoc);\n\t\t\t\n\t\t\tdelete this.preinitOptions;\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.updateMany({ meta: { $exists: false } }, { $set: { meta: {} } });\n\t\t\n\t}\n\t\n\t#isInited = false;\n\t\n\tinit() {\n\t\t\n\t\tif (!this.#isInited) {\n\t\t\tthis.#isInited = true;\n\t\t\t\n\t\t\tthis.update();\n\t\t\t\n\t\t\tthis.collection.changeListeners.add(next => {\n\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\tcase \"insert\": {\n\t\t\t\t\t\tconst org = new Org<AS>(this, next.fullDocument);\n\t\t\t\t\t\tthis.users.emit(\"orgs-org-update\", org, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\t\tthis.users.emit(\"orgs-org-update\", null, next);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\t\n\tload(orgDoc: OrgDoc) {\n\t\tnew Org<AS>(this, orgDoc);\n\t\t\n\t}\n\t\n\t#resolve(org: Org<AS>, slaveOrgs: Org<AS>[]) {\n\t\tslaveOrgs = [ org, ...slaveOrgs ];\n\t\t\n\t\tfor (const ownerOrg of org.ownerOrgs) {\n\t\t\tthis.#resolve(ownerOrg, slaveOrgs);\n\t\t\tfor (const slaveOrg of slaveOrgs)\n\t\t\t\townerOrg.slaveOrgs.add(slaveOrg);\n\t\t}\n\t\t\n\t}\n\t\n\tsorted: Org<AS>[] = [];\n\t\n\tupdate() {\n\t\t\n\t\tconst array = [ ...this.values() ];\n\t\tconst sorted = [];\n\t\t\n\t\tfor (const org of array) {\n\t\t\torg.ownerOrgs.clear();\n\t\t\torg.ownerUsers.clear();\n\t\t\torg.slaveOrgs.clear();\n\t\t\t\n\t\t\tfor (const ownerId of org.ownerIds) {\n\t\t\t\tconst ownerOrg = this.get(ownerId);\n\t\t\t\tif (ownerOrg)\n\t\t\t\t\torg.ownerOrgs.add(ownerOrg);\n\t\t\t\telse {\n\t\t\t\t\tconst ownerUser = this.users.get(ownerId);\n\t\t\t\t\tif (ownerUser)\n\t\t\t\t\t\torg.ownerUsers.add(ownerUser);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!org.ownerOrgs.size && org._id)\n\t\t\t\tsorted.push(org);\n\t\t}\n\t\t\n\t\tfor (const org of array)\n\t\t\tif (!array.some(anotherOrg => anotherOrg.ownerOrgs.has(org)))\n\t\t\t\tthis.#resolve(org, []);\n\t\t\n\t\tsorted.sort(this.#sortOrgs);\n\t\tfor (const org of array)\n\t\t\tsort(org.slaveOrgs, this.#sortOrgs);\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst org = sorted[i];\n\t\t\tfor (const slaveOrg of [ ...org.slaveOrgs ].reverse())\n\t\t\t\tif (slaveOrg.ownerOrgs.has(org)) {\n\t\t\t\t\tconst slaveOrgIndex = sorted.indexOf(slaveOrg);\n\t\t\t\t\tif (~slaveOrgIndex) {\n\t\t\t\t\t\tsorted.splice(slaveOrgIndex, 1);\n\t\t\t\t\t\ti--;\n\t\t\t\t\t}\n\t\t\t\t\tsorted.splice(i + 1, 0, slaveOrg);\n\t\t\t\t}\n\t\t}\n\t\tfor (let o = 0, { length } = sorted; o < length;)\n\t\t\tsorted[o]._o = o++;\n\t\t\n\t\tthis.sorted = sorted;\n\t\t\n\t\tthis.users.emit(\"orgs-update\");\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.users.updateDebounced.clear();\n\t\t\tthis.users.update();\n\t\t}\n\t\t\n\t}\n\t\n\t#sortOrgs(a: Org<AS>, b: Org<AS>) {\n\t\treturn (\n\t\t\t(b.slaveOrgs.size - a.slaveOrgs.size) || (\n\t\t\t\ta.title > b.title ?\n\t\t\t\t\t1 :\n\t\t\t\t\ta.title < b.title ?\n\t\t\t\t\t\t-1 :\n\t\t\t\t\t\t0\n\t\t\t)\n\t\t);\n\t}\n\t\n\tupdateDebounced = debounce(this.update, 250);\n\t\n\tcreate({ title, note, ...restProps }: Omit<OrgDoc, \"_id\" | \"createdAt\" | \"owners\">, ownerId?: string) {\n\t\treturn this.collection.insertOne({\n\t\t\t_id: newObjectIdString(),\n\t\t\ttitle: title ?? \"\",\n\t\t\tnote: note ?? \"\",\n\t\t\towners: ownerId ? [ ownerId ] : [],\n\t\t\tmeta: {},\n\t\t\t...deleteProps(restProps, [ \"_id\", \"owners\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tasync updateOrg(_id: string, updates: Omit<OrgDoc, \"_id\" | \"createdAt\">, byUser?: User<AS>) {\n\t\tconst org = this.get(_id)!;\n\t\t\n\t\tif (!org)\n\t\t\treturn false;\n\t\t\n\t\tif (updates.owners)\n\t\t\tupdates.owners =\n\t\t\t\tthis.users.sortIds(\n\t\t\t\t\tunion(\n\t\t\t\t\t\tbyUser ?\n\t\t\t\t\t\t\twithout(org.ownerIds, byUser.slaveIds) :\n\t\t\t\t\t\t\t[],\n\t\t\t\t\t\twithout(updates.owners, [ _id, ..._ids(org.slaveOrgs) ])\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\n\t\tawait this.collection.updateOne({ _id }, { $set: updates });\n\t\t\n\t\treturn true;\n\t}\n\t\n\tdeleteOrg(org: Org<AS> | string) {\n\t\tconst _id = typeof org == \"string\" ? org : org._id;\n\t\t\n\t\treturn this.collection.bulkWrite([\n\t\t\t{ updateMany: { filter: { owners: _id }, update: { $pullAll: { owners: [ _id ] } } } },\n\t\t\t{ deleteOne: { filter: { _id } } }\n\t\t]);\n\t}\n\t\n\treplaceMap = new Map<string, string>();\n\t\n\treplaceHandlers = new Set<(fromId: string, toId: string | null) => Promise<void> | void>();\n\t\n\tasync replace(fromId: string) {\n\t\tconst toId = this.replaceMap.get(fromId) ?? null;\n\t\tif (toId)\n\t\t\tthis.replaceMap.delete(fromId);\n\t\t\n\t\tfor (const handler of this.replaceHandlers)\n\t\t\tawait handler(fromId, toId);\n\t\t\n\t}\n\t\n}\n", "import type { AbilitiesSchema } from \"insite-common\";\nimport type { ChangeStreamDocument } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { Orgs } from \"./Orgs\";\nimport type { OrgDoc } from \"./types\";\n\n\nconst snapshots = new Map();\n\n\nexport class Org<AS extends AbilitiesSchema> {\n\tconstructor(orgs: Orgs<AS>, orgDoc: OrgDoc) {\n\t\tthis.orgs = orgs;\n\t\t\n\t\tthis._id = orgDoc._id;\n\t\torgs.set(this._id, this);\n\t\t\n\t\tthis.update(orgDoc);\n\t\t\n\t}\n\t\n\t_id;\n\ttitle = \"\";\n\tinitials = \"\";\n\tdisplayLabel = \"\";\n\t\n\t_o = 0;\n\t\n\torgs;\n\t\n\tisOrg = true;\n\t\n\townerOrgs = new Set<Org<AS>>();\n\townerUsers = new Set<User<AS>>();\n\t\n\tusers = new Set<User<AS>>();\n\t\n\tslaveOrgs = new Set<Org<AS>>();\n\t\n\townerIds: string[] = [];\n\t\n\tupdate({ _id, title, owners: ownerIds, ...restProps }: Partial<OrgDoc>, next?: ChangeStreamDocument<OrgDoc>) {\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t\tif (title !== undefined) {\n\t\t\tthis.title = title;\n\t\t\tthis.initials = title?.[0]?.toUpperCase() ?? \"\";\n\t\t\tthis.displayLabel = title;\n\t\t}\n\t\t\n\t\tif (ownerIds) {\n\t\t\tthis.ownerIds = ownerIds;\n\t\t\t\n\t\t\t\n\t\t\tconst snapshot = this.ownerIds.join(\",\");\n\t\t\t\n\t\t\tif (snapshot !== snapshots.get(this._id)) {\n\t\t\t\tsnapshots.set(this._id, snapshot);\n\t\t\t\t\n\t\t\t\tif (this.orgs.users.isInited)\n\t\t\t\t\tthis.orgs.updateDebounced();\n\t\t\t\t\n\t\t\t\tthis.orgs.users.emit(\"orgs-org-update\", this, next);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tthis.orgs.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\tthis.orgs.replace(this._id);\n\t\t\n\t\tthis.orgs.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"title\",\n\t\t\"note\",\n\t\t\"owners\",\n\t\t\"meta\",\n\t\t\"createdAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\ttitle: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 512\n\t\t},\n\t\tnote: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 131072\n\t\t},\n\t\towners: {\n\t\t\tbsonType: \"array\",\n\t\t\tuniqueItems: true,\n\t\t\titems: {\n\t\t\t\tbsonType: \"string\",\n\t\t\t\tpattern: regexps._id.source\n\t\t\t},\n\t\t\tadditionalItems: false\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import crypto from \"node:crypto\";\nimport { deleteProps, random, removeAll } from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport { CollectionIndexes, WatchedCollection } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { Users } from \"../users\";\nimport { basisSchema } from \"./schema\";\nimport { Session } from \"./Session\";\nimport { SessionDoc, SessionsOptions } from \"./types\";\n\n\nconst expireAfterSeconds = 3600 * 24 * 7;\n\nconst indexes: CollectionIndexes = [\n\t[ { user: 1 } ],\n\t[ { expiresAt: 1 }, { expireAfterSeconds } ]\n];\n\n\nexport class Sessions<AS extends AbilitiesSchema> extends Map<string, Session<AS>> {\n\tconstructor(users: Users<AS>, options: SessionsOptions = {}) {\n\t\tsuper();\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tthis.initOptions = options;\n\t}\n\t\n\tusers;\n\tcollections;\n\t\n\tprivate initOptions?;\n\t\n\tcollection!: WatchedCollection<SessionDoc> & {\n\t\texpireAfterSeconds: number;\n\t};\n\t\n\tisInited = false;\n\t\n\tasync init() {\n\t\t\n\t\tif (!this.isInited) {\n\t\t\tthis.isInited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\tschema: customSchema,\n\t\t\t\tindexes: customIndexes\n\t\t\t} = this.initOptions!;\n\t\t\t\n\t\t\tif (customSchema) {\n\t\t\t\tif (customSchema.required)\n\t\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\t\tif (customSchema.properties)\n\t\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t\t}\n\t\t\t\n\t\t\tconst jsonSchema = {\n\t\t\t\t...basisSchema,\n\t\t\t\t...customSchema,\n\t\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t\t};\n\t\t\t\n\t\t\tthis.collection = Object.assign(\n\t\t\t\tawait this.collections.ensure<SessionDoc>(\"sessions\", { jsonSchema }),\n\t\t\t\t{\n\t\t\t\t\texpireAfterSeconds\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t\t\n\t\t\tfor (const sessionDoc of await this.collection.find().toArray())\n\t\t\t\tthis.load(sessionDoc);\n\t\t\t\n\t\t\tthis.collection.changeListeners.add(next => {\n\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\tif (!this.has(next.documentKey._id))\n\t\t\t\t\t\t\tnew Session<AS>(this, next.fullDocument);\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.users.get(next.fullDocument.user)?.trimSessions();\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\t\n\t\t\tdelete this.initOptions;\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.bulkWrite([\n\t\t\t{ updateMany: { filter: { meta: { $exists: false } }, update: { $set: { meta: {} } } } },\n\t\t\t{ updateMany: { filter: { isOnline: true }, update: { $set: { isOnline: false } } } }\n\t\t]);\n\t\t\n\t}\n\t\n\tuid() {\n\t\t\n\t\tlet _id;\n\t\tdo\n\t\t\t_id = `${crypto.randomBytes(random(8, 16)).toString(\"hex\")}$${crypto.randomBytes(random(8, 16)).toString(\"hex\")}`;\n\t\twhile (this.has(_id));\n\t\t\n\t\treturn _id;\n\t}\n\t\n\tload(sessionDoc: SessionDoc) {\n\t\tnew Session<AS>(this, sessionDoc);\n\t\t\n\t}\n\t\n\tasync create(user: User<AS>, props: Partial<SessionDoc>) {\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tconst sessionDoc: SessionDoc = {\n\t\t\tuserAgent: \"\",\n\t\t\tremoteAddress: \"127.0.0.1\",\n\t\t\tisOnline: true,\n\t\t\t...props,\n\t\t\t_id: this.uid(),\n\t\t\tuser: user._id,\n\t\t\tmeta: {},\n\t\t\tcreatedAt: ts,\n\t\t\tprolongedAt: ts,\n\t\t\texpiresAt: new Date(ts + (expireAfterSeconds * 1000))\n\t\t};\n\t\t\n\t\t/* new Session(\u2026) before await insertOne(\u2026) for avoid changeStream insert event to come earlier and create the session duplicate */\n\t\tconst session = new Session<AS>(this, sessionDoc);\n\t\t\n\t\tawait this.collection.insertOne(sessionDoc);\n\t\t\n\t\treturn session;\n\t}\n\t\n\tasync destroySession(_id: string) {\n\t\tconst { deletedCount } = await this.collection.deleteOne({ _id });\n\t\t\n\t\treturn Boolean(deletedCount);\n\t}\n\t\n}\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"user\",\n\t\t\"remoteAddress\",\n\t\t\"isOnline\",\n\t\t\"meta\",\n\t\t\"createdAt\",\n\t\t\"prolongedAt\",\n\t\t\"expiresAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.sessionId.source\n\t\t},\n\t\tuser: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\tuserAgent: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 4096\n\t\t},\n\t\tremoteAddress: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.ip.source\n\t\t},\n\t\tisOnline: {\n\t\t\tbsonType: \"bool\"\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t},\n\t\tprolongedAt: {\n\t\t\tbsonType: \"number\"\n\t\t},\n\t\texpiresAt: {\n\t\t\tbsonType: \"date\"\n\t\t}\n\t}\n\t// TODO: Restrict additional properties (not needed with meta)\n};\n", "import type { AbilitiesSchema } from \"insite-common\";\nimport type { User } from \"../users/User\";\nimport type { Sessions } from \"./Sessions\";\nimport type { SessionDoc } from \"./types\";\n\n\nexport class Session<AS extends AbilitiesSchema> {\n\tconstructor(sessions: Sessions<AS>, sessionDoc: SessionDoc) {\n\t\tconst user = sessions.users.get(sessionDoc.user);\n\t\t\n\t\tif (user) {\n\t\t\tthis.#sessions = sessions;\n\t\t\t\n\t\t\tthis._id = sessionDoc._id;\n\t\t\tthis.#sessions.set(this._id, this);\n\t\t\t\n\t\t\tthis.user = user;\n\t\t\tthis.user.sessions.add(this);\n\t\t\t\n\t\t\tthis.#sessions.users.bySessionId.set(this._id, this.user);\n\t\t\t\n\t\t\tthis.update(sessionDoc);\n\t\t} else\n\t\t\tsessions.collection.deleteOne({ _id: sessionDoc._id });\n\t\t\n\t}\n\t\n\t_id!: string;\n\tuser!: User<AS>;\n\tisOnline = false;\n\t\n\tuserAgent!: string;\n\tremoteAddress!: string;\n\tcreatedAt!: number;\n\tprolongedAt!: number;\n\texpiresAt!: Date;\n\t\n\t#sessions!: Sessions<AS>;\n\t\n\tupdate({ _id, user, isOnline, ...restProps }: Partial<SessionDoc>) {\n\t\t\n\t\tif (isOnline !== undefined && this.isOnline !== isOnline) {\n\t\t\tthis.isOnline = isOnline;\n\t\t\t\n\t\t\tif (this.#sessions.isInited && this.user.isOnline !== this.isOnline)\n\t\t\t\tthis.user.updateIsOnline();\n\t\t}\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t}\n\t\n\tprolong({ _id, user, ...updates }: Partial<SessionDoc>) {\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tupdates.prolongedAt = ts;\n\t\tupdates.expiresAt = new Date(ts + (this.#sessions.collection.expireAfterSeconds * 1000));\n\t\t\n\t\tthis.update(updates);\n\t\t\n\t\treturn this.#sessions.collection.updateOne({ _id: this._id }, { $set: updates });\n\t}\n\t\n\toffline() {\n\t\t\n\t\tconst updates = { isOnline: false };\n\t\t\n\t\tthis.update(updates);\n\t\t\n\t\treturn this.#sessions.collection.updateOne({ _id: this._id }, { $set: updates });\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tthis.#sessions.delete(this._id);\n\t\tthis.user.sessions.delete(this);\n\t\tthis.#sessions.users.bySessionId.delete(this._id);\n\t\t\n\t\tthis.#sessions.users.emit(\"session-delete\", this);\n\t\t\n\t\tif (this.isOnline)\n\t\t\tthis.user.updateIsOnline();\n\t\t\n\t}\n\t\n}\n", "import type { AbilitiesSchema } from \"insite-common\";\nimport { Binary, type WatchedCollection } from \"insite-db\";\nimport type { Users } from \"../Users\";\nimport { schema as jsonSchema } from \"./schema\";\nimport type { AvatarDoc } from \"./types\";\n// import { AvatarsOptions } from \"./types\";\n\n\nexport class Avatars<AS extends AbilitiesSchema> {\n\tconstructor(users: Users<AS>/* , options: AvatarsOptions = {} */) {\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t}\n\t\n\treadonly TYPES_ACCEPTED = [ \"image/webp\" ];\n\treadonly MAX_SIZE = 1024 * 512;\n\t\n\tusers;\n\tcollections;\n\t\n\tcollection!: WatchedCollection<AvatarDoc>;\n\t\n\t#isInited = false;\n\t\n\tasync init() {\n\t\t\n\t\tif (!this.#isInited) {\n\t\t\tthis.#isInited = true;\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure<AvatarDoc>(\"users.avatars\", { jsonSchema });\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.updateMany({ meta: { $exists: false } }, { $set: { meta: {} } });\n\t\t\n\t}\n\t\n\tasync save(_id: string, type: string, data: string) {\n\t\tconst binaryData = Binary.createFromBase64(data.slice(data.indexOf(\",\")));\n\t\t\n\t\tconst ts = Date.now().toString(36);\n\t\t\n\t\tawait Promise.all([\n\t\t\tthis.collection.replaceOne({ _id }, {\n\t\t\t\ttype,\n\t\t\t\tsize: binaryData.length(),\n\t\t\t\tts,\n\t\t\t\tdata: binaryData,\n\t\t\t\tmeta: {}\n\t\t\t}, { upsert: true }),\n\t\t\tthis.users.collection.updateOne({ _id }, { $set: { avatar: ts } })\n\t\t]);\n\t\t\n\t}\n\t\n\tasync deleteAvatar(_id: string) {\n\t\t\n\t\tconst [ { deletedCount } ] = await Promise.all([\n\t\t\tthis.collection.deleteOne({ _id }),\n\t\t\tthis.users.collection.updateOne({ _id }, { $set: { avatar: null } })\n\t\t]);\n\t\t\n\t\treturn Boolean(deletedCount);\n\t}\n\t\n}\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../../lib\";\n\n\nexport const schema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"type\",\n\t\t\"size\",\n\t\t\"ts\",\n\t\t\"data\",\n\t\t\"meta\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\ttype: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 256\n\t\t},\n\t\tsize: {\n\t\t\tbsonType: \"number\"\n\t\t},\n\t\tts: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 10\n\t\t},\n\t\tdata: {\n\t\t\tbsonType: \"binData\"\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"email\",\n\t\t\"password\",\n\t\t\"roles\",\n\t\t\"name\",\n\t\t\"org\",\n\t\t\"job\",\n\t\t\"meta\",\n\t\t\"createdAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\temail: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.email.source\n\t\t},\n\t\tpassword: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.argon2.source\n\t\t},\n\t\troles: {\n\t\t\tbsonType: \"array\",\n\t\t\tuniqueItems: true,\n\t\t\titems: {\n\t\t\t\tbsonType: \"string\",\n\t\t\t\tpattern: regexps.role.source\n\t\t\t},\n\t\t\tadditionalItems: false\n\t\t},\n\t\tname: {\n\t\t\tbsonType: \"object\",\n\t\t\trequired: [\n\t\t\t\t\"first\",\n\t\t\t\t\"middle\",\n\t\t\t\t\"last\"\n\t\t\t],\n\t\t\tproperties: {\n\t\t\t\tfirst: {\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 512\n\t\t\t\t},\n\t\t\t\tmiddle: {\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 512\n\t\t\t\t},\n\t\t\t\tlast: {\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 512\n\t\t\t\t}\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\torg: {\n\t\t\toneOf: [\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tpattern: regexps._id.source\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"null\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tjob: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 512\n\t\t},\n\t\tavatar: {\n\t\t\toneOf: [\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 10\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"null\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import {\n\t_ids,\n\tdebounce,\n\tempty,\n\thasAny,\n\tremoveOne\n} from \"@nesvet/n\";\nimport type { Abilities, AbilitiesSchema } from \"insite-common\";\nimport type { GenericAbilities } from \"../abilities/types\";\nimport type { Org } from \"../orgs/Org\";\nimport type { Role } from \"../roles/Role\";\nimport type { Session } from \"../sessions/Session\";\nimport type { UserDoc } from \"./types\";\nimport type { Users } from \"./Users\";\n\n\nconst rolesSnapshots = new Map();\nconst permissionsSnapshots = new Map();\n\nconst staticUrl = process.env.INSITE_STATIC_URL ?? \"http://localhost:8080\";\n\n\nexport class User<AS extends AbilitiesSchema> {\n\tconstructor(users: Users<AS>, userDoc: UserDoc) {\n\t\tthis.#users = users;\n\t\t\n\t\tthis._id = userDoc._id;\n\t\tusers.set(this._id, this);\n\t\t\n\t\tthis.update(userDoc);\n\t\t\n\t\tif (users.isInited)\n\t\t\tusers.emit(\"user-create\", this);\n\t\t\n\t}\n\t\n\t_id;\n\temail!: string;\n\tname = {\n\t\tfirst: \"\",\n\t\tmiddle: \"\",\n\t\tlast: \"\"\n\t};\n\t\n\tinitials = \"\";\n\tdisplayLabel = \"\";\n\torg!: Org<AS>;\n\tjob: string = \"\";\n\tavatar: string | null = null;\n\tavatarUrl: string | null = null;\n\t\n\t#users;\n\t\n\tisUser = true;\n\tisRoot?: boolean;\n\t\n\troles = new Set<Role<AS>>();\n\townRoles: Role<AS>[] = [];\n\townRoleIds: string[] = [];\n\tslaveRoles = new Set<Role<AS>>();\n\tslaveRoleIds: string[] = [];\n\tabilities: Abilities<AS> = {};\n\t\n\tslaveOrgs = new Set<Org<AS>>();\n\tslaveUsers = new Set<User<AS>>();\n\tslaves = new Set<Org<AS> | User<AS>>();\n\t\n\tslaveIds: string[] = [];\n\tpermissiveIds: string[] = [];\n\t\n\tsessions = new Set<Session<AS>>();\n\t\n\tisOnline = false;\n\t\n\tupdate({ _id, name, email, roles: ownRoleIds, org: orgId, avatar, ...restProps }: Partial<UserDoc>) {\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t\tlet isEmailUpdated;\n\t\tif (email && this.email !== email) {\n\t\t\tthis.#users.byEmail.delete(this.email);\n\t\t\tthis.email = email;\n\t\t\tthis.#users.byEmail.set(email, this);\n\t\t\tisEmailUpdated = true;\n\t\t}\n\t\t\n\t\tlet isNameUpdated;\n\t\tlet isLastNameUpdated;\n\t\tif (name && (this.name.first !== name.first || this.name.middle !== name.middle || this.name.last !== name.last)) {\n\t\t\tisLastNameUpdated = this.name.last !== name.last;\n\t\t\tthis.name = {\n\t\t\t\tfirst: name.first ?? \"\",\n\t\t\t\tmiddle: name.middle ?? \"\",\n\t\t\t\tlast: name.last ?? \"\"\n\t\t\t};\n\t\t\tthis.initials = (((name.first?.[0] ?? \"\") + (name.last?.[0] ?? \"\")) || this.email[0]).toUpperCase();\n\t\t\tisNameUpdated = true;\n\t\t}\n\t\t\n\t\tif (isEmailUpdated || isNameUpdated)\n\t\t\tthis.displayLabel = `${this.name.first} ${this.name.last}`.trim() || this.name.middle || this.email;\n\t\t\n\t\tlet isRolesUpdated;\n\t\tif (ownRoleIds) {\n\t\t\tthis.ownRoleIds = ownRoleIds;\n\t\t\t\n\t\t\tconst snapshot = this.ownRoleIds.join(\",\");\n\t\t\t\n\t\t\tif (snapshot !== rolesSnapshots.get(this._id)) {\n\t\t\t\trolesSnapshots.set(this._id, snapshot);\n\t\t\t\tthis.updateRoles();\n\t\t\t\tisRolesUpdated = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet isOrgUpdated;\n\t\tif (orgId !== undefined && this.org?._id !== orgId) {\n\t\t\tthis.org?.users.delete(this);\n\t\t\tthis.org = orgId && this.#users.orgs.get(orgId) || this.#users.orgs.null;// eslint-disable-line @stylistic/no-mixed-operators\n\t\t\tthis.org.users.add(this);\n\t\t\tisOrgUpdated = true;\n\t\t}\n\t\t\n\t\tif (avatar !== undefined && this.avatar !== avatar) {\n\t\t\tthis.avatar = avatar;\n\t\t\tthis.avatarUrl = avatar && `${staticUrl}/avatars/${this._id}-${avatar}.webp`;\n\t\t}\n\t\t\n\t\tif (isRolesUpdated || isOrgUpdated) {\n\t\t\tthis.updatePermissions();\n\t\t\t\n\t\t\tif (isLastNameUpdated)\n\t\t\t\tthis.#users.isSortRequired = true;\n\t\t\t\n\t\t\tif (this.#users.isInited)\n\t\t\t\tthis.#users.updateDebounced();\n\t\t\t\n\t\t} else if (isLastNameUpdated)\n\t\t\tthis.#users.sortDebounced();\n\t\t\n\t}\n\t\n\tupdateRoles() {\n\t\t\n\t\tif (this.#users.isInited) {\n\t\t\tthis.ownRoles = [];\n\t\t\tthis.roles.clear();\n\t\t\tthis.slaveRoles.clear();\n\t\t\tempty(this.abilities);\n\t\t\t\n\t\t\tfor (const roleId of this.ownRoleIds) {\n\t\t\t\tconst role = this.#users.roles.get(roleId);\n\t\t\t\tif (role) {\n\t\t\t\t\t\n\t\t\t\t\tthis.ownRoles.push(role);\n\t\t\t\t\tthis.roles.add(role);\n\t\t\t\t\tfor (const involvedRole of role.involves) {\n\t\t\t\t\t\tthis.roles.add(involvedRole);\n\t\t\t\t\t\tthis.slaveRoles.add(involvedRole);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.slaveRoleIds = _ids(this.slaveRoles);\n\t\t\t\t\t\n\t\t\t\t\tthis.#users.abilities.merge(this.abilities as GenericAbilities, role.abilities as GenericAbilities);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.roles.has(this.#users.roles.root))\n\t\t\t\tthis.isRoot = true;\n\t\t\t\n\t\t\tthis.trimSessions();\n\t\t}\n\t\t\n\t}\n\t\n\tupdatePermissions() {\n\t\t\n\t\tif (this.#users.isInited) {\n\t\t\tthis.slaveOrgs.clear();\n\t\t\tthis.slaveUsers.clear();\n\t\t\tthis.slaves.clear();\n\t\t\tconst slaveIds = new Set<string>();\n\t\t\t\n\t\t\tfor (const org of this.#users.orgs.sorted)\n\t\t\t\tif ((org.ownerUsers.has(this) || this.isRoot) && !this.slaveOrgs.has(org)) {\n\t\t\t\t\tthis.slaveOrgs.add(org);\n\t\t\t\t\tthis.slaves.add(org);\n\t\t\t\t\tslaveIds.add(org._id);\n\t\t\t\t\tfor (const slaveOrg of org.slaveOrgs) {\n\t\t\t\t\t\tthis.slaveOrgs.add(slaveOrg);\n\t\t\t\t\t\tthis.slaves.add(slaveOrg);\n\t\t\t\t\t\tslaveIds.add(slaveOrg._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\tfor (const org of new Set([ this.org, ...this.slaveOrgs, this.#users.orgs.null ]))\n\t\t\t\tfor (const user of org.users)\n\t\t\t\t\tif (user !== this && (hasAny(this.slaveRoles, user.ownRoles) || !user.ownRoles.length)) {\n\t\t\t\t\t\tthis.slaveUsers.add(user);\n\t\t\t\t\t\tthis.slaves.add(user);\n\t\t\t\t\t\tslaveIds.add(user._id);\n\t\t\t\t\t}\n\t\t\t\n\t\t\tthis.slaveIds = [ ...slaveIds ];\n\t\t\t\n\t\t\tconst permissiveOrgIds = [];\n\t\t\tif (this.org._id) {\n\t\t\t\tpermissiveOrgIds.push(this.org._id);\n\t\t\t\tfor (const slaveOrg of this.org.slaveOrgs)\n\t\t\t\t\tif (!this.slaveOrgs.has(slaveOrg))\n\t\t\t\t\t\tpermissiveOrgIds.push(slaveOrg._id);\n\t\t\t}\n\t\t\t\n\t\t\tthis.permissiveIds = [ ...permissiveOrgIds, this._id, ...slaveIds ];\n\t\t\t\n\t\t\t\n\t\t\tconst snapshot = [\n\t\t\t\tthis.permissiveIds.join(\",\"),\n\t\t\t\tthis.ownRoleIds.join(\",\"),\n\t\t\t\tJSON.stringify(this.abilities),\n\t\t\t\tthis.slaveRoleIds.join(\",\")\n\t\t\t].join(\"\\n\");\n\t\t\t\n\t\t\tif (snapshot !== permissionsSnapshots.get(this._id)) {\n\t\t\t\tpermissionsSnapshots.set(this._id, snapshot);\n\t\t\t\t\n\t\t\t\tthis.#users.emit(\"user-permissions-change\", this);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\ttrimSessions() {\n\t\t\n\t\tconst sessionsLimit = this.abilities.login?.sessionsLimit ?? 0;\n\t\t\n\t\tif (this.sessions.size > sessionsLimit)\n\t\t\treturn this.#users.sessions.collection.deleteMany({\n\t\t\t\t_id: {\n\t\t\t\t\t$in: _ids(\n\t\t\t\t\t\t[ ...this.sessions ]\n\t\t\t\t\t\t\t.sort((a, b) => a.expiresAt.valueOf() - b.expiresAt.valueOf())\n\t\t\t\t\t\t\t.slice(0, this.sessions.size - sessionsLimit)\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t});\n\t\t\n\t\treturn null;\n\t}\n\t\n\tupdateIsOnline = debounce(() => {\n\t\t\n\t\tlet isOnline = false;\n\t\t\n\t\tfor (const session of this.sessions)\n\t\t\tif (session.isOnline) {\n\t\t\t\tisOnline = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\tif (this.isOnline !== isOnline) {\n\t\t\tthis.isOnline = isOnline;\n\t\t\tthis.#users.emit(\"user-is-online\", this);\n\t\t}\n\t\t\n\t}, 500);\n\t\n\tdelete() {\n\t\t\n\t\tthis.org.users.delete(this);\n\t\t\n\t\tthis.#users.delete(this._id);\n\t\tthis.#users.byEmail.delete(this.email);\n\t\tremoveOne(this.#users.sorted, this);\n\t\t\n\t\trolesSnapshots.delete(this._id);\n\t\tpermissionsSnapshots.delete(this._id);\n\t\t\n\t\tthis.#users.replace(this._id);\n\t\t\n\t\tthis.#users.updateDebounced();\n\t\t\n\t}\n\t\n}\n"],
5
- "mappings": "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",
6
- "names": ["Err", "AbilityError", "longId", "payload", "add", "assignPath", "deletePath", "empty", "getPath", "intersection", "pick", "setPath", "isAbilityObject", "value", "isAbilityParamNumber", "isAbilityParamItems", "schemaParentMap", "AbilitiesMap", "abilitiesSchema", "subSchema", "#hierarchical", "parse", "schemas", "parent", "level", "schema", "longId", "subIds", "subId", "_id", "top", "paramId", "schemaOrLongId", "paramIdOrMax", "max", "ability", "paramSchema", "schemasOrIds", "a", "b", "schemaMaxMap", "resolve", "_schema", "parentSchema", "assignPath", "_max", "abilities", "subSchemas", "subAbilities", "i", "abilityParam", "value", "getPath", "setPath", "referenceValue", "isAbilityParamNumber", "isAbilityParamItems", "itemId", "intersection", "item", "adjustedAbilities", "adjustedAbility", "isAbilityObject", "pick", "empty", "target", "source", "targetAbility", "sourceAbility", "add", "deletePath", "Err", "RolesError", "stringOrArray", "payload", "debounce", "deleteProps", "getAll", "intersection", "reAdd", "removeAll", "snapshots", "Role", "roles", "roleDoc", "#roles", "_id", "ownInvolveIds", "ownAbilities", "title", "restProps", "next", "snapshot", "regexps", "basisSchema", "regexps", "indexes", "preventDirectDelete", "Roles", "users", "options", "rootProps", "initOptions", "Role", "#isInited", "customSchema", "customIndexes", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "#maintain", "roleDoc", "next", "role", "involvedBy", "involvedRoleId", "involvedRole", "involvedByRole", "reAdd", "#sortRoles", "a", "b", "array", "anotherRole", "getAll", "sorted", "involvedRoleIndex", "_o", "debounce", "_id", "involves", "title", "description", "restProps", "roleId", "updates", "ids", "roles", "intersection", "cleanedUpIds", "abilityLongId", "set", "paramId", "value", "Err", "SubordinationError", "type", "ids", "payload", "argon2", "EventEmitter", "_ids", "debounce", "deleteProps", "removeAll", "StatefulPromise", "without", "newObjectIdString", "_ids", "debounce", "deleteProps", "EmptyArray", "EmptySet", "removeAll", "sort", "union", "without", "newObjectIdString", "snapshots", "Org", "orgs", "orgDoc", "_id", "title", "ownerIds", "restProps", "next", "snapshot", "basisSchema", "regexps", "indexes", "preventDirectDelete", "Orgs", "users", "options", "#isPreinited", "customSchema", "customIndexes", "nullProps", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "Org", "EmptyArray", "EmptySet", "#maintain", "orgDoc", "#isInited", "next", "org", "#resolve", "slaveOrgs", "ownerOrg", "slaveOrg", "array", "sorted", "ownerId", "ownerUser", "anotherOrg", "#sortOrgs", "sort", "i", "slaveOrgIndex", "o", "length", "a", "b", "debounce", "title", "note", "restProps", "newObjectIdString", "_id", "updates", "byUser", "union", "without", "_ids", "fromId", "toId", "handler", "crypto", "deleteProps", "random", "removeAll", "basisSchema", "regexps", "Session", "sessions", "sessionDoc", "user", "#sessions", "_id", "isOnline", "restProps", "updates", "ts", "expireAfterSeconds", "indexes", "Sessions", "users", "options", "customSchema", "customIndexes", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "#maintain", "sessionDoc", "next", "Session", "_id", "crypto", "random", "user", "props", "ts", "session", "deletedCount", "Binary", "schema", "regexps", "Avatars", "users", "#isInited", "schema", "#maintain", "_id", "type", "data", "binaryData", "Binary", "ts", "deletedCount", "basisSchema", "regexps", "_ids", "debounce", "empty", "hasAny", "removeOne", "rolesSnapshots", "permissionsSnapshots", "staticUrl", "User", "users", "userDoc", "#users", "_id", "name", "email", "ownRoleIds", "orgId", "avatar", "restProps", "isEmailUpdated", "isNameUpdated", "isLastNameUpdated", "isRolesUpdated", "snapshot", "isOrgUpdated", "roleId", "role", "involvedRole", "slaveIds", "org", "slaveOrg", "user", "permissiveOrgIds", "sessionsLimit", "a", "b", "isOnline", "session", "indexes", "Users", "_Users", "collections", "options", "eventEmitter", "EventEmitter", "AbilitiesMap", "#isPreinited", "customIndexes", "customSchema", "initialRootProps", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "#maintain", "userDoc", "rolesOptions", "orgsOptions", "sessionsOptions", "Roles", "Orgs", "Sessions", "Avatars", "next", "User", "#initPromise", "a", "b", "debounce", "shouldUpdateRoles", "user", "StatefulPromise", "email", "password", "roles", "name", "org", "job", "restProps", "newObjectIdString", "_id", "updates", "byUser", "without", "newPassword", "sessionProps", "session", "#sortUsersAndOrgs", "Org", "ids", "_ids", "fromId", "toId", "handler", "deletedCount"]
4
+ "sourcesContent": ["import { Err } from \"@nesvet/n\";\n\n\nexport class AbilityError extends Err {\n\tconstructor(payload?: object);\n\tconstructor(longId: string, payload?: object);\n\tconstructor(longId?: object | string, payload?: object) {\n\t\tif (typeof longId == \"object\") {\n\t\t\tpayload = longId;\n\t\t\tlongId = undefined;\n\t\t}\n\t\t\n\t\tsuper(\"User lacks ability\", \"lacksability\", {\n\t\t\t...longId && { ability: longId },\n\t\t\t...payload\n\t\t});\n\t\t\n\t}\n\t\n\tname = \"AbilityError\";\n\t\n}\n", "import {\n\tadd,\n\tassignPath,\n\tdeletePath,\n\tempty,\n\tgetPath,\n\tintersection,\n\tpick,\n\tsetPath\n} from \"@nesvet/n\";\nimport type { Abilities, AbilitiesSchema, AbilityParamSchema } from \"insite-common\";\nimport {\n\tisAbilityObject,\n\tisAbilityParamItems,\n\tisAbilityParamNumber,\n\ttype Ability,\n\ttype AbilityObject,\n\ttype AbilityParam,\n\ttype AbilityParamItems,\n\ttype AbilityParamNumber,\n\ttype AbilitySchema,\n\ttype GenericAbilities\n} from \"./types\";\n\n\nconst schemaParentMap = new Map<AbilitySchema, AbilitySchema | null>();\n\n\nexport class AbilitiesMap<AS extends AbilitiesSchema> extends Map<string, AbilitySchema> {\n\tconstructor(abilitiesSchema: AS) {\n\t\tsuper();\n\t\t\n\t\tfor (const subSchema of abilitiesSchema) {\n\t\t\tdelete subSchema.top;/* The first level is always top */\n\t\t\t\n\t\t\tthis.#hierarchical.push(subSchema as AbilitySchema);\n\t\t}\n\t\t\n\t\t(function parse(this: AbilitiesMap<AS>, schemas: AbilitiesSchema, parent: AbilitySchema | null, level: number) {\n\t\t\tfor (const schema of schemas as AbilitySchema[]) {\n\t\t\t\tschemaParentMap.set(schema, parent);\n\t\t\t\t\n\t\t\t\tschema.level = level;\n\t\t\t\t\n\t\t\t\tif (!parent || schema.top) {\n\t\t\t\t\tschema.longId = schema._id;\n\t\t\t\t\t\n\t\t\t\t\tif (this.has(schema._id))\n\t\t\t\t\t\tthrow new Error(`Top-level ability duplicate: ${schema._id}`);\n\t\t\t\t\t\n\t\t\t\t\tthis.set(schema._id, schema);\n\t\t\t\t} else\n\t\t\t\t\tschema.longId = parent ? `${parent.longId}.${schema._id}` : schema._id;\n\t\t\t\t\n\t\t\t\tif (schema.abilities)\n\t\t\t\t\tparse.call(this, schema.abilities, schema, level + 1);\n\t\t\t}\n\t\t\t\n\t\t}).call(this, abilitiesSchema, null, 0);\n\t\t\n\t}\n\t\n\t#hierarchical: AbilitySchema[] = [];\n\t\n\tget(longId: string, parent?: AbilitySchema | null) {\n\t\tconst subIds = longId.split(\".\");\n\t\tlet schema = parent ?? super.get(subIds.shift()!);\n\t\t\n\t\tif (schema && subIds.length)\n\t\t\tfor (const subId of subIds) {\n\t\t\t\tschema = schema?.abilities?.find(({ _id, top }) => !top && _id === subId);\n\t\t\t\tif (!schema)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\treturn schema;\n\t}\n\t\n\tgetSchema = this.get;\n\t\n\tgetParamSchema(longId: string, paramId: string) {\n\t\treturn this.get(longId)?.params?.find(({ _id }) => _id === paramId);\n\t}\n\t\n\tgetDefaultParam(longId: string, paramId: string, max?: boolean): AbilityParam | undefined;\n\tgetDefaultParam(schema: AbilityParamSchema, max?: boolean): AbilityParam;\n\tgetDefaultParam(schemaOrLongId: AbilityParamSchema | string, paramIdOrMax?: boolean | string, max?: boolean) {\n\t\tif (paramIdOrMax === undefined || typeof paramIdOrMax == \"boolean\")\n\t\t\tmax = paramIdOrMax;\n\t\t\n\t\tconst schema = typeof schemaOrLongId == \"string\" ? this.getParamSchema(schemaOrLongId, paramIdOrMax as string) : schemaOrLongId;\n\t\t\n\t\tif (schema)\n\t\t\tswitch (schema.type) {\n\t\t\t\tcase \"number\":\n\t\t\t\t\treturn max ?\n\t\t\t\t\t\t(schema.max ?? Infinity) :\n\t\t\t\t\t\t(schema.min ?? 0);\n\t\t\t\t\n\t\t\t\tcase \"items\":\n\t\t\t\t\treturn max ?\n\t\t\t\t\t\tschema.items.map(({ _id }) => _id) :\n\t\t\t\t\t\t[];\n\t\t\t}\n\t\t\n\t\treturn undefined;// eslint-disable-line unicorn/no-useless-undefined\n\t}\n\t\n\tgetDefaultAbility(schema: string, max?: boolean): Ability | undefined;\n\tgetDefaultAbility(schema: AbilitySchema, max?: boolean): Ability;\n\tgetDefaultAbility(schema: AbilitySchema | string, max: boolean = !schema): Ability | undefined {\n\t\tif (typeof schema == \"string\")\n\t\t\tschema = this.get(schema)!;\n\t\t\n\t\tif (schema) {\n\t\t\tif (schema.abilities || schema.params) {\n\t\t\t\tconst ability = {} as AbilityObject;\n\t\t\t\t\n\t\t\t\tif (schema.params)\n\t\t\t\t\tfor (const paramSchema of schema.params)\n\t\t\t\t\t\tability[paramSchema._id] = this.getDefaultParam(paramSchema, max);\n\t\t\t\t\n\t\t\t\tif (max && schema.abilities)\n\t\t\t\t\tfor (const subSchema of schema.abilities)\n\t\t\t\t\t\tif (!subSchema.top)\n\t\t\t\t\t\t\tability[subSchema._id] = this.getDefaultAbility(subSchema, max);\n\t\t\t\t\n\t\t\t\treturn ability;\n\t\t\t}\n\t\t\t\n\t\t\treturn true;\n\t\t}\n\t\t\n\t\treturn undefined;\n\t}\n\t\n\tgetDefaultAbilities(): Abilities<AS>;\n\tgetDefaultAbilities(schemas: AbilitySchema[], max?: boolean): Abilities<AS>;\n\tgetDefaultAbilities(schema: AbilitySchema, max?: boolean): Abilities<AS>;\n\tgetDefaultAbilities(longIds: string[], max?: boolean): Abilities<AS>;\n\tgetDefaultAbilities(longId: string, max?: boolean): Abilities<AS>;\n\tgetDefaultAbilities(schemasOrIds?: (AbilitySchema | string)[] | AbilitySchema | string, max: boolean = !schemasOrIds) {\n\t\t\n\t\tconst schemas = (\n\t\t\tschemasOrIds ?\n\t\t\t\t(Array.isArray(schemasOrIds) ? schemasOrIds : [ schemasOrIds ])\n\t\t\t\t\t.map(schema => (typeof schema == \"string\" ? this.get(schema) : schema))\n\t\t\t\t\t.filter(Boolean) as AbilitySchema[] :\n\t\t\t\t[ ...this.values() ]\n\t\t).sort((a, b) => a.level - b.level);\n\t\t\n\t\tconst schemaMaxMap = new Map<AbilitySchema, boolean>();\n\t\t\n\t\tfor (const schema of schemas) {\n\t\t\t(function resolve(_schema) {\n\t\t\t\tconst parentSchema = schemaParentMap.get(_schema);\n\t\t\t\t\n\t\t\t\tif (parentSchema) {\n\t\t\t\t\tresolve(parentSchema);\n\t\t\t\t\t\n\t\t\t\t\tif (!schemaMaxMap.has(parentSchema))\n\t\t\t\t\t\tschemaMaxMap.set(parentSchema, false);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t})(schema);\n\t\t\t\n\t\t\tif (max)\n\t\t\t\t(function resolve(_schema) {\n\t\t\t\t\tif (!schemaMaxMap.has(_schema))\n\t\t\t\t\t\tschemaMaxMap.set(_schema, true);\n\t\t\t\t\t\n\t\t\t\t\tif (_schema.abilities)\n\t\t\t\t\t\tfor (const subSchema of _schema.abilities)\n\t\t\t\t\t\t\tif (subSchema.top)\n\t\t\t\t\t\t\t\tresolve(subSchema);\n\t\t\t\t\t\n\t\t\t\t})(schema);\n\t\t\telse\n\t\t\t\tif (!schemaMaxMap.has(schema))\n\t\t\t\t\tschemaMaxMap.set(schema, false);\n\t\t}\n\t\t\n\t\treturn assignPath(\n\t\t\t{},\n\t\t\tObject.fromEntries(\n\t\t\t\t[ ...schemaMaxMap ]\n\t\t\t\t\t.map(([ schema, _max ]) => [ schema.longId, this.getDefaultAbility(schema, _max) ])\n\t\t\t)\n\t\t);\n\t}\n\t\n\tgetSchemeFor(abilities: GenericAbilities) {\n\t\tabilities = this.adjust(structuredClone(abilities));\n\t\t\n\t\treturn (function resolve(subSchemas: AbilitySchema[], subAbilities: GenericAbilities) {\n\t\t\tfor (let i = 0; i < subSchemas.length; i++) {\n\t\t\t\tconst schema = subSchemas[i];\n\t\t\t\tconst ability = schema.top ? abilities[schema._id] : subAbilities[schema._id];\n\t\t\t\t\n\t\t\t\tif (ability) {\n\t\t\t\t\tif (schema.params)\n\t\t\t\t\t\tfor (const paramSchema of schema.params) {\n\t\t\t\t\t\t\tconst abilityParam = (ability as AbilityObject)[paramSchema._id];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tswitch (paramSchema.type) {\n\t\t\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\t\t\tparamSchema.max = abilityParam as AbilityParamNumber;\n\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\t\t\t\tparamSchema.items = paramSchema.items.filter(({ _id }) => (abilityParam as AbilityParamItems).includes(_id));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (schema.abilities) {\n\t\t\t\t\t\tresolve(schema.abilities, ability as GenericAbilities);\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!schema.abilities.length)\n\t\t\t\t\t\t\tdelete schema.abilities;\n\t\t\t\t\t}\n\t\t\t\t} else\n\t\t\t\t\tsubSchemas.splice(i--, 1);\n\t\t\t}\n\t\t\t\n\t\t\treturn subSchemas;\n\t\t})(structuredClone(this.#hierarchical), abilities);\n\t}\n\t\n\tgetParam(abilities: GenericAbilities, longId: string, paramId: string) {\n\t\tif (this.getParamSchema(longId, paramId)) {\n\t\t\tconst value = getPath(abilities, `${longId}.${paramId}`) as AbilityParam;\n\t\t\t\n\t\t\tif (this.isParamFits(longId, paramId, value))\n\t\t\t\treturn value;\n\t\t\t\n\t\t\treturn this.getDefaultParam(longId, paramId)!;\n\t\t}\n\t\t\n\t\treturn undefined;// eslint-disable-line unicorn/no-useless-undefined\n\t}\n\t\n\tsetParam(abilities: GenericAbilities, longId: string, paramId: string, value: AbilityParam): Abilities<AS> {\n\t\tconst schema = this.getParamSchema(longId, paramId);\n\t\t\n\t\tif (!schema)\n\t\t\tthrow new Error(`No such ability param: ${longId}.${paramId}`);\n\t\t\n\t\tsetPath(abilities, `${longId}.${paramId}`, this.adjustParam(schema, value));\n\t\t\n\t\treturn abilities as Abilities<AS>;\n\t}\n\t\n\tisParamFits(longId: string, paramId: string, value: AbilityParam, referenceValue?: AbilityParam) {\n\t\tif (value !== undefined) {\n\t\t\tconst paramSchema = this.getParamSchema(longId, paramId);\n\t\t\t\n\t\t\tif (paramSchema)\n\t\t\t\tswitch (paramSchema.type) {\n\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tisAbilityParamNumber(value) &&\n\t\t\t\t\t\t\t(paramSchema.min === undefined || value >= paramSchema.min) && (\n\t\t\t\t\t\t\t\treferenceValue === undefined ?\n\t\t\t\t\t\t\t\t\t(paramSchema.max === undefined || value <= paramSchema.max) :\n\t\t\t\t\t\t\t\t\tvalue <= (referenceValue as AbilityParamNumber)\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\tisAbilityParamItems(value) &&\n\t\t\t\t\t\t\tvalue.length === new Set(value).size && (\n\t\t\t\t\t\t\t\treferenceValue === undefined ?\n\t\t\t\t\t\t\t\t\tvalue.every(itemId => paramSchema.items.find(({ _id }) => _id === itemId)) :\n\t\t\t\t\t\t\t\t\tvalue.every(itemId => (referenceValue as AbilityParamItems).includes(itemId))\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t}\n\t\t\n\t\treturn false;\n\t}\n\t\n\tadjustParam(paramSchema: AbilityParamSchema, value: AbilityParam) {\n\t\tswitch (paramSchema.type) {\n\t\t\tcase \"number\":\n\t\t\t\treturn (\n\t\t\t\t\tisAbilityParamNumber(value) ?\n\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\tMath.min(\n\t\t\t\t\t\t\t\tvalue,\n\t\t\t\t\t\t\t\tparamSchema.max ?? Infinity\n\t\t\t\t\t\t\t),\n\t\t\t\t\t\t\tparamSchema.min ?? 0\n\t\t\t\t\t\t) :\n\t\t\t\t\t\tparamSchema.min ?? 0\n\t\t\t\t) as AbilityParamNumber;\n\t\t\t\n\t\t\tdefault/* paramSchema.type === \"items\" */:\n\t\t\t\treturn (\n\t\t\t\t\tisAbilityParamItems(value) ?\n\t\t\t\t\t\tintersection(paramSchema.items.map(item => item._id), value) :\n\t\t\t\t\t\t[]\n\t\t\t\t) as AbilityParamItems;\n\t\t}\n\t\t\n\t}\n\t\n\tadjust(abilities: GenericAbilities, parent?: AbilitySchema | null): Abilities<AS> {\n\t\tconst adjustedAbilities: GenericAbilities = {};\n\t\t\n\t\tfor (const [ _id, ability ] of Object.entries(abilities) as [ string, Ability ][]) {\n\t\t\tconst schema = this.get(_id, parent);\n\t\t\t\n\t\t\tif (schema)\n\t\t\t\tif (schema.params || schema.abilities) {\n\t\t\t\t\tconst adjustedAbility: AbilityObject = {};\n\t\t\t\t\t\n\t\t\t\t\tif (schema.params)\n\t\t\t\t\t\tif (isAbilityObject(ability))\n\t\t\t\t\t\t\tfor (const paramSchema of schema.params)\n\t\t\t\t\t\t\t\tadjustedAbility[paramSchema._id] = this.adjustParam(paramSchema, ability[paramSchema._id] as AbilityParam);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tfor (const paramSchema of schema.params)\n\t\t\t\t\t\t\t\tadjustedAbility[paramSchema._id] = this.getDefaultParam(paramSchema);\n\t\t\t\t\t\n\t\t\t\t\tif (schema.abilities && isAbilityObject(ability))\n\t\t\t\t\t\tObject.assign(\n\t\t\t\t\t\t\tadjustedAbility,\n\t\t\t\t\t\t\tthis.adjust(\n\t\t\t\t\t\t\t\tpick(\n\t\t\t\t\t\t\t\t\tability,\n\t\t\t\t\t\t\t\t\tschema.abilities\n\t\t\t\t\t\t\t\t\t\t.filter(subSchema => !subSchema.top)\n\t\t\t\t\t\t\t\t\t\t.map(subSchema => subSchema._id)\n\t\t\t\t\t\t\t\t) as GenericAbilities,\n\t\t\t\t\t\t\t\tschema\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t);\n\t\t\t\t\t\n\t\t\t\t\tadjustedAbilities[_id] = adjustedAbility;\n\t\t\t\t} else\n\t\t\t\t\tadjustedAbilities[_id] = true;\n\t\t}\n\t\t\n\t\treturn Object.assign(empty(abilities), adjustedAbilities) as Abilities<AS>;\n\t}\n\t\n\tmerge(target: GenericAbilities, source: GenericAbilities, parent?: AbilitySchema | null): Abilities<AS> {\n\t\tif (!parent) {\n\t\t\tthis.adjust(target);\n\t\t\tsource = this.adjust(structuredClone(source));\n\t\t}\n\t\t\n\t\tfor (const [ _id, ability ] of Object.entries(source)) {\n\t\t\tconst schema = this.get(_id, parent);\n\t\t\t\n\t\t\tif (schema && schema.isInheritable !== false)\n\t\t\t\tif (_id in target && (schema.params || schema.abilities)) {\n\t\t\t\t\tconst targetAbility = target[_id] as AbilityObject;\n\t\t\t\t\tconst sourceAbility = ability as AbilityObject;\n\t\t\t\t\t\n\t\t\t\t\tif (schema.params)\n\t\t\t\t\t\tfor (const paramSchema of schema.params)\n\t\t\t\t\t\t\tif (paramSchema.isInheritable !== false)\n\t\t\t\t\t\t\t\tswitch (paramSchema.type) {\n\t\t\t\t\t\t\t\t\tcase \"number\":\n\t\t\t\t\t\t\t\t\t\ttargetAbility[paramSchema._id] =\n\t\t\t\t\t\t\t\t\t\t\tMath.max(\n\t\t\t\t\t\t\t\t\t\t\t\ttargetAbility[paramSchema._id] as AbilityParamNumber,\n\t\t\t\t\t\t\t\t\t\t\t\tsourceAbility[paramSchema._id] as AbilityParamNumber\n\t\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tcase \"items\":\n\t\t\t\t\t\t\t\t\t\tadd(\n\t\t\t\t\t\t\t\t\t\t\ttargetAbility[paramSchema._id] as AbilityParamItems,\n\t\t\t\t\t\t\t\t\t\t\t...sourceAbility[paramSchema._id] as AbilityParamItems\n\t\t\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (schema.abilities)\n\t\t\t\t\t\tthis.merge(targetAbility as GenericAbilities, sourceAbility as GenericAbilities, schema);\n\t\t\t\t} else\n\t\t\t\t\ttarget[_id] = ability;\n\t\t}\n\t\t\n\t\treturn target as Abilities<AS>;\n\t}\n\t\n\thasAbility(abilities: GenericAbilities, longId: string) {\n\t\treturn Boolean(getPath(abilities, longId));\n\t}\n\t\n\tsetAbility(target: GenericAbilities, schema: AbilitySchema): Abilities<AS>;\n\tsetAbility(target: GenericAbilities, longId: string): Abilities<AS>;\n\tsetAbility(target: GenericAbilities, schemaOrLongId: AbilitySchema | string) {\n\t\tconst schema = typeof schemaOrLongId == \"string\" ? this.get(schemaOrLongId) : schemaOrLongId;\n\t\t\n\t\tif (!schema)\n\t\t\tthrow new Error(`No such ability: ${schemaOrLongId}`);\n\t\t\n\t\tthis.merge(target, this.getDefaultAbilities(schema));\n\t\t\n\t\treturn target as Abilities<AS>;\n\t}\n\t\n\tunsetAbility(target: GenericAbilities, schema: AbilitySchema): Abilities<AS>;\n\tunsetAbility(target: GenericAbilities, longId: string): Abilities<AS>;\n\tunsetAbility(target: GenericAbilities, schemaOrLongId: AbilitySchema | string) {\n\t\tconst schema = typeof schemaOrLongId == \"string\" ? this.get(schemaOrLongId) : schemaOrLongId;\n\t\t\n\t\tif (!schema)\n\t\t\tthrow new Error(`No such ability: ${schemaOrLongId}`);\n\t\t\n\t\t(function resolve(_schema) {\n\t\t\tdeletePath(target, _schema.longId);\n\t\t\t\n\t\t\tif (_schema.abilities)\n\t\t\t\tfor (const subSchema of _schema.abilities)\n\t\t\t\t\tresolve(subSchema);\n\t\t\t\n\t\t})(schema);\n\t\t\n\t\treturn target;\n\t}\n\t\n}\n", "import type { AbilitySchema as OriginalAbilitySchema } from \"insite-common\";\n\n\ntype AbilityParamItem = string;\nexport type AbilityParamItems = AbilityParamItem[];\nexport type AbilityParamNumber = number;\nexport type AbilityParam = AbilityParamItems | AbilityParamNumber;\n\nexport type AbilityWithParams = Record<string, AbilityParam>;\nexport type AbilityObject = Record<string, Ability | AbilityParam>;\nexport type AbilityBoolean = true;\nexport type Ability = AbilityBoolean | { [key: string]: Ability | AbilityParam };\n\nexport type AbilitySchema = Omit<OriginalAbilitySchema, \"abilities\"> & {\n\tlevel: number;\n\tlongId: string;\n\tabilities?: AbilitySchema[];\n};\n\nexport type GenericAbilities = Record<string, Ability>;\n\nexport function isAbilityObject(value: Ability): value is AbilityObject {\n\treturn typeof value == \"object\";\n}\n\nexport function isAbilityParamNumber(value: AbilityParam): value is AbilityParamNumber {\n\treturn typeof value == \"number\";\n}\n\nexport function isAbilityParamItems(value: AbilityParam): value is AbilityParamItems {\n\treturn Array.isArray(value);\n}\n", "import { Err } from \"@nesvet/n\";\n\n\nexport class RolesError extends Err {\n\tconstructor(roleId: string, payload?: object);\n\tconstructor(roleIds: string[], payload?: object);\n\tconstructor(stringOrArray: string[] | object | string, payload?: object) {\n\t\tsuper(`User lacks role${Array.isArray(stringOrArray) ? \"s\" : \"\"}`, \"lacksroles\", {\n\t\t\troles: Array.isArray(stringOrArray) ? stringOrArray : [ stringOrArray ],\n\t\t\t...payload\n\t\t});\n\t\t\n\t}\n\t\n\tname = \"RolesError\";\n\t\n}\n", "import {\n\tdebounce,\n\tdeleteProps,\n\tgetAll,\n\tintersection,\n\treAdd,\n\tremoveAll\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport type { CollectionIndexes, WatchedCollection } from \"insite-db\";\nimport type { AbilityParam, GenericAbilities } from \"../abilities/types\";\nimport type { Users } from \"../users\";\nimport { Role } from \"./Role\";\nimport { basisSchema } from \"./schema\";\nimport type { RoleDoc, RolesOptions } from \"./types\";\n\n\nconst indexes: CollectionIndexes = [\n\t[ { involves: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.deleteRole instead.\");\n}\n\n\nexport class Roles<AS extends AbilitiesSchema> extends Map<string, Role<AS>> {\n\tconstructor(users: Users<AS>, options: RolesOptions = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\troot: rootProps,\n\t\t\t...initOptions\n\t\t} = options;\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\tthis.abilities = users.abilities;\n\t\t\n\t\tthis.root = new Role<AS>(this, {\n\t\t\t...rootProps,\n\t\t\t_id: \"root\",\n\t\t\tinvolves: [],\n\t\t\tabilities: this.abilities.getDefaultAbilities(),\n\t\t\ttitle: \"Root\",\n\t\t\tdescription: \"Root\",\n\t\t\tmeta: {},\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t\t\n\t\tthis.initOptions = initOptions;\n\t\t\n\t}\n\t\n\tusers;\n\tcollections;\n\tcollection!: WatchedCollection<RoleDoc> & {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use roles.deleteRole instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use roles.deleteRole instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t};\n\t\n\tabilities;\n\troot;\n\tprivate initOptions?;\n\t\n\t#isInited = false;\n\t\n\tasync init() {\n\t\t\n\t\tif (!this.#isInited) {\n\t\t\tthis.#isInited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\tschema: customSchema,\n\t\t\t\tindexes: customIndexes\n\t\t\t} = this.initOptions!;\n\t\t\t\n\t\t\tif (customSchema) {\n\t\t\t\tif (customSchema.required)\n\t\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\t\tif (customSchema.properties)\n\t\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t\t}\n\t\t\t\n\t\t\tconst jsonSchema = {\n\t\t\t\t...basisSchema,\n\t\t\t\t...customSchema,\n\t\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t\t};\n\t\t\t\n\t\t\tthis.collection = Object.assign(\n\t\t\t\tawait this.collections.ensure<RoleDoc>(\"roles\", { jsonSchema }),\n\t\t\t\t{\n\t\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t\t\n\t\t\tfor (const roleDoc of await this.collection.find().toArray()) {\n\t\t\t\tif (this.abilities.adjust(roleDoc.abilities))\n\t\t\t\t\tawait this.collection.updateOne({ _id: roleDoc._id }, { $set: { abilities: roleDoc.abilities } });\n\t\t\t\t\n\t\t\t\tthis.load(roleDoc);\n\t\t\t}\n\t\t\t\n\t\t\tthis.update();\n\t\t\t\n\t\t\tthis.collection.changeListeners.add(next => {\n\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\tcase \"insert\": {\n\t\t\t\t\t\tconst role = new Role<AS>(this, next.fullDocument);\n\t\t\t\t\t\tthis.users.emit(\"roles-role-update\", role, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\t\tthis.users.emit(\"roles-role-update\", null, next);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\t\n\t\t\tdelete this.initOptions;\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.updateMany({ meta: { $exists: false } }, { $set: { meta: {} } });\n\t\t\n\t}\n\t\n\tload(roleDoc: RoleDoc) {\n\t\tnew Role<AS>(this, roleDoc);\n\t\t\n\t}\n\t\n\tresolve(role: Role<AS>, involvedBy: Role<AS>[]) {\n\t\tinvolvedBy = [ role, ...involvedBy ];\n\t\t\n\t\tfor (const involvedRoleId of role.ownInvolveIds) {\n\t\t\tconst involvedRole = this.get(involvedRoleId);\n\t\t\tif (involvedRole) {\n\t\t\t\tfor (const involvedByRole of involvedBy) {\n\t\t\t\t\treAdd(involvedByRole.involves, involvedRole);\n\t\t\t\t\tthis.abilities.merge(involvedByRole.inheritedAbilities as GenericAbilities, involvedRole.abilities as GenericAbilities);\n\t\t\t\t}\n\t\t\t\tif (involvedRole !== role)\n\t\t\t\t\tthis.resolve(involvedRole, involvedBy);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tsorted: Role<AS>[] = [];\n\t\n\t#sortRoles(a: Role<AS>, b: Role<AS>) {\n\t\treturn (\n\t\t\t(b.involves.size - a.involves.size) || (\n\t\t\t\t(a.title && b.title) ?\n\t\t\t\t\ta.title > b.title ? 1 : a.title < b.title ? -1 : 0 :\n\t\t\t\t\ta.title ?\n\t\t\t\t\t\t-1 :\n\t\t\t\t\t\tb.title ?\n\t\t\t\t\t\t\t1 :\n\t\t\t\t\t\t\ta._id > b._id ?\n\t\t\t\t\t\t\t\t1 :\n\t\t\t\t\t\t\t\ta._id < b._id ?\n\t\t\t\t\t\t\t\t\t-1 :\n\t\t\t\t\t\t\t\t\t0\n\t\t\t)\n\t\t);\n\t}\n\t\n\tupdate() {\n\t\t\n\t\tconst array = [ ...this.values() ];\n\t\t\n\t\tthis.root.ownInvolveIds = [];\n\t\tfor (const role of array) {\n\t\t\tif (role !== this.root && !array.some(anotherRole => anotherRole.ownInvolveIds.includes(role._id)))\n\t\t\t\tthis.root.ownInvolveIds.push(role._id);\n\t\t\trole.involves.clear();\n\t\t\trole.abilities = structuredClone(role.ownAbilities);\n\t\t\trole.inheritedAbilities = {};\n\t\t}\n\t\t\n\t\tthis.root.involves.add(this.root);\n\t\tthis.resolve(this.root, []);\n\t\t\n\t\tfor (const role of array)\n\t\t\trole.ownInvolves = getAll(this, role.ownInvolveIds, true).sort(this.#sortRoles).reverse();\n\t\t\n\t\tconst sorted = [ this.root ];\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst role = sorted[i];\n\t\t\tfor (const involvedRole of role.ownInvolves) {\n\t\t\t\tconst involvedRoleIndex = sorted.indexOf(involvedRole);\n\t\t\t\tif (~involvedRoleIndex) {\n\t\t\t\t\tsorted.splice(involvedRoleIndex, 1);\n\t\t\t\t\ti--;\n\t\t\t\t}\n\t\t\t\tsorted.splice(i + 1, 0, involvedRole);\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet _o = 0;\n\t\tfor (const role of sorted) {\n\t\t\tthis.abilities.merge(role.abilities as GenericAbilities, role.inheritedAbilities as GenericAbilities);\n\t\t\trole._o = _o++;\n\t\t}\n\t\t\n\t\tthis.sorted = sorted;\n\t\t\n\t\tthis.users.emit(\"roles-update\");\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.users.updateDebounced.clear();\n\t\t\tthis.users.update(true);\n\t\t}\n\t\t\n\t}\n\t\n\tupdateDebounced = debounce(this.update, 100);\n\t\n\tcreate({ _id, involves, title, description, ...restProps }: Omit<RoleDoc, \"abilities\" | \"createdAt\">) {\n\t\treturn this.collection.insertOne({\n\t\t\t_id,\n\t\t\tinvolves: involves || [],\n\t\t\tabilities: {},\n\t\t\ttitle: title ?? \"\",\n\t\t\tdescription: description ?? \"\",\n\t\t\tmeta: {},\n\t\t\t...deleteProps(restProps, [ \"abilities\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tasync updateRole(roleId: string, updates: Omit<RoleDoc, \"abilities\" | \"createdAt\">) {\n\t\tconst role = this.get(roleId);\n\t\t\n\t\tif (!role)\n\t\t\treturn false;\n\t\t\n\t\tif (updates.involves) {\n\t\t\tremoveAll(updates.involves, [ roleId ]);\n\t\t\t\n\t\t\tfor (const involvedRoleId of updates.involves)\n\t\t\t\tif (this.get(involvedRoleId)?.involves.has(role))\n\t\t\t\t\tremoveAll(updates.involves, [ involvedRoleId ]);\n\t\t\t\n\t\t\tupdates.involves = this.cleanUpIds(updates.involves);\n\t\t}\n\t\t\n\t\tawait this.collection.updateOne({ _id: roleId }, { $set: updates });\n\t\t\n\t\treturn true;\n\t}\n\t\n\tdeleteRole(role: Role<AS> | string) {\n\t\tconst _id = typeof role == \"string\" ? role : role._id;\n\t\t\n\t\treturn this.collection.bulkWrite([\n\t\t\t{ updateMany: { filter: { involves: _id }, update: { $pullAll: { involves: [ _id ] } } } },\n\t\t\t{ deleteOne: { filter: { _id } } }\n\t\t]);\n\t}\n\t\n\tcleanUpIds(ids: string[]) {\n\t\tconst roles = intersection(this.sorted, getAll(this, ids, true));\n\t\t\n\t\tconst cleanedUpIds = [];\n\t\t\n\t\tfor (const role of roles)\n\t\t\tif (roles.every(anotherRole => anotherRole === role || !anotherRole.involves.has(role)))\n\t\t\t\tcleanedUpIds.push(role._id);\n\t\t\n\t\treturn cleanedUpIds;\n\t}\n\t\n\tasync setAbility(roleId: string, abilityLongId: string, set: boolean) {\n\t\tconst role = this.get(roleId);\n\t\t\n\t\tif (!role)\n\t\t\treturn false;\n\t\t\n\t\tawait this.collection.updateOne({ _id: roleId }, { $set: {\n\t\t\tabilities:\n\t\t\t\tset ?\n\t\t\t\t\tthis.abilities.setAbility(role.ownAbilities, abilityLongId) :\n\t\t\t\t\tthis.abilities.unsetAbility(role.ownAbilities, abilityLongId)\n\t\t} });\n\t\t\n\t\treturn true;\n\t}\n\t\n\tasync setAbilityParam(roleId: string, abilityLongId: string, paramId: string, value: AbilityParam) {\n\t\tconst role = this.get(roleId);\n\t\t\n\t\tif (!role)\n\t\t\treturn false;\n\t\t\n\t\tawait this.collection.updateOne({ _id: roleId }, { $set: {\n\t\t\tabilities: this.abilities.setParam(role.ownAbilities, abilityLongId, paramId, value)\n\t\t} });\n\t\t\n\t\treturn true;\n\t}\n\t\n}\n", "import type { Abilities, AbilitiesSchema } from \"insite-common\";\nimport type { ChangeStreamDocument } from \"insite-db\";\nimport { Roles } from \"./Roles\";\nimport { RoleDoc } from \"./types\";\n\n\nconst snapshots = new Map();\n\n\nexport class Role<AS extends AbilitiesSchema> {\n\tconstructor(roles: Roles<AS>, roleDoc: RoleDoc) {\n\t\tthis.#roles = roles;\n\t\t\n\t\tthis._id = roleDoc._id;\n\t\troles.set(this._id, this);\n\t\t\n\t\tthis.update(roleDoc);\n\t\t\n\t}\n\t\n\t#roles;\n\t\n\t_id;\n\townInvolveIds!: string[];\n\townAbilities!: Abilities<AS>;\n\ttitle = \"\";\n\tdisplayTitle = \"\";\n\t_o = 0;\n\t\n\townInvolves: Role<AS>[] = [];\n\tinvolves = new Set<Role<AS>>();\n\tabilities: Abilities<AS> = {};\n\tinheritedAbilities: Abilities<AS> = {};\n\t\n\tupdate({ _id, involves: ownInvolveIds, abilities: ownAbilities, title, ...restProps }: Partial<RoleDoc>, next?: ChangeStreamDocument<RoleDoc>) {\n\t\tObject.assign(this, restProps);\n\t\t\n\t\tif (ownInvolveIds)\n\t\t\tthis.ownInvolveIds = ownInvolveIds;\n\t\t\n\t\tif (ownAbilities)\n\t\t\tthis.ownAbilities = ownAbilities as Abilities<AS>;\n\t\t\n\t\tif (title !== undefined) {\n\t\t\tthis.title = title;\n\t\t\tthis.displayTitle = title || this._id;\n\t\t}\n\t\t\n\t\tif (ownInvolveIds || ownAbilities) {\n\t\t\tconst snapshot = [\n\t\t\t\tthis.ownInvolveIds.join(\",\"),\n\t\t\t\tJSON.stringify(this.ownAbilities)\n\t\t\t].join(\"\\n\");\n\t\t\t\n\t\t\tif (snapshot !== snapshots.get(this._id)) {\n\t\t\t\tsnapshots.set(this._id, snapshot);\n\t\t\t\t\n\t\t\t\tif (this.#roles.users.isInited)\n\t\t\t\t\tthis.#roles.updateDebounced()\n\t\t\t\t\t\t.then(() => this.#roles.users.emit(\"roles-role-update\", this, next));\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tthis.#roles.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\tthis.#roles.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "export const regexps = {\n\t_id: /^[\\dA-Fa-f]{24}$/,\n\temail: /^[^\\s@]{1,63}@[^\\s@]{1,63}\\.[^\\s@]{1,63}$/,\n\targon2: /^\\$argon2(?:i|d|id)\\$v=\\d+\\$m=\\d+,t=\\d+,p=\\d+(?:\\$[\\d+/A-Za-z]+){2}$/,\n\tsessionId: /^[\\dA-Fa-f]{16,32}\\$[\\dA-Fa-f]{16,32}$/,\n\trole: /^[\\d_a-z-]{1,64}$/,\n\tip: /^(?:\\d{1,3}\\.){3}\\d{1,3}$/\n};\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"involves\",\n\t\t\"abilities\",\n\t\t\"title\",\n\t\t\"description\",\n\t\t\"meta\",\n\t\t\"createdAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.role.source,\n\t\t\tnot: { enum: [ \"root\" ] }\n\t\t},\n\t\tinvolves: {\n\t\t\tbsonType: \"array\",\n\t\t\tuniqueItems: true,\n\t\t\titems: {\n\t\t\t\tbsonType: \"string\",\n\t\t\t\tpattern: regexps.role.source,\n\t\t\t\tnot: { enum: [ \"root\" ] }\n\t\t\t},\n\t\t\tadditionalItems: false\n\t\t},\n\t\tabilities: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\ttitle: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 256\n\t\t},\n\t\tdescription: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 10240\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import { Err } from \"@nesvet/n\";\n\n\nexport class UnauthorizedError extends Err {\n\tconstructor(payload?: object) {\n\t\tsuper(\"Unauthorized\", \"unauthorized\", payload);\n\t\t\n\t}\n\t\n\tname = \"UnauthorizedError\";\n\t\n}\n\n\ntype SubordinationType = \"_id\" | \"permissiveIds\" | \"slaveIds\";\n\nexport class SubordinationError extends Err {\n\tconstructor(payload?: object);\n\tconstructor(type: SubordinationType, payload?: object);\n\tconstructor(type: SubordinationType, ids: string[] | string, payload?: object);\n\tconstructor(type?: SubordinationType | object, ids?: string[] | object | string, payload?: object) {\n\t\tswitch (arguments.length) {\n\t\t\tcase 1:\n\t\t\t\tpayload = type as object;\n\t\t\t\ttype = undefined;\n\t\t\t\tbreak;\n\t\t\t\n\t\t\tcase 2:\n\t\t\t\tpayload = ids as object;\n\t\t\t\tids = undefined;\n\t\t}\n\t\t\n\t\tsuper(\"Insubordination attempt\", \"subordination\", {\n\t\t\t...type && { type },\n\t\t\t...ids && { ids: Array.isArray(ids) ? ids : [ ids ] },\n\t\t\t...payload\n\t\t});\n\t\t\n\t}\n\t\n\tname = \"SubordinationError\";\n\t\n}\n\n\nexport class PermissionError extends Err {\n\tconstructor(payload?: object) {\n\t\tsuper(\"Insufficient permissions\", \"permissions\", payload);\n\t\t\n\t}\n\t\n\tname = \"PermissionError\";\n\t\n}\n", "import * as argon2 from \"argon2\";\nimport EventEmitter from \"eventemitter3\";\nimport {\n\t_ids,\n\tdebounce,\n\tdeleteProps,\n\tremoveAll,\n\tStatefulPromise,\n\twithout\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport {\n\tCollectionIndexes,\n\tCollections,\n\tCollectionSchema,\n\tnewObjectIdString,\n\tWatchedCollection\n} from \"insite-db\";\nimport { AbilitiesMap } from \"../abilities\";\nimport { Orgs } from \"../orgs\";\nimport { Org } from \"../orgs/Org\";\nimport { Roles } from \"../roles\";\nimport { Sessions } from \"../sessions\";\nimport { Session } from \"../sessions/Session\";\nimport type { OrgsOptions } from \"../orgs/types\";\nimport type { RolesOptions } from \"../roles/types\";\nimport type { SessionDoc, SessionsOptions } from \"../sessions/types\";\nimport { Avatars/* , AvatarsOptions */ } from \"./avatars\";\nimport { basisSchema } from \"./schema\";\nimport { User } from \"./User\";\nimport type { UserDoc } from \"./types\";\n\n\nconst indexes: CollectionIndexes = [\n\t[ { email: 1 }, { unique: true } ],\n\t[ { org: 1 } ]\n];\n\n\nexport type Options<AS> = {\n\tabilities: AS;\n\tindexes?: CollectionIndexes;\n\tschema?: CollectionSchema;\n\tinitialRoot?: Partial<UserDoc>;\n\troles?: RolesOptions;\n\torgs?: OrgsOptions;\n\tsessions?: SessionsOptions;\n\t// avatars?: AvatarsOptions;\n};\n\n\nexport class Users<AS extends AbilitiesSchema> extends Map<string, User<AS>> {\n\tconstructor(collections: Collections, options: Options<AS>) {\n\t\tsuper();\n\t\t\n\t\tconst eventEmitter = new EventEmitter() as EventEmitter & {\n\t\t\t_events: Record<string, object>;\n\t\t\t_eventsCount: number;\n\t\t};\n\t\tthis._events = eventEmitter._events;\n\t\tthis._eventsCount = eventEmitter._eventsCount;\n\t\tthis.emit = eventEmitter.emit;\n\t\tthis.on = eventEmitter.on;\n\t\tthis.once = eventEmitter.once;\n\t\tthis.addListener = eventEmitter.addListener;\n\t\tthis.off = eventEmitter.off;\n\t\tthis.removeListener = eventEmitter.removeListener;\n\t\t\n\t\tthis.collections = collections;\n\t\t\n\t\tthis.abilities = new AbilitiesMap<AS>(options.abilities);\n\t\t\n\t\tthis.initOptions = options;\n\t\t\n\t\tthis.init();\n\t\t\n\t}\n\t\n\t_events;\n\t_eventsCount;\n\temit;\n\ton;\n\tonce;\n\taddListener;\n\toff;\n\tremoveListener;\n\t\n\tprivate initOptions?;\n\t\n\tcollections;\n\tabilities;\n\t\n\tcollection!: WatchedCollection<UserDoc>;\n\troles!: Roles<AS>;\n\tsessions!: Sessions<AS>;\n\torgs!: Orgs<AS>;\n\tavatars!: Avatars<AS>;\n\t\n\tbyEmail = new Map();\n\tbySessionId = new Map();\n\tsorted: User<AS>[] = [];\n\t\n\tisSortRequired = false;\n\t\n\t#isPreinited = false;\n\t\n\tasync preinit() {\n\t\t\n\t\tif (!this.#isPreinited) {\n\t\t\tthis.#isPreinited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\tindexes: customIndexes,\n\t\t\t\tschema: customSchema,\n\t\t\t\tinitialRoot: initialRootProps\n\t\t\t\t// avatars: avatarsOptions\n\t\t\t} = this.initOptions!;\n\t\t\t\n\t\t\tif (customSchema) {\n\t\t\t\tif (customSchema.required)\n\t\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\t\tif (customSchema.properties)\n\t\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t\t}\n\t\t\t\n\t\t\tconst jsonSchema = {\n\t\t\t\t...basisSchema,\n\t\t\t\t...customSchema,\n\t\t\t\trequired: [ ...basisSchema.required as string [], ...customSchema?.required as string[] ?? [] ],\n\t\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t\t};\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure<UserDoc>(\"users\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tif (!await this.collection.countDocuments({ roles: \"root\" }))\n\t\t\t\tawait this.create({\n\t\t\t\t\temail: process.env.INSITE_ROOT_EMAIL ?? \"insite@root.email\",\n\t\t\t\t\tpassword: process.env.INSITE_ROOT_PASSWORD ?? \"inSiteRootPassword\",\n\t\t\t\t\tname: { first: \"Root\" },\n\t\t\t\t\tjob: \"Root\",\n\t\t\t\t\t...initialRootProps,\n\t\t\t\t\troles: [ \"root\" ],\n\t\t\t\t\torg: null,\n\t\t\t\t\tmeta: {}\n\t\t\t\t});\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t\t\n\t\t\tfor (const userDoc of await this.collection.find().toArray())\n\t\t\t\tthis.load(userDoc);\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.updateMany({ meta: { $exists: false } }, { $set: { meta: {} } });\n\t\t\n\t}\n\t\n\tisInited = false;\n\t\n\tprotected async init() {\n\t\t\n\t\tif (!this.isInited) {\n\t\t\tthis.isInited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\troles: rolesOptions,\n\t\t\t\torgs: orgsOptions,\n\t\t\t\tsessions: sessionsOptions\n\t\t\t\t// avatars: avatarsOptions\n\t\t\t} = this.initOptions!;\n\t\t\t\n\t\t\tthis.roles = new Roles<AS>(this, rolesOptions);\n\t\t\tthis.orgs = new Orgs<AS>(this, orgsOptions);\n\t\t\tthis.sessions = new Sessions<AS>(this, sessionsOptions);\n\t\t\tthis.avatars = new Avatars<AS>(this/* , avatarsOptions */);\n\t\t\t\n\t\t\tawait this.roles.init();\n\t\t\tawait this.orgs.preinit();\n\t\t\tawait this.preinit();\n\t\t\tawait this.orgs.init();\n\t\t\tawait this.avatars.init();\n\t\t\t\n\t\t\tthis.update(true);\n\t\t\t\n\t\t\tthis.collection.changeListeners.add(next => {\n\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\tnew User<AS>(this, next.fullDocument);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\t\n\t\t\tawait this.sessions.init();\n\t\t\t\n\t\t\tdelete this.initOptions;\n\t\t\t\n\t\t\tthis.#initPromise.resolve(this);\n\t\t}\n\t\t\n\t}\n\t\n\t\n\tload(userDoc: UserDoc) {\n\t\tnew User<AS>(this, userDoc);\n\t\t\n\t}\n\t\n\tsort() {\n\t\t\n\t\tthis.isSortRequired = false;\n\t\t\n\t\tthis.sorted = [ ...this.values() ].sort((a, b) => a.name.last > b.name.last ? 1 : a.name.last < b.name.last ? -1 : 0);\n\t\t\n\t}\n\t\n\tsortDebounced = debounce(() => this.sort(), 250);\n\t\n\tupdate(shouldUpdateRoles?: boolean) {\n\t\tif (shouldUpdateRoles)\n\t\t\tfor (const user of this.values())\n\t\t\t\tuser.updateRoles();\n\t\t\n\t\tfor (const user of this.values())\n\t\t\tuser.updatePermissions();\n\t\t\n\t\tif (this.isSortRequired)\n\t\t\tthis.sort();\n\t\t\n\t}\n\t\n\tupdateDebounced = debounce(() => this.update(), 250);\n\t\n\t#initPromise = new StatefulPromise<this>();\n\t\n\twhenReady() {\n\t\treturn this.#initPromise;\n\t}\n\t\n\tasync create({ email, password, roles, name, org, job, ...restProps }: Omit<UserDoc, \"_id\" | \"createdAt\">) {\n\t\tif (this.byEmail.has(email))\n\t\t\tthrow new Error(\"User exists\");\n\t\t\n\t\tawait this.collection.insertOne({\n\t\t\t_id: newObjectIdString(),\n\t\t\temail,\n\t\t\tpassword: await argon2.hash(password),\n\t\t\troles: this.isInited ? this.roles.cleanUpIds(roles) : roles,\n\t\t\tname: {\n\t\t\t\tfirst: name.first ?? \"\",\n\t\t\t\tmiddle: name.middle ?? \"\",\n\t\t\t\tlast: name.last ?? \"\"\n\t\t\t},\n\t\t\torg: org ?? null,\n\t\t\tjob: job ?? \"\",\n\t\t\tmeta: {},\n\t\t\t...deleteProps(restProps, [ \"_id\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t\t\n\t\treturn true;\n\t}\n\t\n\tasync updateUser(_id: string, updates: Omit<UserDoc, \"_id\" | \"createdAt\">, byUser?: User<AS>) {\n\t\tconst user = this.get(_id)!;\n\t\t\n\t\tif (!user)\n\t\t\treturn false;\n\t\t\n\t\tif (updates.roles)\n\t\t\tupdates.roles =\n\t\t\t\tuser.isRoot ?\n\t\t\t\t\t[ \"root\" ] :\n\t\t\t\t\tthis.roles.cleanUpIds(\n\t\t\t\t\t\tbyUser ?\n\t\t\t\t\t\t\twithout(user.ownRoleIds, byUser.slaveRoleIds).concat(updates.roles) :\n\t\t\t\t\t\t\tupdates.roles\n\t\t\t\t\t);\n\t\t\n\t\tawait this.collection.updateOne({ _id }, { $set: updates });\n\t\t\n\t\treturn true;\n\t}\n\t\n\tasync changePassword(_id: string, newPassword: string) {\n\t\tif (!this.has(_id))\n\t\t\tthrow new Error(\"usernotfound\");\n\t\t\n\t\tif (!newPassword)\n\t\t\tthrow new Error(\"emptypasswordisnotallowed\");\n\t\t\n\t\tawait Promise.all([\n\t\t\tthis.collection.updateOne({ _id }, { $set: { password: await argon2.hash(newPassword) } }),\n\t\t\tthis.sessions.collection.deleteMany({ user: _id })\n\t\t]);\n\t\t\n\t}\n\t\n\tasync login(email: string, password: string, sessionProps: Partial<SessionDoc>) {\n\t\tconst user = this.byEmail.get(email);\n\t\t\n\t\tif (!user)\n\t\t\tthrow new Error(\"usernotfound\");\n\t\t\n\t\tif (!await argon2.verify(user.password, password))\n\t\t\tthrow new Error(\"incorrectpassword\");\n\t\t\n\t\tif (!user.abilities.login)\n\t\t\tthrow new Error(\"userisnotabletologin\");\n\t\t\n\t\treturn this.sessions.create(user, sessionProps);\n\t}\n\t\n\tlogout(session: Session<AS>) {\n\t\tsession.delete();\n\t\t\n\t\treturn this.sessions.collection.deleteOne({ _id: session._id });\n\t}\n\t\n\t#sortUsersAndOrgs(a: Org<AS> | User<AS>, b: Org<AS> | User<AS>) {\n\t\treturn (\n\t\t\t(a instanceof User && b instanceof User) ?\n\t\t\t\t(a.name.last && b.name.last) ?\n\t\t\t\t\ta.name.last > b.name.last ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta.name.last < b.name.last ? -1 : 0 :\n\t\t\t\t\t(!a.name.last && !b.name.last) ?\n\t\t\t\t\t\ta.displayLabel > b.displayLabel ?\n\t\t\t\t\t\t\t1 :\n\t\t\t\t\t\t\ta.displayLabel < b.displayLabel ? -1 : 0 :\n\t\t\t\t\t\ta.name.last ? -1 : 1 :\n\t\t\t\t(a instanceof Org && b instanceof Org) ?\n\t\t\t\t\ta.title > b.title ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta.title < b.title ? -1 : 0 :\n\t\t\t\t\ta instanceof Org ? -1 : 1\n\t\t);\n\t}\n\t\n\tsortIds(ids: string[]) {\n\t\treturn _ids((\n\t\t\tids\n\t\t\t\t.map(_id => this.get(_id) || this.orgs.get(_id))\n\t\t\t\t.filter(Boolean) as (Org<AS> | User<AS>)[]\n\t\t).sort(this.#sortUsersAndOrgs));\n\t}\n\t\n\treplaceMap = new Map<string, string>();\n\t\n\treplaceHandlers = new Set<(fromId: string, toId: string | null) => Promise<void> | void>();\n\t\n\tasync replace(fromId: string) {\n\t\tconst toId = this.replaceMap.get(fromId) ?? null;\n\t\tif (toId)\n\t\t\tthis.replaceMap.delete(fromId);\n\t\t\n\t\tfor (const handler of this.replaceHandlers)\n\t\t\tawait handler(fromId, toId);\n\t\t\n\t}\n\t\n\tasync deleteUser(_id: string) {\n\t\tconst { deletedCount } = await this.collection.deleteOne({ _id });\n\t\t\n\t\treturn Boolean(deletedCount);\n\t}\n\t\n\t\n\tstatic init<IAS extends AbilitiesSchema>(collections: Collections, options: Options<IAS>) {\n\t\tconst users = new Users(collections, options);\n\t\t\n\t\treturn users.whenReady();\n\t}\n\t\n}\n", "import {\n\t_ids,\n\tdebounce,\n\tdeleteProps,\n\tEmptyArray,\n\tEmptySet,\n\tremoveAll,\n\tsort,\n\tunion,\n\twithout\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport { CollectionIndexes, newObjectIdString, WatchedCollection } from \"insite-db\";\nimport type { User, Users } from \"../users\";\nimport { Org } from \"./Org\";\nimport { basisSchema } from \"./schema\";\nimport type { OrgDoc, OrgsOptions } from \"./types\";\n\n\nconst indexes: CollectionIndexes = [\n\t[ { owners: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of orgs collection.deleteOne or .deleteMany is forbidden. Use orgs.deleteOrg instead.\");\n}\n\n\nexport class Orgs<AS extends AbilitiesSchema> extends Map<string, Org<AS>> {\n\tconstructor(users: Users<AS>, options: OrgsOptions = {}) {\n\t\tsuper();\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tthis.preinitOptions = options;\n\t\t\n\t}\n\t\n\tusers;\n\tcollections;\n\tprivate preinitOptions?;\n\t\n\tcollection!: WatchedCollection<OrgDoc> & {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use orgs.deleteOrg instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use orgs.deleteOrg instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t};\n\t\n\tnull!: Org<AS> & { _id: null };\n\t\n\t#isPreinited = false;\n\t\n\tasync preinit() {\n\t\t\n\t\tif (!this.#isPreinited) {\n\t\t\tthis.#isPreinited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\tschema: customSchema,\n\t\t\t\tindexes: customIndexes,\n\t\t\t\tnull: nullProps\n\t\t\t} = this.preinitOptions!;\n\t\t\t\n\t\t\tif (customSchema) {\n\t\t\t\tif (customSchema.required)\n\t\t\t\t\tremoveAll(customSchema.required as string [], basisSchema.required as string[]);\n\t\t\t\tif (customSchema.properties)\n\t\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t\t}\n\t\t\t\n\t\t\tconst jsonSchema = {\n\t\t\t\t...basisSchema,\n\t\t\t\t...customSchema,\n\t\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t\t};\n\t\t\t\n\t\t\tthis.collection = Object.assign(\n\t\t\t\tawait this.collections.ensure<OrgDoc>(\"orgs\", { jsonSchema }),\n\t\t\t\t{\n\t\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tthis.null = Object.assign(\n\t\t\t\tnew Org<AS>(this, {\n\t\t\t\t\t...nullProps,\n\t\t\t\t\t_id: \"\",\n\t\t\t\t\ttitle: \"\",\n\t\t\t\t\tnote: \"\",\n\t\t\t\t\towners: [],\n\t\t\t\t\tmeta: {},\n\t\t\t\t\tcreatedAt: Date.now()\n\t\t\t\t}),\n\t\t\t\t{\n\t\t\t\t\t_id: null,\n\t\t\t\t\townerIds: new EmptyArray(),\n\t\t\t\t\townerOrgs: new EmptySet(),\n\t\t\t\t\townerUsers: new EmptySet(),\n\t\t\t\t\tslaveOrgs: new EmptySet()\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t\t\n\t\t\tfor (const orgDoc of await this.collection.find().toArray())\n\t\t\t\tthis.load(orgDoc);\n\t\t\t\n\t\t\tdelete this.preinitOptions;\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.updateMany({ meta: { $exists: false } }, { $set: { meta: {} } });\n\t\t\n\t}\n\t\n\t#isInited = false;\n\t\n\tinit() {\n\t\t\n\t\tif (!this.#isInited) {\n\t\t\tthis.#isInited = true;\n\t\t\t\n\t\t\tthis.update();\n\t\t\t\n\t\t\tthis.collection.changeListeners.add(next => {\n\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\tcase \"insert\": {\n\t\t\t\t\t\tconst org = new Org<AS>(this, next.fullDocument);\n\t\t\t\t\t\tthis.users.emit(\"orgs-org-update\", org, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\t\tthis.users.emit(\"orgs-org-update\", null, next);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t}\n\t\t\n\t}\n\t\n\tload(orgDoc: OrgDoc) {\n\t\tnew Org<AS>(this, orgDoc);\n\t\t\n\t}\n\t\n\t#resolve(org: Org<AS>, slaveOrgs: Org<AS>[]) {\n\t\tslaveOrgs = [ org, ...slaveOrgs ];\n\t\t\n\t\tfor (const ownerOrg of org.ownerOrgs) {\n\t\t\tthis.#resolve(ownerOrg, slaveOrgs);\n\t\t\tfor (const slaveOrg of slaveOrgs)\n\t\t\t\townerOrg.slaveOrgs.add(slaveOrg);\n\t\t}\n\t\t\n\t}\n\t\n\tsorted: Org<AS>[] = [];\n\t\n\tupdate() {\n\t\t\n\t\tconst array = [ ...this.values() ];\n\t\tconst sorted = [];\n\t\t\n\t\tfor (const org of array) {\n\t\t\torg.ownerOrgs.clear();\n\t\t\torg.ownerUsers.clear();\n\t\t\torg.slaveOrgs.clear();\n\t\t\t\n\t\t\tfor (const ownerId of org.ownerIds) {\n\t\t\t\tconst ownerOrg = this.get(ownerId);\n\t\t\t\tif (ownerOrg)\n\t\t\t\t\torg.ownerOrgs.add(ownerOrg);\n\t\t\t\telse {\n\t\t\t\t\tconst ownerUser = this.users.get(ownerId);\n\t\t\t\t\tif (ownerUser)\n\t\t\t\t\t\torg.ownerUsers.add(ownerUser);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (!org.ownerOrgs.size && org._id)\n\t\t\t\tsorted.push(org);\n\t\t}\n\t\t\n\t\tfor (const org of array)\n\t\t\tif (!array.some(anotherOrg => anotherOrg.ownerOrgs.has(org)))\n\t\t\t\tthis.#resolve(org, []);\n\t\t\n\t\tsorted.sort(this.#sortOrgs);\n\t\tfor (const org of array)\n\t\t\tsort(org.slaveOrgs, this.#sortOrgs);\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst org = sorted[i];\n\t\t\tfor (const slaveOrg of [ ...org.slaveOrgs ].reverse())\n\t\t\t\tif (slaveOrg.ownerOrgs.has(org)) {\n\t\t\t\t\tconst slaveOrgIndex = sorted.indexOf(slaveOrg);\n\t\t\t\t\tif (~slaveOrgIndex) {\n\t\t\t\t\t\tsorted.splice(slaveOrgIndex, 1);\n\t\t\t\t\t\ti--;\n\t\t\t\t\t}\n\t\t\t\t\tsorted.splice(i + 1, 0, slaveOrg);\n\t\t\t\t}\n\t\t}\n\t\tfor (let o = 0, { length } = sorted; o < length;)\n\t\t\tsorted[o]._o = o++;\n\t\t\n\t\tthis.sorted = sorted;\n\t\t\n\t\tthis.users.emit(\"orgs-update\");\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.users.updateDebounced.clear();\n\t\t\tthis.users.update();\n\t\t}\n\t\t\n\t}\n\t\n\t#sortOrgs(a: Org<AS>, b: Org<AS>) {\n\t\treturn (\n\t\t\t(b.slaveOrgs.size - a.slaveOrgs.size) || (\n\t\t\t\ta.title > b.title ?\n\t\t\t\t\t1 :\n\t\t\t\t\ta.title < b.title ?\n\t\t\t\t\t\t-1 :\n\t\t\t\t\t\t0\n\t\t\t)\n\t\t);\n\t}\n\t\n\tupdateDebounced = debounce(this.update, 250);\n\t\n\tcreate({ title, note, ...restProps }: Omit<OrgDoc, \"_id\" | \"createdAt\" | \"owners\">, ownerId?: string) {\n\t\treturn this.collection.insertOne({\n\t\t\t_id: newObjectIdString(),\n\t\t\ttitle: title ?? \"\",\n\t\t\tnote: note ?? \"\",\n\t\t\towners: ownerId ? [ ownerId ] : [],\n\t\t\tmeta: {},\n\t\t\t...deleteProps(restProps, [ \"_id\", \"owners\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tasync updateOrg(_id: string, updates: Omit<OrgDoc, \"_id\" | \"createdAt\">, byUser?: User<AS>) {\n\t\tconst org = this.get(_id)!;\n\t\t\n\t\tif (!org)\n\t\t\treturn false;\n\t\t\n\t\tif (updates.owners)\n\t\t\tupdates.owners =\n\t\t\t\tthis.users.sortIds(\n\t\t\t\t\tunion(\n\t\t\t\t\t\tbyUser ?\n\t\t\t\t\t\t\twithout(org.ownerIds, byUser.slaveIds) :\n\t\t\t\t\t\t\t[],\n\t\t\t\t\t\twithout(updates.owners, [ _id, ..._ids(org.slaveOrgs) ])\n\t\t\t\t\t)\n\t\t\t\t);\n\t\t\n\t\tawait this.collection.updateOne({ _id }, { $set: updates });\n\t\t\n\t\treturn true;\n\t}\n\t\n\tdeleteOrg(org: Org<AS> | string) {\n\t\tconst _id = typeof org == \"string\" ? org : org._id;\n\t\t\n\t\treturn this.collection.bulkWrite([\n\t\t\t{ updateMany: { filter: { owners: _id }, update: { $pullAll: { owners: [ _id ] } } } },\n\t\t\t{ deleteOne: { filter: { _id } } }\n\t\t]);\n\t}\n\t\n\treplaceMap = new Map<string, string>();\n\t\n\treplaceHandlers = new Set<(fromId: string, toId: string | null) => Promise<void> | void>();\n\t\n\tasync replace(fromId: string) {\n\t\tconst toId = this.replaceMap.get(fromId) ?? null;\n\t\tif (toId)\n\t\t\tthis.replaceMap.delete(fromId);\n\t\t\n\t\tfor (const handler of this.replaceHandlers)\n\t\t\tawait handler(fromId, toId);\n\t\t\n\t}\n\t\n}\n", "import type { AbilitiesSchema } from \"insite-common\";\nimport type { ChangeStreamDocument } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { Orgs } from \"./Orgs\";\nimport type { OrgDoc } from \"./types\";\n\n\nconst snapshots = new Map();\n\n\nexport class Org<AS extends AbilitiesSchema> {\n\tconstructor(orgs: Orgs<AS>, orgDoc: OrgDoc) {\n\t\tthis.orgs = orgs;\n\t\t\n\t\tthis._id = orgDoc._id;\n\t\torgs.set(this._id, this);\n\t\t\n\t\tthis.update(orgDoc);\n\t\t\n\t}\n\t\n\t_id;\n\ttitle = \"\";\n\tinitials = \"\";\n\tdisplayLabel = \"\";\n\t\n\t_o = 0;\n\t\n\torgs;\n\t\n\tisOrg = true;\n\t\n\townerOrgs = new Set<Org<AS>>();\n\townerUsers = new Set<User<AS>>();\n\t\n\tusers = new Set<User<AS>>();\n\t\n\tslaveOrgs = new Set<Org<AS>>();\n\t\n\townerIds: string[] = [];\n\t\n\tupdate({ _id, title, owners: ownerIds, ...restProps }: Partial<OrgDoc>, next?: ChangeStreamDocument<OrgDoc>) {\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t\tif (title !== undefined) {\n\t\t\tthis.title = title;\n\t\t\tthis.initials = title?.[0]?.toUpperCase() ?? \"\";\n\t\t\tthis.displayLabel = title;\n\t\t}\n\t\t\n\t\tif (ownerIds) {\n\t\t\tthis.ownerIds = ownerIds;\n\t\t\t\n\t\t\t\n\t\t\tconst snapshot = this.ownerIds.join(\",\");\n\t\t\t\n\t\t\tif (snapshot !== snapshots.get(this._id)) {\n\t\t\t\tsnapshots.set(this._id, snapshot);\n\t\t\t\t\n\t\t\t\tif (this.orgs.users.isInited)\n\t\t\t\t\tthis.orgs.updateDebounced();\n\t\t\t\t\n\t\t\t\tthis.orgs.users.emit(\"orgs-org-update\", this, next);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tthis.orgs.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\tthis.orgs.replace(this._id);\n\t\t\n\t\tthis.orgs.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"title\",\n\t\t\"note\",\n\t\t\"owners\",\n\t\t\"meta\",\n\t\t\"createdAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\ttitle: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 512\n\t\t},\n\t\tnote: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 131072\n\t\t},\n\t\towners: {\n\t\t\tbsonType: \"array\",\n\t\t\tuniqueItems: true,\n\t\t\titems: {\n\t\t\t\tbsonType: \"string\",\n\t\t\t\tpattern: regexps._id.source\n\t\t\t},\n\t\t\tadditionalItems: false\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import crypto from \"node:crypto\";\nimport { deleteProps, random, removeAll } from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport { CollectionIndexes, WatchedCollection } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { Users } from \"../users\";\nimport { basisSchema } from \"./schema\";\nimport { Session } from \"./Session\";\nimport { SessionDoc, SessionsOptions } from \"./types\";\n\n\nconst expireAfterSeconds = 3600 * 24 * 7;\n\nconst indexes: CollectionIndexes = [\n\t[ { user: 1 } ],\n\t[ { expiresAt: 1 }, { expireAfterSeconds } ]\n];\n\n\nexport class Sessions<AS extends AbilitiesSchema> extends Map<string, Session<AS>> {\n\tconstructor(users: Users<AS>, options: SessionsOptions = {}) {\n\t\tsuper();\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tthis.initOptions = options;\n\t}\n\t\n\tusers;\n\tcollections;\n\t\n\tprivate initOptions?;\n\t\n\tcollection!: WatchedCollection<SessionDoc> & {\n\t\texpireAfterSeconds: number;\n\t};\n\t\n\tisInited = false;\n\t\n\tasync init() {\n\t\t\n\t\tif (!this.isInited) {\n\t\t\tthis.isInited = true;\n\t\t\t\n\t\t\tconst {\n\t\t\t\tschema: customSchema,\n\t\t\t\tindexes: customIndexes\n\t\t\t} = this.initOptions!;\n\t\t\t\n\t\t\tif (customSchema) {\n\t\t\t\tif (customSchema.required)\n\t\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\t\tif (customSchema.properties)\n\t\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t\t}\n\t\t\t\n\t\t\tconst jsonSchema = {\n\t\t\t\t...basisSchema,\n\t\t\t\t...customSchema,\n\t\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t\t};\n\t\t\t\n\t\t\tthis.collection = Object.assign(\n\t\t\t\tawait this.collections.ensure<SessionDoc>(\"sessions\", { jsonSchema }),\n\t\t\t\t{\n\t\t\t\t\texpireAfterSeconds\n\t\t\t\t}\n\t\t\t);\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t\t\n\t\t\tfor (const sessionDoc of await this.collection.find().toArray())\n\t\t\t\tthis.load(sessionDoc);\n\t\t\t\n\t\t\tthis.collection.changeListeners.add(next => {\n\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\tcase \"insert\":\n\t\t\t\t\t\tif (!this.has(next.documentKey._id))\n\t\t\t\t\t\t\tnew Session<AS>(this, next.fullDocument);\n\t\t\t\t\t\t\n\t\t\t\t\t\tthis.users.get(next.fullDocument.user)?.trimSessions();\n\t\t\t\t\t\t\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t\n\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\t\n\t\t\tdelete this.initOptions;\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.bulkWrite([\n\t\t\t{ updateMany: { filter: { meta: { $exists: false } }, update: { $set: { meta: {} } } } },\n\t\t\t{ updateMany: { filter: { isOnline: true }, update: { $set: { isOnline: false } } } }\n\t\t]);\n\t\t\n\t}\n\t\n\tuid() {\n\t\t\n\t\tlet _id;\n\t\tdo\n\t\t\t_id = `${crypto.randomBytes(random(8, 16)).toString(\"hex\")}$${crypto.randomBytes(random(8, 16)).toString(\"hex\")}`;\n\t\twhile (this.has(_id));\n\t\t\n\t\treturn _id;\n\t}\n\t\n\tload(sessionDoc: SessionDoc) {\n\t\tnew Session<AS>(this, sessionDoc);\n\t\t\n\t}\n\t\n\tasync create(user: User<AS>, props: Partial<SessionDoc>) {\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tconst sessionDoc: SessionDoc = {\n\t\t\tuserAgent: \"\",\n\t\t\tremoteAddress: \"127.0.0.1\",\n\t\t\tisOnline: true,\n\t\t\t...props,\n\t\t\t_id: this.uid(),\n\t\t\tuser: user._id,\n\t\t\tmeta: {},\n\t\t\tcreatedAt: ts,\n\t\t\tprolongedAt: ts,\n\t\t\texpiresAt: new Date(ts + (expireAfterSeconds * 1000))\n\t\t};\n\t\t\n\t\t/* new Session(\u2026) before await insertOne(\u2026) for avoid changeStream insert event to come earlier and create the session duplicate */\n\t\tconst session = new Session<AS>(this, sessionDoc);\n\t\t\n\t\tawait this.collection.insertOne(sessionDoc);\n\t\t\n\t\treturn session;\n\t}\n\t\n\tasync destroySession(_id: string) {\n\t\tconst { deletedCount } = await this.collection.deleteOne({ _id });\n\t\t\n\t\treturn Boolean(deletedCount);\n\t}\n\t\n}\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"user\",\n\t\t\"remoteAddress\",\n\t\t\"isOnline\",\n\t\t\"meta\",\n\t\t\"createdAt\",\n\t\t\"prolongedAt\",\n\t\t\"expiresAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.sessionId.source\n\t\t},\n\t\tuser: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\tuserAgent: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 4096\n\t\t},\n\t\tremoteAddress: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.ip.source\n\t\t},\n\t\tisOnline: {\n\t\t\tbsonType: \"bool\"\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t},\n\t\tprolongedAt: {\n\t\t\tbsonType: \"number\"\n\t\t},\n\t\texpiresAt: {\n\t\t\tbsonType: \"date\"\n\t\t}\n\t}\n\t// TODO: Restrict additional properties (not needed with meta)\n};\n", "import type { AbilitiesSchema } from \"insite-common\";\nimport type { User } from \"../users/User\";\nimport type { Sessions } from \"./Sessions\";\nimport type { SessionDoc } from \"./types\";\n\n\nexport class Session<AS extends AbilitiesSchema> {\n\tconstructor(sessions: Sessions<AS>, sessionDoc: SessionDoc) {\n\t\tconst user = sessions.users.get(sessionDoc.user);\n\t\t\n\t\tif (user) {\n\t\t\tthis.#sessions = sessions;\n\t\t\t\n\t\t\tthis._id = sessionDoc._id;\n\t\t\tthis.#sessions.set(this._id, this);\n\t\t\t\n\t\t\tthis.user = user;\n\t\t\tthis.user.sessions.add(this);\n\t\t\t\n\t\t\tthis.#sessions.users.bySessionId.set(this._id, this.user);\n\t\t\t\n\t\t\tthis.update(sessionDoc);\n\t\t} else\n\t\t\tsessions.collection.deleteOne({ _id: sessionDoc._id });\n\t\t\n\t}\n\t\n\t_id!: string;\n\tuser!: User<AS>;\n\tisOnline = false;\n\t\n\tuserAgent!: string;\n\tremoteAddress!: string;\n\tcreatedAt!: number;\n\tprolongedAt!: number;\n\texpiresAt!: Date;\n\t\n\t#sessions!: Sessions<AS>;\n\t\n\tupdate({ _id, user, isOnline, ...restProps }: Partial<SessionDoc>) {\n\t\t\n\t\tif (isOnline !== undefined && this.isOnline !== isOnline) {\n\t\t\tthis.isOnline = isOnline;\n\t\t\t\n\t\t\tif (this.#sessions.isInited && this.user.isOnline !== this.isOnline)\n\t\t\t\tthis.user.updateIsOnline();\n\t\t}\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t}\n\t\n\tprolong({ _id, user, ...updates }: Partial<SessionDoc>) {\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tupdates.prolongedAt = ts;\n\t\tupdates.expiresAt = new Date(ts + (this.#sessions.collection.expireAfterSeconds * 1000));\n\t\t\n\t\tthis.update(updates);\n\t\t\n\t\treturn this.#sessions.collection.updateOne({ _id: this._id }, { $set: updates });\n\t}\n\t\n\toffline() {\n\t\t\n\t\tconst updates = { isOnline: false };\n\t\t\n\t\tthis.update(updates);\n\t\t\n\t\treturn this.#sessions.collection.updateOne({ _id: this._id }, { $set: updates });\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tthis.#sessions.delete(this._id);\n\t\tthis.user.sessions.delete(this);\n\t\tthis.#sessions.users.bySessionId.delete(this._id);\n\t\t\n\t\tthis.#sessions.users.emit(\"session-delete\", this);\n\t\t\n\t\tif (this.isOnline)\n\t\t\tthis.user.updateIsOnline();\n\t\t\n\t}\n\t\n}\n", "import type { AbilitiesSchema } from \"insite-common\";\nimport { Binary, type WatchedCollection } from \"insite-db\";\nimport type { Users } from \"../Users\";\nimport { schema as jsonSchema } from \"./schema\";\nimport type { AvatarDoc } from \"./types\";\n// import { AvatarsOptions } from \"./types\";\n\n\nexport class Avatars<AS extends AbilitiesSchema> {\n\tconstructor(users: Users<AS>/* , options: AvatarsOptions = {} */) {\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t}\n\t\n\treadonly TYPES_ACCEPTED = [ \"image/webp\" ];\n\treadonly MAX_SIZE = 1024 * 512;\n\t\n\tusers;\n\tcollections;\n\t\n\tcollection!: WatchedCollection<AvatarDoc>;\n\t\n\t#isInited = false;\n\t\n\tasync init() {\n\t\t\n\t\tif (!this.#isInited) {\n\t\t\tthis.#isInited = true;\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure<AvatarDoc>(\"users.avatars\", { jsonSchema });\n\t\t\t\n\t\t\tawait this.#maintain();\n\t\t}\n\t\t\n\t}\n\t\n\tasync #maintain() {\n\t\t\n\t\tawait this.collection.updateMany({ meta: { $exists: false } }, { $set: { meta: {} } });\n\t\t\n\t}\n\t\n\tasync save(_id: string, type: string, data: string) {\n\t\tconst binaryData = Binary.createFromBase64(data.slice(data.indexOf(\",\")));\n\t\t\n\t\tconst ts = Date.now().toString(36);\n\t\t\n\t\tawait Promise.all([\n\t\t\tthis.collection.replaceOne({ _id }, {\n\t\t\t\ttype,\n\t\t\t\tsize: binaryData.length(),\n\t\t\t\tts,\n\t\t\t\tdata: binaryData,\n\t\t\t\tmeta: {}\n\t\t\t}, { upsert: true }),\n\t\t\tthis.users.collection.updateOne({ _id }, { $set: { avatar: ts } })\n\t\t]);\n\t\t\n\t}\n\t\n\tasync deleteAvatar(_id: string) {\n\t\t\n\t\tconst [ { deletedCount } ] = await Promise.all([\n\t\t\tthis.collection.deleteOne({ _id }),\n\t\t\tthis.users.collection.updateOne({ _id }, { $set: { avatar: null } })\n\t\t]);\n\t\t\n\t\treturn Boolean(deletedCount);\n\t}\n\t\n}\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../../lib\";\n\n\nexport const schema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"type\",\n\t\t\"size\",\n\t\t\"ts\",\n\t\t\"data\",\n\t\t\"meta\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\ttype: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 256\n\t\t},\n\t\tsize: {\n\t\t\tbsonType: \"number\"\n\t\t},\n\t\tts: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 10\n\t\t},\n\t\tdata: {\n\t\t\tbsonType: \"binData\"\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import { CollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: CollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"email\",\n\t\t\"password\",\n\t\t\"roles\",\n\t\t\"name\",\n\t\t\"org\",\n\t\t\"job\",\n\t\t\"meta\",\n\t\t\"createdAt\"\n\t],\n\tproperties: {\n\t\t_id: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.source\n\t\t},\n\t\temail: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.email.source\n\t\t},\n\t\tpassword: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.argon2.source\n\t\t},\n\t\troles: {\n\t\t\tbsonType: \"array\",\n\t\t\tuniqueItems: true,\n\t\t\titems: {\n\t\t\t\tbsonType: \"string\",\n\t\t\t\tpattern: regexps.role.source\n\t\t\t},\n\t\t\tadditionalItems: false\n\t\t},\n\t\tname: {\n\t\t\tbsonType: \"object\",\n\t\t\trequired: [\n\t\t\t\t\"first\",\n\t\t\t\t\"middle\",\n\t\t\t\t\"last\"\n\t\t\t],\n\t\t\tproperties: {\n\t\t\t\tfirst: {\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 512\n\t\t\t\t},\n\t\t\t\tmiddle: {\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 512\n\t\t\t\t},\n\t\t\t\tlast: {\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 512\n\t\t\t\t}\n\t\t\t},\n\t\t\tadditionalProperties: false\n\t\t},\n\t\torg: {\n\t\t\toneOf: [\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tpattern: regexps._id.source\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"null\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tjob: {\n\t\t\tbsonType: \"string\",\n\t\t\tmaxLength: 512\n\t\t},\n\t\tavatar: {\n\t\t\toneOf: [\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"string\",\n\t\t\t\t\tmaxLength: 10\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbsonType: \"null\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n\t\tmeta: {\n\t\t\tbsonType: \"object\"\n\t\t},\n\t\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import {\n\t_ids,\n\tdebounce,\n\tempty,\n\thasAny,\n\tremoveOne\n} from \"@nesvet/n\";\nimport type { Abilities, AbilitiesSchema } from \"insite-common\";\nimport type { GenericAbilities } from \"../abilities/types\";\nimport type { Org } from \"../orgs/Org\";\nimport type { Role } from \"../roles/Role\";\nimport type { Session } from \"../sessions/Session\";\nimport type { UserDoc } from \"./types\";\nimport type { Users } from \"./Users\";\n\n\nconst rolesSnapshots = new Map();\nconst permissionsSnapshots = new Map();\n\nconst staticUrl = process.env.INSITE_STATIC_URL ?? \"http://localhost:8080\";\n\n\nexport class User<AS extends AbilitiesSchema> {\n\tconstructor(users: Users<AS>, userDoc: UserDoc) {\n\t\tthis.#users = users;\n\t\t\n\t\tthis._id = userDoc._id;\n\t\tusers.set(this._id, this);\n\t\t\n\t\tthis.update(userDoc);\n\t\t\n\t\tif (users.isInited)\n\t\t\tusers.emit(\"user-create\", this);\n\t\t\n\t}\n\t\n\t_id;\n\temail!: string;\n\tname = {\n\t\tfirst: \"\",\n\t\tmiddle: \"\",\n\t\tlast: \"\"\n\t};\n\t\n\tinitials = \"\";\n\tdisplayLabel = \"\";\n\torg!: Org<AS>;\n\tjob: string = \"\";\n\tavatar: string | null = null;\n\tavatarUrl: string | null = null;\n\t\n\t#users;\n\t\n\tisUser = true;\n\tisRoot?: boolean;\n\t\n\troles = new Set<Role<AS>>();\n\townRoles: Role<AS>[] = [];\n\townRoleIds: string[] = [];\n\tslaveRoles = new Set<Role<AS>>();\n\tslaveRoleIds: string[] = [];\n\tabilities: Abilities<AS> = {};\n\t\n\tslaveOrgs = new Set<Org<AS>>();\n\tslaveUsers = new Set<User<AS>>();\n\tslaves = new Set<Org<AS> | User<AS>>();\n\t\n\tslaveIds: string[] = [];\n\tpermissiveIds: string[] = [];\n\t\n\tsessions = new Set<Session<AS>>();\n\t\n\tisOnline = false;\n\t\n\tupdate({ _id, name, email, roles: ownRoleIds, org: orgId, avatar, ...restProps }: Partial<UserDoc>) {\n\t\t\n\t\tObject.assign(this, restProps);\n\t\t\n\t\tlet isEmailUpdated;\n\t\tif (email && this.email !== email) {\n\t\t\tthis.#users.byEmail.delete(this.email);\n\t\t\tthis.email = email;\n\t\t\tthis.#users.byEmail.set(email, this);\n\t\t\tisEmailUpdated = true;\n\t\t}\n\t\t\n\t\tlet isNameUpdated;\n\t\tlet isLastNameUpdated;\n\t\tif (name && (this.name.first !== name.first || this.name.middle !== name.middle || this.name.last !== name.last)) {\n\t\t\tisLastNameUpdated = this.name.last !== name.last;\n\t\t\tthis.name = {\n\t\t\t\tfirst: name.first ?? \"\",\n\t\t\t\tmiddle: name.middle ?? \"\",\n\t\t\t\tlast: name.last ?? \"\"\n\t\t\t};\n\t\t\tthis.initials = (((name.first?.[0] ?? \"\") + (name.last?.[0] ?? \"\")) || this.email[0]).toUpperCase();\n\t\t\tisNameUpdated = true;\n\t\t}\n\t\t\n\t\tif (isEmailUpdated || isNameUpdated)\n\t\t\tthis.displayLabel = `${this.name.first} ${this.name.last}`.trim() || this.name.middle || this.email;\n\t\t\n\t\tlet isRolesUpdated;\n\t\tif (ownRoleIds) {\n\t\t\tthis.ownRoleIds = ownRoleIds;\n\t\t\t\n\t\t\tconst snapshot = this.ownRoleIds.join(\",\");\n\t\t\t\n\t\t\tif (snapshot !== rolesSnapshots.get(this._id)) {\n\t\t\t\trolesSnapshots.set(this._id, snapshot);\n\t\t\t\tthis.updateRoles();\n\t\t\t\tisRolesUpdated = true;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet isOrgUpdated;\n\t\tif (orgId !== undefined && this.org?._id !== orgId) {\n\t\t\tthis.org?.users.delete(this);\n\t\t\tthis.org = orgId && this.#users.orgs.get(orgId) || this.#users.orgs.null;// eslint-disable-line @stylistic/no-mixed-operators\n\t\t\tthis.org.users.add(this);\n\t\t\tisOrgUpdated = true;\n\t\t}\n\t\t\n\t\tif (avatar !== undefined && this.avatar !== avatar) {\n\t\t\tthis.avatar = avatar;\n\t\t\tthis.avatarUrl = avatar && `${staticUrl}/avatars/${this._id}-${avatar}.webp`;\n\t\t}\n\t\t\n\t\tif (isRolesUpdated || isOrgUpdated) {\n\t\t\tthis.updatePermissions();\n\t\t\t\n\t\t\tif (isLastNameUpdated)\n\t\t\t\tthis.#users.isSortRequired = true;\n\t\t\t\n\t\t\tif (this.#users.isInited)\n\t\t\t\tthis.#users.updateDebounced();\n\t\t\t\n\t\t} else if (isLastNameUpdated)\n\t\t\tthis.#users.sortDebounced();\n\t\t\n\t}\n\t\n\tupdateRoles() {\n\t\t\n\t\tif (this.#users.isInited) {\n\t\t\tthis.ownRoles = [];\n\t\t\tthis.roles.clear();\n\t\t\tthis.slaveRoles.clear();\n\t\t\tempty(this.abilities);\n\t\t\t\n\t\t\tfor (const roleId of this.ownRoleIds) {\n\t\t\t\tconst role = this.#users.roles.get(roleId);\n\t\t\t\tif (role) {\n\t\t\t\t\t\n\t\t\t\t\tthis.ownRoles.push(role);\n\t\t\t\t\tthis.roles.add(role);\n\t\t\t\t\tfor (const involvedRole of role.involves) {\n\t\t\t\t\t\tthis.roles.add(involvedRole);\n\t\t\t\t\t\tthis.slaveRoles.add(involvedRole);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tthis.slaveRoleIds = _ids(this.slaveRoles);\n\t\t\t\t\t\n\t\t\t\t\tthis.#users.abilities.merge(this.abilities as GenericAbilities, role.abilities as GenericAbilities);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (this.roles.has(this.#users.roles.root))\n\t\t\t\tthis.isRoot = true;\n\t\t\t\n\t\t\tthis.trimSessions();\n\t\t}\n\t\t\n\t}\n\t\n\tupdatePermissions() {\n\t\t\n\t\tif (this.#users.isInited) {\n\t\t\tthis.slaveOrgs.clear();\n\t\t\tthis.slaveUsers.clear();\n\t\t\tthis.slaves.clear();\n\t\t\tconst slaveIds = new Set<string>();\n\t\t\t\n\t\t\tfor (const org of this.#users.orgs.sorted)\n\t\t\t\tif ((org.ownerUsers.has(this) || this.isRoot) && !this.slaveOrgs.has(org)) {\n\t\t\t\t\tthis.slaveOrgs.add(org);\n\t\t\t\t\tthis.slaves.add(org);\n\t\t\t\t\tslaveIds.add(org._id);\n\t\t\t\t\tfor (const slaveOrg of org.slaveOrgs) {\n\t\t\t\t\t\tthis.slaveOrgs.add(slaveOrg);\n\t\t\t\t\t\tthis.slaves.add(slaveOrg);\n\t\t\t\t\t\tslaveIds.add(slaveOrg._id);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\n\t\t\tfor (const org of new Set([ this.org, ...this.slaveOrgs, this.#users.orgs.null ]))\n\t\t\t\tfor (const user of org.users)\n\t\t\t\t\tif (user !== this && (hasAny(this.slaveRoles, user.ownRoles) || !user.ownRoles.length)) {\n\t\t\t\t\t\tthis.slaveUsers.add(user);\n\t\t\t\t\t\tthis.slaves.add(user);\n\t\t\t\t\t\tslaveIds.add(user._id);\n\t\t\t\t\t}\n\t\t\t\n\t\t\tthis.slaveIds = [ ...slaveIds ];\n\t\t\t\n\t\t\tconst permissiveOrgIds = [];\n\t\t\tif (this.org._id) {\n\t\t\t\tpermissiveOrgIds.push(this.org._id);\n\t\t\t\tfor (const slaveOrg of this.org.slaveOrgs)\n\t\t\t\t\tif (!this.slaveOrgs.has(slaveOrg))\n\t\t\t\t\t\tpermissiveOrgIds.push(slaveOrg._id);\n\t\t\t}\n\t\t\t\n\t\t\tthis.permissiveIds = [ ...permissiveOrgIds, this._id, ...slaveIds ];\n\t\t\t\n\t\t\t\n\t\t\tconst snapshot = [\n\t\t\t\tthis.permissiveIds.join(\",\"),\n\t\t\t\tthis.ownRoleIds.join(\",\"),\n\t\t\t\tJSON.stringify(this.abilities),\n\t\t\t\tthis.slaveRoleIds.join(\",\")\n\t\t\t].join(\"\\n\");\n\t\t\t\n\t\t\tif (snapshot !== permissionsSnapshots.get(this._id)) {\n\t\t\t\tpermissionsSnapshots.set(this._id, snapshot);\n\t\t\t\t\n\t\t\t\tthis.#users.emit(\"user-permissions-change\", this);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\ttrimSessions() {\n\t\t\n\t\tconst sessionsLimit = this.abilities.login?.sessionsLimit ?? 0;\n\t\t\n\t\tif (this.sessions.size > sessionsLimit)\n\t\t\treturn this.#users.sessions.collection.deleteMany({\n\t\t\t\t_id: {\n\t\t\t\t\t$in: _ids(\n\t\t\t\t\t\t[ ...this.sessions ]\n\t\t\t\t\t\t\t.sort((a, b) => a.expiresAt.valueOf() - b.expiresAt.valueOf())\n\t\t\t\t\t\t\t.slice(0, this.sessions.size - sessionsLimit)\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t});\n\t\t\n\t\treturn null;\n\t}\n\t\n\tupdateIsOnline = debounce(() => {\n\t\t\n\t\tlet isOnline = false;\n\t\t\n\t\tfor (const session of this.sessions)\n\t\t\tif (session.isOnline) {\n\t\t\t\tisOnline = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\n\t\tif (this.isOnline !== isOnline) {\n\t\t\tthis.isOnline = isOnline;\n\t\t\tthis.#users.emit(\"user-is-online\", this);\n\t\t}\n\t\t\n\t}, 500);\n\t\n\tdelete() {\n\t\t\n\t\tthis.org.users.delete(this);\n\t\t\n\t\tthis.#users.delete(this._id);\n\t\tthis.#users.byEmail.delete(this.email);\n\t\tremoveOne(this.#users.sorted, this);\n\t\t\n\t\trolesSnapshots.delete(this._id);\n\t\tpermissionsSnapshots.delete(this._id);\n\t\t\n\t\tthis.#users.replace(this._id);\n\t\t\n\t\tthis.#users.updateDebounced();\n\t\t\n\t}\n\t\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Err", "AbilityError", "longId", "payload", "add", "assignPath", "deletePath", "empty", "getPath", "intersection", "pick", "setPath", "isAbilityObject", "value", "isAbilityParamNumber", "isAbilityParamItems", "schemaParentMap", "AbilitiesMap", "abilitiesSchema", "subSchema", "#hierarchical", "parse", "schemas", "parent", "level", "schema", "longId", "subIds", "subId", "_id", "top", "paramId", "schemaOrLongId", "paramIdOrMax", "max", "ability", "paramSchema", "schemasOrIds", "a", "b", "schemaMaxMap", "resolve", "_schema", "parentSchema", "assignPath", "_max", "abilities", "subSchemas", "subAbilities", "i", "abilityParam", "value", "getPath", "setPath", "referenceValue", "isAbilityParamNumber", "isAbilityParamItems", "itemId", "intersection", "item", "adjustedAbilities", "adjustedAbility", "isAbilityObject", "pick", "empty", "target", "source", "targetAbility", "sourceAbility", "add", "deletePath", "Err", "RolesError", "stringOrArray", "payload", "debounce", "deleteProps", "getAll", "intersection", "reAdd", "removeAll", "snapshots", "Role", "roles", "roleDoc", "#roles", "_id", "ownInvolveIds", "ownAbilities", "title", "restProps", "next", "snapshot", "regexps", "basisSchema", "regexps", "indexes", "preventDirectDelete", "Roles", "users", "options", "rootProps", "initOptions", "Role", "#isInited", "customSchema", "customIndexes", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "#maintain", "roleDoc", "next", "role", "involvedBy", "involvedRoleId", "involvedRole", "involvedByRole", "reAdd", "#sortRoles", "a", "b", "array", "anotherRole", "getAll", "sorted", "involvedRoleIndex", "_o", "debounce", "_id", "involves", "title", "description", "restProps", "roleId", "updates", "ids", "roles", "intersection", "cleanedUpIds", "abilityLongId", "set", "paramId", "value", "Err", "SubordinationError", "Err", "type", "ids", "payload", "argon2", "EventEmitter", "_ids", "debounce", "deleteProps", "removeAll", "StatefulPromise", "without", "newObjectIdString", "_ids", "debounce", "deleteProps", "EmptyArray", "EmptySet", "removeAll", "sort", "union", "without", "newObjectIdString", "snapshots", "Org", "orgs", "orgDoc", "_id", "title", "ownerIds", "restProps", "next", "snapshot", "basisSchema", "regexps", "indexes", "preventDirectDelete", "Orgs", "users", "options", "#isPreinited", "customSchema", "customIndexes", "nullProps", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "Org", "EmptyArray", "EmptySet", "#maintain", "orgDoc", "#isInited", "next", "org", "#resolve", "slaveOrgs", "ownerOrg", "slaveOrg", "array", "sorted", "ownerId", "ownerUser", "anotherOrg", "#sortOrgs", "sort", "i", "slaveOrgIndex", "o", "length", "a", "b", "debounce", "title", "note", "restProps", "newObjectIdString", "_id", "updates", "byUser", "union", "without", "_ids", "fromId", "toId", "handler", "crypto", "deleteProps", "random", "removeAll", "basisSchema", "regexps", "Session", "sessions", "sessionDoc", "user", "#sessions", "_id", "isOnline", "restProps", "updates", "ts", "expireAfterSeconds", "indexes", "Sessions", "users", "options", "customSchema", "customIndexes", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "#maintain", "sessionDoc", "next", "Session", "_id", "crypto", "random", "user", "props", "ts", "session", "deletedCount", "Binary", "schema", "regexps", "Avatars", "users", "#isInited", "schema", "#maintain", "_id", "type", "data", "binaryData", "Binary", "ts", "deletedCount", "basisSchema", "regexps", "_ids", "debounce", "empty", "hasAny", "removeOne", "rolesSnapshots", "permissionsSnapshots", "staticUrl", "User", "users", "userDoc", "#users", "_id", "name", "email", "ownRoleIds", "orgId", "avatar", "restProps", "isEmailUpdated", "isNameUpdated", "isLastNameUpdated", "isRolesUpdated", "snapshot", "isOrgUpdated", "roleId", "role", "involvedRole", "slaveIds", "org", "slaveOrg", "user", "permissiveOrgIds", "sessionsLimit", "a", "b", "isOnline", "session", "indexes", "Users", "_Users", "collections", "options", "eventEmitter", "EventEmitter", "AbilitiesMap", "#isPreinited", "customIndexes", "customSchema", "initialRootProps", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "#maintain", "userDoc", "rolesOptions", "orgsOptions", "sessionsOptions", "Roles", "Orgs", "Sessions", "Avatars", "next", "User", "#initPromise", "a", "b", "debounce", "shouldUpdateRoles", "user", "StatefulPromise", "email", "password", "roles", "name", "org", "job", "restProps", "newObjectIdString", "_id", "updates", "byUser", "without", "newPassword", "sessionProps", "session", "#sortUsersAndOrgs", "Org", "ids", "_ids", "fromId", "toId", "handler", "deletedCount"]
7
7
  }
@@ -1,9 +1,13 @@
1
1
  import { Err } from "@nesvet/n";
2
- type Type = "_id" | "permissiveIds" | "slaveIds";
2
+ export declare class UnauthorizedError extends Err {
3
+ constructor(payload?: object);
4
+ name: string;
5
+ }
6
+ type SubordinationType = "_id" | "permissiveIds" | "slaveIds";
3
7
  export declare class SubordinationError extends Err {
4
8
  constructor(payload?: object);
5
- constructor(type: Type, payload?: object);
6
- constructor(type: Type, ids: string[] | string, payload?: object);
9
+ constructor(type: SubordinationType, payload?: object);
10
+ constructor(type: SubordinationType, ids: string[] | string, payload?: object);
7
11
  name: string;
8
12
  }
9
13
  export declare class PermissionError extends Err {
@@ -1 +1 @@
1
- {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/users/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGhC,KAAK,IAAI,GAAG,KAAK,GAAG,eAAe,GAAG,UAAU,CAAC;AAGjD,qBAAa,kBAAmB,SAAQ,GAAG;gBAC9B,OAAO,CAAC,EAAE,MAAM;gBAChB,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM;gBAC5B,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAqBhE,IAAI,SAAwB;CAE5B;AAED,qBAAa,eAAgB,SAAQ,GAAG;gBAC3B,OAAO,CAAC,EAAE,MAAM;IAK5B,IAAI,SAAqB;CAEzB"}
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/users/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAGhC,qBAAa,iBAAkB,SAAQ,GAAG;gBAC7B,OAAO,CAAC,EAAE,MAAM;IAK5B,IAAI,SAAuB;CAE3B;AAGD,KAAK,iBAAiB,GAAG,KAAK,GAAG,eAAe,GAAG,UAAU,CAAC;AAE9D,qBAAa,kBAAmB,SAAQ,GAAG;gBAC9B,OAAO,CAAC,EAAE,MAAM;gBAChB,IAAI,EAAE,iBAAiB,EAAE,OAAO,CAAC,EAAE,MAAM;gBACzC,IAAI,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;IAqB7E,IAAI,SAAwB;CAE5B;AAGD,qBAAa,eAAgB,SAAQ,GAAG;gBAC3B,OAAO,CAAC,EAAE,MAAM;IAK5B,IAAI,SAAqB;CAEzB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "insite-users-server",
3
- "version": "2.1.5",
3
+ "version": "2.1.6",
4
4
  "description": "inSite users server side",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",