insite-users-server 2.0.2 → 2.0.3
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/dist/abilities/Map.d.ts +1 -1
- package/dist/abilities/Map.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/index.js.map +3 -3
- package/dist/orgs/Orgs.d.ts +2 -1
- package/dist/orgs/Orgs.d.ts.map +1 -1
- package/dist/roles/Roles.d.ts +1 -1
- package/dist/roles/Roles.d.ts.map +1 -1
- package/dist/users/Users.d.ts +2 -1
- package/dist/users/Users.d.ts.map +1 -1
- package/package.json +1 -1
package/dist/abilities/Map.d.ts
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { User } from "../users/User";
|
|
2
2
|
import type { AbilitiesSchema, AbilitySchema, AbilityWithParams, GenericAbilities } from "./types";
|
|
3
3
|
export declare class AbilitiesMap<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, AbilitySchema> {
|
|
4
|
-
#private;
|
|
5
4
|
constructor(schema: AbilitiesSchema);
|
|
6
5
|
schema: AbilitiesSchema;
|
|
6
|
+
private parse;
|
|
7
7
|
merge(target: GenericAbilities, source: GenericAbilities): GenericAbilities;
|
|
8
8
|
getMinimumOf(_id: string): true | AbilityWithParams;
|
|
9
9
|
getMaximum(): GenericAbilities;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Map.d.ts","sourceRoot":"","sources":["../../src/abilities/Map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EACX,eAAe,EAKf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,SAAS,CAAC;AAGjB,qBAAa,YAAY,CAAC,EAAE,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC
|
|
1
|
+
{"version":3,"file":"Map.d.ts","sourceRoot":"","sources":["../../src/abilities/Map.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AAC1C,OAAO,KAAK,EACX,eAAe,EAKf,aAAa,EACb,iBAAiB,EACjB,gBAAgB,EAChB,MAAM,SAAS,CAAC;AAGjB,qBAAa,YAAY,CAAC,EAAE,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC;gBAC7F,MAAM,EAAE,eAAe;IASnC,MAAM,kBAAC;IAEP,OAAO,CAAC,KAAK;IASb,KAAK,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,gBAAgB;IAgCxD,YAAY,CAAC,GAAG,EAAE,MAAM;IAgBxB,UAAU;IAkBV,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;CA2B3B"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import*as O from"argon2";import he from"eventemitter3";import{_ids as me,debounce as H,deleteProps as C,removeAll as ue}from"@nesvet/n";import{newObjectIdString as fe}from"insite-db";var
|
|
2
|
-
`);n!==R.get(this._id)&&(R.set(this._id,n),this.roles.users.isInited&&this.roles.updateDebounced(),this.roles.users.emit("roles-role-update",this,r))}}delete(){this.roles.delete(this._id),R.delete(this._id),this.roles.updateDebounced()}};var g={required:["_id","involves","abilities","title","description","createdAt"],properties:{_id:{bsonType:"string",pattern:a.role.source,not:{enum:["root"]}},involves:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a.role.source,not:{enum:["root"]}},additionalItems:!1},abilities:{bsonType:"object"},title:{bsonType:"string",maxLength:256},description:{bsonType:"string",maxLength:10240},createdAt:{bsonType:"number"}},additionalProperties:!1};var te=[[{involves:1}]];function G(){throw new Error("Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.collectionDelete instead.")}var _=class extends Map{constructor(e,s={}){super();let{root:t,...i}=s;this.users=e,this.collections=e.collections,this.abilitiesMap=e.abilitiesMap,this.root=new f(this,{...t,_id:"root",involves:[],abilities:this.abilitiesMap.getMaximum(),title:"Root",description:"Root",createdAt:Date.now()}),this.initOptions=i}users;collections;collection;abilitiesMap;root;initOptions;load(e){new f(this,e)}resolve(e,s){s=[e,...s];for(let t of e.ownInvolveIds){let i=this.get(t);if(i){for(let o of s)se(o.involves,i),this.abilitiesMap.merge(o.inheritedAbilities,i.abilities);i!==e&&this.resolve(i,s)}}}sorted=[];#e(e,s){return s.involves.size-e.involves.size||(e.title&&s.title?e.title>s.title?1:e.title<s.title?-1:0:e.title?-1:s.title||e._id>s._id?1:e._id<s._id?-1:0)}update(){let e=[...this.values()];this.root.ownInvolveIds=[];for(let i of e)i!==this.root&&!e.some(o=>o.ownInvolveIds.includes(i._id))&&this.root.ownInvolveIds.push(i._id),i.involves.clear(),i.abilities=structuredClone(i.ownAbilities),i.inheritedAbilities={};this.root.involves.add(this.root),this.resolve(this.root,[]);for(let i of e)i.ownInvolves=W(this,i.ownInvolveIds,!0).sort(this.#e).reverse();let s=[this.root];for(let i=0;i<s.length;i++){let o=s[i];for(let r of o.ownInvolves){let n=s.indexOf(r);~n&&(s.splice(n,1),i--),s.splice(i+1,0,r)}}let t=0;for(let i of s)this.abilitiesMap.merge(i.abilities,i.inheritedAbilities),i._o=t++;this.sorted=s,this.users.emit("roles-update"),this.users.isInited&&(this.users.updateDebounced.clear(),this.users.update(!0))}updateDebounced=Y(this.update,250);init=async()=>{let{schema:e,indexes:s}=this.initOptions;e&&(e.required&&ie(e.required,g.required),e.properties&&k(e,Object.keys(g.properties)));let t={...g,...e,required:[...g.required,...e?.required??[]],properties:{...g.properties,...e?.properties}};this.collection=Object.assign(await this.collections.ensure("roles",{jsonSchema:t}),{deleteOne:G,deleteMany:G}),this.collection.ensureIndexes([...te,...s??[]]);for(let i of await this.collection.find().toArray())this.load(i);await this.update(),this.collection.changeListeners.add(i=>{switch(i.operationType){case"insert":{let o=new f(this,i.fullDocument);this.users.emit("roles-role-update",o,i);break}case"replace":this.get(i.documentKey._id)?.update(i.fullDocument,i);break;case"update":this.get(i.documentKey._id)?.update(i.updateDescription.updatedFields,i);break;case"delete":this.get(i.documentKey._id)?.delete(),this.users.emit("roles-role-update",null,i)}}),delete this.initOptions,delete this.init};new({_id:e,involves:s,title:t,description:i,...o}){return this.collection.insertOne({_id:e,involves:s||[],abilities:{},title:t??"",description:i??"",...k(o,["abilities"]),createdAt:Date.now()})}collectionDelete(e){let s=typeof e=="string"?e:e._id;return this.collection.bulkWrite([{updateMany:{filter:{involves:s},update:{$pullAll:{involves:[s]}}}},{deleteOne:{filter:{_id:s}}}])}cleanUpIds(e){let s=ee(this.sorted,W(this,e,!0)),t=[];for(let i of s)s.every(o=>o===i||!o.involves.has(i))&&t.push(i._id);return t}};import K from"node:crypto";import{deleteProps as oe,random as N,removeAll as re}from"@nesvet/n";var b={required:["_id","user","remoteAddress","isOnline","createdAt","prolongedAt","expiresAt"],properties:{_id:{bsonType:"string",pattern:a.sessionId.source},user:{bsonType:"string",pattern:a._id.source},userAgent:{bsonType:"string",maxLength:4096},remoteAddress:{bsonType:"string",pattern:a.ip.source},isOnline:{bsonType:"bool"},createdAt:{bsonType:"number"},prolongedAt:{bsonType:"number"},expiresAt:{bsonType:"date"}},additionalProperties:!1};var S=class{constructor(e,s){let t=e.users.get(s.user);t?(this.sessions=e,this._id=s._id,this.sessions.set(this._id,this),this.user=t,this.user.sessions.add(this),this.sessions.users.bySessionId.set(this._id,this.user),this.update(s)):e.collection.deleteOne({_id:s._id})}_id;user;isOnline=!1;userAgent;remoteAddress;createdAt;prolongedAt;expiresAt;sessions;update({_id:e,user:s,isOnline:t,...i}){t!==void 0&&this.isOnline!==t&&(this.isOnline=t,this.sessions.isInited&&this.user.isOnline!==this.isOnline&&this.user.updateIsOnline()),Object.assign(this,i)}prolong({_id:e,user:s,...t}){let i=Date.now();return t.prolongedAt=i,t.expiresAt=new Date(i+this.sessions.collection.expireAfterSeconds*1e3),this.update(t),this.sessions.collection.updateOne({_id:this._id},{$set:t})}offline(){let e={isOnline:!1};return this.update(e),this.sessions.collection.updateOne({_id:this._id},{$set:e})}delete(){this.sessions.delete(this._id),this.user.sessions.delete(this),this.sessions.users.bySessionId.delete(this._id),this.sessions.users.emit("session-delete",this),this.isOnline&&this.user.updateIsOnline()}};var U=3600*24*7,ne=[[{user:1}],[{expiresAt:1},{expireAfterSeconds:U}]],I=class extends Map{constructor(e,s={}){super(),this.users=e,this.collections=e.collections,this.initOptions=s}users;collections;initOptions;collection;isInited=!1;uid(){let e;do e=`${K.randomBytes(N(8,16)).toString("hex")}$${K.randomBytes(N(8,16)).toString("hex")}`;while(this.has(e));return e}load(e){new S(this,e)}init=async()=>{let{schema:e,indexes:s}=this.initOptions;e&&(e.required&&re(e.required,b.required),e.properties&&oe(e,Object.keys(b.properties)));let t={...b,...e,required:[...b.required,...e?.required??[]],properties:{...b.properties,...e?.properties}};this.collection=Object.assign(await this.collections.ensure("sessions",{jsonSchema:t}),{expireAfterSeconds:U}),this.collection.ensureIndexes([...ne,...s??[]]),await this.collection.updateMany({isOnline:!0},{$set:{isOnline:!1}});for(let i of await this.collection.find().toArray())this.load(i);this.collection.changeListeners.add(i=>{switch(i.operationType){case"insert":this.has(i.documentKey._id)||new S(this,i.fullDocument),this.users.get(i.fullDocument.user)?.trimSessions();break;case"replace":this.get(i.documentKey._id)?.update(i.fullDocument);break;case"update":this.get(i.documentKey._id)?.update(i.updateDescription.updatedFields);break;case"delete":this.get(i.documentKey._id)?.delete()}}),this.isInited=!0,delete this.initOptions,delete this.init};async new(e,s){let t=Date.now(),i={userAgent:"",remoteAddress:"127.0.0.1",isOnline:!0,...s,_id:this.uid(),user:e._id,createdAt:t,prolongedAt:t,expiresAt:new Date(t+U*1e3)},o=new S(this,i);return await this.collection.insertOne(i),o}};var z={required:["_id","type","size","ts","data"],properties:{_id:{bsonType:"string",pattern:a._id.source},type:{bsonType:"string",maxLength:256},size:{bsonType:"number"},ts:{bsonType:"string",maxLength:10},data:{bsonType:"binData"}},additionalProperties:!1};var y=class{constructor(e){this.users=e,this.collections=e.collections}users;collections;collection;init=async()=>{this.collection=await this.collections.ensure("users.avatars",{jsonSchema:z}),delete this.init}};var A={required:["_id","email","password","roles","name","org","job","createdAt"],properties:{_id:{bsonType:"string",pattern:a._id.source},email:{bsonType:"string",pattern:a.email.source},password:{bsonType:"string",pattern:a.argon2.source},roles:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a.role.source},additionalItems:!1},name:{bsonType:"object",required:["first","middle","last"],properties:{first:{bsonType:"string",maxLength:512},middle:{bsonType:"string",maxLength:512},last:{bsonType:"string",maxLength:512}},additionalProperties:!1},org:{oneOf:[{bsonType:"string",pattern:a._id.source},{bsonType:"null"}]},job:{bsonType:"string",maxLength:512},avatar:{oneOf:[{bsonType:"string",maxLength:10},{bsonType:"null"}]},createdAt:{bsonType:"number"}},additionalProperties:!1};import{_ids as F,debounce as le,empty as ae,hasAny as de,removeOne as ce}from"@nesvet/n";var T=new Map,P=new Map,pe=process.env.INSITE_STATIC_URL??"http://localhost:8080",h=class{constructor(e,s){this.users=e,this._id=s._id,e.set(this._id,this),this.update(s),e.isInited&&e.emit("user-create",this)}_id;email;name={first:"",middle:"",last:""};initials="";displayLabel="";org;job="";avatar=null;avatarUrl=null;users;isUser=!0;isRoot;roles=new Set;ownRoles=[];ownRoleIds=[];slaveRoles=new Set;slaveRoleIds=[];abilities={};slaveOrgs=new Set;slaveUsers=new Set;slaves=new Set;slaveIds=[];permissiveIds=[];sessions=new Set;isOnline=!1;update({_id:e,name:s,email:t,roles:i,org:o,avatar:r,...n}){Object.assign(this,n);let l;t&&this.email!==t&&(this.users.byEmail.delete(this.email),this.email=t,this.users.byEmail.set(t,this),l=!0);let c,m;s&&(this.name.first!==s.first||this.name.middle!==s.middle||this.name.last!==s.last)&&(m=this.name.last!==s.last,this.name={first:s.first??"",middle:s.middle??"",last:s.last??""},this.initials=((s.first?.[0]??"")+(s.last?.[0]??"")||this.email[0]).toUpperCase(),c=!0),(l||c)&&(this.displayLabel=`${this.name.first} ${this.name.last}`.trim()||this.name.middle||this.email);let q;if(i){this.ownRoleIds=i;let L=this.ownRoleIds.join(",");L!==T.get(this._id)&&(T.set(this._id,L),this.updateRoles(),q=!0)}let j;o!==void 0&&this.org?._id!==o&&(this.org?.users.delete(this),this.org=o&&this.users.orgs.get(o)||this.users.orgs.null,this.org.users.add(this),j=!0),r!==void 0&&this.avatar!==r&&(this.avatar=r,this.avatarUrl=r&&`${pe}/avatars/${this._id}-${r}.webp`),q||j?(this.updatePermissions(),m&&(this.users.isSortRequired=!0),this.users.isInited&&this.users.updateDebounced()):m&&this.users.sortDebounced()}updateRoles(){if(this.users.isInited){this.ownRoles=[],this.roles.clear(),this.slaveRoles.clear(),ae(this.abilities);for(let e of this.ownRoleIds){let s=this.users.roles.get(e);if(s){this.ownRoles.push(s),this.roles.add(s);for(let t of s.involves)this.roles.add(t),this.slaveRoles.add(t);this.slaveRoleIds=F(this.slaveRoles),this.users.abilitiesMap.merge(this.abilities,s.abilities)}}this.roles.has(this.users.roles.root)&&(this.isRoot=!0),this.trimSessions()}}updatePermissions(){if(this.users.isInited){this.slaveOrgs.clear(),this.slaveUsers.clear(),this.slaves.clear();let e=new Set;for(let i of this.users.orgs.sorted)if((i.ownerUsers.has(this)||this.isRoot)&&!this.slaveOrgs.has(i)){this.slaveOrgs.add(i),this.slaves.add(i),e.add(i._id);for(let o of i.slaveOrgs)this.slaveOrgs.add(o),this.slaves.add(o),e.add(o._id)}for(let i of new Set([this.org,...this.slaveOrgs,this.users.orgs.null]))for(let o of i.users)o!==this&&(de(this.slaveRoles,o.ownRoles)||!o.ownRoles.length)&&(this.slaveUsers.add(o),this.slaves.add(o),e.add(o._id));this.slaveIds=[...e];let s=[];if(this.org._id){s.push(this.org._id);for(let i of this.org.slaveOrgs)this.slaveOrgs.has(i)||s.push(i._id)}this.permissiveIds=[...s,this._id,...e];let t=[this.permissiveIds.join(","),this.ownRoleIds.join(","),JSON.stringify(this.abilities),this.slaveRoleIds.join(",")].join(`
|
|
3
|
-
`);t!==
|
|
1
|
+
import*as O from"argon2";import he from"eventemitter3";import{_ids as me,debounce as H,deleteProps as C,removeAll as ue}from"@nesvet/n";import{newObjectIdString as fe}from"insite-db";var v=class extends Map{constructor(e){super(),this.schema=e,this.parse(this.schema)}schema;parse(e){for(let s of e)this.set(s._id,s),s.subAbilities&&this.parse(s.subAbilities)}merge(e,s){for(let[t,i]of Object.entries(s)){let o=this.get(t);if(o){if(o.isInheritable!==!1&&i){if(!(t in e))e[t]=structuredClone(i);else if(o.params){let r=e[t],n=i;for(let l of o.params)if(l.isInheritable!==!1&&l._id in n){if(!(l._id in r))r[l._id]=structuredClone(n[l._id]);else if(l.type==="number")r[l._id]<n[l._id]&&(r[l._id]=n[l._id]);else if(l.type==="items"){let c=r[l._id];for(let m of n[l._id])c.includes(m)||c.push(m)}}}}}else delete s[t]}return e}getMinimumOf(e){let s=this.get(e);if(s?.params){let t={};for(let i of s.params)i.type==="number"?t[i._id]=i.min??0:i.type==="items"&&(t[i._id]=[]);return t}return!0}getMaximum(){return[...this.values()].reduce((e,s)=>{if(s.params){let t={};for(let i of s.params)i.type==="number"?t[i._id]=i.max??0:i.type==="items"&&(t[i._id]=i.items.map(o=>o._id));e[s._id]=t}else e[s._id]=!0;return e},{})}getSchemeFor(e){return function s(t){for(let i=0;i<t.length;i++){let o=t[i],r=e.abilities[o._id];if(r){if(o.params)for(let n of o.params){let l=r[n._id];if(n.type==="number")"max"in n&&(n.max=l);else if(n.type==="items")for(let c=0;c<n.items.length;c++)l.includes(n.items[c]._id)||n.items.splice(c--,1)}o.subAbilities&&s(o.subAbilities)}else t.splice(i--,1)}return t}(structuredClone(this.schema))}};import{debounce as B,deleteProps as E,EmptyArray as J,EmptySet as x,removeAll as Z,sort as Q}from"@nesvet/n";import{newObjectIdString as V}from"insite-db";var D=new Map,p=class{constructor(e,s){this.orgs=e,this._id=s._id,e.set(this._id,this),this.update(s)}_id;title="";initials="";displayLabel="";_o=0;orgs;isOrg=!0;ownerOrgs=new Set;ownerUsers=new Set;users=new Set;slaveOrgs=new Set;ownerIds=[];update({_id:e,title:s,owners:t,...i},o){if(Object.assign(this,i),s!==void 0&&(this.title=s,this.initials=s?.[0]?.toUpperCase()??"",this.displayLabel=s),t){this.ownerIds=t;let r=this.ownerIds.join(",");r!==D.get(this._id)&&(D.set(this._id,r),this.orgs.users.isInited&&this.orgs.updateDebounced(),this.orgs.users.emit("orgs-org-update",this,o))}}delete(){this.orgs.delete(this._id),D.delete(this._id),this.orgs.replace(this._id),this.orgs.updateDebounced()}};var a={_id:/^[\dA-Fa-f]{24}$/,email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,argon2:/^\$argon2(?:i|d|id)\$v=\d+\$m=\d+,t=\d+,p=\d+(?:\$[\d+/A-Za-z]+){2}$/,sessionId:/^[\dA-Fa-f]{16,32}\$[\dA-Fa-f]{16,32}$/,role:/^[\d_a-z-]{1,64}$/,ip:/^(?:\d{1,3}\.){3}\d{1,3}$/};var u={required:["_id","title","note","owners","createdAt"],properties:{_id:{bsonType:"string",pattern:a._id.source},title:{bsonType:"string",maxLength:512},note:{bsonType:"string",maxLength:131072},owners:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a._id.source},additionalItems:!1},createdAt:{bsonType:"number"}},additionalProperties:!1};var X=[[{owners:1}]];function $(){throw new Error("Direct usage of orgs collection.deleteOne or .deleteMany is forbidden. Use orgs.collectionDelete instead.")}var w=class extends Map{constructor(e,s={}){super(),this.users=e,this.collections=e.collections,this.preinitOptions=s}users;collections;preinitOptions;collection;null;load(e){new p(this,e)}resolve(e,s){s=[e,...s];for(let t of e.ownerOrgs){this.resolve(t,s);for(let i of s)t.slaveOrgs.add(i)}}sorted=[];update(){let e=[...this.values()],s=[];for(let t of e){t.ownerOrgs.clear(),t.ownerUsers.clear(),t.slaveOrgs.clear();for(let i of t.ownerIds){let o=this.get(i);if(o)t.ownerOrgs.add(o);else{let r=this.users.get(i);r&&t.ownerUsers.add(r)}}!t.ownerOrgs.size&&t._id&&s.push(t)}for(let t of e)e.some(i=>i.ownerOrgs.has(t))||this.resolve(t,[]);s.sort(this.sortOrgs);for(let t of e)Q(t.slaveOrgs,this.sortOrgs);for(let t=0;t<s.length;t++){let i=s[t];for(let o of[...i.slaveOrgs].reverse())if(o.ownerOrgs.has(i)){let r=s.indexOf(o);~r&&(s.splice(r,1),t--),s.splice(t+1,0,o)}}for(let{length:t}=s,i=0;i<t;)s[i]._o=i++;this.sorted=s,this.users.emit("orgs-update"),this.users.isInited&&(this.users.updateDebounced.clear(),this.users.update())}sortOrgs(e,s){return s.slaveOrgs.size-e.slaveOrgs.size||(e.title>s.title?1:e.title<s.title?-1:0)}updateDebounced=B(this.update,250);preinit=async()=>{let{schema:e,indexes:s,null:t}=this.preinitOptions;e&&(e.required&&Z(e.required,u.required),e.properties&&E(e,Object.keys(u.properties)));let i={...u,...e,required:[...u.required,...e?.required??[]],properties:{...u.properties,...e?.properties}};this.collection=Object.assign(await this.collections.ensure("orgs",{jsonSchema:i}),{deleteOne:$,deleteMany:$}),this.collection.ensureIndexes([...X,...s??[]]),this.null=Object.assign(new p(this,{...t,_id:"",title:"",note:"",owners:[],createdAt:Date.now()}),{_id:null,ownerIds:new J,ownerOrgs:new x,ownerUsers:new x,slaveOrgs:new x});for(let o of await this.collection.find().toArray())this.load(o);delete this.preinitOptions,delete this.preinit};init=async()=>{await this.update(),this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":{let s=new p(this,e.fullDocument);this.users.emit("orgs-org-update",s,e);break}case"replace":this.get(e.documentKey._id)?.update(e.fullDocument,e);break;case"update":this.get(e.documentKey._id)?.update(e.updateDescription.updatedFields,e);break;case"delete":this.get(e.documentKey._id)?.delete(),this.users.emit("orgs-org-update",null,e)}}),delete this.init};new({title:e,note:s,...t},i){return this.collection.insertOne({_id:V(),title:e??"",note:s??"",owners:i?[i]:[],...E(t,["_id","owners"]),createdAt:Date.now()})}collectionDelete(e){let s=typeof e=="string"?e:e._id;return this.collection.bulkWrite([{updateMany:{filter:{owners:s},update:{$pullAll:{owners:[s]}}}},{deleteOne:{filter:{_id:s}}}])}replaceMap=new Map;replaceHandlers=new Set;async replace(e){let s=this.replaceMap.get(e)??null;s&&this.replaceMap.delete(e);for(let t of this.replaceHandlers)await t(e,s)}};import{debounce as Y,deleteProps as k,getAll as W,intersection as ee,reAdd as se,removeAll as ie}from"@nesvet/n";var R=new Map,f=class{constructor(e,s){this.roles=e,this._id=s._id,e.set(this._id,this),this.update(s)}roles;_id;ownInvolveIds;ownAbilities;title="";displayTitle="";_o=0;ownInvolves=[];involves=new Set;abilities={};inheritedAbilities={};update({_id:e,involves:s,abilities:t,title:i,...o},r){if(Object.assign(this,o),s&&(this.ownInvolveIds=s),t&&(this.ownAbilities=t),i!==void 0&&(this.title=i,this.displayTitle=i||this._id),s||t){let n=[this.ownInvolveIds.join(","),JSON.stringify(this.ownAbilities)].join(`
|
|
2
|
+
`);n!==R.get(this._id)&&(R.set(this._id,n),this.roles.users.isInited&&this.roles.updateDebounced(),this.roles.users.emit("roles-role-update",this,r))}}delete(){this.roles.delete(this._id),R.delete(this._id),this.roles.updateDebounced()}};var g={required:["_id","involves","abilities","title","description","createdAt"],properties:{_id:{bsonType:"string",pattern:a.role.source,not:{enum:["root"]}},involves:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a.role.source,not:{enum:["root"]}},additionalItems:!1},abilities:{bsonType:"object"},title:{bsonType:"string",maxLength:256},description:{bsonType:"string",maxLength:10240},createdAt:{bsonType:"number"}},additionalProperties:!1};var te=[[{involves:1}]];function G(){throw new Error("Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.collectionDelete instead.")}var _=class extends Map{constructor(e,s={}){super();let{root:t,...i}=s;this.users=e,this.collections=e.collections,this.abilitiesMap=e.abilitiesMap,this.root=new f(this,{...t,_id:"root",involves:[],abilities:this.abilitiesMap.getMaximum(),title:"Root",description:"Root",createdAt:Date.now()}),this.initOptions=i}users;collections;collection;abilitiesMap;root;initOptions;load(e){new f(this,e)}resolve(e,s){s=[e,...s];for(let t of e.ownInvolveIds){let i=this.get(t);if(i){for(let o of s)se(o.involves,i),this.abilitiesMap.merge(o.inheritedAbilities,i.abilities);i!==e&&this.resolve(i,s)}}}sorted=[];sortRoles(e,s){return s.involves.size-e.involves.size||(e.title&&s.title?e.title>s.title?1:e.title<s.title?-1:0:e.title?-1:s.title||e._id>s._id?1:e._id<s._id?-1:0)}update(){let e=[...this.values()];this.root.ownInvolveIds=[];for(let i of e)i!==this.root&&!e.some(o=>o.ownInvolveIds.includes(i._id))&&this.root.ownInvolveIds.push(i._id),i.involves.clear(),i.abilities=structuredClone(i.ownAbilities),i.inheritedAbilities={};this.root.involves.add(this.root),this.resolve(this.root,[]);for(let i of e)i.ownInvolves=W(this,i.ownInvolveIds,!0).sort(this.sortRoles).reverse();let s=[this.root];for(let i=0;i<s.length;i++){let o=s[i];for(let r of o.ownInvolves){let n=s.indexOf(r);~n&&(s.splice(n,1),i--),s.splice(i+1,0,r)}}let t=0;for(let i of s)this.abilitiesMap.merge(i.abilities,i.inheritedAbilities),i._o=t++;this.sorted=s,this.users.emit("roles-update"),this.users.isInited&&(this.users.updateDebounced.clear(),this.users.update(!0))}updateDebounced=Y(this.update,250);init=async()=>{let{schema:e,indexes:s}=this.initOptions;e&&(e.required&&ie(e.required,g.required),e.properties&&k(e,Object.keys(g.properties)));let t={...g,...e,required:[...g.required,...e?.required??[]],properties:{...g.properties,...e?.properties}};this.collection=Object.assign(await this.collections.ensure("roles",{jsonSchema:t}),{deleteOne:G,deleteMany:G}),this.collection.ensureIndexes([...te,...s??[]]);for(let i of await this.collection.find().toArray())this.load(i);await this.update(),this.collection.changeListeners.add(i=>{switch(i.operationType){case"insert":{let o=new f(this,i.fullDocument);this.users.emit("roles-role-update",o,i);break}case"replace":this.get(i.documentKey._id)?.update(i.fullDocument,i);break;case"update":this.get(i.documentKey._id)?.update(i.updateDescription.updatedFields,i);break;case"delete":this.get(i.documentKey._id)?.delete(),this.users.emit("roles-role-update",null,i)}}),delete this.initOptions,delete this.init};new({_id:e,involves:s,title:t,description:i,...o}){return this.collection.insertOne({_id:e,involves:s||[],abilities:{},title:t??"",description:i??"",...k(o,["abilities"]),createdAt:Date.now()})}collectionDelete(e){let s=typeof e=="string"?e:e._id;return this.collection.bulkWrite([{updateMany:{filter:{involves:s},update:{$pullAll:{involves:[s]}}}},{deleteOne:{filter:{_id:s}}}])}cleanUpIds(e){let s=ee(this.sorted,W(this,e,!0)),t=[];for(let i of s)s.every(o=>o===i||!o.involves.has(i))&&t.push(i._id);return t}};import K from"node:crypto";import{deleteProps as oe,random as N,removeAll as re}from"@nesvet/n";var b={required:["_id","user","remoteAddress","isOnline","createdAt","prolongedAt","expiresAt"],properties:{_id:{bsonType:"string",pattern:a.sessionId.source},user:{bsonType:"string",pattern:a._id.source},userAgent:{bsonType:"string",maxLength:4096},remoteAddress:{bsonType:"string",pattern:a.ip.source},isOnline:{bsonType:"bool"},createdAt:{bsonType:"number"},prolongedAt:{bsonType:"number"},expiresAt:{bsonType:"date"}},additionalProperties:!1};var S=class{constructor(e,s){let t=e.users.get(s.user);t?(this.sessions=e,this._id=s._id,this.sessions.set(this._id,this),this.user=t,this.user.sessions.add(this),this.sessions.users.bySessionId.set(this._id,this.user),this.update(s)):e.collection.deleteOne({_id:s._id})}_id;user;isOnline=!1;userAgent;remoteAddress;createdAt;prolongedAt;expiresAt;sessions;update({_id:e,user:s,isOnline:t,...i}){t!==void 0&&this.isOnline!==t&&(this.isOnline=t,this.sessions.isInited&&this.user.isOnline!==this.isOnline&&this.user.updateIsOnline()),Object.assign(this,i)}prolong({_id:e,user:s,...t}){let i=Date.now();return t.prolongedAt=i,t.expiresAt=new Date(i+this.sessions.collection.expireAfterSeconds*1e3),this.update(t),this.sessions.collection.updateOne({_id:this._id},{$set:t})}offline(){let e={isOnline:!1};return this.update(e),this.sessions.collection.updateOne({_id:this._id},{$set:e})}delete(){this.sessions.delete(this._id),this.user.sessions.delete(this),this.sessions.users.bySessionId.delete(this._id),this.sessions.users.emit("session-delete",this),this.isOnline&&this.user.updateIsOnline()}};var U=3600*24*7,ne=[[{user:1}],[{expiresAt:1},{expireAfterSeconds:U}]],I=class extends Map{constructor(e,s={}){super(),this.users=e,this.collections=e.collections,this.initOptions=s}users;collections;initOptions;collection;isInited=!1;uid(){let e;do e=`${K.randomBytes(N(8,16)).toString("hex")}$${K.randomBytes(N(8,16)).toString("hex")}`;while(this.has(e));return e}load(e){new S(this,e)}init=async()=>{let{schema:e,indexes:s}=this.initOptions;e&&(e.required&&re(e.required,b.required),e.properties&&oe(e,Object.keys(b.properties)));let t={...b,...e,required:[...b.required,...e?.required??[]],properties:{...b.properties,...e?.properties}};this.collection=Object.assign(await this.collections.ensure("sessions",{jsonSchema:t}),{expireAfterSeconds:U}),this.collection.ensureIndexes([...ne,...s??[]]),await this.collection.updateMany({isOnline:!0},{$set:{isOnline:!1}});for(let i of await this.collection.find().toArray())this.load(i);this.collection.changeListeners.add(i=>{switch(i.operationType){case"insert":this.has(i.documentKey._id)||new S(this,i.fullDocument),this.users.get(i.fullDocument.user)?.trimSessions();break;case"replace":this.get(i.documentKey._id)?.update(i.fullDocument);break;case"update":this.get(i.documentKey._id)?.update(i.updateDescription.updatedFields);break;case"delete":this.get(i.documentKey._id)?.delete()}}),this.isInited=!0,delete this.initOptions,delete this.init};async new(e,s){let t=Date.now(),i={userAgent:"",remoteAddress:"127.0.0.1",isOnline:!0,...s,_id:this.uid(),user:e._id,createdAt:t,prolongedAt:t,expiresAt:new Date(t+U*1e3)},o=new S(this,i);return await this.collection.insertOne(i),o}};var z={required:["_id","type","size","ts","data"],properties:{_id:{bsonType:"string",pattern:a._id.source},type:{bsonType:"string",maxLength:256},size:{bsonType:"number"},ts:{bsonType:"string",maxLength:10},data:{bsonType:"binData"}},additionalProperties:!1};var y=class{constructor(e){this.users=e,this.collections=e.collections}users;collections;collection;init=async()=>{this.collection=await this.collections.ensure("users.avatars",{jsonSchema:z}),delete this.init}};var A={required:["_id","email","password","roles","name","org","job","createdAt"],properties:{_id:{bsonType:"string",pattern:a._id.source},email:{bsonType:"string",pattern:a.email.source},password:{bsonType:"string",pattern:a.argon2.source},roles:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a.role.source},additionalItems:!1},name:{bsonType:"object",required:["first","middle","last"],properties:{first:{bsonType:"string",maxLength:512},middle:{bsonType:"string",maxLength:512},last:{bsonType:"string",maxLength:512}},additionalProperties:!1},org:{oneOf:[{bsonType:"string",pattern:a._id.source},{bsonType:"null"}]},job:{bsonType:"string",maxLength:512},avatar:{oneOf:[{bsonType:"string",maxLength:10},{bsonType:"null"}]},createdAt:{bsonType:"number"}},additionalProperties:!1};import{_ids as F,debounce as le,empty as ae,hasAny as de,removeOne as ce}from"@nesvet/n";var P=new Map,T=new Map,pe=process.env.INSITE_STATIC_URL??"http://localhost:8080",h=class{constructor(e,s){this.users=e,this._id=s._id,e.set(this._id,this),this.update(s),e.isInited&&e.emit("user-create",this)}_id;email;name={first:"",middle:"",last:""};initials="";displayLabel="";org;job="";avatar=null;avatarUrl=null;users;isUser=!0;isRoot;roles=new Set;ownRoles=[];ownRoleIds=[];slaveRoles=new Set;slaveRoleIds=[];abilities={};slaveOrgs=new Set;slaveUsers=new Set;slaves=new Set;slaveIds=[];permissiveIds=[];sessions=new Set;isOnline=!1;update({_id:e,name:s,email:t,roles:i,org:o,avatar:r,...n}){Object.assign(this,n);let l;t&&this.email!==t&&(this.users.byEmail.delete(this.email),this.email=t,this.users.byEmail.set(t,this),l=!0);let c,m;s&&(this.name.first!==s.first||this.name.middle!==s.middle||this.name.last!==s.last)&&(m=this.name.last!==s.last,this.name={first:s.first??"",middle:s.middle??"",last:s.last??""},this.initials=((s.first?.[0]??"")+(s.last?.[0]??"")||this.email[0]).toUpperCase(),c=!0),(l||c)&&(this.displayLabel=`${this.name.first} ${this.name.last}`.trim()||this.name.middle||this.email);let q;if(i){this.ownRoleIds=i;let L=this.ownRoleIds.join(",");L!==P.get(this._id)&&(P.set(this._id,L),this.updateRoles(),q=!0)}let j;o!==void 0&&this.org?._id!==o&&(this.org?.users.delete(this),this.org=o&&this.users.orgs.get(o)||this.users.orgs.null,this.org.users.add(this),j=!0),r!==void 0&&this.avatar!==r&&(this.avatar=r,this.avatarUrl=r&&`${pe}/avatars/${this._id}-${r}.webp`),q||j?(this.updatePermissions(),m&&(this.users.isSortRequired=!0),this.users.isInited&&this.users.updateDebounced()):m&&this.users.sortDebounced()}updateRoles(){if(this.users.isInited){this.ownRoles=[],this.roles.clear(),this.slaveRoles.clear(),ae(this.abilities);for(let e of this.ownRoleIds){let s=this.users.roles.get(e);if(s){this.ownRoles.push(s),this.roles.add(s);for(let t of s.involves)this.roles.add(t),this.slaveRoles.add(t);this.slaveRoleIds=F(this.slaveRoles),this.users.abilitiesMap.merge(this.abilities,s.abilities)}}this.roles.has(this.users.roles.root)&&(this.isRoot=!0),this.trimSessions()}}updatePermissions(){if(this.users.isInited){this.slaveOrgs.clear(),this.slaveUsers.clear(),this.slaves.clear();let e=new Set;for(let i of this.users.orgs.sorted)if((i.ownerUsers.has(this)||this.isRoot)&&!this.slaveOrgs.has(i)){this.slaveOrgs.add(i),this.slaves.add(i),e.add(i._id);for(let o of i.slaveOrgs)this.slaveOrgs.add(o),this.slaves.add(o),e.add(o._id)}for(let i of new Set([this.org,...this.slaveOrgs,this.users.orgs.null]))for(let o of i.users)o!==this&&(de(this.slaveRoles,o.ownRoles)||!o.ownRoles.length)&&(this.slaveUsers.add(o),this.slaves.add(o),e.add(o._id));this.slaveIds=[...e];let s=[];if(this.org._id){s.push(this.org._id);for(let i of this.org.slaveOrgs)this.slaveOrgs.has(i)||s.push(i._id)}this.permissiveIds=[...s,this._id,...e];let t=[this.permissiveIds.join(","),this.ownRoleIds.join(","),JSON.stringify(this.abilities),this.slaveRoleIds.join(",")].join(`
|
|
3
|
+
`);t!==T.get(this._id)&&(T.set(this._id,t),this.users.emit("user-permissions-change",this))}}trimSessions(){let e=this.abilities.login?.sessionsLimit??0;return this.sessions.size>e?this.users.sessions.collection.deleteMany({_id:{$in:F([...this.sessions].sort((s,t)=>s.expiresAt.valueOf()-t.expiresAt.valueOf()).slice(0,this.sessions.size-e))}}):null}updateIsOnline=le(()=>{let e=!1;for(let s of this.sessions)if(s.isOnline){e=!0;break}this.isOnline!==e&&(this.isOnline=e,this.users.emit("user-is-online",this))},500);delete(){this.org.users.delete(this),this.users.delete(this._id),this.users.byEmail.delete(this.email),ce(this.users.sorted,this),P.delete(this._id),T.delete(this._id),this.users.replace(this._id),this.users.updateDebounced()}};var ge=[[{email:1},{unique:!0}],[{org:1}]],M=class d extends Map{constructor(e,s){super();let t=new he;this._events=t._events,this._eventsCount=t._eventsCount,this.emit=t.emit,this.on=t.on,this.once=t.once,this.addListener=t.addListener,this.off=t.off,this.removeListener=t.removeListener,this.collections=e,this.abilitiesMap=new v(s.abilities),this.initOptions=s,this.initPromise=this.init()}_events;_eventsCount;emit;on;once;addListener;off;removeListener;initOptions;collections;abilitiesMap;collection;roles;sessions;orgs;avatars;isInited=!1;byEmail=new Map;bySessionId=new Map;sorted=[];isSortRequired=!1;load(e){new h(this,e)}sort(){this.isSortRequired=!1,this.sorted=[...this.values()].sort((e,s)=>e.name.last>s.name.last?1:e.name.last<s.name.last?-1:0)}sortDebounced=H(()=>this.sort(),250);update(e){if(e)for(let s of this.values())s.updateRoles();for(let s of this.values())s.updatePermissions();this.isSortRequired&&this.sort()}updateDebounced=H(()=>this.update(),250);preinit=async()=>{let{indexes:e,schema:s,initialRoot:t}=this.initOptions;s&&(s.required&&ue(s.required,A.required),s.properties&&C(s,Object.keys(A.properties)));let i={...A,...s,required:[...A.required,...s?.required??[]],properties:{...A.properties,...s?.properties}};this.collection=await this.collections.ensure("users",{jsonSchema:i}),this.collection.ensureIndexes([...ge,...e??[]]),await this.collection.countDocuments({roles:"root"})||await this.new({email:process.env.INSITE_ROOT_EMAIL??"insite@root.email",password:process.env.INSITE_ROOT_PASSWORD??"inSiteRootPassword",roles:["root"],name:{first:"Root"},org:null,job:"Root",...t&&C(t,["roles","org"])});for(let o of await this.collection.find().toArray())this.load(o);delete this.preinit};initPromise;init=async()=>{this.isInited=!0;let{roles:e,orgs:s,sessions:t}=this.initOptions;return this.roles=new _(this,e),this.orgs=new w(this,s),this.sessions=new I(this,t),this.avatars=new y(this),await this.roles.init(),await this.orgs.preinit(),await this.preinit(),await this.orgs.init(),await this.avatars.init(),this.update(!0),this.collection.changeListeners.add(i=>{switch(i.operationType){case"insert":new h(this,i.fullDocument);break;case"replace":this.get(i.documentKey._id)?.update(i.fullDocument);break;case"update":this.get(i.documentKey._id)?.update(i.updateDescription.updatedFields);break;case"delete":this.get(i.documentKey._id)?.delete()}}),await this.sessions.init(),delete this.initOptions,delete this.init,this};whenReady(){return this.initPromise}async new({email:e,password:s,roles:t,name:i,org:o,job:r,...n}){if(this.byEmail.has(e))throw new Error("User exists");return await this.collection.insertOne({_id:fe(),email:e,password:await O.hash(s),roles:this.isInited?this.roles.cleanUpIds(t):t,name:{first:i.first??"",middle:i.middle??"",last:i.last??""},org:o??null,job:r??"",...C(n,["_id"]),createdAt:Date.now()}),!0}async changePassword(e,s){if(!this.has(e))throw new Error("usernotfound");if(!s)throw new Error("emptypasswordisnotallowed");await Promise.all([this.collection.updateOne({_id:e},{$set:{password:await O.hash(s)}}),this.sessions.collection.deleteMany({user:e})])}async login(e,s,t){let i=this.byEmail.get(e);if(!i)throw new Error("usernotfound");if(!await O.verify(i.password,s))throw new Error("incorrectpassword");if(!i.abilities.login)throw new Error("userisnotabletologin");return this.sessions.new(i,t)}logout(e){return e.delete(),this.sessions.collection.deleteOne({_id:e._id})}sortUsersAndOrgs(e,s){return e instanceof h&&s instanceof h?e.name.last&&s.name.last?e.name.last>s.name.last?1:e.name.last<s.name.last?-1:0:!e.name.last&&!s.name.last?e.displayLabel>s.displayLabel?1:e.displayLabel<s.displayLabel?-1:0:e.name.last?-1:1:e instanceof p&&s instanceof p?e.title>s.title?1:e.title<s.title?-1:0:e instanceof p?-1:1}sortIds(e){return me(e.map(s=>this.get(s)||this.orgs.get(s)).filter(Boolean).sort(this.sortUsersAndOrgs))}replaceMap=new Map;replaceHandlers=new Set;async replace(e){let s=this.replaceMap.get(e)??null;s&&this.replaceMap.delete(e);for(let t of this.replaceHandlers)await t(e,s)}static init(e,s){return new d(e,s).whenReady()}};export{M as Users};
|
|
4
4
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/users/Users.ts", "../src/abilities/Map.ts", "../src/orgs/Orgs.ts", "../src/orgs/Org.ts", "../src/lib/regexps.ts", "../src/orgs/schema.ts", "../src/roles/Roles.ts", "../src/roles/Role.ts", "../src/roles/schema.ts", "../src/sessions/Sessions.ts", "../src/sessions/schema.ts", "../src/sessions/Session.ts", "../src/users/avatars/schema.ts", "../src/users/avatars/Avatars.ts", "../src/users/schema.ts", "../src/users/User.ts"],
|
|
4
|
-
"sourcesContent": ["import * as argon2 from \"argon2\";\nimport EventEmitter from \"eventemitter3\";\nimport {\n\t_ids,\n\tdebounce,\n\tdeleteProps,\n\tremoveAll\n} from \"@nesvet/n\";\nimport {\n\tInSiteCollectionIndexes,\n\tInSiteCollections,\n\tInSiteCollectionSchema,\n\tInSiteWatchedCollection,\n\tnewObjectIdString\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 { AbilitiesSchema } from \"../abilities/types\";\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: InSiteCollectionIndexes = [\n\t[ { email: 1 }, { unique: true } ],\n\t[ { org: 1 } ]\n];\n\n\nexport type Options<AS> = {\n\tabilities: AS;\n\tindexes?: InSiteCollectionIndexes;\n\tschema?: InSiteCollectionSchema;\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 = AbilitiesSchema> extends Map<string, User<AS>> {\n\tconstructor(collections: InSiteCollections, options: Options<AS>) {\n\t\tsuper();\n\t\t\n\t\tconst eventEmitter = new EventEmitter() as {\n\t\t\t_events: Record<string, object>;\n\t\t\t_eventsCount: number;\n\t\t} & EventEmitter;\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.abilitiesMap = new AbilitiesMap<AS>(options.abilities);\n\t\t\n\t\tthis.initOptions = options;\n\t\t\n\t\tthis.#initPromise = this.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\tabilitiesMap;\n\t\n\tcollection!: InSiteWatchedCollection<UserDoc>;\n\troles!: Roles<AS>;\n\tsessions!: Sessions<AS>;\n\torgs!: Orgs<AS>;\n\tavatars!: Avatars<AS>;\n\t\n\tisInited = false;\n\t\n\tbyEmail = new Map();\n\tbySessionId = new Map();\n\tsorted: User<AS>[] = [];\n\t\n\tisSortRequired = false;\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\tpreinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tindexes: customIndexes,\n\t\t\tschema: customSchema,\n\t\t\tinitialRoot: initialRootProps\n\t\t\t// avatars: avatarsOptions\n\t\t} = this.initOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string [], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = await this.collections.ensure<UserDoc>(\"users\", { jsonSchema });\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tif (!await this.collection.countDocuments({ roles: \"root\" }))\n\t\t\tawait this.new({\n\t\t\t\temail: process.env.INSITE_ROOT_EMAIL ?? \"insite@root.email\",\n\t\t\t\tpassword: process.env.INSITE_ROOT_PASSWORD ?? \"inSiteRootPassword\",\n\t\t\t\troles: [ \"root\" ],\n\t\t\t\tname: { first: \"Root\" },\n\t\t\t\torg: null,\n\t\t\t\tjob: \"Root\",\n\t\t\t\t...initialRootProps && deleteProps(initialRootProps, [ \"roles\", \"org\" ])\n\t\t\t});\n\t\t\n\t\t\n\t\tfor (const userDoc of await this.collection.find().toArray())\n\t\t\tthis.load(userDoc);\n\t\t\n\t\tdelete this.preinit;\n\t\t\n\t};\n\t\n\t#initPromise;\n\t\n\tprivate init? = async () => {\n\t\t\n\t\tthis.isInited = true;\n\t\t\n\t\tconst {\n\t\t\troles: rolesOptions,\n\t\t\torgs: orgsOptions,\n\t\t\tsessions: sessionsOptions\n\t\t// avatars: avatarsOptions\n\t\t} = this.initOptions!;\n\t\t\n\t\tthis.roles = new Roles<AS>(this, rolesOptions);\n\t\tthis.orgs = new Orgs<AS>(this, orgsOptions);\n\t\tthis.sessions = new Sessions<AS>(this, sessionsOptions);\n\t\tthis.avatars = new Avatars<AS>(this/* , avatarsOptions */);\n\t\t\n\t\tawait this.roles.init!();\n\t\tawait this.orgs.preinit!();\n\t\tawait this.preinit!();\n\t\tawait this.orgs.init!();\n\t\tawait this.avatars.init!();\n\t\t\n\t\tthis.update(true);\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tnew User<AS>(this, next.fullDocument);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tawait this.sessions.init!();\n\t\t\n\t\tdelete this.initOptions;\n\t\tdelete this.init;\n\t\t\n\t\treturn this;\n\t};\n\t\n\twhenReady() {\n\t\treturn this.#initPromise;\n\t}\n\t\n\tasync new({ 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\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 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.new(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: null | string) => 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\t\n\tstatic init<IAS extends AbilitiesSchema>(collections: InSiteCollections, 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 type { User } from \"../users/User\";\nimport type {\n\tAbilitiesSchema,\n\tAbility,\n\tAbilityParamItems,\n\tAbilityParamItemSchema,\n\tAbilityParamNumber,\n\tAbilitySchema,\n\tAbilityWithParams,\n\tGenericAbilities\n} from \"./types\";\n\n\nexport class AbilitiesMap<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, AbilitySchema> {\n\tconstructor(schema: AbilitiesSchema) {\n\t\tsuper();\n\t\t\n\t\tthis.schema = schema;\n\t\t\n\t\tthis.#parse(this.schema);\n\t\t\n\t}\n\t\n\tschema;\n\t\n\t#parse(list: AbilitiesSchema) {\n\t\tfor (const ability of list) {\n\t\t\tthis.set(ability._id, ability);\n\t\t\tif (ability.subAbilities)\n\t\t\t\tthis.#parse(ability.subAbilities);\n\t\t}\n\t\t\n\t}\n\t\n\tmerge(target: GenericAbilities, source: GenericAbilities) {\n\t\tfor (const [ abilityId, ability ] of Object.entries(source)) {\n\t\t\tconst schema = this.get(abilityId);\n\t\t\tif (schema) {\n\t\t\t\tif (schema.isInheritable !== false && ability)\n\t\t\t\t\tif (!(abilityId in target))\n\t\t\t\t\t\ttarget[abilityId] = structuredClone(ability);\n\t\t\t\t\telse if (schema.params) {\n\t\t\t\t\t\tconst targetAbility = target[abilityId] as AbilityWithParams;\n\t\t\t\t\t\tconst sourceAbility = ability as AbilityWithParams;\n\t\t\t\t\t\tfor (const param of schema.params)\n\t\t\t\t\t\t\tif (param.isInheritable !== false && param._id in sourceAbility)\n\t\t\t\t\t\t\t\tif (!(param._id in targetAbility))\n\t\t\t\t\t\t\t\t\ttargetAbility[param._id] = structuredClone(sourceAbility[param._id]);\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\t\t\tif ((targetAbility[param._id] as AbilityParamNumber) < (sourceAbility[param._id] as AbilityParamNumber))\n\t\t\t\t\t\t\t\t\t\t\ttargetAbility[param._id] = sourceAbility[param._id];\n\t\t\t\t\t\t\t\t\t} else if (param.type === \"items\") {\n\t\t\t\t\t\t\t\t\t\tconst targetItems = targetAbility[param._id] as AbilityParamItems;\n\t\t\t\t\t\t\t\t\t\tfor (const itemId of sourceAbility[param._id] as AbilityParamItems)\n\t\t\t\t\t\t\t\t\t\t\tif (!targetItems.includes(itemId))\n\t\t\t\t\t\t\t\t\t\t\t\ttargetItems.push(itemId);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t} else\n\t\t\t\tdelete source[abilityId];\n\t\t}\n\t\t\n\t\treturn target;\n\t}\n\t\n\tgetMinimumOf(_id: string) {\n\t\tconst schema = this.get(_id);\n\t\tif (schema?.params) {\n\t\t\tconst ability: Ability = {};\n\t\t\tfor (const param of schema.params)\n\t\t\t\tif (param.type === \"number\")\n\t\t\t\t\tability[param._id] = param.min ?? 0;\n\t\t\t\telse if (param.type === \"items\")\n\t\t\t\t\tability[param._id] = [];\n\t\t\t\n\t\t\treturn ability;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tgetMaximum() {\n\t\treturn [ ...this.values() ].reduce((abilities: GenericAbilities, schema: AbilitySchema) => {\n\t\t\tif (schema.params) {\n\t\t\t\tconst ability: Ability = {};\n\t\t\t\tfor (const param of schema.params)\n\t\t\t\t\tif (param.type === \"number\")\n\t\t\t\t\t\tability[param._id] = param.max ?? 0;\n\t\t\t\t\telse if (param.type === \"items\")\n\t\t\t\t\t\tability[param._id] = param.items.map(item => item._id);\n\t\t\t\t\n\t\t\t\tabilities[schema._id] = ability;\n\t\t\t} else\n\t\t\t\tabilities[schema._id as keyof typeof abilities] = true;\n\t\t\t\n\t\t\treturn abilities;\n\t\t}, {});\n\t}\n\t\n\tgetSchemeFor(user: User<AS>) {\n\t\treturn (function resolve(abilitiesSchema: AbilitySchema[]) {\n\t\t\tfor (let i = 0; i < abilitiesSchema.length; i++) {\n\t\t\t\tconst schema = abilitiesSchema[i];\n\t\t\t\tconst userAbility = user.abilities[schema._id as keyof typeof user.abilities];\n\t\t\t\tif (userAbility) {\n\t\t\t\t\tif (schema.params)\n\t\t\t\t\t\tfor (const param of schema.params) {\n\t\t\t\t\t\t\tconst userParam = (userAbility as AbilityWithParams)[param._id];\n\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\tif (\"max\" in param)\n\t\t\t\t\t\t\t\t\tparam.max = userParam as number;\n\t\t\t\t\t\t\t} else if (param.type === \"items\")\n\t\t\t\t\t\t\t\tfor (let j = 0; j < param.items.length; j++)\n\t\t\t\t\t\t\t\t\tif (!(userParam as AbilityParamItems).includes(param.items[j]._id))\n\t\t\t\t\t\t\t\t\t\t(param.items as AbilityParamItemSchema[]).splice(j--, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\tif (schema.subAbilities)\n\t\t\t\t\t\tresolve(schema.subAbilities as AbilitySchema[]);\n\t\t\t\t} else\n\t\t\t\t\tabilitiesSchema.splice(i--, 1);\n\t\t\t}\n\t\t\t\n\t\t\treturn abilitiesSchema;\n\t\t})(structuredClone(this.schema) as AbilitySchema[]);\n\t}\n\t\n}\n", "import {\n\tdebounce,\n\tdeleteProps,\n\tEmptyArray,\n\tEmptySet,\n\tremoveAll,\n\tsort\n} from \"@nesvet/n\";\nimport { InSiteCollectionIndexes, InSiteWatchedCollection, newObjectIdString } from \"insite-db\";\nimport { Users } from \"../users\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\nimport { Org } from \"./Org\";\nimport { basisSchema } from \"./schema\";\nimport { OrgDoc, OrgsOptions } from \"./types\";\n\n\nconst indexes: InSiteCollectionIndexes = [\n\t[ { owners: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of orgs collection.deleteOne or .deleteMany is forbidden. Use orgs.collectionDelete instead.\");\n}\n\n\nexport class Orgs<AS extends AbilitiesSchema = 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\tpreinitOptions?;\n\t\n\tcollection!: {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use orgs.collectionDelete instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use orgs.collectionDelete instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t} & InSiteWatchedCollection<OrgDoc>;\n\t\n\tnull!: { _id: null } & Org<AS>;\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 { length } = sorted, o = 0; 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\tpreinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes,\n\t\t\tnull: nullProps\n\t\t} = this.preinitOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string [], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = Object.assign(\n\t\t\tawait this.collections.ensure<OrgDoc>(\"orgs\", { jsonSchema }),\n\t\t\t{\n\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t}\n\t\t);\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tthis.null = Object.assign(\n\t\t\tnew Org<AS>(this, {\n\t\t\t\t...nullProps,\n\t\t\t\t_id: \"\",\n\t\t\t\ttitle: \"\",\n\t\t\t\tnote: \"\",\n\t\t\t\towners: [],\n\t\t\t\tcreatedAt: Date.now()\n\t\t\t}),\n\t\t\t{\n\t\t\t\t_id: null,\n\t\t\t\townerIds: new EmptyArray(),\n\t\t\t\townerOrgs: new EmptySet(),\n\t\t\t\townerUsers: new EmptySet(),\n\t\t\t\tslaveOrgs: new EmptySet()\n\t\t\t}\n\t\t);\n\t\t\n\t\tfor (const orgDoc of await this.collection.find().toArray())\n\t\t\tthis.load(orgDoc);\n\t\t\n\t\tdelete this.preinitOptions;\n\t\tdelete this.preinit;\n\t\t\n\t};\n\t\n\tinit? = async () => {\n\t\t\n\t\tawait this.update();\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tconst org = new Org<AS>(this, next.fullDocument);\n\t\t\t\t\tthis.users.emit(\"orgs-org-update\", org, next);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\tthis.users.emit(\"orgs-org-update\", null, next);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n\tnew({ 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\t...deleteProps(restProps, [ \"_id\", \"owners\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(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: null | string) => 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 { ChangeStreamDocument } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\nimport type { Orgs } from \"./Orgs\";\nimport type { OrgDoc } from \"./types\";\n\nconst snapshots = new Map();\n\n\nexport class Org<AS extends AbilitiesSchema = 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", "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 { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"title\",\n\t\t\"note\",\n\t\t\"owners\",\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\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import {\n\tdebounce,\n\tdeleteProps,\n\tgetAll,\n\tintersection,\n\treAdd,\n\tremoveAll\n} from \"@nesvet/n\";\nimport type { InSiteCollectionIndexes, InSiteWatchedCollection } from \"insite-db\";\nimport type { AbilitiesSchema, 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: InSiteCollectionIndexes = [\n\t[ { involves: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.collectionDelete instead.\");\n}\n\n\nexport class Roles<AS extends AbilitiesSchema = 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.abilitiesMap = users.abilitiesMap;\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.abilitiesMap.getMaximum(),\n\t\t\ttitle: \"Root\",\n\t\t\tdescription: \"Root\",\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!: {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use roles.collectionDelete instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use roles.collectionDelete instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t} & InSiteWatchedCollection<RoleDoc>;\n\t\n\tabilitiesMap;\n\troot;\n\tinitOptions?;\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.abilitiesMap.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\t\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.abilitiesMap.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, 250);\n\t\n\tinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes\n\t\t} = this.initOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = Object.assign(\n\t\t\tawait this.collections.ensure<RoleDoc>(\"roles\", { jsonSchema }),\n\t\t\t{\n\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t}\n\t\t);\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tfor (const roleDoc of await this.collection.find().toArray())\n\t\t\tthis.load(roleDoc);\n\t\t\n\t\tawait this.update();\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tconst role = new Role<AS>(this, next.fullDocument);\n\t\t\t\t\tthis.users.emit(\"roles-role-update\", role, next);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\tthis.users.emit(\"roles-role-update\", null, next);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tdelete this.initOptions;\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n\tnew({ _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\t...deleteProps(restProps, [ \"abilities\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(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}\n", "import type { ChangeStreamDocument } from \"insite-db\";\nimport type { Abilities, AbilitiesSchema } from \"../abilities/types\";\nimport { Roles } from \"./Roles\";\nimport { RoleDoc } from \"./types\";\n\nconst snapshots = new Map();\n\n\nexport class Role<AS extends AbilitiesSchema = 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\tprivate 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\t\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\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\n\t\t\t\tthis.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", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\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\"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\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 { InSiteCollectionIndexes, InSiteWatchedCollection } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\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: InSiteCollectionIndexes = [\n\t[ { user: 1 } ],\n\t[ { expiresAt: 1 }, { expireAfterSeconds } ]\n];\n\n\nexport class Sessions<AS extends AbilitiesSchema = 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\tinitOptions?;\n\t\n\tcollection!: {\n\t\texpireAfterSeconds: number;\n\t} & InSiteWatchedCollection<SessionDoc>;\n\t\n\tisInited = false;\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\tinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes\n\t\t} = this.initOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = Object.assign(\n\t\t\tawait this.collections.ensure<SessionDoc>(\"sessions\", { jsonSchema }),\n\t\t\t{\n\t\t\t\texpireAfterSeconds\n\t\t\t}\n\t\t);\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tawait this.collection.updateMany({ isOnline: true }, { $set: { isOnline: false } });\n\t\t\n\t\tfor (const sessionDoc of await this.collection.find().toArray())\n\t\t\tthis.load(sessionDoc);\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tif (!this.has(next.documentKey._id))\n\t\t\t\t\t\tnew Session<AS>(this, next.fullDocument);\n\t\t\t\t\t\n\t\t\t\t\tthis.users.get(next.fullDocument.user)?.trimSessions();\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.isInited = true;\n\t\t\n\t\tdelete this.initOptions;\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n\tasync new(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\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}\n", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"user\",\n\t\t\"remoteAddress\",\n\t\t\"isOnline\",\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\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\tadditionalProperties: false\n};\n", "import type { AbilitiesSchema } from \"../abilities/types\";\nimport type { User } from \"../users/User\";\nimport type { Sessions } from \"./Sessions\";\nimport type { SessionDoc } from \"./types\";\n\n\nexport class Session<AS extends AbilitiesSchema = 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\tprivate 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 { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../../lib\";\n\n\nexport const schema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"type\",\n\t\t\"size\",\n\t\t\"ts\",\n\t\t\"data\"\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},\n\tadditionalProperties: false\n};\n", "import { InSiteWatchedCollection } from \"insite-db\";\nimport type { AbilitiesSchema } from \"../../abilities/types\";\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 = 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\tusers;\n\tcollections;\n\t\n\tcollection!: InSiteWatchedCollection<AvatarDoc>;\n\t\n\tinit? = async () => {\n\t\t\n\t\tthis.collection = await this.collections.ensure<AvatarDoc>(\"users.avatars\", { jsonSchema });\n\t\t\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n}\n", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\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\"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\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, 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 = 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: null | string = null;\n\tavatarUrl: null | string = null;\n\t\n\tprivate 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;\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.abilitiesMap.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 as { login?: { sessionsLimit: number } }).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": ["argon2", "EventEmitter", "_ids", "debounce", "deleteProps", "removeAll", "newObjectIdString", "AbilitiesMap", "schema", "
|
|
4
|
+
"sourcesContent": ["import * as argon2 from \"argon2\";\nimport EventEmitter from \"eventemitter3\";\nimport {\n\t_ids,\n\tdebounce,\n\tdeleteProps,\n\tremoveAll\n} from \"@nesvet/n\";\nimport {\n\tInSiteCollectionIndexes,\n\tInSiteCollections,\n\tInSiteCollectionSchema,\n\tInSiteWatchedCollection,\n\tnewObjectIdString\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 { AbilitiesSchema } from \"../abilities/types\";\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: InSiteCollectionIndexes = [\n\t[ { email: 1 }, { unique: true } ],\n\t[ { org: 1 } ]\n];\n\n\nexport type Options<AS> = {\n\tabilities: AS;\n\tindexes?: InSiteCollectionIndexes;\n\tschema?: InSiteCollectionSchema;\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 = AbilitiesSchema> extends Map<string, User<AS>> {\n\tconstructor(collections: InSiteCollections, options: Options<AS>) {\n\t\tsuper();\n\t\t\n\t\tconst eventEmitter = new EventEmitter() as {\n\t\t\t_events: Record<string, object>;\n\t\t\t_eventsCount: number;\n\t\t} & EventEmitter;\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.abilitiesMap = new AbilitiesMap<AS>(options.abilities);\n\t\t\n\t\tthis.initOptions = options;\n\t\t\n\t\tthis.initPromise = this.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\tabilitiesMap;\n\t\n\tcollection!: InSiteWatchedCollection<UserDoc>;\n\troles!: Roles<AS>;\n\tsessions!: Sessions<AS>;\n\torgs!: Orgs<AS>;\n\tavatars!: Avatars<AS>;\n\t\n\tisInited = false;\n\t\n\tbyEmail = new Map();\n\tbySessionId = new Map();\n\tsorted: User<AS>[] = [];\n\t\n\tisSortRequired = false;\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\tpreinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tindexes: customIndexes,\n\t\t\tschema: customSchema,\n\t\t\tinitialRoot: initialRootProps\n\t\t\t// avatars: avatarsOptions\n\t\t} = this.initOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string [], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = await this.collections.ensure<UserDoc>(\"users\", { jsonSchema });\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tif (!await this.collection.countDocuments({ roles: \"root\" }))\n\t\t\tawait this.new({\n\t\t\t\temail: process.env.INSITE_ROOT_EMAIL ?? \"insite@root.email\",\n\t\t\t\tpassword: process.env.INSITE_ROOT_PASSWORD ?? \"inSiteRootPassword\",\n\t\t\t\troles: [ \"root\" ],\n\t\t\t\tname: { first: \"Root\" },\n\t\t\t\torg: null,\n\t\t\t\tjob: \"Root\",\n\t\t\t\t...initialRootProps && deleteProps(initialRootProps, [ \"roles\", \"org\" ])\n\t\t\t});\n\t\t\n\t\t\n\t\tfor (const userDoc of await this.collection.find().toArray())\n\t\t\tthis.load(userDoc);\n\t\t\n\t\tdelete this.preinit;\n\t\t\n\t};\n\t\n\tprivate initPromise;\n\t\n\tprivate init? = async () => {\n\t\t\n\t\tthis.isInited = true;\n\t\t\n\t\tconst {\n\t\t\troles: rolesOptions,\n\t\t\torgs: orgsOptions,\n\t\t\tsessions: sessionsOptions\n\t\t// avatars: avatarsOptions\n\t\t} = this.initOptions!;\n\t\t\n\t\tthis.roles = new Roles<AS>(this, rolesOptions);\n\t\tthis.orgs = new Orgs<AS>(this, orgsOptions);\n\t\tthis.sessions = new Sessions<AS>(this, sessionsOptions);\n\t\tthis.avatars = new Avatars<AS>(this/* , avatarsOptions */);\n\t\t\n\t\tawait this.roles.init!();\n\t\tawait this.orgs.preinit!();\n\t\tawait this.preinit!();\n\t\tawait this.orgs.init!();\n\t\tawait this.avatars.init!();\n\t\t\n\t\tthis.update(true);\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tnew User<AS>(this, next.fullDocument);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tawait this.sessions.init!();\n\t\t\n\t\tdelete this.initOptions;\n\t\tdelete this.init;\n\t\t\n\t\treturn this;\n\t};\n\t\n\twhenReady() {\n\t\treturn this.initPromise;\n\t}\n\t\n\tasync new({ 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\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 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.new(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\tprivate 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: null | string) => 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\t\n\tstatic init<IAS extends AbilitiesSchema>(collections: InSiteCollections, 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 type { User } from \"../users/User\";\nimport type {\n\tAbilitiesSchema,\n\tAbility,\n\tAbilityParamItems,\n\tAbilityParamItemSchema,\n\tAbilityParamNumber,\n\tAbilitySchema,\n\tAbilityWithParams,\n\tGenericAbilities\n} from \"./types\";\n\n\nexport class AbilitiesMap<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, AbilitySchema> {\n\tconstructor(schema: AbilitiesSchema) {\n\t\tsuper();\n\t\t\n\t\tthis.schema = schema;\n\t\t\n\t\tthis.parse(this.schema);\n\t\t\n\t}\n\t\n\tschema;\n\t\n\tprivate parse(list: AbilitiesSchema) {\n\t\tfor (const ability of list) {\n\t\t\tthis.set(ability._id, ability);\n\t\t\tif (ability.subAbilities)\n\t\t\t\tthis.parse(ability.subAbilities);\n\t\t}\n\t\t\n\t}\n\t\n\tmerge(target: GenericAbilities, source: GenericAbilities) {\n\t\tfor (const [ abilityId, ability ] of Object.entries(source)) {\n\t\t\tconst schema = this.get(abilityId);\n\t\t\tif (schema) {\n\t\t\t\tif (schema.isInheritable !== false && ability)\n\t\t\t\t\tif (!(abilityId in target))\n\t\t\t\t\t\ttarget[abilityId] = structuredClone(ability);\n\t\t\t\t\telse if (schema.params) {\n\t\t\t\t\t\tconst targetAbility = target[abilityId] as AbilityWithParams;\n\t\t\t\t\t\tconst sourceAbility = ability as AbilityWithParams;\n\t\t\t\t\t\tfor (const param of schema.params)\n\t\t\t\t\t\t\tif (param.isInheritable !== false && param._id in sourceAbility)\n\t\t\t\t\t\t\t\tif (!(param._id in targetAbility))\n\t\t\t\t\t\t\t\t\ttargetAbility[param._id] = structuredClone(sourceAbility[param._id]);\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\t\t\tif ((targetAbility[param._id] as AbilityParamNumber) < (sourceAbility[param._id] as AbilityParamNumber))\n\t\t\t\t\t\t\t\t\t\t\ttargetAbility[param._id] = sourceAbility[param._id];\n\t\t\t\t\t\t\t\t\t} else if (param.type === \"items\") {\n\t\t\t\t\t\t\t\t\t\tconst targetItems = targetAbility[param._id] as AbilityParamItems;\n\t\t\t\t\t\t\t\t\t\tfor (const itemId of sourceAbility[param._id] as AbilityParamItems)\n\t\t\t\t\t\t\t\t\t\t\tif (!targetItems.includes(itemId))\n\t\t\t\t\t\t\t\t\t\t\t\ttargetItems.push(itemId);\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t} else\n\t\t\t\tdelete source[abilityId];\n\t\t}\n\t\t\n\t\treturn target;\n\t}\n\t\n\tgetMinimumOf(_id: string) {\n\t\tconst schema = this.get(_id);\n\t\tif (schema?.params) {\n\t\t\tconst ability: Ability = {};\n\t\t\tfor (const param of schema.params)\n\t\t\t\tif (param.type === \"number\")\n\t\t\t\t\tability[param._id] = param.min ?? 0;\n\t\t\t\telse if (param.type === \"items\")\n\t\t\t\t\tability[param._id] = [];\n\t\t\t\n\t\t\treturn ability;\n\t\t}\n\t\t\n\t\treturn true;\n\t}\n\t\n\tgetMaximum() {\n\t\treturn [ ...this.values() ].reduce((abilities: GenericAbilities, schema: AbilitySchema) => {\n\t\t\tif (schema.params) {\n\t\t\t\tconst ability: Ability = {};\n\t\t\t\tfor (const param of schema.params)\n\t\t\t\t\tif (param.type === \"number\")\n\t\t\t\t\t\tability[param._id] = param.max ?? 0;\n\t\t\t\t\telse if (param.type === \"items\")\n\t\t\t\t\t\tability[param._id] = param.items.map(item => item._id);\n\t\t\t\t\n\t\t\t\tabilities[schema._id] = ability;\n\t\t\t} else\n\t\t\t\tabilities[schema._id as keyof typeof abilities] = true;\n\t\t\t\n\t\t\treturn abilities;\n\t\t}, {});\n\t}\n\t\n\tgetSchemeFor(user: User<AS>) {\n\t\treturn (function resolve(abilitiesSchema: AbilitySchema[]) {\n\t\t\tfor (let i = 0; i < abilitiesSchema.length; i++) {\n\t\t\t\tconst schema = abilitiesSchema[i];\n\t\t\t\tconst userAbility = user.abilities[schema._id as keyof typeof user.abilities];\n\t\t\t\tif (userAbility) {\n\t\t\t\t\tif (schema.params)\n\t\t\t\t\t\tfor (const param of schema.params) {\n\t\t\t\t\t\t\tconst userParam = (userAbility as AbilityWithParams)[param._id];\n\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\tif (\"max\" in param)\n\t\t\t\t\t\t\t\t\tparam.max = userParam as number;\n\t\t\t\t\t\t\t} else if (param.type === \"items\")\n\t\t\t\t\t\t\t\tfor (let j = 0; j < param.items.length; j++)\n\t\t\t\t\t\t\t\t\tif (!(userParam as AbilityParamItems).includes(param.items[j]._id))\n\t\t\t\t\t\t\t\t\t\t(param.items as AbilityParamItemSchema[]).splice(j--, 1);\n\t\t\t\t\t\t}\n\t\t\t\t\tif (schema.subAbilities)\n\t\t\t\t\t\tresolve(schema.subAbilities as AbilitySchema[]);\n\t\t\t\t} else\n\t\t\t\t\tabilitiesSchema.splice(i--, 1);\n\t\t\t}\n\t\t\t\n\t\t\treturn abilitiesSchema;\n\t\t})(structuredClone(this.schema) as AbilitySchema[]);\n\t}\n\t\n}\n", "import {\n\tdebounce,\n\tdeleteProps,\n\tEmptyArray,\n\tEmptySet,\n\tremoveAll,\n\tsort\n} from \"@nesvet/n\";\nimport { InSiteCollectionIndexes, InSiteWatchedCollection, newObjectIdString } from \"insite-db\";\nimport { Users } from \"../users\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\nimport { Org } from \"./Org\";\nimport { basisSchema } from \"./schema\";\nimport { OrgDoc, OrgsOptions } from \"./types\";\n\n\nconst indexes: InSiteCollectionIndexes = [\n\t[ { owners: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of orgs collection.deleteOne or .deleteMany is forbidden. Use orgs.collectionDelete instead.\");\n}\n\n\nexport class Orgs<AS extends AbilitiesSchema = 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\tpreinitOptions?;\n\t\n\tcollection!: {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use orgs.collectionDelete instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use orgs.collectionDelete instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t} & InSiteWatchedCollection<OrgDoc>;\n\t\n\tnull!: { _id: null } & Org<AS>;\n\t\n\tload(orgDoc: OrgDoc) {\n\t\tnew Org<AS>(this, orgDoc);\n\t\t\n\t}\n\t\n\tprivate 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 { length } = sorted, o = 0; 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\tprivate 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\tpreinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes,\n\t\t\tnull: nullProps\n\t\t} = this.preinitOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string [], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = Object.assign(\n\t\t\tawait this.collections.ensure<OrgDoc>(\"orgs\", { jsonSchema }),\n\t\t\t{\n\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t}\n\t\t);\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tthis.null = Object.assign(\n\t\t\tnew Org<AS>(this, {\n\t\t\t\t...nullProps,\n\t\t\t\t_id: \"\",\n\t\t\t\ttitle: \"\",\n\t\t\t\tnote: \"\",\n\t\t\t\towners: [],\n\t\t\t\tcreatedAt: Date.now()\n\t\t\t}),\n\t\t\t{\n\t\t\t\t_id: null,\n\t\t\t\townerIds: new EmptyArray(),\n\t\t\t\townerOrgs: new EmptySet(),\n\t\t\t\townerUsers: new EmptySet(),\n\t\t\t\tslaveOrgs: new EmptySet()\n\t\t\t}\n\t\t);\n\t\t\n\t\tfor (const orgDoc of await this.collection.find().toArray())\n\t\t\tthis.load(orgDoc);\n\t\t\n\t\tdelete this.preinitOptions;\n\t\tdelete this.preinit;\n\t\t\n\t};\n\t\n\tinit? = async () => {\n\t\t\n\t\tawait this.update();\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tconst org = new Org<AS>(this, next.fullDocument);\n\t\t\t\t\tthis.users.emit(\"orgs-org-update\", org, next);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\tthis.users.emit(\"orgs-org-update\", null, next);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n\tnew({ 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\t...deleteProps(restProps, [ \"_id\", \"owners\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(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: null | string) => 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 { ChangeStreamDocument } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\nimport type { Orgs } from \"./Orgs\";\nimport type { OrgDoc } from \"./types\";\n\nconst snapshots = new Map();\n\n\nexport class Org<AS extends AbilitiesSchema = 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", "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 { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"title\",\n\t\t\"note\",\n\t\t\"owners\",\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\tcreatedAt: {\n\t\t\tbsonType: \"number\"\n\t\t}\n\t},\n\tadditionalProperties: false\n};\n", "import {\n\tdebounce,\n\tdeleteProps,\n\tgetAll,\n\tintersection,\n\treAdd,\n\tremoveAll\n} from \"@nesvet/n\";\nimport type { InSiteCollectionIndexes, InSiteWatchedCollection } from \"insite-db\";\nimport type { AbilitiesSchema, 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: InSiteCollectionIndexes = [\n\t[ { involves: 1 } ]\n];\n\nfunction preventDirectDelete() {\n\tthrow new Error(\"Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.collectionDelete instead.\");\n}\n\n\nexport class Roles<AS extends AbilitiesSchema = 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.abilitiesMap = users.abilitiesMap;\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.abilitiesMap.getMaximum(),\n\t\t\ttitle: \"Root\",\n\t\t\tdescription: \"Root\",\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!: {\n\t\t/** @deprecated Direct usage of roles collection.deleteOne is forbidden. Use roles.collectionDelete instead. */\n\t\tdeleteOne: typeof preventDirectDelete;\n\t\t\n\t\t/** @deprecated Direct usage of roles collection.deleteMany is forbidden. Use roles.collectionDelete instead. */\n\t\tdeleteMany: typeof preventDirectDelete;\n\t} & InSiteWatchedCollection<RoleDoc>;\n\t\n\tabilitiesMap;\n\troot;\n\tinitOptions?;\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.abilitiesMap.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\tprivate 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\t\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.abilitiesMap.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, 250);\n\t\n\tinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes\n\t\t} = this.initOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = Object.assign(\n\t\t\tawait this.collections.ensure<RoleDoc>(\"roles\", { jsonSchema }),\n\t\t\t{\n\t\t\t\tdeleteOne: preventDirectDelete,\n\t\t\t\tdeleteMany: preventDirectDelete\n\t\t\t}\n\t\t);\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tfor (const roleDoc of await this.collection.find().toArray())\n\t\t\tthis.load(roleDoc);\n\t\t\n\t\tawait this.update();\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\": {\n\t\t\t\t\tconst role = new Role<AS>(this, next.fullDocument);\n\t\t\t\t\tthis.users.emit(\"roles-role-update\", role, next);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!, next);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t\t\tthis.users.emit(\"roles-role-update\", null, next);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tdelete this.initOptions;\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n\tnew({ _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\t...deleteProps(restProps, [ \"abilities\" ]),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(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}\n", "import type { ChangeStreamDocument } from \"insite-db\";\nimport type { Abilities, AbilitiesSchema } from \"../abilities/types\";\nimport { Roles } from \"./Roles\";\nimport { RoleDoc } from \"./types\";\n\nconst snapshots = new Map();\n\n\nexport class Role<AS extends AbilitiesSchema = 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\tprivate 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\t\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\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\n\t\t\t\tthis.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", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\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\"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\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 { InSiteCollectionIndexes, InSiteWatchedCollection } from \"insite-db\";\nimport { User } from \"../users/User\";\nimport type { AbilitiesSchema } from \"../abilities/types\";\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: InSiteCollectionIndexes = [\n\t[ { user: 1 } ],\n\t[ { expiresAt: 1 }, { expireAfterSeconds } ]\n];\n\n\nexport class Sessions<AS extends AbilitiesSchema = 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\tinitOptions?;\n\t\n\tcollection!: {\n\t\texpireAfterSeconds: number;\n\t} & InSiteWatchedCollection<SessionDoc>;\n\t\n\tisInited = false;\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\tinit? = async () => {\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes\n\t\t} = this.initOptions!;\n\t\t\n\t\tif (customSchema) {\n\t\t\tif (customSchema.required)\n\t\t\t\tremoveAll(customSchema.required as string[], basisSchema.required as string[]);\n\t\t\tif (customSchema.properties)\n\t\t\t\tdeleteProps(customSchema, Object.keys(basisSchema.properties!));\n\t\t}\n\t\t\n\t\tconst jsonSchema = {\n\t\t\t...basisSchema,\n\t\t\t...customSchema,\n\t\t\trequired: [ ...basisSchema.required as string[], ...customSchema?.required as string[] ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\tthis.collection = Object.assign(\n\t\t\tawait this.collections.ensure<SessionDoc>(\"sessions\", { jsonSchema }),\n\t\t\t{\n\t\t\t\texpireAfterSeconds\n\t\t\t}\n\t\t);\n\t\t\n\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\n\t\tawait this.collection.updateMany({ isOnline: true }, { $set: { isOnline: false } });\n\t\t\n\t\tfor (const sessionDoc of await this.collection.find().toArray())\n\t\t\tthis.load(sessionDoc);\n\t\t\n\t\tthis.collection.changeListeners.add(next => {\n\t\t\tswitch (next.operationType) {\n\t\t\t\tcase \"insert\":\n\t\t\t\t\tif (!this.has(next.documentKey._id))\n\t\t\t\t\t\tnew Session<AS>(this, next.fullDocument);\n\t\t\t\t\t\n\t\t\t\t\tthis.users.get(next.fullDocument.user)?.trimSessions();\n\t\t\t\t\t\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.fullDocument);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"update\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription.updatedFields!);\n\t\t\t\t\tbreak;\n\t\t\t\t\n\t\t\t\tcase \"delete\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.delete();\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.isInited = true;\n\t\t\n\t\tdelete this.initOptions;\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n\tasync new(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\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}\n", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"user\",\n\t\t\"remoteAddress\",\n\t\t\"isOnline\",\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\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\tadditionalProperties: false\n};\n", "import type { AbilitiesSchema } from \"../abilities/types\";\nimport type { User } from \"../users/User\";\nimport type { Sessions } from \"./Sessions\";\nimport type { SessionDoc } from \"./types\";\n\n\nexport class Session<AS extends AbilitiesSchema = 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\tprivate 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 { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../../lib\";\n\n\nexport const schema: InSiteCollectionSchema = {\n\trequired: [\n\t\t\"_id\",\n\t\t\"type\",\n\t\t\"size\",\n\t\t\"ts\",\n\t\t\"data\"\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},\n\tadditionalProperties: false\n};\n", "import { InSiteWatchedCollection } from \"insite-db\";\nimport type { AbilitiesSchema } from \"../../abilities/types\";\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 = 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\tusers;\n\tcollections;\n\t\n\tcollection!: InSiteWatchedCollection<AvatarDoc>;\n\t\n\tinit? = async () => {\n\t\t\n\t\tthis.collection = await this.collections.ensure<AvatarDoc>(\"users.avatars\", { jsonSchema });\n\t\t\n\t\tdelete this.init;\n\t\t\n\t};\n\t\n}\n", "import { InSiteCollectionSchema } from \"insite-db\";\nimport { regexps } from \"../lib\";\n\n\nexport const basisSchema: InSiteCollectionSchema = {\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\"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\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, 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 = 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: null | string = null;\n\tavatarUrl: null | string = null;\n\t\n\tprivate 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;\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.abilitiesMap.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 as { login?: { sessionsLimit: number } }).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": ["argon2", "EventEmitter", "_ids", "debounce", "deleteProps", "removeAll", "newObjectIdString", "AbilitiesMap", "schema", "list", "ability", "target", "source", "abilityId", "targetAbility", "sourceAbility", "param", "targetItems", "itemId", "_id", "abilities", "item", "user", "resolve", "abilitiesSchema", "userAbility", "userParam", "j", "debounce", "deleteProps", "EmptyArray", "EmptySet", "removeAll", "sort", "newObjectIdString", "snapshots", "Org", "orgs", "orgDoc", "_id", "title", "ownerIds", "restProps", "next", "snapshot", "regexps", "basisSchema", "regexps", "indexes", "preventDirectDelete", "Orgs", "users", "options", "orgDoc", "Org", "org", "slaveOrgs", "ownerOrg", "slaveOrg", "array", "sorted", "ownerId", "ownerUser", "anotherOrg", "sort", "i", "slaveOrgIndex", "length", "o", "a", "b", "debounce", "customSchema", "customIndexes", "nullProps", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "EmptyArray", "EmptySet", "next", "title", "note", "restProps", "newObjectIdString", "_id", "fromId", "toId", "handler", "debounce", "deleteProps", "getAll", "intersection", "reAdd", "removeAll", "snapshots", "Role", "roles", "roleDoc", "_id", "ownInvolveIds", "ownAbilities", "title", "restProps", "next", "snapshot", "basisSchema", "regexps", "indexes", "preventDirectDelete", "Roles", "users", "options", "rootProps", "initOptions", "Role", "roleDoc", "role", "involvedBy", "involvedRoleId", "involvedRole", "involvedByRole", "reAdd", "a", "b", "array", "anotherRole", "getAll", "sorted", "involvedRoleIndex", "_o", "debounce", "customSchema", "customIndexes", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "next", "_id", "involves", "title", "description", "restProps", "ids", "roles", "intersection", "cleanedUpIds", "crypto", "deleteProps", "random", "removeAll", "basisSchema", "regexps", "Session", "sessions", "sessionDoc", "user", "_id", "isOnline", "restProps", "updates", "ts", "expireAfterSeconds", "indexes", "Sessions", "users", "options", "_id", "crypto", "random", "sessionDoc", "Session", "customSchema", "customIndexes", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "next", "user", "props", "ts", "session", "schema", "regexps", "Avatars", "users", "schema", "basisSchema", "regexps", "_ids", "debounce", "empty", "hasAny", "removeOne", "rolesSnapshots", "permissionsSnapshots", "staticUrl", "User", "users", "userDoc", "_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", "userDoc", "User", "a", "b", "debounce", "shouldUpdateRoles", "user", "customIndexes", "customSchema", "initialRootProps", "removeAll", "basisSchema", "deleteProps", "jsonSchema", "rolesOptions", "orgsOptions", "sessionsOptions", "Roles", "Orgs", "Sessions", "Avatars", "next", "email", "password", "roles", "name", "org", "job", "restProps", "newObjectIdString", "_id", "newPassword", "sessionProps", "session", "Org", "ids", "_ids", "fromId", "toId", "handler"]
|
|
7
7
|
}
|
package/dist/orgs/Orgs.d.ts
CHANGED
|
@@ -5,7 +5,6 @@ import { Org } from "./Org";
|
|
|
5
5
|
import { OrgDoc, OrgsOptions } from "./types";
|
|
6
6
|
declare function preventDirectDelete(): void;
|
|
7
7
|
export declare class Orgs<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, Org<AS>> {
|
|
8
|
-
#private;
|
|
9
8
|
constructor(users: Users<AS>, options?: OrgsOptions);
|
|
10
9
|
users: Users<AS>;
|
|
11
10
|
collections: import("insite-db").InSiteCollections;
|
|
@@ -20,8 +19,10 @@ export declare class Orgs<AS extends AbilitiesSchema = AbilitiesSchema> extends
|
|
|
20
19
|
_id: null;
|
|
21
20
|
} & Org<AS>;
|
|
22
21
|
load(orgDoc: OrgDoc): void;
|
|
22
|
+
private resolve;
|
|
23
23
|
sorted: Org<AS>[];
|
|
24
24
|
update(): void;
|
|
25
|
+
private sortOrgs;
|
|
25
26
|
updateDebounced: import("@nesvet/n").Debounced<void>;
|
|
26
27
|
preinit?: (() => Promise<void>) | undefined;
|
|
27
28
|
init?: (() => Promise<void>) | undefined;
|
package/dist/orgs/Orgs.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Orgs.d.ts","sourceRoot":"","sources":["../../src/orgs/Orgs.ts"],"names":[],"mappings":"AAQA,OAAO,EAA2B,uBAAuB,EAAqB,MAAM,WAAW,CAAC;AAChG,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAO9C,iBAAS,mBAAmB,SAE3B;AAGD,qBAAa,IAAI,CAAC,EAAE,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"Orgs.d.ts","sourceRoot":"","sources":["../../src/orgs/Orgs.ts"],"names":[],"mappings":"AAQA,OAAO,EAA2B,uBAAuB,EAAqB,MAAM,WAAW,CAAC;AAChG,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAE5B,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAO9C,iBAAS,mBAAmB,SAE3B;AAGD,qBAAa,IAAI,CAAC,EAAE,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC/E,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,GAAE,WAAgB;IAUvD,KAAK,YAAC;IACN,WAAW,wCAAC;IACZ,cAAc,CAAC,0BAAC;IAEhB,UAAU,EAAG;QACZ,8GAA8G;QAC9G,SAAS,EAAE,OAAO,mBAAmB,CAAC;QAEtC,+GAA+G;QAC/G,UAAU,EAAE,OAAO,mBAAmB,CAAC;KACvC,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAEpC,IAAI,EAAG;QAAE,GAAG,EAAE,IAAI,CAAA;KAAE,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC;IAE/B,IAAI,CAAC,MAAM,EAAE,MAAM;IAKnB,OAAO,CAAC,OAAO;IAWf,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAM;IAEvB,MAAM;IA2DN,OAAO,CAAC,QAAQ;IAYhB,eAAe,sCAA8B;IAE7C,OAAO,CAAC,oCAwDN;IAEF,IAAI,CAAC,oCA6BH;IAEF,GAAG,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG,SAAS,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK,GAAG,WAAW,GAAG,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM;IAWhG,gBAAgB,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM;IAStC,UAAU,sBAA6B;IAEvC,eAAe,eAAoB,MAAM,QAAQ,IAAI,GAAG,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,EAAI;IAErF,OAAO,CAAC,MAAM,EAAE,MAAM;CAU5B"}
|
package/dist/roles/Roles.d.ts
CHANGED
|
@@ -5,7 +5,6 @@ import { Role } from "./Role";
|
|
|
5
5
|
import type { RoleDoc, RolesOptions } from "./types";
|
|
6
6
|
declare function preventDirectDelete(): void;
|
|
7
7
|
export declare class Roles<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, Role<AS>> {
|
|
8
|
-
#private;
|
|
9
8
|
constructor(users: Users<AS>, options?: RolesOptions);
|
|
10
9
|
users: Users<AS>;
|
|
11
10
|
collections: import("insite-db").InSiteCollections;
|
|
@@ -24,6 +23,7 @@ export declare class Roles<AS extends AbilitiesSchema = AbilitiesSchema> extends
|
|
|
24
23
|
load(roleDoc: RoleDoc): void;
|
|
25
24
|
resolve(role: Role<AS>, involvedBy: Role<AS>[]): void;
|
|
26
25
|
sorted: Role<AS>[];
|
|
26
|
+
private sortRoles;
|
|
27
27
|
update(): void;
|
|
28
28
|
updateDebounced: import("@nesvet/n").Debounced<void>;
|
|
29
29
|
init?: (() => Promise<void>) | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Roles.d.ts","sourceRoot":"","sources":["../../src/roles/Roles.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAOrD,iBAAS,mBAAmB,SAE3B;AAGD,qBAAa,KAAK,CAAC,EAAE,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"Roles.d.ts","sourceRoot":"","sources":["../../src/roles/Roles.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,uBAAuB,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAClF,OAAO,KAAK,EAAE,eAAe,EAAoB,MAAM,oBAAoB,CAAC;AAC5E,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACtC,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAE9B,OAAO,KAAK,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAOrD,iBAAS,mBAAmB,SAE3B;AAGD,qBAAa,KAAK,CAAC,EAAE,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjF,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,EAAE,OAAO,GAAE,YAAiB;IA0BxD,KAAK,YAAC;IACN,WAAW,wCAAC;IACZ,UAAU,EAAG;QACZ,+GAA+G;QAC/G,SAAS,EAAE,OAAO,mBAAmB,CAAC;QAEtC,gHAAgH;QAChH,UAAU,EAAE,OAAO,mBAAmB,CAAC;KACvC,GAAG,uBAAuB,CAAC,OAAO,CAAC,CAAC;IAErC,YAAY,gCAAC;IACb,IAAI,WAAC;IACL,WAAW,CAAC;;;kBAAC;IAEb,IAAI,CAAC,OAAO,EAAE,OAAO;IAKrB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE;IAiB9C,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,EAAE,CAAM;IAExB,OAAO,CAAC,SAAS;IAmBjB,MAAM;IAkDN,eAAe,sCAA8B;IAE7C,IAAI,CAAC,oCA8DH;IAEF,GAAG,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,GAAG,SAAS,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW,CAAC;IAYjG,gBAAgB,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,GAAG,MAAM;IASxC,UAAU,CAAC,GAAG,EAAE,MAAM,EAAE;CAYxB"}
|
package/dist/users/Users.d.ts
CHANGED
|
@@ -22,7 +22,6 @@ export type Options<AS> = {
|
|
|
22
22
|
sessions?: SessionsOptions;
|
|
23
23
|
};
|
|
24
24
|
export declare class Users<AS extends AbilitiesSchema = AbilitiesSchema> extends Map<string, User<AS>> {
|
|
25
|
-
#private;
|
|
26
25
|
constructor(collections: InSiteCollections, options: Options<AS>);
|
|
27
26
|
_events: Record<string, object>;
|
|
28
27
|
_eventsCount: number;
|
|
@@ -66,12 +65,14 @@ export declare class Users<AS extends AbilitiesSchema = AbilitiesSchema> extends
|
|
|
66
65
|
update(shouldUpdateRoles?: boolean): void;
|
|
67
66
|
updateDebounced: import("@nesvet/n").Debounced<void>;
|
|
68
67
|
preinit?: (() => Promise<void>) | undefined;
|
|
68
|
+
private initPromise;
|
|
69
69
|
private init?;
|
|
70
70
|
whenReady(): Promise<this>;
|
|
71
71
|
new({ email, password, roles, name, org, job, ...restProps }: Omit<UserDoc, "_id" | "createdAt">): Promise<boolean>;
|
|
72
72
|
changePassword(_id: string, newPassword: string): Promise<void>;
|
|
73
73
|
login(email: string, password: string, sessionProps: Partial<SessionDoc>): Promise<Session<AS>>;
|
|
74
74
|
logout(session: Session<AS>): Promise<import("mongodb").DeleteResult>;
|
|
75
|
+
private sortUsersAndOrgs;
|
|
75
76
|
sortIds(ids: string[]): string[];
|
|
76
77
|
replaceMap: Map<string, string>;
|
|
77
78
|
replaceHandlers: Set<(fromId: string, toId: null | string) => Promise<void> | void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Users.d.ts","sourceRoot":"","sources":["../../src/users/Users.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,MAAM,eAAe,CAAC;AAOzC,OAAO,EACN,uBAAuB,EACvB,iBAAiB,EACjB,sBAAsB,EACtB,uBAAuB,EAEvB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,SAAS,CAAC;AAE/B,OAAO,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAC9C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AACnD,OAAO,KAAK,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAwB,MAAM,WAAW,CAAC;AAE1D,OAAO,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AAC9B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AASvC,MAAM,MAAM,OAAO,CAAC,EAAE,IAAI;IACzB,SAAS,EAAE,EAAE,CAAC;IACd,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,MAAM,CAAC,EAAE,sBAAsB,CAAC;IAChC,WAAW,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/B,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,QAAQ,CAAC,EAAE,eAAe,CAAC;CAE3B,CAAC;AAGF,qBAAa,KAAK,CAAC,EAAE,SAAS,eAAe,GAAG,eAAe,CAAE,SAAQ,GAAG,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC
|
|
1
|
+
{"version":3,"file":"Users.d.ts","sourceRoot":"","sources":["../../src/users/Users.ts"],"names":[],"mappings":"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"}
|