insite-users-server-ws 2.1.2 → 2.1.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Users as H}from"insite-users-server";function C(o){if(o instanceof Set){let e=[];for(let i of o)e.push(i._id);return e}return o.map(e=>e._id)}function w(){}function J(o,e=0,i={}){let{leading:l=!1,trailing:a=!0}=i,{maxWait:u=1/0}=i,n,t,s,r,c,d,m,y,O=async()=>{let b=Date.now();b>=s?(n=void 0,s=void 0,clearTimeout(t),typeof m=="function"&&await m(),S.resolve(y),S.promise.isResolved=!0,d=l):(clearTimeout(n),n=setTimeout(O,s-b))},k=Number.isFinite(u)?()=>{m===g&&(m=!1),g(),t=setTimeout(k,u)}:null;async function g(){return y=await o.apply(r,c)}l&&typeof l=="boolean"&&(l=g),d=l,a&&typeof a=="boolean"&&(a=g),m=a;let S=Object.assign(function(...b){return c=b,r=this,s=Date.now()+e,m=a,S.promise.isResolved&&(S.promise=Object.assign(new Promise(z=>{S.resolve=z,typeof d=="function"&&(d(),d=!1,m===g&&(m=!1)),n||(n=setTimeout(O,e),k&&(t=setTimeout(k,u)))}),{isResolved:!1})),S.promise},{callback:o,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:w,run:g,clear:async b=>{clearTimeout(n),n=void 0,clearTimeout(t),S.promise.isResolved=!0,S.resolve(b?await g():y)}});return S}J.noop=Object.assign(()=>{},{callback:w,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:w,run:w,clear:w});function P(o){for(let e in o)return!1;return!0}var p=class extends Error{constructor(e,i=null,l){super(e),i&&typeof i=="object"&&(l=i,i=null),this.tag=i,l&&Object.assign(this,l)}name="Err-or";tag};function q(o,e,i,l,a=!0){return Array.isArray(o)&&(o=o.length),typeof l!="string"&&(a=l??!0,l=i),(a?`${o}\xA0`:"")+q.raw(o,e,i,l)}q.raw=(o,e,i,l=i)=>{o=Math.abs(o);let a=o%10,u=o%100;return a===1&&u!==11?e:a>=2&&a<=4&&!(u>=12&&u<=15)?i:l};function v(o,e){return(e instanceof Set?[...e]:e).every(o instanceof Set?i=>o.has(i):i=>o.includes(i))}function B(o,e){return(e instanceof Set?[...e]:e).some(o instanceof Set?i=>o.has(i):i=>o.includes(i))}function R(...o){let e=[];if(o.length){let[i,...l]=o;e:for(let a of i){for(let u of l)if(u instanceof Set?!u.has(a):!u.includes(a))continue e;e.push(a)}}return e}function j(o,e){let i={};for(let l of e)l in o&&(i[l]=o[l]);return i}import{AbilityError as f,RolesError as x,SubordinationError as h}from"insite-users-server";var M={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function F({wss:o,users:e}){let{roles:i,sessions:l,avatars:a,orgs:u,abilities:n}=e;o.onRequest("users.people.check-email",({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!M.email.test(s))throw new p("Not email","email.not");if(e.byEmail.has(s))throw new p("Email already exists","email.exists")}),o.onRequest("users.people.create",async({user:t},{roles:s,org:r,...c})=>{if(!t?.abilities.inSite?.users)throw new f;if(!s.length||!v(t.slaveRoleIds,s))throw new x(s);if(r&&!t.slaveIds.includes(r))throw new h("slaveIds",r);await e.create({roles:s,org:r,...c})}),o.onRequest("users.people.change-password",async({user:t},s,r)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);if(typeof r!="string")throw new p("Type of password is incorrect","password.wrong-type");if(!r)throw new p("Password can't be empty","password.empty");await e.changePassword(s,r)}),o.onRequest("users.people.update",async({user:t},s,r)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);if(r.roles&&(!r.roles.length||!v(t.slaveRoleIds,r.roles)))throw new x(r.roles);if(r.org&&!t.slaveIds.includes(r.org))throw new h("slaveIds",r.org);if(P(r))throw new p("Empty updates","updates.empty");await e.updateUser(s,r,t)}),o.onRequest("users.people.delete",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveIds.includes(s))throw new h("slaveIds",s);await e.deleteUser(s)}),o.onRequest("users.sessions.destroy",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(e.bySessionId.get(s)?._id))throw new h("permissiveIds",e.bySessionId.get(s)?._id);await l.destroySession(s)}),o.onTransfer?.("users.avatars.upload",{begin({user:t},{metadata:{_id:s,type:r,size:c}}){if(!t||t._id!==s&&!t.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);if(!a.TYPES_ACCEPTED.includes(r))throw new p(`Unacceptable avatar format: ${r}`,"avatar.unacceptable-format");if(c>a.MAX_SIZE)throw new p(`Avatar size exceeds limit of ${a.MAX_SIZE}: ${c}`,"avatar.size-exceeds-limit")},async end(t,{data:s,metadata:{_id:r,type:c}}){await a.save(r,c,s)}}),o.onRequest("users.avatars.delete",async({user:t},s)=>{if(!t||t._id!==s&&!t.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);await a.deleteAvatar(s)}),o.onRequest("users.orgs.create",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!s.title)throw new p("Title can't be empty","title.empty");await u.create(s,t._id)}),o.onRequest("users.orgs.update",async({user:t},s,r)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveIds.includes(s))throw new h("slaveIds",s);if(r.title==="")throw new p("Title can't be empty","title.empty");if(r.owners&&!v(t.slaveIds,r.owners))throw new h("slaveIds",r.owners);if(P(r))throw new p("Empty updates","updates.empty");await u.updateOrg(s,r,t)}),o.onRequest("users.orgs.delete",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveIds.includes(s))throw new h("slaveIds",s);await u.deleteOrg(s)}),o.onRequest("users.roles.check-id",({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!M.role.test(s))throw new p("Role ID is incorrect","role.not-id");if(i.has(s))throw new p("Role ID already exists","role.exists")}),o.onRequest("users.roles.create",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;await i.create(s)}),o.onRequest("users.roles.update",async({user:t},s,{abilities:r,...c})=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new x(s);if(c.involves&&!v(t.slaveRoleIds,c.involves))throw new x(c.involves);await i.updateRole(s,c)}),o.onRequest("users.roles.set-ability",async({user:t},s,r,c)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new x(s);if(!n.hasAbility(t.abilities,r))throw new f(r);await i.setAbility(s,r,c)}),o.onRequest("users.roles.set-ability-param",async({user:t},s,r,c,d)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new x(s);if(!n.hasAbility(t.abilities,r))throw new f(r);if(!n.isParamFits(r,c,d,n.getParam(t.abilities,r,c)))throw new p("Wrong param value","ability.wrong-param");await i.setAbilityParam(s,r,c,d)}),o.onRequest("users.roles.delete",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new x(s);await i.deleteRole(s)})}import{CollectionMapPublication as A,Publication as N}from"insite-subscriptions-server/ws";var U=class extends N{constructor(e){super("abilities",{fetch({user:i}){return i?.abilities.inSite?.users?.roles?{abilities:e.getSchemeFor(i.abilities)}:null}})}},W=class extends A{constructor(e,i={}){let{projection:l={title:1,description:1},sort:a={_o:1},transform:u}=i;Object.assign(l,{involves:1,abilities:1}),super(e.collection,"roles",({user:n})=>n?.abilities.inSite?.users&&{query:{_id:{$in:n.slaveRoleIds}},projection:l,sort:a},n=>{let{involves:t,abilities:s,inheritedAbilities:r,displayTitle:c,_o:d}=e.get(n._id);Object.assign(n,{...n.involves?{ownInvolves:n.involves,involves:C(t),abilities:s,inheritedAbilities:r}:{},...l.title?{displayTitle:c}:{},_o:d}),u?.(n)})}},L=new WeakMap,E=class extends N{constructor(e,i={}){let{fieldsToUpdate:l=[],projection:a,transform:u}=i;for(let n of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!a||a[n]!==0)&&l.push(n);super("user",{onSubscribe(n){let[{user:t}]=n.args;if(t){let{_id:s}=t,r=c=>{if("documentKey"in c&&c.documentKey._id===s)switch(c.operationType){case"update":if(!B(Object.keys(c.updateDescription.updatedFields),l))break;case"replace":case"delete":n.changed(c)}};e.collection.changeListeners.add(r),L.set(n,r)}},fetch({user:n,session:t},s){if(n){let r=j(n,["_id","email","name","initials","displayLabel","job","avatarUrl","abilities","slaveIds"]);if(Object.assign(r,{orgId:n.org._id,sessionId:s?t?._id:void 0,isOnline:!0}),a)for(let c in a)a[c]&&c in n?Object.assign(r,{[c]:n[c]}):delete r[c];return u?.(r),r}return null},onUnsubscribe(n){let t=L.get(n);t&&e.collection.changeListeners.delete(t)}})}},_=class extends A{constructor(e,i={}){let{projection:l={email:1,name:1,org:1,job:1,avatar:1},sort:a={"name.last":1},transform:u}=i;super(e.collection,"users",n=>n.user?.abilities.login&&{query:{},projection:l,sort:a},n=>{let t=e.get(n._id);Object.assign(n,j(t,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:n.org}),delete n.org,delete n.avatar,u?.(n)})}},$=class extends A{constructor(e,i={}){let{projection:l={_id:1},sort:a,triggers:u=[],transform:n}=i;u.includes("roles")||u.push("roles"),super(e.collection,"users.extended",({user:t})=>t?.abilities.inSite?.users&&{query:{_id:{$in:t.slaveIds}},projection:l,sort:a,triggers:u},(t,[s])=>{let r=e.get(t._id);Object.assign(t,{roleIds:R(r.ownRoleIds,s.user.slaveRoleIds)}),n?.(t)})}},T=class extends A{constructor(e){super(e.collection,"users.people.sessions",({user:i},l)=>i?.abilities.inSite?.users&&i.permissiveIds.includes(l)&&{query:{user:l},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},D=class extends A{constructor(e,i={}){let{projection:l={title:1},sort:a={title:1},transform:u}=i;super(e.collection,"orgs",n=>n.user?.abilities.login&&{query:{},projection:l,sort:a},n=>{let t=e.get(n._id);Object.assign(n,j(t,["initials","displayLabel"])),u?.(n)})}},I=class extends A{constructor(e,i={}){let{projection:l={note:1},sort:a={_o:1},triggers:u=[],transform:n}=i;u.includes("owners")||u.push("owners"),super(e.collection,"orgs.extended",({user:t})=>t?.abilities.inSite?.users&&{query:{_id:{$in:t.slaveIds}},projection:l,sort:a,triggers:u},(t,[{user:s}])=>{let r=e.get(t._id),{ownerIds:c,slaveOrgs:d,_o:m}=r;Object.assign(t,{owners:R(c,s.slaveIds),slaveOrgs:C(R(d,s.slaveOrgs)),_o:m}),n?.(t)})}};var K=class o{constructor(e){this.#i=this.init(e)}#e=new WeakMap;#t=new WeakMap;wss;users;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async e=>{let{wss:i,collections:l,users:a,publication:u,extendedPublication:n,userPublication:t,roles:s={},orgs:r={},incomingTransport:c}=e,{publication:d}=s,{publication:m,extendedPublication:y}=r;this.wss=i,this.users=a instanceof H?a:await H.init(l,a),this.incomingTransport=c;for(let O of this.users.values())this.#o(O);return this.abilitiesPublication=new U(this.users.abilities),this.rolesPublication=new W(this.users.roles,d),this.usersPublication=new _(this.users,u),this.usersExtendedPublication=new $(this.users,n),this.userPublication=new E(this.users,t),this.orgsPublication=new D(this.users.orgs,m),this.orgsExtendedPublication=new I(this.users.orgs,y),this.sessionsPublication=new T(this.users.sessions),this.users.on("roles-update",this.#l),this.users.on("roles-role-update",this.#a),this.users.on("user-create",this.#o),this.users.on("user-is-online",this.#c),this.users.on("session-delete",this.#u),this.users.on("orgs-update",this.#f),this.users.on("orgs-org-update",this.#p),this.users.on("user-permissions-change",this.#d),this.wss.onRequest("login",this.#m),this.wss.onRequest("logout",this.#h),this.wss.on("client-closed",this.#S),F(this),this};#i;whenReady(){return this.#i}#s({userAgent:e,remoteAddress:i,sessionProps:l}){return{userAgent:e,remoteAddress:i,...l,isOnline:!0}}setSession(e,i,l){i===null?i=void 0:typeof i=="string"&&(i=this.users.sessions.get(i)),e.session!==i&&(e.session&&this.#t.delete(e.session),i&&!e.isRejected?(e.session=i,e.user=i.user,e.lastUserId=i.user._id,this.#e.get(i.user)?.add(e),this.#t.set(i,e),l&&i.prolong(this.#s(e))):(delete e.session,delete e.user,this.#e.get(e.user)?.delete(e)),this.wss.emit("client-session",e,l))}#r=async(e,i,l)=>{if(!e.isRejected){let a=await this.users.login(i,l,this.#s(e));a&&this.setSession(e,a)}};#n=e=>{e.session&&(this.users.logout(e.session),this.setSession(e,null))};#l=()=>this.rolesPublication.flushInitial();#a=(e,i)=>i&&this.rolesPublication.skip(i);#o=e=>this.#e.set(e,new Set);#c=({_id:e,isOnline:i})=>{let l={_id:e,isOnline:i};for(let a of this.usersPublication.subscriptions){let[u]=a.args;u.user&&u.user._id!==e&&a.handler([["u",l,!0]])}};#u=e=>{let i=this.#t.get(e);i&&this.setSession(i,null)};#f=()=>{this.orgsPublication.flushInitial(),this.orgsExtendedPublication.flushInitial()};#p=(e,i)=>{i&&(this.orgsPublication.skip(i),this.orgsExtendedPublication.skip(i))};#d=e=>{let i=this.#e.get(e);i&&this.wss.emit("should-renew-subscriptions",[...i])};#m=(e,i,l)=>this.#r(e,i,l);#h=e=>this.#n(e);#S=e=>{e.session?.offline(),this.setSession(e,null)};static init(e){return new o(e).whenReady()}};import{WSServerClient as V}from"insite-ws/server";var X=class extends V{isRejected;sessionProps;user;lastUserId;session};export{K as UsersServer,X as WSSCWithUser};
|
|
1
|
+
import{Users as H}from"insite-users-server";function C(o){if(o instanceof Set){let e=[];for(let i of o)e.push(i._id);return e}return o.map(e=>e._id)}function w(){}function J(o,e=0,i={}){let{leading:l=!1,trailing:a=!0}=i,{maxWait:u=1/0}=i,n,t,s,r,c,d,m,y,O=async()=>{let b=Date.now();b>=s?(n=void 0,s=void 0,clearTimeout(t),typeof m=="function"&&await m(),S.resolve(y),S.promise.isResolved=!0,d=l):(clearTimeout(n),n=setTimeout(O,s-b))},k=Number.isFinite(u)?()=>{m===x&&(m=!1),x(),t=setTimeout(k,u)}:null;async function x(){return y=await o.apply(r,c)}l&&typeof l=="boolean"&&(l=x),d=l,a&&typeof a=="boolean"&&(a=x),m=a;let S=Object.assign(function(...b){return c=b,r=this,s=Date.now()+e,m=a,S.promise.isResolved&&(S.promise=Object.assign(new Promise(z=>{S.resolve=z,typeof d=="function"&&(d(),d=!1,m===x&&(m=!1)),n||(n=setTimeout(O,e),k&&(t=setTimeout(k,u)))}),{isResolved:!1})),S.promise},{callback:o,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:w,run:x,clear:async b=>{clearTimeout(n),n=void 0,clearTimeout(t),S.promise.isResolved=!0,S.resolve(b?await x():y)}});return S}J.noop=Object.assign(()=>{},{callback:w,promise:Object.assign(Promise.resolve(),{isResolved:!0}),resolve:w,run:w,clear:w});function P(o){for(let e in o)return!1;return!0}var p=class extends Error{constructor(e,i=null,l){super(e),i&&typeof i=="object"&&(l=i,i=null),this.tag=i,l&&Object.assign(this,l)}name="Err-or";tag};function q(o,e,i,l,a=!0){return Array.isArray(o)&&(o=o.length),typeof l!="string"&&(a=l??!0,l=i),(a?`${o}\xA0`:"")+q.raw(o,e,i,l)}q.raw=(o,e,i,l=i)=>{o=Math.abs(o);let a=o%10,u=o%100;return a===1&&u!==11?e:a>=2&&a<=4&&!(u>=12&&u<=15)?i:l};function v(o,e){return(e instanceof Set?[...e]:e).every(o instanceof Set?i=>o.has(i):i=>o.includes(i))}function B(o,e){return(e instanceof Set?[...e]:e).some(o instanceof Set?i=>o.has(i):i=>o.includes(i))}function R(...o){let e=[];if(o.length){let[i,...l]=o;e:for(let a of i){for(let u of l)if(u instanceof Set?!u.has(a):!u.includes(a))continue e;e.push(a)}}return e}function j(o,e){let i={};for(let l of e)l in o&&(i[l]=o[l]);return i}import{AbilityError as f,RolesError as g,SubordinationError as h}from"insite-users-server";var M={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function F({wss:o,users:e}){let{roles:i,sessions:l,avatars:a,orgs:u,abilities:n}=e;o.onRequest("users.people.check-email",({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!M.email.test(s))throw new p("Not email","email.not");if(e.byEmail.has(s))throw new p("Email already exists","email.exists")}),o.onRequest("users.people.create",async({user:t},{roles:s,org:r,...c})=>{if(!t?.abilities.inSite?.users)throw new f;if(!s.length||!v(t.slaveRoleIds,s))throw new g(s);if(r&&!t.slaveIds.includes(r))throw new h("slaveIds",r);await e.create({roles:s,org:r,...c})}),o.onRequest("users.people.change-password",async({user:t},s,r)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);if(typeof r!="string")throw new p("Type of password is incorrect","password.wrong-type");if(!r)throw new p("Password can't be empty","password.empty");await e.changePassword(s,r)}),o.onRequest("users.people.update",async({user:t},s,r)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);if(r.roles&&(!r.roles.length||!v(t.slaveRoleIds,r.roles)))throw new g(r.roles);if(r.org&&!t.slaveIds.includes(r.org))throw new h("slaveIds",r.org);if(P(r))throw new p("Empty updates","updates.empty");await e.updateUser(s,r,t)}),o.onRequest("users.people.delete",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveIds.includes(s))throw new h("slaveIds",s);await e.deleteUser(s)}),o.onRequest("users.sessions.destroy",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(e.bySessionId.get(s)?._id))throw new h("permissiveIds",e.bySessionId.get(s)?._id);await l.destroySession(s)}),o.onTransfer?.("users.avatars.upload",{begin({user:t},{metadata:{_id:s,type:r,size:c}}){if(!t||t._id!==s&&!t.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);if(!a.TYPES_ACCEPTED.includes(r))throw new p(`Unacceptable avatar format: ${r}`,"avatar.unacceptable-format");if(c>a.MAX_SIZE)throw new p(`Avatar size exceeds limit of ${a.MAX_SIZE}: ${c}`,"avatar.size-exceeds-limit")},async end(t,{data:s,metadata:{_id:r,type:c}}){await a.save(r,c,s)}}),o.onRequest("users.avatars.delete",async({user:t},s)=>{if(!t||t._id!==s&&!t.abilities.inSite?.users)throw new f;if(!t.permissiveIds.includes(s))throw new h("permissiveIds",s);await a.deleteAvatar(s)}),o.onRequest("users.orgs.create",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!s.title)throw new p("Title can't be empty","title.empty");await u.create(s,t._id)}),o.onRequest("users.orgs.update",async({user:t},s,r)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveIds.includes(s))throw new h("slaveIds",s);if(r.title==="")throw new p("Title can't be empty","title.empty");if(r.owners&&!v(t.slaveIds,r.owners))throw new h("slaveIds",r.owners);if(P(r))throw new p("Empty updates","updates.empty");await u.updateOrg(s,r,t)}),o.onRequest("users.orgs.delete",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveIds.includes(s))throw new h("slaveIds",s);await u.deleteOrg(s)}),o.onRequest("users.roles.check-id",({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!M.role.test(s))throw new p("Role ID is incorrect","role.not-id");if(i.has(s))throw new p("Role ID already exists","role.exists")}),o.onRequest("users.roles.create",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;await i.create(s)}),o.onRequest("users.roles.update",async({user:t},s,{abilities:r,...c})=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new g(s);if(c.involves&&!v(t.slaveRoleIds,c.involves))throw new g(c.involves);await i.updateRole(s,c)}),o.onRequest("users.roles.set-ability",async({user:t},s,r,c)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new g(s);if(!n.hasAbility(t.abilities,r))throw new f(r);await i.setAbility(s,r,c)}),o.onRequest("users.roles.set-ability-param",async({user:t},s,r,c,d)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new g(s);if(!n.hasAbility(t.abilities,r))throw new f(r);if(!n.isParamFits(r,c,d,n.getParam(t.abilities,r,c)))throw new p("Wrong param value","ability.wrong-param");await i.setAbilityParam(s,r,c,d)}),o.onRequest("users.roles.delete",async({user:t},s)=>{if(!t?.abilities.inSite?.users)throw new f;if(!t.slaveRoleIds.includes(s))throw new g(s);await i.deleteRole(s)})}import{CollectionMapPublication as A,Publication as N}from"insite-subscriptions-server/ws";var U=class extends N{constructor(e){super("abilities",{fetch({user:i}){return i?.abilities.inSite?.users?.roles?{abilities:e.getSchemeFor(i.abilities)}:null}})}},W=class extends A{constructor(e,i={}){let{projection:l={title:1,description:1},sort:a={_o:1},transform:u}=i;Object.assign(l,{involves:1,abilities:1}),super(e.collection,"roles",({user:n})=>n?.abilities.inSite?.users&&{query:{_id:{$in:n.slaveRoleIds}},projection:l,sort:a},n=>{let{involves:t,abilities:s,inheritedAbilities:r,displayTitle:c,_o:d}=e.get(n._id);Object.assign(n,{...n.involves?{ownInvolves:n.involves,involves:C(t),abilities:s,inheritedAbilities:r}:{},...l.title?{displayTitle:c}:{},_o:d}),u?.(n)})}},L=new WeakMap,E=class extends N{constructor(e,i={}){let{fieldsToUpdate:l=[],projection:a,transform:u}=i;for(let n of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!a||a[n]!==0)&&l.push(n);super("user",{onSubscribe(n){let[{user:t}]=n.args;if(t){let{_id:s}=t,r=c=>{if("documentKey"in c&&c.documentKey._id===s)switch(c.operationType){case"update":if(!B(Object.keys(c.updateDescription.updatedFields),l))break;case"replace":case"delete":n.changed(c)}};e.collection.changeListeners.add(r),L.set(n,r)}},fetch({user:n,session:t},s){if(n){let r=j(n,["_id","email","name","initials","displayLabel","job","avatarUrl","abilities","slaveIds"]);if(Object.assign(r,{orgId:n.org._id,sessionId:s?t?._id:void 0,isOnline:!0}),a)for(let c in a)a[c]&&c in n?Object.assign(r,{[c]:n[c]}):delete r[c];return u?.(r),r}return null},onUnsubscribe(n){let t=L.get(n);t&&e.collection.changeListeners.delete(t)}})}},_=class extends A{constructor(e,i={}){let{projection:l={email:1,name:1,org:1,job:1,avatar:1},sort:a={"name.last":1},transform:u}=i;super(e.collection,"users",n=>n.user?.abilities.login&&{query:{},projection:l,sort:a},n=>{let t=e.get(n._id);Object.assign(n,j(t,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:n.org}),delete n.org,delete n.avatar,u?.(n)})}},$=class extends A{constructor(e,i={}){let{projection:l={_id:1},sort:a,triggers:u=[],transform:n}=i;u.includes("roles")||u.push("roles"),super(e.collection,"users.extended",({user:t})=>t?.abilities.inSite?.users&&{query:{_id:{$in:t.slaveIds}},projection:l,sort:a,triggers:u},(t,[s])=>{let r=e.get(t._id);Object.assign(t,{roleIds:R(r.ownRoleIds,s.user.slaveRoleIds)}),n?.(t)})}},T=class extends A{constructor(e){super(e.collection,"users.people.sessions",({user:i},l)=>i?.abilities.inSite?.users&&i.permissiveIds.includes(l)&&{query:{user:l},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},D=class extends A{constructor(e,i={}){let{projection:l={title:1},sort:a={title:1},transform:u}=i;super(e.collection,"orgs",n=>n.user?.abilities.login&&{query:{},projection:l,sort:a},n=>{let t=e.get(n._id);Object.assign(n,j(t,["initials","displayLabel"])),u?.(n)})}},I=class extends A{constructor(e,i={}){let{projection:l={note:1},sort:a={_o:1},triggers:u=[],transform:n}=i;u.includes("owners")||u.push("owners"),super(e.collection,"orgs.extended",({user:t})=>t?.abilities.inSite?.users&&{query:{_id:{$in:t.slaveIds}},projection:l,sort:a,triggers:u},(t,[{user:s}])=>{let r=e.get(t._id),{ownerIds:c,slaveOrgs:d,_o:m}=r;Object.assign(t,{owners:R(c,s.slaveIds),slaveOrgs:C(R(d,s.slaveOrgs)),_o:m}),n?.(t)})}};var K=class o{constructor(e){this.#i=this.init(e)}#e=new WeakMap;#t=new WeakMap;wss;users;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async e=>{let{wss:i,collections:l,users:a,publication:u,extendedPublication:n,userPublication:t,roles:s={},orgs:r={},incomingTransport:c}=e,{publication:d}=s,{publication:m,extendedPublication:y}=r;this.wss=i,this.users=a instanceof H?a:await H.init(l,a),this.incomingTransport=c;for(let O of this.users.values())this.#o(O);return this.abilitiesPublication=new U(this.users.abilities),this.rolesPublication=new W(this.users.roles,d),this.usersPublication=new _(this.users,u),this.usersExtendedPublication=new $(this.users,n),this.userPublication=new E(this.users,t),this.orgsPublication=new D(this.users.orgs,m),this.orgsExtendedPublication=new I(this.users.orgs,y),this.sessionsPublication=new T(this.users.sessions),this.users.on("roles-update",this.#l),this.users.on("roles-role-update",this.#a),this.users.on("user-create",this.#o),this.users.on("user-is-online",this.#c),this.users.on("session-delete",this.#u),this.users.on("orgs-update",this.#f),this.users.on("orgs-org-update",this.#p),this.users.on("user-permissions-change",this.#d),this.wss.onRequest("login",this.#m),this.wss.onRequest("logout",this.#h),this.wss.on("client-closed",this.#S),F(this),this};#i;whenReady(){return this.#i}#s({userAgent:e,remoteAddress:i,sessionProps:l}){return{userAgent:e,remoteAddress:i,...l,isOnline:!0}}setSession(e,i,l){i===null?i=void 0:typeof i=="string"&&(i=this.users.sessions.get(i)),e.session!==i&&(e.session&&this.#t.delete(e.session),i&&!e.isRejected?(e.session=i,e.user=i.user,e.lastUserId=i.user._id,this.#e.get(i.user)?.add(e),this.#t.set(i,e),l&&i.prolong(this.#s(e))):(delete e.session,delete e.user,this.#e.get(e.user)?.delete(e)),this.wss.emit("client-session",e,l))}#r=async(e,i,l)=>{if(!e.isRejected){let a=await this.users.login(i,l,this.#s(e));a&&this.setSession(e,a)}};#n=e=>{e.session&&(this.users.logout(e.session),this.setSession(e,null))};#l=()=>this.rolesPublication.flushInitial();#a=(e,i)=>i&&this.rolesPublication.skip(i);#o=e=>this.#e.set(e,new Set);#c=({_id:e,isOnline:i})=>{let l={_id:e,isOnline:i};for(let a of this.usersPublication.subscriptions){let[u]=a.args;u.user&&u.user._id!==e&&a.handler([["u",l,!0]])}};#u=e=>{let i=this.#t.get(e);i&&this.setSession(i,null)};#f=()=>{this.orgsPublication.flushInitial(),this.orgsExtendedPublication.flushInitial()};#p=(e,i)=>{i&&(this.orgsPublication.skip(i),this.orgsExtendedPublication.skip(i))};#d=e=>{let i=this.#e.get(e);i&&this.wss.emit("should-renew-subscriptions",[...i])};#m=(e,i,l)=>this.#r(e,i,l);#h=e=>this.#n(e);#S=e=>{e.session?.offline(),this.setSession(e,null)};static init(e){return new o(e).whenReady()}};import{WSServerClient as V}from"insite-ws/server";var X=class extends V{isRejected;sessionProps;user;lastUserId;session};export{K as UsersServer,X as WSSCWithUser};
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "insite-users-server-ws",
|
|
3
|
-
"version": "2.1.
|
|
3
|
+
"version": "2.1.3",
|
|
4
4
|
"description": "inSite users server side WebSocket API",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -24,18 +24,18 @@
|
|
|
24
24
|
"author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
|
|
25
25
|
"license": "MIT",
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@nesvet/n": "^1.1.
|
|
27
|
+
"@nesvet/n": "^1.1.23",
|
|
28
28
|
"insite-common": "^2.1.2",
|
|
29
29
|
"insite-db": "^2.1.2",
|
|
30
|
-
"insite-subscriptions-server": "^2.1.
|
|
31
|
-
"insite-users-server": "^2.1.
|
|
32
|
-
"insite-ws": "^2.1.
|
|
33
|
-
"insite-ws-transfers": "^2.1.
|
|
30
|
+
"insite-subscriptions-server": "^2.1.3",
|
|
31
|
+
"insite-users-server": "^2.1.3",
|
|
32
|
+
"insite-ws": "^2.1.3",
|
|
33
|
+
"insite-ws-transfers": "^2.1.3"
|
|
34
34
|
},
|
|
35
35
|
"devDependencies": {
|
|
36
36
|
"@nesvet/conveyer": "^2.4.3",
|
|
37
37
|
"@nesvet/eslint-config": "^2.0.47",
|
|
38
|
-
"@types/node": "^22.13.
|
|
38
|
+
"@types/node": "^22.13.4",
|
|
39
39
|
"@types/ws": "^8.5.14",
|
|
40
40
|
"typescript": "^5.7.3"
|
|
41
41
|
}
|