insite-users-server-ws 2.3.0 → 2.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Users as J}from"insite-users-server";function C(o){if(o instanceof Set){let e=[];for(let t of o)e.push(t._id);return e}return o.map(e=>e._id)}function g(){}var P=new WeakMap,A=class o extends Promise{constructor(e,t){let r,l;if(super((c,a)=>{r=c,l=a}),P.set(this,{resolve:r,reject:l}),t?.signal)if(t.signal.aborted)this.reject(new DOMException("Aborted","AbortError"));else{let c=()=>this.reject(new DOMException("Aborted","AbortError"));t.signal.addEventListener("abort",c),this.finally(()=>t.signal?.removeEventListener("abort",c))}if(typeof t?.timeout=="number"&&Number.isFinite(t.timeout)){let c=setTimeout(()=>this.reject(new DOMException("Timeout exceeded","TimeoutError")),t.timeout);this.finally(()=>clearTimeout(c))}e?.(this.resolve,this.reject)}isPending=!0;isFulfilled=!1;isRejected=!1;state="pending";result;resolve=e=>{if(this.isPending){this.isPending=!1,this.isFulfilled=!0,this.state="fulfilled",this.result=e;let t=P.get(this);t&&(t.resolve.call(this,e),P.delete(this))}};reject=e=>{if(this.isPending){this.isPending=!1,this.isRejected=!0,this.state="rejected",this.result=e;let t=P.get(this);t&&(t.reject.call(this,e),P.delete(this))}};static resolved(e){return new o(t=>t(e))}static rejected(e){return new o((t,r)=>r(e))}};function G(o,e=0,t={}){let{leading:r=!1,trailing:l=!0}=t,{maxWait:c=1/0}=t,a,s,i,n,u,p,f,y,R=async()=>{let S=Date.now();S>=i?(a=void 0,i=void 0,clearTimeout(s),s=void 0,typeof f=="function"&&await f(),x.resolve(y),p=r):(clearTimeout(a),a=setTimeout(R,i-S))},O=Number.isFinite(c)?()=>{f===b&&(f=!1),b(),s=setTimeout(O,c)}:null;async function b(){try{return y=await o.apply(n,u),y}catch(S){throw x.reject(S),S}}r&&typeof r=="boolean"&&(r=b),p=r,l&&typeof l=="boolean"&&(l=b),f=l;let x=Object.assign(function(...S){return u=S,n=this,i=Date.now()+e,f=l,x.promise.isPending||(x.promise=new A((V,Z)=>{x.resolve=V,x.reject=Z,typeof p=="function"&&(p(),p=!1,f===b&&(f=!1)),a||(a=setTimeout(R,e),O&&(s=setTimeout(O,c)))})),x.promise},{callback:o,promise:A.resolved(void 0),resolve:g,reject:g,run:b,clear:async S=>{clearTimeout(a),a=void 0,clearTimeout(s),s=void 0,x.resolve(S?await b():y)}});return x}G.noop=Object.assign(()=>{},{callback:g,promise:A.resolved(void 0),resolve:g,reject:g,run:g,clear:g});function U(o){for(let e in o)return!1;return!0}var m=class extends Error{constructor(e,t=null,r){typeof e=="object"?(r=e,e=r.message,delete r.message,t=null):t&&typeof t=="object"&&(r=t,t=null),super(e),this.tag=t,r&&Object.assign(this,r)}name="Err-or";tag};function B(o,e,t,r,l=!0){return Array.isArray(o)&&(o=o.length),typeof r!="string"&&(l=r??!0,r=t),(l?`${o}\xA0`:"")+B.raw(o,e,t,r)}B.raw=(o,e,t,r=t)=>{o=Math.abs(o);let l=o%10,c=o%100;return l===1&&c!==11?e:l>=2&&l<=4&&!(c>=12&&c<=15)?t:r};function j(o,e){return(e instanceof Set?[...e]:e).every(o instanceof Set?t=>o.has(t):t=>o.includes(t))}function L(o,e){return(e instanceof Set?[...e]:e).some(o instanceof Set?t=>o.has(t):t=>o.includes(t))}function T(...o){let e=[];if(o.length){let[t,...r]=o;e:for(let l of t){for(let c of r)if(c instanceof Set?!c.has(l):!c.includes(l))continue e;e.push(l)}}return e}function E(o,e){let t={};for(let r of e)r in o&&(t[r]=o[r]);return t}import{AbilityError as d,RolesError as w,SubordinationError as h}from"insite-users-server";var F={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function N({wss:o,users:e}){let{roles:t,sessions:r,avatars:l,orgs:c,abilities:a}=e;o.onRequest("users.people.check-email",({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!F.email.test(i))throw new m("Not email","email.not");if(e.byEmail.has(i))throw new m("Email already exists","email.exists")}),o.onRequest("users.people.create",async({user:s},{roles:i,org:n,...u})=>{if(!s?.abilities.inSite?.users)throw new d;if(!i.length||!j(s.slaveRoleIds,i))throw new w(i);if(n&&!s.slaveIds.includes(n))throw new h("slaveIds",n);await e.create({roles:i,org:n,...u})}),o.onRequest("users.people.change-password",async({user:s},i,n)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new h("permissiveIds",i);if(typeof n!="string")throw new m("Type of password is incorrect","password.wrong-type");if(!n)throw new m("Password can't be empty","password.empty");await e.changePassword(i,n)}),o.onRequest("users.people.update",async({user:s},i,n)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new h("permissiveIds",i);if(n.roles&&(!n.roles.length||!j(s.slaveRoleIds,n.roles)))throw new w(n.roles);if(n.org&&!s.slaveIds.includes(n.org))throw new h("slaveIds",n.org);if(U(n))throw new m("Empty updates","updates.empty");await e.updateUser(i,n,s)}),o.onRequest("users.people.delete",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveIds.includes(i))throw new h("slaveIds",i);await e.deleteUser(i)}),o.onRequest("users.sessions.destroy",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(e.bySessionId.get(i)?._id))throw new h("permissiveIds",e.bySessionId.get(i)?._id);await r.destroySession(i)}),o.onTransfer?.("users.avatars.upload",{begin({user:s},{metadata:{_id:i,type:n,size:u}}){if(!s||s._id!==i&&!s.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new h("permissiveIds",i);if(!l.TYPES_ACCEPTED.includes(n))throw new m(`Unacceptable avatar format: ${n}`,"avatar.unacceptable-format");if(u>l.MAX_SIZE)throw new m(`Avatar size exceeds limit of ${l.MAX_SIZE}: ${u}`,"avatar.size-exceeds-limit")},async end(s,{data:i,metadata:{_id:n,type:u}}){await l.save(n,u,i)}}),o.onRequest("users.avatars.delete",async({user:s},i)=>{if(!s||s._id!==i&&!s.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new h("permissiveIds",i);await l.deleteAvatar(i)}),o.onRequest("users.orgs.create",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!i.title)throw new m("Title can't be empty","title.empty");await c.create({...i,owners:[s._id]})}),o.onRequest("users.orgs.update",async({user:s},i,n)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveIds.includes(i))throw new h("slaveIds",i);if(n.title==="")throw new m("Title can't be empty","title.empty");if(n.owners&&!j(s.slaveIds,n.owners))throw new h("slaveIds",n.owners);if(U(n))throw new m("Empty updates","updates.empty");await c.updateOrg(i,n,s)}),o.onRequest("users.orgs.delete",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveIds.includes(i))throw new h("slaveIds",i);await c.deleteOrg(i)}),o.onRequest("users.roles.check-id",({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!F.role.test(i))throw new m("Role ID is incorrect","role.not-id");if(t.has(i))throw new m("Role ID already exists","role.exists")}),o.onRequest("users.roles.create",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;await t.create(i)}),o.onRequest("users.roles.update",async({user:s},i,{abilities:n,...u})=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);if(u.involves&&!j(s.slaveRoleIds,u.involves))throw new w(u.involves);await t.updateRole(i,u)}),o.onRequest("users.roles.set-ability",async({user:s},i,n,u)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);if(!a.hasAbility(s.abilities,n))throw new d(n);await t.setAbility(i,n,u)}),o.onRequest("users.roles.set-ability-param",async({user:s},i,n,u,p)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);if(!a.hasAbility(s.abilities,n))throw new d(n);if(!a.isParamFits(n,u,p,a.getParam(s.abilities,n,u)))throw new m("Wrong param value","ability.wrong-param");await t.setAbilityParam(i,n,u,p)}),o.onRequest("users.roles.delete",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);await t.deleteRole(i)})}import{CollectionMapPublication as v,Publication as K}from"insite-subscriptions-server/ws";var $=class extends K{constructor(e){super("abilities",{fetch({user:t}){return t?.abilities.inSite?.users?.roles?{abilities:e.getSchemeFor(t.abilities)}:null}})}},I=class extends v{constructor(e,t={}){let{projection:r={title:1,description:1},sort:l={_o:1},transform:c}=t;Object.assign(r,{involves:1,abilities:1}),super(e.collection,"roles",({user:a})=>a?.abilities.inSite?.users&&{query:{_id:{$in:a.slaveRoleIds}},projection:r,sort:l},a=>{let{involves:s,abilities:i,inheritedAbilities:n,displayTitle:u,_o:p}=e.get(a._id);Object.assign(a,{...a.involves?{ownInvolves:a.involves,involves:C(s),abilities:i,inheritedAbilities:n}:{},...r.title?{displayTitle:u}:{},_o:p}),c?.(a)})}},H=new WeakMap,k=class extends K{constructor(e,t={}){let{fieldsToUpdate:r=[],projection:l,transform:c,public:a}=t;for(let i of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!l||l[i]!==0)&&r.push(i);let s=["_id","email","name","initials","displayLabel","job","avatarUrl","abilities"];a||s.push("slaveIds"),super("user",{onSubscribe(i){let[{user:n}]=i.args;if(n){let{_id:u}=n,p=f=>{if("documentKey"in f&&f.documentKey._id===u)switch(f.operationType){case"update":if(!L(Object.keys(f.updateDescription.updatedFields),r))break;case"replace":case"delete":i.changed(f)}};e.collection.onChange(p),H.set(i,p)}},fetch({user:i,session:n},u){if(i){let p=E(i,s);if(a||Object.assign(p,{orgId:i.org._id,sessionId:u?n?._id:void 0,isOnline:!0}),l)for(let f in l)l[f]&&f in i?Object.assign(p,{[f]:i[f]}):delete p[f];return c?.(p),p}return null},onUnsubscribe(i){let n=H.get(i);n&&e.collection.removeChangeListener(n)}})}},M=class extends v{constructor(e,t={}){let{projection:r={email:1,name:1,org:1,job:1,avatar:1},sort:l={"name.last":1},transform:c}=t;super(e.collection,"users",a=>a.user?.abilities.login&&{query:{},projection:r,sort:l},a=>{let s=e.get(a._id);Object.assign(a,E(s,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:a.org}),delete a.org,delete a.avatar,c?.(a)})}},_=class extends v{constructor(e,t={}){let{projection:r={_id:1},sort:l,triggers:c=[],transform:a}=t;c.includes("roles")||c.push("roles"),super(e.collection,"users.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:r,sort:l,triggers:c},(s,[i])=>{let n=e.get(s._id);Object.assign(s,{roleIds:T(n.ownRoleIds,i.user.slaveRoleIds)}),a?.(s)})}},D=class extends v{constructor(e){super(e.collection,"users.people.sessions",({user:t},r)=>t?.abilities.inSite?.users&&t.permissiveIds.includes(r)&&{query:{user:r},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},W=class extends v{constructor(e,t={}){let{projection:r={title:1},sort:l={title:1},transform:c}=t;super(e.collection,"orgs",a=>a.user?.abilities.login&&{query:{},projection:r,sort:l},a=>{let s=e.get(a._id);Object.assign(a,E(s,["initials","displayLabel"])),c?.(a)})}},q=class extends v{constructor(e,t={}){let{projection:r={note:1},sort:l={_o:1},triggers:c=[],transform:a}=t;c.includes("owners")||c.push("owners"),super(e.collection,"orgs.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:r,sort:l,triggers:c},(s,[{user:i}])=>{let n=e.get(s._id),{ownerIds:u,slaveOrgs:p,_o:f}=n;Object.assign(s,{owners:T(u,i.slaveIds),slaveOrgs:C(T(p,i.slaveOrgs)),_o:f}),a?.(s)})}};var X=class o{constructor(e){this.#i=this.init(e)}#e=new WeakMap;#t=new WeakMap;wss;users;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async e=>{let{wss:t,collections:r,users:l,public:c,publication:a,extendedPublication:s,userPublication:i,roles:n={},orgs:u={},incomingTransport:p}=e,{publication:f}=n,{publication:y,extendedPublication:R}=u;this.wss=t,this.users=l instanceof J?l:await J.init(r,l),this.incomingTransport=p;for(let O of this.users.values())this.#o(O);return c||(this.abilitiesPublication=new $(this.users.abilities),this.rolesPublication=new I(this.users.roles,f),this.usersPublication=new M(this.users,a),this.usersExtendedPublication=new _(this.users,s),this.orgsPublication=new W(this.users.orgs,y),this.orgsExtendedPublication=new q(this.users.orgs,R),this.sessionsPublication=new D(this.users.sessions),this.users.on("user-is-online",this.#r),N(this)),this.userPublication=new k(this.users,{public:c,...i}),this.users.on("user-create",this.#o),this.users.on("session-delete",this.#n),this.users.on("user-permissions-change",this.#l),this.wss.onRequest("login",this.#a),this.wss.onRequest("logout",this.#c),this.wss.on("client-closed",this.#u),this};#i;whenReady(){return this.#i}#s({userAgent:e,remoteAddress:t,sessionProps:r}){return{userAgent:e,remoteAddress:t,...r,isOnline:!0}}setSession(e,t,r){t===null?t=void 0:typeof t=="string"&&(t=this.users.sessions.get(t)),e.session!==t&&(e.session&&this.#t.delete(e.session),t&&!e.isRejected?(e.session=t,e.user=t.user,e.lastUserId=t.user._id,this.#e.get(t.user)?.add(e),this.#t.set(t,e),r&&t.prolong(this.#s(e))):(delete e.session,delete e.user,this.#e.get(e.user)?.delete(e)),this.wss.emit("client-session",e,r))}#o=e=>this.#e.set(e,new Set);#r=({_id:e,isOnline:t})=>{let r={_id:e,isOnline:t};for(let l of this.usersPublication.subscriptions){let[c]=l.args;c.user&&c.user._id!==e&&l.handler([["u",r,!0]])}};#n=e=>{let t=this.#t.get(e);t&&this.setSession(t,null)};#l=e=>{let t=this.#e.get(e);t&&this.wss.emit("should-renew-subscriptions",[...t])};#a=async(e,t,r)=>{if(!e.isRejected){let l=await this.users.login(t,r,this.#s(e));l&&this.setSession(e,l)}};#c=async e=>{e.session&&(await this.users.logout(e.session),this.setSession(e,null))};#u=async e=>{await e.session?.offline(),this.setSession(e,null)};static init(e){return new o(e).whenReady()}};import{WSServerClient as Y}from"insite-ws/server";var z=class extends Y{isRejected;sessionProps;user;lastUserId;session};export{X as UsersServer,z as WSSCWithUser};
1
+ import{Users as K}from"insite-users-server";function q(r){if(r instanceof Set){let e=[];for(let t of r)e.push(t._id);return e}return r.map(e=>e._id)}function S(){}var P=new WeakMap,A=class r extends Promise{constructor(e,t){let o,l;if(super((a,c)=>{o=a,l=c}),P.set(this,{resolve:o,reject:l}),t?.signal)if(t.signal.aborted)this.reject(new DOMException("Aborted","AbortError"));else{let a=()=>this.reject(new DOMException("Aborted","AbortError"));t.signal.addEventListener("abort",a),this.finally(()=>t.signal?.removeEventListener("abort",a))}if(typeof t?.timeout=="number"&&Number.isFinite(t.timeout)){let a=setTimeout(()=>this.reject(new DOMException("Timeout exceeded","TimeoutError")),t.timeout);this.finally(()=>clearTimeout(a))}e?.(this.resolve,this.reject)}isPending=!0;isFulfilled=!1;isRejected=!1;state="pending";result;resolve=e=>{if(this.isPending){this.isPending=!1,this.isFulfilled=!0,this.state="fulfilled",this.result=e;let t=P.get(this);t&&(t.resolve.call(this,e),P.delete(this))}};reject=e=>{if(this.isPending){this.isPending=!1,this.isRejected=!0,this.state="rejected",this.result=e;let t=P.get(this);t&&(t.reject.call(this,e),P.delete(this))}};static resolved(e){return new r(t=>t(e))}static rejected(e){return new r((t,o)=>o(e))}};function G(r,e=0,t={}){let{leading:o=!1,trailing:l=!0}=t,{maxWait:a=1/0}=t,c,s,i,n,u,p,f,y,E=async()=>{let g=Date.now();g>=i?(c=void 0,i=void 0,clearTimeout(s),s=void 0,typeof f=="function"&&await f(),x.resolve(y),p=o):(clearTimeout(c),c=setTimeout(E,i-g))},O=Number.isFinite(a)?()=>{f===b&&(f=!1),b(),s=setTimeout(O,a)}:null;async function b(){try{return y=await r.apply(n,u),y}catch(g){throw x.reject(g),g}}o&&typeof o=="boolean"&&(o=b),p=o,l&&typeof l=="boolean"&&(l=b),f=l;let x=Object.assign(function(...g){return u=g,n=this,i=Date.now()+e,f=l,x.promise.isPending||(x.promise=new A((X,Z)=>{x.resolve=X,x.reject=Z,typeof p=="function"&&(p(),p=!1,f===b&&(f=!1)),c||(c=setTimeout(E,e),O&&(s=setTimeout(O,a)))})),x.promise},{callback:r,promise:A.resolved(void 0),resolve:S,reject:S,run:b,clear:async g=>{clearTimeout(c),c=void 0,clearTimeout(s),s=void 0,x.resolve(g?await b():y)}});return x}G.noop=Object.assign(()=>{},{callback:S,promise:A.resolved(void 0),resolve:S,reject:S,run:S,clear:S});function R(r){for(let e in r)return!1;return!0}var h=class extends Error{constructor(e,t=null,o){typeof e=="object"?(o=e,e=o.message,delete o.message,t=null):t&&typeof t=="object"&&(o=t,t=null),super(e),this.tag=t,o&&Object.assign(this,o)}name="Err-or";tag};function B(r,e,t,o,l=!0){return Array.isArray(r)&&(r=r.length),typeof o!="string"&&(l=o??!0,o=t),(l?`${r}\xA0`:"")+B.raw(r,e,t,o)}B.raw=(r,e,t,o=t)=>{r=Math.abs(r);let l=r%10,a=r%100;return l===1&&a!==11?e:l>=2&&l<=4&&!(a>=12&&a<=15)?t:o};function j(r,e){return(e instanceof Set?[...e]:e).every(r instanceof Set?t=>r.has(t):t=>r.includes(t))}function F(r,e){return(e instanceof Set?[...e]:e).some(r instanceof Set?t=>r.has(t):t=>r.includes(t))}function U(...r){let e=[];if(r.length){let[t,...o]=r;e:for(let l of t){for(let a of o)if(a instanceof Set?!a.has(l):!a.includes(l))continue e;e.push(l)}}return e}function k(r,e){let t={};for(let o of e)o in r&&(t[o]=r[o]);return t}import{AbilityError as d,RolesError as w,SubordinationError as m}from"insite-users-server";var N={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function L({wss:r,users:e}){let{roles:t,sessions:o,avatars:l,orgs:a,abilities:c}=e;r.onRequest("users.people.check-email",({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!N.email.test(i))throw new h("Not email","email.not");if(e.byEmail.has(i))throw new h("Email already exists","email.exists")}),r.onRequest("users.people.create",async({user:s},{roles:i,org:n,...u})=>{if(!s?.abilities.inSite?.users)throw new d;if(!i.length||!j(s.slaveRoleIds,i))throw new w(i);if(n&&!s.slaveIds.includes(n))throw new m("slaveIds",n);await e.create({roles:i,org:n,...u})}),r.onRequest("users.people.change-password",async({user:s},i,n)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new m("permissiveIds",i);if(typeof n!="string")throw new h("Type of password is incorrect","password.wrong-type");if(!n)throw new h("Password can't be empty","password.empty");await e.changePassword(i,n)}),r.onRequest("users.people.update",async({user:s},i,n)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new m("permissiveIds",i);if(n.roles&&(!n.roles.length||!j(s.slaveRoleIds,n.roles)))throw new w(n.roles);if(n.org&&!s.slaveIds.includes(n.org))throw new m("slaveIds",n.org);if(R(n))throw new h("Empty updates","updates.empty");await e.updateUser(i,n,s)}),r.onRequest("users.people.delete",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveIds.includes(i))throw new m("slaveIds",i);await e.deleteUser(i)}),r.onRequest("users.sessions.destroy",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(e.bySessionId.get(i)?._id))throw new m("permissiveIds",e.bySessionId.get(i)?._id);await o.destroySession(i)}),r.onTransfer?.("users.avatars.upload",{begin({user:s},{metadata:{_id:i,type:n,size:u}}){if(!s||s._id!==i&&!s.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new m("permissiveIds",i);if(!l.TYPES_ACCEPTED.includes(n))throw new h(`Unacceptable avatar format: ${n}`,"avatar.unacceptable-format");if(u>l.MAX_SIZE)throw new h(`Avatar size exceeds limit of ${l.MAX_SIZE}: ${u}`,"avatar.size-exceeds-limit")},async end(s,{data:i,metadata:{_id:n,type:u}}){await l.save(n,u,i)}}),r.onRequest("users.avatars.delete",async({user:s},i)=>{if(!s||s._id!==i&&!s.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new m("permissiveIds",i);await l.deleteAvatar(i)}),r.onRequest("users.orgs.create",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!i.title)throw new h("Title can't be empty","title.empty");await a.create({...i,owners:[s._id]})}),r.onRequest("users.orgs.update",async({user:s},i,n)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveIds.includes(i))throw new m("slaveIds",i);if(n.title==="")throw new h("Title can't be empty","title.empty");if(n.owners&&!j(s.slaveIds,n.owners))throw new m("slaveIds",n.owners);if(R(n))throw new h("Empty updates","updates.empty");await a.updateOrg(i,n,s)}),r.onRequest("users.orgs.delete",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveIds.includes(i))throw new m("slaveIds",i);await a.deleteOrg(i)}),r.onRequest("users.roles.check-id",({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!N.role.test(i))throw new h("Role ID is incorrect","role.not-id");if(t.has(i))throw new h("Role ID already exists","role.exists")}),r.onRequest("users.roles.create",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;await t.create(i)}),r.onRequest("users.roles.update",async({user:s},i,{abilities:n,...u})=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);if(u.involves&&!j(s.slaveRoleIds,u.involves))throw new w(u.involves);await t.updateRole(i,u)}),r.onRequest("users.roles.set-ability",async({user:s},i,n,u)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);if(!c.hasAbility(s.abilities,n))throw new d(n);await t.setAbility(i,n,u)}),r.onRequest("users.roles.set-ability-param",async({user:s},i,n,u,p)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);if(!c.hasAbility(s.abilities,n))throw new d(n);if(!c.isParamFits(n,u,p,c.getParam(s.abilities,n,u)))throw new h("Wrong param value","ability.wrong-param");await t.setAbilityParam(i,n,u,p)}),r.onRequest("users.roles.delete",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);await t.deleteRole(i)})}import{CollectionMapPublication as v,Publication as J}from"insite-subscriptions-server/ws";var $=class extends J{constructor(e){super("abilities",{fetch({user:t}){return t?.abilities.inSite?.users?.roles?{abilities:e.getSchemeFor(t.abilities)}:null}})}},T=class extends v{constructor(e,t={}){let{projection:o={title:1,description:1},sort:l={_o:1},transform:a}=t;Object.assign(o,{involves:1,abilities:1}),super(e.collection,"roles",({user:c})=>c?.abilities.inSite?.users&&{query:{_id:{$in:c.slaveRoleIds}},projection:o,sort:l},c=>{let{involves:s,abilities:i,inheritedAbilities:n,displayTitle:u,_o:p}=e.get(c._id);Object.assign(c,{...c.involves?{ownInvolves:c.involves,involves:q(s),abilities:i,inheritedAbilities:n}:{},...o.title?{displayTitle:u}:{},_o:p}),a?.(c)})}},z=new WeakMap,I=class extends J{constructor(e,t={}){let{fieldsToUpdate:o=[],projection:l,transform:a,public:c}=t;for(let i of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!l||l[i]!==0)&&o.push(i);let s=["_id","email","name","initials","displayLabel","job","avatarUrl","abilities"];c||s.push("slaveIds"),super("user",{onSubscribe(i){let[{user:n}]=i.args;if(n){let{_id:u}=n,p=f=>{if("documentKey"in f&&f.documentKey._id===u)switch(f.operationType){case"update":if(!F(Object.keys(f.updateDescription.updatedFields),o))break;case"replace":case"delete":i.changed(f)}};e.collection.onChange(p),z.set(i,p)}},fetch({user:i,session:n},u){if(i){let p=k(i,s);if(c||Object.assign(p,{orgId:i.org._id,sessionId:u?n?._id:void 0,isOnline:!0}),l)for(let f in l)l[f]&&f in i?Object.assign(p,{[f]:i[f]}):delete p[f];return a?.(p),p}return null},onUnsubscribe(i){let n=z.get(i);n&&e.collection.removeChangeListener(n)}})}},M=class extends v{constructor(e,t={}){let{projection:o={email:1,name:1,org:1,job:1,avatar:1},sort:l={"name.last":1},transform:a}=t;super(e.collection,"users",c=>c.user?.abilities.login&&{query:{},projection:o,sort:l},c=>{let s=e.get(c._id);Object.assign(c,k(s,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:c.org}),delete c.org,delete c.avatar,a?.(c)})}},D=class extends v{constructor(e,t={}){let{projection:o={_id:1},sort:l,triggers:a=[],transform:c}=t;a.includes("roles")||a.push("roles"),super(e.collection,"users.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:o,sort:l,triggers:a},(s,[i])=>{let n=e.get(s._id);Object.assign(s,{roleIds:U(n.ownRoleIds,i.user.slaveRoleIds)}),c?.(s)})}},_=class extends v{constructor(e){super(e.collection,"users.people.sessions",({user:t},o)=>t?.abilities.inSite?.users&&t.permissiveIds.includes(o)&&{query:{user:o},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},W=class extends v{constructor(e,t={}){let{projection:o={title:1},sort:l={title:1},transform:a}=t;super(e.collection,"orgs",c=>c.user?.abilities.login&&{query:{},projection:o,sort:l},c=>{let s=e.get(c._id);Object.assign(c,k(s,["initials","displayLabel"])),a?.(c)})}},C=class extends v{constructor(e,t={}){let{projection:o={note:1},sort:l={_o:1},triggers:a=[],transform:c}=t;a.includes("owners")||a.push("owners"),super(e.collection,"orgs.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:o,sort:l,triggers:a},(s,[{user:i}])=>{let n=e.get(s._id),{ownerIds:u,slaveOrgs:p,_o:f}=n;Object.assign(s,{owners:U(u,i.slaveIds),slaveOrgs:q(U(p,i.slaveOrgs)),_o:f}),c?.(s)})}};var V=class r{constructor(e){this.#i=this.init(e)}#e=new WeakMap;#t=new WeakMap;wss;users;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async e=>{let{wss:t,collections:o,users:l,public:a,publication:c,extendedPublication:s,userPublication:i,roles:n={},orgs:u={},incomingTransport:p}=e,{publication:f}=n,{publication:y,extendedPublication:E}=u;this.wss=t,this.users=l instanceof K?l:await K.init(o,l),this.incomingTransport=p;for(let O of this.users.values())this.#r(O);return a||(this.abilitiesPublication=new $(this.users.abilities),this.rolesPublication=new T(this.users.roles,f),this.usersPublication=new M(this.users,c),this.usersExtendedPublication=new D(this.users,s),this.orgsPublication=new W(this.users.orgs,y),this.orgsExtendedPublication=new C(this.users.orgs,E),this.sessionsPublication=new _(this.users.sessions),this.users.on("user-is-online",this.#o),L(this)),this.userPublication=new I(this.users,{public:a,...i}),this.users.on("user-create",this.#r),this.users.on("session-delete",this.#n),this.users.on("user-permissions-change",this.#l),this.wss.onRequest("login",this.#c),this.wss.onRequest("logout",this.#a),this.wss.on("client-close",this.#u),this};#i;whenReady(){return this.#i}#s({userAgent:e,remoteAddress:t,sessionProps:o}){return{userAgent:e,remoteAddress:t,...o,isOnline:!0}}setSession(e,t,o){t===null?t=void 0:typeof t=="string"&&(t=this.users.sessions.get(t)),e.session!==t&&(e.session&&this.#t.delete(e.session),t&&!e.isRejected?(e.session=t,e.user=t.user,e.lastUserId=t.user._id,this.#e.get(t.user)?.add(e),this.#t.set(t,e),o&&t.prolong(this.#s(e))):(delete e.session,delete e.user,this.#e.get(e.user)?.delete(e)),this.wss.emit("client-session",e,o))}#r=e=>this.#e.set(e,new Set);#o=({_id:e,isOnline:t})=>{let o={_id:e,isOnline:t};for(let l of this.usersPublication.subscriptions){let[a]=l.args;a.user&&a.user._id!==e&&l.handler([["u",o,!0]])}};#n=e=>{let t=this.#t.get(e);t&&this.setSession(t,null)};#l=e=>{let t=this.#e.get(e);t&&this.wss.emit("should-renew-subscriptions",[...t])};#c=async(e,t,o)=>{if(!e.isRejected){let l=await this.users.login(t,o,this.#s(e));l&&this.setSession(e,l)}};#a=async e=>{e.session&&(await this.users.logout(e.session),this.setSession(e,null))};#u=async e=>{await e.session?.offline(),this.setSession(e,null)};static init(e){return new r(e).whenReady()}};import{WSServerClient as Y}from"insite-ws/server";var H=class extends Y{isRejected;sessionProps;user;lastUserId;session};export{V as UsersServer,H 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", "../../../../@nesvet/npm/n/src/_ids.ts", "../../../../@nesvet/npm/n/src/noop.ts", "../../../../@nesvet/npm/n/src/StatefulPromise.ts", "../../../../@nesvet/npm/n/src/debounce.ts", "../../../../@nesvet/npm/n/src/isEmpty.ts", "../../../../@nesvet/npm/n/src/Err.ts", "../../../../@nesvet/npm/n/src/howmuch.ts", "../../../../@nesvet/npm/n/src/includesAll.ts", "../../../../@nesvet/npm/n/src/includesAny.ts", "../../../../@nesvet/npm/n/src/intersection.ts", "../../../../@nesvet/npm/n/src/pick.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-closed\", 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", "export function _ids<T extends { _id: string }>(iterable: Set<T> | T[]): string[] {\n\tif (iterable instanceof Set) {\n\t\tconst ids = [];\n\t\t\n\t\tfor (const object of iterable)\n\t\t\tids.push(object._id);\n\t\t\n\t\treturn ids;\n\t}\n\t\n\treturn iterable.map(object => object._id);\n}\n", "export function noop() { /**/ }\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype Value<T> = PromiseLike<T> | T;\ntype Resolve<T> = (value: Value<T>) => void;\ntype Reject = (reason?: any) => void;\n\ntype Options = {\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n};\n\nconst nativesMap = new WeakMap<StatefulPromise<any>, { resolve: Resolve<any>; reject: Reject }>();\n\n\nexport class StatefulPromise<T> extends Promise<T> {\n\tconstructor(\n\t\texecutor?: (resolve: Resolve<T>, reject: Reject) => void,\n\t\toptions?: Options\n\t) {\n\t\tlet nativeResolve: Resolve<T>;\n\t\tlet nativeReject: Reject;\n\t\t\n\t\tsuper((resolve, reject) => {\n\t\t\tnativeResolve = resolve;\n\t\t\tnativeReject = reject;\n\t\t\t\n\t\t});\n\t\t\n\t\tnativesMap.set(this, { resolve: nativeResolve!, reject: nativeReject! });\n\t\t\n\t\tif (options?.signal)\n\t\t\tif (options.signal.aborted)\n\t\t\t\tthis.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\telse {\n\t\t\t\tconst abortListener = () => this.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\t\t\n\t\t\t\toptions.signal.addEventListener(\"abort\", abortListener);\n\t\t\t\t\n\t\t\t\tthis.finally(() => options.signal?.removeEventListener(\"abort\", abortListener));\n\t\t\t}\n\t\t\n\t\tif (typeof options?.timeout === \"number\" && Number.isFinite(options.timeout)) {\n\t\t\tconst timeout = setTimeout(() => this.reject(new DOMException(\"Timeout exceeded\", \"TimeoutError\")), options.timeout);\n\t\t\t\n\t\t\tthis.finally(() => clearTimeout(timeout));\n\t\t}\n\t\t\n\t\texecutor?.(this.resolve, this.reject);\n\t\t\n\t}\n\t\n\tisPending = true;\n\tisFulfilled = false;\n\tisRejected = false;\n\t\n\tstate: \"fulfilled\" | \"pending\" | \"rejected\" = \"pending\";\n\t\n\tresult?: T | unknown;\n\t\n\treadonly resolve = (value: Value<T>) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isFulfilled = true;\n\t\t\tthis.state = \"fulfilled\";\n\t\t\tthis.result = value;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.resolve.call(this, value);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\treadonly reject = (reason?: any) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isRejected = true;\n\t\t\tthis.state = \"rejected\";\n\t\t\tthis.result = reason;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.reject.call(this, reason);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\t\n\tstatic resolved<U>(value: U): StatefulPromise<U> {\n\t\treturn new StatefulPromise<U>(resolve => resolve(value));\n\t}\n\t\n\tstatic rejected(reason: unknown): StatefulPromise<never> {\n\t\treturn new StatefulPromise((_, reject) => reject(reason));\n\t}\n\t\n}\n", "import { noop } from \"./noop.js\";\nimport { StatefulPromise } from \"./StatefulPromise.js\";\n\n\ntype Callback = (...args: any[]) => unknown;// eslint-disable-line @typescript-eslint/no-explicit-any\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\n\ntype DebouncedFunction<C extends Callback> = {\n\t(this: ThisParameterType<C>, ...args: Parameters<C>): Promise<Awaited<ReturnType<C>>>;\n};\n\nexport type Debounced<C extends Callback, R extends ReturnType<C>> = DebouncedFunction<C> & {\n\tcallback: C;\n\tpromise: StatefulPromise<R>;\n\tresolve: (value: R) => void;\n\treject: (reason?: unknown) => void;\n\trun(): Promise<R>;\n\tclear(shouldRun?: boolean): Promise<void>;\n};\n\n\nexport function debounce<C extends Callback, R extends ReturnType<C>>(callback: C, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet maxWaitTimeout: ReturnType<typeof setTimeout> | undefined;\n\tlet end: number | undefined;\n\tlet context: ThisParameterType<C>;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: R;\n\t\n\tconst expired = async () => {\n\t\t\n\t\tconst n = Date.now();\n\t\t\n\t\tif (n >= end!) {\n\t\t\ttimeout = undefined;\n\t\t\tend = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tmaxWaitTimeout = undefined;\n\t\t\t\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\t\n\t\t\tdebounced.resolve(result);\n\t\t\t\n\t\t\tinitial = leading;\n\t\t} else {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(expired, end! - n);\n\t\t}\n\t\t\n\t};\n\t\n\tconst maxWaitExpired = Number.isFinite(maxWait) ? () => {\n\t\t\n\t\tif (final === run)\n\t\t\tfinal = false;\n\t\t\n\t\trun();\n\t\t\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\ttry {\n\t\t\tresult = await callback.apply(context, args) as R;\n\t\t\t\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tdebounced.reject(error);\n\t\t\t\n\t\t\tthrow error;\n\t\t}\n\t}\n\t\n\tif (leading && typeof leading == \"boolean\")\n\t\tleading = run;\n\tinitial = leading;\n\t\n\tif (trailing && typeof trailing == \"boolean\")\n\t\ttrailing = run;\n\tfinal = trailing;\n\t\n\tconst debounced: Debounced<C, R> = Object.assign(function (..._args) {\n\t\targs = _args;\n\t\tcontext = this;// eslint-disable-line no-invalid-this\n\t\t\n\t\tend = Date.now() + limit;\n\t\tfinal = trailing;\n\t\t\n\t\tif (!debounced.promise.isPending)\n\t\t\tdebounced.promise = new StatefulPromise<R>((resolve, reject) => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\tdebounced.reject = reject;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\t\n\t\t\t\t\tinitial = false;\n\t\t\t\t\t\n\t\t\t\t\tif (final === run)\n\t\t\t\t\t\tfinal = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(expired, limit);\n\t\t\t\t\t\n\t\t\t\t\tif (maxWaitExpired)\n\t\t\t\t\t\tmaxWaitTimeout = setTimeout(maxWaitExpired, maxWait);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<C>, {\n\t\tcallback,\n\t\tpromise: StatefulPromise.resolved(undefined as unknown as R),\n\t\tresolve: noop,\n\t\treject: noop,\n\t\trun,\n\t\tclear: async (shouldRun?: boolean) => {\n\t\t\t\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tmaxWaitTimeout = undefined;\n\t\t\t\n\t\t\tdebounced.resolve(shouldRun ? await run() : result);\n\t\t\t\n\t\t}\n\t});\n\t\n\treturn debounced;\n}\n\n\ndebounce.noop = Object.assign(() => { /**/ }, {\n\tcallback: noop,\n\tpromise: StatefulPromise.resolved(undefined), // eslint-disable-line unicorn/no-useless-undefined\n\tresolve: noop,\n\treject: noop,\n\trun: noop,\n\tclear: noop\n}) as Debounced<() => void, void>;\n\n\nexport function throttle(callback: Callback, limit?: number, options?: Options) {\n\treturn debounce(callback, limit, {\n\t\tmaxWait: limit,\n\t\tleading: true,\n\t\ttrailing: true,\n\t\t...options\n\t});\n}\n", "export function isEmpty(object: object) {\n\tfor (const _ in object)// eslint-disable-line guard-for-in, no-unreachable-loop\n\t\treturn false;\n\t\n\treturn true;\n}\n", "/* eslint-disable unicorn/prevent-abbreviations, unicorn/custom-error-definition */\n\n\ntype Payload = Record<string, unknown>;\n\ntype PayloadWithMessage = Payload & {\n\tmessage: string;\n};\n\n\nexport class Err extends Error {\n\tconstructor(payload: PayloadWithMessage);\n\tconstructor(message: string, tag: string | null, payload?: Payload);\n\tconstructor(message: string, payload?: Payload);\n\tconstructor(message: PayloadWithMessage | string, tag: Payload | string | null = null, payload?: Payload) {\n\t\tif (typeof message == \"object\") {\n\t\t\tpayload = message;\n\t\t\tmessage = payload.message as string;\n\t\t\tdelete payload.message;\n\t\t\ttag = null;\n\t\t} else if (tag && typeof tag == \"object\") {\n\t\t\tpayload = tag;\n\t\t\ttag = null;\n\t\t}\n\t\t\n\t\tsuper(message);\n\t\t\n\t\tthis.tag = tag;\n\t\t\n\t\tif (payload)\n\t\t\tObject.assign(this, payload);\n\t\t\n\t}\n\t\n\tname = \"Err-or\";\n\t\n\ttag: string | null;\n\t\n}\n", "export function howmuch(number: [] | number, one: string, two: string, five: boolean | string, shouldPrintNumber = true) {\n\tif (Array.isArray(number))\n\t\tnumber = number.length;\n\t\n\tif (typeof five != \"string\") {\n\t\tshouldPrintNumber = five ?? true;\n\t\tfive = two;\n\t}\n\t\n\t\n\treturn (shouldPrintNumber ? `${number}\u00A0` : \"\") + howmuch.raw(number, one, two, five);\n}\n\nhowmuch.raw = (number: number, one: string, two: string, five = two) => {\n\tnumber = Math.abs(number);\n\tconst u = number % 10;\n\tconst d = number % 100;\n\t\n\treturn (\n\t\t(u === 1 && d !== 11) ?\n\t\t\tone :\n\t\t\t((u >= 2 && u <= 4) && !(d >= 12 && d <= 15)) ?\n\t\t\t\ttwo :\n\t\t\t\tfive\n\t);\n};\n", "export function includesAll<I>(iterable: I[] | Set<I>, items: I[] | Set<I>) {\n\treturn (\n\t\t(items instanceof Set ? [ ...items ] : items)\n\t\t\t.every(\n\t\t\t\titerable instanceof Set ?\n\t\t\t\t\titem => iterable.has(item) :\n\t\t\t\t\titem => iterable.includes(item)\n\t\t\t)\n\t);\n}\n", "export function includesAny<I>(iterable: I[] | Set<I>, items: I[] | Set<I>) {\n\treturn (\n\t\t(items instanceof Set ? [ ...items ] : items)\n\t\t\t.some(\n\t\t\t\titerable instanceof Set ?\n\t\t\t\t\titem => iterable.has(item) :\n\t\t\t\t\titem => iterable.includes(item)\n\t\t\t)\n\t);\n}\n", "export function intersection<I>(...iterables: (I[] | Set<I>)[]): I[] {\n\t\n\tconst intersectionArray = [];\n\t\n\tif (iterables.length) {\n\t\tconst [ firstIterable, ...otherIterables ] = iterables;\n\t\t\n\t\tmainLoop: for (const item of firstIterable) {\n\t\t\tfor (const otherIterable of otherIterables)\n\t\t\t\tif (otherIterable instanceof Set ? !otherIterable.has(item) : !otherIterable.includes(item))\n\t\t\t\t\tcontinue mainLoop;\n\t\t\tintersectionArray.push(item);\n\t\t}\n\t}\n\t\n\treturn intersectionArray;\n}\n", "export function pick<O extends object, K extends keyof O>(object: O, keys: K[]) {\n\t\n\tconst picked: Partial<Pick<O, K>> = {};\n\t\n\tfor (const key of keys)\n\t\tif (key in object)\n\t\t\tpicked[key] = object[key];\n\t\n\treturn picked as Pick<O, K>;\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 {\n\tCollectionMapPublication,\n\tProjection,\n\tPublication,\n\tSubscriptionHandle\n} from \"insite-subscriptions-server/ws\";\nimport type {\n\tAbilitiesMap,\n\tOrgDoc,\n\tOrgs,\n\tRoleDoc,\n\tRoles,\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> {\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> {\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<SubscriptionHandle, (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> {\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> {\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> {\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, [ userId: string ]> {\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> {\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> {\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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",
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", "export function _ids<T extends { _id: string }>(iterable: Set<T> | T[]): string[] {\n\tif (iterable instanceof Set) {\n\t\tconst ids = [];\n\t\t\n\t\tfor (const object of iterable)\n\t\t\tids.push(object._id);\n\t\t\n\t\treturn ids;\n\t}\n\t\n\treturn iterable.map(object => object._id);\n}\n", "export function noop() { /**/ }\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype Value<T> = PromiseLike<T> | T;\ntype Resolve<T> = (value: Value<T>) => void;\ntype Reject = (reason?: any) => void;\n\ntype Options = {\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n};\n\nconst nativesMap = new WeakMap<StatefulPromise<any>, { resolve: Resolve<any>; reject: Reject }>();\n\n\nexport class StatefulPromise<T> extends Promise<T> {\n\tconstructor(\n\t\texecutor?: (resolve: Resolve<T>, reject: Reject) => void,\n\t\toptions?: Options\n\t) {\n\t\tlet nativeResolve: Resolve<T>;\n\t\tlet nativeReject: Reject;\n\t\t\n\t\tsuper((resolve, reject) => {\n\t\t\tnativeResolve = resolve;\n\t\t\tnativeReject = reject;\n\t\t\t\n\t\t});\n\t\t\n\t\tnativesMap.set(this, { resolve: nativeResolve!, reject: nativeReject! });\n\t\t\n\t\tif (options?.signal)\n\t\t\tif (options.signal.aborted)\n\t\t\t\tthis.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\telse {\n\t\t\t\tconst abortListener = () => this.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\t\t\n\t\t\t\toptions.signal.addEventListener(\"abort\", abortListener);\n\t\t\t\t\n\t\t\t\tthis.finally(() => options.signal?.removeEventListener(\"abort\", abortListener));\n\t\t\t}\n\t\t\n\t\tif (typeof options?.timeout === \"number\" && Number.isFinite(options.timeout)) {\n\t\t\tconst timeout = setTimeout(() => this.reject(new DOMException(\"Timeout exceeded\", \"TimeoutError\")), options.timeout);\n\t\t\t\n\t\t\tthis.finally(() => clearTimeout(timeout));\n\t\t}\n\t\t\n\t\texecutor?.(this.resolve, this.reject);\n\t\t\n\t}\n\t\n\tisPending = true;\n\tisFulfilled = false;\n\tisRejected = false;\n\t\n\tstate: \"fulfilled\" | \"pending\" | \"rejected\" = \"pending\";\n\t\n\tresult?: T | unknown;\n\t\n\treadonly resolve = (value: Value<T>) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isFulfilled = true;\n\t\t\tthis.state = \"fulfilled\";\n\t\t\tthis.result = value;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.resolve.call(this, value);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\treadonly reject = (reason?: any) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isRejected = true;\n\t\t\tthis.state = \"rejected\";\n\t\t\tthis.result = reason;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.reject.call(this, reason);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\t\n\tstatic resolved<U>(value: U): StatefulPromise<U> {\n\t\treturn new StatefulPromise<U>(resolve => resolve(value));\n\t}\n\t\n\tstatic rejected(reason: unknown): StatefulPromise<never> {\n\t\treturn new StatefulPromise((_, reject) => reject(reason));\n\t}\n\t\n}\n", "import { noop } from \"./noop.js\";\nimport { StatefulPromise } from \"./StatefulPromise.js\";\n\n\ntype Callback = (...args: any[]) => unknown;// eslint-disable-line @typescript-eslint/no-explicit-any\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\n\ntype DebouncedFunction<C extends Callback> = {\n\t(this: ThisParameterType<C>, ...args: Parameters<C>): Promise<Awaited<ReturnType<C>>>;\n};\n\nexport type Debounced<C extends Callback, R extends ReturnType<C>> = DebouncedFunction<C> & {\n\tcallback: C;\n\tpromise: StatefulPromise<R>;\n\tresolve: (value: R) => void;\n\treject: (reason?: unknown) => void;\n\trun(): Promise<R>;\n\tclear(shouldRun?: boolean): Promise<void>;\n};\n\n\nexport function debounce<C extends Callback, R extends ReturnType<C>>(callback: C, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet maxWaitTimeout: ReturnType<typeof setTimeout> | undefined;\n\tlet end: number | undefined;\n\tlet context: ThisParameterType<C>;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: R;\n\t\n\tconst expired = async () => {\n\t\t\n\t\tconst n = Date.now();\n\t\t\n\t\tif (n >= end!) {\n\t\t\ttimeout = undefined;\n\t\t\tend = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tmaxWaitTimeout = undefined;\n\t\t\t\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\t\n\t\t\tdebounced.resolve(result);\n\t\t\t\n\t\t\tinitial = leading;\n\t\t} else {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(expired, end! - n);\n\t\t}\n\t\t\n\t};\n\t\n\tconst maxWaitExpired = Number.isFinite(maxWait) ? () => {\n\t\t\n\t\tif (final === run)\n\t\t\tfinal = false;\n\t\t\n\t\trun();\n\t\t\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\ttry {\n\t\t\tresult = await callback.apply(context, args) as R;\n\t\t\t\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tdebounced.reject(error);\n\t\t\t\n\t\t\tthrow error;\n\t\t}\n\t}\n\t\n\tif (leading && typeof leading == \"boolean\")\n\t\tleading = run;\n\tinitial = leading;\n\t\n\tif (trailing && typeof trailing == \"boolean\")\n\t\ttrailing = run;\n\tfinal = trailing;\n\t\n\tconst debounced: Debounced<C, R> = Object.assign(function (..._args) {\n\t\targs = _args;\n\t\tcontext = this;// eslint-disable-line no-invalid-this\n\t\t\n\t\tend = Date.now() + limit;\n\t\tfinal = trailing;\n\t\t\n\t\tif (!debounced.promise.isPending)\n\t\t\tdebounced.promise = new StatefulPromise<R>((resolve, reject) => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\tdebounced.reject = reject;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\t\n\t\t\t\t\tinitial = false;\n\t\t\t\t\t\n\t\t\t\t\tif (final === run)\n\t\t\t\t\t\tfinal = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(expired, limit);\n\t\t\t\t\t\n\t\t\t\t\tif (maxWaitExpired)\n\t\t\t\t\t\tmaxWaitTimeout = setTimeout(maxWaitExpired, maxWait);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<C>, {\n\t\tcallback,\n\t\tpromise: StatefulPromise.resolved(undefined as unknown as R),\n\t\tresolve: noop,\n\t\treject: noop,\n\t\trun,\n\t\tclear: async (shouldRun?: boolean) => {\n\t\t\t\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tmaxWaitTimeout = undefined;\n\t\t\t\n\t\t\tdebounced.resolve(shouldRun ? await run() : result);\n\t\t\t\n\t\t}\n\t});\n\t\n\treturn debounced;\n}\n\n\ndebounce.noop = Object.assign(() => { /**/ }, {\n\tcallback: noop,\n\tpromise: StatefulPromise.resolved(undefined), // eslint-disable-line unicorn/no-useless-undefined\n\tresolve: noop,\n\treject: noop,\n\trun: noop,\n\tclear: noop\n}) as Debounced<() => void, void>;\n\n\nexport function throttle(callback: Callback, limit?: number, options?: Options) {\n\treturn debounce(callback, limit, {\n\t\tmaxWait: limit,\n\t\tleading: true,\n\t\ttrailing: true,\n\t\t...options\n\t});\n}\n", "export function isEmpty(object: object) {\n\tfor (const _ in object)// eslint-disable-line guard-for-in, no-unreachable-loop\n\t\treturn false;\n\t\n\treturn true;\n}\n", "/* eslint-disable unicorn/prevent-abbreviations, unicorn/custom-error-definition */\n\n\ntype Payload = Record<string, unknown>;\n\ntype PayloadWithMessage = Payload & {\n\tmessage: string;\n};\n\n\nexport class Err extends Error {\n\tconstructor(payload: PayloadWithMessage);\n\tconstructor(message: string, tag: string | null, payload?: Payload);\n\tconstructor(message: string, payload?: Payload);\n\tconstructor(message: PayloadWithMessage | string, tag: Payload | string | null = null, payload?: Payload) {\n\t\tif (typeof message == \"object\") {\n\t\t\tpayload = message;\n\t\t\tmessage = payload.message as string;\n\t\t\tdelete payload.message;\n\t\t\ttag = null;\n\t\t} else if (tag && typeof tag == \"object\") {\n\t\t\tpayload = tag;\n\t\t\ttag = null;\n\t\t}\n\t\t\n\t\tsuper(message);\n\t\t\n\t\tthis.tag = tag;\n\t\t\n\t\tif (payload)\n\t\t\tObject.assign(this, payload);\n\t\t\n\t}\n\t\n\tname = \"Err-or\";\n\t\n\ttag: string | null;\n\t\n}\n", "export function howmuch(number: [] | number, one: string, two: string, five: boolean | string, shouldPrintNumber = true) {\n\tif (Array.isArray(number))\n\t\tnumber = number.length;\n\t\n\tif (typeof five != \"string\") {\n\t\tshouldPrintNumber = five ?? true;\n\t\tfive = two;\n\t}\n\t\n\t\n\treturn (shouldPrintNumber ? `${number}\u00A0` : \"\") + howmuch.raw(number, one, two, five);\n}\n\nhowmuch.raw = (number: number, one: string, two: string, five = two) => {\n\tnumber = Math.abs(number);\n\tconst u = number % 10;\n\tconst d = number % 100;\n\t\n\treturn (\n\t\t(u === 1 && d !== 11) ?\n\t\t\tone :\n\t\t\t((u >= 2 && u <= 4) && !(d >= 12 && d <= 15)) ?\n\t\t\t\ttwo :\n\t\t\t\tfive\n\t);\n};\n", "export function includesAll<I>(iterable: I[] | Set<I>, items: I[] | Set<I>) {\n\treturn (\n\t\t(items instanceof Set ? [ ...items ] : items)\n\t\t\t.every(\n\t\t\t\titerable instanceof Set ?\n\t\t\t\t\titem => iterable.has(item) :\n\t\t\t\t\titem => iterable.includes(item)\n\t\t\t)\n\t);\n}\n", "export function includesAny<I>(iterable: I[] | Set<I>, items: I[] | Set<I>) {\n\treturn (\n\t\t(items instanceof Set ? [ ...items ] : items)\n\t\t\t.some(\n\t\t\t\titerable instanceof Set ?\n\t\t\t\t\titem => iterable.has(item) :\n\t\t\t\t\titem => iterable.includes(item)\n\t\t\t)\n\t);\n}\n", "export function intersection<I>(...iterables: (I[] | Set<I>)[]): I[] {\n\t\n\tconst intersectionArray = [];\n\t\n\tif (iterables.length) {\n\t\tconst [ firstIterable, ...otherIterables ] = iterables;\n\t\t\n\t\tmainLoop: for (const item of firstIterable) {\n\t\t\tfor (const otherIterable of otherIterables)\n\t\t\t\tif (otherIterable instanceof Set ? !otherIterable.has(item) : !otherIterable.includes(item))\n\t\t\t\t\tcontinue mainLoop;\n\t\t\tintersectionArray.push(item);\n\t\t}\n\t}\n\t\n\treturn intersectionArray;\n}\n", "export function pick<O extends object, K extends keyof O>(object: O, keys: K[]) {\n\t\n\tconst picked: Partial<Pick<O, K>> = {};\n\t\n\tfor (const key of keys)\n\t\tif (key in object)\n\t\t\tpicked[key] = object[key];\n\t\n\treturn picked as Pick<O, K>;\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 {\n\tCollectionMapPublication,\n\tProjection,\n\tPublication,\n\tSubscriptionHandle\n} from \"insite-subscriptions-server/ws\";\nimport type {\n\tAbilitiesMap,\n\tOrgDoc,\n\tOrgs,\n\tRoleDoc,\n\tRoles,\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> {\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> {\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<SubscriptionHandle, (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> {\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> {\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> {\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, [ userId: string ]> {\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> {\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> {\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
6
  "names": ["Users", "_ids", "iterable", "ids", "object", "noop", "nativesMap", "StatefulPromise", "_StatefulPromise", "executor", "options", "nativeResolve", "nativeReject", "resolve", "reject", "abortListener", "timeout", "value", "native", "reason", "_", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "error", "_args", "StatefulPromise", "resolve", "reject", "noop", "shouldRun", "isEmpty", "object", "_", "Err", "message", "tag", "payload", "howmuch", "number", "one", "two", "five", "shouldPrintNumber", "u", "d", "includesAll", "iterable", "items", "item", "includesAny", "iterable", "items", "item", "intersection", "iterables", "intersectionArray", "firstIterable", "otherIterables", "mainLoop", "item", "otherIterable", "pick", "object", "keys", "picked", "key", "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", "CollectionMapPublication", "Publication", "AbilitiesPublication", "abilities", "user", "RolesPublication", "roles", "options", "projection", "sort", "transform", "roleDoc", "involves", "inheritedAbilities", "displayTitle", "_o", "_ids", "userSubscriptionChangeListenerMap", "UserPublication", "users", "fieldsToUpdate", "isPublic", "key", "fieldsToPick", "subscription", "_id", "changeListener", "next", "includesAny", "session", "isSessionIdRequired", "userDoc", "pick", "UsersPublication", "wssc", "UsersExtendedPublication", "triggers", "intersection", "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"]
7
7
  }
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "insite-users-server-ws",
3
- "version": "2.3.0",
3
+ "version": "2.3.3",
4
4
  "description": "inSite users server side WebSocket API",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "module": "./dist/index.js",
8
- "packageManager": "bun@1.2.11",
8
+ "packageManager": "bun@1.2.18",
9
9
  "scripts": {
10
10
  "test": "echo \"Error: no test specified\" && exit 1",
11
11
  "build": "bun .conveyer.js",
@@ -24,18 +24,18 @@
24
24
  "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
25
25
  "license": "MIT",
26
26
  "dependencies": {
27
- "@nesvet/n": "^1.2.0",
28
- "insite-common": "^2.3.0",
29
- "insite-db": "^2.3.0",
30
- "insite-subscriptions-server": "^2.3.0",
31
- "insite-users-server": "^2.3.0",
32
- "insite-ws": "^2.3.0",
33
- "insite-ws-transfers": "^2.3.0"
27
+ "@nesvet/n": "^1.2.1",
28
+ "insite-common": "^2.3.3",
29
+ "insite-db": "^2.3.3",
30
+ "insite-subscriptions-server": "^2.3.3",
31
+ "insite-users-server": "^2.3.3",
32
+ "insite-ws": "^2.3.3",
33
+ "insite-ws-transfers": "^2.3.3"
34
34
  },
35
35
  "devDependencies": {
36
- "@nesvet/conveyer": "^2.5.2",
37
- "@nesvet/eslint-config": "^2.1.1",
38
- "@types/node": "^22.15.3",
36
+ "@nesvet/conveyer": "^2.6.1",
37
+ "@nesvet/eslint-config": "^2.1.2",
38
+ "@types/node": "^24.0.13",
39
39
  "@types/ws": "^8.18.1",
40
40
  "typescript": "^5.8.3"
41
41
  }