insite-users-server-ws 2.2.1 → 2.2.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.
@@ -1,7 +1,7 @@
1
1
  import type { AbilitiesSchema } from "insite-common";
2
- import { type Session, Users } from "insite-users-server";
2
+ import { Users, type Session } from "insite-users-server";
3
3
  import { AbilitiesPublication, OrgsExtendedPublication, OrgsPublication, RolesPublication, SessionsPublication, UserPublication, UsersExtendedPublication, UsersPublication } from "./publications";
4
- import type { Options } from "./types";
4
+ import type { OmitRedundant, Options } from "./types";
5
5
  import type { WSSCWithUser } from "./WSSCWithUser";
6
6
  export declare class UsersServer<AS extends AbilitiesSchema> {
7
7
  #private;
@@ -19,7 +19,7 @@ export declare class UsersServer<AS extends AbilitiesSchema> {
19
19
  sessionsPublication: SessionsPublication<AS>;
20
20
  init?: (options: Options<AS>) => Promise<this>;
21
21
  whenReady(): Promise<this>;
22
- setSession(wssc: WSSCWithUser<AS>, session: null | Session<AS> | string | undefined, shouldProlong?: boolean): void;
23
- static init<IAS extends AbilitiesSchema>(options: Options<IAS>): Promise<UsersServer<IAS>>;
22
+ setSession(wssc: WSSCWithUser<AS>, session: Session<AS> | string | null | undefined, shouldProlong?: boolean): void;
23
+ static init<IAS extends AbilitiesSchema, IO extends Options<IAS>, IUS extends UsersServer<IAS>>(options: IO): Promise<OmitRedundant<IUS, IO>>;
24
24
  }
25
25
  //# sourceMappingURL=UsersServer.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"UsersServer.d.ts","sourceRoot":"","sources":["../src/UsersServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EAKN,KAAK,OAAO,EAEZ,KAAK,EACL,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,qBAAa,WAAW,CAAC,EAAE,SAAS,eAAe;;gBACtC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;IAQhC,GAAG,EAAG,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,EAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,iBAAiB,EAAG,OAAO,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAErD,oBAAoB,EAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAChD,gBAAgB,EAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxC,gBAAgB,EAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxC,wBAAwB,EAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;IACxD,eAAe,EAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACtC,eAAe,EAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACtC,uBAAuB,EAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACtD,mBAAmB,EAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAE9C,IAAI,CAAC,GAAU,SAAS,OAAO,CAAC,EAAE,CAAC,mBAuDjC;IAIF,SAAS;IAaT,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,OAAO;IAmH5G,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,eAAe,EAAE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC;CAM9D"}
1
+ {"version":3,"file":"UsersServer.d.ts","sourceRoot":"","sources":["../src/UsersServer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAErD,OAAO,EACN,KAAK,EAKL,KAAK,OAAO,EAEZ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACN,oBAAoB,EACpB,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,wBAAwB,EACxB,gBAAgB,EAChB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,aAAa,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,qBAAa,WAAW,CAAC,EAAE,SAAS,eAAe;;gBACtC,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC;IAQhC,GAAG,EAAG,OAAO,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC;IACzB,KAAK,EAAG,KAAK,CAAC,EAAE,CAAC,CAAC;IAClB,iBAAiB,EAAG,OAAO,CAAC,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAErD,oBAAoB,EAAG,oBAAoB,CAAC,EAAE,CAAC,CAAC;IAChD,gBAAgB,EAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxC,gBAAgB,EAAG,gBAAgB,CAAC,EAAE,CAAC,CAAC;IACxC,wBAAwB,EAAG,wBAAwB,CAAC,EAAE,CAAC,CAAC;IACxD,eAAe,EAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACtC,eAAe,EAAG,eAAe,CAAC,EAAE,CAAC,CAAC;IACtC,uBAAuB,EAAG,uBAAuB,CAAC,EAAE,CAAC,CAAC;IACtD,mBAAmB,EAAG,mBAAmB,CAAC,EAAE,CAAC,CAAC;IAE9C,IAAI,CAAC,GAAU,SAAS,OAAO,CAAC,EAAE,CAAC,mBA+DjC;IAIF,SAAS;IAaT,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EAAE,aAAa,CAAC,EAAE,OAAO;IA6G5G,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,eAAe,EAAE,EAAE,SAAS,OAAO,CAAC,GAAG,CAAC,EAAE,GAAG,SAAS,WAAW,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,EAAE,GAAG,OAAO,CAAC,aAAa,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;CAM7I"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export type { Options } from "./types";
1
+ export type { Options, UsersServerWithActualProps } from "./types";
2
2
  export * from "./UsersServer";
3
3
  export * from "./WSSCWithUser";
4
4
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,OAAO,EAAE,0BAA0B,EAAE,MAAM,SAAS,CAAC;AACnE,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Users as H}from"insite-users-server";function C(o){if(o instanceof Set){let e=[];for(let i of o)e.push(i._id);return e}return o.map(e=>e._id)}function w(){}function z(o,e=0,i={}){let{leading:l=!1,trailing:a=!0}=i,{maxWait:u=1/0}=i,n,t,s,r,c,d,m,A,O=async()=>{let b=Date.now();b>=s?(n=void 0,s=void 0,clearTimeout(t),typeof m=="function"&&await m(),g.resolve(A),g.promise.isResolved=!0,d=l):(clearTimeout(n),n=setTimeout(O,s-b))},_=Number.isFinite(u)?()=>{m===x&&(m=!1),x(),t=setTimeout(_,u)}:null;async function x(){return A=await o.apply(r,c)}l&&typeof l=="boolean"&&(l=x),d=l,a&&typeof a=="boolean"&&(a=x),m=a;let g=Object.assign(function(...b){return c=b,r=this,s=Date.now()+e,m=a,g.promise.isResolved&&(g.promise=Object.assign(new Promise(X=>{g.resolve=X,typeof d=="function"&&(d(),d=!1,m===x&&(m=!1)),n||(n=setTimeout(O,e),_&&(t=setTimeout(_,u)))}),{isResolved:!1})),g.promise},{callback:o,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:w,run:x,clear:async b=>{clearTimeout(n),n=void 0,clearTimeout(t),g.promise.isResolved=!0,g.resolve(b?await x():A)}});return g}z.noop=Object.assign(()=>{},{callback:w,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:w,run:w,clear:w});function P(o){for(let e in o)return!1;return!0}var p=class extends Error{constructor(e,i=null,l){super(e),i&&typeof i=="object"&&(l=i,i=null),this.tag=i,l&&Object.assign(this,l)}name="Err-or";tag};function q(o,e,i,l,a=!0){return Array.isArray(o)&&(o=o.length),typeof l!="string"&&(a=l??!0,l=i),(a?`${o}\xA0`:"")+q.raw(o,e,i,l)}q.raw=(o,e,i,l=i)=>{o=Math.abs(o);let a=o%10,u=o%100;return a===1&&u!==11?e:a>=2&&a<=4&&!(u>=12&&u<=15)?i:l};function v(o,e){return(e instanceof Set?[...e]:e).every(o instanceof Set?i=>o.has(i):i=>o.includes(i))}function B(o,e){return(e instanceof Set?[...e]:e).some(o instanceof Set?i=>o.has(i):i=>o.includes(i))}function R(...o){let e=[];if(o.length){let[i,...l]=o;e:for(let a of i){for(let u of l)if(u instanceof Set?!u.has(a):!u.includes(a))continue e;e.push(a)}}return e}function j(o,e){let i={};for(let l of e)l in o&&(i[l]=o[l]);return i}import{AbilityError as f,RolesError as S,SubordinationError as h}from"insite-users-server";var M={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function F({wss:o,users:e}){let{roles:i,sessions:l,avatars:a,orgs:u,abilities:n}=e;o.onRequest("users.people.check-email",({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!M.email.test(s))throw new p("Not email","email.not");if(e.byEmail.has(s))throw new p("Email already exists","email.exists")}),o.onRequest("users.people.create",async({user:t},{roles:s,org:r,...c})=>{if(!t?.abilities.inSite?.users)throw new f;if(!s.length||!v(t.slaveRoleIds,s))throw new S(s);if(r&&!t.slaveIds.includes(r))throw new h("slaveIds",r);await e.create({roles:s,org:r,...c})}),o.onRequest("users.people.change-password",async({user:t},s,r)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);if(typeof r!="string")throw new p("Type of password is incorrect","password.wrong-type");if(!r)throw new p("Password can't be empty","password.empty");await e.changePassword(s,r)}),o.onRequest("users.people.update",async({user:t},s,r)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);if(r.roles&&(!r.roles.length||!v(t.slaveRoleIds,r.roles)))throw new S(r.roles);if(r.org&&!t.slaveIds.includes(r.org))throw new h("slaveIds",r.org);if(P(r))throw new p("Empty updates","updates.empty");await e.updateUser(s,r,t)}),o.onRequest("users.people.delete",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveIds.includes(s))throw new h("slaveIds",s);await e.deleteUser(s)}),o.onRequest("users.sessions.destroy",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(e.bySessionId.get(s)?._id))throw new h("permissiveIds",e.bySessionId.get(s)?._id);await l.destroySession(s)}),o.onTransfer?.("users.avatars.upload",{begin({user:t},{metadata:{_id:s,type:r,size:c}}){if(!t||t._id!==s&&!t.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);if(!a.TYPES_ACCEPTED.includes(r))throw new p(`Unacceptable avatar format: ${r}`,"avatar.unacceptable-format");if(c>a.MAX_SIZE)throw new p(`Avatar size exceeds limit of ${a.MAX_SIZE}: ${c}`,"avatar.size-exceeds-limit")},async end(t,{data:s,metadata:{_id:r,type:c}}){await a.save(r,c,s)}}),o.onRequest("users.avatars.delete",async({user:t},s)=>{if(!t||t._id!==s&&!t.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);await a.deleteAvatar(s)}),o.onRequest("users.orgs.create",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!s.title)throw new p("Title can't be empty","title.empty");await u.create({...s,owners:[t._id]})}),o.onRequest("users.orgs.update",async({user:t},s,r)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveIds.includes(s))throw new h("slaveIds",s);if(r.title==="")throw new p("Title can't be empty","title.empty");if(r.owners&&!v(t.slaveIds,r.owners))throw new h("slaveIds",r.owners);if(P(r))throw new p("Empty updates","updates.empty");await u.updateOrg(s,r,t)}),o.onRequest("users.orgs.delete",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveIds.includes(s))throw new h("slaveIds",s);await u.deleteOrg(s)}),o.onRequest("users.roles.check-id",({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!M.role.test(s))throw new p("Role ID is incorrect","role.not-id");if(i.has(s))throw new p("Role ID already exists","role.exists")}),o.onRequest("users.roles.create",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;await i.create(s)}),o.onRequest("users.roles.update",async({user:t},s,{abilities:r,...c})=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new S(s);if(c.involves&&!v(t.slaveRoleIds,c.involves))throw new S(c.involves);await i.updateRole(s,c)}),o.onRequest("users.roles.set-ability",async({user:t},s,r,c)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new S(s);if(!n.hasAbility(t.abilities,r))throw new f(r);await i.setAbility(s,r,c)}),o.onRequest("users.roles.set-ability-param",async({user:t},s,r,c,d)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new S(s);if(!n.hasAbility(t.abilities,r))throw new f(r);if(!n.isParamFits(r,c,d,n.getParam(t.abilities,r,c)))throw new p("Wrong param value","ability.wrong-param");await i.setAbilityParam(s,r,c,d)}),o.onRequest("users.roles.delete",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new S(s);await i.deleteRole(s)})}import{CollectionMapPublication as y,Publication as L}from"insite-subscriptions-server/ws";var U=class extends L{constructor(e){super("abilities",{fetch({user:i}){return i?.abilities.inSite?.users?.roles?{abilities:e.getSchemeFor(i.abilities)}:null}})}},T=class extends y{constructor(e,i={}){let{projection:l={title:1,description:1},sort:a={_o:1},transform:u}=i;Object.assign(l,{involves:1,abilities:1}),super(e.collection,"roles",({user:n})=>n?.abilities.inSite?.users&&{query:{_id:{$in:n.slaveRoleIds}},projection:l,sort:a},n=>{let{involves:t,abilities:s,inheritedAbilities:r,displayTitle:c,_o:d}=e.get(n._id);Object.assign(n,{...n.involves?{ownInvolves:n.involves,involves:C(t),abilities:s,inheritedAbilities:r}:{},...l.title?{displayTitle:c}:{},_o:d}),u?.(n)})}},N=new WeakMap,$=class extends L{constructor(e,i={}){let{fieldsToUpdate:l=[],projection:a,transform:u}=i;for(let n of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!a||a[n]!==0)&&l.push(n);super("user",{onSubscribe(n){let[{user:t}]=n.args;if(t){let{_id:s}=t,r=c=>{if("documentKey"in c&&c.documentKey._id===s)switch(c.operationType){case"update":if(!B(Object.keys(c.updateDescription.updatedFields),l))break;case"replace":case"delete":n.changed(c)}};e.collection.onChange(r),N.set(n,r)}},fetch({user:n,session:t},s){if(n){let r=j(n,["_id","email","name","initials","displayLabel","job","avatarUrl","abilities","slaveIds"]);if(Object.assign(r,{orgId:n.org._id,sessionId:s?t?._id:void 0,isOnline:!0}),a)for(let c in a)a[c]&&c in n?Object.assign(r,{[c]:n[c]}):delete r[c];return u?.(r),r}return null},onUnsubscribe(n){let t=N.get(n);t&&e.collection.removeChangeListener(t)}})}},E=class extends y{constructor(e,i={}){let{projection:l={email:1,name:1,org:1,job:1,avatar:1},sort:a={"name.last":1},transform:u}=i;super(e.collection,"users",n=>n.user?.abilities.login&&{query:{},projection:l,sort:a},n=>{let t=e.get(n._id);Object.assign(n,j(t,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:n.org}),delete n.org,delete n.avatar,u?.(n)})}},W=class extends y{constructor(e,i={}){let{projection:l={_id:1},sort:a,triggers:u=[],transform:n}=i;u.includes("roles")||u.push("roles"),super(e.collection,"users.extended",({user:t})=>t?.abilities.inSite?.users&&{query:{_id:{$in:t.slaveIds}},projection:l,sort:a,triggers:u},(t,[s])=>{let r=e.get(t._id);Object.assign(t,{roleIds:R(r.ownRoleIds,s.user.slaveRoleIds)}),n?.(t)})}},I=class extends y{constructor(e){super(e.collection,"users.people.sessions",({user:i},l)=>i?.abilities.inSite?.users&&i.permissiveIds.includes(l)&&{query:{user:l},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},k=class extends y{constructor(e,i={}){let{projection:l={title:1},sort:a={title:1},transform:u}=i;super(e.collection,"orgs",n=>n.user?.abilities.login&&{query:{},projection:l,sort:a},n=>{let t=e.get(n._id);Object.assign(n,j(t,["initials","displayLabel"])),u?.(n)})}},D=class extends y{constructor(e,i={}){let{projection:l={note:1},sort:a={_o:1},triggers:u=[],transform:n}=i;u.includes("owners")||u.push("owners"),super(e.collection,"orgs.extended",({user:t})=>t?.abilities.inSite?.users&&{query:{_id:{$in:t.slaveIds}},projection:l,sort:a,triggers:u},(t,[{user:s}])=>{let r=e.get(t._id),{ownerIds:c,slaveOrgs:d,_o:m}=r;Object.assign(t,{owners:R(c,s.slaveIds),slaveOrgs:C(R(d,s.slaveOrgs)),_o:m}),n?.(t)})}};var K=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:i,collections:l,users:a,publication:u,extendedPublication:n,userPublication:t,roles:s={},orgs:r={},incomingTransport:c}=e,{publication:d}=s,{publication:m,extendedPublication:A}=r;this.wss=i,this.users=a instanceof H?a:await H.init(l,a),this.incomingTransport=c;for(let O of this.users.values())this.#o(O);return this.abilitiesPublication=new U(this.users.abilities),this.rolesPublication=new T(this.users.roles,d),this.usersPublication=new E(this.users,u),this.usersExtendedPublication=new W(this.users,n),this.userPublication=new $(this.users,t),this.orgsPublication=new k(this.users.orgs,m),this.orgsExtendedPublication=new D(this.users.orgs,A),this.sessionsPublication=new I(this.users.sessions),this.users.on("roles-update",this.#l),this.users.on("roles-role-update",this.#a),this.users.on("user-create",this.#o),this.users.on("user-is-online",this.#c),this.users.on("session-delete",this.#u),this.users.on("orgs-update",this.#f),this.users.on("orgs-org-update",this.#p),this.users.on("user-permissions-change",this.#d),this.wss.onRequest("login",this.#m),this.wss.onRequest("logout",this.#h),this.wss.on("client-closed",this.#g),F(this),this};#i;whenReady(){return this.#i}#s({userAgent:e,remoteAddress:i,sessionProps:l}){return{userAgent:e,remoteAddress:i,...l,isOnline:!0}}setSession(e,i,l){i===null?i=void 0:typeof i=="string"&&(i=this.users.sessions.get(i)),e.session!==i&&(e.session&&this.#t.delete(e.session),i&&!e.isRejected?(e.session=i,e.user=i.user,e.lastUserId=i.user._id,this.#e.get(i.user)?.add(e),this.#t.set(i,e),l&&i.prolong(this.#s(e))):(delete e.session,delete e.user,this.#e.get(e.user)?.delete(e)),this.wss.emit("client-session",e,l))}#r=async(e,i,l)=>{if(!e.isRejected){let a=await this.users.login(i,l,this.#s(e));a&&this.setSession(e,a)}};#n=e=>{e.session&&(this.users.logout(e.session),this.setSession(e,null))};#l=()=>this.rolesPublication.flushInitial();#a=(e,i)=>i&&this.rolesPublication.skip(i);#o=e=>this.#e.set(e,new Set);#c=({_id:e,isOnline:i})=>{let l={_id:e,isOnline:i};for(let a of this.usersPublication.subscriptions){let[u]=a.args;u.user&&u.user._id!==e&&a.handler([["u",l,!0]])}};#u=e=>{let i=this.#t.get(e);i&&this.setSession(i,null)};#f=()=>{this.orgsPublication.flushInitial(),this.orgsExtendedPublication.flushInitial()};#p=(e,i)=>{i&&(this.orgsPublication.skip(i),this.orgsExtendedPublication.skip(i))};#d=e=>{let i=this.#e.get(e);i&&this.wss.emit("should-renew-subscriptions",[...i])};#m=(e,i,l)=>this.#r(e,i,l);#h=e=>this.#n(e);#g=e=>{e.session?.offline(),this.setSession(e,null)};static init(e){return new o(e).whenReady()}};import{WSServerClient as V}from"insite-ws/server";var J=class extends V{isRejected;sessionProps;user;lastUserId;session};export{K as UsersServer,J as WSSCWithUser};
1
+ import{Users as H}from"insite-users-server";function M(o){if(o instanceof Set){let e=[];for(let s of o)e.push(s._id);return e}return o.map(e=>e._id)}function w(){}function z(o,e=0,s={}){let{leading:n=!1,trailing:l=!0}=s,{maxWait:c=1/0}=s,a,i,t,r,u,p,f,A,P=async()=>{let b=Date.now();b>=t?(a=void 0,t=void 0,clearTimeout(i),typeof f=="function"&&await f(),x.resolve(A),x.promise.isResolved=!0,p=n):(clearTimeout(a),a=setTimeout(P,t-b))},v=Number.isFinite(c)?()=>{f===S&&(f=!1),S(),i=setTimeout(v,c)}:null;async function S(){return A=await o.apply(r,u)}n&&typeof n=="boolean"&&(n=S),p=n,l&&typeof l=="boolean"&&(l=S),f=l;let x=Object.assign(function(...b){return u=b,r=this,t=Date.now()+e,f=l,x.promise.isResolved&&(x.promise=Object.assign(new Promise(X=>{x.resolve=X,typeof p=="function"&&(p(),p=!1,f===S&&(f=!1)),a||(a=setTimeout(P,e),v&&(i=setTimeout(v,c)))}),{isResolved:!1})),x.promise},{callback:o,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:w,run:S,clear:async b=>{clearTimeout(a),a=void 0,clearTimeout(i),x.promise.isResolved=!0,x.resolve(b?await S():A)}});return x}z.noop=Object.assign(()=>{},{callback:w,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:w,run:w,clear:w});function R(o){for(let e in o)return!1;return!0}var m=class extends Error{constructor(e,s=null,n){typeof e=="object"?(n=e,e=n.message,delete n.message,s=null):s&&typeof s=="object"&&(n=s,s=null),super(e),this.tag=s,n&&Object.assign(this,n)}name="Err-or";tag};function q(o,e,s,n,l=!0){return Array.isArray(o)&&(o=o.length),typeof n!="string"&&(l=n??!0,n=s),(l?`${o}\xA0`:"")+q.raw(o,e,s,n)}q.raw=(o,e,s,n=s)=>{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)?s:n};function O(o,e){return(e instanceof Set?[...e]:e).every(o instanceof Set?s=>o.has(s):s=>o.includes(s))}function B(o,e){return(e instanceof Set?[...e]:e).some(o instanceof Set?s=>o.has(s):s=>o.includes(s))}function j(...o){let e=[];if(o.length){let[s,...n]=o;e:for(let l of s){for(let c of n)if(c instanceof Set?!c.has(l):!c.includes(l))continue e;e.push(l)}}return e}function U(o,e){let s={};for(let n of e)n in o&&(s[n]=o[n]);return s}import{AbilityError as d,RolesError as g,SubordinationError as h}from"insite-users-server";var C={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function F({wss:o,users:e}){let{roles:s,sessions:n,avatars:l,orgs:c,abilities:a}=e;o.onRequest("users.people.check-email",({user:i},t)=>{if(!i?.abilities.inSite?.users)throw new d;if(!C.email.test(t))throw new m("Not email","email.not");if(e.byEmail.has(t))throw new m("Email already exists","email.exists")}),o.onRequest("users.people.create",async({user:i},{roles:t,org:r,...u})=>{if(!i?.abilities.inSite?.users)throw new d;if(!t.length||!O(i.slaveRoleIds,t))throw new g(t);if(r&&!i.slaveIds.includes(r))throw new h("slaveIds",r);await e.create({roles:t,org:r,...u})}),o.onRequest("users.people.change-password",async({user:i},t,r)=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.permissiveIds.includes(t))throw new h("permissiveIds",t);if(typeof r!="string")throw new m("Type of password is incorrect","password.wrong-type");if(!r)throw new m("Password can't be empty","password.empty");await e.changePassword(t,r)}),o.onRequest("users.people.update",async({user:i},t,r)=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.permissiveIds.includes(t))throw new h("permissiveIds",t);if(r.roles&&(!r.roles.length||!O(i.slaveRoleIds,r.roles)))throw new g(r.roles);if(r.org&&!i.slaveIds.includes(r.org))throw new h("slaveIds",r.org);if(R(r))throw new m("Empty updates","updates.empty");await e.updateUser(t,r,i)}),o.onRequest("users.people.delete",async({user:i},t)=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.slaveIds.includes(t))throw new h("slaveIds",t);await e.deleteUser(t)}),o.onRequest("users.sessions.destroy",async({user:i},t)=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.permissiveIds.includes(e.bySessionId.get(t)?._id))throw new h("permissiveIds",e.bySessionId.get(t)?._id);await n.destroySession(t)}),o.onTransfer?.("users.avatars.upload",{begin({user:i},{metadata:{_id:t,type:r,size:u}}){if(!i||i._id!==t&&!i.abilities.inSite?.users)throw new d;if(!i.permissiveIds.includes(t))throw new h("permissiveIds",t);if(!l.TYPES_ACCEPTED.includes(r))throw new m(`Unacceptable avatar format: ${r}`,"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(i,{data:t,metadata:{_id:r,type:u}}){await l.save(r,u,t)}}),o.onRequest("users.avatars.delete",async({user:i},t)=>{if(!i||i._id!==t&&!i.abilities.inSite?.users)throw new d;if(!i.permissiveIds.includes(t))throw new h("permissiveIds",t);await l.deleteAvatar(t)}),o.onRequest("users.orgs.create",async({user:i},t)=>{if(!i?.abilities.inSite?.users)throw new d;if(!t.title)throw new m("Title can't be empty","title.empty");await c.create({...t,owners:[i._id]})}),o.onRequest("users.orgs.update",async({user:i},t,r)=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.slaveIds.includes(t))throw new h("slaveIds",t);if(r.title==="")throw new m("Title can't be empty","title.empty");if(r.owners&&!O(i.slaveIds,r.owners))throw new h("slaveIds",r.owners);if(R(r))throw new m("Empty updates","updates.empty");await c.updateOrg(t,r,i)}),o.onRequest("users.orgs.delete",async({user:i},t)=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.slaveIds.includes(t))throw new h("slaveIds",t);await c.deleteOrg(t)}),o.onRequest("users.roles.check-id",({user:i},t)=>{if(!i?.abilities.inSite?.users)throw new d;if(!C.role.test(t))throw new m("Role ID is incorrect","role.not-id");if(s.has(t))throw new m("Role ID already exists","role.exists")}),o.onRequest("users.roles.create",async({user:i},t)=>{if(!i?.abilities.inSite?.users)throw new d;await s.create(t)}),o.onRequest("users.roles.update",async({user:i},t,{abilities:r,...u})=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.slaveRoleIds.includes(t))throw new g(t);if(u.involves&&!O(i.slaveRoleIds,u.involves))throw new g(u.involves);await s.updateRole(t,u)}),o.onRequest("users.roles.set-ability",async({user:i},t,r,u)=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.slaveRoleIds.includes(t))throw new g(t);if(!a.hasAbility(i.abilities,r))throw new d(r);await s.setAbility(t,r,u)}),o.onRequest("users.roles.set-ability-param",async({user:i},t,r,u,p)=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.slaveRoleIds.includes(t))throw new g(t);if(!a.hasAbility(i.abilities,r))throw new d(r);if(!a.isParamFits(r,u,p,a.getParam(i.abilities,r,u)))throw new m("Wrong param value","ability.wrong-param");await s.setAbilityParam(t,r,u,p)}),o.onRequest("users.roles.delete",async({user:i},t)=>{if(!i?.abilities.inSite?.users)throw new d;if(!i.slaveRoleIds.includes(t))throw new g(t);await s.deleteRole(t)})}import{CollectionMapPublication as y,Publication as L}from"insite-subscriptions-server/ws";var T=class extends L{constructor(e){super("abilities",{fetch({user:s}){return s?.abilities.inSite?.users?.roles?{abilities:e.getSchemeFor(s.abilities)}:null}})}},I=class extends y{constructor(e,s={}){let{projection:n={title:1,description:1},sort:l={_o:1},transform:c}=s;Object.assign(n,{involves:1,abilities:1}),super(e.collection,"roles",({user:a})=>a?.abilities.inSite?.users&&{query:{_id:{$in:a.slaveRoleIds}},projection:n,sort:l},a=>{let{involves:i,abilities:t,inheritedAbilities:r,displayTitle:u,_o:p}=e.get(a._id);Object.assign(a,{...a.involves?{ownInvolves:a.involves,involves:M(i),abilities:t,inheritedAbilities:r}:{},...n.title?{displayTitle:u}:{},_o:p}),c?.(a)})}},N=new WeakMap,$=class extends L{constructor(e,s={}){let{fieldsToUpdate:n=[],projection:l,transform:c,public:a}=s;for(let t of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!l||l[t]!==0)&&n.push(t);let i=["_id","email","name","initials","displayLabel","job","avatarUrl","abilities"];a||i.push("slaveIds"),super("user",{onSubscribe(t){let[{user:r}]=t.args;if(r){let{_id:u}=r,p=f=>{if("documentKey"in f&&f.documentKey._id===u)switch(f.operationType){case"update":if(!B(Object.keys(f.updateDescription.updatedFields),n))break;case"replace":case"delete":t.changed(f)}};e.collection.onChange(p),N.set(t,p)}},fetch({user:t,session:r},u){if(t){let p=U(t,i);if(a||Object.assign(p,{orgId:t.org._id,sessionId:u?r?._id:void 0,isOnline:!0}),l)for(let f in l)l[f]&&f in t?Object.assign(p,{[f]:t[f]}):delete p[f];return c?.(p),p}return null},onUnsubscribe(t){let r=N.get(t);r&&e.collection.removeChangeListener(r)}})}},E=class extends y{constructor(e,s={}){let{projection:n={email:1,name:1,org:1,job:1,avatar:1},sort:l={"name.last":1},transform:c}=s;super(e.collection,"users",a=>a.user?.abilities.login&&{query:{},projection:n,sort:l},a=>{let i=e.get(a._id);Object.assign(a,U(i,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:a.org}),delete a.org,delete a.avatar,c?.(a)})}},k=class extends y{constructor(e,s={}){let{projection:n={_id:1},sort:l,triggers:c=[],transform:a}=s;c.includes("roles")||c.push("roles"),super(e.collection,"users.extended",({user:i})=>i?.abilities.inSite?.users&&{query:{_id:{$in:i.slaveIds}},projection:n,sort:l,triggers:c},(i,[t])=>{let r=e.get(i._id);Object.assign(i,{roleIds:j(r.ownRoleIds,t.user.slaveRoleIds)}),a?.(i)})}},D=class extends y{constructor(e){super(e.collection,"users.people.sessions",({user:s},n)=>s?.abilities.inSite?.users&&s.permissiveIds.includes(n)&&{query:{user:n},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},W=class extends y{constructor(e,s={}){let{projection:n={title:1},sort:l={title:1},transform:c}=s;super(e.collection,"orgs",a=>a.user?.abilities.login&&{query:{},projection:n,sort:l},a=>{let i=e.get(a._id);Object.assign(a,U(i,["initials","displayLabel"])),c?.(a)})}},_=class extends y{constructor(e,s={}){let{projection:n={note:1},sort:l={_o:1},triggers:c=[],transform:a}=s;c.includes("owners")||c.push("owners"),super(e.collection,"orgs.extended",({user:i})=>i?.abilities.inSite?.users&&{query:{_id:{$in:i.slaveIds}},projection:n,sort:l,triggers:c},(i,[{user:t}])=>{let r=e.get(i._id),{ownerIds:u,slaveOrgs:p,_o:f}=r;Object.assign(i,{owners:j(u,t.slaveIds),slaveOrgs:M(j(p,t.slaveOrgs)),_o:f}),a?.(i)})}};var K=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:s,collections:n,users:l,public:c,publication:a,extendedPublication:i,userPublication:t,roles:r={},orgs:u={},incomingTransport:p}=e,{publication:f}=r,{publication:A,extendedPublication:P}=u;this.wss=s,this.users=l instanceof H?l:await H.init(n,l),this.incomingTransport=p;for(let v of this.users.values())this.#o(v);return c||(this.abilitiesPublication=new T(this.users.abilities),this.rolesPublication=new I(this.users.roles,f),this.usersPublication=new E(this.users,a),this.usersExtendedPublication=new k(this.users,i),this.orgsPublication=new W(this.users.orgs,A),this.orgsExtendedPublication=new _(this.users.orgs,P),this.sessionsPublication=new D(this.users.sessions),this.users.on("roles-update",this.#r),this.users.on("roles-role-update",this.#n),this.users.on("user-is-online",this.#l),this.users.on("orgs-update",this.#c),this.users.on("orgs-org-update",this.#u),F(this)),this.userPublication=new $(this.users,{public:c,...t}),this.users.on("user-create",this.#o),this.users.on("session-delete",this.#a),this.users.on("user-permissions-change",this.#f),this.wss.onRequest("login",this.#p),this.wss.onRequest("logout",this.#d),this.wss.on("client-closed",this.#m),this};#i;whenReady(){return this.#i}#s({userAgent:e,remoteAddress:s,sessionProps:n}){return{userAgent:e,remoteAddress:s,...n,isOnline:!0}}setSession(e,s,n){s===null?s=void 0:typeof s=="string"&&(s=this.users.sessions.get(s)),e.session!==s&&(e.session&&this.#t.delete(e.session),s&&!e.isRejected?(e.session=s,e.user=s.user,e.lastUserId=s.user._id,this.#e.get(s.user)?.add(e),this.#t.set(s,e),n&&s.prolong(this.#s(e))):(delete e.session,delete e.user,this.#e.get(e.user)?.delete(e)),this.wss.emit("client-session",e,n))}#r=()=>this.rolesPublication.flushInitial();#n=(e,s)=>s&&this.rolesPublication.skip(s);#o=e=>this.#e.set(e,new Set);#l=({_id:e,isOnline:s})=>{let n={_id:e,isOnline:s};for(let l of this.usersPublication.subscriptions){let[c]=l.args;c.user&&c.user._id!==e&&l.handler([["u",n,!0]])}};#a=e=>{let s=this.#t.get(e);s&&this.setSession(s,null)};#c=()=>Promise.all([this.orgsPublication.flushInitial(),this.orgsExtendedPublication.flushInitial()]);#u=(e,s)=>{s&&(this.orgsPublication.skip(s),this.orgsExtendedPublication.skip(s))};#f=e=>{let s=this.#e.get(e);s&&this.wss.emit("should-renew-subscriptions",[...s])};#p=async(e,s,n)=>{if(!e.isRejected){let l=await this.users.login(s,n,this.#s(e));l&&this.setSession(e,l)}};#d=async e=>{e.session&&(await this.users.logout(e.session),this.setSession(e,null))};#m=async e=>{await e.session?.offline(),this.setSession(e,null)};static init(e){return new o(e).whenReady()}};import{WSServerClient as V}from"insite-ws/server";var J=class extends V{isRejected;sessionProps;user;lastUserId;session};export{K as UsersServer,J 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/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 type { ChangeStreamDocument } from \"insite-db\";\nimport {\n\ttype Org,\n\ttype OrgDoc,\n\ttype Role,\n\ttype RoleDoc,\n\ttype Session,\n\ttype User,\n\tUsers\n} 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 { 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\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\tthis.abilitiesPublication = new AbilitiesPublication<AS>(this.users.abilities);\n\t\tthis.rolesPublication = new RolesPublication<AS>(this.users.roles, rolesPublicationOptions);\n\t\tthis.usersPublication = new UsersPublication<AS>(this.users, publicationOptions);\n\t\tthis.usersExtendedPublication = new UsersExtendedPublication<AS>(this.users, extendedPublicationOptions);\n\t\tthis.userPublication = new UserPublication<AS>(this.users, userPublicationOptions);\n\t\tthis.orgsPublication = new OrgsPublication<AS>(this.users.orgs, orgsPublicationOptions);\n\t\tthis.orgsExtendedPublication = new OrgsExtendedPublication<AS>(this.users.orgs, orgsExtendedPublicationOptions);\n\t\tthis.sessionsPublication = new SessionsPublication<AS>(this.users.sessions);\n\t\t\n\t\tthis.users.on(\"roles-update\", this.#handleRolesUpdate);\n\t\tthis.users.on(\"roles-role-update\", this.#handleRolesRoleUpdate);\n\t\tthis.users.on(\"user-create\", this.#handleUserCreate);\n\t\tthis.users.on(\"user-is-online\", this.#handleUserIsOnline);\n\t\tthis.users.on(\"session-delete\", this.#handleSessionDelete);\n\t\tthis.users.on(\"orgs-update\", this.#handleOrgsUpdate);\n\t\tthis.users.on(\"orgs-org-update\", this.#handleOrgsOrgUpdate);\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\tsetupHandlers<AS>(this);\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: null | Session<AS> | string | 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\tsession.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#login = 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#logout = (wssc: WSSCWithUser<AS>) => {\n\t\tif (wssc.session) {\n\t\t\tthis.users.logout(wssc.session);\n\t\t\tthis.setSession(wssc, null);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleRolesUpdate = () =>\n\t\tthis.rolesPublication.flushInitial();\n\t\n\t#handleRolesRoleUpdate = (role: Role<AS>, next: ChangeStreamDocument<RoleDoc>) =>\n\t\tnext && this.rolesPublication.skip(next);\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#handleOrgsUpdate = () => {\n\t\t\n\t\tthis.orgsPublication.flushInitial();\n\t\tthis.orgsExtendedPublication.flushInitial();\n\t\t\n\t};\n\t\n\t#handleOrgsOrgUpdate = (org: Org<AS>, next: ChangeStreamDocument<OrgDoc>) => {\n\t\tif (next) {\n\t\t\tthis.orgsPublication.skip(next);\n\t\t\tthis.orgsExtendedPublication.skip(next);\n\t\t}\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 = (wssc: WSSCWithUser<AS>, email: string, password: string) =>\n\t\tthis.#login(wssc, email, password);\n\t\n\t#handleClientRequestLogout = (wssc: WSSCWithUser<AS>) =>\n\t\tthis.#logout(wssc);\n\t\n\t#handleClientClosed = (wssc: WSSCWithUser<AS>) => {\n\t\twssc.session?.offline();\n\t\tthis.setSession(wssc, null);\n\t\t\n\t};\n\t\n\t\n\tstatic init<IAS extends AbilitiesSchema>(options: Options<IAS>) {\n\t\tconst usersServer = new UsersServer(options);\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", "import { noop } from \"./noop.js\";\n\n\ntype Callback<Result> = (...args: unknown[]) => Result;\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\ntype NumberOrUndefined = number | undefined;\n\ntype DebouncedFunction<Result> = {\n\t(this: unknown, ..._args: unknown[]): Promise<Result>;\n};\n\nexport type Debounced<Result> = {\n\tcallback: Callback<Result>;\n\tpromise: {\n\t\tisResolved: boolean;\n\t} & Promise<unknown>;\n\tresolve: (value: Result) => void;\n\trun(): Promise<Result>;\n\tclear(shouldRun?: boolean): Promise<void>;\n} & DebouncedFunction<Result>;\n\n\nexport function debounce<Result>(callback: Callback<Result>, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: NumberOrUndefined;\n\tlet maxWaitTimeout: NumberOrUndefined;\n\tlet end: NumberOrUndefined;\n\tlet context: unknown;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: Result;\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\tclearTimeout(maxWaitTimeout);\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\tdebounced.resolve(result);\n\t\t\tdebounced.promise.isResolved = true;\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\trun();\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\treturn (result = await callback.apply(context, args));\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<Result> = 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.isResolved)\n\t\t\tdebounced.promise = Object.assign(new Promise(resolve => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\tinitial = false;\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\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\t\tisResolved: false\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<Result>, {\n\t\tcallback,\n\t\tpromise: Object.assign(Promise.resolve(), {\n\t\t\tisResolved: true\n\t\t}),\n\t\tresolve: 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\t\n\t\t\tdebounced.promise.isResolved = true;\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: Object.assign(Promise.resolve(), {\n\t\tisResolved: true\n\t}),\n\tresolve: noop,\n\trun: noop,\n\tclear: noop\n}) as unknown as Debounced<void>;\n\n\nexport function throttle<Result>(callback: Callback<Result>, 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-next-line unicorn/prevent-abbreviations, unicorn/custom-error-definition\nexport class Err extends Error {\n\tconstructor(message: string, payload?: object);\n\tconstructor(message: string, tag: string | null, payload?: object);\n\tconstructor(message: string, tag: object | string | null = null, payload?: object) {\n\t\tsuper(message);\n\t\t\n\t\tif (tag && typeof tag == \"object\") {\n\t\t\tpayload = tag;\n\t\t\ttag = null;\n\t\t}\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}`, \"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}`, \"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\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};\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} = 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\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\tsubscription.changed(next);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\tusers.collection.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, [\n\t\t\t\t\t\t\"_id\",\n\t\t\t\t\t\t\"email\",\n\t\t\t\t\t\t\"name\",\n\t\t\t\t\t\t\"initials\",\n\t\t\t\t\t\t\"displayLabel\",\n\t\t\t\t\t\t\"job\",\n\t\t\t\t\t\t\"avatarUrl\",\n\t\t\t\t\t\t\"abilities\",\n\t\t\t\t\t\t\"slaveIds\"\n\t\t\t\t\t]);\n\t\t\t\t\t\n\t\t\t\t\tObject.assign(userDoc, {\n\t\t\t\t\t\torgId: user.org._id,\n\t\t\t\t\t\tsessionId: isSessionIdRequired ? session?._id : undefined,\n\t\t\t\t\t\tisOnline: true\n\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 { WSServer, WSServerClient } from \"insite-ws/server\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport type { Session, SessionDoc, User } from \"insite-users-server\";\n\n\nexport class WSSCWithUser<AS extends AbilitiesSchema> extends WSServerClient {\n\tdeclare wss: WSServer<WSSCWithUser<AS>>;\n\tisRejected?: boolean;\n\tsessionProps?: Partial<SessionDoc>;\n\tuser?: User<AS>;\n\tlastUserId?: string;\n\tsession?: Session<AS>;\n}\n"],
5
- "mappings": "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",
6
- "names": ["Users", "_ids", "iterable", "ids", "object", "noop", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "_args", "resolve", "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", "key", "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", "publicationOptions", "extendedPublicationOptions", "userPublicationOptions", "rolesOptions", "orgsOptions", "incomingTransport", "rolesPublicationOptions", "orgsPublicationOptions", "orgsExtendedPublicationOptions", "Users", "user", "#handleUserCreate", "AbilitiesPublication", "RolesPublication", "UsersPublication", "UsersExtendedPublication", "UserPublication", "OrgsPublication", "OrgsExtendedPublication", "SessionsPublication", "#handleRolesUpdate", "#handleRolesRoleUpdate", "#handleUserIsOnline", "#handleSessionDelete", "#handleOrgsUpdate", "#handleOrgsOrgUpdate", "#handleUserPermissionsChange", "#handleClientRequestLogin", "#handleClientRequestLogout", "#handleClientClosed", "setupHandlers", "#makeSessionProps", "userAgent", "remoteAddress", "sessionProps", "wssc", "session", "shouldProlong", "#login", "email", "password", "#logout", "role", "next", "_id", "isOnline", "updates", "usersSubscription", "org", "webSockets", "WSServerClient", "WSSCWithUser"]
4
+ "sourcesContent": ["import type { AbilitiesSchema } from \"insite-common\";\nimport type { ChangeStreamDocument } from \"insite-db\";\nimport {\n\tUsers,\n\ttype Org,\n\ttype OrgDoc,\n\ttype Role,\n\ttype RoleDoc,\n\ttype Session,\n\ttype User\n} 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(\"roles-update\", this.#handleRolesUpdate);\n\t\t\tthis.users.on(\"roles-role-update\", this.#handleRolesRoleUpdate);\n\t\t\tthis.users.on(\"user-is-online\", this.#handleUserIsOnline);\n\t\t\tthis.users.on(\"orgs-update\", this.#handleOrgsUpdate);\n\t\t\tthis.users.on(\"orgs-org-update\", this.#handleOrgsOrgUpdate);\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#handleRolesUpdate = () =>\n\t\tthis.rolesPublication.flushInitial();\n\t\n\t#handleRolesRoleUpdate = (role: Role<AS>, next: ChangeStreamDocument<RoleDoc>) =>\n\t\tnext && this.rolesPublication.skip(next);\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#handleOrgsUpdate = () =>\n\t\tPromise.all([\n\t\t\tthis.orgsPublication.flushInitial(),\n\t\t\tthis.orgsExtendedPublication.flushInitial()\n\t\t]);\n\t\n\t#handleOrgsOrgUpdate = (org: Org<AS>, next: ChangeStreamDocument<OrgDoc>) => {\n\t\tif (next) {\n\t\t\tthis.orgsPublication.skip(next);\n\t\t\tthis.orgsExtendedPublication.skip(next);\n\t\t}\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", "import { noop } from \"./noop.js\";\n\n\ntype Callback<Result> = (...args: unknown[]) => Result;\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\ntype NumberOrUndefined = number | undefined;\n\ntype DebouncedFunction<Result> = {\n\t(this: unknown, ..._args: unknown[]): Promise<Result>;\n};\n\nexport type Debounced<Result> = {\n\tcallback: Callback<Result>;\n\tpromise: {\n\t\tisResolved: boolean;\n\t} & Promise<unknown>;\n\tresolve: (value: Result) => void;\n\trun(): Promise<Result>;\n\tclear(shouldRun?: boolean): Promise<void>;\n} & DebouncedFunction<Result>;\n\n\nexport function debounce<Result>(callback: Callback<Result>, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: NumberOrUndefined;\n\tlet maxWaitTimeout: NumberOrUndefined;\n\tlet end: NumberOrUndefined;\n\tlet context: unknown;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: Result;\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\tclearTimeout(maxWaitTimeout);\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\tdebounced.resolve(result);\n\t\t\tdebounced.promise.isResolved = true;\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\trun();\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\treturn (result = await callback.apply(context, args));\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<Result> = 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.isResolved)\n\t\t\tdebounced.promise = Object.assign(new Promise(resolve => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\tinitial = false;\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\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\t\tisResolved: false\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<Result>, {\n\t\tcallback,\n\t\tpromise: Object.assign(Promise.resolve(), {\n\t\t\tisResolved: true\n\t\t}),\n\t\tresolve: 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\t\n\t\t\tdebounced.promise.isResolved = true;\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: Object.assign(Promise.resolve(), {\n\t\tisResolved: true\n\t}),\n\tresolve: noop,\n\trun: noop,\n\tclear: noop\n}) as unknown as Debounced<void>;\n\n\nexport function throttle<Result>(callback: Callback<Result>, 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, payload?: Payload);\n\tconstructor(message: string, tag: string | null, 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 { WSServer, WSServerClient } from \"insite-ws/server\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport type { Session, SessionDoc, User } from \"insite-users-server\";\n\n\nexport class WSSCWithUser<AS extends AbilitiesSchema> extends WSServerClient {\n\tdeclare wss: WSServer<WSSCWithUser<AS>>;\n\tisRejected?: boolean;\n\tsessionProps?: Partial<SessionDoc>;\n\tuser?: User<AS>;\n\tlastUserId?: string;\n\tsession?: Session<AS>;\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["Users", "_ids", "iterable", "ids", "object", "noop", "debounce", "callback", "limit", "options", "leading", "trailing", "maxWait", "timeout", "maxWaitTimeout", "end", "context", "args", "initial", "final", "result", "expired", "n", "debounced", "maxWaitExpired", "run", "_args", "resolve", "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", "#handleRolesUpdate", "#handleRolesRoleUpdate", "#handleUserIsOnline", "#handleOrgsUpdate", "#handleOrgsOrgUpdate", "setupHandlers", "UserPublication", "#handleSessionDelete", "#handleUserPermissionsChange", "#handleClientRequestLogin", "#handleClientRequestLogout", "#handleClientClosed", "#makeSessionProps", "userAgent", "remoteAddress", "sessionProps", "wssc", "session", "shouldProlong", "role", "next", "_id", "isOnline", "updates", "usersSubscription", "org", "webSockets", "email", "password", "WSServerClient", "WSSCWithUser"]
7
7
  }
@@ -17,6 +17,7 @@ export type UserPublicationOptions = {
17
17
  fieldsToUpdate?: string[];
18
18
  projection?: Projection;
19
19
  transform?: (userDoc: object) => void;
20
+ public?: boolean;
20
21
  };
21
22
  export declare class UserPublication<AS extends AbilitiesSchema> extends Publication<AS> {
22
23
  constructor(users: Users<AS>, options?: UserPublicationOptions);
@@ -1 +1 @@
1
- {"version":3,"file":"publications.d.ts","sourceRoot":"","sources":["../src/publications.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"publications.d.ts","sourceRoot":"","sources":["../src/publications.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -1,13 +1,17 @@
1
+ import type { AnyProp, ExtendsOrOmit } from "@nesvet/n";
1
2
  import type { AbilitiesSchema } from "insite-common";
2
3
  import type { Collections } from "insite-db";
3
- import type { Users, Options as UsersOptions } from "insite-users-server";
4
+ import type { Options as UsersOptions, Users } from "insite-users-server";
4
5
  import type { IncomingTransport, WithOptionalOnTransfer } from "insite-ws-transfers/node";
5
6
  import type { WSServer } from "insite-ws/server";
6
7
  import type { OrgsExtendedPublicationOptions, OrgsPublicationOptions, RolesPublicationOptions, UserPublicationOptions, UsersExtendedPublicationOptions, UsersPublicationOptions } from "./publications";
8
+ import type { UsersServer } from "./UsersServer";
7
9
  import type { WSSCWithUser } from "./WSSCWithUser";
8
10
  export type Options<AS extends AbilitiesSchema> = {
9
11
  wss: WithOptionalOnTransfer<WSServer<WSSCWithUser<AS>>, WSSCWithUser<AS>>;
10
12
  collections?: Collections;
13
+ /** Is server public */
14
+ public?: boolean;
11
15
  users: Users<AS> | UsersOptions<AS>;
12
16
  publication?: UsersPublicationOptions;
13
17
  extendedPublication?: UsersExtendedPublicationOptions;
@@ -21,4 +25,10 @@ export type Options<AS extends AbilitiesSchema> = {
21
25
  };
22
26
  incomingTransport?: IncomingTransport<WSSCWithUser<AS>>;
23
27
  };
28
+ type OptionsWithoutPublicOnly = AnyProp & {
29
+ public?: false;
30
+ };
31
+ export type OmitRedundant<US, O> = ExtendsOrOmit<O, OptionsWithoutPublicOnly, "abilitiesPublication" | "orgsExtendedPublication" | "orgsPublication" | "rolesPublication" | "sessionsPublication" | "usersExtendedPublication" | "usersPublication", US>;
32
+ export type UsersServerWithActualProps<AS extends AbilitiesSchema, O extends Options<AS>> = OmitRedundant<UsersServer<AS>, O>;
33
+ export {};
24
34
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,OAAO,IAAI,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EACX,8BAA8B,EAC9B,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,eAAe,IAAI;IACjD,GAAG,EAAE,sBAAsB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,mBAAmB,CAAC,EAAE,+BAA+B,CAAC;IACtD,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,KAAK,CAAC,EAAE;QACP,WAAW,CAAC,EAAE,uBAAuB,CAAC;KACtC,CAAC;IACF,IAAI,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,sBAAsB,CAAC;QACrC,mBAAmB,CAAC,EAAE,8BAA8B,CAAC;KACrD,CAAC;IACF,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;CACxD,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,OAAO,IAAI,YAAY,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC1E,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAC1F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EACX,8BAA8B,EAC9B,sBAAsB,EACtB,uBAAuB,EACvB,sBAAsB,EACtB,+BAA+B,EAC/B,uBAAuB,EACvB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAGnD,MAAM,MAAM,OAAO,CAAC,EAAE,SAAS,eAAe,IAAI;IACjD,GAAG,EAAE,sBAAsB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;IAC1E,WAAW,CAAC,EAAE,WAAW,CAAC;IAE1B,wBAAwB;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;IAEjB,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,uBAAuB,CAAC;IACtC,mBAAmB,CAAC,EAAE,+BAA+B,CAAC;IACtD,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,KAAK,CAAC,EAAE;QACP,WAAW,CAAC,EAAE,uBAAuB,CAAC;KACtC,CAAC;IACF,IAAI,CAAC,EAAE;QACN,WAAW,CAAC,EAAE,sBAAsB,CAAC;QACrC,mBAAmB,CAAC,EAAE,8BAA8B,CAAC;KACrD,CAAC;IACF,iBAAiB,CAAC,EAAE,iBAAiB,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC;CACxD,CAAC;AAGF,KAAK,wBAAwB,GAAG,OAAO,GAAG;IAAE,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAG7D,MAAM,MAAM,aAAa,CAAC,EAAE,EAAE,CAAC,IAC9B,aAAa,CAAC,CAAC,EAAE,wBAAwB,EAAE,sBAAsB,GAAG,yBAAyB,GAAG,iBAAiB,GAAG,kBAAkB,GAAG,qBAAqB,GAAG,0BAA0B,GAAG,kBAAkB,EAC/M,EAAE,CACF,CAAC;AAEH,MAAM,MAAM,0BAA0B,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC,SAAS,OAAO,CAAC,EAAE,CAAC,IAAI,aAAa,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "insite-users-server-ws",
3
- "version": "2.2.1",
3
+ "version": "2.2.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.5",
8
+ "packageManager": "bun@1.2.9",
9
9
  "scripts": {
10
10
  "test": "echo \"Error: no test specified\" && exit 1",
11
11
  "build": "bun .conveyer.js",
@@ -24,19 +24,19 @@
24
24
  "author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
25
25
  "license": "MIT",
26
26
  "dependencies": {
27
- "@nesvet/n": "^1.1.26",
28
- "insite-common": "^2.2.1",
29
- "insite-db": "^2.2.1",
30
- "insite-subscriptions-server": "^2.2.1",
31
- "insite-users-server": "^2.2.1",
32
- "insite-ws": "^2.2.1",
33
- "insite-ws-transfers": "^2.2.1"
27
+ "@nesvet/n": "^1.1.29",
28
+ "insite-common": "^2.2.3",
29
+ "insite-db": "^2.2.3",
30
+ "insite-subscriptions-server": "^2.2.3",
31
+ "insite-users-server": "^2.2.3",
32
+ "insite-ws": "^2.2.3",
33
+ "insite-ws-transfers": "^2.2.3"
34
34
  },
35
35
  "devDependencies": {
36
- "@nesvet/conveyer": "^2.5.0",
37
- "@nesvet/eslint-config": "^2.0.48",
38
- "@types/node": "^22.13.10",
39
- "@types/ws": "^8.18.0",
40
- "typescript": "^5.8.2"
36
+ "@nesvet/conveyer": "^2.5.1",
37
+ "@nesvet/eslint-config": "^2.0.52",
38
+ "@types/node": "^22.14.1",
39
+ "@types/ws": "^8.18.1",
40
+ "typescript": "^5.8.3"
41
41
  }
42
42
  }