insite-users-server-ws 2.5.0 → 2.6.0

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.
@@ -1 +1 @@
1
- {"version":3,"file":"UsersServer.d.ts","sourceRoot":"","sources":["../src/UsersServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,KAAK,OAAO,EAAa,MAAM,qBAAqB,CAAC;AAErE,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,qBAAa,WAAW,CAAC,EAAE,SAAS,eAAe;;gBACtC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;IAQhC,GAAG,EAAG,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,EAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,iBAAiB,EAAG,OAAO,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAErD,oBAAoB,EAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAChD,gBAAgB,EAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxC,gBAAgB,EAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxC,wBAAwB,EAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;IACxD,eAAe,EAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACtC,eAAe,EAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACtC,uBAAuB,EAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACtD,mBAAmB,EAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAE9C,IAAI,CAAC,GAAU,SAAS,OAAO,CAAC,EAAE,CAAC,mBA2DjC;IAIF,SAAS;IAaT,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,OAAO;IAyF5G,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,eAAe,EAAE,EAAE,SAAS,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;CAM7I"}
1
+ {"version":3,"file":"UsersServer.d.ts","sourceRoot":"","sources":["../src/UsersServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAE,KAAK,EAAE,KAAK,OAAO,EAAa,MAAM,qBAAqB,CAAC;AAErE,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,qBAAa,WAAW,CAAC,EAAE,SAAS,eAAe;;gBACtC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;IAQhC,GAAG,EAAG,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,EAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,iBAAiB,EAAG,OAAO,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAErD,oBAAoB,EAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAChD,gBAAgB,EAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxC,gBAAgB,EAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxC,wBAAwB,EAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;IACxD,eAAe,EAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACtC,eAAe,EAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACtC,uBAAuB,EAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACtD,mBAAmB,EAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAE9C,IAAI,CAAC,GAAU,SAAS,OAAO,CAAC,EAAE,CAAC,mBA2DjC;IAIF,SAAS;IAaT,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,OAAO;IAgG5G,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,eAAe,EAAE,EAAE,SAAS,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;CAM7I"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Users as D}from"insite-users-server";import{Err as h,includesAll as g,isEmpty as q}from"@nesvet/n";import{AbilityError as p,RolesError as m,SubordinationError as b}from"insite-users-server";var R={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function W({wss:l,users:i}){let{roles:o,sessions:a,avatars:r,orgs:u,abilities:n}=i;l.onRequest("users.people.check-email",({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!R.email.test(e))throw new h("Not email","email.not");if(i.byEmail.has(e))throw new h("Email already exists","email.exists")}),l.onRequest("users.people.create",async({user:s},{roles:e,org:t,...c})=>{if(!s?.abilities.inSite?.users)throw new p;if(!e.length||!g(s.slaveRoleIds,e))throw new m(e);if(t&&!s.slaveIds.includes(t))throw new b("slaveIds",t);await i.create({roles:e,org:t,...c})}),l.onRequest("users.people.change-password",async({user:s},e,t)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);if(typeof t!="string")throw new h("Type of password is incorrect","password.wrong-type");if(!t)throw new h("Password can't be empty","password.empty");await i.changePassword(e,t)}),l.onRequest("users.people.update",async({user:s},e,t)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);if(t.roles&&(!t.roles.length||!g(s.slaveRoleIds,t.roles)))throw new m(t.roles);if(t.org&&!s.slaveIds.includes(t.org))throw new b("slaveIds",t.org);if(q(t))throw new h("Empty updates","updates.empty");await i.updateUser(e,t,s)}),l.onRequest("users.people.delete",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveIds.includes(e))throw new b("slaveIds",e);await i.deleteUser(e)}),l.onRequest("users.sessions.destroy",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(i.bySessionId.get(e)?._id))throw new b("permissiveIds",i.bySessionId.get(e)?._id);await a.destroySession(e)}),l.onTransfer?.("users.avatars.upload",{begin({user:s},{metadata:{_id:e,type:t,size:c}}){if(!s||s._id!==e&&!s.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);if(!r.TYPES_ACCEPTED.includes(t))throw new h(`Unacceptable avatar format: ${t}`,"avatar.unacceptable-format");if(c>r.MAX_SIZE)throw new h(`Avatar size exceeds limit of ${r.MAX_SIZE}: ${c}`,"avatar.size-exceeds-limit")},async end(s,{data:e,metadata:{_id:t,type:c}}){await r.save(t,c,e)}}),l.onRequest("users.avatars.delete",async({user:s},e)=>{if(!s||s._id!==e&&!s.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);await r.deleteAvatar(e)}),l.onRequest("users.orgs.create",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!e.title)throw new h("Title can't be empty","title.empty");await u.create({...e,owners:[s._id]})}),l.onRequest("users.orgs.update",async({user:s},e,t)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveIds.includes(e))throw new b("slaveIds",e);if(t.title==="")throw new h("Title can't be empty","title.empty");if(t.owners&&!g(s.slaveIds,t.owners))throw new b("slaveIds",t.owners);if(q(t))throw new h("Empty updates","updates.empty");await u.updateOrg(e,t,s)}),l.onRequest("users.orgs.delete",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveIds.includes(e))throw new b("slaveIds",e);await u.deleteOrg(e)}),l.onRequest("users.roles.check-id",({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!R.role.test(e))throw new h("Role ID is incorrect","role.not-id");if(o.has(e))throw new h("Role ID already exists","role.exists")}),l.onRequest("users.roles.create",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;await o.create(e)}),l.onRequest("users.roles.update",async({user:s},e,{abilities:t,...c})=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveRoleIds.includes(e))throw new m(e);if(c.involves&&!g(s.slaveRoleIds,c.involves))throw new m(c.involves);await o.updateRole(e,c)}),l.onRequest("users.roles.set-ability",async({user:s},e,t,c)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveRoleIds.includes(e))throw new m(e);if(!n.hasAbility(s.abilities,t))throw new p(t);await o.setAbility(e,t,c)}),l.onRequest("users.roles.set-ability-param",async({user:s},e,t,c,S)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveRoleIds.includes(e))throw new m(e);if(!n.hasAbility(s.abilities,t))throw new p(t);if(!n.isParamFits(t,c,S,n.getParam(s.abilities,t,c)))throw new h("Wrong param value","ability.wrong-param");await o.setAbilityParam(e,t,c,S)}),l.onRequest("users.roles.delete",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveRoleIds.includes(e))throw new m(e);await o.deleteRole(e)})}import{_ids as E,includesAny as L,intersection as j,pick as _}from"@nesvet/n";import{CollectionMapPublication as f,Publication as I}from"insite-subscriptions-server/ws";var A=class extends I{constructor(i){super("abilities",{fetch({user:o}){return o?.abilities.inSite?.users?.roles?{abilities:i.getSchemeFor(o.abilities)}:null}})}},w=class extends f{constructor(i,o={}){let{projection:a={title:1,description:1},sort:r={_o:1},transform:u}=o;Object.assign(a,{involves:1,abilities:1}),super(i.collection,"roles",({user:n})=>n?.abilities.inSite?.users&&{query:{_id:{$in:n.slaveRoleIds}},projection:a,sort:r},n=>{let{involves:s,abilities:e,inheritedAbilities:t,displayTitle:c,_o:S}=i.get(n._id);Object.assign(n,{...n.involves?{ownInvolves:n.involves,involves:E(s),abilities:e,inheritedAbilities:t}:{},...a.title?{displayTitle:c}:{},_o:S}),u?.(n)})}},C=new WeakMap,y=class extends I{constructor(i,o={}){let{fieldsToUpdate:a=[],projection:r,transform:u,public:n}=o;for(let e of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!r||r[e]!==0)&&a.push(e);let s=["_id","email","name","initials","displayLabel","job","avatarUrl","abilities"];n||s.push("slaveIds"),super("user",{onSubscribe(e){let[{user:t}]=e.args;if(t){let{_id:c}=t,S=d=>{if("documentKey"in d&&d.documentKey._id===c)switch(d.operationType){case"update":if(!L(Object.keys(d.updateDescription.updatedFields),a))break;case"replace":case"delete":e.changed(d)}};i.collection.onChange(S),C.set(e,S)}},fetch({user:e,session:t},c){if(e){let S=_(e,s);if(n||Object.assign(S,{orgId:e.org._id,sessionId:c?t?._id:void 0,isOnline:!0}),r)for(let d in r)r[d]&&d in e?Object.assign(S,{[d]:e[d]}):delete S[d];return u?.(S),S}return null},onUnsubscribe(e){let t=C.get(e);t&&i.collection.removeChangeListener(t)}})}},v=class extends f{constructor(i,o={}){let{projection:a={email:1,name:1,org:1,job:1,avatar:1},sort:r={"name.last":1},transform:u}=o;super(i.collection,"users",n=>n.user?.abilities.login&&{query:{},projection:a,sort:r},n=>{let s=i.get(n._id);Object.assign(n,_(s,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:n.org}),delete n.org,delete n.avatar,u?.(n)})}},O=class extends f{constructor(i,o={}){let{projection:a={_id:1},sort:r,triggers:u=[],transform:n}=o;u.includes("roles")||u.push("roles"),super(i.collection,"users.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:a,sort:r,triggers:u},(s,[e])=>{let t=i.get(s._id);Object.assign(s,{roleIds:j(t.ownRoleIds,e.user.slaveRoleIds)}),n?.(s)})}},P=class extends f{constructor(i){super(i.collection,"users.people.sessions",({user:o},a)=>o?.abilities.inSite?.users&&o.permissiveIds.includes(a)&&{query:{user:a},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},U=class extends f{constructor(i,o={}){let{projection:a={title:1},sort:r={title:1},transform:u}=o;super(i.collection,"orgs",n=>n.user?.abilities.login&&{query:{},projection:a,sort:r},n=>{let s=i.get(n._id);Object.assign(n,_(s,["initials","displayLabel"])),u?.(n)})}},x=class extends f{constructor(i,o={}){let{projection:a={note:1},sort:r={_o:1},triggers:u=[],transform:n}=o;u.includes("owners")||u.push("owners"),super(i.collection,"orgs.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:a,sort:r,triggers:u},(s,[{user:e}])=>{let t=i.get(s._id),{ownerIds:c,slaveOrgs:S,_o:d}=t;Object.assign(s,{owners:j(c,e.slaveIds),slaveOrgs:E(j(S,e.slaveOrgs)),_o:d}),n?.(s)})}};var k=class l{constructor(i){this.#i=this.init(i)}#e=new WeakMap;#s=new WeakMap;wss;users;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async i=>{let{wss:o,collections:a,users:r,public:u,publication:n,extendedPublication:s,userPublication:e,roles:t={},orgs:c={},incomingTransport:S}=i,{publication:d}=t,{publication:M,extendedPublication:$}=c;this.wss=o,this.users=r instanceof D?r:await D.init(a,r),this.incomingTransport=S;for(let F of this.users.values())this.#o(F);return u||(this.abilitiesPublication=new A(this.users.abilities),this.rolesPublication=new w(this.users.roles,d),this.usersPublication=new v(this.users,n),this.usersExtendedPublication=new O(this.users,s),this.orgsPublication=new U(this.users.orgs,M),this.orgsExtendedPublication=new x(this.users.orgs,$),this.sessionsPublication=new P(this.users.sessions),this.users.on("user-is-online",this.#n),W(this)),this.userPublication=new y(this.users,{public:u,...e}),this.users.on("user-create",this.#o),this.users.on("session-delete",this.#r),this.users.on("user-permissions-change",this.#a),this.wss.onRequest("login",this.#l),this.wss.onRequest("logout",this.#c),this.wss.on("client-close",this.#u),this};#i;whenReady(){return this.#i}#t({userAgent:i,remoteAddress:o,sessionProps:a}){return{userAgent:i,remoteAddress:o,...a,isOnline:!0}}setSession(i,o,a){o===null?o=void 0:typeof o=="string"&&(o=this.users.sessions.get(o)),i.session!==o&&(i.session&&this.#s.delete(i.session),o&&!i.isRejected?(i.session=o,i.user=o.user,i.lastUserId=o.user._id,this.#e.get(o.user)?.add(i),this.#s.set(o,i),a&&o.prolong(this.#t(i))):(delete i.session,delete i.user,this.#e.get(i.user)?.delete(i)),this.wss.emit("client-session",i,a))}#o=i=>this.#e.set(i,new Set);#n=({_id:i,isOnline:o})=>{let a={_id:i,isOnline:o};for(let r of this.usersPublication.subscriptions){let[u]=r.args;u.user&&u.user._id!==i&&r.handler([["u",a,!0]])}};#r=i=>{let o=this.#s.get(i);o&&this.setSession(o,null)};#a=i=>{let o=this.#e.get(i);o&&this.wss.emit("should-renew-subscriptions",[...o])};#l=async(i,o,a)=>{if(!i.isRejected){let r=await this.users.login(o,a,this.#t(i));r&&this.setSession(i,r)}};#c=async i=>{i.session&&(await this.users.logout(i.session),this.setSession(i,null))};#u=async i=>{await i.session?.offline(),this.setSession(i,null)};static init(i){return new l(i).whenReady()}};import{WSServerClient as z}from"insite-ws/server";var T=class extends z{isRejected;sessionProps;user;lastUserId;session};export{k as UsersServer,T as WSSCWithUser};
1
+ import{Users as D}from"insite-users-server";import{Err as h,includesAll as g,isEmpty as W}from"@nesvet/n";import{AbilityError as u,RolesError as m,SubordinationError as b}from"insite-users-server";var R={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function q({wss:l,users:i}){let{roles:o,sessions:a,avatars:n,orgs:S,abilities:r}=i;l.onRequest("users.people.check-email",({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new u;if(!R.email.test(e))throw new h("Not email","email.not");if(i.byEmail.has(e))throw new h("Email already exists","email.exists")}),l.onRequest("users.people.create",async({user:s},{roles:e,org:t,...c})=>{if(!s?.abilities.inSite?.users)throw new u;if(!e.length||!g(s.slaveRoleIds,e))throw new m(e);if(t&&!s.slaveIds.includes(t))throw new b("slaveIds",t);await i.create({roles:e,org:t,...c})}),l.onRequest("users.people.change-password",async({user:s},e,t)=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);if(typeof t!="string")throw new h("Type of password is incorrect","password.wrong-type");if(!t)throw new h("Password can't be empty","password.empty");await i.changePassword(e,t)}),l.onRequest("users.people.update",async({user:s},e,t)=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);if(t.roles&&(!t.roles.length||!g(s.slaveRoleIds,t.roles)))throw new m(t.roles);if(t.org&&!s.slaveIds.includes(t.org))throw new b("slaveIds",t.org);if(W(t))throw new h("Empty updates","updates.empty");await i.updateUser(e,t,s)}),l.onRequest("users.people.delete",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.slaveIds.includes(e))throw new b("slaveIds",e);await i.deleteUser(e)}),l.onRequest("users.sessions.destroy",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.permissiveIds.includes(i.bySessionId.get(e)?._id))throw new b("permissiveIds",i.bySessionId.get(e)?._id);await a.destroySession(e)}),l.onTransfer?.("users.avatars.upload",{begin({user:s},{metadata:{_id:e,type:t,size:c}}){if(!s||s._id!==e&&!s.abilities.inSite?.users)throw new u;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);if(!n.TYPES_ACCEPTED.includes(t))throw new h(`Unacceptable avatar format: ${t}`,"avatar.unacceptable-format");if(c>n.MAX_SIZE)throw new h(`Avatar size exceeds limit of ${n.MAX_SIZE}: ${c}`,"avatar.size-exceeds-limit")},async end(s,{data:e,metadata:{_id:t,type:c}}){await n.save(t,c,e)}}),l.onRequest("users.avatars.delete",async({user:s},e)=>{if(!s||s._id!==e&&!s.abilities.inSite?.users)throw new u;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);await n.deleteAvatar(e)}),l.onRequest("users.orgs.create",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new u;if(!e.title)throw new h("Title can't be empty","title.empty");await S.create({...e,owners:[s._id]})}),l.onRequest("users.orgs.update",async({user:s},e,t)=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.slaveIds.includes(e))throw new b("slaveIds",e);if(t.title==="")throw new h("Title can't be empty","title.empty");if(t.owners&&!g(s.slaveIds,t.owners))throw new b("slaveIds",t.owners);if(W(t))throw new h("Empty updates","updates.empty");await S.updateOrg(e,t,s)}),l.onRequest("users.orgs.delete",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.slaveIds.includes(e))throw new b("slaveIds",e);await S.deleteOrg(e)}),l.onRequest("users.roles.check-id",({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new u;if(!R.role.test(e))throw new h("Role ID is incorrect","role.not-id");if(o.has(e))throw new h("Role ID already exists","role.exists")}),l.onRequest("users.roles.create",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new u;await o.create(e)}),l.onRequest("users.roles.update",async({user:s},e,{abilities:t,...c})=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.slaveRoleIds.includes(e))throw new m(e);if(c.involves&&!g(s.slaveRoleIds,c.involves))throw new m(c.involves);await o.updateRole(e,c)}),l.onRequest("users.roles.set-ability",async({user:s},e,t,c)=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.slaveRoleIds.includes(e))throw new m(e);if(!r.hasAbility(s.abilities,t))throw new u(t);await o.setAbility(e,t,c)}),l.onRequest("users.roles.set-ability-param",async({user:s},e,t,c,p)=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.slaveRoleIds.includes(e))throw new m(e);if(!r.hasAbility(s.abilities,t))throw new u(t);if(!r.isParamFits(t,c,p,r.getParam(s.abilities,t,c)))throw new h("Wrong param value","ability.wrong-param");await o.setAbilityParam(e,t,c,p)}),l.onRequest("users.roles.delete",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new u;if(!s.slaveRoleIds.includes(e))throw new m(e);await o.deleteRole(e)})}import{_ids as E,includesAny as L,intersection as j,pick as _}from"@nesvet/n";import{CollectionMapPublication as f,Publication as I}from"insite-subscriptions-server/ws";var A=class extends I{constructor(i){super("abilities",{fetch({user:o}){return o?.abilities.inSite?.users?.roles?{abilities:i.getSchemeFor(o.abilities)}:null}})}},w=class extends f{constructor(i,o={}){let{projection:a={title:1,description:1},sort:n={_o:1},transform:S}=o;Object.assign(a,{involves:1,abilities:1}),super(i.collection,"roles",({user:r})=>r?.abilities.inSite?.users&&{query:{_id:{$in:r.slaveRoleIds}},projection:a,sort:n},r=>{let{involves:s,abilities:e,inheritedAbilities:t,displayTitle:c,_o:p}=i.get(r._id);Object.assign(r,{...r.involves?{ownInvolves:r.involves,involves:E(s),abilities:e,inheritedAbilities:t}:{},...a.title?{displayTitle:c}:{},_o:p}),S?.(r)})}},C=new WeakMap,y=class extends I{constructor(i,o={}){let{fieldsToUpdate:a=[],projection:n,transform:S,public:r}=o;for(let e of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!n||n[e]!==0)&&a.push(e);let s=["_id","email","name","initials","displayLabel","job","avatarUrl","abilities"];r||s.push("slaveIds"),super("user",{onSubscribe(e){let[{user:t}]=e.args;if(t){let{_id:c}=t,p=d=>{if("documentKey"in d&&d.documentKey._id===c)switch(d.operationType){case"update":if(!L(Object.keys(d.updateDescription.updatedFields),a))break;case"replace":case"delete":e.changed(d)}};i.collection.onChange(p),C.set(e,p)}},fetch({user:e,session:t},c){if(e){let p=_(e,s);if(r||Object.assign(p,{orgId:e.org._id,sessionId:c?t?._id:void 0,isOnline:!0}),n)for(let d in n)n[d]&&d in e?Object.assign(p,{[d]:e[d]}):delete p[d];return S?.(p),p}return null},onUnsubscribe(e){let t=C.get(e);t&&i.collection.removeChangeListener(t)}})}},v=class extends f{constructor(i,o={}){let{projection:a={email:1,name:1,org:1,job:1,avatar:1},sort:n={"name.last":1},transform:S}=o;super(i.collection,"users",r=>r.user?.abilities.login&&{query:{},projection:a,sort:n},r=>{let s=i.get(r._id);Object.assign(r,_(s,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:r.org}),delete r.org,delete r.avatar,S?.(r)})}},O=class extends f{constructor(i,o={}){let{projection:a={_id:1},sort:n,triggers:S=[],transform:r}=o;S.includes("roles")||S.push("roles"),super(i.collection,"users.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:a,sort:n,triggers:S},(s,[e])=>{let t=i.get(s._id);Object.assign(s,{roleIds:j(t.ownRoleIds,e.user.slaveRoleIds)}),r?.(s)})}},P=class extends f{constructor(i){super(i.collection,"users.people.sessions",({user:o},a)=>o?.abilities.inSite?.users&&o.permissiveIds.includes(a)&&{query:{user:a},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},U=class extends f{constructor(i,o={}){let{projection:a={title:1},sort:n={title:1},transform:S}=o;super(i.collection,"orgs",r=>r.user?.abilities.login&&{query:{},projection:a,sort:n},r=>{let s=i.get(r._id);Object.assign(r,_(s,["initials","displayLabel"])),S?.(r)})}},x=class extends f{constructor(i,o={}){let{projection:a={note:1},sort:n={_o:1},triggers:S=[],transform:r}=o;S.includes("owners")||S.push("owners"),super(i.collection,"orgs.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:a,sort:n,triggers:S},(s,[{user:e}])=>{let t=i.get(s._id),{ownerIds:c,slaveOrgs:p,_o:d}=t;Object.assign(s,{owners:j(c,e.slaveIds),slaveOrgs:E(j(p,e.slaveOrgs)),_o:d}),r?.(s)})}};var k=class l{constructor(i){this.#i=this.init(i)}#e=new WeakMap;#s=new WeakMap;wss;users;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async i=>{let{wss:o,collections:a,users:n,public:S,publication:r,extendedPublication:s,userPublication:e,roles:t={},orgs:c={},incomingTransport:p}=i,{publication:d}=t,{publication:M,extendedPublication:$}=c;this.wss=o,this.users=n instanceof D?n:await D.init(a,n),this.incomingTransport=p;for(let F of this.users.values())this.#o(F);return S||(this.abilitiesPublication=new A(this.users.abilities),this.rolesPublication=new w(this.users.roles,d),this.usersPublication=new v(this.users,r),this.usersExtendedPublication=new O(this.users,s),this.orgsPublication=new U(this.users.orgs,M),this.orgsExtendedPublication=new x(this.users.orgs,$),this.sessionsPublication=new P(this.users.sessions),this.users.on("user-is-online",this.#n),q(this)),this.userPublication=new y(this.users,{public:S,...e}),this.users.on("user-create",this.#o),this.users.on("session-delete",this.#r),this.users.on("user-permissions-change",this.#a),this.wss.onRequest("login",this.#l),this.wss.onRequest("logout",this.#c),this.wss.on("client-close",this.#S),this};#i;whenReady(){return this.#i}#t({userAgent:i,remoteAddress:o,sessionProps:a}){return{userAgent:i,remoteAddress:o,...a,isOnline:!0}}setSession(i,o,a){if(o===null?o=void 0:typeof o=="string"&&(o=this.users.sessions.get(o)),i.session!==o){if(i.session&&this.#s.get(i.session)?.delete(i),o&&!i.isRejected){i.session=o,i.user=o.user,i.lastUserId=o.user._id,this.#e.get(o.user)?.add(i);let n=this.#s.get(o)??new Set;n.add(i),this.#s.set(o,n),a&&o.prolong(this.#t(i))}else{let{user:n}=i;delete i.session,delete i.user,n&&this.#e.get(n)?.delete(i)}this.wss.emit("client-session",i,a)}}#o=i=>this.#e.set(i,new Set);#n=({_id:i,isOnline:o})=>{let a={_id:i,isOnline:o};for(let n of this.usersPublication.subscriptions){let[S]=n.args;S.user&&S.user._id!==i&&n.handler([["u",a,!0]])}};#r=i=>{let o=this.#s.get(i);if(o)for(let a of o)this.setSession(a,null)};#a=i=>{let o=this.#e.get(i);o&&this.wss.emit("should-renew-subscriptions",[...o])};#l=async(i,o,a)=>{if(!i.isRejected){let n=await this.users.login(o,a,this.#t(i));n&&this.setSession(i,n)}};#c=async i=>{i.session&&(await this.users.logout(i.session),this.setSession(i,null))};#S=async i=>{await i.session?.offline(),this.setSession(i,null)};static init(i){return new l(i).whenReady()}};import{WSServerClient as z}from"insite-ws/server";var T=class extends z{isRejected;sessionProps;user;lastUserId;session};export{k as UsersServer,T as WSSCWithUser};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/UsersServer.ts", "../src/handlers.ts", "../src/regexps.ts", "../src/publications.ts", "../src/WSSCWithUser.ts"],
4
- "sourcesContent": ["import type { AbilitiesSchema } from \"insite-common\";\nimport { Users, type Session, type User } from \"insite-users-server\";\nimport { setupHandlers } from \"./handlers\";\nimport {\n\tAbilitiesPublication,\n\tOrgsExtendedPublication,\n\tOrgsPublication,\n\tRolesPublication,\n\tSessionsPublication,\n\tUserPublication,\n\tUsersExtendedPublication,\n\tUsersPublication\n} from \"./publications\";\nimport type { OmitRedundant, Options } from \"./types\";\nimport type { WSSCWithUser } from \"./WSSCWithUser\";\n\n\nexport class UsersServer<AS extends AbilitiesSchema> {\n\tconstructor(options: Options<AS>) {\n\t\tthis.#initPromise = this.init!(options);\n\t\t\n\t}\n\t\n\t#userWsMap = new WeakMap<User<AS>, Set<WSSCWithUser<AS>>>();\n\t#sessionsWsMap = new WeakMap<Session<AS>, WSSCWithUser<AS>>();\n\t\n\twss!: Options<AS>[\"wss\"];\n\tusers!: Users<AS>;\n\tincomingTransport!: Options<AS>[\"incomingTransport\"];\n\t\n\tabilitiesPublication!: AbilitiesPublication<AS>;\n\trolesPublication!: RolesPublication<AS>;\n\tusersPublication!: UsersPublication<AS>;\n\tusersExtendedPublication!: UsersExtendedPublication<AS>;\n\tuserPublication!: UserPublication<AS>;\n\torgsPublication!: OrgsPublication<AS>;\n\torgsExtendedPublication!: OrgsExtendedPublication<AS>;\n\tsessionsPublication!: SessionsPublication<AS>;\n\t\n\tinit? = async (options: Options<AS>) => {\n\t\t\n\t\tconst {\n\t\t\twss,\n\t\t\tcollections,\n\t\t\tusers,\n\t\t\tpublic: isPublic,\n\t\t\tpublication: publicationOptions,\n\t\t\textendedPublication: extendedPublicationOptions,\n\t\t\tuserPublication: userPublicationOptions,\n\t\t\troles: rolesOptions = {},\n\t\t\torgs: orgsOptions = {},\n\t\t\tincomingTransport\n\t\t} = options;\n\t\t\n\t\tconst {\n\t\t\tpublication: rolesPublicationOptions\n\t\t} = rolesOptions;\n\t\t\n\t\tconst {\n\t\t\tpublication: orgsPublicationOptions,\n\t\t\textendedPublication: orgsExtendedPublicationOptions\n\t\t} = orgsOptions;\n\t\t\n\t\tthis.wss = wss;\n\t\tthis.users = users instanceof Users ? users : await Users.init(collections!, users);\n\t\tthis.incomingTransport = incomingTransport;\n\t\t\n\t\tfor (const user of this.users.values())\n\t\t\tthis.#handleUserCreate(user);\n\t\t\n\t\tif (!isPublic) {\n\t\t\tthis.abilitiesPublication = new AbilitiesPublication<AS>(this.users.abilities);\n\t\t\tthis.rolesPublication = new RolesPublication<AS>(this.users.roles, rolesPublicationOptions);\n\t\t\tthis.usersPublication = new UsersPublication<AS>(this.users, publicationOptions);\n\t\t\tthis.usersExtendedPublication = new UsersExtendedPublication<AS>(this.users, extendedPublicationOptions);\n\t\t\tthis.orgsPublication = new OrgsPublication<AS>(this.users.orgs, orgsPublicationOptions);\n\t\t\tthis.orgsExtendedPublication = new OrgsExtendedPublication<AS>(this.users.orgs, orgsExtendedPublicationOptions);\n\t\t\tthis.sessionsPublication = new SessionsPublication<AS>(this.users.sessions);\n\t\t\t\n\t\t\tthis.users.on(\"user-is-online\", this.#handleUserIsOnline);\n\t\t\t\n\t\t\tsetupHandlers<AS>(this);\n\t\t}\n\t\t\n\t\tthis.userPublication = new UserPublication<AS>(this.users, {\n\t\t\tpublic: isPublic,\n\t\t\t...userPublicationOptions\n\t\t});\n\t\t\n\t\tthis.users.on(\"user-create\", this.#handleUserCreate);\n\t\tthis.users.on(\"session-delete\", this.#handleSessionDelete);\n\t\tthis.users.on(\"user-permissions-change\", this.#handleUserPermissionsChange);\n\t\t\n\t\tthis.wss.onRequest(\"login\", this.#handleClientRequestLogin);\n\t\tthis.wss.onRequest(\"logout\", this.#handleClientRequestLogout);\n\t\tthis.wss.on(\"client-close\", this.#handleClientClosed);\n\t\t\n\t\treturn this;\n\t};\n\t\n\t#initPromise;\n\t\n\twhenReady() {\n\t\treturn this.#initPromise;\n\t}\n\t\n\t#makeSessionProps({ userAgent, remoteAddress, sessionProps }: WSSCWithUser<AS>) {\n\t\treturn {\n\t\t\tuserAgent,\n\t\t\tremoteAddress,\n\t\t\t...sessionProps,\n\t\t\tisOnline: true\n\t\t};\n\t}\n\t\n\tsetSession(wssc: WSSCWithUser<AS>, session: Session<AS> | string | null | undefined, shouldProlong?: boolean) {\n\t\tif (session === null)\n\t\t\tsession = undefined;\n\t\telse if (typeof session == \"string\")\n\t\t\tsession = this.users.sessions.get(session);\n\t\t\n\t\tif (wssc.session !== session) {\n\t\t\tif (wssc.session)\n\t\t\t\tthis.#sessionsWsMap.delete(wssc.session);\n\t\t\t\n\t\t\tif (session && !wssc.isRejected) {\n\t\t\t\twssc.session = session;\n\t\t\t\twssc.user = session.user;\n\t\t\t\twssc.lastUserId = session.user._id;\n\t\t\t\t\n\t\t\t\tthis.#userWsMap.get(session.user)?.add(wssc);\n\t\t\t\tthis.#sessionsWsMap.set(session, wssc);\n\t\t\t\t\n\t\t\t\tif (shouldProlong)\n\t\t\t\t\tvoid session.prolong(this.#makeSessionProps(wssc));\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tdelete wssc.session;\n\t\t\t\tdelete wssc.user;\n\t\t\t\t\n\t\t\t\tthis.#userWsMap.get(wssc.user!)?.delete(wssc);\n\t\t\t}\n\t\t\t\n\t\t\tthis.wss.emit(\"client-session\", wssc, shouldProlong);\n\t\t}\n\t\t\n\t}\n\t\n\t#handleUserCreate = (user: User<AS>) =>\n\t\tthis.#userWsMap.set(user, new Set<WSSCWithUser<AS>>());\n\t\n\t#handleUserIsOnline = ({ _id, isOnline }: User<AS>) => {\n\t\tconst updates = { _id, isOnline };\n\t\t\n\t\tfor (const usersSubscription of this.usersPublication.subscriptions) {\n\t\t\tconst [ wssc ] = usersSubscription.args;\n\t\t\tif (wssc.user && wssc.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: Session<AS>) => {\n\t\tconst wssc = this.#sessionsWsMap.get(session);\n\t\t\n\t\tif (wssc)\n\t\t\tthis.setSession(wssc, null);\n\t\t\n\t};\n\t\n\t#handleUserPermissionsChange = (user: User<AS>) => {\n\t\tconst webSockets = this.#userWsMap.get(user);\n\t\t\n\t\tif (webSockets)\n\t\t\tthis.wss.emit(\"should-renew-subscriptions\", [ ...webSockets ]);\n\t\t\n\t};\n\t\n\t#handleClientRequestLogin = async (wssc: WSSCWithUser<AS>, email: string, password: string) => {\n\t\tif (!wssc.isRejected) {\n\t\t\tconst session = await this.users.login(email, password, this.#makeSessionProps(wssc));\n\t\t\t\n\t\t\tif (session)\n\t\t\t\tthis.setSession(wssc, session);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleClientRequestLogout = async (wssc: WSSCWithUser<AS>) => {\n\t\tif (wssc.session) {\n\t\t\tawait this.users.logout(wssc.session);\n\t\t\t\n\t\t\tthis.setSession(wssc, null);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleClientClosed = async (wssc: WSSCWithUser<AS>) => {\n\t\tawait wssc.session?.offline();\n\t\tthis.setSession(wssc, null);\n\t\t\n\t};\n\t\n\t\n\tstatic init<IAS extends AbilitiesSchema, IO extends Options<IAS>, IUS extends UsersServer<IAS>>(options: IO): Promise<OmitRedundant<IUS, IO>> {\n\t\tconst usersServer = new UsersServer(options) as IUS;\n\t\t\n\t\treturn usersServer.whenReady();\n\t}\n\t\n}\n", "import {\n\t_ids,\n\tErr,\n\tincludesAll,\n\tisEmpty\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport {\n\tAbilityError,\n\tRolesError,\n\tSubordinationError,\n\ttype AbilityParam,\n\ttype OrgDoc,\n\ttype RoleDoc,\n\ttype UserDoc\n} from \"insite-users-server\";\nimport { regexps } from \"./regexps\";\nimport type { UsersServer } from \"./UsersServer\";\n\n\nexport function setupHandlers<AS extends AbilitiesSchema>({ wss, users }: UsersServer<AS>) {\n\t\n\tconst {\n\t\troles,\n\t\tsessions,\n\t\tavatars,\n\t\torgs,\n\t\tabilities\n\t} = users;\n\t\n\t\n\t/* Users */\n\t\n\twss.onRequest(\"users.people.check-email\", ({ user }, email: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!regexps.email.test(email))\n\t\t\tthrow new Err(\"Not email\", \"email.not\");\n\t\t\n\t\tif (users.byEmail.has(email))\n\t\t\tthrow new Err(\"Email already exists\", \"email.exists\");\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.create\", async ({ user }, { roles: roleIds, org: orgId, ...rest }: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!roleIds.length || !includesAll(user.slaveRoleIds, roleIds))\n\t\t\tthrow new RolesError(roleIds);\n\t\t\n\t\tif (orgId && !user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tawait users.create({ roles: roleIds, org: orgId, ...rest });\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.change-password\", async ({ user }, userId: string, newPassword: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", userId);\n\t\t\n\t\tif (typeof newPassword != \"string\")\n\t\t\tthrow new Err(\"Type of password is incorrect\", \"password.wrong-type\");\n\t\t\n\t\tif (!newPassword)\n\t\t\tthrow new Err(\"Password can't be empty\", \"password.empty\");\n\t\t\n\t\tawait users.changePassword(userId, newPassword);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.update\", async ({ user }, userId: string, updates: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", userId);\n\t\t\n\t\tif (updates.roles && (!updates.roles.length || !includesAll(user.slaveRoleIds, updates.roles)))\n\t\t\tthrow new RolesError(updates.roles);\n\t\t\n\t\tif (updates.org && !user.slaveIds.includes(updates.org))\n\t\t\tthrow new SubordinationError(\"slaveIds\", updates.org);\n\t\t\n\t\tif (isEmpty(updates))\n\t\t\tthrow new Err(\"Empty updates\", \"updates.empty\");\n\t\t\n\t\tawait users.updateUser(userId, updates, user);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.delete\", async ({ user }, userId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", userId);\n\t\t\n\t\tawait users.deleteUser(userId);\n\t\t\n\t});\n\t\n\t\n\t/* Sessions */\n\t\n\twss.onRequest(\"users.sessions.destroy\", async ({ user }, sessionId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(users.bySessionId.get(sessionId)?._id))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", users.bySessionId.get(sessionId)?._id);\n\t\t\n\t\tawait sessions.destroySession(sessionId);\n\t\t\n\t});\n\t\n\t\n\t/* Avatars */\n\t\n\twss.onTransfer?.(\"users.avatars.upload\", {\n\t\t\n\t\tbegin({ user }, { metadata: { _id, type, size } }) {\n\t\t\tif (!user || (user._id !== _id && !user.abilities.inSite?.users))\n\t\t\t\tthrow new AbilityError();\n\t\t\t\n\t\t\tif (!user.permissiveIds.includes(_id as string))\n\t\t\t\tthrow new SubordinationError(\"permissiveIds\", _id as string);\n\t\t\t\n\t\t\tif (!avatars.TYPES_ACCEPTED.includes(type as string))\n\t\t\t\tthrow new Err(`Unacceptable avatar format: ${type as string}`, \"avatar.unacceptable-format\");\n\t\t\t\n\t\t\tif (size as number > avatars.MAX_SIZE)\n\t\t\t\tthrow new Err(`Avatar size exceeds limit of ${avatars.MAX_SIZE}: ${size as number}`, \"avatar.size-exceeds-limit\");\n\t\t\t\n\t\t},\n\t\t\n\t\tasync end(_, { data, metadata: { _id, type } }) {\n\t\t\tawait avatars.save(_id as string, type as string, data as string);\n\t\t\t\n\t\t}\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.avatars.delete\", async ({ user }, _id: string) => {\n\t\tif (!user || (user._id !== _id && !user.abilities.inSite?.users))\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(_id))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", _id);\n\t\t\n\t\tawait avatars.deleteAvatar(_id);\n\t\t\n\t});\n\t\n\t\n\t/* Orgs */\n\t\n\twss.onRequest(\"users.orgs.create\", async ({ user }, org: Omit<OrgDoc, \"_id\" | \"createdAt\" | \"owners\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!org.title)\n\t\t\tthrow new Err(\"Title can't be empty\", \"title.empty\");\n\t\t\n\t\tawait orgs.create({ ...org, owners: [ user._id ] });\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.orgs.update\", async ({ user }, orgId, updates: Omit<OrgDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tif (updates.title === \"\")\n\t\t\tthrow new Err(\"Title can't be empty\", \"title.empty\");\n\t\t\n\t\tif (updates.owners && !includesAll(user.slaveIds, updates.owners))\n\t\t\tthrow new SubordinationError(\"slaveIds\", updates.owners);\n\t\t\n\t\tif (isEmpty(updates))\n\t\t\tthrow new Err(\"Empty updates\", \"updates.empty\");\n\t\t\n\t\tawait orgs.updateOrg(orgId, updates, user);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.orgs.delete\", async ({ user }, orgId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tawait orgs.deleteOrg(orgId);\n\t\t\n\t});\n\t\n\t\n\t/* Roles */\n\t\n\twss.onRequest(\"users.roles.check-id\", ({ user }, roleId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!regexps.role.test(roleId))\n\t\t\tthrow new Err(\"Role ID is incorrect\", \"role.not-id\");\n\t\t\n\t\tif (roles.has(roleId))\n\t\t\tthrow new Err(\"Role ID already exists\", \"role.exists\");\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.create\", async ({ user }, role: Omit<RoleDoc, \"abilities\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tawait roles.create(role);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.update\", async ({ user }, roleId: string, { abilities: _abilities, ...updates }: Omit<RoleDoc, \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (updates.involves && !includesAll(user.slaveRoleIds, updates.involves))\n\t\t\tthrow new RolesError(updates.involves);\n\t\t\n\t\tawait roles.updateRole(roleId, updates);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.set-ability\", async ({ user }, roleId: string, abilityLongId: string, set: boolean) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (!abilities.hasAbility(user.abilities, abilityLongId))\n\t\t\tthrow new AbilityError(abilityLongId);\n\t\t\n\t\tawait roles.setAbility(roleId, abilityLongId, set);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.set-ability-param\", async ({ user }, roleId: string, abilityLongId: string, paramId: string, value: AbilityParam) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (!abilities.hasAbility(user.abilities, abilityLongId))\n\t\t\tthrow new AbilityError(abilityLongId);\n\t\t\n\t\tif (!abilities.isParamFits(abilityLongId, paramId, value, abilities.getParam(user.abilities, abilityLongId, paramId)))\n\t\t\tthrow new Err(\"Wrong param value\", \"ability.wrong-param\");\n\t\t\n\t\tawait roles.setAbilityParam(roleId, abilityLongId, paramId, value);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.delete\", async ({ user }, roleId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tawait roles.deleteRole(roleId);\n\t\t\n\t});\n\t\n}\n", "export const regexps = {\n\temail: /^[^\\s@]{1,63}@[^\\s@]{1,63}\\.[^\\s@]{1,63}$/,\n\trole: /^[\\d_a-z-]{1,64}$/\n};\n", "import {\n\t_ids,\n\tincludesAny,\n\tintersection,\n\tpick\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport { ChangeStreamDocument, Sort } from \"insite-db\";\nimport { CollectionMapPublication, Projection, Publication } from \"insite-subscriptions-server/ws\";\nimport type {\n\tAbilitiesMap,\n\tOrgDoc,\n\tOrgs,\n\tRoleDoc,\n\tRoles,\n\tSession,\n\tSessionDoc,\n\tSessions,\n\tUser,\n\tUserDoc,\n\tUsers\n} from \"insite-users-server\";\n\n\nexport class AbilitiesPublication<AS extends AbilitiesSchema> extends Publication<AS, [], User<AS>, Session<AS>> {\n\tconstructor(abilities: AbilitiesMap<AS>) {\n\t\tsuper(\"abilities\", {\n\t\t\t\n\t\t\tfetch({ user }) {\n\t\t\t\tif (user?.abilities.inSite?.users?.roles)\n\t\t\t\t\treturn { abilities: abilities.getSchemeFor(user.abilities) };\n\t\t\t\t\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t});\n\t}\n}\n\n\nexport type RolesPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (roleDoc: object) => void;\n};\n\nexport class RolesPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, RoleDoc, [], User<AS>, Session<AS>> {\n\tconstructor(roles: Roles<AS>, options: RolesPublicationOptions = {}) {\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.collection, \"roles\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: 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\tObject.assign(roleDoc, {\n\t\t\t\t...roleDoc.involves ? {\n\t\t\t\t\townInvolves: roleDoc.involves,\n\t\t\t\t\tinvolves: _ids(involves),\n\t\t\t\t\tabilities,\n\t\t\t\t\tinheritedAbilities\n\t\t\t\t} : {},\n\t\t\t\t...projection.title ? { displayTitle } : {},\n\t\t\t\t_o\n\t\t\t});\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\nconst userSubscriptionChangeListenerMap = new WeakMap<object, (next: ChangeStreamDocument<UserDoc>) => void>();\n\nexport type UserPublicationOptions = {\n\tfieldsToUpdate?: string[];\n\tprojection?: Projection;\n\ttransform?: (userDoc: object) => void;\n\tpublic?: boolean;\n};\n\nexport class UserPublication<AS extends AbilitiesSchema> extends Publication<AS, [ boolean ], User<AS>, Session<AS>> {\n\tconstructor(users: Users<AS>, options: UserPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tfieldsToUpdate = [],\n\t\t\tprojection,\n\t\t\ttransform,\n\t\t\tpublic: isPublic\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] as const)\n\t\t\tif (!projection || projection[key] !== 0)\n\t\t\t\tfieldsToUpdate.push(key);\n\t\t\n\t\tconst fieldsToPick: (keyof User<AS>)[] = [\n\t\t\t\"_id\",\n\t\t\t\"email\",\n\t\t\t\"name\",\n\t\t\t\"initials\",\n\t\t\t\"displayLabel\",\n\t\t\t\"job\",\n\t\t\t\"avatarUrl\",\n\t\t\t\"abilities\"\n\t\t];\n\t\t\n\t\tif (!isPublic)\n\t\t\tfieldsToPick.push(\"slaveIds\");\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\tconst changeListener = (next: ChangeStreamDocument<UserDoc>) => {\n\t\t\t\t\t\tif (\"documentKey\" in next && 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 (!includesAny(Object.keys(next.updateDescription.updatedFields!), 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\tvoid subscription.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.onChange(changeListener);\n\t\t\t\t\t\n\t\t\t\t\tuserSubscriptionChangeListenerMap.set(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 = pick(user, fieldsToPick);\n\t\t\t\t\t\n\t\t\t\t\tif (!isPublic)\n\t\t\t\t\t\tObject.assign(userDoc, {\n\t\t\t\t\t\t\torgId: user.org._id,\n\t\t\t\t\t\t\tsessionId: isSessionIdRequired ? session?._id : undefined,\n\t\t\t\t\t\t\tisOnline: true\n\t\t\t\t\t\t});\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] && key in user)\n\t\t\t\t\t\t\t\tObject.assign(userDoc, { [key]: user[key as keyof typeof user] });\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdelete userDoc[key as keyof typeof userDoc];\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\t\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t\n\t\t\tonUnsubscribe(subscription) {\n\t\t\t\tconst changeListener = userSubscriptionChangeListenerMap.get(subscription);\n\t\t\t\t\n\t\t\t\tif (changeListener)\n\t\t\t\t\tusers.collection.removeChangeListener(changeListener);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\n\nexport type UsersPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (userDoc: object) => void;\n};\n\nexport class UsersPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc, [], User<AS>, Session<AS>> {\n\tconstructor(users: Users<AS>, options: UsersPublicationOptions = {}) {\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.collection, \"users\", wssc => wssc.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\tconst user = users.get(userDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(\n\t\t\t\tuserDoc,\n\t\t\t\tpick(user, [\n\t\t\t\t\t\"initials\",\n\t\t\t\t\t\"displayLabel\",\n\t\t\t\t\t\"avatarUrl\",\n\t\t\t\t\t\"isOnline\"\n\t\t\t\t]),\n\t\t\t\t{ orgId: userDoc.org }\n\t\t\t);\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\n\nexport type UsersExtendedPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttriggers?: string[];\n\ttransform?: (userDoc: object) => void;\n};\n\nexport class UsersExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc, [], User<AS>, Session<AS>> {\n\tconstructor(users: Users<AS>, options: UsersExtendedPublicationOptions = {}) {\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.collection, \"users.extended\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (userDoc, [ wssc ]) => {\n\t\t\tconst user = users.get(userDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(userDoc, {\n\t\t\t\troleIds: intersection(user.ownRoleIds, wssc.user!.slaveRoleIds)\n\t\t\t});\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 SessionsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, SessionDoc, [ string ], User<AS>, Session<AS>> {\n\tconstructor(sessions: Sessions<AS>) {\n\t\tsuper(sessions.collection, \"users.people.sessions\", ({ user }, userId) =>\n\t\t\tuser?.abilities.inSite?.users && user.permissiveIds.includes(userId) && {\n\t\t\t\tquery: { user: userId },\n\t\t\t\tprojection: { remoteAddress: 1, isOnline: 1, prolongedAt: 1 },\n\t\t\t\tsort: { prolongedAt: -1 }\n\t\t\t}\n\t\t);\n\t}\n}\n\n\nexport type OrgsPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (orgDoc: object) => void;\n};\n\nexport class OrgsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc, [], User<AS>, Session<AS>> {\n\tconstructor(orgs: Orgs<AS>, options: OrgsPublicationOptions = {}) {\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.collection, \"orgs\", wssc => wssc.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, orgDoc => {\n\t\t\tconst org = orgs.get(orgDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(orgDoc, pick(org, [ \"initials\", \"displayLabel\" ]));\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\n\nexport type OrgsExtendedPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttriggers?: string[];\n\ttransform?: (orgDoc: object) => void;\n};\n\nexport class OrgsExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc, [], User<AS>, Session<AS>> {\n\tconstructor(orgs: Orgs<AS>, options: OrgsExtendedPublicationOptions = {}) {\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.collection, \"orgs.extended\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (orgDoc, [ { user } ]) => {\n\t\t\tconst org = orgs.get(orgDoc._id)!;\n\t\t\t\n\t\t\tconst { ownerIds, slaveOrgs, _o } = org;\n\t\t\t\n\t\t\tObject.assign(orgDoc, {\n\t\t\t\towners: intersection(ownerIds, user!.slaveIds),\n\t\t\t\tslaveOrgs: _ids(intersection(slaveOrgs, user!.slaveOrgs)),\n\t\t\t\t_o\n\t\t\t});\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 type { AbilitiesSchema } from \"insite-common\";\nimport type { Session, SessionDoc, User } from \"insite-users-server\";\nimport { WSServerClient } from \"insite-ws/server\";\n\n\nexport class WSSCWithUser<AS extends AbilitiesSchema> extends WSServerClient {\n\tisRejected?: boolean;\n\tsessionProps?: Partial<SessionDoc>;\n\tuser?: User<AS>;\n\tlastUserId?: string;\n\tsession?: Session<AS>;\n}\n"],
5
- "mappings": "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",
6
- "names": ["Users", "Err", "includesAll", "isEmpty", "AbilityError", "RolesError", "SubordinationError", "regexps", "setupHandlers", "wss", "users", "roles", "sessions", "avatars", "orgs", "abilities", "user", "email", "AbilityError", "regexps", "Err", "roleIds", "orgId", "rest", "includesAll", "RolesError", "SubordinationError", "userId", "newPassword", "updates", "isEmpty", "sessionId", "_id", "type", "size", "_", "data", "org", "roleId", "role", "_abilities", "abilityLongId", "set", "paramId", "value", "_ids", "includesAny", "intersection", "pick", "CollectionMapPublication", "Publication", "AbilitiesPublication", "abilities", "user", "RolesPublication", "roles", "options", "projection", "sort", "transform", "roleDoc", "involves", "inheritedAbilities", "displayTitle", "_o", "userSubscriptionChangeListenerMap", "UserPublication", "users", "fieldsToUpdate", "isPublic", "key", "fieldsToPick", "subscription", "_id", "changeListener", "next", "session", "isSessionIdRequired", "userDoc", "UsersPublication", "wssc", "UsersExtendedPublication", "triggers", "SessionsPublication", "sessions", "userId", "OrgsPublication", "orgs", "orgDoc", "org", "OrgsExtendedPublication", "ownerIds", "slaveOrgs", "UsersServer", "_UsersServer", "options", "#initPromise", "#userWsMap", "#sessionsWsMap", "wss", "collections", "users", "isPublic", "publicationOptions", "extendedPublicationOptions", "userPublicationOptions", "rolesOptions", "orgsOptions", "incomingTransport", "rolesPublicationOptions", "orgsPublicationOptions", "orgsExtendedPublicationOptions", "Users", "user", "#handleUserCreate", "AbilitiesPublication", "RolesPublication", "UsersPublication", "UsersExtendedPublication", "OrgsPublication", "OrgsExtendedPublication", "SessionsPublication", "#handleUserIsOnline", "setupHandlers", "UserPublication", "#handleSessionDelete", "#handleUserPermissionsChange", "#handleClientRequestLogin", "#handleClientRequestLogout", "#handleClientClosed", "#makeSessionProps", "userAgent", "remoteAddress", "sessionProps", "wssc", "session", "shouldProlong", "_id", "isOnline", "updates", "usersSubscription", "webSockets", "email", "password", "WSServerClient", "WSSCWithUser"]
4
+ "sourcesContent": ["import type { AbilitiesSchema } from \"insite-common\";\nimport { Users, type Session, type User } from \"insite-users-server\";\nimport { setupHandlers } from \"./handlers\";\nimport {\n\tAbilitiesPublication,\n\tOrgsExtendedPublication,\n\tOrgsPublication,\n\tRolesPublication,\n\tSessionsPublication,\n\tUserPublication,\n\tUsersExtendedPublication,\n\tUsersPublication\n} from \"./publications\";\nimport type { OmitRedundant, Options } from \"./types\";\nimport type { WSSCWithUser } from \"./WSSCWithUser\";\n\n\nexport class UsersServer<AS extends AbilitiesSchema> {\n\tconstructor(options: Options<AS>) {\n\t\tthis.#initPromise = this.init!(options);\n\t\t\n\t}\n\t\n\t#userWsMap = new WeakMap<User<AS>, Set<WSSCWithUser<AS>>>();\n\t#sessionsWsMap = new WeakMap<Session<AS>, Set<WSSCWithUser<AS>>>();\n\t\n\twss!: Options<AS>[\"wss\"];\n\tusers!: Users<AS>;\n\tincomingTransport!: Options<AS>[\"incomingTransport\"];\n\t\n\tabilitiesPublication!: AbilitiesPublication<AS>;\n\trolesPublication!: RolesPublication<AS>;\n\tusersPublication!: UsersPublication<AS>;\n\tusersExtendedPublication!: UsersExtendedPublication<AS>;\n\tuserPublication!: UserPublication<AS>;\n\torgsPublication!: OrgsPublication<AS>;\n\torgsExtendedPublication!: OrgsExtendedPublication<AS>;\n\tsessionsPublication!: SessionsPublication<AS>;\n\t\n\tinit? = async (options: Options<AS>) => {\n\t\t\n\t\tconst {\n\t\t\twss,\n\t\t\tcollections,\n\t\t\tusers,\n\t\t\tpublic: isPublic,\n\t\t\tpublication: publicationOptions,\n\t\t\textendedPublication: extendedPublicationOptions,\n\t\t\tuserPublication: userPublicationOptions,\n\t\t\troles: rolesOptions = {},\n\t\t\torgs: orgsOptions = {},\n\t\t\tincomingTransport\n\t\t} = options;\n\t\t\n\t\tconst {\n\t\t\tpublication: rolesPublicationOptions\n\t\t} = rolesOptions;\n\t\t\n\t\tconst {\n\t\t\tpublication: orgsPublicationOptions,\n\t\t\textendedPublication: orgsExtendedPublicationOptions\n\t\t} = orgsOptions;\n\t\t\n\t\tthis.wss = wss;\n\t\tthis.users = users instanceof Users ? users : await Users.init(collections!, users);\n\t\tthis.incomingTransport = incomingTransport;\n\t\t\n\t\tfor (const user of this.users.values())\n\t\t\tthis.#handleUserCreate(user);\n\t\t\n\t\tif (!isPublic) {\n\t\t\tthis.abilitiesPublication = new AbilitiesPublication<AS>(this.users.abilities);\n\t\t\tthis.rolesPublication = new RolesPublication<AS>(this.users.roles, rolesPublicationOptions);\n\t\t\tthis.usersPublication = new UsersPublication<AS>(this.users, publicationOptions);\n\t\t\tthis.usersExtendedPublication = new UsersExtendedPublication<AS>(this.users, extendedPublicationOptions);\n\t\t\tthis.orgsPublication = new OrgsPublication<AS>(this.users.orgs, orgsPublicationOptions);\n\t\t\tthis.orgsExtendedPublication = new OrgsExtendedPublication<AS>(this.users.orgs, orgsExtendedPublicationOptions);\n\t\t\tthis.sessionsPublication = new SessionsPublication<AS>(this.users.sessions);\n\t\t\t\n\t\t\tthis.users.on(\"user-is-online\", this.#handleUserIsOnline);\n\t\t\t\n\t\t\tsetupHandlers<AS>(this);\n\t\t}\n\t\t\n\t\tthis.userPublication = new UserPublication<AS>(this.users, {\n\t\t\tpublic: isPublic,\n\t\t\t...userPublicationOptions\n\t\t});\n\t\t\n\t\tthis.users.on(\"user-create\", this.#handleUserCreate);\n\t\tthis.users.on(\"session-delete\", this.#handleSessionDelete);\n\t\tthis.users.on(\"user-permissions-change\", this.#handleUserPermissionsChange);\n\t\t\n\t\tthis.wss.onRequest(\"login\", this.#handleClientRequestLogin);\n\t\tthis.wss.onRequest(\"logout\", this.#handleClientRequestLogout);\n\t\tthis.wss.on(\"client-close\", this.#handleClientClosed);\n\t\t\n\t\treturn this;\n\t};\n\t\n\t#initPromise;\n\t\n\twhenReady() {\n\t\treturn this.#initPromise;\n\t}\n\t\n\t#makeSessionProps({ userAgent, remoteAddress, sessionProps }: WSSCWithUser<AS>) {\n\t\treturn {\n\t\t\tuserAgent,\n\t\t\tremoteAddress,\n\t\t\t...sessionProps,\n\t\t\tisOnline: true\n\t\t};\n\t}\n\t\n\tsetSession(wssc: WSSCWithUser<AS>, session: Session<AS> | string | null | undefined, shouldProlong?: boolean) {\n\t\tif (session === null)\n\t\t\tsession = undefined;\n\t\telse if (typeof session == \"string\")\n\t\t\tsession = this.users.sessions.get(session);\n\t\t\n\t\tif (wssc.session !== session) {\n\t\t\tif (wssc.session)\n\t\t\t\tthis.#sessionsWsMap.get(wssc.session)?.delete(wssc);\n\t\t\t\n\t\t\tif (session && !wssc.isRejected) {\n\t\t\t\twssc.session = session;\n\t\t\t\twssc.user = session.user;\n\t\t\t\twssc.lastUserId = session.user._id;\n\t\t\t\t\n\t\t\t\tthis.#userWsMap.get(session.user)?.add(wssc);\n\t\t\t\t\n\t\t\t\tconst sockets = this.#sessionsWsMap.get(session) ?? new Set<WSSCWithUser<AS>>();\n\t\t\t\tsockets.add(wssc);\n\t\t\t\tthis.#sessionsWsMap.set(session, sockets);\n\t\t\t\t\n\t\t\t\tif (shouldProlong)\n\t\t\t\t\tvoid session.prolong(this.#makeSessionProps(wssc));\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tconst { user } = wssc;\n\t\t\t\t\n\t\t\t\tdelete wssc.session;\n\t\t\t\tdelete wssc.user;\n\t\t\t\t\n\t\t\t\tif (user)\n\t\t\t\t\tthis.#userWsMap.get(user)?.delete(wssc);\n\t\t\t}\n\t\t\t\n\t\t\tthis.wss.emit(\"client-session\", wssc, shouldProlong);\n\t\t}\n\t\t\n\t}\n\t\n\t#handleUserCreate = (user: User<AS>) =>\n\t\tthis.#userWsMap.set(user, new Set<WSSCWithUser<AS>>());\n\t\n\t#handleUserIsOnline = ({ _id, isOnline }: User<AS>) => {\n\t\tconst updates = { _id, isOnline };\n\t\t\n\t\tfor (const usersSubscription of this.usersPublication.subscriptions) {\n\t\t\tconst [ wssc ] = usersSubscription.args;\n\t\t\tif (wssc.user && wssc.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: Session<AS>) => {\n\t\tconst sockets = this.#sessionsWsMap.get(session);\n\t\t\n\t\tif (sockets)\n\t\t\tfor (const wssc of sockets)\n\t\t\t\tthis.setSession(wssc, null);\n\t\t\n\t};\n\t\n\t#handleUserPermissionsChange = (user: User<AS>) => {\n\t\tconst webSockets = this.#userWsMap.get(user);\n\t\t\n\t\tif (webSockets)\n\t\t\tthis.wss.emit(\"should-renew-subscriptions\", [ ...webSockets ]);\n\t\t\n\t};\n\t\n\t#handleClientRequestLogin = async (wssc: WSSCWithUser<AS>, email: string, password: string) => {\n\t\tif (!wssc.isRejected) {\n\t\t\tconst session = await this.users.login(email, password, this.#makeSessionProps(wssc));\n\t\t\t\n\t\t\tif (session)\n\t\t\t\tthis.setSession(wssc, session);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleClientRequestLogout = async (wssc: WSSCWithUser<AS>) => {\n\t\tif (wssc.session) {\n\t\t\tawait this.users.logout(wssc.session);\n\t\t\t\n\t\t\tthis.setSession(wssc, null);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleClientClosed = async (wssc: WSSCWithUser<AS>) => {\n\t\tawait wssc.session?.offline();\n\t\tthis.setSession(wssc, null);\n\t\t\n\t};\n\t\n\t\n\tstatic init<IAS extends AbilitiesSchema, IO extends Options<IAS>, IUS extends UsersServer<IAS>>(options: IO): Promise<OmitRedundant<IUS, IO>> {\n\t\tconst usersServer = new UsersServer(options) as IUS;\n\t\t\n\t\treturn usersServer.whenReady();\n\t}\n\t\n}\n", "import {\n\t_ids,\n\tErr,\n\tincludesAll,\n\tisEmpty\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport {\n\tAbilityError,\n\tRolesError,\n\tSubordinationError,\n\ttype AbilityParam,\n\ttype OrgDoc,\n\ttype RoleDoc,\n\ttype UserDoc\n} from \"insite-users-server\";\nimport { regexps } from \"./regexps\";\nimport type { UsersServer } from \"./UsersServer\";\n\n\nexport function setupHandlers<AS extends AbilitiesSchema>({ wss, users }: UsersServer<AS>) {\n\t\n\tconst {\n\t\troles,\n\t\tsessions,\n\t\tavatars,\n\t\torgs,\n\t\tabilities\n\t} = users;\n\t\n\t\n\t/* Users */\n\t\n\twss.onRequest(\"users.people.check-email\", ({ user }, email: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!regexps.email.test(email))\n\t\t\tthrow new Err(\"Not email\", \"email.not\");\n\t\t\n\t\tif (users.byEmail.has(email))\n\t\t\tthrow new Err(\"Email already exists\", \"email.exists\");\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.create\", async ({ user }, { roles: roleIds, org: orgId, ...rest }: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!roleIds.length || !includesAll(user.slaveRoleIds, roleIds))\n\t\t\tthrow new RolesError(roleIds);\n\t\t\n\t\tif (orgId && !user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tawait users.create({ roles: roleIds, org: orgId, ...rest });\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.change-password\", async ({ user }, userId: string, newPassword: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", userId);\n\t\t\n\t\tif (typeof newPassword != \"string\")\n\t\t\tthrow new Err(\"Type of password is incorrect\", \"password.wrong-type\");\n\t\t\n\t\tif (!newPassword)\n\t\t\tthrow new Err(\"Password can't be empty\", \"password.empty\");\n\t\t\n\t\tawait users.changePassword(userId, newPassword);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.update\", async ({ user }, userId: string, updates: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", userId);\n\t\t\n\t\tif (updates.roles && (!updates.roles.length || !includesAll(user.slaveRoleIds, updates.roles)))\n\t\t\tthrow new RolesError(updates.roles);\n\t\t\n\t\tif (updates.org && !user.slaveIds.includes(updates.org))\n\t\t\tthrow new SubordinationError(\"slaveIds\", updates.org);\n\t\t\n\t\tif (isEmpty(updates))\n\t\t\tthrow new Err(\"Empty updates\", \"updates.empty\");\n\t\t\n\t\tawait users.updateUser(userId, updates, user);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.delete\", async ({ user }, userId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", userId);\n\t\t\n\t\tawait users.deleteUser(userId);\n\t\t\n\t});\n\t\n\t\n\t/* Sessions */\n\t\n\twss.onRequest(\"users.sessions.destroy\", async ({ user }, sessionId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(users.bySessionId.get(sessionId)?._id))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", users.bySessionId.get(sessionId)?._id);\n\t\t\n\t\tawait sessions.destroySession(sessionId);\n\t\t\n\t});\n\t\n\t\n\t/* Avatars */\n\t\n\twss.onTransfer?.(\"users.avatars.upload\", {\n\t\t\n\t\tbegin({ user }, { metadata: { _id, type, size } }) {\n\t\t\tif (!user || (user._id !== _id && !user.abilities.inSite?.users))\n\t\t\t\tthrow new AbilityError();\n\t\t\t\n\t\t\tif (!user.permissiveIds.includes(_id as string))\n\t\t\t\tthrow new SubordinationError(\"permissiveIds\", _id as string);\n\t\t\t\n\t\t\tif (!avatars.TYPES_ACCEPTED.includes(type as string))\n\t\t\t\tthrow new Err(`Unacceptable avatar format: ${type as string}`, \"avatar.unacceptable-format\");\n\t\t\t\n\t\t\tif (size as number > avatars.MAX_SIZE)\n\t\t\t\tthrow new Err(`Avatar size exceeds limit of ${avatars.MAX_SIZE}: ${size as number}`, \"avatar.size-exceeds-limit\");\n\t\t\t\n\t\t},\n\t\t\n\t\tasync end(_, { data, metadata: { _id, type } }) {\n\t\t\tawait avatars.save(_id as string, type as string, data as string);\n\t\t\t\n\t\t}\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.avatars.delete\", async ({ user }, _id: string) => {\n\t\tif (!user || (user._id !== _id && !user.abilities.inSite?.users))\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(_id))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", _id);\n\t\t\n\t\tawait avatars.deleteAvatar(_id);\n\t\t\n\t});\n\t\n\t\n\t/* Orgs */\n\t\n\twss.onRequest(\"users.orgs.create\", async ({ user }, org: Omit<OrgDoc, \"_id\" | \"createdAt\" | \"owners\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!org.title)\n\t\t\tthrow new Err(\"Title can't be empty\", \"title.empty\");\n\t\t\n\t\tawait orgs.create({ ...org, owners: [ user._id ] });\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.orgs.update\", async ({ user }, orgId, updates: Omit<OrgDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tif (updates.title === \"\")\n\t\t\tthrow new Err(\"Title can't be empty\", \"title.empty\");\n\t\t\n\t\tif (updates.owners && !includesAll(user.slaveIds, updates.owners))\n\t\t\tthrow new SubordinationError(\"slaveIds\", updates.owners);\n\t\t\n\t\tif (isEmpty(updates))\n\t\t\tthrow new Err(\"Empty updates\", \"updates.empty\");\n\t\t\n\t\tawait orgs.updateOrg(orgId, updates, user);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.orgs.delete\", async ({ user }, orgId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tawait orgs.deleteOrg(orgId);\n\t\t\n\t});\n\t\n\t\n\t/* Roles */\n\t\n\twss.onRequest(\"users.roles.check-id\", ({ user }, roleId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!regexps.role.test(roleId))\n\t\t\tthrow new Err(\"Role ID is incorrect\", \"role.not-id\");\n\t\t\n\t\tif (roles.has(roleId))\n\t\t\tthrow new Err(\"Role ID already exists\", \"role.exists\");\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.create\", async ({ user }, role: Omit<RoleDoc, \"abilities\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tawait roles.create(role);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.update\", async ({ user }, roleId: string, { abilities: _abilities, ...updates }: Omit<RoleDoc, \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (updates.involves && !includesAll(user.slaveRoleIds, updates.involves))\n\t\t\tthrow new RolesError(updates.involves);\n\t\t\n\t\tawait roles.updateRole(roleId, updates);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.set-ability\", async ({ user }, roleId: string, abilityLongId: string, set: boolean) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (!abilities.hasAbility(user.abilities, abilityLongId))\n\t\t\tthrow new AbilityError(abilityLongId);\n\t\t\n\t\tawait roles.setAbility(roleId, abilityLongId, set);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.set-ability-param\", async ({ user }, roleId: string, abilityLongId: string, paramId: string, value: AbilityParam) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (!abilities.hasAbility(user.abilities, abilityLongId))\n\t\t\tthrow new AbilityError(abilityLongId);\n\t\t\n\t\tif (!abilities.isParamFits(abilityLongId, paramId, value, abilities.getParam(user.abilities, abilityLongId, paramId)))\n\t\t\tthrow new Err(\"Wrong param value\", \"ability.wrong-param\");\n\t\t\n\t\tawait roles.setAbilityParam(roleId, abilityLongId, paramId, value);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.delete\", async ({ user }, roleId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tawait roles.deleteRole(roleId);\n\t\t\n\t});\n\t\n}\n", "export const regexps = {\n\temail: /^[^\\s@]{1,63}@[^\\s@]{1,63}\\.[^\\s@]{1,63}$/,\n\trole: /^[\\d_a-z-]{1,64}$/\n};\n", "import {\n\t_ids,\n\tincludesAny,\n\tintersection,\n\tpick\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport { ChangeStreamDocument, Sort } from \"insite-db\";\nimport { CollectionMapPublication, Projection, Publication } from \"insite-subscriptions-server/ws\";\nimport type {\n\tAbilitiesMap,\n\tOrgDoc,\n\tOrgs,\n\tRoleDoc,\n\tRoles,\n\tSession,\n\tSessionDoc,\n\tSessions,\n\tUser,\n\tUserDoc,\n\tUsers\n} from \"insite-users-server\";\n\n\nexport class AbilitiesPublication<AS extends AbilitiesSchema> extends Publication<AS, [], User<AS>, Session<AS>> {\n\tconstructor(abilities: AbilitiesMap<AS>) {\n\t\tsuper(\"abilities\", {\n\t\t\t\n\t\t\tfetch({ user }) {\n\t\t\t\tif (user?.abilities.inSite?.users?.roles)\n\t\t\t\t\treturn { abilities: abilities.getSchemeFor(user.abilities) };\n\t\t\t\t\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t});\n\t}\n}\n\n\nexport type RolesPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (roleDoc: object) => void;\n};\n\nexport class RolesPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, RoleDoc, [], User<AS>, Session<AS>> {\n\tconstructor(roles: Roles<AS>, options: RolesPublicationOptions = {}) {\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.collection, \"roles\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: 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\tObject.assign(roleDoc, {\n\t\t\t\t...roleDoc.involves ? {\n\t\t\t\t\townInvolves: roleDoc.involves,\n\t\t\t\t\tinvolves: _ids(involves),\n\t\t\t\t\tabilities,\n\t\t\t\t\tinheritedAbilities\n\t\t\t\t} : {},\n\t\t\t\t...projection.title ? { displayTitle } : {},\n\t\t\t\t_o\n\t\t\t});\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\nconst userSubscriptionChangeListenerMap = new WeakMap<object, (next: ChangeStreamDocument<UserDoc>) => void>();\n\nexport type UserPublicationOptions = {\n\tfieldsToUpdate?: string[];\n\tprojection?: Projection;\n\ttransform?: (userDoc: object) => void;\n\tpublic?: boolean;\n};\n\nexport class UserPublication<AS extends AbilitiesSchema> extends Publication<AS, [ boolean ], User<AS>, Session<AS>> {\n\tconstructor(users: Users<AS>, options: UserPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tfieldsToUpdate = [],\n\t\t\tprojection,\n\t\t\ttransform,\n\t\t\tpublic: isPublic\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] as const)\n\t\t\tif (!projection || projection[key] !== 0)\n\t\t\t\tfieldsToUpdate.push(key);\n\t\t\n\t\tconst fieldsToPick: (keyof User<AS>)[] = [\n\t\t\t\"_id\",\n\t\t\t\"email\",\n\t\t\t\"name\",\n\t\t\t\"initials\",\n\t\t\t\"displayLabel\",\n\t\t\t\"job\",\n\t\t\t\"avatarUrl\",\n\t\t\t\"abilities\"\n\t\t];\n\t\t\n\t\tif (!isPublic)\n\t\t\tfieldsToPick.push(\"slaveIds\");\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\tconst changeListener = (next: ChangeStreamDocument<UserDoc>) => {\n\t\t\t\t\t\tif (\"documentKey\" in next && 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 (!includesAny(Object.keys(next.updateDescription.updatedFields!), 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\tvoid subscription.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.onChange(changeListener);\n\t\t\t\t\t\n\t\t\t\t\tuserSubscriptionChangeListenerMap.set(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 = pick(user, fieldsToPick);\n\t\t\t\t\t\n\t\t\t\t\tif (!isPublic)\n\t\t\t\t\t\tObject.assign(userDoc, {\n\t\t\t\t\t\t\torgId: user.org._id,\n\t\t\t\t\t\t\tsessionId: isSessionIdRequired ? session?._id : undefined,\n\t\t\t\t\t\t\tisOnline: true\n\t\t\t\t\t\t});\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] && key in user)\n\t\t\t\t\t\t\t\tObject.assign(userDoc, { [key]: user[key as keyof typeof user] });\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdelete userDoc[key as keyof typeof userDoc];\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\t\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t\n\t\t\tonUnsubscribe(subscription) {\n\t\t\t\tconst changeListener = userSubscriptionChangeListenerMap.get(subscription);\n\t\t\t\t\n\t\t\t\tif (changeListener)\n\t\t\t\t\tusers.collection.removeChangeListener(changeListener);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\n\nexport type UsersPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (userDoc: object) => void;\n};\n\nexport class UsersPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc, [], User<AS>, Session<AS>> {\n\tconstructor(users: Users<AS>, options: UsersPublicationOptions = {}) {\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.collection, \"users\", wssc => wssc.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\tconst user = users.get(userDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(\n\t\t\t\tuserDoc,\n\t\t\t\tpick(user, [\n\t\t\t\t\t\"initials\",\n\t\t\t\t\t\"displayLabel\",\n\t\t\t\t\t\"avatarUrl\",\n\t\t\t\t\t\"isOnline\"\n\t\t\t\t]),\n\t\t\t\t{ orgId: userDoc.org }\n\t\t\t);\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\n\nexport type UsersExtendedPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttriggers?: string[];\n\ttransform?: (userDoc: object) => void;\n};\n\nexport class UsersExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc, [], User<AS>, Session<AS>> {\n\tconstructor(users: Users<AS>, options: UsersExtendedPublicationOptions = {}) {\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.collection, \"users.extended\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (userDoc, [ wssc ]) => {\n\t\t\tconst user = users.get(userDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(userDoc, {\n\t\t\t\troleIds: intersection(user.ownRoleIds, wssc.user!.slaveRoleIds)\n\t\t\t});\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 SessionsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, SessionDoc, [ string ], User<AS>, Session<AS>> {\n\tconstructor(sessions: Sessions<AS>) {\n\t\tsuper(sessions.collection, \"users.people.sessions\", ({ user }, userId) =>\n\t\t\tuser?.abilities.inSite?.users && user.permissiveIds.includes(userId) && {\n\t\t\t\tquery: { user: userId },\n\t\t\t\tprojection: { remoteAddress: 1, isOnline: 1, prolongedAt: 1 },\n\t\t\t\tsort: { prolongedAt: -1 }\n\t\t\t}\n\t\t);\n\t}\n}\n\n\nexport type OrgsPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (orgDoc: object) => void;\n};\n\nexport class OrgsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc, [], User<AS>, Session<AS>> {\n\tconstructor(orgs: Orgs<AS>, options: OrgsPublicationOptions = {}) {\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.collection, \"orgs\", wssc => wssc.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, orgDoc => {\n\t\t\tconst org = orgs.get(orgDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(orgDoc, pick(org, [ \"initials\", \"displayLabel\" ]));\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\n\nexport type OrgsExtendedPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttriggers?: string[];\n\ttransform?: (orgDoc: object) => void;\n};\n\nexport class OrgsExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc, [], User<AS>, Session<AS>> {\n\tconstructor(orgs: Orgs<AS>, options: OrgsExtendedPublicationOptions = {}) {\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.collection, \"orgs.extended\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (orgDoc, [ { user } ]) => {\n\t\t\tconst org = orgs.get(orgDoc._id)!;\n\t\t\t\n\t\t\tconst { ownerIds, slaveOrgs, _o } = org;\n\t\t\t\n\t\t\tObject.assign(orgDoc, {\n\t\t\t\towners: intersection(ownerIds, user!.slaveIds),\n\t\t\t\tslaveOrgs: _ids(intersection(slaveOrgs, user!.slaveOrgs)),\n\t\t\t\t_o\n\t\t\t});\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 type { AbilitiesSchema } from \"insite-common\";\nimport type { Session, SessionDoc, User } from \"insite-users-server\";\nimport { WSServerClient } from \"insite-ws/server\";\n\n\nexport class WSSCWithUser<AS extends AbilitiesSchema> extends WSServerClient {\n\tisRejected?: boolean;\n\tsessionProps?: Partial<SessionDoc>;\n\tuser?: User<AS>;\n\tlastUserId?: string;\n\tsession?: Session<AS>;\n}\n"],
5
+ "mappings": "AACA,OAAS,SAAAA,MAAsC,sBCD/C,OAEC,OAAAC,EACA,eAAAC,EACA,WAAAC,MACM,YAEP,OACC,gBAAAC,EACA,cAAAC,EACA,sBAAAC,MAKM,sBCfA,IAAMC,EAAU,CACtB,MAAO,4CACP,KAAM,mBACP,EDiBO,SAASC,EAA0C,CAAE,IAAAC,EAAK,MAAAC,CAAM,EAAoB,CAE1F,GAAM,CACL,MAAAC,EACA,SAAAC,EACA,QAAAC,EACA,KAAAC,EACA,UAAAC,CACD,EAAIL,EAKJD,EAAI,UAAU,2BAA4B,CAAC,CAAE,KAAAO,CAAK,EAAGC,IAAkB,CACtE,GAAI,CAACD,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACC,EAAQ,MAAM,KAAKF,CAAK,EAC5B,MAAM,IAAIG,EAAI,YAAa,WAAW,EAEvC,GAAIV,EAAM,QAAQ,IAAIO,CAAK,EAC1B,MAAM,IAAIG,EAAI,uBAAwB,cAAc,CAEtD,CAAC,EAEDX,EAAI,UAAU,sBAAuB,MAAO,CAAE,KAAAO,CAAK,EAAG,CAAE,MAAOK,EAAS,IAAKC,EAAO,GAAGC,CAAK,IAA0C,CACrI,GAAI,CAACP,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACG,EAAQ,QAAU,CAACG,EAAYR,EAAK,aAAcK,CAAO,EAC7D,MAAM,IAAII,EAAWJ,CAAO,EAE7B,GAAIC,GAAS,CAACN,EAAK,SAAS,SAASM,CAAK,EACzC,MAAM,IAAII,EAAmB,WAAYJ,CAAK,EAE/C,MAAMZ,EAAM,OAAO,CAAE,MAAOW,EAAS,IAAKC,EAAO,GAAGC,CAAK,CAAC,CAE3D,CAAC,EAEDd,EAAI,UAAU,+BAAgC,MAAO,CAAE,KAAAO,CAAK,EAAGW,EAAgBC,IAAwB,CACtG,GAAI,CAACZ,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,cAAc,SAASW,CAAM,EACtC,MAAM,IAAID,EAAmB,gBAAiBC,CAAM,EAErD,GAAI,OAAOC,GAAe,SACzB,MAAM,IAAIR,EAAI,gCAAiC,qBAAqB,EAErE,GAAI,CAACQ,EACJ,MAAM,IAAIR,EAAI,0BAA2B,gBAAgB,EAE1D,MAAMV,EAAM,eAAeiB,EAAQC,CAAW,CAE/C,CAAC,EAEDnB,EAAI,UAAU,sBAAuB,MAAO,CAAE,KAAAO,CAAK,EAAGW,EAAgBE,IAAgD,CACrH,GAAI,CAACb,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,cAAc,SAASW,CAAM,EACtC,MAAM,IAAID,EAAmB,gBAAiBC,CAAM,EAErD,GAAIE,EAAQ,QAAU,CAACA,EAAQ,MAAM,QAAU,CAACL,EAAYR,EAAK,aAAca,EAAQ,KAAK,GAC3F,MAAM,IAAIJ,EAAWI,EAAQ,KAAK,EAEnC,GAAIA,EAAQ,KAAO,CAACb,EAAK,SAAS,SAASa,EAAQ,GAAG,EACrD,MAAM,IAAIH,EAAmB,WAAYG,EAAQ,GAAG,EAErD,GAAIC,EAAQD,CAAO,EAClB,MAAM,IAAIT,EAAI,gBAAiB,eAAe,EAE/C,MAAMV,EAAM,WAAWiB,EAAQE,EAASb,CAAI,CAE7C,CAAC,EAEDP,EAAI,UAAU,sBAAuB,MAAO,CAAE,KAAAO,CAAK,EAAGW,IAAmB,CACxE,GAAI,CAACX,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,SAAS,SAASW,CAAM,EACjC,MAAM,IAAID,EAAmB,WAAYC,CAAM,EAEhD,MAAMjB,EAAM,WAAWiB,CAAM,CAE9B,CAAC,EAKDlB,EAAI,UAAU,yBAA0B,MAAO,CAAE,KAAAO,CAAK,EAAGe,IAAsB,CAC9E,GAAI,CAACf,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,cAAc,SAASN,EAAM,YAAY,IAAIqB,CAAS,GAAG,GAAG,EACrE,MAAM,IAAIL,EAAmB,gBAAiBhB,EAAM,YAAY,IAAIqB,CAAS,GAAG,GAAG,EAEpF,MAAMnB,EAAS,eAAemB,CAAS,CAExC,CAAC,EAKDtB,EAAI,aAAa,uBAAwB,CAExC,MAAM,CAAE,KAAAO,CAAK,EAAG,CAAE,SAAU,CAAE,IAAAgB,EAAK,KAAAC,EAAM,KAAAC,CAAK,CAAE,EAAG,CAClD,GAAI,CAAClB,GAASA,EAAK,MAAQgB,GAAO,CAAChB,EAAK,UAAU,QAAQ,MACzD,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,cAAc,SAASgB,CAAa,EAC7C,MAAM,IAAIN,EAAmB,gBAAiBM,CAAa,EAE5D,GAAI,CAACnB,EAAQ,eAAe,SAASoB,CAAc,EAClD,MAAM,IAAIb,EAAI,+BAA+Ba,CAAc,GAAI,4BAA4B,EAE5F,GAAIC,EAAiBrB,EAAQ,SAC5B,MAAM,IAAIO,EAAI,gCAAgCP,EAAQ,QAAQ,KAAKqB,CAAc,GAAI,2BAA2B,CAElH,EAEA,MAAM,IAAIC,EAAG,CAAE,KAAAC,EAAM,SAAU,CAAE,IAAAJ,EAAK,KAAAC,CAAK,CAAE,EAAG,CAC/C,MAAMpB,EAAQ,KAAKmB,EAAeC,EAAgBG,CAAc,CAEjE,CAED,CAAC,EAED3B,EAAI,UAAU,uBAAwB,MAAO,CAAE,KAAAO,CAAK,EAAGgB,IAAgB,CACtE,GAAI,CAAChB,GAASA,EAAK,MAAQgB,GAAO,CAAChB,EAAK,UAAU,QAAQ,MACzD,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,cAAc,SAASgB,CAAG,EACnC,MAAM,IAAIN,EAAmB,gBAAiBM,CAAG,EAElD,MAAMnB,EAAQ,aAAamB,CAAG,CAE/B,CAAC,EAKDvB,EAAI,UAAU,oBAAqB,MAAO,CAAE,KAAAO,CAAK,EAAGqB,IAAsD,CACzG,GAAI,CAACrB,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACmB,EAAI,MACR,MAAM,IAAIjB,EAAI,uBAAwB,aAAa,EAEpD,MAAMN,EAAK,OAAO,CAAE,GAAGuB,EAAK,OAAQ,CAAErB,EAAK,GAAI,CAAE,CAAC,CAEnD,CAAC,EAEDP,EAAI,UAAU,oBAAqB,MAAO,CAAE,KAAAO,CAAK,EAAGM,EAAOO,IAA+C,CACzG,GAAI,CAACb,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,SAAS,SAASM,CAAK,EAChC,MAAM,IAAII,EAAmB,WAAYJ,CAAK,EAE/C,GAAIO,EAAQ,QAAU,GACrB,MAAM,IAAIT,EAAI,uBAAwB,aAAa,EAEpD,GAAIS,EAAQ,QAAU,CAACL,EAAYR,EAAK,SAAUa,EAAQ,MAAM,EAC/D,MAAM,IAAIH,EAAmB,WAAYG,EAAQ,MAAM,EAExD,GAAIC,EAAQD,CAAO,EAClB,MAAM,IAAIT,EAAI,gBAAiB,eAAe,EAE/C,MAAMN,EAAK,UAAUQ,EAAOO,EAASb,CAAI,CAE1C,CAAC,EAEDP,EAAI,UAAU,oBAAqB,MAAO,CAAE,KAAAO,CAAK,EAAGM,IAAkB,CACrE,GAAI,CAACN,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,SAAS,SAASM,CAAK,EAChC,MAAM,IAAII,EAAmB,WAAYJ,CAAK,EAE/C,MAAMR,EAAK,UAAUQ,CAAK,CAE3B,CAAC,EAKDb,EAAI,UAAU,uBAAwB,CAAC,CAAE,KAAAO,CAAK,EAAGsB,IAAmB,CACnE,GAAI,CAACtB,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACC,EAAQ,KAAK,KAAKmB,CAAM,EAC5B,MAAM,IAAIlB,EAAI,uBAAwB,aAAa,EAEpD,GAAIT,EAAM,IAAI2B,CAAM,EACnB,MAAM,IAAIlB,EAAI,yBAA0B,aAAa,CAEvD,CAAC,EAEDX,EAAI,UAAU,qBAAsB,MAAO,CAAE,KAAAO,CAAK,EAAGuB,IAAmD,CACvG,GAAI,CAACvB,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,MAAMP,EAAM,OAAO4B,CAAI,CAExB,CAAC,EAED9B,EAAI,UAAU,qBAAsB,MAAO,CAAE,KAAAO,CAAK,EAAGsB,EAAgB,CAAE,UAAWE,EAAY,GAAGX,CAAQ,IAAkC,CAC1I,GAAI,CAACb,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,aAAa,SAASsB,CAAM,EACrC,MAAM,IAAIb,EAAWa,CAAM,EAE5B,GAAIT,EAAQ,UAAY,CAACL,EAAYR,EAAK,aAAca,EAAQ,QAAQ,EACvE,MAAM,IAAIJ,EAAWI,EAAQ,QAAQ,EAEtC,MAAMlB,EAAM,WAAW2B,EAAQT,CAAO,CAEvC,CAAC,EAEDpB,EAAI,UAAU,0BAA2B,MAAO,CAAE,KAAAO,CAAK,EAAGsB,EAAgBG,EAAuBC,IAAiB,CACjH,GAAI,CAAC1B,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,aAAa,SAASsB,CAAM,EACrC,MAAM,IAAIb,EAAWa,CAAM,EAE5B,GAAI,CAACvB,EAAU,WAAWC,EAAK,UAAWyB,CAAa,EACtD,MAAM,IAAIvB,EAAauB,CAAa,EAErC,MAAM9B,EAAM,WAAW2B,EAAQG,EAAeC,CAAG,CAElD,CAAC,EAEDjC,EAAI,UAAU,gCAAiC,MAAO,CAAE,KAAAO,CAAK,EAAGsB,EAAgBG,EAAuBE,EAAiBC,IAAwB,CAC/I,GAAI,CAAC5B,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,aAAa,SAASsB,CAAM,EACrC,MAAM,IAAIb,EAAWa,CAAM,EAE5B,GAAI,CAACvB,EAAU,WAAWC,EAAK,UAAWyB,CAAa,EACtD,MAAM,IAAIvB,EAAauB,CAAa,EAErC,GAAI,CAAC1B,EAAU,YAAY0B,EAAeE,EAASC,EAAO7B,EAAU,SAASC,EAAK,UAAWyB,EAAeE,CAAO,CAAC,EACnH,MAAM,IAAIvB,EAAI,oBAAqB,qBAAqB,EAEzD,MAAMT,EAAM,gBAAgB2B,EAAQG,EAAeE,EAASC,CAAK,CAElE,CAAC,EAEDnC,EAAI,UAAU,qBAAsB,MAAO,CAAE,KAAAO,CAAK,EAAGsB,IAAmB,CACvE,GAAI,CAACtB,GAAM,UAAU,QAAQ,MAC5B,MAAM,IAAIE,EAEX,GAAI,CAACF,EAAK,aAAa,SAASsB,CAAM,EACrC,MAAM,IAAIb,EAAWa,CAAM,EAE5B,MAAM3B,EAAM,WAAW2B,CAAM,CAE9B,CAAC,CAEF,CE3RA,OACC,QAAAO,EACA,eAAAC,EACA,gBAAAC,EACA,QAAAC,MACM,YAGP,OAAS,4BAAAC,EAAsC,eAAAC,MAAmB,iCAgB3D,IAAMC,EAAN,cAA+DD,CAA2C,CAChH,YAAYE,EAA6B,CACxC,MAAM,YAAa,CAElB,MAAM,CAAE,KAAAC,CAAK,EAAG,CACf,OAAIA,GAAM,UAAU,QAAQ,OAAO,MAC3B,CAAE,UAAWD,EAAU,aAAaC,EAAK,SAAS,CAAE,EAErD,IACR,CAED,CAAC,CACF,CACD,EASaC,EAAN,cAA2DL,CAAiE,CAClI,YAAYM,EAAkBC,EAAmC,CAAC,EAAG,CAEpE,GAAM,CACL,WAAAC,EAAa,CAAE,MAAO,EAAG,YAAa,CAAE,EACxC,KAAAC,EAAO,CAAE,GAAI,CAAE,EACf,UAAAC,CACD,EAAIH,EAEJ,OAAO,OAAOC,EAAY,CAAE,SAAU,EAAG,UAAW,CAAE,CAAC,EAEvD,MAAMF,EAAM,WAAY,QAAS,CAAC,CAAE,KAAAF,CAAK,IAAMA,GAAM,UAAU,QAAQ,OAAS,CAC/E,MAAO,CAAE,IAAK,CAAE,IAAKA,EAAK,YAAa,CAAE,EACzC,WAAAI,EACA,KAAAC,CACD,EAAGE,GAAW,CACb,GAAM,CAAE,SAAAC,EAAU,UAAAT,EAAW,mBAAAU,EAAoB,aAAAC,EAAc,GAAAC,CAAG,EAAIT,EAAM,IAAIK,EAAQ,GAAG,EAE3F,OAAO,OAAOA,EAAS,CACtB,GAAGA,EAAQ,SAAW,CACrB,YAAaA,EAAQ,SACrB,SAAUf,EAAKgB,CAAQ,EACvB,UAAAT,EACA,mBAAAU,CACD,EAAI,CAAC,EACL,GAAGL,EAAW,MAAQ,CAAE,aAAAM,CAAa,EAAI,CAAC,EAC1C,GAAAC,CACD,CAAC,EAEDL,IAAYC,CAAO,CAEpB,CAAC,CAEF,CAED,EAGMK,EAAoC,IAAI,QASjCC,EAAN,cAA0DhB,CAAoD,CACpH,YAAYiB,EAAkBX,EAAkC,CAAC,EAAG,CAEnE,GAAM,CACL,eAAAY,EAAiB,CAAC,EAClB,WAAAX,EACA,UAAAE,EACA,OAAQU,CACT,EAAIb,EAEJ,QAAWc,IAAO,CACjB,QACA,OACA,aACA,cACA,YACA,MACA,MACA,QACD,GACK,CAACb,GAAcA,EAAWa,CAAG,IAAM,IACtCF,EAAe,KAAKE,CAAG,EAEzB,IAAMC,EAAmC,CACxC,MACA,QACA,OACA,WACA,eACA,MACA,YACA,WACD,EAEKF,GACJE,EAAa,KAAK,UAAU,EAE7B,MAAM,OAAQ,CAEb,YAAYC,EAAc,CACzB,GAAM,CAAE,CAAE,KAAAnB,CAAK,CAAE,EAAImB,EAAa,KAElC,GAAInB,EAAM,CACT,GAAM,CAAE,IAAAoB,CAAI,EAAIpB,EAEVqB,EAAkBC,GAAwC,CAC/D,GAAI,gBAAiBA,GAAQA,EAAK,YAAY,MAAQF,EACrD,OAAQE,EAAK,cAAe,CAC3B,IAAK,SACJ,GAAI,CAAC7B,EAAY,OAAO,KAAK6B,EAAK,kBAAkB,aAAc,EAAGP,CAAc,EAClF,MAEF,IAAK,UACL,IAAK,SACCI,EAAa,QAAQG,CAAI,CAChC,CAEF,EAEAR,EAAM,WAAW,SAASO,CAAc,EAExCT,EAAkC,IAAIO,EAAcE,CAAc,CACnE,CAED,EAEA,MAAM,CAAE,KAAArB,EAAM,QAAAuB,CAAQ,EAAGC,EAAqB,CAC7C,GAAIxB,EAAM,CACT,IAAMyB,EAAU9B,EAAKK,EAAMkB,CAAY,EASvC,GAPKF,GACJ,OAAO,OAAOS,EAAS,CACtB,MAAOzB,EAAK,IAAI,IAChB,UAAWwB,EAAsBD,GAAS,IAAM,OAChD,SAAU,EACX,CAAC,EAEEnB,EACH,QAAWa,KAAOb,EACbA,EAAWa,CAAG,GAAKA,KAAOjB,EAC7B,OAAO,OAAOyB,EAAS,CAAE,CAACR,CAAG,EAAGjB,EAAKiB,CAAwB,CAAE,CAAC,EAEhE,OAAOQ,EAAQR,CAA2B,EAE7C,OAAAX,IAAYmB,CAAO,EAEZA,CACR,CAEA,OAAO,IACR,EAEA,cAAcN,EAAc,CAC3B,IAAME,EAAiBT,EAAkC,IAAIO,CAAY,EAErEE,GACHP,EAAM,WAAW,qBAAqBO,CAAc,CAEtD,CAED,CAAC,CAEF,CACD,EASaK,EAAN,cAA2D9B,CAAiE,CAClI,YAAYkB,EAAkBX,EAAmC,CAAC,EAAG,CAEpE,GAAM,CACL,WAAAC,EAAa,CAAE,MAAO,EAAG,KAAM,EAAG,IAAK,EAAG,IAAK,EAAG,OAAQ,CAAE,EAC5D,KAAAC,EAAO,CAAE,YAAa,CAAE,EACxB,UAAAC,CACD,EAAIH,EAEJ,MAAMW,EAAM,WAAY,QAASa,GAAQA,EAAK,MAAM,UAAU,OAAS,CACtE,MAAO,CAAC,EACR,WAAAvB,EACA,KAAAC,CACD,EAAGoB,GAAW,CAEb,IAAMzB,EAAOc,EAAM,IAAIW,EAAQ,GAAG,EAElC,OAAO,OACNA,EACA9B,EAAKK,EAAM,CACV,WACA,eACA,YACA,UACD,CAAC,EACD,CAAE,MAAOyB,EAAQ,GAAI,CACtB,EAEA,OAAOA,EAAQ,IACf,OAAOA,EAAQ,OAEfnB,IAAYmB,CAAO,CAEpB,CAAC,CAEF,CACD,EAUaG,EAAN,cAAmEhC,CAAiE,CAC1I,YAAYkB,EAAkBX,EAA2C,CAAC,EAAG,CAE5E,GAAM,CACL,WAAAC,EAAa,CAAE,IAAK,CAAE,EACtB,KAAAC,EACA,SAAAwB,EAAW,CAAC,EACZ,UAAAvB,CACD,EAAIH,EAEC0B,EAAS,SAAS,OAAO,GAC7BA,EAAS,KAAK,OAAO,EAEtB,MAAMf,EAAM,WAAY,iBAAkB,CAAC,CAAE,KAAAd,CAAK,IAAMA,GAAM,UAAU,QAAQ,OAAS,CACxF,MAAO,CAAE,IAAK,CAAE,IAAKA,EAAK,QAAS,CAAE,EACrC,WAAAI,EACA,KAAAC,EACA,SAAAwB,CACD,EAAG,CAACJ,EAAS,CAAEE,CAAK,IAAM,CACzB,IAAM3B,EAAOc,EAAM,IAAIW,EAAQ,GAAG,EAElC,OAAO,OAAOA,EAAS,CACtB,QAAS/B,EAAaM,EAAK,WAAY2B,EAAK,KAAM,YAAY,CAC/D,CAAC,EAEDrB,IAAYmB,CAAO,CAEpB,CAAC,CAEF,CACD,EAGaK,EAAN,cAA8DlC,CAA4E,CAChJ,YAAYmC,EAAwB,CACnC,MAAMA,EAAS,WAAY,wBAAyB,CAAC,CAAE,KAAA/B,CAAK,EAAGgC,IAC9DhC,GAAM,UAAU,QAAQ,OAASA,EAAK,cAAc,SAASgC,CAAM,GAAK,CACvE,MAAO,CAAE,KAAMA,CAAO,EACtB,WAAY,CAAE,cAAe,EAAG,SAAU,EAAG,YAAa,CAAE,EAC5D,KAAM,CAAE,YAAa,EAAG,CACzB,CACD,CACD,CACD,EASaC,EAAN,cAA0DrC,CAAgE,CAChI,YAAYsC,EAAgB/B,EAAkC,CAAC,EAAG,CAEjE,GAAM,CACL,WAAAC,EAAa,CAAE,MAAO,CAAE,EACxB,KAAAC,EAAO,CAAE,MAAO,CAAE,EAClB,UAAAC,CACD,EAAIH,EAEJ,MAAM+B,EAAK,WAAY,OAAQP,GAAQA,EAAK,MAAM,UAAU,OAAS,CACpE,MAAO,CAAC,EACR,WAAAvB,EACA,KAAAC,CACD,EAAG8B,GAAU,CACZ,IAAMC,EAAMF,EAAK,IAAIC,EAAO,GAAG,EAE/B,OAAO,OAAOA,EAAQxC,EAAKyC,EAAK,CAAE,WAAY,cAAe,CAAC,CAAC,EAE/D9B,IAAY6B,CAAM,CAEnB,CAAC,CAEF,CAED,EAUaE,EAAN,cAAkEzC,CAAgE,CACxI,YAAYsC,EAAgB/B,EAA0C,CAAC,EAAG,CAEzE,GAAM,CACL,WAAAC,EAAa,CAAE,KAAM,CAAE,EACvB,KAAAC,EAAO,CAAE,GAAI,CAAE,EACf,SAAAwB,EAAW,CAAC,EACZ,UAAAvB,CACD,EAAIH,EAEC0B,EAAS,SAAS,QAAQ,GAC9BA,EAAS,KAAK,QAAQ,EAEvB,MAAMK,EAAK,WAAY,gBAAiB,CAAC,CAAE,KAAAlC,CAAK,IAAMA,GAAM,UAAU,QAAQ,OAAS,CACtF,MAAO,CAAE,IAAK,CAAE,IAAKA,EAAK,QAAS,CAAE,EACrC,WAAAI,EACA,KAAAC,EACA,SAAAwB,CACD,EAAG,CAACM,EAAQ,CAAE,CAAE,KAAAnC,CAAK,CAAE,IAAM,CAC5B,IAAMoC,EAAMF,EAAK,IAAIC,EAAO,GAAG,EAEzB,CAAE,SAAAG,EAAU,UAAAC,EAAW,GAAA5B,CAAG,EAAIyB,EAEpC,OAAO,OAAOD,EAAQ,CACrB,OAAQzC,EAAa4C,EAAUtC,EAAM,QAAQ,EAC7C,UAAWR,EAAKE,EAAa6C,EAAWvC,EAAM,SAAS,CAAC,EACxD,GAAAW,CACD,CAAC,EAEDL,IAAY6B,CAAM,CAEnB,CAAC,CAEF,CAED,EHnWO,IAAMK,EAAN,MAAMC,CAAwC,CACpD,YAAYC,EAAsB,CACjC,KAAKC,GAAe,KAAK,KAAMD,CAAO,CAEvC,CAEAE,GAAa,IAAI,QACjBC,GAAiB,IAAI,QAErB,IACA,MACA,kBAEA,qBACA,iBACA,iBACA,yBACA,gBACA,gBACA,wBACA,oBAEA,KAAQ,MAAOH,GAAyB,CAEvC,GAAM,CACL,IAAAI,EACA,YAAAC,EACA,MAAAC,EACA,OAAQC,EACR,YAAaC,EACb,oBAAqBC,EACrB,gBAAiBC,EACjB,MAAOC,EAAe,CAAC,EACvB,KAAMC,EAAc,CAAC,EACrB,kBAAAC,CACD,EAAIb,EAEE,CACL,YAAac,CACd,EAAIH,EAEE,CACL,YAAaI,EACb,oBAAqBC,CACtB,EAAIJ,EAEJ,KAAK,IAAMR,EACX,KAAK,MAAQE,aAAiBW,EAAQX,EAAQ,MAAMW,EAAM,KAAKZ,EAAcC,CAAK,EAClF,KAAK,kBAAoBO,EAEzB,QAAWK,KAAQ,KAAK,MAAM,OAAO,EACpC,KAAKC,GAAkBD,CAAI,EAE5B,OAAKX,IACJ,KAAK,qBAAuB,IAAIa,EAAyB,KAAK,MAAM,SAAS,EAC7E,KAAK,iBAAmB,IAAIC,EAAqB,KAAK,MAAM,MAAOP,CAAuB,EAC1F,KAAK,iBAAmB,IAAIQ,EAAqB,KAAK,MAAOd,CAAkB,EAC/E,KAAK,yBAA2B,IAAIe,EAA6B,KAAK,MAAOd,CAA0B,EACvG,KAAK,gBAAkB,IAAIe,EAAoB,KAAK,MAAM,KAAMT,CAAsB,EACtF,KAAK,wBAA0B,IAAIU,EAA4B,KAAK,MAAM,KAAMT,CAA8B,EAC9G,KAAK,oBAAsB,IAAIU,EAAwB,KAAK,MAAM,QAAQ,EAE1E,KAAK,MAAM,GAAG,iBAAkB,KAAKC,EAAmB,EAExDC,EAAkB,IAAI,GAGvB,KAAK,gBAAkB,IAAIC,EAAoB,KAAK,MAAO,CAC1D,OAAQtB,EACR,GAAGG,CACJ,CAAC,EAED,KAAK,MAAM,GAAG,cAAe,KAAKS,EAAiB,EACnD,KAAK,MAAM,GAAG,iBAAkB,KAAKW,EAAoB,EACzD,KAAK,MAAM,GAAG,0BAA2B,KAAKC,EAA4B,EAE1E,KAAK,IAAI,UAAU,QAAS,KAAKC,EAAyB,EAC1D,KAAK,IAAI,UAAU,SAAU,KAAKC,EAA0B,EAC5D,KAAK,IAAI,GAAG,eAAgB,KAAKC,EAAmB,EAE7C,IACR,EAEAjC,GAEA,WAAY,CACX,OAAO,KAAKA,EACb,CAEAkC,GAAkB,CAAE,UAAAC,EAAW,cAAAC,EAAe,aAAAC,CAAa,EAAqB,CAC/E,MAAO,CACN,UAAAF,EACA,cAAAC,EACA,GAAGC,EACH,SAAU,EACX,CACD,CAEA,WAAWC,EAAwBC,EAAkDC,EAAyB,CAM7G,GALID,IAAY,KACfA,EAAU,OACF,OAAOA,GAAW,WAC1BA,EAAU,KAAK,MAAM,SAAS,IAAIA,CAAO,GAEtCD,EAAK,UAAYC,EAAS,CAI7B,GAHID,EAAK,SACR,KAAKpC,GAAe,IAAIoC,EAAK,OAAO,GAAG,OAAOA,CAAI,EAE/CC,GAAW,CAACD,EAAK,WAAY,CAChCA,EAAK,QAAUC,EACfD,EAAK,KAAOC,EAAQ,KACpBD,EAAK,WAAaC,EAAQ,KAAK,IAE/B,KAAKtC,GAAW,IAAIsC,EAAQ,IAAI,GAAG,IAAID,CAAI,EAE3C,IAAMG,EAAU,KAAKvC,GAAe,IAAIqC,CAAO,GAAK,IAAI,IACxDE,EAAQ,IAAIH,CAAI,EAChB,KAAKpC,GAAe,IAAIqC,EAASE,CAAO,EAEpCD,GACED,EAAQ,QAAQ,KAAKL,GAAkBI,CAAI,CAAC,CAEnD,KAAO,CACN,GAAM,CAAE,KAAArB,CAAK,EAAIqB,EAEjB,OAAOA,EAAK,QACZ,OAAOA,EAAK,KAERrB,GACH,KAAKhB,GAAW,IAAIgB,CAAI,GAAG,OAAOqB,CAAI,CACxC,CAEA,KAAK,IAAI,KAAK,iBAAkBA,EAAME,CAAa,CACpD,CAED,CAEAtB,GAAqBD,GACpB,KAAKhB,GAAW,IAAIgB,EAAM,IAAI,GAAuB,EAEtDS,GAAsB,CAAC,CAAE,IAAAgB,EAAK,SAAAC,CAAS,IAAgB,CACtD,IAAMC,EAAU,CAAE,IAAAF,EAAK,SAAAC,CAAS,EAEhC,QAAWE,KAAqB,KAAK,iBAAiB,cAAe,CACpE,GAAM,CAAEP,CAAK,EAAIO,EAAkB,KAC/BP,EAAK,MAAQA,EAAK,KAAK,MAAQI,GAClCG,EAAkB,QAAQ,CAAE,CAAE,IAAiBD,EAAS,EAAK,CAAE,CAAC,CAClE,CAED,EAEAf,GAAwBU,GAAyB,CAChD,IAAME,EAAU,KAAKvC,GAAe,IAAIqC,CAAO,EAE/C,GAAIE,EACH,QAAWH,KAAQG,EAClB,KAAK,WAAWH,EAAM,IAAI,CAE7B,EAEAR,GAAgCb,GAAmB,CAClD,IAAM6B,EAAa,KAAK7C,GAAW,IAAIgB,CAAI,EAEvC6B,GACH,KAAK,IAAI,KAAK,6BAA8B,CAAE,GAAGA,CAAW,CAAC,CAE/D,EAEAf,GAA4B,MAAOO,EAAwBS,EAAeC,IAAqB,CAC9F,GAAI,CAACV,EAAK,WAAY,CACrB,IAAMC,EAAU,MAAM,KAAK,MAAM,MAAMQ,EAAOC,EAAU,KAAKd,GAAkBI,CAAI,CAAC,EAEhFC,GACH,KAAK,WAAWD,EAAMC,CAAO,CAC/B,CAED,EAEAP,GAA6B,MAAOM,GAA2B,CAC1DA,EAAK,UACR,MAAM,KAAK,MAAM,OAAOA,EAAK,OAAO,EAEpC,KAAK,WAAWA,EAAM,IAAI,EAG5B,EAEAL,GAAsB,MAAOK,GAA2B,CACvD,MAAMA,EAAK,SAAS,QAAQ,EAC5B,KAAK,WAAWA,EAAM,IAAI,CAE3B,EAGA,OAAO,KAAyFvC,EAA8C,CAG7I,OAFoB,IAAID,EAAYC,CAAO,EAExB,UAAU,CAC9B,CAED,EIvNA,OAAS,kBAAAkD,MAAsB,mBAGxB,IAAMC,EAAN,cAAuDD,CAAe,CAC5E,WACA,aACA,KACA,WACA,OACD",
6
+ "names": ["Users", "Err", "includesAll", "isEmpty", "AbilityError", "RolesError", "SubordinationError", "regexps", "setupHandlers", "wss", "users", "roles", "sessions", "avatars", "orgs", "abilities", "user", "email", "AbilityError", "regexps", "Err", "roleIds", "orgId", "rest", "includesAll", "RolesError", "SubordinationError", "userId", "newPassword", "updates", "isEmpty", "sessionId", "_id", "type", "size", "_", "data", "org", "roleId", "role", "_abilities", "abilityLongId", "set", "paramId", "value", "_ids", "includesAny", "intersection", "pick", "CollectionMapPublication", "Publication", "AbilitiesPublication", "abilities", "user", "RolesPublication", "roles", "options", "projection", "sort", "transform", "roleDoc", "involves", "inheritedAbilities", "displayTitle", "_o", "userSubscriptionChangeListenerMap", "UserPublication", "users", "fieldsToUpdate", "isPublic", "key", "fieldsToPick", "subscription", "_id", "changeListener", "next", "session", "isSessionIdRequired", "userDoc", "UsersPublication", "wssc", "UsersExtendedPublication", "triggers", "SessionsPublication", "sessions", "userId", "OrgsPublication", "orgs", "orgDoc", "org", "OrgsExtendedPublication", "ownerIds", "slaveOrgs", "UsersServer", "_UsersServer", "options", "#initPromise", "#userWsMap", "#sessionsWsMap", "wss", "collections", "users", "isPublic", "publicationOptions", "extendedPublicationOptions", "userPublicationOptions", "rolesOptions", "orgsOptions", "incomingTransport", "rolesPublicationOptions", "orgsPublicationOptions", "orgsExtendedPublicationOptions", "Users", "user", "#handleUserCreate", "AbilitiesPublication", "RolesPublication", "UsersPublication", "UsersExtendedPublication", "OrgsPublication", "OrgsExtendedPublication", "SessionsPublication", "#handleUserIsOnline", "setupHandlers", "UserPublication", "#handleSessionDelete", "#handleUserPermissionsChange", "#handleClientRequestLogin", "#handleClientRequestLogout", "#handleClientClosed", "#makeSessionProps", "userAgent", "remoteAddress", "sessionProps", "wssc", "session", "shouldProlong", "sockets", "_id", "isOnline", "updates", "usersSubscription", "webSockets", "email", "password", "WSServerClient", "WSSCWithUser"]
7
7
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "insite-users-server-ws",
3
- "version": "2.5.0",
3
+ "version": "2.6.0",
4
4
  "description": "WebSocket API for users in inSite",
5
5
  "keywords": [
6
6
  "insite",
@@ -40,14 +40,15 @@
40
40
  },
41
41
  "dependencies": {
42
42
  "@nesvet/n": "^1.2.1",
43
- "insite-common": "^2.5.0",
44
- "insite-db": "^2.5.0",
45
- "insite-subscriptions-server": "^2.5.0",
46
- "insite-users-server": "^2.5.0",
47
- "insite-ws": "^2.5.0",
48
- "insite-ws-transfers": "^2.5.0"
43
+ "insite-common": "^2.6.0",
44
+ "insite-db": "^2.6.0",
45
+ "insite-subscriptions-server": "^2.6.0",
46
+ "insite-users-server": "^2.6.0",
47
+ "insite-ws": "^2.6.0",
48
+ "insite-ws-transfers": "^2.6.0"
49
49
  },
50
50
  "engines": {
51
- "node": ">=20.0.0"
51
+ "bun": ">=1.4.4",
52
+ "node": ">=22.0.0"
52
53
  }
53
54
  }