insite-users-server-ws 2.0.4 → 2.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/UsersServer.d.ts +1 -1
- package/dist/UsersServer.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +4 -4
- package/package.json +9 -9
- package/bun.lockb +0 -0
package/dist/UsersServer.d.ts
CHANGED
|
@@ -44,7 +44,7 @@ export declare class UsersServer<AS extends AbilitiesSchema> {
|
|
|
44
44
|
userAgent: string;
|
|
45
45
|
remoteAddress: string;
|
|
46
46
|
};
|
|
47
|
-
setSession(wssc: WSSCWithUser<AS>, session: null | Session | string | undefined, shouldProlong?: boolean): void;
|
|
47
|
+
setSession(wssc: WSSCWithUser<AS>, session: null | Session<AS> | string | undefined, shouldProlong?: boolean): void;
|
|
48
48
|
private login;
|
|
49
49
|
private logout;
|
|
50
50
|
private handleRolesUpdate;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"UsersServer.d.ts","sourceRoot":"","sources":["../src/UsersServer.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"UsersServer.d.ts","sourceRoot":"","sources":["../src/UsersServer.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{_ids as ie,Err as g,includesAll as C,isEmpty as V,removeAll as Q,union as re,without as G}from"@nesvet/n";import{Binary as ne}from"insite-db";import{Users as oe}from"insite-users-server";import{CollectionMapPublication as O,Publication as K}from"insite-subscriptions-server/ws";import{_ids as J,includesAny as te,intersection as _,pick as $}from"@nesvet/n";var I=class extends K{constructor(e){super("abilities",{fetch(s){return s.user?.abilities.inSite?.sections?.includes("users")?{abilities:e.getSchemeFor(s.user)}:null}})}},k=class extends O{constructor(e,s={}){let{projection:o={title:1,description:1},sort:l={_o:1},transform:d}=s;Object.assign(o,{involves:1,abilities:1}),super(e.collection,"roles",r=>r.user?.abilities.inSite?.sections?.includes("users")&&{query:{_id:{$in:r.user.slaveRoleIds}},projection:o,sort:l},r=>{let{involves:c,abilities:S,inheritedAbilities:p,displayTitle:h,_o:P}=e.get(r._id);Object.assign(r,{...r.involves?{ownInvolves:r.involves,involves:J(c),abilities:S,inheritedAbilities:p}:{},...o.title?{displayTitle:h}:{},_o:P}),d?.(r)})}},B=new WeakMap,q=class extends K{constructor(e,s={}){let{fieldsToUpdate:o=[],projection:l,transform:d}=s;for(let r of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!l||l[r]!==0)&&o.push(r);super("user",{onSubscribe(r){let[{user:c}]=r.args;if(c){let{_id:S}=c,p=h=>{if("documentKey"in h&&h.documentKey._id===S)switch(h.operationType){case"update":if(!te(Object.keys(h.updateDescription.updatedFields),o))break;case"replace":case"delete":r.changed(h)}};e.collection.changeListeners.add(p),B.set(r,p)}},fetch({user:r,session:c},S){if(r){let p=$(r,["_id","email","name","initials","displayLabel","job","avatarUrl","abilities","slaveIds"]);if(Object.assign(p,{orgId:r.org._id,sessionId:S?c?._id:void 0,isOnline:!0}),l)for(let h in l)l[h]&&h in r?Object.assign(p,{[h]:r[h]}):delete p[h];return d?.(p),p}return null},onUnsubscribe(r){let c=B.get(r);c&&e.collection.changeListeners.delete(c)}})}},D=class extends O{constructor(e,s={}){let{projection:o={email:1,name:1,org:1,job:1,avatar:1},sort:l={"name.last":1},transform:d}=s;super(e.collection,"users",r=>r.user?.abilities.login&&{query:{},projection:o,sort:l},r=>{let c=e.get(r._id);Object.assign(r,$(c,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:r.org}),delete r.org,delete r.avatar,d?.(r)})}},j=class extends O{constructor(e,s={}){let{projection:o={_id:1},sort:l,triggers:d=[],transform:r}=s;d.includes("roles")||d.push("roles"),super(e.collection,"users.extended",c=>c.user?.abilities.inSite?.sections?.includes("users")&&{query:{_id:{$in:c.user.slaveIds}},projection:o,sort:l,triggers:d},(c,[S])=>{let p=e.get(c._id);Object.assign(c,{roleIds:_(p.ownRoleIds,S.user.slaveRoleIds)}),r?.(c)})}},E=class extends O{constructor(e){super(e.collection,"users.people.sessions",(s,o)=>s.user?.abilities.inSite?.sections?.includes("users")&&s.user.permissiveIds.includes(o)&&{query:{user:o},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},M=class extends O{constructor(e,s={}){let{projection:o={title:1},sort:l={title:1},transform:d}=s;super(e.collection,"orgs",r=>r.user?.abilities.login&&{query:{},projection:o,sort:l},r=>{let c=e.get(r._id);Object.assign(r,$(c,["initials","displayLabel"])),d?.(r)})}},T=class extends O{constructor(e,s={}){let{projection:o={note:1},sort:l={_o:1},triggers:d=[],transform:r}=s;d.includes("owners")||d.push("owners"),super(e.collection,"orgs.extended",c=>c.user?.abilities.inSite?.sections?.includes("users")&&{query:{_id:{$in:c.user.slaveIds}},projection:o,sort:l,triggers:d},(c,[S])=>{let p=e.get(c._id),{ownerIds:h,slaveOrgs:P,_o:L}=p;Object.assign(c,{owners:_(h,S.user.slaveIds),slaveOrgs:J(_(P,S.user.slaveOrgs)),_o:L}),r?.(c)})}};var N={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};var ae=["image/webp"],le=1024*512,X=class n{constructor(e){this.initPromise=this.init(e)}userWsMap=new WeakMap;sessionsWsMap=new WeakMap;wss;users;getSessionProps;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async e=>{let{wss:s,collections:o,users:l,publication:d,extendedPublication:r,userPublication:c,roles:S={},orgs:p={},getSessionProps:h,incomingTransport:P}=e,{publication:L}=S,{publication:ee,extendedPublication:se}=p;this.wss=s,this.users=await oe.init(o,l),this.getSessionProps=h,this.incomingTransport=P;for(let t of this.users.values())this.handleUserCreate(t);if(this.abilitiesPublication=new I(this.users.abilitiesMap),this.rolesPublication=new k(this.users.roles,L),this.usersPublication=new D(this.users,d),this.usersExtendedPublication=new j(this.users,r),this.userPublication=new q(this.users,c),this.orgsPublication=new M(this.users.orgs,ee),this.orgsExtendedPublication=new T(this.users.orgs,se),this.sessionsPublication=new E(this.users.sessions),this.users.on("roles-update",this.handleRolesUpdate),this.users.on("roles-role-update",this.handleRolesRoleUpdate),this.users.on("user-create",this.handleUserCreate),this.users.on("user-is-online",this.handleUserIsOnline),this.users.on("session-delete",this.handleSessionDelete),this.users.on("orgs-update",this.handleOrgsUpdate),this.users.on("orgs-org-update",this.handleOrgsOrgUpdate),this.users.on("user-permissions-change",this.handleUserPermissionsChange),this.wss.onRequest("login",this.handleClientRequestLogin),this.wss.onRequest("logout",this.handleClientRequestLogout),this.wss.on("client-closed",this.handleClientClosed),this.wss.onRequest("users.people.check-email",(t,i)=>{if(t.user?.abilities.inSite?.sections?.includes("users")){if(!N.email.test(i))throw new g("Not email","notemail");if(this.users.byEmail.has(i))throw new g("Email already exists","exists")}}),this.wss.onRequest("users.people.add",async(t,{roles:i,org:a,...u})=>{if(t.user?.abilities.inSite?.sections?.includes("users")){if(!i.length)throw new g("Roles shouldn't be empty","emptyroles");if(!C(t.user.slaveRoleIds,i))throw new g("Can't assign role the user is not involved in","forbiddenrole");if(a&&!t.user.slaveIds.includes(a))throw new g("Can't assign org the user is not master of","forbiddenorg");await this.users.new({roles:i,org:a,...u})}}),this.wss.onRequest("users.people.change-password",async(t,i,a)=>{if(t.user?.abilities.inSite?.sections?.includes("users")&&t.user.permissiveIds.includes(i)){if(typeof a!="string")throw new g("Type of password is incorrect","wrongpasswordtype");if(!a)throw new g("Password can't be empty","emptypassword");await this.users.changePassword(i,a)}}),this.wss.onRequest("users.people.update",async(t,i,a)=>{if(t.user?.abilities.inSite?.sections?.includes("users")&&t.user.permissiveIds.includes(i)){if(a.roles){if(!a.roles.length)throw new g("Roles can't be empty","emptyroles");if(!C(t.user.slaveRoleIds,a.roles))throw new g("Can't assign role the user is not involved in","forbiddenrole");let u=this.users.get(i);u&&(a.roles=u.isRoot?["root"]:this.users.roles.cleanUpIds(G(u.ownRoleIds,t.user.slaveRoleIds).concat(a.roles)))}if(a.org&&!t.user.slaveIds.includes(a.org))throw new g("Can't assign org the user is not master of","forbiddenorg");V(a)||await this.users.collection.updateOne({_id:i},{$set:a})}}),this.wss.onRequest("users.people.delete",async(t,i)=>{t.user?.abilities.inSite?.sections?.includes("users")&&t.user.slaveIds.includes(i)&&await this.users.collection.deleteOne({_id:i})}),this.wss.onRequest("users.people.destroy-session",async(t,i)=>{t.user?.abilities.inSite?.sections?.includes("users")&&t.user.permissiveIds.includes(this.users.bySessionId.get(i)?._id)&&await this.users.sessions.collection.deleteOne({_id:i})}),this.incomingTransport){let t=i=>({begin:async(a,u)=>(!i||await i(a,u))&&ae.includes(u.metadata.type)&&u.size<=le,end:async(a,{data:u,metadata:{type:m,_id:y}})=>{let f=ne.createFromBase64(u.slice(u.indexOf(","))),A=Date.now().toString(36);await Promise.all([this.users.avatars.collection.replaceOne({_id:y},{type:m,size:f.length(),ts:A,data:f},{upsert:!0}),this.users.collection.updateOne({_id:y},{$set:{avatar:A}})])}});this.incomingTransport.on("users.people.avatar",t((i,{metadata:{_id:a}})=>i.user?.abilities.inSite?.sections?.includes("users")&&i.user.permissiveIds.includes(a))),this.incomingTransport.on("user.avatar",t((i,a)=>i.user&&i.user._id===a.metadata._id))}let z=async t=>{await Promise.all([this.users.avatars.collection.deleteOne({_id:t}),this.users.collection.updateOne({_id:t},{$set:{avatar:null}})])};return this.wss.onRequest("users.people.delete-avatar",async(t,i)=>t.user?.abilities.inSite?.sections?.includes("users")&&t.user.permissiveIds.includes(i)&&await z(i)),this.wss.onRequest("user.delete-avatar",async(t,i)=>t.user&&t.user._id===i&&await z(i)),this.wss.onRequest("users.orgs.add",async(t,i)=>{if(t.user?.abilities.inSite?.sections?.includes("users")){if(!i.title)throw new g("Title can't be empty","emptytitle");await this.users.orgs.new(i,t.user._id)}}),this.wss.onRequest("users.orgs.update",async(t,i,a)=>{if(t.user?.abilities.inSite?.sections?.includes("users")&&t.user.slaveIds.includes(i)){if(a.title!==void 0&&!a.title)throw new g("Title can't be empty","emptytitle");if(a.owners){if(!C(t.user.slaveIds,a.owners))throw new g("Can't assign owners the user is not master of","forbiddenowners");let u=this.users.orgs.get(i);u&&(a.owners=this.users.sortIds(re(G(u.ownerIds,t.user.slaveIds),G(a.owners,[u._id,...ie(u.slaveOrgs)]))))}V(a)||await this.users.orgs.collection.updateOne({_id:i},{$set:a})}}),this.wss.onRequest("users.orgs.delete",async(t,i)=>{t.user?.abilities.inSite?.sections?.includes("users")&&t.user.slaveIds.includes(i)&&await this.users.orgs.collectionDelete(i)}),this.wss.onRequest("users.roles.check-id",(t,i)=>{if(t.user?.abilities.inSite?.sections?.includes("users")){if(!N.role.test(i))throw new g("Role ID is incorrect","notroleid");if(this.users.roles.has(i))throw new g("Role ID already exists","exists")}}),this.wss.onRequest("users.roles.add",async(t,i)=>{t.user?.abilities.inSite?.sections?.includes("users")&&await this.users.roles.new(i)}),this.wss.onRequest("users.roles.update",async(t,i,{abilities:a,...u})=>{if(t.user?.abilities.inSite?.sections?.includes("users")&&t.user.slaveRoleIds.includes(i)){if(u.involves)if(C(t.user.slaveRoleIds,u.involves)){Q(u.involves,[i]);let m=this.users.roles.get(i);if(m)for(let y of u.involves)this.users.roles.get(y)?.involves.has(m)&&Q(u.involves,[y]);u.involves=this.users.roles.cleanUpIds(u.involves)}else throw new g("Can't assign role the user is not involved in","forbiddenrole");await this.users.roles.collection.updateOne({_id:i},{$set:u})}}),this.wss.onRequest("users.roles.set-ability",async(t,i,a,u,m)=>{if(t.user?.abilities.inSite?.sections?.includes("users")&&t.user.slaveRoleIds.includes(i)&&t.user.abilities[a]){let y=this.users.roles.get(i);if(y){let f=structuredClone(y.ownAbilities),A;if(u){f[a]||(f[a]={});let W=this.users.abilitiesMap.get(a)?.params?.find(v=>v._id===u);if(W){let v=t.user.abilities[a],U=f[a];W.type==="number"?v[u]>=m&&(U[u]=m,A=!0):W.type==="items"&&v[u]&&C(v[u],m)&&(U[u]=m,A=!0)}}else m?f[a]=this.users.abilitiesMap.getMinimumOf(a):function W(v){if(v&&(delete f[v._id],v.subAbilities))for(let U of v.subAbilities)f[U._id]&&W(U)}(this.users.abilitiesMap.get(a)),A=!0;A&&await this.users.roles.collection.updateOne({_id:i},{$set:{abilities:f}})}}}),this.wss.on("client-message:users.roles.delete",async(t,i)=>{t.user?.abilities.inSite?.sections?.includes("users")&&t.user.slaveRoleIds.includes(i)&&await this.users.roles.collectionDelete(i)}),this};initPromise;whenReady(){return this.initPromise}getDefaultSessionProps({userAgent:e,remoteAddress:s}){return{userAgent:e,remoteAddress:s}}setSession(e,s,o){s===null?s=void 0:typeof s=="string"&&(s=this.users.sessions.get(s)),e.session!==s&&(e.session&&this.sessionsWsMap.delete(e.session),s?(e.session=s,e.user=s.user,e.lastUserId=s.user._id,this.userWsMap.get(s.user)?.add(e),this.sessionsWsMap.set(s,e),o&&s.prolong({...this.getDefaultSessionProps(e),...this.getSessionProps?.(e),isOnline:!0})):(delete e.session,this.userWsMap.get(e.user)?.delete(e)),this.wss.emit("client-session",e,o))}login=async(e,s,o)=>{let l=await this.users.login(s,o,{...this.getDefaultSessionProps(e),...this.getSessionProps?.(e),isOnline:!0});l&&this.setSession(e,l)};logout=e=>{e.session&&(this.users.logout(e.session),this.setSession(e,null))};handleRolesUpdate=()=>this.rolesPublication.flushInitial();handleRolesRoleUpdate=(e,s)=>s&&this.rolesPublication.skip(s);handleUserCreate=e=>this.userWsMap.set(e,new Set);handleUserIsOnline=({_id:e,isOnline:s})=>{let o={_id:e,isOnline:s};for(let l of this.usersPublication.subscriptions){let[d]=l.args;d.user&&d.user._id!==e&&l.handler([["u",o,!0]])}};handleSessionDelete=e=>{let s=this.sessionsWsMap.get(e);s&&this.setSession(s,null)};handleOrgsUpdate=()=>{this.orgsPublication.flushInitial(),this.orgsExtendedPublication.flushInitial()};handleOrgsOrgUpdate=(e,s)=>{s&&(this.orgsPublication.skip(s),this.orgsExtendedPublication.skip(s))};handleUserPermissionsChange=e=>{let s=this.userWsMap.get(e);s&&this.wss.emit("should-renew-subscriptions",[...s])};handleClientRequestLogin=(e,s,o)=>this.login(e,s,o);handleClientRequestLogout=e=>this.logout(e);handleClientClosed=e=>{e.session?.offline(),this.setSession(e,null)};static init(e){return new n(e).whenReady()}};import Y from"node:fs";import ce from"node:http";import ue from"node:https";import{debounce as de,uid as pe}from"@nesvet/n";var x={request:"~r-q",response:"~r-s"},F=Symbol("heartbeatInterval"),w=Symbol("defib"),R=Symbol("pingTs"),b=class H extends PrepareWebSocket{get isConnecting(){return this.readyState===this.CONNECTING}get isOpen(){return this.readyState===this.OPEN}get isClosing(){return this.readyState===this.CLOSING}get isClosed(){return this.readyState===this.CLOSED}isWebSocketServerClient=!0;isWebSocketServer=!1;isWebSocket=!1;wss;userAgent="";remoteAddress="";[w]=H.makeDefib.call(this);latency=0;[R];[F]=H.makeHeartbeatInterval.call(this);sendMessage(...e){return this.send(JSON.stringify(e))}sendRequest(...e){let s=pe(),o=`message:${x.response}-${s}`;return typeof e.at(-1)=="function"?(this.once(o,e.splice(-1,1)[0]),this.sendMessage(x.request,s,...e),this):new Promise((l,d)=>{this.once(o,(r,c)=>{if(r){let{message:S,...p}=r;d(Object.assign(new Error(S),p))}else l(c)}),this.sendMessage(x.request,s,...e)})}static makeDefib(){return de(()=>this.terminate(),65e3)}static makeHeartbeatInterval(){return setInterval(()=>{this[R]=Date.now(),this.send("")},5e3)}},ke=class extends PrepareWebSocketServer{constructor(n,e,s){let{ssl:o,port:l,...d}=n;if(o){if(typeof o.cert=="string"&&!/^-{3,}BEGIN/.test(o.cert))try{o.cert=Y.readFileSync(o.cert)}catch{}if(typeof o.key=="string"&&!/^-{3,}BEGIN/.test(o.key))try{o.key=Y.readFileSync(o.key)}catch{}}let{server:r=o?ue.createServer({...o}):ce.createServer()}=d;super({WebSocket:b,...d,server:r}),this.port=typeof l=="string"?Number.parseInt(l):l,e&&(typeof e=="function"?s=e:Object.assign(this,e)),this.on("connection",this.handleConnection),this.on(`client-message:${x.request}`,this.handleRequest),r.listen(this.port,s)}isWebSocketServer=!0;isWebSocketServerClient=!1;isWebSocket=!1;port;requestListeners=new Map;addRequestListener(n,e){return this.requestListeners.set(n,e),this}onRequest=this.addRequestListener;removeRequestListener(n){return this.requestListeners.delete(n),this}offRequest=this.removeRequestListener;handleRequest=async(n,e,s,...o)=>{let l=this.requestListeners.get(s),d,r=null;if(l)try{d=await l.call(this,n,...o)}catch(c){if(c instanceof Error){let{message:S,...p}=c;r={message:S,...p}}}else r={message:`Unknown request kind "${s}"`};n.sendMessage(`${x.response}-${e}`,r,d)};handleConnection(n,e){if(!(n instanceof b)){Object.defineProperties(n,{isConnecting:{get:Object.getOwnPropertyDescriptor(b.prototype,"isConnecting").get},isOpen:{get:Object.getOwnPropertyDescriptor(b.prototype,"isOpen").get},isClosing:{get:Object.getOwnPropertyDescriptor(b.prototype,"isClosing").get},isClosed:{get:Object.getOwnPropertyDescriptor(b.prototype,"isClosed").get}});let{terminate:s}=n;Object.assign(n,{isWebSocketServerClient:!0,isWebSocketServer:!1,isWebSocket:!1,[w]:b.makeDefib.call(n),latency:0,[F]:b.makeHeartbeatInterval.call(n),sendMessage:b.prototype.sendMessage,sendRequest:b.prototype.sendRequest,terminate(){try{s.call(n)}catch(o){console.error(o)}}})}Object.assign(n,{wss:this,userAgent:e.headers["user-agent"]??"",remoteAddress:e.headers["x-real-ip"]??e.headers["x-forwarded-for"]??""}),n[w](),n.on("message",s=>this.handleClientMessage(n,s)),n.on("error",s=>this.handleClientError(n,s)),n.on("close",(...s)=>this.handleClientClose(n,...s)),this.emit("client-connect",n,e)}handleClientMessage(n,e){let s=e.toString();if(n[w](),s)try{let[o,...l]=JSON.parse(s);n.emit(`message:${o}`,...l),this.emit("client-message",n,o,...l),this.emit(`client-message:${o}`,n,...l)}catch(o){this.handleClientError(n,o)}else n[R]&&(n.latency=Date.now()-n[R],delete n[R])}handleClientError(n,e){e instanceof Event&&(e=void 0),process.env.NODE_ENV==="development"&&console.error("WebSocketServer Client error",e),this.emit("client-error",n,e)}handleClientClose(n,...e){process.env.NODE_ENV==="development"&&console.info("WebSocketServer Client closed",...e),n[w].clear(),clearInterval(n[F]),this.emit("client-close",n),this.emit("client-closed",n)}};var Z=class extends b{user;lastUserId;session};export{X as UsersServer,Z as WSSCWithUser};
|
|
1
|
+
import{_ids as V,Err as h,includesAll as U,isEmpty as F,removeAll as N,union as X,without as _}from"@nesvet/n";import{Binary as Y}from"insite-db";import{Users as Z}from"insite-users-server";import{CollectionMapPublication as O,Publication as z}from"insite-subscriptions-server/ws";import{_ids as K,includesAny as Q,intersection as k,pick as E}from"@nesvet/n";var x=class extends z{constructor(e){super("abilities",{fetch(t){return t.user?.abilities.inSite?.sections?.includes("users")?{abilities:e.getSchemeFor(t.user)}:null}})}},R=class extends O{constructor(e,t={}){let{projection:a={title:1,description:1},sort:u={_o:1},transform:c}=t;Object.assign(a,{involves:1,abilities:1}),super(e.collection,"roles",n=>n.user?.abilities.inSite?.sections?.includes("users")&&{query:{_id:{$in:n.user.slaveRoleIds}},projection:a,sort:u},n=>{let{involves:l,abilities:S,inheritedAbilities:p,displayTitle:d,_o:y}=e.get(n._id);Object.assign(n,{...n.involves?{ownInvolves:n.involves,involves:K(l),abilities:S,inheritedAbilities:p}:{},...a.title?{displayTitle:d}:{},_o:y}),c?.(n)})}},$=new WeakMap,W=class extends z{constructor(e,t={}){let{fieldsToUpdate:a=[],projection:u,transform:c}=t;for(let n of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!u||u[n]!==0)&&a.push(n);super("user",{onSubscribe(n){let[{user:l}]=n.args;if(l){let{_id:S}=l,p=d=>{if("documentKey"in d&&d.documentKey._id===S)switch(d.operationType){case"update":if(!Q(Object.keys(d.updateDescription.updatedFields),a))break;case"replace":case"delete":n.changed(d)}};e.collection.changeListeners.add(p),$.set(n,p)}},fetch({user:n,session:l},S){if(n){let p=E(n,["_id","email","name","initials","displayLabel","job","avatarUrl","abilities","slaveIds"]);if(Object.assign(p,{orgId:n.org._id,sessionId:S?l?._id:void 0,isOnline:!0}),u)for(let d in u)u[d]&&d in n?Object.assign(p,{[d]:n[d]}):delete p[d];return c?.(p),p}return null},onUnsubscribe(n){let l=$.get(n);l&&e.collection.changeListeners.delete(l)}})}},I=class extends O{constructor(e,t={}){let{projection:a={email:1,name:1,org:1,job:1,avatar:1},sort:u={"name.last":1},transform:c}=t;super(e.collection,"users",n=>n.user?.abilities.login&&{query:{},projection:a,sort:u},n=>{let l=e.get(n._id);Object.assign(n,E(l,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:n.org}),delete n.org,delete n.avatar,c?.(n)})}},C=class extends O{constructor(e,t={}){let{projection:a={_id:1},sort:u,triggers:c=[],transform:n}=t;c.includes("roles")||c.push("roles"),super(e.collection,"users.extended",l=>l.user?.abilities.inSite?.sections?.includes("users")&&{query:{_id:{$in:l.user.slaveIds}},projection:a,sort:u,triggers:c},(l,[S])=>{let p=e.get(l._id);Object.assign(l,{roleIds:k(p.ownRoleIds,S.user.slaveRoleIds)}),n?.(l)})}},j=class extends O{constructor(e){super(e.collection,"users.people.sessions",(t,a)=>t.user?.abilities.inSite?.sections?.includes("users")&&t.user.permissiveIds.includes(a)&&{query:{user:a},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},D=class extends O{constructor(e,t={}){let{projection:a={title:1},sort:u={title:1},transform:c}=t;super(e.collection,"orgs",n=>n.user?.abilities.login&&{query:{},projection:a,sort:u},n=>{let l=e.get(n._id);Object.assign(n,E(l,["initials","displayLabel"])),c?.(n)})}},q=class extends O{constructor(e,t={}){let{projection:a={note:1},sort:u={_o:1},triggers:c=[],transform:n}=t;c.includes("owners")||c.push("owners"),super(e.collection,"orgs.extended",l=>l.user?.abilities.inSite?.sections?.includes("users")&&{query:{_id:{$in:l.user.slaveIds}},projection:a,sort:u,triggers:c},(l,[S])=>{let p=e.get(l._id),{ownerIds:d,slaveOrgs:y,_o:T}=p;Object.assign(l,{owners:k(d,S.user.slaveIds),slaveOrgs:K(k(y,S.user.slaveOrgs)),_o:T}),n?.(l)})}};var M={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};var ee=["image/webp"],se=1024*512,B=class g{constructor(e){this.initPromise=this.init(e)}userWsMap=new WeakMap;sessionsWsMap=new WeakMap;wss;users;getSessionProps;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async e=>{let{wss:t,collections:a,users:u,publication:c,extendedPublication:n,userPublication:l,roles:S={},orgs:p={},getSessionProps:d,incomingTransport:y}=e,{publication:T}=S,{publication:H,extendedPublication:J}=p;this.wss=t,this.users=await Z.init(a,u),this.getSessionProps=d,this.incomingTransport=y;for(let s of this.users.values())this.handleUserCreate(s);if(this.abilitiesPublication=new x(this.users.abilitiesMap),this.rolesPublication=new R(this.users.roles,T),this.usersPublication=new I(this.users,c),this.usersExtendedPublication=new C(this.users,n),this.userPublication=new W(this.users,l),this.orgsPublication=new D(this.users.orgs,H),this.orgsExtendedPublication=new q(this.users.orgs,J),this.sessionsPublication=new j(this.users.sessions),this.users.on("roles-update",this.handleRolesUpdate),this.users.on("roles-role-update",this.handleRolesRoleUpdate),this.users.on("user-create",this.handleUserCreate),this.users.on("user-is-online",this.handleUserIsOnline),this.users.on("session-delete",this.handleSessionDelete),this.users.on("orgs-update",this.handleOrgsUpdate),this.users.on("orgs-org-update",this.handleOrgsOrgUpdate),this.users.on("user-permissions-change",this.handleUserPermissionsChange),this.wss.onRequest("login",this.handleClientRequestLogin),this.wss.onRequest("logout",this.handleClientRequestLogout),this.wss.on("client-closed",this.handleClientClosed),this.wss.onRequest("users.people.check-email",(s,i)=>{if(s.user?.abilities.inSite?.sections?.includes("users")){if(!M.email.test(i))throw new h("Not email","notemail");if(this.users.byEmail.has(i))throw new h("Email already exists","exists")}}),this.wss.onRequest("users.people.add",async(s,{roles:i,org:o,...r})=>{if(s.user?.abilities.inSite?.sections?.includes("users")){if(!i.length)throw new h("Roles shouldn't be empty","emptyroles");if(!U(s.user.slaveRoleIds,i))throw new h("Can't assign role the user is not involved in","forbiddenrole");if(o&&!s.user.slaveIds.includes(o))throw new h("Can't assign org the user is not master of","forbiddenorg");await this.users.new({roles:i,org:o,...r})}}),this.wss.onRequest("users.people.change-password",async(s,i,o)=>{if(s.user?.abilities.inSite?.sections?.includes("users")&&s.user.permissiveIds.includes(i)){if(typeof o!="string")throw new h("Type of password is incorrect","wrongpasswordtype");if(!o)throw new h("Password can't be empty","emptypassword");await this.users.changePassword(i,o)}}),this.wss.onRequest("users.people.update",async(s,i,o)=>{if(s.user?.abilities.inSite?.sections?.includes("users")&&s.user.permissiveIds.includes(i)){if(o.roles){if(!o.roles.length)throw new h("Roles can't be empty","emptyroles");if(!U(s.user.slaveRoleIds,o.roles))throw new h("Can't assign role the user is not involved in","forbiddenrole");let r=this.users.get(i);r&&(o.roles=r.isRoot?["root"]:this.users.roles.cleanUpIds(_(r.ownRoleIds,s.user.slaveRoleIds).concat(o.roles)))}if(o.org&&!s.user.slaveIds.includes(o.org))throw new h("Can't assign org the user is not master of","forbiddenorg");F(o)||await this.users.collection.updateOne({_id:i},{$set:o})}}),this.wss.onRequest("users.people.delete",async(s,i)=>{s.user?.abilities.inSite?.sections?.includes("users")&&s.user.slaveIds.includes(i)&&await this.users.collection.deleteOne({_id:i})}),this.wss.onRequest("users.people.destroy-session",async(s,i)=>{s.user?.abilities.inSite?.sections?.includes("users")&&s.user.permissiveIds.includes(this.users.bySessionId.get(i)?._id)&&await this.users.sessions.collection.deleteOne({_id:i})}),this.incomingTransport){let s=i=>({begin:async(o,r)=>(!i||await i(o,r))&&ee.includes(r.metadata.type)&&r.size<=se,end:async(o,{data:r,metadata:{type:b,_id:A}})=>{let m=Y.createFromBase64(r.slice(r.indexOf(","))),v=Date.now().toString(36);await Promise.all([this.users.avatars.collection.replaceOne({_id:A},{type:b,size:m.length(),ts:v,data:m},{upsert:!0}),this.users.collection.updateOne({_id:A},{$set:{avatar:v}})])}});this.incomingTransport.on("users.people.avatar",s((i,{metadata:{_id:o}})=>i.user?.abilities.inSite?.sections?.includes("users")&&i.user.permissiveIds.includes(o))),this.incomingTransport.on("user.avatar",s((i,o)=>i.user&&i.user._id===o.metadata._id))}let L=async s=>{await Promise.all([this.users.avatars.collection.deleteOne({_id:s}),this.users.collection.updateOne({_id:s},{$set:{avatar:null}})])};return this.wss.onRequest("users.people.delete-avatar",async(s,i)=>s.user?.abilities.inSite?.sections?.includes("users")&&s.user.permissiveIds.includes(i)&&await L(i)),this.wss.onRequest("user.delete-avatar",async(s,i)=>s.user&&s.user._id===i&&await L(i)),this.wss.onRequest("users.orgs.add",async(s,i)=>{if(s.user?.abilities.inSite?.sections?.includes("users")){if(!i.title)throw new h("Title can't be empty","emptytitle");await this.users.orgs.new(i,s.user._id)}}),this.wss.onRequest("users.orgs.update",async(s,i,o)=>{if(s.user?.abilities.inSite?.sections?.includes("users")&&s.user.slaveIds.includes(i)){if(o.title!==void 0&&!o.title)throw new h("Title can't be empty","emptytitle");if(o.owners){if(!U(s.user.slaveIds,o.owners))throw new h("Can't assign owners the user is not master of","forbiddenowners");let r=this.users.orgs.get(i);r&&(o.owners=this.users.sortIds(X(_(r.ownerIds,s.user.slaveIds),_(o.owners,[r._id,...V(r.slaveOrgs)]))))}F(o)||await this.users.orgs.collection.updateOne({_id:i},{$set:o})}}),this.wss.onRequest("users.orgs.delete",async(s,i)=>{s.user?.abilities.inSite?.sections?.includes("users")&&s.user.slaveIds.includes(i)&&await this.users.orgs.collectionDelete(i)}),this.wss.onRequest("users.roles.check-id",(s,i)=>{if(s.user?.abilities.inSite?.sections?.includes("users")){if(!M.role.test(i))throw new h("Role ID is incorrect","notroleid");if(this.users.roles.has(i))throw new h("Role ID already exists","exists")}}),this.wss.onRequest("users.roles.add",async(s,i)=>{s.user?.abilities.inSite?.sections?.includes("users")&&await this.users.roles.new(i)}),this.wss.onRequest("users.roles.update",async(s,i,{abilities:o,...r})=>{if(s.user?.abilities.inSite?.sections?.includes("users")&&s.user.slaveRoleIds.includes(i)){if(r.involves)if(U(s.user.slaveRoleIds,r.involves)){N(r.involves,[i]);let b=this.users.roles.get(i);if(b)for(let A of r.involves)this.users.roles.get(A)?.involves.has(b)&&N(r.involves,[A]);r.involves=this.users.roles.cleanUpIds(r.involves)}else throw new h("Can't assign role the user is not involved in","forbiddenrole");await this.users.roles.collection.updateOne({_id:i},{$set:r})}}),this.wss.onRequest("users.roles.set-ability",async(s,i,o,r,b)=>{if(s.user?.abilities.inSite?.sections?.includes("users")&&s.user.slaveRoleIds.includes(i)&&s.user.abilities[o]){let A=this.users.roles.get(i);if(A){let m=structuredClone(A.ownAbilities),v;if(r){m[o]||(m[o]={});let P=this.users.abilitiesMap.get(o)?.params?.find(f=>f._id===r);if(P){let f=s.user.abilities[o],w=m[o];P.type==="number"?f[r]>=b&&(w[r]=b,v=!0):P.type==="items"&&f[r]&&U(f[r],b)&&(w[r]=b,v=!0)}}else b?m[o]=this.users.abilitiesMap.getMinimumOf(o):function P(f){if(f&&(delete m[f._id],f.subAbilities))for(let w of f.subAbilities)m[w._id]&&P(w)}(this.users.abilitiesMap.get(o)),v=!0;v&&await this.users.roles.collection.updateOne({_id:i},{$set:{abilities:m}})}}}),this.wss.on("client-message:users.roles.delete",async(s,i)=>{s.user?.abilities.inSite?.sections?.includes("users")&&s.user.slaveRoleIds.includes(i)&&await this.users.roles.collectionDelete(i)}),this};initPromise;whenReady(){return this.initPromise}getDefaultSessionProps({userAgent:e,remoteAddress:t}){return{userAgent:e,remoteAddress:t}}setSession(e,t,a){t===null?t=void 0:typeof t=="string"&&(t=this.users.sessions.get(t)),e.session!==t&&(e.session&&this.sessionsWsMap.delete(e.session),t?(e.session=t,e.user=t.user,e.lastUserId=t.user._id,this.userWsMap.get(t.user)?.add(e),this.sessionsWsMap.set(t,e),a&&t.prolong({...this.getDefaultSessionProps(e),...this.getSessionProps?.(e),isOnline:!0})):(delete e.session,this.userWsMap.get(e.user)?.delete(e)),this.wss.emit("client-session",e,a))}login=async(e,t,a)=>{let u=await this.users.login(t,a,{...this.getDefaultSessionProps(e),...this.getSessionProps?.(e),isOnline:!0});u&&this.setSession(e,u)};logout=e=>{e.session&&(this.users.logout(e.session),this.setSession(e,null))};handleRolesUpdate=()=>this.rolesPublication.flushInitial();handleRolesRoleUpdate=(e,t)=>t&&this.rolesPublication.skip(t);handleUserCreate=e=>this.userWsMap.set(e,new Set);handleUserIsOnline=({_id:e,isOnline:t})=>{let a={_id:e,isOnline:t};for(let u of this.usersPublication.subscriptions){let[c]=u.args;c.user&&c.user._id!==e&&u.handler([["u",a,!0]])}};handleSessionDelete=e=>{let t=this.sessionsWsMap.get(e);t&&this.setSession(t,null)};handleOrgsUpdate=()=>{this.orgsPublication.flushInitial(),this.orgsExtendedPublication.flushInitial()};handleOrgsOrgUpdate=(e,t)=>{t&&(this.orgsPublication.skip(t),this.orgsExtendedPublication.skip(t))};handleUserPermissionsChange=e=>{let t=this.userWsMap.get(e);t&&this.wss.emit("should-renew-subscriptions",[...t])};handleClientRequestLogin=(e,t,a)=>this.login(e,t,a);handleClientRequestLogout=e=>this.logout(e);handleClientClosed=e=>{e.session?.offline(),this.setSession(e,null)};static init(e){return new g(e).whenReady()}};import{InSiteWebSocketServerClient as ie}from"insite-ws/server";var G=class extends ie{user;lastUserId;session};export{B as UsersServer,G 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
|
-
"sources": ["../src/UsersServer.ts", "../src/publications.ts", "../src/regexps.ts", "../
|
|
4
|
-
"sourcesContent": ["import type { InSiteWebSocketServer } from \"insite-ws/server\";\nimport type { IncomingTransfer, IncomingTransport } from \"insite-ws-transfers/node\";\nimport {\n\t_ids,\n\tErr,\n\tincludesAll,\n\tisEmpty,\n\tremoveAll,\n\tStringKey,\n\tunion,\n\twithout\n} from \"@nesvet/n\";\nimport { Binary, type ChangeStreamDocument, InSiteCollections } from \"insite-db\";\nimport {\n\ttype Abilities,\n\ttype AbilitiesSchema,\n\ttype AbilityParamItems,\n\ttype AbilityParamNumber,\n\ttype AbilityWithParams,\n\ttype GenericAbilities,\n\ttype Org,\n\ttype OrgDoc,\n\ttype Role,\n\ttype RoleDoc,\n\ttype Session,\n\ttype SessionDoc,\n\ttype User,\n\ttype UserDoc,\n\tUsers,\n\ttype Options as UsersOptions\n} from \"insite-users-server\";\nimport {\n\tAbilitiesPublication,\n\tOrgsExtendedPublication,\n\ttype OrgsExtendedPublicationOptions,\n\tOrgsPublication,\n\ttype OrgsPublicationOptions,\n\tRolesPublication,\n\ttype RolesPublicationOptions,\n\tSessionsPublication,\n\tUserPublication,\n\ttype UserPublicationOptions,\n\tUsersExtendedPublication,\n\ttype UsersExtendedPublicationOptions,\n\tUsersPublication,\n\ttype UsersPublicationOptions\n} from \"./publications\";\nimport { regexps } from \"./regexps\";\nimport { WSSCWithUser } from \"./WSSCWithUser\";\n\nconst avatarTypesAccepted = [ \"image/webp\" ];\nconst maxAvatarSize = 1024 * 512;\n\nexport type Options<AS extends AbilitiesSchema> = {\n\twss: InSiteWebSocketServer<WSSCWithUser<AS>>;\n\tcollections: InSiteCollections;\n\tusers: UsersOptions<AS>;\n\tpublication?: UsersPublicationOptions;\n\textendedPublication?: UsersExtendedPublicationOptions;\n\tuserPublication?: UserPublicationOptions;\n\troles?: {\n\t\tpublication?: RolesPublicationOptions;\n\t};\n\torgs?: {\n\t\tpublication?: OrgsPublicationOptions;\n\t\textendedPublication?: OrgsExtendedPublicationOptions;\n\t};\n\tgetSessionProps?: (wssc: WSSCWithUser<AS>) => Partial<SessionDoc>;\n\tincomingTransport?: IncomingTransport;\n};\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\tprivate userWsMap = new WeakMap<User<AS>, Set<WSSCWithUser<AS>>>();\n\tprivate sessionsWsMap = new WeakMap<Session<AS>, WSSCWithUser<AS>>();\n\t\n\twss!: Options<AS>[\"wss\"];\n\tusers!: Users<AS>;\n\tgetSessionProps!: Options<AS>[\"getSessionProps\"];\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: usersOptions,\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\tgetSessionProps,\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 = await Users.init(collections, usersOptions);\n\t\tthis.getSessionProps = getSessionProps;\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.abilitiesMap);\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\t\n\t\t/*\n\t\t * Handlers\n\t\t */\n\t\t\n\t\t/* Users */\n\t\t\n\t\tthis.wss.onRequest(\"users.people.check-email\", (wssc: WSSCWithUser<AS>, email: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\")) {\n\t\t\t\tif (!regexps.email.test(email))\n\t\t\t\t\tthrow new Err(\"Not email\", \"notemail\");\n\t\t\t\t\n\t\t\t\tif (this.users.byEmail.has(email))\n\t\t\t\t\tthrow new Err(\"Email already exists\", \"exists\");\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.people.add\", async (wssc: WSSCWithUser<AS>, { roles, org, ...rest }: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\")) {\n\t\t\t\tif (!roles.length)\n\t\t\t\t\tthrow new Err(\"Roles shouldn't be empty\", \"emptyroles\");\n\t\t\t\t\n\t\t\t\tif (!includesAll(wssc.user.slaveRoleIds, roles))\n\t\t\t\t\tthrow new Err(\"Can't assign role the user is not involved in\", \"forbiddenrole\");\n\t\t\t\t\n\t\t\t\tif (org && !wssc.user.slaveIds.includes(org))\n\t\t\t\t\tthrow new Err(\"Can't assign org the user is not master of\", \"forbiddenorg\");\n\t\t\t\t\n\t\t\t\tawait this.users.new({ roles, org, ...rest });\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.people.change-password\", async (wssc: WSSCWithUser<AS>, _id: string, newPassword: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.permissiveIds.includes(_id)) {\n\t\t\t\tif (typeof newPassword != \"string\")\n\t\t\t\t\tthrow new Err(\"Type of password is incorrect\", \"wrongpasswordtype\");\n\t\t\t\t\n\t\t\t\tif (!newPassword)\n\t\t\t\t\tthrow new Err(\"Password can't be empty\", \"emptypassword\");\n\t\t\t\t\n\t\t\t\tawait this.users.changePassword(_id, newPassword);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.people.update\", async (wssc: WSSCWithUser<AS>, _id: string, updates: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.permissiveIds.includes(_id)) {\n\t\t\t\tif (updates.roles) {\n\t\t\t\t\tif (!updates.roles.length)\n\t\t\t\t\t\tthrow new Err(\"Roles can't be empty\", \"emptyroles\");\n\t\t\t\t\t\n\t\t\t\t\tif (!includesAll(wssc.user.slaveRoleIds, updates.roles))\n\t\t\t\t\t\tthrow new Err(\"Can't assign role the user is not involved in\", \"forbiddenrole\");\n\t\t\t\t\t\n\t\t\t\t\tconst user = this.users.get(_id);\n\t\t\t\t\t\n\t\t\t\t\tif (user)\n\t\t\t\t\t\tupdates.roles =\n\t\t\t\t\t\t\tuser.isRoot ?\n\t\t\t\t\t\t\t\t[ \"root\" ] :\n\t\t\t\t\t\t\t\tthis.users.roles.cleanUpIds(\n\t\t\t\t\t\t\t\t\twithout(user.ownRoleIds, wssc.user.slaveRoleIds).concat(updates.roles)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (updates.org && !wssc.user.slaveIds.includes(updates.org))\n\t\t\t\t\tthrow new Err(\"Can't assign org the user is not master of\", \"forbiddenorg\");\n\t\t\t\t\n\t\t\t\tif (!isEmpty(updates))\n\t\t\t\t\tawait this.users.collection.updateOne({ _id }, { $set: updates });\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.people.delete\", async (wssc: WSSCWithUser<AS>, _id: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveIds.includes(_id))\n\t\t\t\tawait this.users.collection.deleteOne({ _id });\n\t\t\t\n\t\t});\n\t\t\n\t\t\n\t\t/* Sessions */\n\t\t\n\t\tthis.wss.onRequest(\"users.people.destroy-session\", async (wssc: WSSCWithUser<AS>, sessionId: string) => {\n\t\t\tif (\n\t\t\t\twssc.user?.abilities.inSite?.sections?.includes(\"users\") &&\n\t\t\t\twssc.user.permissiveIds.includes(this.users.bySessionId.get(sessionId)?._id)\n\t\t\t)\n\t\t\t\tawait this.users.sessions.collection.deleteOne({ _id: sessionId });\n\t\t\t\n\t\t});\n\t\t\n\t\t\n\t\t/* Avatars */\n\t\t\n\t\tif (this.incomingTransport) {\n\t\t\tconst getAvatarTransferProps = (check?: (wssc: WSSCWithUser<AS>, transfer: IncomingTransfer) => boolean | Promise<boolean | undefined> | undefined) => ({\n\t\t\t\t\n\t\t\t\tbegin: async (wssc: WSSCWithUser<AS>, transfer: IncomingTransfer) => (\n\t\t\t\t\t(!check || await check(wssc, transfer)) &&\n\t\t\t\t\tavatarTypesAccepted.includes(transfer.metadata.type as string) &&\n\t\t\t\t\ttransfer.size <= maxAvatarSize\n\t\t\t\t),\n\t\t\t\t\n\t\t\t\tend: async (wssc: WSSCWithUser<AS>, { data, metadata: { type, _id } }: IncomingTransfer) => {\n\t\t\t\t\tconst binaryData = Binary.createFromBase64((data as string).slice((data as string).indexOf(\",\")));\n\t\t\t\t\t\n\t\t\t\t\tconst ts = Date.now().toString(36);\n\t\t\t\t\t\n\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\tthis.users.avatars.collection.replaceOne({ _id: _id as string }, {\n\t\t\t\t\t\t\ttype: type as string,\n\t\t\t\t\t\t\tsize: binaryData.length(),\n\t\t\t\t\t\t\tts,\n\t\t\t\t\t\t\tdata: binaryData\n\t\t\t\t\t\t}, { upsert: true }),\n\t\t\t\t\t\tthis.users.collection.updateOne({ _id: _id as string }, { $set: { avatar: ts } })\n\t\t\t\t\t]);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\t\n\t\t\tthis.incomingTransport.on(\"users.people.avatar\", getAvatarTransferProps(\n\t\t\t\t(wssc: WSSCWithUser<AS>, { metadata: { _id } }: IncomingTransfer) =>\n\t\t\t\t\twssc.user?.abilities.inSite?.sections?.includes(\"users\") &&\n\t\t\t\t\twssc.user.permissiveIds.includes(_id as string)\n\t\t\t));\n\t\t\t\n\t\t\tthis.incomingTransport.on(\"user.avatar\", getAvatarTransferProps(\n\t\t\t\t(wssc: WSSCWithUser<AS>, transfer: IncomingTransfer) =>\n\t\t\t\t\twssc.user &&\n\t\t\t\t\twssc.user._id === transfer.metadata._id\n\t\t\t));\n\t\t}\n\t\t\n\t\tconst deleteAvatar = async (_id: string) => {\n\t\t\t\n\t\t\tawait Promise.all([\n\t\t\t\tthis.users.avatars.collection.deleteOne({ _id }),\n\t\t\t\tthis.users.collection.updateOne({ _id }, { $set: { avatar: null } })\n\t\t\t]);\n\t\t\t\n\t\t};\n\t\t\n\t\tthis.wss.onRequest(\"users.people.delete-avatar\", async (wssc: WSSCWithUser<AS>, _id: string) =>\n\t\t\twssc.user?.abilities.inSite?.sections?.includes(\"users\") &&\n\t\t\twssc.user.permissiveIds.includes(_id) &&\n\t\t\tawait deleteAvatar(_id)\n\t\t);\n\t\t\n\t\tthis.wss.onRequest(\"user.delete-avatar\", async (wssc: WSSCWithUser<AS>, _id: string) =>\n\t\t\twssc.user &&\n\t\t\twssc.user._id === _id &&\n\t\t\tawait deleteAvatar(_id)\n\t\t);\n\t\t\n\t\t\n\t\t/* Orgs */\n\t\t\n\t\tthis.wss.onRequest(\"users.orgs.add\", async (wssc: WSSCWithUser<AS>, org: Omit<OrgDoc, \"_id\" | \"createdAt\" | \"owners\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\")) {\n\t\t\t\tif (!org.title)\n\t\t\t\t\tthrow new Err(\"Title can't be empty\", \"emptytitle\");\n\t\t\t\t\n\t\t\t\tawait this.users.orgs.new(org, wssc.user._id);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.orgs.update\", async (wssc: WSSCWithUser<AS>, _id, updates: Omit<OrgDoc, \"_id\" | \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveIds.includes(_id)) {\n\t\t\t\tif (updates.title !== undefined && !updates.title)\n\t\t\t\t\tthrow new Err(\"Title can't be empty\", \"emptytitle\");\n\t\t\t\t\n\t\t\t\tif (updates.owners) {\n\t\t\t\t\tif (!includesAll(wssc.user.slaveIds, updates.owners))\n\t\t\t\t\t\tthrow new Err(\"Can't assign owners the user is not master of\", \"forbiddenowners\");\n\t\t\t\t\t\n\t\t\t\t\tconst org = this.users.orgs.get(_id);\n\t\t\t\t\t\n\t\t\t\t\tif (org)\n\t\t\t\t\t\tupdates.owners =\n\t\t\t\t\t\t\tthis.users.sortIds(\n\t\t\t\t\t\t\t\tunion(\n\t\t\t\t\t\t\t\t\twithout(org.ownerIds, wssc.user.slaveIds),\n\t\t\t\t\t\t\t\t\twithout(updates.owners, [ org._id, ..._ids(org.slaveOrgs) ])\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!isEmpty(updates))\n\t\t\t\t\tawait this.users.orgs.collection.updateOne({ _id }, { $set: updates });\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.orgs.delete\", async (wssc: WSSCWithUser<AS>, _id: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveIds.includes(_id))\n\t\t\t\tawait this.users.orgs.collectionDelete(_id);\n\t\t\t\n\t\t});\n\t\t\n\t\t\n\t\t/* Roles */\n\t\t\n\t\tthis.wss.onRequest(\"users.roles.check-id\", (wssc: WSSCWithUser<AS>, _id: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\")) {\n\t\t\t\tif (!regexps.role.test(_id))\n\t\t\t\t\tthrow new Err(\"Role ID is incorrect\", \"notroleid\");\n\t\t\t\t\n\t\t\t\tif (this.users.roles.has(_id))\n\t\t\t\t\tthrow new Err(\"Role ID already exists\", \"exists\");\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.roles.add\", async (wssc: WSSCWithUser<AS>, role: Omit<RoleDoc, \"abilities\" | \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\"))\n\t\t\t\tawait this.users.roles.new(role);\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.roles.update\", async (wssc: WSSCWithUser<AS>, _id: string, { abilities, ...updates }: Omit<RoleDoc, \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveRoleIds.includes(_id)) {\n\t\t\t\tif (updates.involves)\n\t\t\t\t\tif (includesAll(wssc.user.slaveRoleIds, updates.involves)) {\n\t\t\t\t\t\tremoveAll(updates.involves, [ _id ]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tconst role = this.users.roles.get(_id);\n\t\t\t\t\t\tif (role)\n\t\t\t\t\t\t\tfor (const involvedRoleId of updates.involves)\n\t\t\t\t\t\t\t\tif (this.users.roles.get(involvedRoleId)?.involves.has(role))\n\t\t\t\t\t\t\t\t\tremoveAll(updates.involves, [ involvedRoleId ]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tupdates.involves = this.users.roles.cleanUpIds(updates.involves);\n\t\t\t\t\t} else\n\t\t\t\t\t\tthrow new Err(\"Can't assign role the user is not involved in\", \"forbiddenrole\");\n\t\t\t\t\n\t\t\t\tawait this.users.roles.collection.updateOne({ _id }, { $set: updates });\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.roles.set-ability\", async (wssc: WSSCWithUser<AS>, _id: string, abilityId: StringKey<Abilities<AS>>, paramId: string, value: unknown) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveRoleIds.includes(_id) && wssc.user.abilities[abilityId]) {\n\t\t\t\tconst role = this.users.roles.get(_id);\n\t\t\t\tif (role) {\n\t\t\t\t\tconst abilities = structuredClone(role.ownAbilities) as GenericAbilities;\n\t\t\t\t\tlet shouldUpdate;\n\t\t\t\t\t\n\t\t\t\t\tif (paramId) {\n\t\t\t\t\t\tif (!abilities[abilityId])\n\t\t\t\t\t\t\tabilities[abilityId] = {};\n\t\t\t\t\t\tconst param = this.users.abilitiesMap.get(abilityId)?.params?.find(anotherParam => anotherParam._id === paramId);\n\t\t\t\t\t\tif (param) {\n\t\t\t\t\t\t\tconst userAbilityWithParams = wssc.user.abilities[abilityId] as AbilityWithParams;\n\t\t\t\t\t\t\tconst abilityWithParams = abilities[abilityId] as AbilityWithParams;\n\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\tif ((userAbilityWithParams[paramId] as AbilityParamNumber) >= (value as number)) {\n\t\t\t\t\t\t\t\t\tabilityWithParams[paramId] = value as number;\n\t\t\t\t\t\t\t\t\tshouldUpdate = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (param.type === \"items\" && userAbilityWithParams[paramId] && includesAll(userAbilityWithParams[paramId] as AbilityParamItems, value as string[])) {\n\t\t\t\t\t\t\t\tabilityWithParams[paramId] = value as string[];\n\t\t\t\t\t\t\t\tshouldUpdate = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (value)\n\t\t\t\t\t\t\tabilities[abilityId] = this.users.abilitiesMap.getMinimumOf(abilityId);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t(function resolve(schema) {\n\t\t\t\t\t\t\t\tif (schema) {\n\t\t\t\t\t\t\t\t\tdelete abilities[schema._id];\n\t\t\t\t\t\t\t\t\tif (schema.subAbilities)\n\t\t\t\t\t\t\t\t\t\tfor (const subSchema of schema.subAbilities)\n\t\t\t\t\t\t\t\t\t\t\tif (abilities[subSchema._id])\n\t\t\t\t\t\t\t\t\t\t\t\tresolve(subSchema);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t})(this.users.abilitiesMap.get(abilityId));\n\t\t\t\t\t\t\n\t\t\t\t\t\tshouldUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (shouldUpdate)\n\t\t\t\t\t\tawait this.users.roles.collection.updateOne({ _id }, { $set: { abilities } });\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.on(\"client-message:users.roles.delete\", async (wssc: WSSCWithUser<AS>, _id: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveRoleIds.includes(_id))\n\t\t\t\tawait this.users.roles.collectionDelete(_id);\n\t\t\t\n\t\t});\n\t\t\n\t\treturn this;\n\t};\n\t\n\tprivate initPromise;\n\t\n\twhenReady() {\n\t\treturn this.initPromise;\n\t}\n\t\n\tgetDefaultSessionProps({ userAgent, remoteAddress }: WSSCWithUser<AS>) {\n\t\treturn {\n\t\t\tuserAgent,\n\t\t\tremoteAddress\n\t\t};\n\t}\n\t\n\tsetSession(wssc: WSSCWithUser<AS>, session: null | Session | 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) {\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\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({\n\t\t\t\t\t\t...this.getDefaultSessionProps(wssc),\n\t\t\t\t\t\t...this.getSessionProps?.(wssc),\n\t\t\t\t\t\tisOnline: true\n\t\t\t\t\t});\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tdelete wssc.session;\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\tprivate login = async (wssc: WSSCWithUser<AS>, email: string, password: string) => {\n\t\tconst session = await this.users.login(email, password, {\n\t\t\t...this.getDefaultSessionProps(wssc),\n\t\t\t...this.getSessionProps?.(wssc),\n\t\t\tisOnline: true\n\t\t});\n\t\t\n\t\tif (session)\n\t\t\tthis.setSession(wssc, session);\n\t\t\n\t};\n\t\n\tprivate 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\tprivate handleRolesUpdate = () =>\n\t\tthis.rolesPublication.flushInitial();\n\t\n\tprivate handleRolesRoleUpdate = (role: Role, next: ChangeStreamDocument<RoleDoc>) =>\n\t\tnext && this.rolesPublication.skip(next);\n\t\n\tprivate handleUserCreate = (user: User) =>\n\t\tthis.userWsMap.set(user, new Set<WSSCWithUser<AS>>());\n\t\n\tprivate handleUserIsOnline = ({ _id, isOnline }: User) => {\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\tprivate handleSessionDelete = (session: Session) => {\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\tprivate handleOrgsUpdate = () => {\n\t\t\n\t\tthis.orgsPublication.flushInitial();\n\t\tthis.orgsExtendedPublication.flushInitial();\n\t\t\n\t};\n\t\n\tprivate handleOrgsOrgUpdate = (org: Org, 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\tprivate handleUserPermissionsChange = (user: User) => {\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\tprivate handleClientRequestLogin = (wssc: WSSCWithUser<AS>, email: string, password: string) =>\n\t\tthis.login(wssc, email, password);\n\t\n\tprivate handleClientRequestLogout = (wssc: WSSCWithUser<AS>) =>\n\t\tthis.logout(wssc);\n\t\n\tprivate 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", "import {\n\tCollectionMapPublication,\n\tProjection,\n\tPublication,\n\tSubscriptionHandle\n} from \"insite-subscriptions-server/ws\";\nimport {\n\t_ids,\n\tincludesAny,\n\tintersection,\n\tpick\n} from \"@nesvet/n\";\nimport { ChangeStreamDocument, Sort } from \"insite-db\";\nimport type {\n\tAbilitiesMap,\n\tAbilitiesSchema,\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(abilitiesMap: AbilitiesMap<AS>) {\n\t\tsuper(\"abilities\", {\n\t\t\t\n\t\t\tfetch(wssc) {\n\t\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\"))\n\t\t\t\t\treturn { abilities: abilitiesMap.getSchemeFor(wssc.user) };\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\", wssc => wssc.user?.abilities.inSite?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: wssc.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.changeListeners.add(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.changeListeners.delete(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\", wssc => wssc.user?.abilities.inSite?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: wssc.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\", (wssc, userId) =>\n\t\t\twssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.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, 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\", wssc => wssc.user?.abilities.inSite?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: wssc.user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (orgDoc, [ wssc ]) => {\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, wssc.user!.slaveIds),\n\t\t\t\tslaveOrgs: _ids(intersection(slaveOrgs, wssc.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", "export const regexps = {\n\temail: /^[^\\s@]{1,63}@[^\\s@]{1,63}\\.[^\\s@]{1,63}$/,\n\trole: /^[\\d_a-z-]{1,64}$/\n};\n", "import fs from \"node:fs\";\nimport http from \"node:http\";\nimport https from \"node:https\";\nimport type { RawData, WebSocket, WebSocketServer } from \"ws\";\nimport { requestHeaders } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { InSiteWebSocketServerClient } from \"./WebSocketServerClient\";\nimport type { Options } from \"./types\";\n\n\ntype RequestListener<WSSC extends InSiteWebSocketServerClient> = (wscc: WSSC, ...args: any[]) => any | Promise<any>;// eslint-disable-line @typescript-eslint/no-explicit-any\n\ndeclare abstract class PrepareWebSocketServer<WSSC extends InSiteWebSocketServerClient> extends WebSocketServer<typeof InSiteWebSocketServerClient> {\n\ton(event: \"connection\", callback: (this: InSiteWebSocketServer<WSSC>, socket: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"error\", callback: (this: InSiteWebSocketServer<WSSC>, error: Error) => void): this;\n\ton(event: \"headers\", callback: (this: InSiteWebSocketServer<WSSC>, headers: string[], request: http.IncomingMessage) => void): this;\n\ton(event: \"close\" | \"listening\", callback: (this: InSiteWebSocketServer<WSSC>) => void): this;\n\t\n\ton(event: \"client-connect\", listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, request: http.IncomingMessage) => void): this;\n\ton(event: \"client-error\", listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, error: Error | undefined) => void): this;\n\ton(event: `client-${string}`, listener: (this: InSiteWebSocketServer<WSSC>, wscc: WSSC, ...args: any[]) => void): this;// eslint-disable-line @typescript-eslint/no-explicit-any\n\t\n\ton(event: string | symbol, listener: (this: InSiteWebSocketServer<WSSC>, ...args: any[]) => void): this;// eslint-disable-line @typescript-eslint/no-explicit-any\n}\n\n\nexport class InSiteWebSocketServer<WSSC extends InSiteWebSocketServerClient = InSiteWebSocketServerClient> extends PrepareWebSocketServer<WSSC> {\n\tconstructor(options: Options<WSSC>, props?: Record<string, unknown>, handleListen?: (() => void)) {\n\t\tconst {\n\t\t\tssl,\n\t\t\tport,\n\t\t\t...wssOptions\n\t\t} = options;\n\t\t\n\t\tif (ssl) {\n\t\t\tif (typeof ssl.cert == \"string\" && !/^-{3,}BEGIN/.test(ssl.cert))\n\t\t\t\ttry {\n\t\t\t\t\tssl.cert = fs.readFileSync(ssl.cert);\n\t\t\t\t} catch {}\n\t\t\tif (typeof ssl.key == \"string\" && !/^-{3,}BEGIN/.test(ssl.key))\n\t\t\t\ttry {\n\t\t\t\t\tssl.key = fs.readFileSync(ssl.key);\n\t\t\t\t} catch {}\n\t\t}\n\t\t\n\t\tconst {\n\t\t\tserver = ssl ? https.createServer({ ...ssl }) : http.createServer()\n\t\t} = wssOptions;\n\t\t\n\t\tsuper({\n\t\t\tWebSocket: InSiteWebSocketServerClient<WSSC>,\n\t\t\t...wssOptions,\n\t\t\tserver\n\t\t});\n\t\t\n\t\tthis.port = typeof port == \"string\" ? Number.parseInt(port) : port;\n\t\t\n\t\tif (props)\n\t\t\tif (typeof props == \"function\")\n\t\t\t\thandleListen = props;\n\t\t\telse\n\t\t\t\tObject.assign(this, props);\n\t\t\n\t\tthis.on(\"connection\", this.handleConnection);\n\t\t\n\t\tthis.on(`client-message:${requestHeaders.request}`, this.handleRequest);\n\t\t\n\t\tserver.listen(this.port, handleListen);\n\t\t\n\t}\n\t\n\treadonly isWebSocketServer = true;\n\treadonly isWebSocketServerClient = false;\n\treadonly isWebSocket = false;\n\t\n\treadonly port;\n\t\n\tprivate readonly requestListeners = new Map<string, RequestListener<WSSC>>();\n\t\n\taddRequestListener(kind: string, listener: RequestListener<WSSC>) {\n\t\tthis.requestListeners.set(kind, listener);\n\t\t\n\t\treturn this;\n\t}\n\t\n\tonRequest = this.addRequestListener;\n\t\n\tremoveRequestListener(kind: string) {\n\t\tthis.requestListeners.delete(kind);\n\t\t\n\t\treturn this;\n\t}\n\t\n\toffRequest = this.removeRequestListener;\n\t\n\tprivate handleRequest = async (wssc: WSSC, id: string, kind: string, ...rest: unknown[]) => {\n\t\tconst listener = this.requestListeners.get(kind);\n\t\t\n\t\tlet result;\n\t\tlet requestError = null;\n\t\t\n\t\tif (listener)\n\t\t\ttry {\n\t\t\t\tresult = await listener.call(this, wssc, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tif (error instanceof Error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\trequestError = { message, ...restProps };\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\trequestError = { message: `Unknown request kind \"${kind}\"` };\n\t\t\n\t\twssc.sendMessage(`${requestHeaders.response}-${id}`, requestError, result);\n\t\t\n\t};\n\t\n\tprivate handleConnection(wssc: WSSC, request: http.IncomingMessage) {\n\t\tif (!(wssc instanceof InSiteWebSocketServerClient)) { /* Compatibility with Bun */\n\t\t\tObject.defineProperties(wssc, {\n\t\t\t\tisConnecting: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isConnecting\")!.get\n\t\t\t\t},\n\t\t\t\tisOpen: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isOpen\")!.get\n\t\t\t\t},\n\t\t\t\tisClosing: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosing\")!.get\n\t\t\t\t},\n\t\t\t\tisClosed: {\n\t\t\t\t\tget: Object.getOwnPropertyDescriptor(InSiteWebSocketServerClient.prototype, \"isClosed\")!.get\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\tconst { terminate } = wssc as WebSocket;\n\t\t\t\n\t\t\tObject.assign(wssc, {\n\t\t\t\tisWebSocketServerClient: true,\n\t\t\t\tisWebSocketServer: false,\n\t\t\t\tisWebSocket: false,\n\t\t\t\t[defibSymbol]: InSiteWebSocketServerClient.makeDefib.call(wssc),\n\t\t\t\tlatency: 0,\n\t\t\t\t[heartbeatIntervalSymbol]: InSiteWebSocketServerClient.makeHeartbeatInterval.call(wssc),\n\t\t\t\tsendMessage: InSiteWebSocketServerClient.prototype.sendMessage,\n\t\t\t\tsendRequest: InSiteWebSocketServerClient.prototype.sendRequest,\n\t\t\t\tterminate() { /* Workaround Bun's WebSocket#terminate bug */\n\t\t\t\t\t\n\t\t\t\t\ttry {\n\t\t\t\t\t\tterminate.call(wssc);\n\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\tconsole.error(error);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t\t\n\t\tObject.assign(wssc, {\n\t\t\twss: this,\n\t\t\tuserAgent: request.headers[\"user-agent\"] ?? \"\",\n\t\t\tremoteAddress: request.headers[\"x-real-ip\"] ?? request.headers[\"x-forwarded-for\"] ?? \"\"\n\t\t});\n\t\t\n\t\twssc[defibSymbol]();\n\t\t\n\t\twssc.on(\"message\", data => this.handleClientMessage(wssc, data));\n\t\twssc.on(\"error\", error => this.handleClientError(wssc, error));\n\t\twssc.on(\"close\", (...args) => this.handleClientClose(wssc, ...args));\n\t\t\n\t\tthis.emit(\"client-connect\", wssc, request);\n\t\t\n\t}\n\t\n\t\n\tprivate handleClientMessage(wssc: WSSC, data: RawData) {\n\t\tconst message = data.toString();\n\t\t\n\t\twssc[defibSymbol]();\n\t\t\n\t\tif (message)\n\t\t\ttry {\n\t\t\t\tconst [ kind, ...rest ] = JSON.parse(message);\n\t\t\t\t\n\t\t\t\twssc.emit(`message:${kind}`, ...rest);\n\t\t\t\tthis.emit(\"client-message\", wssc, kind, ...rest);\n\t\t\t\tthis.emit(`client-message:${kind}`, wssc, ...rest);\n\t\t\t} catch (error) {\n\t\t\t\tthis.handleClientError(wssc, error as Error);\n\t\t\t}\n\t\telse if (wssc[pingTsSymbol]) {\n\t\t\twssc.latency = Date.now() - wssc[pingTsSymbol];\n\t\t\tdelete wssc[pingTsSymbol];\n\t\t}\n\t\t\n\t}\n\t\n\tprivate handleClientError(wssc: WSSC, error: Error | Event | undefined) {\n\t\tif (error instanceof Event)\n\t\t\terror = undefined;\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.error(\"WebSocketServer Client error\", error);\n\t\t\n\t\tthis.emit(\"client-error\", wssc, error);\n\t\t\n\t}\n\t\n\tprivate handleClientClose(wssc: WSSC, ...args: unknown[]) {\n\t\t\n\t\tif (process.env.NODE_ENV === \"development\")\n\t\t\tconsole.info(\"WebSocketServer Client closed\", ...args);\n\t\t\n\t\twssc[defibSymbol].clear();\n\t\tclearInterval(wssc[heartbeatIntervalSymbol]);\n\t\t\n\t\tthis.emit(\"client-close\", wssc);\n\t\tthis.emit(\"client-closed\", wssc);\n\t\t\n\t}\n\t\n}\n", "export const heartbeatInterval = 5_000;\nexport const heartbeatGap = 60_000;\n\nexport const requestHeaders = {\n\trequest: \"~r-q\",\n\tresponse: \"~r-s\"\n};\n", "export const heartbeatIntervalSymbol = Symbol(\"heartbeatInterval\");\nexport const defibSymbol = Symbol(\"defib\");\nexport const pingTsSymbol = Symbol(\"pingTs\");\n", "import { ClientRequest, IncomingMessage } from \"node:http\";\nimport { RawData, WebSocket } from \"ws\";\nimport { debounce, uid } from \"@nesvet/n\";\nimport { heartbeatGap, heartbeatInterval, requestHeaders } from \"../common\";\nimport { defibSymbol, heartbeatIntervalSymbol, pingTsSymbol } from \"./symbols\";\nimport { InSiteWebSocketServer } from \"./WebSocketServer\";\n\n\ndeclare abstract class PrepareWebSocket<WSSC extends InSiteWebSocketServerClient = InSiteWebSocketServerClient> extends WebSocket {\n\ton(event: \"close\", listener: (this: WSSC, code: number, reason: Buffer) => void): this;\n\ton(event: \"error\", listener: (this: WSSC, error: Error) => void): this;\n\ton(event: \"upgrade\", listener: (this: WSSC, request: IncomingMessage) => void): this;\n\ton(event: \"message\", listener: (this: WSSC, data: RawData, isBinary: boolean) => void): this;\n\ton(event: \"open\", listener: (this: WSSC) => void): this;\n\ton(event: \"ping\" | \"pong\", listener: (this: WSSC, data: Buffer) => void): this;\n\ton(\n\t\tevent: \"unexpected-response\",\n\t\tlistener: (this: WSSC, request: ClientRequest, response: IncomingMessage) => void,\n\t): this;\n\ton(event: string | symbol, listener: (this: WSSC, ...args: unknown[]) => void): this;\n}\n\n\nexport class InSiteWebSocketServerClient<WSSC extends InSiteWebSocketServerClient = any> extends PrepareWebSocket<WSSC> {// eslint-disable-line @typescript-eslint/no-explicit-any\n\t\n\tget isConnecting() {\n\t\treturn this.readyState === this.CONNECTING;\n\t}\n\t\n\tget isOpen() {\n\t\treturn this.readyState === this.OPEN;\n\t}\n\t\n\tget isClosing() {\n\t\treturn this.readyState === this.CLOSING;\n\t}\n\t\n\tget isClosed() {\n\t\treturn this.readyState === this.CLOSED;\n\t}\n\t\n\treadonly isWebSocketServerClient = true;\n\treadonly isWebSocketServer = false;\n\treadonly isWebSocket = false;\n\t\n\twss!: InSiteWebSocketServer<WSSC>;\n\t\n\tuserAgent = \"\";\n\t\n\tremoteAddress = \"\";\n\t\n\t[defibSymbol] = InSiteWebSocketServerClient.makeDefib.call(this);\n\t\n\tlatency = 0;\n\t\n\t[pingTsSymbol]?: number;\n\t\n\t[heartbeatIntervalSymbol] = InSiteWebSocketServerClient.makeHeartbeatInterval.call(this);\n\t\n\tsendMessage(...args: unknown[]) {\n\t\treturn this.send(JSON.stringify(args));\n\t}\n\t\n\tsendRequest(...args: unknown[]) {\n\t\t\n\t\tconst id = uid();\n\t\tconst eventName = `message:${requestHeaders.response}-${id}`;\n\t\t\n\t\tif (typeof args.at(-1) == \"function\") {\n\t\t\tthis.once(eventName, args.splice(-1, 1)[0] as () => void);\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t\treturn this;\n\t\t}\n\t\t\n\t\treturn new Promise((resolve, reject) => {\n\t\t\t\n\t\t\tthis.once(eventName, (error, result) => {\n\t\t\t\tif (error) {\n\t\t\t\t\tconst { message, ...restProps } = error;\n\t\t\t\t\treject(Object.assign(new Error(message), restProps));\n\t\t\t\t} else\n\t\t\t\t\tresolve(result);\n\t\t\t\t\n\t\t\t});\n\t\t\tthis.sendMessage(requestHeaders.request, id, ...args);\n\t\t\t\n\t\t});\n\t}\n\t\n\t\n\tstatic makeDefib(this: InSiteWebSocketServerClient<any>) { // eslint-disable-line @typescript-eslint/no-explicit-any\n\t\treturn debounce(() => this.terminate(), heartbeatInterval + heartbeatGap);\n\t}\n\t\n\tstatic makeHeartbeatInterval(this: InSiteWebSocketServerClient<any>) { // eslint-disable-line @typescript-eslint/no-explicit-any\n\t\treturn setInterval(() => {\n\t\t\t\n\t\t\tthis[pingTsSymbol] = Date.now();\n\t\t\tthis.send(\"\");\n\t\t\t\n\t\t}, heartbeatInterval);\n\t}\n\t\n}\n", "import { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport type { AbilitiesSchema, Session, User } from \"insite-users-server\";\n\n\nexport class WSSCWithUser<AS extends AbilitiesSchema> extends InSiteWebSocketServerClient {\n\tdeclare wss: InSiteWebSocketServer<WSSCWithUser<AS>>;\n\tuser?: User<AS>;\n\tlastUserId?: string;\n\tsession?: Session<AS>;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["_ids", "Err", "includesAll", "isEmpty", "removeAll", "union", "without", "Binary", "Users", "CollectionMapPublication", "Publication", "_ids", "includesAny", "intersection", "pick", "AbilitiesPublication", "abilitiesMap", "wssc", "RolesPublication", "roles", "options", "projection", "sort", "transform", "roleDoc", "involves", "abilities", "inheritedAbilities", "displayTitle", "_o", "userSubscriptionChangeListenerMap", "UserPublication", "users", "fieldsToUpdate", "key", "subscription", "user", "_id", "changeListener", "next", "session", "isSessionIdRequired", "userDoc", "UsersPublication", "UsersExtendedPublication", "triggers", "SessionsPublication", "sessions", "userId", "OrgsPublication", "orgs", "orgDoc", "org", "OrgsExtendedPublication", "ownerIds", "slaveOrgs", "regexps", "avatarTypesAccepted", "maxAvatarSize", "UsersServer", "_UsersServer", "options", "wss", "collections", "usersOptions", "publicationOptions", "extendedPublicationOptions", "userPublicationOptions", "rolesOptions", "orgsOptions", "getSessionProps", "incomingTransport", "rolesPublicationOptions", "orgsPublicationOptions", "orgsExtendedPublicationOptions", "Users", "user", "AbilitiesPublication", "RolesPublication", "UsersPublication", "UsersExtendedPublication", "UserPublication", "OrgsPublication", "OrgsExtendedPublication", "SessionsPublication", "wssc", "email", "regexps", "Err", "roles", "org", "rest", "includesAll", "_id", "newPassword", "updates", "without", "isEmpty", "sessionId", "getAvatarTransferProps", "check", "transfer", "data", "type", "binaryData", "Binary", "ts", "deleteAvatar", "union", "_ids", "role", "abilities", "removeAll", "involvedRoleId", "abilityId", "paramId", "value", "shouldUpdate", "param", "anotherParam", "userAbilityWithParams", "abilityWithParams", "resolve", "schema", "subSchema", "userAgent", "remoteAddress", "session", "shouldProlong", "password", "next", "isOnline", "usersSubscription", "webSockets", "
|
|
3
|
+
"sources": ["../src/UsersServer.ts", "../src/publications.ts", "../src/regexps.ts", "../src/WSSCWithUser.ts"],
|
|
4
|
+
"sourcesContent": ["import type { InSiteWebSocketServer } from \"insite-ws/server\";\nimport type { IncomingTransfer, IncomingTransport } from \"insite-ws-transfers/node\";\nimport {\n\t_ids,\n\tErr,\n\tincludesAll,\n\tisEmpty,\n\tremoveAll,\n\tStringKey,\n\tunion,\n\twithout\n} from \"@nesvet/n\";\nimport { Binary, type ChangeStreamDocument, InSiteCollections } from \"insite-db\";\nimport {\n\ttype Abilities,\n\ttype AbilitiesSchema,\n\ttype AbilityParamItems,\n\ttype AbilityParamNumber,\n\ttype AbilityWithParams,\n\ttype GenericAbilities,\n\ttype Org,\n\ttype OrgDoc,\n\ttype Role,\n\ttype RoleDoc,\n\ttype Session,\n\ttype SessionDoc,\n\ttype User,\n\ttype UserDoc,\n\tUsers,\n\ttype Options as UsersOptions\n} from \"insite-users-server\";\nimport {\n\tAbilitiesPublication,\n\tOrgsExtendedPublication,\n\ttype OrgsExtendedPublicationOptions,\n\tOrgsPublication,\n\ttype OrgsPublicationOptions,\n\tRolesPublication,\n\ttype RolesPublicationOptions,\n\tSessionsPublication,\n\tUserPublication,\n\ttype UserPublicationOptions,\n\tUsersExtendedPublication,\n\ttype UsersExtendedPublicationOptions,\n\tUsersPublication,\n\ttype UsersPublicationOptions\n} from \"./publications\";\nimport { regexps } from \"./regexps\";\nimport { WSSCWithUser } from \"./WSSCWithUser\";\n\nconst avatarTypesAccepted = [ \"image/webp\" ];\nconst maxAvatarSize = 1024 * 512;\n\nexport type Options<AS extends AbilitiesSchema> = {\n\twss: InSiteWebSocketServer<WSSCWithUser<AS>>;\n\tcollections: InSiteCollections;\n\tusers: UsersOptions<AS>;\n\tpublication?: UsersPublicationOptions;\n\textendedPublication?: UsersExtendedPublicationOptions;\n\tuserPublication?: UserPublicationOptions;\n\troles?: {\n\t\tpublication?: RolesPublicationOptions;\n\t};\n\torgs?: {\n\t\tpublication?: OrgsPublicationOptions;\n\t\textendedPublication?: OrgsExtendedPublicationOptions;\n\t};\n\tgetSessionProps?: (wssc: WSSCWithUser<AS>) => Partial<SessionDoc>;\n\tincomingTransport?: IncomingTransport;\n};\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\tprivate userWsMap = new WeakMap<User<AS>, Set<WSSCWithUser<AS>>>();\n\tprivate sessionsWsMap = new WeakMap<Session<AS>, WSSCWithUser<AS>>();\n\t\n\twss!: Options<AS>[\"wss\"];\n\tusers!: Users<AS>;\n\tgetSessionProps!: Options<AS>[\"getSessionProps\"];\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: usersOptions,\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\tgetSessionProps,\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 = await Users.init(collections, usersOptions);\n\t\tthis.getSessionProps = getSessionProps;\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.abilitiesMap);\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\t\n\t\t/*\n\t\t * Handlers\n\t\t */\n\t\t\n\t\t/* Users */\n\t\t\n\t\tthis.wss.onRequest(\"users.people.check-email\", (wssc, email: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\")) {\n\t\t\t\tif (!regexps.email.test(email))\n\t\t\t\t\tthrow new Err(\"Not email\", \"notemail\");\n\t\t\t\t\n\t\t\t\tif (this.users.byEmail.has(email))\n\t\t\t\t\tthrow new Err(\"Email already exists\", \"exists\");\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.people.add\", async (wssc, { roles, org, ...rest }: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\")) {\n\t\t\t\tif (!roles.length)\n\t\t\t\t\tthrow new Err(\"Roles shouldn't be empty\", \"emptyroles\");\n\t\t\t\t\n\t\t\t\tif (!includesAll(wssc.user.slaveRoleIds, roles))\n\t\t\t\t\tthrow new Err(\"Can't assign role the user is not involved in\", \"forbiddenrole\");\n\t\t\t\t\n\t\t\t\tif (org && !wssc.user.slaveIds.includes(org))\n\t\t\t\t\tthrow new Err(\"Can't assign org the user is not master of\", \"forbiddenorg\");\n\t\t\t\t\n\t\t\t\tawait this.users.new({ roles, org, ...rest });\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.people.change-password\", async (wssc, _id: string, newPassword: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.permissiveIds.includes(_id)) {\n\t\t\t\tif (typeof newPassword != \"string\")\n\t\t\t\t\tthrow new Err(\"Type of password is incorrect\", \"wrongpasswordtype\");\n\t\t\t\t\n\t\t\t\tif (!newPassword)\n\t\t\t\t\tthrow new Err(\"Password can't be empty\", \"emptypassword\");\n\t\t\t\t\n\t\t\t\tawait this.users.changePassword(_id, newPassword);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.people.update\", async (wssc, _id: string, updates: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.permissiveIds.includes(_id)) {\n\t\t\t\tif (updates.roles) {\n\t\t\t\t\tif (!updates.roles.length)\n\t\t\t\t\t\tthrow new Err(\"Roles can't be empty\", \"emptyroles\");\n\t\t\t\t\t\n\t\t\t\t\tif (!includesAll(wssc.user.slaveRoleIds, updates.roles))\n\t\t\t\t\t\tthrow new Err(\"Can't assign role the user is not involved in\", \"forbiddenrole\");\n\t\t\t\t\t\n\t\t\t\t\tconst user = this.users.get(_id);\n\t\t\t\t\t\n\t\t\t\t\tif (user)\n\t\t\t\t\t\tupdates.roles =\n\t\t\t\t\t\t\tuser.isRoot ?\n\t\t\t\t\t\t\t\t[ \"root\" ] :\n\t\t\t\t\t\t\t\tthis.users.roles.cleanUpIds(\n\t\t\t\t\t\t\t\t\twithout(user.ownRoleIds, wssc.user.slaveRoleIds).concat(updates.roles)\n\t\t\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (updates.org && !wssc.user.slaveIds.includes(updates.org))\n\t\t\t\t\tthrow new Err(\"Can't assign org the user is not master of\", \"forbiddenorg\");\n\t\t\t\t\n\t\t\t\tif (!isEmpty(updates))\n\t\t\t\t\tawait this.users.collection.updateOne({ _id }, { $set: updates });\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.people.delete\", async (wssc, _id: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveIds.includes(_id))\n\t\t\t\tawait this.users.collection.deleteOne({ _id });\n\t\t\t\n\t\t});\n\t\t\n\t\t\n\t\t/* Sessions */\n\t\t\n\t\tthis.wss.onRequest(\"users.people.destroy-session\", async (wssc, sessionId: string) => {\n\t\t\tif (\n\t\t\t\twssc.user?.abilities.inSite?.sections?.includes(\"users\") &&\n\t\t\t\twssc.user.permissiveIds.includes(this.users.bySessionId.get(sessionId)?._id)\n\t\t\t)\n\t\t\t\tawait this.users.sessions.collection.deleteOne({ _id: sessionId });\n\t\t\t\n\t\t});\n\t\t\n\t\t\n\t\t/* Avatars */\n\t\t\n\t\tif (this.incomingTransport) {\n\t\t\tconst getAvatarTransferProps = (check?: (wssc: WSSCWithUser<AS>, transfer: IncomingTransfer) => boolean | Promise<boolean | undefined> | undefined) => ({\n\t\t\t\t\n\t\t\t\tbegin: async (wssc: WSSCWithUser<AS>, transfer: IncomingTransfer) => (\n\t\t\t\t\t(!check || await check(wssc, transfer)) &&\n\t\t\t\t\tavatarTypesAccepted.includes(transfer.metadata.type as string) &&\n\t\t\t\t\ttransfer.size <= maxAvatarSize\n\t\t\t\t),\n\t\t\t\t\n\t\t\t\tend: async (wssc: WSSCWithUser<AS>, { data, metadata: { type, _id } }: IncomingTransfer) => {\n\t\t\t\t\tconst binaryData = Binary.createFromBase64((data as string).slice((data as string).indexOf(\",\")));\n\t\t\t\t\t\n\t\t\t\t\tconst ts = Date.now().toString(36);\n\t\t\t\t\t\n\t\t\t\t\tawait Promise.all([\n\t\t\t\t\t\tthis.users.avatars.collection.replaceOne({ _id: _id as string }, {\n\t\t\t\t\t\t\ttype: type as string,\n\t\t\t\t\t\t\tsize: binaryData.length(),\n\t\t\t\t\t\t\tts,\n\t\t\t\t\t\t\tdata: binaryData\n\t\t\t\t\t\t}, { upsert: true }),\n\t\t\t\t\t\tthis.users.collection.updateOne({ _id: _id as string }, { $set: { avatar: ts } })\n\t\t\t\t\t]);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\t\n\t\t\tthis.incomingTransport.on(\"users.people.avatar\", getAvatarTransferProps(\n\t\t\t\t(wssc: WSSCWithUser<AS>, { metadata: { _id } }: IncomingTransfer) =>\n\t\t\t\t\twssc.user?.abilities.inSite?.sections?.includes(\"users\") &&\n\t\t\t\t\twssc.user.permissiveIds.includes(_id as string)\n\t\t\t));\n\t\t\t\n\t\t\tthis.incomingTransport.on(\"user.avatar\", getAvatarTransferProps(\n\t\t\t\t(wssc: WSSCWithUser<AS>, transfer: IncomingTransfer) =>\n\t\t\t\t\twssc.user &&\n\t\t\t\t\twssc.user._id === transfer.metadata._id\n\t\t\t));\n\t\t}\n\t\t\n\t\tconst deleteAvatar = async (_id: string) => {\n\t\t\t\n\t\t\tawait Promise.all([\n\t\t\t\tthis.users.avatars.collection.deleteOne({ _id }),\n\t\t\t\tthis.users.collection.updateOne({ _id }, { $set: { avatar: null } })\n\t\t\t]);\n\t\t\t\n\t\t};\n\t\t\n\t\tthis.wss.onRequest(\"users.people.delete-avatar\", async (wssc, _id: string) =>\n\t\t\twssc.user?.abilities.inSite?.sections?.includes(\"users\") &&\n\t\t\twssc.user.permissiveIds.includes(_id) &&\n\t\t\tawait deleteAvatar(_id)\n\t\t);\n\t\t\n\t\tthis.wss.onRequest(\"user.delete-avatar\", async (wssc, _id: string) =>\n\t\t\twssc.user &&\n\t\t\twssc.user._id === _id &&\n\t\t\tawait deleteAvatar(_id)\n\t\t);\n\t\t\n\t\t\n\t\t/* Orgs */\n\t\t\n\t\tthis.wss.onRequest(\"users.orgs.add\", async (wssc, org: Omit<OrgDoc, \"_id\" | \"createdAt\" | \"owners\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\")) {\n\t\t\t\tif (!org.title)\n\t\t\t\t\tthrow new Err(\"Title can't be empty\", \"emptytitle\");\n\t\t\t\t\n\t\t\t\tawait this.users.orgs.new(org, wssc.user._id);\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.orgs.update\", async (wssc, _id, updates: Omit<OrgDoc, \"_id\" | \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveIds.includes(_id)) {\n\t\t\t\tif (updates.title !== undefined && !updates.title)\n\t\t\t\t\tthrow new Err(\"Title can't be empty\", \"emptytitle\");\n\t\t\t\t\n\t\t\t\tif (updates.owners) {\n\t\t\t\t\tif (!includesAll(wssc.user.slaveIds, updates.owners))\n\t\t\t\t\t\tthrow new Err(\"Can't assign owners the user is not master of\", \"forbiddenowners\");\n\t\t\t\t\t\n\t\t\t\t\tconst org = this.users.orgs.get(_id);\n\t\t\t\t\t\n\t\t\t\t\tif (org)\n\t\t\t\t\t\tupdates.owners =\n\t\t\t\t\t\t\tthis.users.sortIds(\n\t\t\t\t\t\t\t\tunion(\n\t\t\t\t\t\t\t\t\twithout(org.ownerIds, wssc.user.slaveIds),\n\t\t\t\t\t\t\t\t\twithout(updates.owners, [ org._id, ..._ids(org.slaveOrgs) ])\n\t\t\t\t\t\t\t\t)\n\t\t\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!isEmpty(updates))\n\t\t\t\t\tawait this.users.orgs.collection.updateOne({ _id }, { $set: updates });\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.orgs.delete\", async (wssc, _id: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveIds.includes(_id))\n\t\t\t\tawait this.users.orgs.collectionDelete(_id);\n\t\t\t\n\t\t});\n\t\t\n\t\t\n\t\t/* Roles */\n\t\t\n\t\tthis.wss.onRequest(\"users.roles.check-id\", (wssc, _id: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\")) {\n\t\t\t\tif (!regexps.role.test(_id))\n\t\t\t\t\tthrow new Err(\"Role ID is incorrect\", \"notroleid\");\n\t\t\t\t\n\t\t\t\tif (this.users.roles.has(_id))\n\t\t\t\t\tthrow new Err(\"Role ID already exists\", \"exists\");\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.roles.add\", async (wssc, role: Omit<RoleDoc, \"abilities\" | \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\"))\n\t\t\t\tawait this.users.roles.new(role);\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.roles.update\", async (wssc, _id: string, { abilities, ...updates }: Omit<RoleDoc, \"createdAt\">) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveRoleIds.includes(_id)) {\n\t\t\t\tif (updates.involves)\n\t\t\t\t\tif (includesAll(wssc.user.slaveRoleIds, updates.involves)) {\n\t\t\t\t\t\tremoveAll(updates.involves, [ _id ]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tconst role = this.users.roles.get(_id);\n\t\t\t\t\t\tif (role)\n\t\t\t\t\t\t\tfor (const involvedRoleId of updates.involves)\n\t\t\t\t\t\t\t\tif (this.users.roles.get(involvedRoleId)?.involves.has(role))\n\t\t\t\t\t\t\t\t\tremoveAll(updates.involves, [ involvedRoleId ]);\n\t\t\t\t\t\t\n\t\t\t\t\t\tupdates.involves = this.users.roles.cleanUpIds(updates.involves);\n\t\t\t\t\t} else\n\t\t\t\t\t\tthrow new Err(\"Can't assign role the user is not involved in\", \"forbiddenrole\");\n\t\t\t\t\n\t\t\t\tawait this.users.roles.collection.updateOne({ _id }, { $set: updates });\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.onRequest(\"users.roles.set-ability\", async (wssc, _id: string, abilityId: StringKey<Abilities<AS>>, paramId: string, value: unknown) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveRoleIds.includes(_id) && wssc.user.abilities[abilityId]) {\n\t\t\t\tconst role = this.users.roles.get(_id);\n\t\t\t\tif (role) {\n\t\t\t\t\tconst abilities = structuredClone(role.ownAbilities) as GenericAbilities;\n\t\t\t\t\tlet shouldUpdate;\n\t\t\t\t\t\n\t\t\t\t\tif (paramId) {\n\t\t\t\t\t\tif (!abilities[abilityId])\n\t\t\t\t\t\t\tabilities[abilityId] = {};\n\t\t\t\t\t\tconst param = this.users.abilitiesMap.get(abilityId)?.params?.find(anotherParam => anotherParam._id === paramId);\n\t\t\t\t\t\tif (param) {\n\t\t\t\t\t\t\tconst userAbilityWithParams = wssc.user.abilities[abilityId] as AbilityWithParams;\n\t\t\t\t\t\t\tconst abilityWithParams = abilities[abilityId] as AbilityWithParams;\n\t\t\t\t\t\t\tif (param.type === \"number\") {\n\t\t\t\t\t\t\t\tif ((userAbilityWithParams[paramId] as AbilityParamNumber) >= (value as number)) {\n\t\t\t\t\t\t\t\t\tabilityWithParams[paramId] = value as number;\n\t\t\t\t\t\t\t\t\tshouldUpdate = true;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else if (param.type === \"items\" && userAbilityWithParams[paramId] && includesAll(userAbilityWithParams[paramId] as AbilityParamItems, value as string[])) {\n\t\t\t\t\t\t\t\tabilityWithParams[paramId] = value as string[];\n\t\t\t\t\t\t\t\tshouldUpdate = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (value)\n\t\t\t\t\t\t\tabilities[abilityId] = this.users.abilitiesMap.getMinimumOf(abilityId);\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t(function resolve(schema) {\n\t\t\t\t\t\t\t\tif (schema) {\n\t\t\t\t\t\t\t\t\tdelete abilities[schema._id];\n\t\t\t\t\t\t\t\t\tif (schema.subAbilities)\n\t\t\t\t\t\t\t\t\t\tfor (const subSchema of schema.subAbilities)\n\t\t\t\t\t\t\t\t\t\t\tif (abilities[subSchema._id])\n\t\t\t\t\t\t\t\t\t\t\t\tresolve(subSchema);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t})(this.users.abilitiesMap.get(abilityId));\n\t\t\t\t\t\t\n\t\t\t\t\t\tshouldUpdate = true;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (shouldUpdate)\n\t\t\t\t\t\tawait this.users.roles.collection.updateOne({ _id }, { $set: { abilities } });\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t\tthis.wss.on(\"client-message:users.roles.delete\", async (wssc: WSSCWithUser<AS>, _id: string) => {\n\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.user.slaveRoleIds.includes(_id))\n\t\t\t\tawait this.users.roles.collectionDelete(_id);\n\t\t\t\n\t\t});\n\t\t\n\t\treturn this;\n\t};\n\t\n\tprivate initPromise;\n\t\n\twhenReady() {\n\t\treturn this.initPromise;\n\t}\n\t\n\tgetDefaultSessionProps({ userAgent, remoteAddress }: WSSCWithUser<AS>) {\n\t\treturn {\n\t\t\tuserAgent,\n\t\t\tremoteAddress\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) {\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\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({\n\t\t\t\t\t\t...this.getDefaultSessionProps(wssc),\n\t\t\t\t\t\t...this.getSessionProps?.(wssc),\n\t\t\t\t\t\tisOnline: true\n\t\t\t\t\t});\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tdelete wssc.session;\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\tprivate login = async (wssc: WSSCWithUser<AS>, email: string, password: string) => {\n\t\tconst session = await this.users.login(email, password, {\n\t\t\t...this.getDefaultSessionProps(wssc),\n\t\t\t...this.getSessionProps?.(wssc),\n\t\t\tisOnline: true\n\t\t});\n\t\t\n\t\tif (session)\n\t\t\tthis.setSession(wssc, session);\n\t\t\n\t};\n\t\n\tprivate 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\tprivate handleRolesUpdate = () =>\n\t\tthis.rolesPublication.flushInitial();\n\t\n\tprivate handleRolesRoleUpdate = (role: Role<AS>, next: ChangeStreamDocument<RoleDoc>) =>\n\t\tnext && this.rolesPublication.skip(next);\n\t\n\tprivate handleUserCreate = (user: User<AS>) =>\n\t\tthis.userWsMap.set(user, new Set<WSSCWithUser<AS>>());\n\t\n\tprivate 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\tprivate 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\tprivate handleOrgsUpdate = () => {\n\t\t\n\t\tthis.orgsPublication.flushInitial();\n\t\tthis.orgsExtendedPublication.flushInitial();\n\t\t\n\t};\n\t\n\tprivate 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\tprivate 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\tprivate handleClientRequestLogin = (wssc: WSSCWithUser<AS>, email: string, password: string) =>\n\t\tthis.login(wssc, email, password);\n\t\n\tprivate handleClientRequestLogout = (wssc: WSSCWithUser<AS>) =>\n\t\tthis.logout(wssc);\n\t\n\tprivate 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", "import {\n\tCollectionMapPublication,\n\tProjection,\n\tPublication,\n\tSubscriptionHandle\n} from \"insite-subscriptions-server/ws\";\nimport {\n\t_ids,\n\tincludesAny,\n\tintersection,\n\tpick\n} from \"@nesvet/n\";\nimport { ChangeStreamDocument, Sort } from \"insite-db\";\nimport type {\n\tAbilitiesMap,\n\tAbilitiesSchema,\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(abilitiesMap: AbilitiesMap<AS>) {\n\t\tsuper(\"abilities\", {\n\t\t\t\n\t\t\tfetch(wssc) {\n\t\t\t\tif (wssc.user?.abilities.inSite?.sections?.includes(\"users\"))\n\t\t\t\t\treturn { abilities: abilitiesMap.getSchemeFor(wssc.user) };\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\", wssc => wssc.user?.abilities.inSite?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: wssc.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.changeListeners.add(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.changeListeners.delete(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\", wssc => wssc.user?.abilities.inSite?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: wssc.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\", (wssc, userId) =>\n\t\t\twssc.user?.abilities.inSite?.sections?.includes(\"users\") && wssc.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, 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\", wssc => wssc.user?.abilities.inSite?.sections?.includes(\"users\") && {\n\t\t\tquery: { _id: { $in: wssc.user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (orgDoc, [ wssc ]) => {\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, wssc.user!.slaveIds),\n\t\t\t\tslaveOrgs: _ids(intersection(slaveOrgs, wssc.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", "export const regexps = {\n\temail: /^[^\\s@]{1,63}@[^\\s@]{1,63}\\.[^\\s@]{1,63}$/,\n\trole: /^[\\d_a-z-]{1,64}$/\n};\n", "import { InSiteWebSocketServer, InSiteWebSocketServerClient } from \"insite-ws/server\";\nimport type { AbilitiesSchema, Session, User } from \"insite-users-server\";\n\n\nexport class WSSCWithUser<AS extends AbilitiesSchema> extends InSiteWebSocketServerClient {\n\tdeclare wss: InSiteWebSocketServer<WSSCWithUser<AS>>;\n\tuser?: User<AS>;\n\tlastUserId?: string;\n\tsession?: Session<AS>;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["_ids", "Err", "includesAll", "isEmpty", "removeAll", "union", "without", "Binary", "Users", "CollectionMapPublication", "Publication", "_ids", "includesAny", "intersection", "pick", "AbilitiesPublication", "abilitiesMap", "wssc", "RolesPublication", "roles", "options", "projection", "sort", "transform", "roleDoc", "involves", "abilities", "inheritedAbilities", "displayTitle", "_o", "userSubscriptionChangeListenerMap", "UserPublication", "users", "fieldsToUpdate", "key", "subscription", "user", "_id", "changeListener", "next", "session", "isSessionIdRequired", "userDoc", "UsersPublication", "UsersExtendedPublication", "triggers", "SessionsPublication", "sessions", "userId", "OrgsPublication", "orgs", "orgDoc", "org", "OrgsExtendedPublication", "ownerIds", "slaveOrgs", "regexps", "avatarTypesAccepted", "maxAvatarSize", "UsersServer", "_UsersServer", "options", "wss", "collections", "usersOptions", "publicationOptions", "extendedPublicationOptions", "userPublicationOptions", "rolesOptions", "orgsOptions", "getSessionProps", "incomingTransport", "rolesPublicationOptions", "orgsPublicationOptions", "orgsExtendedPublicationOptions", "Users", "user", "AbilitiesPublication", "RolesPublication", "UsersPublication", "UsersExtendedPublication", "UserPublication", "OrgsPublication", "OrgsExtendedPublication", "SessionsPublication", "wssc", "email", "regexps", "Err", "roles", "org", "rest", "includesAll", "_id", "newPassword", "updates", "without", "isEmpty", "sessionId", "getAvatarTransferProps", "check", "transfer", "data", "type", "binaryData", "Binary", "ts", "deleteAvatar", "union", "_ids", "role", "abilities", "removeAll", "involvedRoleId", "abilityId", "paramId", "value", "shouldUpdate", "param", "anotherParam", "userAbilityWithParams", "abilityWithParams", "resolve", "schema", "subSchema", "userAgent", "remoteAddress", "session", "shouldProlong", "password", "next", "isOnline", "usersSubscription", "webSockets", "InSiteWebSocketServerClient", "WSSCWithUser"]
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "insite-users-server-ws",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.7",
|
|
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.1.
|
|
8
|
+
"packageManager": "bun@1.1.24",
|
|
9
9
|
"scripts": {
|
|
10
10
|
"test": "echo \"Error: no test specified\" && exit 1",
|
|
11
11
|
"build": "bun .conveyer.js",
|
|
@@ -25,17 +25,17 @@
|
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"dependencies": {
|
|
27
27
|
"@nesvet/n": "^1.1.3",
|
|
28
|
-
"insite-db": "^2
|
|
29
|
-
"insite-users-server": "^2
|
|
30
|
-
"insite-subscriptions-server": "^2
|
|
28
|
+
"insite-db": "^2",
|
|
29
|
+
"insite-users-server": "^2",
|
|
30
|
+
"insite-subscriptions-server": "^2"
|
|
31
31
|
},
|
|
32
32
|
"devDependencies": {
|
|
33
|
-
"@nesvet/conveyer": "^2.2.
|
|
33
|
+
"@nesvet/conveyer": "^2.2.4",
|
|
34
34
|
"@nesvet/eslint-config": "^2.0.24",
|
|
35
|
-
"@types/node": "^22.
|
|
35
|
+
"@types/node": "^22.3.0",
|
|
36
36
|
"@types/ws": "^8.5.12",
|
|
37
|
-
"insite-ws": "^2
|
|
38
|
-
"insite-ws-transfers": "^2
|
|
37
|
+
"insite-ws": "^2",
|
|
38
|
+
"insite-ws-transfers": "^2",
|
|
39
39
|
"typescript": "^5.5.4"
|
|
40
40
|
}
|
|
41
41
|
}
|
package/bun.lockb
DELETED
|
Binary file
|