insite-users-server 1.0.337 → 1.0.346

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/bun.lockb ADDED
Binary file
package/dist/index.js CHANGED
@@ -1,4 +1,4 @@
1
- import"@nesvet/deprecated-extensions/server";import{debounce as F}from"@nesvet/n";import M from"argon2";import ee from"eventemitter3";import{ObjectId as se}from"insite-db";var T=[{_id:"login",title:"\u0412\u0445\u043E\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0443",params:[{_id:"sessionsLimit",title:"\u041B\u0438\u043C\u0438\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0441\u0435\u0441\u0441\u0438\u0439",type:"number",min:1,max:128},{_id:"sections",title:"\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0430\u0437\u0434\u0435\u043B\u044B",type:"items",items:[{_id:"users",title:"\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438"}]}]}];function E(n,e){for(let s of e){let t=n.find(({_id:i})=>i===s._id);if(t){for(let i in s)if(i!=="_id"){let o=s[i];Array.isArray(o)?E(t[i]??=[],o):t[i]=o}}else n.push(s)}return n}var I=class extends Map{constructor(e={}){super();let{tree:s,basis:t=!0}=e;this.tree=s?t?E(T,s):s:T,this.#e(this.tree)}#e(e){for(let s of e)this.set(s._id,s),s.subAbilities&&this.#e(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(!e[t])e[t]=Object.deepClone(i);else if(o.params){for(let r of o.params)if(r.isInheritable!==!1&&i[r._id]!==void 0){if(!e[t][r._id])e[t][r._id]=Object.deepClone(i[r._id]);else if(r.type==="number")e[t][r._id]<i[r._id]&&(e[t][r._id]=i[r._id]);else if(r.type==="items"){let l=e[t][r._id];for(let d of i[r._id])l.includes(d)||l.push(d)}}}}}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.ids());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 l of o.params){let d=r[l._id];if(l.type==="number")l.max!==void 0&&(l.max=d);else if(l.type==="items")for(let c=0;c<l.items.length;c++)d.includes(l.items[c]._id)||l.items.splice(c--,1)}o.subAbilities&&s(o.subAbilities)}else t.splice(i--,1)}return t}(Object.deepClone(this.tree))}};import{debounce as N}from"@nesvet/n";import{ObjectId as H}from"insite-db";var D=new Map,h=class{constructor(e,s){this.#e=e,this._id=s._id,e.set(this._id,this),this.update(s)}#e;isOrg=!0;ownerOrgs=new Set;ownerUsers=new Set;users=new Set;slaveOrgs=new Set;update({_id:e,title:s,owners:t,...i},o){let r=this.#e;if(Object.assign(this,i),s!==void 0&&(this.title=s,this.initials=s?.[0]?.toUpperCase()??"",this.displayLabel=s),t){this.ownerIds=t;let l=this.ownerIds.join(",");l!==D.get(this._id)&&(D.set(this._id,l),r.users.isInited&&r.updateDebounced(),r.users.emit("orgs-org-update",this,o))}}delete(){let e=this.#e;e.delete(this._id),D.delete(this._id),e.replace(this._id),e.updateDebounced()}};var a={_id:/^[a-fA-F\d]{24}$/,email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,argon2:/^\$argon2(?:i|d|id)\$v=\d+\$m=\d+,t=\d+,p=\d+\$[a-zA-Z\d+/]+\$[a-zA-Z\d+/]+$/,sessionId:/^[a-fA-F\d]{16,32}\$[a-fA-F\d]{16,32}$/,role:/^[a-z\d\-_]{1,64}$/,ip:/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/};for(let n in a)a[n].pattern=a[n].toString().slice(1,-1);var p={required:["_id","title","note","owners","createdAt"],properties:{_id:{bsonType:"string",pattern:a._id.pattern},title:{bsonType:"string",maxLength:512},note:{bsonType:"string",maxLength:131072},owners:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a._id.pattern},additionalItems:!1},createdAt:{bsonType:"number"}},additionalProperties:!1};var W=[[{owners:1}]];function k(n,e){return e.slaveOrgs.size-n.slaveOrgs.size||(n.title>e.title?1:n.title<e.title?-1:0)}function J(){throw new Error("Direct usage of orgs collection.deleteOne or .deleteMany is forbidden. Use orgs.collectionDelete instead.")}var A=class n extends Map{constructor(e,s={}){super();let{schema:t,indexes:i,null:o}=s;this.users=e,this.collections=e.collections,t&&(t.required?.removeAll(p.required),t.properties&&Object.delete(t,...Object.keys(p.properties)));let r={...p,...t,required:[...p.required,...t?.required??[]],properties:{...p.properties,...t?.properties}};return(async()=>(this.collection=await this.collections.ensure("orgs",{jsonSchema:r}),this.collection.ensureIndexes([...W,...i??[]]),this.collection.deleteOne=this.collection.deleteMany=J,this.null=new h(this,{...o,_id:null,title:"",displayLabel:"",note:"",owners:[],createdAt:Date.now()}),this.null.ownerIds=new Array.Empty,this.null.ownerOrgs=new Set.Empty,this.null.ownerUsers=new Set.Empty,this.null.slaveOrgs=new Set.Empty,this))()}load(e){new h(this,e)}static resolve(e,s){s=[e,...s];for(let t of e.ownerOrgs)n.resolve(t,s),t.slaveOrgs.addAll(s)}sorted=[];async 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))||n.resolve(t,[]);s.sort(k);for(let t of e)t.slaveOrgs.sort(k);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 t=0,{length:i}=s;t<i;)s[t]._o=t++;this.sorted=s,this.users.emit("orgs-update"),this.users.isInited&&(this.users.updateDebounced.clear(),this.users.update())}updateDebounced=N(this.update,250);initialLoad=async()=>{for(let e of await this.collection.find().toArray())this.load(e);delete this.initialLoad};init=async()=>{await this.update(),this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":{let s=new h(this,e.fullDocument);this.users.emit("orgs-org-update",s,e);break}case"update":case"replace":this.get(e.documentKey._id).update(e.updateDescription?.updatedFields||e.fullDocument,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:new H().toString(),title:e,note:s||"",owners:i?[i]:[],...Object.delete(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 Z}from"@nesvet/n";var j=new Map,u=class{constructor(e,s){this.#e=e,this._id=s._id,e.set(this._id,this),this.update(s)}#e;ownInvolves=[];involves=new Set;abilities={};inheritedAbilities={};update({_id:e,involves:s,abilities:t,title:i,...o},r){let l=this.#e;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 d=[this.ownInvolveIds.join(","),JSON.stringify(this.ownAbilities)].join(`
2
- `);d!=j.get(this._id)&&(j.set(this._id,d),l.users.isInited&&l.updateDebounced(),l.users.emit("roles-role-update",r))}}delete(){let e=this.#e;e.delete(this._id),j.delete(this._id),e.updateDebounced()}};var f={required:["_id","involves","abilities","title","description","createdAt"],properties:{_id:{bsonType:"string",pattern:a.role.pattern,not:{enum:["root"]}},involves:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a.role.pattern,not:{enum:["root"]}},additionalItems:!1},abilities:{bsonType:"object"},title:{bsonType:"string",maxLength:256},description:{bsonType:"string",maxLength:10240},createdAt:{bsonType:"number"}},additionalProperties:!1};var B=[[{involves:1}]];function G(){throw new Error("Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.collectionDelete instead.")}function Q(n,e){return e.involves.size-n.involves.size||(n.title&&e.title?n.title>e.title?1:n.title<e.title?-1:0:n.title?-1:e.title||n._id>e._id?1:n._id<e._id?-1:0)}var S=class extends Map{constructor(e,s={}){super();let{schema:t,indexes:i,root:o}=s;this.users=e,this.collections=e.collections,this.abilities=e.abilities,this.root=new u(this,{...o,_id:"root",involves:[],abilities:this.abilities.getMaximum(),title:"Root",description:"Root",createdAt:Date.now()}),t&&(t.required?.removeAll(f.required),t.properties&&Object.delete(t,...Object.keys(f.properties)));let r={...f,...t,required:[...f.required,...t?.required??[]],properties:{...f.properties,...t?.properties}};return(async()=>(this.collection=await this.collections.ensure("roles",{jsonSchema:r}),this.collection.ensureIndexes([...B,...i??[]]),this.collection.deleteOne=this.collection.deleteMany=G,this))()}load(e){new u(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)o.involves.reAdd(i),this.abilities.merge(o.inheritedAbilities,i.abilities);i!==e&&this.resolve(i,s)}}}sorted=[];async 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=Object.deepClone(i.ownAbilities),i.inheritedAbilities={};this.root.involves.add(this.root),this.resolve(this.root,[]);for(let i of e)i.ownInvolves=this.getAll(i.ownInvolveIds).sort(Q).reverse();let s=[this.root];for(let i=0;i<s.length;i++){let o=s[i];for(let r of o.ownInvolves){let l=s.indexOf(r);~l&&(s.splice(l,1),i--),s.splice(i+1,0,r)}}let t=0;for(let i of s)this.abilities.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=Z(this.update,250);init=async()=>{for(let e of await this.collection.find().toArray())this.load(e);await this.update(),this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":let s=new u(this,e.fullDocument);this.users.emit("roles-role-update",s,e);break;case"update":case"replace":this.get(e.documentKey._id).update(e.updateDescription?.updatedFields||e.fullDocument,e);break;case"delete":this.get(e.documentKey._id).delete(),this.users.emit("roles-role-update",null,e)}}),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??"",...Object.delete(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=this.sorted.intersection(this.getAll(e)),t=[];for(let i of s)s.every(o=>o===i||!o.involves.has(i))&&t.push(i._id);return t}};import P from"node:crypto";import{random as z}from"@nesvet/n";var m={required:["_id","user","remoteAddress","isOnline","createdAt","prolongedAt","expiresAt"],properties:{_id:{bsonType:"string",pattern:a.sessionId.pattern},user:{bsonType:"string",pattern:a._id.pattern},userAgent:{bsonType:"string",maxLength:4096},remoteAddress:{bsonType:"string",pattern:a.ip.pattern},isOnline:{bsonType:"bool"},createdAt:{bsonType:"number"},prolongedAt:{bsonType:"number"},expiresAt:{bsonType:"date"}},additionalProperties:!1};var g=class{constructor(e,s){this.#e=e,this._id=s._id,e.set(this._id,this),this.user=e.users.get(s.user),this.user.sessions.add(this),e.users.bySessionId.set(this._id,this.user),this.update(s)}#e;update({_id:e,user:s,isOnline:t,...i}){let o=this.#e;t!==void 0&&this.isOnline!=t&&(this.isOnline=t,o.isInited&&this.user.isOnline!=this.isOnline&&this.user.updateIsOnline()),Object.assign(this,i)}prolong({_id:e,user:s,...t}){let i=this.#e,o=Date.now();return t.prolongedAt=o,t.expiresAt=new Date(o+i.collection.expireAfterSeconds*1e3),this.update(t),i.collection.updateOne({_id:this._id},{$set:t})}offline(){let e={isOnline:!1};return this.update(e),this.#e.collection.updateOne({_id:this._id},{$set:e})}delete(){let e=this.#e;e.delete(this._id),this.user.sessions.delete(this),e.users.bySessionId.delete(this._id),e.users.emit("session-delete",this),this.isOnline&&this.user.updateIsOnline()}};var R=3600*24*7,V=[[{user:1}],[{expiresAt:1},{expireAfterSeconds:R}]],x=class extends Map{constructor(e,s={}){super();let{schema:t,indexes:i}=s;this.users=e,this.collections=e.collections,t&&(t.required?.removeAll(m.required),t.properties&&Object.delete(t,...Object.keys(m.properties)));let o={...m,...t,required:[...m.required,...t?.required??[]],properties:{...m.properties,...t?.properties}};return(async()=>(this.collection=await this.collections.ensure("sessions",{jsonSchema:o}),this.collection.expireAfterSeconds=R,this.collection.ensureIndexes([...V,...i??[]]),await this.collection.updateMany({isOnline:!0},{$set:{isOnline:!1}}),this))()}isInited=!1;makeId(){return`${P.randomBytes(z(8,16)).toString("hex")}$${P.randomBytes(z(8,16)).toString("hex")}`}load(e){new g(this,e)}init=async()=>{for(let e of await this.collection.find().toArray())this.load(e);this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":this.has(e.documentKey._id)||new g(this,e.fullDocument),this.users.get(e.fullDocument.user)?.trimSessions();break;case"update":case"replace":this.get(e.documentKey._id)?.update(e.updateDescription?.updatedFields||e.fullDocument);break;case"delete":this.get(e.documentKey._id)?.delete()}}),this.isInited=!0,delete this.init};async new(e,s){let t=Date.now(),i={...s,_id:this.uid(),user:e._id,createdAt:t,prolongedAt:t,expiresAt:new Date(t+R*1e3)},o=new g(this,i);return await this.collection.insertOne(i),o}};var K={required:["_id","type","size","ts","data"],properties:{_id:{bsonType:"string",pattern:a._id.pattern},type:{bsonType:"string",maxLength:256},size:{bsonType:"number"},ts:{bsonType:"string",maxLength:10},data:{bsonType:"binData"}},additionalProperties:!1};var v=class{constructor(e,s={}){return this.users=e,this.collections=e.collections,(async()=>(this.collection=await this.collections.ensure("users.avatars",{jsonSchema:K}),this))()}};var b={required:["_id","email","password","roles","name","org","job","createdAt"],properties:{_id:{bsonType:"string",pattern:a._id.pattern},email:{bsonType:"string",pattern:a.email.pattern},password:{bsonType:"string",pattern:a.argon2.pattern},roles:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a.role.pattern},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.pattern},{bsonType:"null"}]},job:{bsonType:"string",maxLength:512},avatar:{oneOf:[{bsonType:"string",maxLength:10},{bsonType:"null"}]},createdAt:{bsonType:"number"}},additionalProperties:!1};import{debounce as X}from"@nesvet/n";var L=new Map,q=new Map,Y=process.env.INSITE_STATIC_URL??"http://localhost:8080",O=class{constructor(e,s){this.#e=e,this._id=s._id,e.set(this._id,this),this.update(s),e.isInited&&e.emit("user-create",this)}#e;isUser=!0;roles=new Set;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,...l}){let d=this.#e;Object.assign(this,l);let c;t&&this.email!==t&&(d.byEmail.delete(this.email),this.email=t,d.byEmail.set(t,this),c=!0);let w,y;s&&(this.name?.first!==s.first||this.name.middle!==s.middle||this.name.last!==s.last)&&(y=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(),w=!0),(c||w)&&(this.displayLabel=`${s.first} ${s.last}`.trim()||s.middle||this.email);let _;if(i){this.ownRoleIds=i;let $=this.ownRoleIds.join(",");$!==L.get(this._id)&&(L.set(this._id,$),this.updateRoles(),_=!0)}let U;o!==void 0&&this.org?._id!==o&&(this.org?.users.delete(this),this.org=d.orgs.get(o)||d.orgs.null,this.org.users.add(this),U=!0),r!==void 0&&this.avatar!==r&&(this.avatar=r,this.avatarUrl=r&&`${Y}/avatars/${this._id}-${r}.webp`),_||U?(this.updatePermissions(),y&&(d.isSortRequired=!0),d.isInited&&d.updateDebounced()):y&&d.sortDebounced()}updateRoles(){let e=this.#e;if(e.isInited){this.ownRoles=[],this.roles.clear(),this.slaveRoles.clear(),Object.clear(this.abilities);for(let s of this.ownRoleIds){let t=e.roles.get(s);this.ownRoles.push(t),this.roles.add(t);for(let i of t.involves)this.roles.add(i),this.slaveRoles.add(i);this.slaveRoleIds=this.slaveRoles.ids(),e.abilities.merge(this.abilities,t.abilities)}this.roles.has(e.roles.root)&&(this.isRoot=!0),this.trimSessions()}}updatePermissions(){let e=this.#e;if(e.isInited){this.slaveOrgs.clear(),this.slaveUsers.clear(),this.slaves.clear();let s=new Set;for(let o of e.orgs.sorted)if((o.ownerUsers.has(this)||this.isRoot)&&!this.slaveOrgs.has(o)){this.slaveOrgs.add(o),this.slaves.add(o),s.add(o._id);for(let r of o.slaveOrgs)this.slaveOrgs.add(r),this.slaves.add(r),s.add(r._id)}for(let o of new Set([this.org,...this.slaveOrgs,e.orgs.null]))for(let r of o.users)r!==this&&(this.slaveRoles.hasAny(r.ownRoles)||!r.ownRoles.length)&&(this.slaveUsers.add(r),this.slaves.add(r),s.add(r._id));this.slaveIds=[...s];let t=[];if(this.org._id){t.push(this.org._id);for(let o of this.org.slaveOrgs)this.slaveOrgs.has(o)||t.push(o._id)}this.permissiveIds=[...t,this._id,...s];let i=[this.permissiveIds.join(","),this.ownRoleIds.join(","),JSON.stringify(this.abilities),this.slaveRoleIds.join(",")].join(`
3
- `);i!==q.get(this._id)&&(q.set(this._id,i),e.emit("user-permissions-change",this))}}trimSessions(){let e=this.abilities.login?.sessionsLimit??0;if(this.sessions.size>e)return this.#e.sessions.collection.deleteMany({_id:{$in:[...this.sessions].sort((s,t)=>s.expiresAt-t.expiresAt).slice(0,this.sessions.size-e).ids()}})}updateIsOnline=X(()=>{let e=!1;for(let s of this.sessions)if(s.isOnline){e=!0;break}this.isOnline!==e&&(this.isOnline=e,this.#e.emit("user-is-online",this))},500);delete(){let e=this.#e;this.org.users.delete(this),e.delete(this._id),e.byEmail.delete(this.email),e.sorted.remove(this),L.delete(this._id),q.delete(this._id),e.replace(this._id),e.updateDebounced()}};var te=[[{email:1},{unique:!0}],[{org:1}]];function ie(n,e){return n.isUser&&e.isUser?n.name.last&&e.name.last?n.name.last>e.name.last?1:n.name.last<e.name.last?-1:0:!n.name.last&&!e.name.last?n.displayLabel>e.displayLabel?1:n.displayLabel<e.displayLabel?-1:0:n.name.last?-1:1:n.isOrg&&e.isOrg?n.title>e.title?1:n.title<e.title?-1:0:n.isOrg?-1:1}var C=class extends Map{constructor({collections:e,indexes:s,schema:t,initialRoot:i,abilities:o,roles:r,orgs:l,sessions:d,avatars:c}){super();let w=new ee;for(let _ in w)this[_]=w[_];this.collections=e,this.abilities=new I(o),t&&(t.required?.removeAll(b.required),t.properties&&Object.delete(t,...Object.keys(b.properties)));let y={...b,...t,required:[...b.required,...t?.required??[]],properties:{...b.properties,...t?.properties}};return(async()=>(this.collection=await this.collections.ensure("users",{jsonSchema:y}),this.collection.ensureIndexes([...te,...s??[]]),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",...Object.delete(i,"roles","org")}),this.roles=await new S(this,r),this.orgs=await new A(this,l),this.sessions=await new x(this,d),this.avatars=await new v(this,c),await this.roles.init(),await this.orgs.initialLoad(),await this.initialLoad(),await this.orgs.init(),await this.init(),await this.sessions.init(),this))()}isInited=!1;byEmail=new Map;bySessionId=new Map;sorted=[];isSortRequired=!1;load(e){new O(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=F(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=F(this.update,250);initialLoad=async()=>{for(let e of await this.collection.find().toArray())this.load(e);delete this.initialLoad};init=async()=>{this.isInited=!0,this.update(!0),this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":new O(this,e.fullDocument);break;case"replace":this.get(e.documentKey._id).update(e.fullDocument);break;case"update":this.get(e.documentKey._id).update(e.updateDescription.updatedFields);break;case"delete":this.get(e.documentKey._id).delete()}}),delete this.init};async new({email:e,password:s,roles:t,name:i,org:o,job:r,...l}){if(this.byEmail.has(e))throw new Error("User exists");return await this.collection.insertOne({_id:new se().toString(),email:e,password:await M.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??"",...Object.delete(l,"_id"),createdAt:Date.now()}),!0}async changePassword(e,s){if(this.has(e))if(s)await Promise.all([this.collection.updateOne({_id:e},{$set:{password:await M.hash(s)}}),this.sessions.collection.deleteMany({user:e})]);else throw new Error("emptypasswordisnotallowed");else throw new Error("usernotfound")}async login(e,s,t){let i=this.byEmail.get(e);if(i)if(await M.verify(i.password,s)){if(!i.abilities.login)throw new Error("userisnotabletologin")}else throw new Error("incorrectpassword");else throw new Error("usernotfound");return this.sessions.new(i,t)}logout(e){return e.delete(),this.sessions.collection.deleteOne({_id:e._id})}sortIds(e){return e.map(s=>this.get(s)||this.orgs.get(s)).filter(Boolean).sort(ie).ids()}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)}};export{C as Users};
1
+ import"@nesvet/deprecated-extensions/server";import{debounce as K}from"@nesvet/n";import{hash as F,verify as ee}from"argon2";import se from"eventemitter3";import{ObjectId as te}from"insite-db";var T=[{_id:"login",title:"\u0412\u0445\u043E\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0443",params:[{_id:"sessionsLimit",title:"\u041B\u0438\u043C\u0438\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0441\u0435\u0441\u0441\u0438\u0439",type:"number",min:1,max:128},{_id:"sections",title:"\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0430\u0437\u0434\u0435\u043B\u044B",type:"items",items:[{_id:"users",title:"\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438"}]}]}];function $(n,e){for(let s of e){let t=n.find(({_id:i})=>i===s._id);if(t){for(let i in s)if(i!=="_id"){let o=s[i];Array.isArray(o)?$(t[i]??=[],o):t[i]=o}}else n.push(s)}return n}var I=class extends Map{constructor(e={}){super();let{tree:s,basis:t=!0}=e;this.tree=s?t?$(T,s):s:T,this.#e(this.tree)}#e(e){for(let s of e)this.set(s._id,s),s.subAbilities&&this.#e(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(!e[t])e[t]=Object.deepClone(i);else if(o.params){for(let r of o.params)if(r.isInheritable!==!1&&i[r._id]!==void 0){if(!e[t][r._id])e[t][r._id]=Object.deepClone(i[r._id]);else if(r.type==="number")e[t][r._id]<i[r._id]&&(e[t][r._id]=i[r._id]);else if(r.type==="items"){let l=e[t][r._id];for(let d of i[r._id])l.includes(d)||l.push(d)}}}}}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.ids());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 l of o.params){let d=r[l._id];if(l.type==="number")l.max!==void 0&&(l.max=d);else if(l.type==="items")for(let c=0;c<l.items.length;c++)d.includes(l.items[c]._id)||l.items.splice(c--,1)}o.subAbilities&&s(o.subAbilities)}else t.splice(i--,1)}return t}(Object.deepClone(this.tree))}};import{debounce as N}from"@nesvet/n";import{ObjectId as H}from"insite-db";var D=new Map,h=class{constructor(e,s){this.#e=e,this._id=s._id,e.set(this._id,this),this.update(s)}#e;isOrg=!0;ownerOrgs=new Set;ownerUsers=new Set;users=new Set;slaveOrgs=new Set;update({_id:e,title:s,owners:t,...i},o){let r=this.#e;if(Object.assign(this,i),s!==void 0&&(this.title=s,this.initials=s?.[0]?.toUpperCase()??"",this.displayLabel=s),t){this.ownerIds=t;let l=this.ownerIds.join(",");l!==D.get(this._id)&&(D.set(this._id,l),r.users.isInited&&r.updateDebounced(),r.users.emit("orgs-org-update",this,o))}}delete(){let e=this.#e;e.delete(this._id),D.delete(this._id),e.replace(this._id),e.updateDebounced()}};var a={_id:/^[a-fA-F\d]{24}$/,email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,argon2:/^\$argon2(?:i|d|id)\$v=\d+\$m=\d+,t=\d+,p=\d+\$[a-zA-Z\d+/]+\$[a-zA-Z\d+/]+$/,sessionId:/^[a-fA-F\d]{16,32}\$[a-fA-F\d]{16,32}$/,role:/^[a-z\d\-_]{1,64}$/,ip:/^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/};for(let n in a)a[n].pattern=a[n].toString().slice(1,-1);var p={required:["_id","title","note","owners","createdAt"],properties:{_id:{bsonType:"string",pattern:a._id.pattern},title:{bsonType:"string",maxLength:512},note:{bsonType:"string",maxLength:131072},owners:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a._id.pattern},additionalItems:!1},createdAt:{bsonType:"number"}},additionalProperties:!1};var W=[[{owners:1}]];function E(n,e){return e.slaveOrgs.size-n.slaveOrgs.size||(n.title>e.title?1:n.title<e.title?-1:0)}function J(){throw new Error("Direct usage of orgs collection.deleteOne or .deleteMany is forbidden. Use orgs.collectionDelete instead.")}var A=class n extends Map{constructor(e,s={}){super();let{schema:t,indexes:i,null:o}=s;this.users=e,this.collections=e.collections,t&&(t.required?.removeAll(p.required),t.properties&&Object.delete(t,...Object.keys(p.properties)));let r={...p,...t,required:[...p.required,...t?.required??[]],properties:{...p.properties,...t?.properties}};return(async()=>(this.collection=await this.collections.ensure("orgs",{jsonSchema:r}),this.collection.ensureIndexes([...W,...i??[]]),this.collection.deleteOne=this.collection.deleteMany=J,this.null=new h(this,{...o,_id:null,title:"",displayLabel:"",note:"",owners:[],createdAt:Date.now()}),this.null.ownerIds=new Array.Empty,this.null.ownerOrgs=new Set.Empty,this.null.ownerUsers=new Set.Empty,this.null.slaveOrgs=new Set.Empty,this))()}load(e){new h(this,e)}static resolve(e,s){s=[e,...s];for(let t of e.ownerOrgs)n.resolve(t,s),t.slaveOrgs.addAll(s)}sorted=[];async 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))||n.resolve(t,[]);s.sort(E);for(let t of e)t.slaveOrgs.sort(E);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 t=0,{length:i}=s;t<i;)s[t]._o=t++;this.sorted=s,this.users.emit("orgs-update"),this.users.isInited&&(this.users.updateDebounced.clear(),this.users.update())}updateDebounced=N(this.update,250);initialLoad=async()=>{for(let e of await this.collection.find().toArray())this.load(e);delete this.initialLoad};init=async()=>{await this.update(),this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":{let s=new h(this,e.fullDocument);this.users.emit("orgs-org-update",s,e);break}case"update":case"replace":this.get(e.documentKey._id).update(e.updateDescription?.updatedFields||e.fullDocument,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:new H().toString(),title:e,note:s||"",owners:i?[i]:[],...Object.delete(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 Z}from"@nesvet/n";var j=new Map,u=class{constructor(e,s){this.#e=e,this._id=s._id,e.set(this._id,this),this.update(s)}#e;ownInvolves=[];involves=new Set;abilities={};inheritedAbilities={};update({_id:e,involves:s,abilities:t,title:i,...o},r){let l=this.#e;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 d=[this.ownInvolveIds.join(","),JSON.stringify(this.ownAbilities)].join(`
2
+ `);d!=j.get(this._id)&&(j.set(this._id,d),l.users.isInited&&l.updateDebounced(),l.users.emit("roles-role-update",r))}}delete(){let e=this.#e;e.delete(this._id),j.delete(this._id),e.updateDebounced()}};var f={required:["_id","involves","abilities","title","description","createdAt"],properties:{_id:{bsonType:"string",pattern:a.role.pattern,not:{enum:["root"]}},involves:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a.role.pattern,not:{enum:["root"]}},additionalItems:!1},abilities:{bsonType:"object"},title:{bsonType:"string",maxLength:256},description:{bsonType:"string",maxLength:10240},createdAt:{bsonType:"number"}},additionalProperties:!1};var B=[[{involves:1}]];function G(){throw new Error("Direct usage of roles collection.deleteOne or .deleteMany is forbidden. Use roles.collectionDelete instead.")}function Q(n,e){return e.involves.size-n.involves.size||(n.title&&e.title?n.title>e.title?1:n.title<e.title?-1:0:n.title?-1:e.title||n._id>e._id?1:n._id<e._id?-1:0)}var S=class extends Map{constructor(e,s={}){super();let{schema:t,indexes:i,root:o}=s;this.users=e,this.collections=e.collections,this.abilities=e.abilities,this.root=new u(this,{...o,_id:"root",involves:[],abilities:this.abilities.getMaximum(),title:"Root",description:"Root",createdAt:Date.now()}),t&&(t.required?.removeAll(f.required),t.properties&&Object.delete(t,...Object.keys(f.properties)));let r={...f,...t,required:[...f.required,...t?.required??[]],properties:{...f.properties,...t?.properties}};return(async()=>(this.collection=await this.collections.ensure("roles",{jsonSchema:r}),this.collection.ensureIndexes([...B,...i??[]]),this.collection.deleteOne=this.collection.deleteMany=G,this))()}load(e){new u(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)o.involves.reAdd(i),this.abilities.merge(o.inheritedAbilities,i.abilities);i!==e&&this.resolve(i,s)}}}sorted=[];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=Object.deepClone(i.ownAbilities),i.inheritedAbilities={};this.root.involves.add(this.root),this.resolve(this.root,[]);for(let i of e)i.ownInvolves=this.getAll(i.ownInvolveIds).sort(Q).reverse();let s=[this.root];for(let i=0;i<s.length;i++){let o=s[i];for(let r of o.ownInvolves){let l=s.indexOf(r);~l&&(s.splice(l,1),i--),s.splice(i+1,0,r)}}let t=0;for(let i of s)this.abilities.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=Z(this.update,250);init=async()=>{for(let e of await this.collection.find().toArray())this.load(e);await this.update(),this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":let s=new u(this,e.fullDocument);this.users.emit("roles-role-update",s,e);break;case"update":case"replace":this.get(e.documentKey._id).update(e.updateDescription?.updatedFields||e.fullDocument,e);break;case"delete":this.get(e.documentKey._id).delete(),this.users.emit("roles-role-update",null,e)}}),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??"",...Object.delete(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=this.sorted.intersection(this.getAll(e)),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{random as P}from"@nesvet/n";var m={required:["_id","user","remoteAddress","isOnline","createdAt","prolongedAt","expiresAt"],properties:{_id:{bsonType:"string",pattern:a.sessionId.pattern},user:{bsonType:"string",pattern:a._id.pattern},userAgent:{bsonType:"string",maxLength:4096},remoteAddress:{bsonType:"string",pattern:a.ip.pattern},isOnline:{bsonType:"bool"},createdAt:{bsonType:"number"},prolongedAt:{bsonType:"number"},expiresAt:{bsonType:"date"}},additionalProperties:!1};var g=class{constructor(e,s){this.#e=e,this._id=s._id,e.set(this._id,this),this.user=e.users.get(s.user),this.user.sessions.add(this),e.users.bySessionId.set(this._id,this.user),this.update(s)}#e;update({_id:e,user:s,isOnline:t,...i}){let o=this.#e;t!==void 0&&this.isOnline!=t&&(this.isOnline=t,o.isInited&&this.user.isOnline!=this.isOnline&&this.user.updateIsOnline()),Object.assign(this,i)}prolong({_id:e,user:s,...t}){let i=this.#e,o=Date.now();return t.prolongedAt=o,t.expiresAt=new Date(o+i.collection.expireAfterSeconds*1e3),this.update(t),i.collection.updateOne({_id:this._id},{$set:t})}offline(){let e={isOnline:!1};return this.update(e),this.#e.collection.updateOne({_id:this._id},{$set:e})}delete(){let e=this.#e;e.delete(this._id),this.user.sessions.delete(this),e.users.bySessionId.delete(this._id),e.users.emit("session-delete",this),this.isOnline&&this.user.updateIsOnline()}};var R=3600*24*7,V=[[{user:1}],[{expiresAt:1},{expireAfterSeconds:R}]],x=class extends Map{constructor(e,s={}){super();let{schema:t,indexes:i}=s;this.users=e,this.collections=e.collections,t&&(t.required?.removeAll(m.required),t.properties&&Object.delete(t,...Object.keys(m.properties)));let o={...m,...t,required:[...m.required,...t?.required??[]],properties:{...m.properties,...t?.properties}};return(async()=>(this.collection=await this.collections.ensure("sessions",{jsonSchema:o}),this.collection.expireAfterSeconds=R,this.collection.ensureIndexes([...V,...i??[]]),await this.collection.updateMany({isOnline:!0},{$set:{isOnline:!1}}),this))()}isInited=!1;makeId(){return`${k.randomBytes(P(8,16)).toString("hex")}$${k.randomBytes(P(8,16)).toString("hex")}`}load(e){new g(this,e)}init=async()=>{for(let e of await this.collection.find().toArray())this.load(e);this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":this.has(e.documentKey._id)||new g(this,e.fullDocument),this.users.get(e.fullDocument.user)?.trimSessions();break;case"update":case"replace":this.get(e.documentKey._id)?.update(e.updateDescription?.updatedFields||e.fullDocument);break;case"delete":this.get(e.documentKey._id)?.delete()}}),this.isInited=!0,delete this.init};async new(e,s){let t=Date.now(),i={...s,_id:this.uid(),user:e._id,createdAt:t,prolongedAt:t,expiresAt:new Date(t+R*1e3)},o=new g(this,i);return await this.collection.insertOne(i),o}};var z={required:["_id","type","size","ts","data"],properties:{_id:{bsonType:"string",pattern:a._id.pattern},type:{bsonType:"string",maxLength:256},size:{bsonType:"number"},ts:{bsonType:"string",maxLength:10},data:{bsonType:"binData"}},additionalProperties:!1};var v=class{constructor(e,s={}){return this.users=e,this.collections=e.collections,(async()=>(this.collection=await this.collections.ensure("users.avatars",{jsonSchema:z}),this))()}};var b={required:["_id","email","password","roles","name","org","job","createdAt"],properties:{_id:{bsonType:"string",pattern:a._id.pattern},email:{bsonType:"string",pattern:a.email.pattern},password:{bsonType:"string",pattern:a.argon2.pattern},roles:{bsonType:"array",uniqueItems:!0,items:{bsonType:"string",pattern:a.role.pattern},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.pattern},{bsonType:"null"}]},job:{bsonType:"string",maxLength:512},avatar:{oneOf:[{bsonType:"string",maxLength:10},{bsonType:"null"}]},createdAt:{bsonType:"number"}},additionalProperties:!1};import{debounce as X}from"@nesvet/n";var L=new Map,q=new Map,Y=process.env.INSITE_STATIC_URL??"http://localhost:8080",O=class{constructor(e,s){this.#e=e,this._id=s._id,e.set(this._id,this),this.update(s),e.isInited&&e.emit("user-create",this)}#e;isUser=!0;roles=new Set;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,...l}){let d=this.#e;Object.assign(this,l);let c;t&&this.email!==t&&(d.byEmail.delete(this.email),this.email=t,d.byEmail.set(t,this),c=!0);let w,y;s&&(this.name?.first!==s.first||this.name.middle!==s.middle||this.name.last!==s.last)&&(y=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(),w=!0),(c||w)&&(this.displayLabel=`${s.first} ${s.last}`.trim()||s.middle||this.email);let _;if(i){this.ownRoleIds=i;let U=this.ownRoleIds.join(",");U!==L.get(this._id)&&(L.set(this._id,U),this.updateRoles(),_=!0)}let M;o!==void 0&&this.org?._id!==o&&(this.org?.users.delete(this),this.org=d.orgs.get(o)||d.orgs.null,this.org.users.add(this),M=!0),r!==void 0&&this.avatar!==r&&(this.avatar=r,this.avatarUrl=r&&`${Y}/avatars/${this._id}-${r}.webp`),_||M?(this.updatePermissions(),y&&(d.isSortRequired=!0),d.isInited&&d.updateDebounced()):y&&d.sortDebounced()}updateRoles(){let e=this.#e;if(e.isInited){this.ownRoles=[],this.roles.clear(),this.slaveRoles.clear(),Object.clear(this.abilities);for(let s of this.ownRoleIds){let t=e.roles.get(s);this.ownRoles.push(t),this.roles.add(t);for(let i of t.involves)this.roles.add(i),this.slaveRoles.add(i);this.slaveRoleIds=this.slaveRoles.ids(),e.abilities.merge(this.abilities,t.abilities)}this.roles.has(e.roles.root)&&(this.isRoot=!0),this.trimSessions()}}updatePermissions(){let e=this.#e;if(e.isInited){this.slaveOrgs.clear(),this.slaveUsers.clear(),this.slaves.clear();let s=new Set;for(let o of e.orgs.sorted)if((o.ownerUsers.has(this)||this.isRoot)&&!this.slaveOrgs.has(o)){this.slaveOrgs.add(o),this.slaves.add(o),s.add(o._id);for(let r of o.slaveOrgs)this.slaveOrgs.add(r),this.slaves.add(r),s.add(r._id)}for(let o of new Set([this.org,...this.slaveOrgs,e.orgs.null]))for(let r of o.users)r!==this&&(this.slaveRoles.hasAny(r.ownRoles)||!r.ownRoles.length)&&(this.slaveUsers.add(r),this.slaves.add(r),s.add(r._id));this.slaveIds=[...s];let t=[];if(this.org._id){t.push(this.org._id);for(let o of this.org.slaveOrgs)this.slaveOrgs.has(o)||t.push(o._id)}this.permissiveIds=[...t,this._id,...s];let i=[this.permissiveIds.join(","),this.ownRoleIds.join(","),JSON.stringify(this.abilities),this.slaveRoleIds.join(",")].join(`
3
+ `);i!==q.get(this._id)&&(q.set(this._id,i),e.emit("user-permissions-change",this))}}trimSessions(){let e=this.abilities.login?.sessionsLimit??0;if(this.sessions.size>e)return this.#e.sessions.collection.deleteMany({_id:{$in:[...this.sessions].sort((s,t)=>s.expiresAt-t.expiresAt).slice(0,this.sessions.size-e).ids()}})}updateIsOnline=X(()=>{let e=!1;for(let s of this.sessions)if(s.isOnline){e=!0;break}this.isOnline!==e&&(this.isOnline=e,this.#e.emit("user-is-online",this))},500);delete(){let e=this.#e;this.org.users.delete(this),e.delete(this._id),e.byEmail.delete(this.email),e.sorted.remove(this),L.delete(this._id),q.delete(this._id),e.replace(this._id),e.updateDebounced()}};var ie=[[{email:1},{unique:!0}],[{org:1}]];function oe(n,e){return n.isUser&&e.isUser?n.name.last&&e.name.last?n.name.last>e.name.last?1:n.name.last<e.name.last?-1:0:!n.name.last&&!e.name.last?n.displayLabel>e.displayLabel?1:n.displayLabel<e.displayLabel?-1:0:n.name.last?-1:1:n.isOrg&&e.isOrg?n.title>e.title?1:n.title<e.title?-1:0:n.isOrg?-1:1}var C=class extends Map{constructor({collections:e,indexes:s,schema:t,initialRoot:i,abilities:o,roles:r,orgs:l,sessions:d,avatars:c}){super();let w=new se;for(let _ of Object.keys(w))this[_]=w[_];this.collections=e,this.abilities=new I(o),t&&(t.required?.removeAll(b.required),t.properties&&Object.delete(t,...Object.keys(b.properties)));let y={...b,...t,required:[...b.required,...t?.required??[]],properties:{...b.properties,...t?.properties}};return(async()=>(this.collection=await this.collections.ensure("users",{jsonSchema:y}),this.collection.ensureIndexes([...ie,...s??[]]),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",...Object.delete(i,"roles","org")}),this.roles=await new S(this,r),this.orgs=await new A(this,l),this.sessions=await new x(this,d),this.avatars=await new v(this,c),await this.roles.init(),await this.orgs.initialLoad(),await this.initialLoad(),await this.orgs.init(),await this.init(),await this.sessions.init(),this))()}isInited=!1;byEmail=new Map;bySessionId=new Map;sorted=[];isSortRequired=!1;load(e){new O(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=K(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=K(this.update,250);initialLoad=async()=>{for(let e of await this.collection.find().toArray())this.load(e);delete this.initialLoad};init=()=>{this.isInited=!0,this.update(!0),this.collection.changeListeners.add(e=>{switch(e.operationType){case"insert":new O(this,e.fullDocument);break;case"replace":this.get(e.documentKey._id).update(e.fullDocument);break;case"update":this.get(e.documentKey._id).update(e.updateDescription.updatedFields);break;case"delete":this.get(e.documentKey._id).delete()}}),delete this.init};async new({email:e,password:s,roles:t,name:i,org:o,job:r,...l}){if(this.byEmail.has(e))throw new Error("User exists");return await this.collection.insertOne({_id:new te().toString(),email:e,password:await F(s),roles:this.isInited?this.roles.cleanUpIds(t):t,name:{first:i.first??"",middle:i.middle??"",last:i.last??""},org:o??null,job:r??"",...Object.delete(l,"_id"),createdAt:Date.now()}),!0}async changePassword(e,s){if(this.has(e))if(s)await Promise.all([this.collection.updateOne({_id:e},{$set:{password:await F(s)}}),this.sessions.collection.deleteMany({user:e})]);else throw new Error("emptypasswordisnotallowed");else throw new Error("usernotfound")}async login(e,s,t){let i=this.byEmail.get(e);if(i)if(await ee(i.password,s)){if(!i.abilities.login)throw new Error("userisnotabletologin")}else throw new Error("incorrectpassword");else throw new Error("usernotfound");return this.sessions.new(i,t)}logout(e){return e.delete(),this.sessions.collection.deleteOne({_id:e._id})}sortIds(e){return e.map(s=>this.get(s)||this.orgs.get(s)).filter(Boolean).sort(oe).ids()}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)}};export{C 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/index.js", "../src/users/Users.js", "../src/abilities/tree.js", "../src/abilities/Abilities.js", "../src/orgs/Orgs.js", "../src/orgs/Org.js", "../src/lib/regexps.js", "../src/orgs/schema.js", "../src/roles/Roles.js", "../src/roles/Role.js", "../src/roles/schema.js", "../src/sessions/Sessions.js", "../src/sessions/schema.js", "../src/sessions/Session.js", "../src/users/avatars/schema.js", "../src/users/avatars/Avatars.js", "../src/users/schema.js", "../src/users/User.js"],
4
- "sourcesContent": ["import \"@nesvet/deprecated-extensions/server\";\n\n\nexport * from \"./users\";\n", "import { debounce } from \"@nesvet/n\";\nimport argon2 from \"argon2\";\nimport EventEmitter from \"eventemitter3\";\nimport { ObjectId } from \"insite-db\";\nimport { Abilities } from \"../abilities\";\nimport { Orgs } from \"../orgs\";\nimport { Roles } from \"../roles\";\nimport { Sessions } from \"../sessions\";\nimport { Avatars } from \"./avatars\";\nimport { basisSchema } from \"./schema\";\nimport { User } from \"./User\";\n\n\nconst indexes = [\n\t[ { email: 1 }, { unique: true } ],\n\t[ { org: 1 } ]\n];\n\nfunction sortUsersAndOrgs(a, b) {\n\treturn (\n\t\t(a.isUser && b.isUser) ?\n\t\t\t(a.name.last && b.name.last) ?\n\t\t\t\ta.name.last > b.name.last ?\n\t\t\t\t\t1 :\n\t\t\t\t\ta.name.last < b.name.last ? -1 : 0 :\n\t\t\t (!a.name.last && !b.name.last) ?\n\t\t\t\t\ta.displayLabel > b.displayLabel ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta.displayLabel < b.displayLabel ? -1 : 0 :\n\t\t\t a.name.last ? -1 : 1 :\n\t\t (a.isOrg && b.isOrg) ?\n\t\t\t\ta.title > b.title ?\n\t\t\t\t\t1 :\n\t\t\t\t\ta.title < b.title ? -1 : 0 :\n\t\t a.isOrg ? -1 : 1\n\t);\n}\n\n\nexport class Users extends Map {\n\tconstructor({\n\t\tcollections,\n\t\tindexes: customIndexes,\n\t\tschema: customSchema,\n\t\tinitialRoot: initialRootProps,\n\t\tabilities: abilitiesOptions,\n\t\troles: rolesOptions,\n\t\torgs: orgsOptions,\n\t\tsessions: sessionsOptions,\n\t\tavatars: avatarsOptions\n\t}) {\n\t\tsuper();\n\t\t\n\t\tconst eventEmitter = new EventEmitter();\n\t\tfor (const key in eventEmitter)\n\t\t\tthis[key] = eventEmitter[key];\n\t\t\n\t\tthis.collections = collections;\n\t\t\n\t\tthis.abilities = new Abilities(abilitiesOptions);\n\t\t\n\t\tif (customSchema) {\n\t\t\tcustomSchema.required?.removeAll(basisSchema.required);\n\t\t\tif (customSchema.properties)\n\t\t\t\tObject.delete(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, ...customSchema?.required ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"users\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tif (!await this.collection.countDocuments({ roles: \"root\" }))\n\t\t\t\tawait this.new({\n\t\t\t\t\temail: process.env.INSITE_ROOT_EMAIL ?? \"insite@root.email\",\n\t\t\t\t\tpassword: process.env.INSITE_ROOT_PASSWORD ?? \"inSiteRootPassword\",\n\t\t\t\t\troles: [ \"root\" ],\n\t\t\t\t\tname: { first: \"Root\" },\n\t\t\t\t\torg: null,\n\t\t\t\t\tjob: \"Root\",\n\t\t\t\t\t...Object.delete(initialRootProps, \"roles\", \"org\")\n\t\t\t\t});\n\t\t\t\n\t\t\tthis.roles = await new Roles(this, rolesOptions);\n\t\t\tthis.orgs = await new Orgs(this, orgsOptions);\n\t\t\tthis.sessions = await new Sessions(this, sessionsOptions);\n\t\t\tthis.avatars = await new Avatars(this, avatarsOptions);\n\t\t\t\n\t\t\tawait this.roles.init();\n\t\t\t\n\t\t\tawait this.orgs.initialLoad();\n\t\t\tawait this.initialLoad();\n\t\t\t\n\t\t\tawait this.orgs.init();\n\t\t\tawait this.init();\n\t\t\t\n\t\t\tawait this.sessions.init();\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tisInited = false;\n\t\n\tbyEmail = new Map();\n\tbySessionId = new Map();\n\tsorted = [];\n\t\n\tisSortRequired = false;\n\t\n\tload(userDoc) {\n\t\tnew User(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) {\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\tinitialLoad = async () => {\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.initialLoad;\n\t\t\n\t};\n\t\n\tinit = async () => {\n\t\t\n\t\tthis.isInited = true;\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(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\tdelete this.init;\n\t\t\n\t};\n\t\n\tasync new({ email, password, roles, name, org, job, ...restProps }) {\n\t\tif (this.byEmail.has(email))\n\t\t\tthrow new Error(\"User exists\");\n\t\telse\n\t\t\tawait this.collection.insertOne({\n\t\t\t\t_id: (new ObjectId()).toString(),\n\t\t\t\temail,\n\t\t\t\tpassword: await argon2.hash(password),\n\t\t\t\troles: this.isInited ? this.roles.cleanUpIds(roles) : roles,\n\t\t\t\tname: {\n\t\t\t\t\tfirst: name.first ?? \"\",\n\t\t\t\t\tmiddle: name.middle ?? \"\",\n\t\t\t\t\tlast: name.last ?? \"\"\n\t\t\t\t},\n\t\t\t\torg: org ?? null,\n\t\t\t\tjob: job ?? \"\",\n\t\t\t\t...Object.delete(restProps, \"_id\"),\n\t\t\t\tcreatedAt: Date.now()\n\t\t\t});\n\t\t\n\t\treturn true;\n\t}\n\t\n\tasync changePassword(_id, newPassword) {\n\t\tif (!this.has(_id))\n\t\t\tthrow new Error(\"usernotfound\");\n\t\telse if (!newPassword)\n\t\t\tthrow new Error(\"emptypasswordisnotallowed\");\n\t\telse\n\t\t\tawait Promise.all([\n\t\t\t\tthis.collection.updateOne({ _id }, { $set: { password: await argon2.hash(newPassword) } }),\n\t\t\t\tthis.sessions.collection.deleteMany({ user: _id })\n\t\t\t]);\n\t\t\n\t}\n\t\n\tasync login(email, password, sessionProps) {\n\t\tconst user = this.byEmail.get(email);\n\t\t\n\t\tif (!user)\n\t\t\tthrow new Error(\"usernotfound\");\n\t\telse if (!await argon2.verify(user.password, password))\n\t\t\tthrow new Error(\"incorrectpassword\");\n\t\telse if (!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) {\n\t\tsession.delete();\n\t\t\n\t\treturn this.sessions.collection.deleteOne({ _id: session._id });\n\t}\n\t\n\tsortIds(ids) {\n\t\treturn ids\n\t\t\t.map(_id => this.get(_id) || this.orgs.get(_id))\n\t\t\t.filter(Boolean)\n\t\t\t.sort(sortUsersAndOrgs)\n\t\t\t.ids();\n\t}\n\t\n\treplaceMap = new Map();\n\t\n\treplaceHandlers = new Set();\n\t\n\tasync replace(fromId) {\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", "export const basisTree = [\n\t{\n\t\t_id: \"login\",\n\t\ttitle: \"\u0412\u0445\u043E\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0443\",\n\t\tparams: [\n\t\t\t{\n\t\t\t\t_id: \"sessionsLimit\",\n\t\t\t\ttitle: \"\u041B\u0438\u043C\u0438\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0441\u0435\u0441\u0441\u0438\u0439\",\n\t\t\t\ttype: \"number\",\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 128\n\t\t\t},\n\t\t\t{\n\t\t\t\t_id: \"sections\",\n\t\t\t\ttitle: \"\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0430\u0437\u0434\u0435\u043B\u044B\",\n\t\t\t\ttype: \"items\",\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\t_id: \"users\",\n\t\t\t\t\t\ttitle: \"\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438\"\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n];\n", "import { basisTree } from \"./tree\";\n\n\nfunction mergeTrees(target, source) {\n\tfor (const sourceItem of source) {\n\t\tconst targetItem = target.find(({ _id }) => _id === sourceItem._id);\n\t\tif (targetItem) {\n\t\t\tfor (const key in sourceItem)\n\t\t\t\tif (key !== \"_id\") {\n\t\t\t\t\tconst sourceItemField = sourceItem[key];\n\t\t\t\t\tif (Array.isArray(sourceItemField))\n\t\t\t\t\t\tmergeTrees(targetItem[key] ??= [], sourceItemField);\n\t\t\t\t\telse\n\t\t\t\t\t\ttargetItem[key] = sourceItemField;\n\t\t\t\t}\n\t\t} else\n\t\t\ttarget.push(sourceItem);\n\t}\n\t\n\treturn target;\n}\n\n\nexport class Abilities extends Map {\n\tconstructor(options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\ttree: customTree,\n\t\t\tbasis = true\n\t\t} = options;\n\t\t\n\t\tthis.tree =\n\t\t\tcustomTree ?\n\t\t\t\tbasis ?\n\t\t\t\t\tmergeTrees(basisTree, customTree) :\n\t\t\t\t\tcustomTree :\n\t\t\t\tbasisTree;\n\t\t\n\t\tthis.#parse(this.tree);\n\t\t\n\t}\n\t\n\t#parse(list) {\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, source) {\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 (!target[abilityId])\n\t\t\t\t\t\ttarget[abilityId] = Object.deepClone(ability);\n\t\t\t\t\telse if (schema.params)\n\t\t\t\t\t\tfor (const param of schema.params)\n\t\t\t\t\t\t\tif (param.isInheritable !== false && ability[param._id] !== undefined)\n\t\t\t\t\t\t\t\tif (!target[abilityId][param._id])\n\t\t\t\t\t\t\t\t\ttarget[abilityId][param._id] = Object.deepClone(ability[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 (target[abilityId][param._id] < ability[param._id])\n\t\t\t\t\t\t\t\t\t\t\ttarget[abilityId][param._id] = ability[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 = target[abilityId][param._id];\n\t\t\t\t\t\t\t\t\t\tfor (const itemId of ability[param._id])\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\n\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) {\n\t\tconst schema = this.get(_id);\n\t\tif (schema.params) {\n\t\t\tconst 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, schema) => {\n\t\t\tif (schema.params) {\n\t\t\t\tconst 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.ids();\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] = true;\n\t\t\t\n\t\t\treturn abilities;\n\t\t}, {});\n\t}\n\t\n\tgetSchemeFor(user) {\n\t\treturn (function resolve(abilities) {\n\t\t\tfor (let i = 0; i < abilities.length; i++) {\n\t\t\t\tconst schema = abilities[i];\n\t\t\t\tconst userAbility = user.abilities[schema._id];\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[param._id];\n\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\tif (param.max !== undefined)\n\t\t\t\t\t\t\t\t\tparam.max = userParam;\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.includes(param.items[j]._id))\n\t\t\t\t\t\t\t\t\t\tparam.items.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);\n\t\t\t\t} else\n\t\t\t\t\tabilities.splice(i--, 1);\n\t\t\t}\n\t\t\t\n\t\t\treturn abilities;\n\t\t})(Object.deepClone(this.tree));\n\t}\n\t\n}\n", "import { debounce } from \"@nesvet/n\";\nimport { ObjectId } from \"insite-db\";\nimport { Org } from \"./Org\";\nimport { basisSchema } from \"./schema\";\n\n\nconst indexes = [\n\t[ { owners: 1 } ]\n];\n\nfunction sortOrgs(a, b) {\n\treturn (\n\t\t(b.slaveOrgs.size - a.slaveOrgs.size) || (\n\t\t\ta.title > b.title ?\n\t\t\t\t1 :\n\t\t\t\ta.title < b.title ?\n\t\t\t\t\t-1 :\n\t\t\t\t\t0\n\t\t)\n\t);\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 extends Map {\n\tconstructor(users, options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes,\n\t\t\tnull: nullProps\n\t\t} = options;\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tif (customSchema) {\n\t\t\tcustomSchema.required?.removeAll(basisSchema.required);\n\t\t\tif (customSchema.properties)\n\t\t\t\tObject.delete(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, ...customSchema?.required ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"orgs\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tthis.collection.deleteOne =\n\t\t\t\tthis.collection.deleteMany =\n\t\t\t\t\tpreventDirectDelete;\n\t\t\t\n\t\t\tthis.null = new Org(this, {\n\t\t\t\t...nullProps,\n\t\t\t\t_id: null,\n\t\t\t\ttitle: \"\",\n\t\t\t\tdisplayLabel: \"\",\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\tthis.null.ownerIds = new Array.Empty();\n\t\t\tthis.null.ownerOrgs = new Set.Empty();\n\t\t\tthis.null.ownerUsers = new Set.Empty();\n\t\t\tthis.null.slaveOrgs = new Set.Empty();\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tload(orgDoc) {\n\t\tnew Org(this, orgDoc);\n\t\t\n\t}\n\t\n\tstatic resolve(org, slaveOrgs) {\n\t\tslaveOrgs = [ org, ...slaveOrgs ];\n\t\t\n\t\tfor (const ownerOrg of org.ownerOrgs) {\n\t\t\tOrgs.resolve(ownerOrg, slaveOrgs);\n\t\t\townerOrg.slaveOrgs.addAll(slaveOrgs);\n\t\t}\n\t\t\n\t}\n\t\n\tsorted = [];\n\t\n\tasync update() {\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\tOrgs.resolve(org, []);\n\t\t\n\t\tsorted.sort(sortOrgs);\n\t\tfor (const org of array)\n\t\t\torg.slaveOrgs.sort(sortOrgs);\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst org = sorted[i];\n\t\t\tfor (const slaveOrg of [ ...org.slaveOrgs ].reverse())\n\t\t\t\tif (slaveOrg.ownerOrgs.has(org)) {\n\t\t\t\t\tconst slaveOrgIndex = sorted.indexOf(slaveOrg);\n\t\t\t\t\tif (~slaveOrgIndex) {\n\t\t\t\t\t\tsorted.splice(slaveOrgIndex, 1);\n\t\t\t\t\t\ti--;\n\t\t\t\t\t}\n\t\t\t\t\tsorted.splice(i + 1, 0, slaveOrg);\n\t\t\t\t}\n\t\t}\n\t\tfor (let o = 0, { length } = sorted; o < length;)\n\t\t\tsorted[o]._o = o++;\n\t\t\n\t\tthis.sorted = sorted;\n\t\t\n\t\tthis.users.emit(\"orgs-update\");\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.users.updateDebounced.clear();\n\t\t\tthis.users.update();\n\t\t}\n\t\t\n\t}\n\t\n\tupdateDebounced = debounce(this.update, 250);\n\t\n\tinitialLoad = async () => {\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.initialLoad;\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(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 \"update\":\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id).update(next.updateDescription?.updatedFields || next.fullDocument, 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 }, ownerId) {\n\t\treturn this.collection.insertOne({\n\t\t\t_id: (new ObjectId()).toString(),\n\t\t\ttitle,\n\t\t\tnote: note || \"\",\n\t\t\towners: ownerId ? [ ownerId ] : [],\n\t\t\t...Object.delete(restProps, \"_id\", \"owners\"),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(org) {\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();\n\t\n\treplaceHandlers = new Set();\n\t\n\tasync replace(fromId) {\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", "const snapshots = new Map();\n\n\nexport class Org {\n\tconstructor(orgs, 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#orgs;\n\t\n\tisOrg = true;\n\t\n\townerOrgs = new Set();\n\townerUsers = new Set();\n\t\n\tusers = new Set();\n\t\n\tslaveOrgs = new Set();\n\t\n\tupdate({ _id, title, owners: ownerIds, ...restProps }, next) {\n\t\t\n\t\tconst orgs = this.#orgs;\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 (orgs.users.isInited)\n\t\t\t\t\torgs.updateDebounced();\n\t\t\t\t\n\t\t\t\torgs.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\tconst orgs = this.#orgs;\n\t\t\n\t\torgs.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\torgs.replace(this._id);\n\t\t\n\t\torgs.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "export const regexps = {\n\t_id: /^[a-fA-F\\d]{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+\\$[a-zA-Z\\d+/]+\\$[a-zA-Z\\d+/]+$/,\n\tsessionId: /^[a-fA-F\\d]{16,32}\\$[a-fA-F\\d]{16,32}$/,\n\trole: /^[a-z\\d\\-_]{1,64}$/,\n\tip: /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/\n};\n\nfor (const key in regexps)\n\tregexps[key].pattern = regexps[key].toString().slice(1, -1);\n", "import { regexps } from \"../lib\";\n\n\nexport const basisSchema = {\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.pattern\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.pattern\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 { debounce } from \"@nesvet/n\";\nimport { Role } from \"./Role\";\nimport { basisSchema } from \"./schema\";\n\n\nconst indexes = [\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\nfunction sortRoles(a, b) {\n\treturn (\n\t\t(b.involves.size - a.involves.size) || (\n\t\t\t(a.title && b.title) ?\n\t\t\t\ta.title > b.title ? 1 : a.title < b.title ? -1 : 0 :\n\t\t\t\ta.title ?\n\t\t\t\t\t-1 :\n\t\t\t\t\tb.title ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta._id > b._id ?\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\t-1 :\n\t\t\t\t\t\t\t\t0\n\t\t\t\n\t\t)\n\t);\n}\n\n\nexport class Roles extends Map {\n\tconstructor(users, options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes,\n\t\t\troot: rootProps\n\t\t} = options;\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\tthis.abilities = users.abilities;\n\t\t\n\t\tthis.root = new Role(this, {\n\t\t\t...rootProps,\n\t\t\t_id: \"root\",\n\t\t\tinvolves: [],\n\t\t\tabilities: this.abilities.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\tif (customSchema) {\n\t\t\tcustomSchema.required?.removeAll(basisSchema.required);\n\t\t\tif (customSchema.properties)\n\t\t\t\tObject.delete(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, ...customSchema?.required ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"roles\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tthis.collection.deleteOne =\n\t\t\t\tthis.collection.deleteMany =\n\t\t\t\t\tpreventDirectDelete;\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tload(roleDoc) {\n\t\tnew Role(this, roleDoc);\n\t\t\n\t}\n\t\n\tresolve(role, involvedBy) {\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\tinvolvedByRole.involves.reAdd(involvedRole);\n\t\t\t\t\tthis.abilities.merge(involvedByRole.inheritedAbilities, involvedRole.abilities);\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 = [];\n\t\n\tasync update() {\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 = Object.deepClone(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 = this.getAll(role.ownInvolveIds).sort(sortRoles).reverse();\n\t\t\n\t\tconst sorted = [ this.root ];\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst role = sorted[i];\n\t\t\tfor (const involvedRole of role.ownInvolves) {\n\t\t\t\tconst involvedRoleIndex = sorted.indexOf(involvedRole);\n\t\t\t\tif (~involvedRoleIndex) {\n\t\t\t\t\tsorted.splice(involvedRoleIndex, 1);\n\t\t\t\t\ti--;\n\t\t\t\t}\n\t\t\t\tsorted.splice(i + 1, 0, involvedRole);\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet _o = 0;\n\t\tfor (const role of sorted) {\n\t\t\tthis.abilities.merge(role.abilities, role.inheritedAbilities);\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\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(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\tcase \"update\":\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id).update(next.updateDescription?.updatedFields || next.fullDocument, 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.init;\n\t\t\n\t};\n\t\n\tnew({ _id, involves, title, description, ...restProps }) {\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...Object.delete(restProps, \"abilities\"),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(role) {\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) {\n\t\tconst roles = this.sorted.intersection(this.getAll(ids));\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", "const snapshots = new Map();\n\n\nexport class Role {\n\tconstructor(roles, roleDoc) {\n\t\tthis.#roles = roles;\n\t\t\n\t\tthis._id = roleDoc._id;\n\t\troles.set(this._id, this);\n\t\t\n\t\tthis.update(roleDoc);\n\t\t\n\t}\n\t\n\t#roles;\n\t\n\townInvolves = [];\n\tinvolves = new Set();\n\tabilities = {};\n\tinheritedAbilities = {};\n\t\n\tupdate({ _id, involves: ownInvolveIds, abilities: ownAbilities, title, ...restProps }, next) {\n\t\t\n\t\tconst roles = this.#roles;\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;\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 (roles.users.isInited)\n\t\t\t\t\troles.updateDebounced();\n\t\t\t\t\n\t\t\t\troles.users.emit(\"roles-role-update\", next);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tconst roles = this.#roles;\n\t\t\n\t\troles.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\troles.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "import { regexps } from \"../lib\";\n\n\nexport const basisSchema = {\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.pattern,\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.pattern,\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 { random } from \"@nesvet/n\";\nimport { basisSchema } from \"./schema\";\nimport { Session } from \"./Session\";\n\n\nconst expireAfterSeconds = 3600 * 24 * 7;\n\nconst indexes = [\n\t[ { user: 1 } ],\n\t[ { expiresAt: 1 }, { expireAfterSeconds } ]\n];\n\n\nexport class Sessions extends Map {\n\tconstructor(users, options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes\n\t\t} = options;\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tif (customSchema) {\n\t\t\tcustomSchema.required?.removeAll(basisSchema.required);\n\t\t\tif (customSchema.properties)\n\t\t\t\tObject.delete(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, ...customSchema?.required ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"sessions\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.expireAfterSeconds = expireAfterSeconds;\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tawait this.collection.updateMany({ isOnline: true }, { $set: { isOnline: false } });\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tisInited = false;\n\t\n\tmakeId() {\n\t\treturn `${crypto.randomBytes(random(8, 16)).toString(\"hex\")}$${crypto.randomBytes(random(8, 16)).toString(\"hex\")}`;\n\t}\n\t\n\tload(sessionDoc) {\n\t\tnew Session(this, sessionDoc);\n\t\t\n\t}\n\t\n\tinit = async () => {\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(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 \"update\":\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription?.updatedFields || next.fullDocument);\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.init;\n\t\t\n\t};\n\t\n\tasync new(user, props) {\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tconst sessionDoc = {\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(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 { regexps } from \"../lib\";\n\n\nexport const basisSchema = {\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.pattern\n\t\t},\n\t\tuser: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.pattern\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.pattern\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", "export class Session {\n\tconstructor(sessions, sessionDoc) {\n\t\tthis.#sessions = sessions;\n\t\t\n\t\tthis._id = sessionDoc._id;\n\t\tsessions.set(this._id, this);\n\t\t\n\t\tthis.user = sessions.users.get(sessionDoc.user);\n\t\tthis.user.sessions.add(this);\n\t\t\n\t\tsessions.users.bySessionId.set(this._id, this.user);\n\t\t\n\t\tthis.update(sessionDoc);\n\t\t\n\t}\n\t\n\t#sessions;\n\t\n\tupdate({ _id, user, isOnline, ...restProps }) {\n\t\t\n\t\tconst sessions = this.#sessions;\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 (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 }) {\n\t\t\n\t\tconst sessions = this.#sessions;\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tupdates.prolongedAt = ts;\n\t\tupdates.expiresAt = new Date(ts + (sessions.collection.expireAfterSeconds * 1000));\n\t\t\n\t\tthis.update(updates);\n\t\t\n\t\treturn 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\tconst sessions = this.#sessions;\n\t\t\n\t\tsessions.delete(this._id);\n\t\tthis.user.sessions.delete(this);\n\t\tsessions.users.bySessionId.delete(this._id);\n\t\t\n\t\tsessions.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 { regexps } from \"../../lib\";\n\n\nexport const schema = {\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.pattern\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 { schema as jsonSchema } from \"./schema\";\n\n\nexport class Avatars {\n\tconstructor(users, options = {}) {\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"users.avatars\", { jsonSchema });\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n}\n", "import { regexps } from \"../lib\";\n\n\nexport const basisSchema = {\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.pattern\n\t\t},\n\t\temail: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.email.pattern\n\t\t},\n\t\tpassword: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.argon2.pattern\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.pattern\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.pattern\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 { debounce } from \"@nesvet/n\";\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 {\n\tconstructor(users, 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#users;\n\t\n\tisUser = true;\n\t\n\troles = new Set();\n\tslaveRoles = new Set();\n\tslaveRoleIds = [];\n\tabilities = {};\n\t\n\tslaveOrgs = new Set();\n\tslaveUsers = new Set();\n\tslaves = new Set();\n\t\n\tslaveIds = [];\n\tpermissiveIds = [];\n\t\n\tsessions = new Set();\n\t\n\tisOnline = false;\n\t\n\tupdate({ _id, name, email, roles: ownRoleIds, org: orgId, avatar, ...restProps }) {\n\t\t\n\t\tconst users = this.#users;\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\tusers.byEmail.delete(this.email);\n\t\t\tthis.email = email;\n\t\t\tusers.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 = `${name.first} ${name.last}`.trim() || 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 = users.orgs.get(orgId) || 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\tusers.isSortRequired = true;\n\t\t\t\n\t\t\tif (users.isInited)\n\t\t\t\tusers.updateDebounced();\n\t\t\t\n\t\t} else if (isLastNameUpdated)\n\t\t\tusers.sortDebounced();\n\t\t\n\t}\n\t\n\tupdateRoles() {\n\t\t\n\t\tconst users = this.#users;\n\t\t\n\t\tif (users.isInited) {\n\t\t\tthis.ownRoles = [];\n\t\t\tthis.roles.clear();\n\t\t\tthis.slaveRoles.clear();\n\t\t\tObject.clear(this.abilities);\n\t\t\t\n\t\t\tfor (const roleId of this.ownRoleIds) {\n\t\t\t\tconst role = users.roles.get(roleId);\n\t\t\t\t\n\t\t\t\tthis.ownRoles.push(role);\n\t\t\t\tthis.roles.add(role);\n\t\t\t\tfor (const involvedRole of role.involves) {\n\t\t\t\t\tthis.roles.add(involvedRole);\n\t\t\t\t\tthis.slaveRoles.add(involvedRole);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.slaveRoleIds = this.slaveRoles.ids();\n\t\t\t\t\n\t\t\t\tusers.abilities.merge(this.abilities, role.abilities);\n\t\t\t}\n\t\t\t\n\t\t\tif (this.roles.has(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\tconst users = this.#users;\n\t\t\n\t\tif (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();\n\t\t\t\n\t\t\tfor (const org of 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, users.orgs.null ]))\n\t\t\t\tfor (const user of org.users)\n\t\t\t\t\tif (user !== this && (this.slaveRoles.hasAny(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\tusers.emit(\"user-permissions-change\", this);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\ttrimSessions() {\n\t\t\n\t\tconst sessionsLimit = this.abilities.login?.sessionsLimit ?? 0;\n\t\t\n\t\tif (this.sessions.size > sessionsLimit)\n\t\t\treturn this.#users.sessions.collection.deleteMany({ _id: { $in: [ ...this.sessions ].sort((a, b) => a.expiresAt - b.expiresAt).slice(0, this.sessions.size - sessionsLimit).ids() } });\n\t\t\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\tconst users = this.#users;\n\t\t\n\t\tthis.org.users.delete(this);\n\t\t\n\t\tusers.delete(this._id);\n\t\tusers.byEmail.delete(this.email);\n\t\tusers.sorted.remove(this);\n\t\t\n\t\trolesSnapshots.delete(this._id);\n\t\tpermissionsSnapshots.delete(this._id);\n\t\t\n\t\tusers.replace(this._id);\n\t\t\n\t\tusers.updateDebounced();\n\t\t\n\t}\n\t\n}\n"],
5
- "mappings": "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",
6
- "names": ["debounce", "argon2", "EventEmitter", "ObjectId", "basisTree", "mergeTrees", "target", "source", "sourceItem", "targetItem", "_id", "key", "sourceItemField", "Abilities", "options", "customTree", "basis", "basisTree", "#parse", "list", "ability", "abilityId", "schema", "param", "targetItems", "itemId", "abilities", "user", "resolve", "userAbility", "userParam", "j", "debounce", "ObjectId", "snapshots", "Org", "orgs", "orgDoc", "#orgs", "_id", "title", "ownerIds", "restProps", "next", "snapshot", "regexps", "key", "basisSchema", "regexps", "indexes", "sortOrgs", "a", "b", "preventDirectDelete", "Orgs", "_Orgs", "users", "options", "customSchema", "customIndexes", "nullProps", "basisSchema", "jsonSchema", "Org", "orgDoc", "org", "slaveOrgs", "ownerOrg", "array", "sorted", "ownerId", "ownerUser", "anotherOrg", "i", "slaveOrg", "slaveOrgIndex", "o", "length", "debounce", "next", "title", "note", "restProps", "ObjectId", "_id", "fromId", "toId", "handler", "debounce", "snapshots", "Role", "roles", "roleDoc", "#roles", "_id", "ownInvolveIds", "ownAbilities", "title", "restProps", "next", "snapshot", "basisSchema", "regexps", "indexes", "preventDirectDelete", "sortRoles", "a", "b", "Roles", "users", "options", "customSchema", "customIndexes", "rootProps", "Role", "basisSchema", "jsonSchema", "roleDoc", "role", "involvedBy", "involvedRoleId", "involvedRole", "involvedByRole", "array", "anotherRole", "sorted", "involvedRoleIndex", "_o", "debounce", "next", "_id", "involves", "title", "description", "restProps", "ids", "roles", "cleanedUpIds", "crypto", "random", "basisSchema", "regexps", "Session", "sessions", "sessionDoc", "#sessions", "_id", "user", "isOnline", "restProps", "updates", "ts", "expireAfterSeconds", "indexes", "Sessions", "users", "options", "customSchema", "customIndexes", "basisSchema", "jsonSchema", "crypto", "random", "sessionDoc", "Session", "next", "user", "props", "ts", "session", "schema", "regexps", "Avatars", "users", "options", "schema", "basisSchema", "regexps", "debounce", "rolesSnapshots", "permissionsSnapshots", "staticUrl", "User", "users", "userDoc", "#users", "_id", "name", "email", "ownRoleIds", "orgId", "avatar", "restProps", "isEmailUpdated", "isNameUpdated", "isLastNameUpdated", "isRolesUpdated", "snapshot", "isOrgUpdated", "roleId", "role", "involvedRole", "slaveIds", "org", "slaveOrg", "user", "permissiveOrgIds", "sessionsLimit", "a", "b", "isOnline", "session", "indexes", "sortUsersAndOrgs", "a", "b", "Users", "collections", "customIndexes", "customSchema", "initialRootProps", "abilitiesOptions", "rolesOptions", "orgsOptions", "sessionsOptions", "avatarsOptions", "eventEmitter", "EventEmitter", "key", "Abilities", "basisSchema", "jsonSchema", "Roles", "Orgs", "Sessions", "Avatars", "userDoc", "User", "debounce", "shouldUpdateRoles", "user", "next", "email", "password", "roles", "name", "org", "job", "restProps", "ObjectId", "argon2", "_id", "newPassword", "sessionProps", "session", "ids", "fromId", "toId", "handler"]
4
+ "sourcesContent": ["import \"@nesvet/deprecated-extensions/server\";\n\n\nexport * from \"./users\";\n", "import { debounce } from \"@nesvet/n\";\nimport { hash, verify } from \"argon2\";\nimport EventEmitter from \"eventemitter3\";\nimport { ObjectId } from \"insite-db\";\nimport { Abilities } from \"../abilities\";\nimport { Orgs } from \"../orgs\";\nimport { Roles } from \"../roles\";\nimport { Sessions } from \"../sessions\";\nimport { Avatars } from \"./avatars\";\nimport { basisSchema } from \"./schema\";\nimport { User } from \"./User\";\n\n\nconst indexes = [\n\t[ { email: 1 }, { unique: true } ],\n\t[ { org: 1 } ]\n];\n\nfunction sortUsersAndOrgs(a, b) {\n\treturn (\n\t\t(a.isUser && b.isUser) ?\n\t\t\t(a.name.last && b.name.last) ?\n\t\t\t\ta.name.last > b.name.last ?\n\t\t\t\t\t1 :\n\t\t\t\t\ta.name.last < b.name.last ? -1 : 0 :\n\t\t\t (!a.name.last && !b.name.last) ?\n\t\t\t\t\ta.displayLabel > b.displayLabel ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta.displayLabel < b.displayLabel ? -1 : 0 :\n\t\t\t a.name.last ? -1 : 1 :\n\t\t (a.isOrg && b.isOrg) ?\n\t\t\t\ta.title > b.title ?\n\t\t\t\t\t1 :\n\t\t\t\t\ta.title < b.title ? -1 : 0 :\n\t\t a.isOrg ? -1 : 1\n\t);\n}\n\n\nexport class Users extends Map {\n\tconstructor({\n\t\tcollections,\n\t\tindexes: customIndexes,\n\t\tschema: customSchema,\n\t\tinitialRoot: initialRootProps,\n\t\tabilities: abilitiesOptions,\n\t\troles: rolesOptions,\n\t\torgs: orgsOptions,\n\t\tsessions: sessionsOptions,\n\t\tavatars: avatarsOptions\n\t}) {\n\t\tsuper();\n\t\t\n\t\tconst eventEmitter = new EventEmitter();\n\t\tfor (const key of Object.keys(eventEmitter))\n\t\t\tthis[key] = eventEmitter[key];\n\t\t\n\t\tthis.collections = collections;\n\t\t\n\t\tthis.abilities = new Abilities(abilitiesOptions);\n\t\t\n\t\tif (customSchema) {\n\t\t\tcustomSchema.required?.removeAll(basisSchema.required);\n\t\t\tif (customSchema.properties)\n\t\t\t\tObject.delete(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, ...customSchema?.required ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"users\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tif (!await this.collection.countDocuments({ roles: \"root\" }))\n\t\t\t\tawait this.new({\n\t\t\t\t\temail: process.env.INSITE_ROOT_EMAIL ?? \"insite@root.email\",\n\t\t\t\t\tpassword: process.env.INSITE_ROOT_PASSWORD ?? \"inSiteRootPassword\",\n\t\t\t\t\troles: [ \"root\" ],\n\t\t\t\t\tname: { first: \"Root\" },\n\t\t\t\t\torg: null,\n\t\t\t\t\tjob: \"Root\",\n\t\t\t\t\t...Object.delete(initialRootProps, \"roles\", \"org\")\n\t\t\t\t});\n\t\t\t\n\t\t\tthis.roles = await new Roles(this, rolesOptions);\n\t\t\tthis.orgs = await new Orgs(this, orgsOptions);\n\t\t\tthis.sessions = await new Sessions(this, sessionsOptions);\n\t\t\tthis.avatars = await new Avatars(this, avatarsOptions);\n\t\t\t\n\t\t\tawait this.roles.init();\n\t\t\t\n\t\t\tawait this.orgs.initialLoad();\n\t\t\tawait this.initialLoad();\n\t\t\t\n\t\t\tawait this.orgs.init();\n\t\t\tawait this.init();\n\t\t\t\n\t\t\tawait this.sessions.init();\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tisInited = false;\n\t\n\tbyEmail = new Map();\n\tbySessionId = new Map();\n\tsorted = [];\n\t\n\tisSortRequired = false;\n\t\n\tload(userDoc) {\n\t\tnew User(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) {\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\tinitialLoad = async () => {\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.initialLoad;\n\t\t\n\t};\n\t\n\tinit = () => {\n\t\t\n\t\tthis.isInited = true;\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(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\tdelete this.init;\n\t\t\n\t};\n\t\n\tasync new({ email, password, roles, name, org, job, ...restProps }) {\n\t\tif (this.byEmail.has(email))\n\t\t\tthrow new Error(\"User exists\");\n\t\telse\n\t\t\tawait this.collection.insertOne({\n\t\t\t\t_id: (new ObjectId()).toString(),\n\t\t\t\temail,\n\t\t\t\tpassword: await hash(password),\n\t\t\t\troles: this.isInited ? this.roles.cleanUpIds(roles) : roles,\n\t\t\t\tname: {\n\t\t\t\t\tfirst: name.first ?? \"\",\n\t\t\t\t\tmiddle: name.middle ?? \"\",\n\t\t\t\t\tlast: name.last ?? \"\"\n\t\t\t\t},\n\t\t\t\torg: org ?? null,\n\t\t\t\tjob: job ?? \"\",\n\t\t\t\t...Object.delete(restProps, \"_id\"),\n\t\t\t\tcreatedAt: Date.now()\n\t\t\t});\n\t\t\n\t\treturn true;\n\t}\n\t\n\tasync changePassword(_id, newPassword) {\n\t\tif (!this.has(_id))\n\t\t\tthrow new Error(\"usernotfound\");\n\t\telse if (!newPassword)\n\t\t\tthrow new Error(\"emptypasswordisnotallowed\");\n\t\telse\n\t\t\tawait Promise.all([\n\t\t\t\tthis.collection.updateOne({ _id }, { $set: { password: await hash(newPassword) } }),\n\t\t\t\tthis.sessions.collection.deleteMany({ user: _id })\n\t\t\t]);\n\t\t\n\t}\n\t\n\tasync login(email, password, sessionProps) {\n\t\tconst user = this.byEmail.get(email);\n\t\t\n\t\tif (!user)\n\t\t\tthrow new Error(\"usernotfound\");\n\t\telse if (!await verify(user.password, password))\n\t\t\tthrow new Error(\"incorrectpassword\");\n\t\telse if (!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) {\n\t\tsession.delete();\n\t\t\n\t\treturn this.sessions.collection.deleteOne({ _id: session._id });\n\t}\n\t\n\tsortIds(ids) {\n\t\treturn ids\n\t\t\t.map(_id => this.get(_id) || this.orgs.get(_id))\n\t\t\t.filter(Boolean)\n\t\t\t.sort(sortUsersAndOrgs)\n\t\t\t.ids();\n\t}\n\t\n\treplaceMap = new Map();\n\t\n\treplaceHandlers = new Set();\n\t\n\tasync replace(fromId) {\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", "export const basisTree = [\n\t{\n\t\t_id: \"login\",\n\t\ttitle: \"\u0412\u0445\u043E\u0434 \u0432 \u0441\u0438\u0441\u0442\u0435\u043C\u0443\",\n\t\tparams: [\n\t\t\t{\n\t\t\t\t_id: \"sessionsLimit\",\n\t\t\t\ttitle: \"\u041B\u0438\u043C\u0438\u0442 \u0430\u043A\u0442\u0438\u0432\u043D\u044B\u0445 \u0441\u0435\u0441\u0441\u0438\u0439\",\n\t\t\t\ttype: \"number\",\n\t\t\t\tmin: 1,\n\t\t\t\tmax: 128\n\t\t\t},\n\t\t\t{\n\t\t\t\t_id: \"sections\",\n\t\t\t\ttitle: \"\u0414\u043E\u0441\u0442\u0443\u043F\u043D\u044B\u0435 \u0440\u0430\u0437\u0434\u0435\u043B\u044B\",\n\t\t\t\ttype: \"items\",\n\t\t\t\titems: [\n\t\t\t\t\t{\n\t\t\t\t\t\t_id: \"users\",\n\t\t\t\t\t\ttitle: \"\u041F\u043E\u043B\u044C\u0437\u043E\u0432\u0430\u0442\u0435\u043B\u0438\"\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t}\n\t\t]\n\t}\n];\n", "import { basisTree } from \"./tree\";\n\n\nfunction mergeTrees(target, source) {\n\tfor (const sourceItem of source) {\n\t\tconst targetItem = target.find(({ _id }) => _id === sourceItem._id);\n\t\tif (targetItem) {\n\t\t\tfor (const key in sourceItem)\n\t\t\t\tif (key !== \"_id\") {\n\t\t\t\t\tconst sourceItemField = sourceItem[key];\n\t\t\t\t\tif (Array.isArray(sourceItemField))\n\t\t\t\t\t\tmergeTrees(targetItem[key] ??= [], sourceItemField);\n\t\t\t\t\telse\n\t\t\t\t\t\ttargetItem[key] = sourceItemField;\n\t\t\t\t}\n\t\t} else\n\t\t\ttarget.push(sourceItem);\n\t}\n\t\n\treturn target;\n}\n\n\nexport class Abilities extends Map {\n\tconstructor(options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\ttree: customTree,\n\t\t\tbasis = true\n\t\t} = options;\n\t\t\n\t\tthis.tree =\n\t\t\tcustomTree ?\n\t\t\t\tbasis ?\n\t\t\t\t\tmergeTrees(basisTree, customTree) :\n\t\t\t\t\tcustomTree :\n\t\t\t\tbasisTree;\n\t\t\n\t\tthis.#parse(this.tree);\n\t\t\n\t}\n\t\n\t#parse(list) {\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, source) {\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 (!target[abilityId])\n\t\t\t\t\t\ttarget[abilityId] = Object.deepClone(ability);\n\t\t\t\t\telse if (schema.params)\n\t\t\t\t\t\tfor (const param of schema.params)\n\t\t\t\t\t\t\tif (param.isInheritable !== false && ability[param._id] !== undefined)\n\t\t\t\t\t\t\t\tif (!target[abilityId][param._id])\n\t\t\t\t\t\t\t\t\ttarget[abilityId][param._id] = Object.deepClone(ability[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 (target[abilityId][param._id] < ability[param._id])\n\t\t\t\t\t\t\t\t\t\t\ttarget[abilityId][param._id] = ability[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 = target[abilityId][param._id];\n\t\t\t\t\t\t\t\t\t\tfor (const itemId of ability[param._id])\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\n\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) {\n\t\tconst schema = this.get(_id);\n\t\tif (schema.params) {\n\t\t\tconst 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, schema) => {\n\t\t\tif (schema.params) {\n\t\t\t\tconst 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.ids();\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] = true;\n\t\t\t\n\t\t\treturn abilities;\n\t\t}, {});\n\t}\n\t\n\tgetSchemeFor(user) {\n\t\treturn (function resolve(abilities) {\n\t\t\tfor (let i = 0; i < abilities.length; i++) {\n\t\t\t\tconst schema = abilities[i];\n\t\t\t\tconst userAbility = user.abilities[schema._id];\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[param._id];\n\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\tif (param.max !== undefined)\n\t\t\t\t\t\t\t\t\tparam.max = userParam;\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.includes(param.items[j]._id))\n\t\t\t\t\t\t\t\t\t\tparam.items.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);\n\t\t\t\t} else\n\t\t\t\t\tabilities.splice(i--, 1);\n\t\t\t}\n\t\t\t\n\t\t\treturn abilities;\n\t\t})(Object.deepClone(this.tree));\n\t}\n\t\n}\n", "import { debounce } from \"@nesvet/n\";\nimport { ObjectId } from \"insite-db\";\nimport { Org } from \"./Org\";\nimport { basisSchema } from \"./schema\";\n\n\nconst indexes = [\n\t[ { owners: 1 } ]\n];\n\nfunction sortOrgs(a, b) {\n\treturn (\n\t\t(b.slaveOrgs.size - a.slaveOrgs.size) || (\n\t\t\ta.title > b.title ?\n\t\t\t\t1 :\n\t\t\t\ta.title < b.title ?\n\t\t\t\t\t-1 :\n\t\t\t\t\t0\n\t\t)\n\t);\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 extends Map {\n\tconstructor(users, options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes,\n\t\t\tnull: nullProps\n\t\t} = options;\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tif (customSchema) {\n\t\t\tcustomSchema.required?.removeAll(basisSchema.required);\n\t\t\tif (customSchema.properties)\n\t\t\t\tObject.delete(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, ...customSchema?.required ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"orgs\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tthis.collection.deleteOne =\n\t\t\t\tthis.collection.deleteMany =\n\t\t\t\t\tpreventDirectDelete;\n\t\t\t\n\t\t\tthis.null = new Org(this, {\n\t\t\t\t...nullProps,\n\t\t\t\t_id: null,\n\t\t\t\ttitle: \"\",\n\t\t\t\tdisplayLabel: \"\",\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\tthis.null.ownerIds = new Array.Empty();\n\t\t\tthis.null.ownerOrgs = new Set.Empty();\n\t\t\tthis.null.ownerUsers = new Set.Empty();\n\t\t\tthis.null.slaveOrgs = new Set.Empty();\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tload(orgDoc) {\n\t\tnew Org(this, orgDoc);\n\t\t\n\t}\n\t\n\tstatic resolve(org, slaveOrgs) {\n\t\tslaveOrgs = [ org, ...slaveOrgs ];\n\t\t\n\t\tfor (const ownerOrg of org.ownerOrgs) {\n\t\t\tOrgs.resolve(ownerOrg, slaveOrgs);\n\t\t\townerOrg.slaveOrgs.addAll(slaveOrgs);\n\t\t}\n\t\t\n\t}\n\t\n\tsorted = [];\n\t\n\tasync update() {\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\tOrgs.resolve(org, []);\n\t\t\n\t\tsorted.sort(sortOrgs);\n\t\tfor (const org of array)\n\t\t\torg.slaveOrgs.sort(sortOrgs);\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst org = sorted[i];\n\t\t\tfor (const slaveOrg of [ ...org.slaveOrgs ].reverse())\n\t\t\t\tif (slaveOrg.ownerOrgs.has(org)) {\n\t\t\t\t\tconst slaveOrgIndex = sorted.indexOf(slaveOrg);\n\t\t\t\t\tif (~slaveOrgIndex) {\n\t\t\t\t\t\tsorted.splice(slaveOrgIndex, 1);\n\t\t\t\t\t\ti--;\n\t\t\t\t\t}\n\t\t\t\t\tsorted.splice(i + 1, 0, slaveOrg);\n\t\t\t\t}\n\t\t}\n\t\tfor (let o = 0, { length } = sorted; o < length;)\n\t\t\tsorted[o]._o = o++;\n\t\t\n\t\tthis.sorted = sorted;\n\t\t\n\t\tthis.users.emit(\"orgs-update\");\n\t\t\n\t\tif (this.users.isInited) {\n\t\t\tthis.users.updateDebounced.clear();\n\t\t\tthis.users.update();\n\t\t}\n\t\t\n\t}\n\t\n\tupdateDebounced = debounce(this.update, 250);\n\t\n\tinitialLoad = async () => {\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.initialLoad;\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(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 \"update\":\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id).update(next.updateDescription?.updatedFields || next.fullDocument, 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 }, ownerId) {\n\t\treturn this.collection.insertOne({\n\t\t\t_id: (new ObjectId()).toString(),\n\t\t\ttitle,\n\t\t\tnote: note || \"\",\n\t\t\towners: ownerId ? [ ownerId ] : [],\n\t\t\t...Object.delete(restProps, \"_id\", \"owners\"),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(org) {\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();\n\t\n\treplaceHandlers = new Set();\n\t\n\tasync replace(fromId) {\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", "const snapshots = new Map();\n\n\nexport class Org {\n\tconstructor(orgs, 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#orgs;\n\t\n\tisOrg = true;\n\t\n\townerOrgs = new Set();\n\townerUsers = new Set();\n\t\n\tusers = new Set();\n\t\n\tslaveOrgs = new Set();\n\t\n\tupdate({ _id, title, owners: ownerIds, ...restProps }, next) {\n\t\t\n\t\tconst orgs = this.#orgs;\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 (orgs.users.isInited)\n\t\t\t\t\torgs.updateDebounced();\n\t\t\t\t\n\t\t\t\torgs.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\tconst orgs = this.#orgs;\n\t\t\n\t\torgs.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\torgs.replace(this._id);\n\t\t\n\t\torgs.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "export const regexps = {\n\t_id: /^[a-fA-F\\d]{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+\\$[a-zA-Z\\d+/]+\\$[a-zA-Z\\d+/]+$/,\n\tsessionId: /^[a-fA-F\\d]{16,32}\\$[a-fA-F\\d]{16,32}$/,\n\trole: /^[a-z\\d\\-_]{1,64}$/,\n\tip: /^\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}$/\n};\n\nfor (const key in regexps)\n\tregexps[key].pattern = regexps[key].toString().slice(1, -1);\n", "import { regexps } from \"../lib\";\n\n\nexport const basisSchema = {\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.pattern\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.pattern\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 { debounce } from \"@nesvet/n\";\nimport { Role } from \"./Role\";\nimport { basisSchema } from \"./schema\";\n\n\nconst indexes = [\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\nfunction sortRoles(a, b) {\n\treturn (\n\t\t(b.involves.size - a.involves.size) || (\n\t\t\t(a.title && b.title) ?\n\t\t\t\ta.title > b.title ? 1 : a.title < b.title ? -1 : 0 :\n\t\t\t\ta.title ?\n\t\t\t\t\t-1 :\n\t\t\t\t\tb.title ?\n\t\t\t\t\t\t1 :\n\t\t\t\t\t\ta._id > b._id ?\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\t-1 :\n\t\t\t\t\t\t\t\t0\n\t\t\t\n\t\t)\n\t);\n}\n\n\nexport class Roles extends Map {\n\tconstructor(users, options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes,\n\t\t\troot: rootProps\n\t\t} = options;\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\tthis.abilities = users.abilities;\n\t\t\n\t\tthis.root = new Role(this, {\n\t\t\t...rootProps,\n\t\t\t_id: \"root\",\n\t\t\tinvolves: [],\n\t\t\tabilities: this.abilities.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\tif (customSchema) {\n\t\t\tcustomSchema.required?.removeAll(basisSchema.required);\n\t\t\tif (customSchema.properties)\n\t\t\t\tObject.delete(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, ...customSchema?.required ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"roles\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tthis.collection.deleteOne =\n\t\t\t\tthis.collection.deleteMany =\n\t\t\t\t\tpreventDirectDelete;\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tload(roleDoc) {\n\t\tnew Role(this, roleDoc);\n\t\t\n\t}\n\t\n\tresolve(role, involvedBy) {\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\tinvolvedByRole.involves.reAdd(involvedRole);\n\t\t\t\t\tthis.abilities.merge(involvedByRole.inheritedAbilities, involvedRole.abilities);\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 = [];\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 = Object.deepClone(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 = this.getAll(role.ownInvolveIds).sort(sortRoles).reverse();\n\t\t\n\t\tconst sorted = [ this.root ];\n\t\t\n\t\tfor (let i = 0; i < sorted.length; i++) {\n\t\t\tconst role = sorted[i];\n\t\t\tfor (const involvedRole of role.ownInvolves) {\n\t\t\t\tconst involvedRoleIndex = sorted.indexOf(involvedRole);\n\t\t\t\tif (~involvedRoleIndex) {\n\t\t\t\t\tsorted.splice(involvedRoleIndex, 1);\n\t\t\t\t\ti--;\n\t\t\t\t}\n\t\t\t\tsorted.splice(i + 1, 0, involvedRole);\n\t\t\t}\n\t\t}\n\t\t\n\t\tlet _o = 0;\n\t\tfor (const role of sorted) {\n\t\t\tthis.abilities.merge(role.abilities, role.inheritedAbilities);\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\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(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\tcase \"update\":\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id).update(next.updateDescription?.updatedFields || next.fullDocument, 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.init;\n\t\t\n\t};\n\t\n\tnew({ _id, involves, title, description, ...restProps }) {\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...Object.delete(restProps, \"abilities\"),\n\t\t\tcreatedAt: Date.now()\n\t\t});\n\t}\n\t\n\tcollectionDelete(role) {\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) {\n\t\tconst roles = this.sorted.intersection(this.getAll(ids));\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", "const snapshots = new Map();\n\n\nexport class Role {\n\tconstructor(roles, roleDoc) {\n\t\tthis.#roles = roles;\n\t\t\n\t\tthis._id = roleDoc._id;\n\t\troles.set(this._id, this);\n\t\t\n\t\tthis.update(roleDoc);\n\t\t\n\t}\n\t\n\t#roles;\n\t\n\townInvolves = [];\n\tinvolves = new Set();\n\tabilities = {};\n\tinheritedAbilities = {};\n\t\n\tupdate({ _id, involves: ownInvolveIds, abilities: ownAbilities, title, ...restProps }, next) {\n\t\t\n\t\tconst roles = this.#roles;\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;\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 (roles.users.isInited)\n\t\t\t\t\troles.updateDebounced();\n\t\t\t\t\n\t\t\t\troles.users.emit(\"roles-role-update\", next);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\tdelete() {\n\t\t\n\t\tconst roles = this.#roles;\n\t\t\n\t\troles.delete(this._id);\n\t\t\n\t\tsnapshots.delete(this._id);\n\t\t\n\t\troles.updateDebounced();\n\t\t\n\t}\n\t\n}\n", "import { regexps } from \"../lib\";\n\n\nexport const basisSchema = {\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.pattern,\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.pattern,\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 { random } from \"@nesvet/n\";\nimport { basisSchema } from \"./schema\";\nimport { Session } from \"./Session\";\n\n\nconst expireAfterSeconds = 3600 * 24 * 7;\n\nconst indexes = [\n\t[ { user: 1 } ],\n\t[ { expiresAt: 1 }, { expireAfterSeconds } ]\n];\n\n\nexport class Sessions extends Map {\n\tconstructor(users, options = {}) {\n\t\tsuper();\n\t\t\n\t\tconst {\n\t\t\tschema: customSchema,\n\t\t\tindexes: customIndexes\n\t\t} = options;\n\t\t\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\tif (customSchema) {\n\t\t\tcustomSchema.required?.removeAll(basisSchema.required);\n\t\t\tif (customSchema.properties)\n\t\t\t\tObject.delete(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, ...customSchema?.required ?? [] ],\n\t\t\tproperties: { ...basisSchema.properties, ...customSchema?.properties }\n\t\t};\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"sessions\", { jsonSchema });\n\t\t\t\n\t\t\tthis.collection.expireAfterSeconds = expireAfterSeconds;\n\t\t\t\n\t\t\tthis.collection.ensureIndexes([ ...indexes, ...customIndexes ?? [] ]);\n\t\t\t\n\t\t\tawait this.collection.updateMany({ isOnline: true }, { $set: { isOnline: false } });\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n\t\n\tisInited = false;\n\t\n\tmakeId() {\n\t\treturn `${crypto.randomBytes(random(8, 16)).toString(\"hex\")}$${crypto.randomBytes(random(8, 16)).toString(\"hex\")}`;\n\t}\n\t\n\tload(sessionDoc) {\n\t\tnew Session(this, sessionDoc);\n\t\t\n\t}\n\t\n\tinit = async () => {\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(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 \"update\":\n\t\t\t\tcase \"replace\":\n\t\t\t\t\tthis.get(next.documentKey._id)?.update(next.updateDescription?.updatedFields || next.fullDocument);\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.init;\n\t\t\n\t};\n\t\n\tasync new(user, props) {\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tconst sessionDoc = {\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(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 { regexps } from \"../lib\";\n\n\nexport const basisSchema = {\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.pattern\n\t\t},\n\t\tuser: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps._id.pattern\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.pattern\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", "export class Session {\n\tconstructor(sessions, sessionDoc) {\n\t\tthis.#sessions = sessions;\n\t\t\n\t\tthis._id = sessionDoc._id;\n\t\tsessions.set(this._id, this);\n\t\t\n\t\tthis.user = sessions.users.get(sessionDoc.user);\n\t\tthis.user.sessions.add(this);\n\t\t\n\t\tsessions.users.bySessionId.set(this._id, this.user);\n\t\t\n\t\tthis.update(sessionDoc);\n\t\t\n\t}\n\t\n\t#sessions;\n\t\n\tupdate({ _id, user, isOnline, ...restProps }) {\n\t\t\n\t\tconst sessions = this.#sessions;\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 (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 }) {\n\t\t\n\t\tconst sessions = this.#sessions;\n\t\t\n\t\tconst ts = Date.now();\n\t\t\n\t\tupdates.prolongedAt = ts;\n\t\tupdates.expiresAt = new Date(ts + (sessions.collection.expireAfterSeconds * 1000));\n\t\t\n\t\tthis.update(updates);\n\t\t\n\t\treturn 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\tconst sessions = this.#sessions;\n\t\t\n\t\tsessions.delete(this._id);\n\t\tthis.user.sessions.delete(this);\n\t\tsessions.users.bySessionId.delete(this._id);\n\t\t\n\t\tsessions.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 { regexps } from \"../../lib\";\n\n\nexport const schema = {\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.pattern\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 { schema as jsonSchema } from \"./schema\";\n\n\nexport class Avatars {\n\tconstructor(users, options = {}) {\n\t\tthis.users = users;\n\t\tthis.collections = users.collections;\n\t\t\n\t\treturn (async () => {\n\t\t\t\n\t\t\tthis.collection = await this.collections.ensure(\"users.avatars\", { jsonSchema });\n\t\t\t\n\t\t\treturn this;\n\t\t})();\n\t}\n}\n", "import { regexps } from \"../lib\";\n\n\nexport const basisSchema = {\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.pattern\n\t\t},\n\t\temail: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.email.pattern\n\t\t},\n\t\tpassword: {\n\t\t\tbsonType: \"string\",\n\t\t\tpattern: regexps.argon2.pattern\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.pattern\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.pattern\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 { debounce } from \"@nesvet/n\";\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 {\n\tconstructor(users, 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#users;\n\t\n\tisUser = true;\n\t\n\troles = new Set();\n\tslaveRoles = new Set();\n\tslaveRoleIds = [];\n\tabilities = {};\n\t\n\tslaveOrgs = new Set();\n\tslaveUsers = new Set();\n\tslaves = new Set();\n\t\n\tslaveIds = [];\n\tpermissiveIds = [];\n\t\n\tsessions = new Set();\n\t\n\tisOnline = false;\n\t\n\tupdate({ _id, name, email, roles: ownRoleIds, org: orgId, avatar, ...restProps }) {\n\t\t\n\t\tconst users = this.#users;\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\tusers.byEmail.delete(this.email);\n\t\t\tthis.email = email;\n\t\t\tusers.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 = `${name.first} ${name.last}`.trim() || 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 = users.orgs.get(orgId) || 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\tusers.isSortRequired = true;\n\t\t\t\n\t\t\tif (users.isInited)\n\t\t\t\tusers.updateDebounced();\n\t\t\t\n\t\t} else if (isLastNameUpdated)\n\t\t\tusers.sortDebounced();\n\t\t\n\t}\n\t\n\tupdateRoles() {\n\t\t\n\t\tconst users = this.#users;\n\t\t\n\t\tif (users.isInited) {\n\t\t\tthis.ownRoles = [];\n\t\t\tthis.roles.clear();\n\t\t\tthis.slaveRoles.clear();\n\t\t\tObject.clear(this.abilities);\n\t\t\t\n\t\t\tfor (const roleId of this.ownRoleIds) {\n\t\t\t\tconst role = users.roles.get(roleId);\n\t\t\t\t\n\t\t\t\tthis.ownRoles.push(role);\n\t\t\t\tthis.roles.add(role);\n\t\t\t\tfor (const involvedRole of role.involves) {\n\t\t\t\t\tthis.roles.add(involvedRole);\n\t\t\t\t\tthis.slaveRoles.add(involvedRole);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.slaveRoleIds = this.slaveRoles.ids();\n\t\t\t\t\n\t\t\t\tusers.abilities.merge(this.abilities, role.abilities);\n\t\t\t}\n\t\t\t\n\t\t\tif (this.roles.has(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\tconst users = this.#users;\n\t\t\n\t\tif (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();\n\t\t\t\n\t\t\tfor (const org of 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, users.orgs.null ]))\n\t\t\t\tfor (const user of org.users)\n\t\t\t\t\tif (user !== this && (this.slaveRoles.hasAny(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\tusers.emit(\"user-permissions-change\", this);\n\t\t\t}\n\t\t}\n\t\t\n\t}\n\t\n\ttrimSessions() {\n\t\t\n\t\tconst sessionsLimit = this.abilities.login?.sessionsLimit ?? 0;\n\t\t\n\t\tif (this.sessions.size > sessionsLimit)\n\t\t\treturn this.#users.sessions.collection.deleteMany({ _id: { $in: [ ...this.sessions ].sort((a, b) => a.expiresAt - b.expiresAt).slice(0, this.sessions.size - sessionsLimit).ids() } });\n\t\t\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\tconst users = this.#users;\n\t\t\n\t\tthis.org.users.delete(this);\n\t\t\n\t\tusers.delete(this._id);\n\t\tusers.byEmail.delete(this.email);\n\t\tusers.sorted.remove(this);\n\t\t\n\t\trolesSnapshots.delete(this._id);\n\t\tpermissionsSnapshots.delete(this._id);\n\t\t\n\t\tusers.replace(this._id);\n\t\t\n\t\tusers.updateDebounced();\n\t\t\n\t}\n\t\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["debounce", "hash", "verify", "EventEmitter", "ObjectId", "basisTree", "mergeTrees", "target", "source", "sourceItem", "targetItem", "_id", "key", "sourceItemField", "Abilities", "options", "customTree", "basis", "basisTree", "#parse", "list", "ability", "abilityId", "schema", "param", "targetItems", "itemId", "abilities", "user", "resolve", "userAbility", "userParam", "j", "debounce", "ObjectId", "snapshots", "Org", "orgs", "orgDoc", "#orgs", "_id", "title", "ownerIds", "restProps", "next", "snapshot", "regexps", "key", "basisSchema", "regexps", "indexes", "sortOrgs", "a", "b", "preventDirectDelete", "Orgs", "_Orgs", "users", "options", "customSchema", "customIndexes", "nullProps", "basisSchema", "jsonSchema", "Org", "orgDoc", "org", "slaveOrgs", "ownerOrg", "array", "sorted", "ownerId", "ownerUser", "anotherOrg", "i", "slaveOrg", "slaveOrgIndex", "o", "length", "debounce", "next", "title", "note", "restProps", "ObjectId", "_id", "fromId", "toId", "handler", "debounce", "snapshots", "Role", "roles", "roleDoc", "#roles", "_id", "ownInvolveIds", "ownAbilities", "title", "restProps", "next", "snapshot", "basisSchema", "regexps", "indexes", "preventDirectDelete", "sortRoles", "a", "b", "Roles", "users", "options", "customSchema", "customIndexes", "rootProps", "Role", "basisSchema", "jsonSchema", "roleDoc", "role", "involvedBy", "involvedRoleId", "involvedRole", "involvedByRole", "array", "anotherRole", "sorted", "involvedRoleIndex", "_o", "debounce", "next", "_id", "involves", "title", "description", "restProps", "ids", "roles", "cleanedUpIds", "crypto", "random", "basisSchema", "regexps", "Session", "sessions", "sessionDoc", "#sessions", "_id", "user", "isOnline", "restProps", "updates", "ts", "expireAfterSeconds", "indexes", "Sessions", "users", "options", "customSchema", "customIndexes", "basisSchema", "jsonSchema", "crypto", "random", "sessionDoc", "Session", "next", "user", "props", "ts", "session", "schema", "regexps", "Avatars", "users", "options", "schema", "basisSchema", "regexps", "debounce", "rolesSnapshots", "permissionsSnapshots", "staticUrl", "User", "users", "userDoc", "#users", "_id", "name", "email", "ownRoleIds", "orgId", "avatar", "restProps", "isEmailUpdated", "isNameUpdated", "isLastNameUpdated", "isRolesUpdated", "snapshot", "isOrgUpdated", "roleId", "role", "involvedRole", "slaveIds", "org", "slaveOrg", "user", "permissiveOrgIds", "sessionsLimit", "a", "b", "isOnline", "session", "indexes", "sortUsersAndOrgs", "a", "b", "Users", "collections", "customIndexes", "customSchema", "initialRootProps", "abilitiesOptions", "rolesOptions", "orgsOptions", "sessionsOptions", "avatarsOptions", "eventEmitter", "EventEmitter", "key", "Abilities", "basisSchema", "jsonSchema", "Roles", "Orgs", "Sessions", "Avatars", "userDoc", "User", "debounce", "shouldUpdateRoles", "user", "next", "email", "password", "roles", "name", "org", "job", "restProps", "ObjectId", "hash", "_id", "newPassword", "sessionProps", "verify", "session", "ids", "fromId", "toId", "handler"]
7
7
  }
package/dist/ws.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Publication as m,CollectionMapPublication as p}from"insite-subscriptions-server";var h=class extends m{constructor(e){super("abilities",{fetch({user:t}){if(t?.abilities.login?.sections?.includes("users"))return{abilities:e.getSchemeFor(t)}}})}},g=class extends p{constructor(e,t={}){let{projection:i={title:1,description:1},sort:o={_o:1},transform:r}=t;Object.assign(i,{involves:1,abilities:1}),super("roles",e.collection,s=>s.user?.abilities.login?.sections?.includes("users")&&{query:{_id:{$in:s.user.slaveRoleIds}},projection:i,sort:o},s=>{let{involves:n,abilities:d,inheritedAbilities:a,displayTitle:c,_o:u}=e.get(s._id);s.involves&&(s.ownInvolves=s.involves,s.involves=n.ids(),s.abilities=d,s.inheritedAbilities=a),i.title&&(s.displayTitle=c),s._o=u,r?.(s)})}},b=class extends m{constructor(e,t={}){let{fieldsToUpdate:i=[],projection:o,transform:r}=t;for(let s of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!o||o[s]!==0)&&i.push(s);super("user",{onSubscribe(s){let[{user:n}]=s.args;if(n){let{_id:d}=n;s.changeListener=a=>{if(a.documentKey._id==d)switch(a.operationType){case"update":if(!Object.keys(a.updateDescription.updatedFields).includesAny(i))break;case"replace":case"delete":s.changed(a)}},e.collection.changeListeners.add(s.changeListener)}},fetch({user:s,session:n},d){if(s){let a=Object.pick(s,"_id","email","name","initials","displayLabel","job","avatarUrl","abilities","slaveIds");if(a.orgId=s.org._id,a.sessionId=d?n._id:void 0,a.isOnline=!0,o)for(let c in o)o[c]?a[c]=s[c]:delete a[c];return r?.(a),a}},onUnsubscribe(s){s.changeListener&&e.collection.changeListeners.delete(s.changeListener)}})}},f=class extends p{constructor(e,t={}){let{projection:i={email:1,name:1,org:1,job:1,avatar:1},sort:o={"name.last":1},transform:r}=t;super("users",e.collection,s=>s.user?.abilities.login&&{query:{},projection:i,sort:o},s=>{({initials:s.initials,displayLabel:s.displayLabel,avatarUrl:s.avatarUrl,isOnline:s.isOnline}=e.get(s._id)),s.orgId=s.org,delete s.org,delete s.avatar,r?.(s)})}},S=class extends p{constructor(e,t={}){let{projection:i={_id:1},sort:o,triggers:r=[],transform:s}=t;r.includes("roles")||r.push("roles"),super("users.extended",e.collection,n=>n.user?.abilities.login?.sections?.includes("users")&&{query:{_id:{$in:n.user.slaveIds}},projection:i,sort:o,triggers:r},(n,[d])=>{n.roleIds=e.get(n._id).ownRoleIds.intersection(d.user.slaveRoleIds),s?.(n)})}},v=class extends p{constructor(e,t={}){let{projection:i={title:1},sort:o={title:1},transform:r}=t;super("orgs",e.collection,s=>s.user?.abilities.login&&{query:{},projection:i,sort:o},s=>{({initials:s.initials,displayLabel:s.displayLabel}=e.get(s._id)),r?.(s)})}},y=class extends p{constructor(e,t={}){let{projection:i={note:1},sort:o={_o:1},triggers:r=[],transform:s}=t;r.includes("owners")||r.push("owners"),super("orgs.extended",e.collection,n=>n.user?.abilities.login?.sections?.includes("users")&&{query:{_id:{$in:n.user.slaveIds}},projection:i,sort:o,triggers:r},(n,[d])=>{let{ownerIds:a,slaveOrgs:c,_o:u}=e.get(n._id);n.owners=a.intersection(d.user.slaveIds),n.slaveOrgs=c.intersection(d.user.slaveOrgs).ids(),n._o=u,s?.(n)})}};var O=class l{constructor(e,t={}){e.usersServer=this;let{users:i,publication:o,extendedPublication:r,userPublication:s,roles:n={},orgs:d={},getSessionProps:a}=t,{publication:c}=n,{publication:u,extendedPublication:P}=d;this.users=i,this.getSessionProps=a;for(let x of i.values())l.handleUserCreate(x);i.abilities.publication=new h(i.abilities),i.roles.publication=new g(i.roles,c),i.on("roles-update",l.handleRolesUpdate),i.on("roles-role-update",l.handleRolesRoleUpdate),i.publication=new f(i,o),i.extendedPublication=new S(i,r),i.userPublication=new b(i,s),i.on("user-create",l.handleUserCreate),i.on("user-is-online",l.handleUserIsOnline),i.on("session-delete",this.#e),i.orgs.publication=new v(i.orgs,u),i.orgs.extendedPublication=new y(i.orgs,P),i.on("orgs-update",l.handleOrgsUpdate),i.on("orgs-org-update",l.handleOrgsOrgUpdate),e.options.WebSocket.prototype.login=l.login,e.options.WebSocket.prototype.logout=l.logout,e.options.WebSocket.prototype.setSession=l.setSession,e.on("client-connect",l.handleClientConnect),e.requestListener&&(e.on("client-request:login",l.handleClientRequestLogin),e.on("client-request:logout",l.handleClientRequestLogout)),e.on("client-closed",l.handleClientClosed)}wsBySessions=new Map;getDefaultSessionProps({userAgent:e,remoteAddress:t}){return{userAgent:e,remoteAddress:t}}static handleUserCreate(e){e.webSockets=new Set}static handleUserIsOnline({_id:e,isOnline:t}){let i={_id:e,isOnline:t};for(let o of this.publication.subscriptions){let[r]=o.args;r.user&&r.user._id!=e&&o.handler([["u",i,!0]])}}#e=e=>this.wsBySessions.get(e)?.setSession(null);static handleRolesUpdate(){this.roles.publication.flushInitial()}static handleRolesRoleUpdate(e,t){t&&this.roles.publication.skip(t)}static handleOrgsUpdate(){this.orgs.publication.flushInitial(),this.orgs.extendedPublication.flushInitial()}static handleOrgsOrgUpdate(e,t){t&&(this.orgs.publication.skip(t),this.orgs.extendedPublication.skip(t))}static handleClientConnect(e){e.session=null}static handleClientRequestLogin(e,t,i){return e.login(t,i)}static handleClientRequestLogout(e){return e.logout()}static handleClientClosed(e){e.session?.offline(),e.setSession(null)}static async login(e,t){let{usersServer:i}=this.wss,o=await i.users.login(e,t,{...i.getDefaultSessionProps(this),...i.getSessionProps?.(this),isOnline:!0});o&&this.setSession(o)}static logout(){this.session&&(this.wss.usersServer.users.logout(this.session),this.setSession(null))}static setSession(e,t){let{usersServer:i}=this.wss;typeof e=="string"&&(e=i.users.sessions.get(e)??null),this.session!=e&&(this.session&&i.wsBySessions.delete(this.session),e?(this.session=e,this.user=e.user,this.lastUserId=this.user._id,this.user.webSockets.add(this),i.wsBySessions.set(e,this),t&&e.prolong({...i.getDefaultSessionProps(this),...i.getSessionProps?.(this),isOnline:!0})):(this.user.webSockets.delete(this),this.session=null,delete this.user),this.wss.emit("client-session",this,t))}};export{O as UsersServer};
1
+ import{CollectionMapPublication as p,Publication as m}from"insite-subscriptions-server";var h=class extends m{constructor(e){super("abilities",{fetch({user:t}){if(t?.abilities.login?.sections?.includes("users"))return{abilities:e.getSchemeFor(t)}}})}},g=class extends p{constructor(e,t={}){let{projection:i={title:1,description:1},sort:o={_o:1},transform:r}=t;Object.assign(i,{involves:1,abilities:1}),super("roles",e.collection,s=>s.user?.abilities.login?.sections?.includes("users")&&{query:{_id:{$in:s.user.slaveRoleIds}},projection:i,sort:o},s=>{let{involves:n,abilities:d,inheritedAbilities:a,displayTitle:c,_o:u}=e.get(s._id);s.involves&&(s.ownInvolves=s.involves,s.involves=n.ids(),s.abilities=d,s.inheritedAbilities=a),i.title&&(s.displayTitle=c),s._o=u,r?.(s)})}},b=class extends m{constructor(e,t={}){let{fieldsToUpdate:i=[],projection:o,transform:r}=t;for(let s of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!o||o[s]!==0)&&i.push(s);super("user",{onSubscribe(s){let[{user:n}]=s.args;if(n){let{_id:d}=n;s.changeListener=a=>{if(a.documentKey._id===d)switch(a.operationType){case"update":if(!Object.keys(a.updateDescription.updatedFields).includesAny(i))break;case"replace":case"delete":s.changed(a)}},e.collection.changeListeners.add(s.changeListener)}},fetch({user:s,session:n},d){if(s){let a=Object.pick(s,"_id","email","name","initials","displayLabel","job","avatarUrl","abilities","slaveIds");if(a.orgId=s.org._id,a.sessionId=d?n._id:void 0,a.isOnline=!0,o)for(let c in o)o[c]?a[c]=s[c]:delete a[c];return r?.(a),a}},onUnsubscribe(s){s.changeListener&&e.collection.changeListeners.delete(s.changeListener)}})}},f=class extends p{constructor(e,t={}){let{projection:i={email:1,name:1,org:1,job:1,avatar:1},sort:o={"name.last":1},transform:r}=t;super("users",e.collection,s=>s.user?.abilities.login&&{query:{},projection:i,sort:o},s=>{({initials:s.initials,displayLabel:s.displayLabel,avatarUrl:s.avatarUrl,isOnline:s.isOnline}=e.get(s._id)),s.orgId=s.org,delete s.org,delete s.avatar,r?.(s)})}},S=class extends p{constructor(e,t={}){let{projection:i={_id:1},sort:o,triggers:r=[],transform:s}=t;r.includes("roles")||r.push("roles"),super("users.extended",e.collection,n=>n.user?.abilities.login?.sections?.includes("users")&&{query:{_id:{$in:n.user.slaveIds}},projection:i,sort:o,triggers:r},(n,[d])=>{n.roleIds=e.get(n._id).ownRoleIds.intersection(d.user.slaveRoleIds),s?.(n)})}},v=class extends p{constructor(e,t={}){let{projection:i={title:1},sort:o={title:1},transform:r}=t;super("orgs",e.collection,s=>s.user?.abilities.login&&{query:{},projection:i,sort:o},s=>{({initials:s.initials,displayLabel:s.displayLabel}=e.get(s._id)),r?.(s)})}},y=class extends p{constructor(e,t={}){let{projection:i={note:1},sort:o={_o:1},triggers:r=[],transform:s}=t;r.includes("owners")||r.push("owners"),super("orgs.extended",e.collection,n=>n.user?.abilities.login?.sections?.includes("users")&&{query:{_id:{$in:n.user.slaveIds}},projection:i,sort:o,triggers:r},(n,[d])=>{let{ownerIds:a,slaveOrgs:c,_o:u}=e.get(n._id);n.owners=a.intersection(d.user.slaveIds),n.slaveOrgs=c.intersection(d.user.slaveOrgs).ids(),n._o=u,s?.(n)})}};var O=class l{constructor(e,t={}){e.usersServer=this;let{users:i,publication:o,extendedPublication:r,userPublication:s,roles:n={},orgs:d={},getSessionProps:a}=t,{publication:c}=n,{publication:u,extendedPublication:P}=d;this.users=i,this.getSessionProps=a;for(let x of i.values())l.handleUserCreate(x);i.abilities.publication=new h(i.abilities),i.roles.publication=new g(i.roles,c),i.on("roles-update",l.handleRolesUpdate),i.on("roles-role-update",l.handleRolesRoleUpdate),i.publication=new f(i,o),i.extendedPublication=new S(i,r),i.userPublication=new b(i,s),i.on("user-create",l.handleUserCreate),i.on("user-is-online",l.handleUserIsOnline),i.on("session-delete",this.#e),i.orgs.publication=new v(i.orgs,u),i.orgs.extendedPublication=new y(i.orgs,P),i.on("orgs-update",l.handleOrgsUpdate),i.on("orgs-org-update",l.handleOrgsOrgUpdate),e.options.WebSocket.prototype.login=l.login,e.options.WebSocket.prototype.logout=l.logout,e.options.WebSocket.prototype.setSession=l.setSession,e.on("client-connect",l.handleClientConnect),e.requestListener&&(e.on("client-request:login",l.handleClientRequestLogin),e.on("client-request:logout",l.handleClientRequestLogout)),e.on("client-closed",l.handleClientClosed)}wsBySessions=new Map;getDefaultSessionProps({userAgent:e,remoteAddress:t}){return{userAgent:e,remoteAddress:t}}static handleUserCreate(e){e.webSockets=new Set}static handleUserIsOnline({_id:e,isOnline:t}){let i={_id:e,isOnline:t};for(let o of this.publication.subscriptions){let[r]=o.args;r.user&&r.user._id!=e&&o.handler([["u",i,!0]])}}#e=e=>this.wsBySessions.get(e)?.setSession(null);static handleRolesUpdate(){this.roles.publication.flushInitial()}static handleRolesRoleUpdate(e,t){t&&this.roles.publication.skip(t)}static handleOrgsUpdate(){this.orgs.publication.flushInitial(),this.orgs.extendedPublication.flushInitial()}static handleOrgsOrgUpdate(e,t){t&&(this.orgs.publication.skip(t),this.orgs.extendedPublication.skip(t))}static handleClientConnect(e){e.session=null}static handleClientRequestLogin(e,t,i){return e.login(t,i)}static handleClientRequestLogout(e){return e.logout()}static handleClientClosed(e){e.session?.offline(),e.setSession(null)}static async login(e,t){let{usersServer:i}=this.wss,o=await i.users.login(e,t,{...i.getDefaultSessionProps(this),...i.getSessionProps?.(this),isOnline:!0});o&&this.setSession(o)}static logout(){this.session&&(this.wss.usersServer.users.logout(this.session),this.setSession(null))}static setSession(e,t){let{usersServer:i}=this.wss;typeof e=="string"&&(e=i.users.sessions.get(e)??null),this.session!=e&&(this.session&&i.wsBySessions.delete(this.session),e?(this.session=e,this.user=e.user,this.lastUserId=this.user._id,this.user.webSockets.add(this),i.wsBySessions.set(e,this),t&&e.prolong({...i.getDefaultSessionProps(this),...i.getSessionProps?.(this),isOnline:!0})):(this.user.webSockets.delete(this),this.session=null,delete this.user),this.wss.emit("client-session",this,t))}};export{O as UsersServer};
2
2
  //# sourceMappingURL=ws.js.map
package/dist/ws.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/ws/publications.js", "../src/ws/UsersServer.js"],
4
- "sourcesContent": ["import { Publication, CollectionMapPublication } from \"insite-subscriptions-server\";\n\n\nexport class AbilitiesPublication extends Publication {\n\tconstructor(abilities) {\n\t\tsuper(\"abilities\", {\n\n\t\t\tfetch({ user }) {\n\t\t\t\tif (user?.abilities.login?.sections?.includes(\"users\"))\n\t\t\t\t\treturn { abilities: abilities.getSchemeFor(user) };\n\t\t\t}\n\n\t\t});\n\t}\n}\n\n\nexport class RolesPublication extends CollectionMapPublication {\n\tconstructor(roles, options = {}) {\n\n\t\tconst {\n\t\t\tprojection = { title: 1, description: 1 },\n\t\t\tsort = { _o: 1 },\n\t\t\ttransform\n\t\t} = options;\n\n\t\tObject.assign(projection, { involves: 1, abilities: 1 });\n\n\t\tsuper(\"roles\", roles.collection, ws => ws.user?.abilities.login?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: ws.user.slaveRoleIds } },\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, roleDoc => {\n\t\t\tconst { involves, abilities, inheritedAbilities, displayTitle, _o } = roles.get(roleDoc._id);\n\n\t\t\tif (roleDoc.involves) {\n\t\t\t\troleDoc.ownInvolves = roleDoc.involves;\n\t\t\t\troleDoc.involves = involves.ids();\n\t\t\t\troleDoc.abilities = abilities;\n\t\t\t\troleDoc.inheritedAbilities = inheritedAbilities;\n\t\t\t}\n\n\t\t\tif (projection.title)\n\t\t\t\troleDoc.displayTitle = displayTitle;\n\n\t\t\troleDoc._o = _o;\n\n\t\t\ttransform?.(roleDoc);\n\n\t\t});\n\n\t}\n\n}\n\n\nexport class UserPublication extends Publication {\n\tconstructor(users, options = {}) {\n\n\t\tconst {\n\t\t\tfieldsToUpdate = [],\n\t\t\tprojection,\n\t\t\ttransform\n\t\t} = options;\n\n\t\tfor (const key of [\n\t\t\t\"email\",\n\t\t\t\"name\",\n\t\t\t\"name.first\",\n\t\t\t\"name.middle\",\n\t\t\t\"name.last\",\n\t\t\t\"org\",\n\t\t\t\"job\",\n\t\t\t\"avatar\"\n\t\t])\n\t\t\tif (!projection || projection[key] !== 0)\n\t\t\t\tfieldsToUpdate.push(key);\n\n\t\tsuper(\"user\", {\n\n\t\t\tonSubscribe(subscription) {\n\t\t\t\tconst [ { user } ] = subscription.args;\n\n\t\t\t\tif (user) {\n\t\t\t\t\tconst { _id } = user;\n\n\t\t\t\t\tsubscription.changeListener = next => {\n\t\t\t\t\t\tif (next.documentKey._id == _id)\n\t\t\t\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\t\t\t\tif (!Object.keys(next.updateDescription.updatedFields).includesAny(fieldsToUpdate))\n\t\t\t\t\t\t\t\t\t\tbreak;\n\n\t\t\t\t\t\t\t\tcase \"replace\":\n\t\t\t\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\t\t\t\tsubscription.changed(next);\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t};\n\n\t\t\t\t\tusers.collection.changeListeners.add(subscription.changeListener);\n\t\t\t\t}\n\n\t\t\t},\n\n\t\t\tfetch({ user, session }, isSessionIdRequired) {\n\t\t\t\tif (user) {\n\t\t\t\t\tconst userDoc = Object.pick(user, \"_id\", \"email\", \"name\", \"initials\", \"displayLabel\", \"job\", \"avatarUrl\", \"abilities\", \"slaveIds\");\n\n\t\t\t\t\tuserDoc.orgId = user.org._id;\n\t\t\t\t\tuserDoc.sessionId = isSessionIdRequired ? session._id : undefined;\n\t\t\t\t\tuserDoc.isOnline = true;\n\n\t\t\t\t\tif (projection)\n\t\t\t\t\t\tfor (const key in projection)\n\t\t\t\t\t\t\tif (projection[key])\n\t\t\t\t\t\t\t\tuserDoc[key] = user[key];\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdelete userDoc[key];\n\n\t\t\t\t\ttransform?.(userDoc);\n\n\t\t\t\t\treturn userDoc;\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonUnsubscribe(subscription) {\n\t\t\t\tif (subscription.changeListener)\n\t\t\t\t\tusers.collection.changeListeners.delete(subscription.changeListener);\n\n\t\t\t}\n\n\t\t});\n\n\t}\n}\n\nexport class UsersPublication extends CollectionMapPublication {\n\tconstructor(users, options = {}) {\n\n\t\tconst {\n\t\t\tprojection = { email: 1, name: 1, org: 1, job: 1, avatar: 1 },\n\t\t\tsort = { \"name.last\": 1 },\n\t\t\ttransform\n\t\t} = options;\n\n\t\tsuper(\"users\", users.collection, ws => ws.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, userDoc => {\n\t\t\t({\n\t\t\t\tinitials: userDoc.initials,\n\t\t\t\tdisplayLabel: userDoc.displayLabel,\n\t\t\t\tavatarUrl: userDoc.avatarUrl,\n\t\t\t\tisOnline: userDoc.isOnline\n\t\t\t} = users.get(userDoc._id));\n\t\t\t\n\t\t\tuserDoc.orgId = userDoc.org;\n\t\t\t\n\t\t\tdelete userDoc.org;\n\t\t\tdelete userDoc.avatar;\n\t\t\t\n\t\t\ttransform?.(userDoc);\n\t\t\t\n\t\t});\n\n\t}\n}\n\nexport class UsersExtendedPublication extends CollectionMapPublication {\n\tconstructor(users, options = {}) {\n\n\t\tconst {\n\t\t\tprojection = { _id: 1 },\n\t\t\tsort,\n\t\t\ttriggers = [],\n\t\t\ttransform\n\t\t} = options;\n\n\t\tif (!triggers.includes(\"roles\"))\n\t\t\ttriggers.push(\"roles\");\n\n\t\tsuper(\"users.extended\", users.collection, ws => ws.user?.abilities.login?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: ws.user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (userDoc, [ ws ]) => {\n\t\t\tuserDoc.roleIds = users.get(userDoc._id).ownRoleIds.intersection(ws.user.slaveRoleIds);\n\n\t\t\ttransform?.(userDoc);\n\n\t\t});\n\n\t}\n}\n\n\nexport class OrgsPublication extends CollectionMapPublication {\n\tconstructor(orgs, options = {}) {\n\n\t\tconst {\n\t\t\tprojection = { title: 1 },\n\t\t\tsort = { title: 1 },\n\t\t\ttransform\n\t\t} = options;\n\n\t\tsuper(\"orgs\", orgs.collection, ws => ws.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, orgDoc => {\n\t\t\t({\n\t\t\t\tinitials: orgDoc.initials,\n\t\t\t\tdisplayLabel: orgDoc.displayLabel\n\t\t\t} = orgs.get(orgDoc._id));\n\t\t\t\n\t\t\ttransform?.(orgDoc);\n\t\t\t\n\t\t});\n\n\t}\n\n}\n\nexport class OrgsExtendedPublication extends CollectionMapPublication {\n\tconstructor(orgs, options = {}) {\n\n\t\tconst {\n\t\t\tprojection = { note: 1 },\n\t\t\tsort = { _o: 1 },\n\t\t\ttriggers = [],\n\t\t\ttransform\n\t\t} = options;\n\n\t\tif (!triggers.includes(\"owners\"))\n\t\t\ttriggers.push(\"owners\");\n\n\t\tsuper(\"orgs.extended\", orgs.collection, ws => ws.user?.abilities.login?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: ws.user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (orgDoc, [ ws ]) => {\n\t\t\tconst { ownerIds, slaveOrgs, _o } = orgs.get(orgDoc._id);\n\n\t\t\torgDoc.owners = ownerIds.intersection(ws.user.slaveIds);\n\t\t\torgDoc.slaveOrgs = slaveOrgs.intersection(ws.user.slaveOrgs).ids();\n\t\t\torgDoc._o = _o;\n\n\t\t\ttransform?.(orgDoc);\n\n\t\t});\n\n\t}\n\n}\n", "import {\n\tAbilitiesPublication,\n\tRolesPublication,\n\tUserPublication,\n\tUsersPublication,\n\tUsersExtendedPublication,\n\tOrgsPublication,\n\tOrgsExtendedPublication\n} from \"./publications\";\n\n\nexport class UsersServer {\n\tconstructor(wss, options = {}) {\n\t\twss.usersServer = this;\n\t\t\n\t\tconst {\n\t\t\tusers,\n\t\t\tpublication: publicationOptions,\n\t\t\textendedPublication: extendedPublicationOptions,\n\t\t\tuserPublication: userPublicationOptions,\n\t\t\troles = {},\n\t\t\torgs = {},\n\t\t\tgetSessionProps\n\t\t} = options;\n\t\t\n\t\tconst {\n\t\t\tpublication: rolesPublicationOptions\n\t\t} = roles;\n\t\t\n\t\tconst {\n\t\t\tpublication: orgsPublicationOptions,\n\t\t\textendedPublication: orgsExtendedPublicationOptions\n\t\t} = orgs;\n\t\t\n\t\tthis.users = users;\n\t\tthis.getSessionProps = getSessionProps;\n\t\t\n\t\tfor (const user of users.values())\n\t\t\tUsersServer.handleUserCreate(user);\n\t\t\n\t\tusers.abilities.publication = new AbilitiesPublication(users.abilities);\n\t\t\n\t\tusers.roles.publication = new RolesPublication(users.roles, rolesPublicationOptions);\n\t\tusers.on(\"roles-update\", UsersServer.handleRolesUpdate);\n\t\tusers.on(\"roles-role-update\", UsersServer.handleRolesRoleUpdate);\n\t\t\n\t\tusers.publication = new UsersPublication(users, publicationOptions);\n\t\tusers.extendedPublication = new UsersExtendedPublication(users, extendedPublicationOptions);\n\t\tusers.userPublication = new UserPublication(users, userPublicationOptions);\n\t\tusers.on(\"user-create\", UsersServer.handleUserCreate);\n\t\tusers.on(\"user-is-online\", UsersServer.handleUserIsOnline);\n\t\t\n\t\tusers.on(\"session-delete\", this.#handleSessionDelete);\n\t\t\n\t\tusers.orgs.publication = new OrgsPublication(users.orgs, orgsPublicationOptions);\n\t\tusers.orgs.extendedPublication = new OrgsExtendedPublication(users.orgs, orgsExtendedPublicationOptions);\n\t\tusers.on(\"orgs-update\", UsersServer.handleOrgsUpdate);\n\t\tusers.on(\"orgs-org-update\", UsersServer.handleOrgsOrgUpdate);\n\t\t\n\t\twss.options.WebSocket.prototype.login = UsersServer.login;\n\t\twss.options.WebSocket.prototype.logout = UsersServer.logout;\n\t\twss.options.WebSocket.prototype.setSession = UsersServer.setSession;\n\t\t\n\t\twss.on(\"client-connect\", UsersServer.handleClientConnect);\n\t\t\n\t\tif (wss.requestListener) {\n\t\t\twss.on(\"client-request:login\", UsersServer.handleClientRequestLogin);\n\t\t\twss.on(\"client-request:logout\", UsersServer.handleClientRequestLogout);\n\t\t}\n\t\t\n\t\twss.on(\"client-closed\", UsersServer.handleClientClosed);\n\t\t\n\t}\n\t\n\twsBySessions = new Map();\n\t\n\tgetDefaultSessionProps({ userAgent, remoteAddress }) {\n\t\treturn {\n\t\t\tuserAgent,\n\t\t\tremoteAddress\n\t\t};\n\t}\n\t\n\t\n\tstatic handleUserCreate(user) {\n\t\tuser.webSockets = new Set();\n\t\t\n\t}\n\t\n\tstatic handleUserIsOnline({ _id, isOnline }) {\n\t\tconst updates = { _id, isOnline };\n\t\t\n\t\tfor (const usersSubscription of this.publication.subscriptions) {\n\t\t\tconst [ ws ] = usersSubscription.args;\n\t\t\tif (ws.user && ws.user._id != _id)\n\t\t\t\tusersSubscription.handler([ [ \"u\"/* update */, updates, true ] ]);\n\t\t}\n\t\t\n\t}\n\t\n\t#handleSessionDelete = session => this.wsBySessions.get(session)?.setSession(null);\n\t\n\tstatic handleRolesUpdate() {\n\t\tthis.roles.publication.flushInitial();\n\t\t\n\t}\n\t\n\tstatic handleRolesRoleUpdate(_, next) {\n\t\tif (next)\n\t\t\tthis.roles.publication.skip(next);\n\t\t\n\t}\n\t\n\tstatic handleOrgsUpdate() {\n\t\t\n\t\tthis.orgs.publication.flushInitial();\n\t\tthis.orgs.extendedPublication.flushInitial();\n\t\t\n\t}\n\t\n\tstatic handleOrgsOrgUpdate(_, next) {\n\t\tif (next) {\n\t\t\tthis.orgs.publication.skip(next);\n\t\t\tthis.orgs.extendedPublication.skip(next);\n\t\t}\n\t\t\n\t}\n\t\n\t\n\tstatic handleClientConnect(ws) {\n\t\tws.session = null;\n\t\t\n\t}\n\t\n\tstatic handleClientRequestLogin(ws, email, password) {\n\t\treturn ws.login(email, password);\n\t}\n\t\n\tstatic handleClientRequestLogout(ws) {\n\t\treturn ws.logout();\n\t}\n\t\n\tstatic handleClientClosed(ws) {\n\t\tws.session?.offline();\n\t\tws.setSession(null);\n\t\t\n\t}\n\t\n\t\n\tstatic async login(email, password) {\n\t\t\n\t\tconst { usersServer } = this.wss;\n\t\t\n\t\tconst session = await usersServer.users.login(email, password, {\n\t\t\t...usersServer.getDefaultSessionProps(this),\n\t\t\t...usersServer.getSessionProps?.(this),\n\t\t\tisOnline: true\n\t\t});\n\t\t\n\t\tif (session)\n\t\t\tthis.setSession(session);\n\t\t\n\t}\n\t\n\tstatic logout() {\n\t\tif (this.session) {\n\t\t\tthis.wss.usersServer.users.logout(this.session);\n\t\t\tthis.setSession(null);\n\t\t}\n\t\t\n\t}\n\t\n\t\n\tstatic setSession(session, shouldProlong) {\n\t\t\n\t\tconst { usersServer } = this.wss;\n\t\t\n\t\tif (typeof session == \"string\")\n\t\t\tsession = usersServer.users.sessions.get(session) ?? null;\n\t\t\n\t\tif (this.session != session) {\n\t\t\tif (this.session)\n\t\t\t\tusersServer.wsBySessions.delete(this.session);\n\t\t\t\n\t\t\tif (session) {\n\t\t\t\tthis.session = session;\n\t\t\t\tthis.user = session.user;\n\t\t\t\tthis.lastUserId = this.user._id;\n\t\t\t\t\n\t\t\t\tthis.user.webSockets.add(this);\n\t\t\t\tusersServer.wsBySessions.set(session, this);\n\t\t\t\t\n\t\t\t\tif (shouldProlong)\n\t\t\t\t\tsession.prolong({\n\t\t\t\t\t\t...usersServer.getDefaultSessionProps(this),\n\t\t\t\t\t\t...usersServer.getSessionProps?.(this),\n\t\t\t\t\t\tisOnline: true\n\t\t\t\t\t});\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tthis.user.webSockets.delete(this);\n\t\t\t\t\n\t\t\t\tthis.session = null;\n\t\t\t\tdelete this.user;\n\t\t\t}\n\t\t\t\n\t\t\tthis.wss.emit(\"client-session\", this, shouldProlong);\n\t\t}\n\t\t\n\t}\n\t\n}\n"],
5
- "mappings": "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",
6
- "names": ["Publication", "CollectionMapPublication", "AbilitiesPublication", "abilities", "user", "RolesPublication", "roles", "options", "projection", "sort", "transform", "ws", "roleDoc", "involves", "inheritedAbilities", "displayTitle", "_o", "UserPublication", "users", "fieldsToUpdate", "key", "subscription", "_id", "next", "session", "isSessionIdRequired", "userDoc", "UsersPublication", "UsersExtendedPublication", "triggers", "OrgsPublication", "orgs", "orgDoc", "OrgsExtendedPublication", "ownerIds", "slaveOrgs", "UsersServer", "_UsersServer", "wss", "options", "users", "publicationOptions", "extendedPublicationOptions", "userPublicationOptions", "roles", "orgs", "getSessionProps", "rolesPublicationOptions", "orgsPublicationOptions", "orgsExtendedPublicationOptions", "user", "AbilitiesPublication", "RolesPublication", "UsersPublication", "UsersExtendedPublication", "UserPublication", "#handleSessionDelete", "OrgsPublication", "OrgsExtendedPublication", "userAgent", "remoteAddress", "_id", "isOnline", "updates", "usersSubscription", "ws", "session", "_", "next", "email", "password", "usersServer", "shouldProlong"]
4
+ "sourcesContent": ["import { CollectionMapPublication, Publication } from \"insite-subscriptions-server\";\n\n\nexport class AbilitiesPublication extends Publication {\n\tconstructor(abilities) {\n\t\tsuper(\"abilities\", {\n\t\t\t\n\t\t\tfetch({ user }) {\n\t\t\t\tif (user?.abilities.login?.sections?.includes(\"users\"))\n\t\t\t\t\treturn { abilities: abilities.getSchemeFor(user) };\n\t\t\t}\n\t\t\t\n\t\t});\n\t}\n}\n\n\nexport class RolesPublication extends CollectionMapPublication {\n\tconstructor(roles, options = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { title: 1, description: 1 },\n\t\t\tsort = { _o: 1 },\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tObject.assign(projection, { involves: 1, abilities: 1 });\n\t\t\n\t\tsuper(\"roles\", roles.collection, ws => ws.user?.abilities.login?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: ws.user.slaveRoleIds } },\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, roleDoc => {\n\t\t\tconst { involves, abilities, inheritedAbilities, displayTitle, _o } = roles.get(roleDoc._id);\n\t\t\t\n\t\t\tif (roleDoc.involves) {\n\t\t\t\troleDoc.ownInvolves = roleDoc.involves;\n\t\t\t\troleDoc.involves = involves.ids();\n\t\t\t\troleDoc.abilities = abilities;\n\t\t\t\troleDoc.inheritedAbilities = inheritedAbilities;\n\t\t\t}\n\t\t\t\n\t\t\tif (projection.title)\n\t\t\t\troleDoc.displayTitle = displayTitle;\n\t\t\t\n\t\t\troleDoc._o = _o;\n\t\t\t\n\t\t\ttransform?.(roleDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n\t\n}\n\n\nexport class UserPublication extends Publication {\n\tconstructor(users, options = {}) {\n\t\t\n\t\tconst {\n\t\t\tfieldsToUpdate = [],\n\t\t\tprojection,\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tfor (const key of [\n\t\t\t\"email\",\n\t\t\t\"name\",\n\t\t\t\"name.first\",\n\t\t\t\"name.middle\",\n\t\t\t\"name.last\",\n\t\t\t\"org\",\n\t\t\t\"job\",\n\t\t\t\"avatar\"\n\t\t])\n\t\t\tif (!projection || projection[key] !== 0)\n\t\t\t\tfieldsToUpdate.push(key);\n\t\t\n\t\tsuper(\"user\", {\n\t\t\t\n\t\t\tonSubscribe(subscription) {\n\t\t\t\tconst [ { user } ] = subscription.args;\n\t\t\t\t\n\t\t\t\tif (user) {\n\t\t\t\t\tconst { _id } = user;\n\t\t\t\t\t\n\t\t\t\t\tsubscription.changeListener = next => {\n\t\t\t\t\t\tif (next.documentKey._id === _id)\n\t\t\t\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\t\t\t\tif (!Object.keys(next.updateDescription.updatedFields).includesAny(fieldsToUpdate))\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tcase \"replace\":// eslint-disable-line no-fallthrough\n\t\t\t\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\t\t\t\tsubscription.changed(next);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\tusers.collection.changeListeners.add(subscription.changeListener);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tfetch({ user, session }, isSessionIdRequired) {\n\t\t\t\tif (user) {\n\t\t\t\t\tconst userDoc = Object.pick(user, \"_id\", \"email\", \"name\", \"initials\", \"displayLabel\", \"job\", \"avatarUrl\", \"abilities\", \"slaveIds\");\n\t\t\t\t\t\n\t\t\t\t\tuserDoc.orgId = user.org._id;\n\t\t\t\t\tuserDoc.sessionId = isSessionIdRequired ? session._id : undefined;\n\t\t\t\t\tuserDoc.isOnline = true;\n\t\t\t\t\t\n\t\t\t\t\tif (projection)\n\t\t\t\t\t\tfor (const key in projection)\n\t\t\t\t\t\t\tif (projection[key])\n\t\t\t\t\t\t\t\tuserDoc[key] = user[key];\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdelete userDoc[key];\n\t\t\t\t\t\n\t\t\t\t\ttransform?.(userDoc);\n\t\t\t\t\t\n\t\t\t\t\treturn userDoc;\n\t\t\t\t}\n\t\t\t},\n\t\t\t\n\t\t\tonUnsubscribe(subscription) {\n\t\t\t\tif (subscription.changeListener)\n\t\t\t\t\tusers.collection.changeListeners.delete(subscription.changeListener);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\nexport class UsersPublication extends CollectionMapPublication {\n\tconstructor(users, options = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { email: 1, name: 1, org: 1, job: 1, avatar: 1 },\n\t\t\tsort = { \"name.last\": 1 },\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tsuper(\"users\", users.collection, ws => ws.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, userDoc => {\n\t\t\t({\n\t\t\t\tinitials: userDoc.initials,\n\t\t\t\tdisplayLabel: userDoc.displayLabel,\n\t\t\t\tavatarUrl: userDoc.avatarUrl,\n\t\t\t\tisOnline: userDoc.isOnline\n\t\t\t} = users.get(userDoc._id));\n\t\t\t\n\t\t\tuserDoc.orgId = userDoc.org;\n\t\t\t\n\t\t\tdelete userDoc.org;\n\t\t\tdelete userDoc.avatar;\n\t\t\t\n\t\t\ttransform?.(userDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\nexport class UsersExtendedPublication extends CollectionMapPublication {\n\tconstructor(users, options = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { _id: 1 },\n\t\t\tsort,\n\t\t\ttriggers = [],\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tif (!triggers.includes(\"roles\"))\n\t\t\ttriggers.push(\"roles\");\n\t\t\n\t\tsuper(\"users.extended\", users.collection, ws => ws.user?.abilities.login?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: ws.user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (userDoc, [ ws ]) => {\n\t\t\tuserDoc.roleIds = users.get(userDoc._id).ownRoleIds.intersection(ws.user.slaveRoleIds);\n\t\t\t\n\t\t\ttransform?.(userDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\n\nexport class OrgsPublication extends CollectionMapPublication {\n\tconstructor(orgs, options = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { title: 1 },\n\t\t\tsort = { title: 1 },\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tsuper(\"orgs\", orgs.collection, ws => ws.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, orgDoc => {\n\t\t\t({\n\t\t\t\tinitials: orgDoc.initials,\n\t\t\t\tdisplayLabel: orgDoc.displayLabel\n\t\t\t} = orgs.get(orgDoc._id));\n\t\t\t\n\t\t\ttransform?.(orgDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n\t\n}\n\nexport class OrgsExtendedPublication extends CollectionMapPublication {\n\tconstructor(orgs, options = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { note: 1 },\n\t\t\tsort = { _o: 1 },\n\t\t\ttriggers = [],\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tif (!triggers.includes(\"owners\"))\n\t\t\ttriggers.push(\"owners\");\n\t\t\n\t\tsuper(\"orgs.extended\", orgs.collection, ws => ws.user?.abilities.login?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: ws.user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (orgDoc, [ ws ]) => {\n\t\t\tconst { ownerIds, slaveOrgs, _o } = orgs.get(orgDoc._id);\n\t\t\t\n\t\t\torgDoc.owners = ownerIds.intersection(ws.user.slaveIds);\n\t\t\torgDoc.slaveOrgs = slaveOrgs.intersection(ws.user.slaveOrgs).ids();\n\t\t\torgDoc._o = _o;\n\t\t\t\n\t\t\ttransform?.(orgDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n\t\n}\n", "import {\n\tAbilitiesPublication,\n\tRolesPublication,\n\tUserPublication,\n\tUsersPublication,\n\tUsersExtendedPublication,\n\tOrgsPublication,\n\tOrgsExtendedPublication\n} from \"./publications\";\n\n\nexport class UsersServer {\n\tconstructor(wss, options = {}) {\n\t\twss.usersServer = this;\n\t\t\n\t\tconst {\n\t\t\tusers,\n\t\t\tpublication: publicationOptions,\n\t\t\textendedPublication: extendedPublicationOptions,\n\t\t\tuserPublication: userPublicationOptions,\n\t\t\troles = {},\n\t\t\torgs = {},\n\t\t\tgetSessionProps\n\t\t} = options;\n\t\t\n\t\tconst {\n\t\t\tpublication: rolesPublicationOptions\n\t\t} = roles;\n\t\t\n\t\tconst {\n\t\t\tpublication: orgsPublicationOptions,\n\t\t\textendedPublication: orgsExtendedPublicationOptions\n\t\t} = orgs;\n\t\t\n\t\tthis.users = users;\n\t\tthis.getSessionProps = getSessionProps;\n\t\t\n\t\tfor (const user of users.values())\n\t\t\tUsersServer.handleUserCreate(user);\n\t\t\n\t\tusers.abilities.publication = new AbilitiesPublication(users.abilities);\n\t\t\n\t\tusers.roles.publication = new RolesPublication(users.roles, rolesPublicationOptions);\n\t\tusers.on(\"roles-update\", UsersServer.handleRolesUpdate);\n\t\tusers.on(\"roles-role-update\", UsersServer.handleRolesRoleUpdate);\n\t\t\n\t\tusers.publication = new UsersPublication(users, publicationOptions);\n\t\tusers.extendedPublication = new UsersExtendedPublication(users, extendedPublicationOptions);\n\t\tusers.userPublication = new UserPublication(users, userPublicationOptions);\n\t\tusers.on(\"user-create\", UsersServer.handleUserCreate);\n\t\tusers.on(\"user-is-online\", UsersServer.handleUserIsOnline);\n\t\t\n\t\tusers.on(\"session-delete\", this.#handleSessionDelete);\n\t\t\n\t\tusers.orgs.publication = new OrgsPublication(users.orgs, orgsPublicationOptions);\n\t\tusers.orgs.extendedPublication = new OrgsExtendedPublication(users.orgs, orgsExtendedPublicationOptions);\n\t\tusers.on(\"orgs-update\", UsersServer.handleOrgsUpdate);\n\t\tusers.on(\"orgs-org-update\", UsersServer.handleOrgsOrgUpdate);\n\t\t\n\t\twss.options.WebSocket.prototype.login = UsersServer.login;\n\t\twss.options.WebSocket.prototype.logout = UsersServer.logout;\n\t\twss.options.WebSocket.prototype.setSession = UsersServer.setSession;\n\t\t\n\t\twss.on(\"client-connect\", UsersServer.handleClientConnect);\n\t\t\n\t\tif (wss.requestListener) {\n\t\t\twss.on(\"client-request:login\", UsersServer.handleClientRequestLogin);\n\t\t\twss.on(\"client-request:logout\", UsersServer.handleClientRequestLogout);\n\t\t}\n\t\t\n\t\twss.on(\"client-closed\", UsersServer.handleClientClosed);\n\t\t\n\t}\n\t\n\twsBySessions = new Map();\n\t\n\tgetDefaultSessionProps({ userAgent, remoteAddress }) {\n\t\treturn {\n\t\t\tuserAgent,\n\t\t\tremoteAddress\n\t\t};\n\t}\n\t\n\t\n\tstatic handleUserCreate(user) {\n\t\tuser.webSockets = new Set();\n\t\t\n\t}\n\t\n\tstatic handleUserIsOnline({ _id, isOnline }) {\n\t\tconst updates = { _id, isOnline };\n\t\t\n\t\tfor (const usersSubscription of this.publication.subscriptions) {\n\t\t\tconst [ ws ] = usersSubscription.args;\n\t\t\tif (ws.user && ws.user._id != _id)\n\t\t\t\tusersSubscription.handler([ [ \"u\"/* update */, updates, true ] ]);\n\t\t}\n\t\t\n\t}\n\t\n\t#handleSessionDelete = session => this.wsBySessions.get(session)?.setSession(null);\n\t\n\tstatic handleRolesUpdate() {\n\t\tthis.roles.publication.flushInitial();\n\t\t\n\t}\n\t\n\tstatic handleRolesRoleUpdate(_, next) {\n\t\tif (next)\n\t\t\tthis.roles.publication.skip(next);\n\t\t\n\t}\n\t\n\tstatic handleOrgsUpdate() {\n\t\t\n\t\tthis.orgs.publication.flushInitial();\n\t\tthis.orgs.extendedPublication.flushInitial();\n\t\t\n\t}\n\t\n\tstatic handleOrgsOrgUpdate(_, next) {\n\t\tif (next) {\n\t\t\tthis.orgs.publication.skip(next);\n\t\t\tthis.orgs.extendedPublication.skip(next);\n\t\t}\n\t\t\n\t}\n\t\n\t\n\tstatic handleClientConnect(ws) {\n\t\tws.session = null;\n\t\t\n\t}\n\t\n\tstatic handleClientRequestLogin(ws, email, password) {\n\t\treturn ws.login(email, password);\n\t}\n\t\n\tstatic handleClientRequestLogout(ws) {\n\t\treturn ws.logout();\n\t}\n\t\n\tstatic handleClientClosed(ws) {\n\t\tws.session?.offline();\n\t\tws.setSession(null);\n\t\t\n\t}\n\t\n\t\n\tstatic async login(email, password) {\n\t\t\n\t\tconst { usersServer } = this.wss;\n\t\t\n\t\tconst session = await usersServer.users.login(email, password, {\n\t\t\t...usersServer.getDefaultSessionProps(this),\n\t\t\t...usersServer.getSessionProps?.(this),\n\t\t\tisOnline: true\n\t\t});\n\t\t\n\t\tif (session)\n\t\t\tthis.setSession(session);\n\t\t\n\t}\n\t\n\tstatic logout() {\n\t\tif (this.session) {\n\t\t\tthis.wss.usersServer.users.logout(this.session);\n\t\t\tthis.setSession(null);\n\t\t}\n\t\t\n\t}\n\t\n\t\n\tstatic setSession(session, shouldProlong) {\n\t\t\n\t\tconst { usersServer } = this.wss;\n\t\t\n\t\tif (typeof session == \"string\")\n\t\t\tsession = usersServer.users.sessions.get(session) ?? null;\n\t\t\n\t\tif (this.session != session) {\n\t\t\tif (this.session)\n\t\t\t\tusersServer.wsBySessions.delete(this.session);\n\t\t\t\n\t\t\tif (session) {\n\t\t\t\tthis.session = session;\n\t\t\t\tthis.user = session.user;\n\t\t\t\tthis.lastUserId = this.user._id;\n\t\t\t\t\n\t\t\t\tthis.user.webSockets.add(this);\n\t\t\t\tusersServer.wsBySessions.set(session, this);\n\t\t\t\t\n\t\t\t\tif (shouldProlong)\n\t\t\t\t\tsession.prolong({\n\t\t\t\t\t\t...usersServer.getDefaultSessionProps(this),\n\t\t\t\t\t\t...usersServer.getSessionProps?.(this),\n\t\t\t\t\t\tisOnline: true\n\t\t\t\t\t});\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tthis.user.webSockets.delete(this);\n\t\t\t\t\n\t\t\t\tthis.session = null;\n\t\t\t\tdelete this.user;\n\t\t\t}\n\t\t\t\n\t\t\tthis.wss.emit(\"client-session\", this, shouldProlong);\n\t\t}\n\t\t\n\t}\n\t\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["CollectionMapPublication", "Publication", "AbilitiesPublication", "abilities", "user", "RolesPublication", "roles", "options", "projection", "sort", "transform", "ws", "roleDoc", "involves", "inheritedAbilities", "displayTitle", "_o", "UserPublication", "users", "fieldsToUpdate", "key", "subscription", "_id", "next", "session", "isSessionIdRequired", "userDoc", "UsersPublication", "UsersExtendedPublication", "triggers", "OrgsPublication", "orgs", "orgDoc", "OrgsExtendedPublication", "ownerIds", "slaveOrgs", "UsersServer", "_UsersServer", "wss", "options", "users", "publicationOptions", "extendedPublicationOptions", "userPublicationOptions", "roles", "orgs", "getSessionProps", "rolesPublicationOptions", "orgsPublicationOptions", "orgsExtendedPublicationOptions", "user", "AbilitiesPublication", "RolesPublication", "UsersPublication", "UsersExtendedPublication", "UserPublication", "#handleSessionDelete", "OrgsPublication", "OrgsExtendedPublication", "userAgent", "remoteAddress", "_id", "isOnline", "updates", "usersSubscription", "ws", "session", "_", "next", "email", "password", "usersServer", "shouldProlong"]
7
7
  }
package/package.json CHANGED
@@ -1,40 +1,40 @@
1
1
  {
2
- "name": "insite-users-server",
3
- "version": "1.0.337",
4
- "description": "inSite users server side",
5
- "type": "module",
6
- "main": "./dist/index.js",
7
- "module": "./dist/index.js",
8
- "exports": {
9
- ".": "./dist/index.js",
10
- "./ws": "./dist/ws.js"
11
- },
12
- "packageManager": "yarn@1.22.22",
13
- "scripts": {
14
- "test": "echo \"Error: no test specified\" && exit 1",
15
- "build": "node .conveyer"
16
- },
17
- "repository": {
18
- "type": "git",
19
- "url": "git+https://github.com/nesvet/insite-users-server.git"
20
- },
21
- "keywords": [
22
- "insite",
23
- "users",
24
- "server"
25
- ],
26
- "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
27
- "license": "MIT",
28
- "dependencies": {
29
- "@nesvet/deprecated-extensions": "^1",
30
- "@nesvet/n": "^1",
31
- "argon2": "^0",
32
- "eventemitter3": "^5",
33
- "insite-db": "^1",
34
- "insite-subscriptions-server": "^1"
35
- },
36
- "devDependencies": {
37
- "@nesvet/conveyer": "^1",
38
- "@nesvet/eslint-config": "^1"
39
- }
2
+ "name": "insite-users-server",
3
+ "version": "1.0.346",
4
+ "description": "inSite users server side",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "exports": {
9
+ ".": "./dist/index.js",
10
+ "./ws": "./dist/ws.js"
11
+ },
12
+ "packageManager": "bun@1.1.8",
13
+ "scripts": {
14
+ "test": "echo \"Error: no test specified\" && exit 1",
15
+ "build": "bun .conveyer.js"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "git+https://github.com/nesvet/insite-users-server.git"
20
+ },
21
+ "keywords": [
22
+ "insite",
23
+ "users",
24
+ "server"
25
+ ],
26
+ "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
27
+ "license": "MIT",
28
+ "dependencies": {
29
+ "@nesvet/deprecated-extensions": "^1",
30
+ "@nesvet/n": "^1",
31
+ "argon2": "^0",
32
+ "eventemitter3": "^5",
33
+ "insite-db": "^1",
34
+ "insite-subscriptions-server": "^1"
35
+ },
36
+ "devDependencies": {
37
+ "@nesvet/conveyer": "^2",
38
+ "@nesvet/eslint-config": "^1"
39
+ }
40
40
  }