insite-users-server-ws 2.3.3 → 2.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +1 -1
- package/README.md +227 -4
- package/dist/index.js +1 -1
- package/dist/index.js.map +4 -4
- package/dist/publications.d.ts +9 -9
- package/dist/publications.d.ts.map +1 -1
- package/package.json +52 -40
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -1,13 +1,236 @@
|
|
|
1
|
-
#
|
|
1
|
+
# insite-users-server-ws
|
|
2
|
+
|
|
3
|
+
WebSocket layer for the inSite users stack. Wires [insite-users-server](../users-server/README.md) (users, orgs, roles, sessions, avatars) to a WebSocket server ([insite-ws](../ws/README.md)).
|
|
4
|
+
|
|
5
|
+
Part of [inSite](../../README.md) — depends on [insite-users-server](../users-server/README.md), [insite-ws](../ws/README.md), [insite-subscriptions-server](../subscriptions-server/README.md), [insite-ws-transfers](../ws-transfers/README.md).
|
|
2
6
|
|
|
3
7
|
## Installation
|
|
4
8
|
|
|
5
9
|
```sh
|
|
6
|
-
|
|
10
|
+
npm install insite-users-server-ws
|
|
7
11
|
```
|
|
8
12
|
|
|
9
|
-
Or
|
|
13
|
+
Or:
|
|
10
14
|
|
|
11
15
|
```sh
|
|
12
|
-
|
|
16
|
+
bun add insite-users-server-ws
|
|
13
17
|
```
|
|
18
|
+
|
|
19
|
+
## Overview
|
|
20
|
+
|
|
21
|
+
The package bridges the users domain to WebSocket. It provides:
|
|
22
|
+
|
|
23
|
+
- **Login/logout** — request handlers for `login` and `logout`
|
|
24
|
+
- **Publications** — real-time subscriptions for abilities, roles, users, orgs, sessions (via [insite-subscriptions-server](../subscriptions-server/README.md))
|
|
25
|
+
- **Request handlers** — CRUD for users, orgs, roles, sessions, avatars
|
|
26
|
+
- **Transfer handler** — avatar upload via [insite-ws-transfers](../ws-transfers/README.md)
|
|
27
|
+
- **Session binding** — `setSession()` to attach/detach sessions to WebSocket clients; emits `client-session` and `should-renew-subscriptions`
|
|
28
|
+
|
|
29
|
+
Publications are created internally by `UsersServer` and are not exported. You configure them through options.
|
|
30
|
+
|
|
31
|
+
## Setup
|
|
32
|
+
|
|
33
|
+
```ts
|
|
34
|
+
import { UsersServer } from "insite-users-server-ws";
|
|
35
|
+
import type { AbilitiesSchema } from "insite-common";
|
|
36
|
+
import type { Collections } from "insite-db";
|
|
37
|
+
import type { WSServer } from "insite-ws/server";
|
|
38
|
+
import type { WSSCWithUser } from "insite-users-server-ws";
|
|
39
|
+
|
|
40
|
+
const usersServer = await UsersServer.init<AbilitiesSchema>({
|
|
41
|
+
wss: yourWss as WSServer<WSSCWithUser<AbilitiesSchema>>,
|
|
42
|
+
collections,
|
|
43
|
+
users: { abilities: yourAbilitiesSchema },
|
|
44
|
+
publication: { projection: { email: 1, name: 1 } },
|
|
45
|
+
userPublication: { public: false }
|
|
46
|
+
});
|
|
47
|
+
|
|
48
|
+
// or with constructor:
|
|
49
|
+
const usersServer = new UsersServer(options);
|
|
50
|
+
await usersServer.whenReady();
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Options<AS>:**
|
|
54
|
+
|
|
55
|
+
| Option | Type | Description |
|
|
56
|
+
|--------|------|-------------|
|
|
57
|
+
| `wss` | `WSServer<WSSCWithUser<AS>>` | WebSocket server (with optional `onTransfer` for avatar upload) |
|
|
58
|
+
| `collections` | `Collections` | MongoDB collections (required if `users` is `UsersOptions`) |
|
|
59
|
+
| `users` | `Users<AS>` \| `UsersOptions<AS>` | Users instance or options to init |
|
|
60
|
+
| `public` | `boolean` | If true, only `user` publication is created; no admin handlers |
|
|
61
|
+
| `publication` | `UsersPublicationOptions` | Options for `users` publication |
|
|
62
|
+
| `extendedPublication` | `UsersExtendedPublicationOptions` | Options for `users.extended` publication |
|
|
63
|
+
| `userPublication` | `UserPublicationOptions` | Options for `user` publication |
|
|
64
|
+
| `roles` | `{ publication?: RolesPublicationOptions }` | Roles publication options |
|
|
65
|
+
| `orgs` | `{ publication?: OrgsPublicationOptions; extendedPublication?: OrgsExtendedPublicationOptions }` | Orgs publication options |
|
|
66
|
+
| `incomingTransport` | `IncomingTransport<WSSCWithUser<AS>>` | Transport for binary transfers (avatar upload) |
|
|
67
|
+
|
|
68
|
+
## WSS Integration
|
|
69
|
+
|
|
70
|
+
**Expected WSS type:** `WSServer<WSSCWithUser<AS>>` with optional `onTransfer` for avatar upload.
|
|
71
|
+
|
|
72
|
+
**Events the package listens to:**
|
|
73
|
+
|
|
74
|
+
| Event | Description |
|
|
75
|
+
|-------|-------------|
|
|
76
|
+
| `client-close` | Client disconnected; session is marked offline and unbound |
|
|
77
|
+
|
|
78
|
+
**Events the package emits:**
|
|
79
|
+
|
|
80
|
+
| Event | Args | Description |
|
|
81
|
+
|-------|------|-------------|
|
|
82
|
+
| `client-session` | `(wssc, shouldProlong?)` | Session was set or cleared on the client |
|
|
83
|
+
| `should-renew-subscriptions` | `(wsscs: WSSCWithUser[])` | User permissions changed; clients should renew subscriptions |
|
|
84
|
+
|
|
85
|
+
## Public API
|
|
86
|
+
|
|
87
|
+
### Exports
|
|
88
|
+
|
|
89
|
+
| Export | Type | Description |
|
|
90
|
+
|--------|------|-------------|
|
|
91
|
+
| `UsersServer` | class | Main entry |
|
|
92
|
+
| `WSSCWithUser` | class | WebSocket client with user/session |
|
|
93
|
+
| `Options` | type | Constructor options |
|
|
94
|
+
| `UsersServerWithActualProps` | type | Typed instance; omits admin publications when `public: true` |
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### UsersServer
|
|
99
|
+
|
|
100
|
+
```ts
|
|
101
|
+
class UsersServer<AS extends AbilitiesSchema>
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
**Constructor:** `new UsersServer(options: Options<AS>)`
|
|
105
|
+
|
|
106
|
+
**Static method:** `UsersServer.init<IAS, IO, IUS>(options: IO): Promise<OmitRedundant<IUS, IO>>` — creates instance and returns `whenReady()`.
|
|
107
|
+
|
|
108
|
+
**Instance properties:**
|
|
109
|
+
|
|
110
|
+
| Property | Type | When present |
|
|
111
|
+
|----------|------|--------------|
|
|
112
|
+
| `wss` | `Options["wss"]` | Always |
|
|
113
|
+
| `users` | `Users<AS>` | Always |
|
|
114
|
+
| `incomingTransport` | `Options["incomingTransport"]` | Always |
|
|
115
|
+
| `abilitiesPublication` | `AbilitiesPublication<AS>` | When `public !== true` |
|
|
116
|
+
| `rolesPublication` | `RolesPublication<AS>` | When `public !== true` |
|
|
117
|
+
| `usersPublication` | `UsersPublication<AS>` | When `public !== true` |
|
|
118
|
+
| `usersExtendedPublication` | `UsersExtendedPublication<AS>` | When `public !== true` |
|
|
119
|
+
| `userPublication` | `UserPublication<AS>` | Always |
|
|
120
|
+
| `orgsPublication` | `OrgsPublication<AS>` | When `public !== true` |
|
|
121
|
+
| `orgsExtendedPublication` | `OrgsExtendedPublication<AS>` | When `public !== true` |
|
|
122
|
+
| `sessionsPublication` | `SessionsPublication<AS>` | When `public !== true` |
|
|
123
|
+
|
|
124
|
+
**Methods:**
|
|
125
|
+
|
|
126
|
+
| Method | Description |
|
|
127
|
+
|--------|-------------|
|
|
128
|
+
| `whenReady(): Promise<this>` | Resolves when init is complete |
|
|
129
|
+
| `setSession(wssc, session, shouldProlong?): void` | Binds or unbinds session to client. `session` can be `Session`, session ID string, `null`, or `undefined`. If `shouldProlong` is true, prolongs the session. Emits `client-session`. |
|
|
130
|
+
|
|
131
|
+
---
|
|
132
|
+
|
|
133
|
+
### WSSCWithUser
|
|
134
|
+
|
|
135
|
+
```ts
|
|
136
|
+
class WSSCWithUser<AS extends AbilitiesSchema> extends WSServerClient
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
Extends `WSServerClient` from [insite-ws](../ws/README.md).
|
|
140
|
+
|
|
141
|
+
| Property | Type | Description |
|
|
142
|
+
|----------|------|-------------|
|
|
143
|
+
| `isRejected` | `boolean` | Client was rejected (e.g. auth failed) |
|
|
144
|
+
| `sessionProps` | `Partial<SessionDoc>` | Custom session props (userAgent, remoteAddress, etc.) |
|
|
145
|
+
| `user` | `User<AS>` | Current user (when session is set) |
|
|
146
|
+
| `lastUserId` | `string` | Last user ID (for reconnection scenarios) |
|
|
147
|
+
| `session` | `Session<AS>` | Current session |
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
### Options
|
|
152
|
+
|
|
153
|
+
```ts
|
|
154
|
+
type Options<AS extends AbilitiesSchema> = {
|
|
155
|
+
wss: WithOptionalOnTransfer<WSServer<WSSCWithUser<AS>>, WSSCWithUser<AS>>;
|
|
156
|
+
collections?: Collections;
|
|
157
|
+
public?: boolean;
|
|
158
|
+
users: Users<AS> | UsersOptions<AS>;
|
|
159
|
+
publication?: UsersPublicationOptions;
|
|
160
|
+
extendedPublication?: UsersExtendedPublicationOptions;
|
|
161
|
+
userPublication?: UserPublicationOptions;
|
|
162
|
+
roles?: { publication?: RolesPublicationOptions };
|
|
163
|
+
orgs?: {
|
|
164
|
+
publication?: OrgsPublicationOptions;
|
|
165
|
+
extendedPublication?: OrgsExtendedPublicationOptions;
|
|
166
|
+
};
|
|
167
|
+
incomingTransport?: IncomingTransport<WSSCWithUser<AS>>;
|
|
168
|
+
};
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Publication option types are defined in [insite-subscriptions-server](../subscriptions-server/README.md) and insite-users-server-ws (internal). Key fields:
|
|
172
|
+
|
|
173
|
+
- **UsersPublicationOptions:** `projection`, `sort`, `transform`
|
|
174
|
+
- **UsersExtendedPublicationOptions:** `projection`, `sort`, `triggers`, `transform`
|
|
175
|
+
- **UserPublicationOptions:** `fieldsToUpdate`, `projection`, `transform`, `public`
|
|
176
|
+
- **RolesPublicationOptions:** `projection`, `sort`, `transform`
|
|
177
|
+
- **OrgsPublicationOptions:** `projection`, `sort`, `transform`
|
|
178
|
+
- **OrgsExtendedPublicationOptions:** `projection`, `sort`, `triggers`, `transform`
|
|
179
|
+
|
|
180
|
+
## Request Handlers
|
|
181
|
+
|
|
182
|
+
`login` and `logout` are always registered. The rest are registered only when `public !== true`. First argument is always `{ user }` from `WSSCWithUser`; subsequent args are from the client.
|
|
183
|
+
|
|
184
|
+
| Method | Args | Description |
|
|
185
|
+
|--------|------|-------------|
|
|
186
|
+
| `login` | `(email, password)` | Authenticates and binds session to client |
|
|
187
|
+
| `logout` | `()` | Logs out and unbinds session |
|
|
188
|
+
| `users.people.check-email` | `(email)` | Checks if email is available |
|
|
189
|
+
| `users.people.create` | `(userDoc)` | Creates user |
|
|
190
|
+
| `users.people.change-password` | `(userId, newPassword)` | Changes user password |
|
|
191
|
+
| `users.people.update` | `(userId, updates)` | Updates user |
|
|
192
|
+
| `users.people.delete` | `(userId)` | Deletes user |
|
|
193
|
+
| `users.sessions.destroy` | `(sessionId)` | Destroys session |
|
|
194
|
+
| `users.avatars.delete` | `(_id)` | Deletes avatar |
|
|
195
|
+
| `users.orgs.create` | `(org)` | Creates org |
|
|
196
|
+
| `users.orgs.update` | `(orgId, updates)` | Updates org |
|
|
197
|
+
| `users.orgs.delete` | `(orgId)` | Deletes org |
|
|
198
|
+
| `users.roles.check-id` | `(roleId)` | Checks if role ID is available |
|
|
199
|
+
| `users.roles.create` | `(role)` | Creates role |
|
|
200
|
+
| `users.roles.update` | `(roleId, updates)` | Updates role |
|
|
201
|
+
| `users.roles.set-ability` | `(roleId, abilityLongId, set)` | Sets ability on role |
|
|
202
|
+
| `users.roles.set-ability-param` | `(roleId, abilityLongId, paramId, value)` | Sets ability param |
|
|
203
|
+
| `users.roles.delete` | `(roleId)` | Deletes role |
|
|
204
|
+
|
|
205
|
+
## Transfer Handler
|
|
206
|
+
|
|
207
|
+
When `wss.onTransfer` is available, the package registers:
|
|
208
|
+
|
|
209
|
+
| Transfer | Metadata | Description |
|
|
210
|
+
|----------|----------|-------------|
|
|
211
|
+
| `users.avatars.upload` | `{ _id, type, size }` | Avatar upload. `_id` is user ID; `type` must be in accepted formats (e.g. WebP); `size` must not exceed limit. |
|
|
212
|
+
|
|
213
|
+
## Publications
|
|
214
|
+
|
|
215
|
+
Publications are created internally. Clients subscribe via the subscription protocol (see [insite-subscriptions-server](../subscriptions-server/README.md)). Names and purpose:
|
|
216
|
+
|
|
217
|
+
| Name | Purpose |
|
|
218
|
+
|------|---------|
|
|
219
|
+
| `abilities` | Abilities scheme for the current user (roles view) |
|
|
220
|
+
| `roles` | Roles the user can manage |
|
|
221
|
+
| `user` | Current user (self) |
|
|
222
|
+
| `users` | All users (list view) |
|
|
223
|
+
| `users.extended` | Extended user data for subordinates |
|
|
224
|
+
| `users.people.sessions` | Sessions for a given user |
|
|
225
|
+
| `orgs` | All orgs |
|
|
226
|
+
| `orgs.extended` | Extended org data for subordinates |
|
|
227
|
+
|
|
228
|
+
## Related
|
|
229
|
+
|
|
230
|
+
- [insite-users-server](../users-server/README.md), [insite-ws](../ws/README.md), [insite-subscriptions-server](../subscriptions-server/README.md), [insite-ws-transfers](../ws-transfers/README.md)
|
|
231
|
+
- [insite-users-client](../users-client/README.md) — client counterpart
|
|
232
|
+
- [insite-cookie](../cookie/README.md) — cookie auth integration
|
|
233
|
+
|
|
234
|
+
## License
|
|
235
|
+
|
|
236
|
+
MIT
|
package/dist/index.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Users as K}from"insite-users-server";function q(r){if(r instanceof Set){let e=[];for(let t of r)e.push(t._id);return e}return r.map(e=>e._id)}function S(){}var P=new WeakMap,A=class r extends Promise{constructor(e,t){let o,l;if(super((a,c)=>{o=a,l=c}),P.set(this,{resolve:o,reject:l}),t?.signal)if(t.signal.aborted)this.reject(new DOMException("Aborted","AbortError"));else{let a=()=>this.reject(new DOMException("Aborted","AbortError"));t.signal.addEventListener("abort",a),this.finally(()=>t.signal?.removeEventListener("abort",a))}if(typeof t?.timeout=="number"&&Number.isFinite(t.timeout)){let a=setTimeout(()=>this.reject(new DOMException("Timeout exceeded","TimeoutError")),t.timeout);this.finally(()=>clearTimeout(a))}e?.(this.resolve,this.reject)}isPending=!0;isFulfilled=!1;isRejected=!1;state="pending";result;resolve=e=>{if(this.isPending){this.isPending=!1,this.isFulfilled=!0,this.state="fulfilled",this.result=e;let t=P.get(this);t&&(t.resolve.call(this,e),P.delete(this))}};reject=e=>{if(this.isPending){this.isPending=!1,this.isRejected=!0,this.state="rejected",this.result=e;let t=P.get(this);t&&(t.reject.call(this,e),P.delete(this))}};static resolved(e){return new r(t=>t(e))}static rejected(e){return new r((t,o)=>o(e))}};function G(r,e=0,t={}){let{leading:o=!1,trailing:l=!0}=t,{maxWait:a=1/0}=t,c,s,i,n,u,p,f,y,E=async()=>{let g=Date.now();g>=i?(c=void 0,i=void 0,clearTimeout(s),s=void 0,typeof f=="function"&&await f(),x.resolve(y),p=o):(clearTimeout(c),c=setTimeout(E,i-g))},O=Number.isFinite(a)?()=>{f===b&&(f=!1),b(),s=setTimeout(O,a)}:null;async function b(){try{return y=await r.apply(n,u),y}catch(g){throw x.reject(g),g}}o&&typeof o=="boolean"&&(o=b),p=o,l&&typeof l=="boolean"&&(l=b),f=l;let x=Object.assign(function(...g){return u=g,n=this,i=Date.now()+e,f=l,x.promise.isPending||(x.promise=new A((X,Z)=>{x.resolve=X,x.reject=Z,typeof p=="function"&&(p(),p=!1,f===b&&(f=!1)),c||(c=setTimeout(E,e),O&&(s=setTimeout(O,a)))})),x.promise},{callback:r,promise:A.resolved(void 0),resolve:S,reject:S,run:b,clear:async g=>{clearTimeout(c),c=void 0,clearTimeout(s),s=void 0,x.resolve(g?await b():y)}});return x}G.noop=Object.assign(()=>{},{callback:S,promise:A.resolved(void 0),resolve:S,reject:S,run:S,clear:S});function R(r){for(let e in r)return!1;return!0}var h=class extends Error{constructor(e,t=null,o){typeof e=="object"?(o=e,e=o.message,delete o.message,t=null):t&&typeof t=="object"&&(o=t,t=null),super(e),this.tag=t,o&&Object.assign(this,o)}name="Err-or";tag};function B(r,e,t,o,l=!0){return Array.isArray(r)&&(r=r.length),typeof o!="string"&&(l=o??!0,o=t),(l?`${r}\xA0`:"")+B.raw(r,e,t,o)}B.raw=(r,e,t,o=t)=>{r=Math.abs(r);let l=r%10,a=r%100;return l===1&&a!==11?e:l>=2&&l<=4&&!(a>=12&&a<=15)?t:o};function j(r,e){return(e instanceof Set?[...e]:e).every(r instanceof Set?t=>r.has(t):t=>r.includes(t))}function F(r,e){return(e instanceof Set?[...e]:e).some(r instanceof Set?t=>r.has(t):t=>r.includes(t))}function U(...r){let e=[];if(r.length){let[t,...o]=r;e:for(let l of t){for(let a of o)if(a instanceof Set?!a.has(l):!a.includes(l))continue e;e.push(l)}}return e}function k(r,e){let t={};for(let o of e)o in r&&(t[o]=r[o]);return t}import{AbilityError as d,RolesError as w,SubordinationError as m}from"insite-users-server";var N={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function L({wss:r,users:e}){let{roles:t,sessions:o,avatars:l,orgs:a,abilities:c}=e;r.onRequest("users.people.check-email",({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!N.email.test(i))throw new h("Not email","email.not");if(e.byEmail.has(i))throw new h("Email already exists","email.exists")}),r.onRequest("users.people.create",async({user:s},{roles:i,org:n,...u})=>{if(!s?.abilities.inSite?.users)throw new d;if(!i.length||!j(s.slaveRoleIds,i))throw new w(i);if(n&&!s.slaveIds.includes(n))throw new m("slaveIds",n);await e.create({roles:i,org:n,...u})}),r.onRequest("users.people.change-password",async({user:s},i,n)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new m("permissiveIds",i);if(typeof n!="string")throw new h("Type of password is incorrect","password.wrong-type");if(!n)throw new h("Password can't be empty","password.empty");await e.changePassword(i,n)}),r.onRequest("users.people.update",async({user:s},i,n)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new m("permissiveIds",i);if(n.roles&&(!n.roles.length||!j(s.slaveRoleIds,n.roles)))throw new w(n.roles);if(n.org&&!s.slaveIds.includes(n.org))throw new m("slaveIds",n.org);if(R(n))throw new h("Empty updates","updates.empty");await e.updateUser(i,n,s)}),r.onRequest("users.people.delete",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveIds.includes(i))throw new m("slaveIds",i);await e.deleteUser(i)}),r.onRequest("users.sessions.destroy",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(e.bySessionId.get(i)?._id))throw new m("permissiveIds",e.bySessionId.get(i)?._id);await o.destroySession(i)}),r.onTransfer?.("users.avatars.upload",{begin({user:s},{metadata:{_id:i,type:n,size:u}}){if(!s||s._id!==i&&!s.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new m("permissiveIds",i);if(!l.TYPES_ACCEPTED.includes(n))throw new h(`Unacceptable avatar format: ${n}`,"avatar.unacceptable-format");if(u>l.MAX_SIZE)throw new h(`Avatar size exceeds limit of ${l.MAX_SIZE}: ${u}`,"avatar.size-exceeds-limit")},async end(s,{data:i,metadata:{_id:n,type:u}}){await l.save(n,u,i)}}),r.onRequest("users.avatars.delete",async({user:s},i)=>{if(!s||s._id!==i&&!s.abilities.inSite?.users)throw new d;if(!s.permissiveIds.includes(i))throw new m("permissiveIds",i);await l.deleteAvatar(i)}),r.onRequest("users.orgs.create",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!i.title)throw new h("Title can't be empty","title.empty");await a.create({...i,owners:[s._id]})}),r.onRequest("users.orgs.update",async({user:s},i,n)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveIds.includes(i))throw new m("slaveIds",i);if(n.title==="")throw new h("Title can't be empty","title.empty");if(n.owners&&!j(s.slaveIds,n.owners))throw new m("slaveIds",n.owners);if(R(n))throw new h("Empty updates","updates.empty");await a.updateOrg(i,n,s)}),r.onRequest("users.orgs.delete",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveIds.includes(i))throw new m("slaveIds",i);await a.deleteOrg(i)}),r.onRequest("users.roles.check-id",({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!N.role.test(i))throw new h("Role ID is incorrect","role.not-id");if(t.has(i))throw new h("Role ID already exists","role.exists")}),r.onRequest("users.roles.create",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;await t.create(i)}),r.onRequest("users.roles.update",async({user:s},i,{abilities:n,...u})=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);if(u.involves&&!j(s.slaveRoleIds,u.involves))throw new w(u.involves);await t.updateRole(i,u)}),r.onRequest("users.roles.set-ability",async({user:s},i,n,u)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);if(!c.hasAbility(s.abilities,n))throw new d(n);await t.setAbility(i,n,u)}),r.onRequest("users.roles.set-ability-param",async({user:s},i,n,u,p)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);if(!c.hasAbility(s.abilities,n))throw new d(n);if(!c.isParamFits(n,u,p,c.getParam(s.abilities,n,u)))throw new h("Wrong param value","ability.wrong-param");await t.setAbilityParam(i,n,u,p)}),r.onRequest("users.roles.delete",async({user:s},i)=>{if(!s?.abilities.inSite?.users)throw new d;if(!s.slaveRoleIds.includes(i))throw new w(i);await t.deleteRole(i)})}import{CollectionMapPublication as v,Publication as J}from"insite-subscriptions-server/ws";var $=class extends J{constructor(e){super("abilities",{fetch({user:t}){return t?.abilities.inSite?.users?.roles?{abilities:e.getSchemeFor(t.abilities)}:null}})}},T=class extends v{constructor(e,t={}){let{projection:o={title:1,description:1},sort:l={_o:1},transform:a}=t;Object.assign(o,{involves:1,abilities:1}),super(e.collection,"roles",({user:c})=>c?.abilities.inSite?.users&&{query:{_id:{$in:c.slaveRoleIds}},projection:o,sort:l},c=>{let{involves:s,abilities:i,inheritedAbilities:n,displayTitle:u,_o:p}=e.get(c._id);Object.assign(c,{...c.involves?{ownInvolves:c.involves,involves:q(s),abilities:i,inheritedAbilities:n}:{},...o.title?{displayTitle:u}:{},_o:p}),a?.(c)})}},z=new WeakMap,I=class extends J{constructor(e,t={}){let{fieldsToUpdate:o=[],projection:l,transform:a,public:c}=t;for(let i of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!l||l[i]!==0)&&o.push(i);let s=["_id","email","name","initials","displayLabel","job","avatarUrl","abilities"];c||s.push("slaveIds"),super("user",{onSubscribe(i){let[{user:n}]=i.args;if(n){let{_id:u}=n,p=f=>{if("documentKey"in f&&f.documentKey._id===u)switch(f.operationType){case"update":if(!F(Object.keys(f.updateDescription.updatedFields),o))break;case"replace":case"delete":i.changed(f)}};e.collection.onChange(p),z.set(i,p)}},fetch({user:i,session:n},u){if(i){let p=k(i,s);if(c||Object.assign(p,{orgId:i.org._id,sessionId:u?n?._id:void 0,isOnline:!0}),l)for(let f in l)l[f]&&f in i?Object.assign(p,{[f]:i[f]}):delete p[f];return a?.(p),p}return null},onUnsubscribe(i){let n=z.get(i);n&&e.collection.removeChangeListener(n)}})}},M=class extends v{constructor(e,t={}){let{projection:o={email:1,name:1,org:1,job:1,avatar:1},sort:l={"name.last":1},transform:a}=t;super(e.collection,"users",c=>c.user?.abilities.login&&{query:{},projection:o,sort:l},c=>{let s=e.get(c._id);Object.assign(c,k(s,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:c.org}),delete c.org,delete c.avatar,a?.(c)})}},D=class extends v{constructor(e,t={}){let{projection:o={_id:1},sort:l,triggers:a=[],transform:c}=t;a.includes("roles")||a.push("roles"),super(e.collection,"users.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:o,sort:l,triggers:a},(s,[i])=>{let n=e.get(s._id);Object.assign(s,{roleIds:U(n.ownRoleIds,i.user.slaveRoleIds)}),c?.(s)})}},_=class extends v{constructor(e){super(e.collection,"users.people.sessions",({user:t},o)=>t?.abilities.inSite?.users&&t.permissiveIds.includes(o)&&{query:{user:o},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},W=class extends v{constructor(e,t={}){let{projection:o={title:1},sort:l={title:1},transform:a}=t;super(e.collection,"orgs",c=>c.user?.abilities.login&&{query:{},projection:o,sort:l},c=>{let s=e.get(c._id);Object.assign(c,k(s,["initials","displayLabel"])),a?.(c)})}},C=class extends v{constructor(e,t={}){let{projection:o={note:1},sort:l={_o:1},triggers:a=[],transform:c}=t;a.includes("owners")||a.push("owners"),super(e.collection,"orgs.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:o,sort:l,triggers:a},(s,[{user:i}])=>{let n=e.get(s._id),{ownerIds:u,slaveOrgs:p,_o:f}=n;Object.assign(s,{owners:U(u,i.slaveIds),slaveOrgs:q(U(p,i.slaveOrgs)),_o:f}),c?.(s)})}};var V=class r{constructor(e){this.#i=this.init(e)}#e=new WeakMap;#t=new WeakMap;wss;users;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async e=>{let{wss:t,collections:o,users:l,public:a,publication:c,extendedPublication:s,userPublication:i,roles:n={},orgs:u={},incomingTransport:p}=e,{publication:f}=n,{publication:y,extendedPublication:E}=u;this.wss=t,this.users=l instanceof K?l:await K.init(o,l),this.incomingTransport=p;for(let O of this.users.values())this.#r(O);return a||(this.abilitiesPublication=new $(this.users.abilities),this.rolesPublication=new T(this.users.roles,f),this.usersPublication=new M(this.users,c),this.usersExtendedPublication=new D(this.users,s),this.orgsPublication=new W(this.users.orgs,y),this.orgsExtendedPublication=new C(this.users.orgs,E),this.sessionsPublication=new _(this.users.sessions),this.users.on("user-is-online",this.#o),L(this)),this.userPublication=new I(this.users,{public:a,...i}),this.users.on("user-create",this.#r),this.users.on("session-delete",this.#n),this.users.on("user-permissions-change",this.#l),this.wss.onRequest("login",this.#c),this.wss.onRequest("logout",this.#a),this.wss.on("client-close",this.#u),this};#i;whenReady(){return this.#i}#s({userAgent:e,remoteAddress:t,sessionProps:o}){return{userAgent:e,remoteAddress:t,...o,isOnline:!0}}setSession(e,t,o){t===null?t=void 0:typeof t=="string"&&(t=this.users.sessions.get(t)),e.session!==t&&(e.session&&this.#t.delete(e.session),t&&!e.isRejected?(e.session=t,e.user=t.user,e.lastUserId=t.user._id,this.#e.get(t.user)?.add(e),this.#t.set(t,e),o&&t.prolong(this.#s(e))):(delete e.session,delete e.user,this.#e.get(e.user)?.delete(e)),this.wss.emit("client-session",e,o))}#r=e=>this.#e.set(e,new Set);#o=({_id:e,isOnline:t})=>{let o={_id:e,isOnline:t};for(let l of this.usersPublication.subscriptions){let[a]=l.args;a.user&&a.user._id!==e&&l.handler([["u",o,!0]])}};#n=e=>{let t=this.#t.get(e);t&&this.setSession(t,null)};#l=e=>{let t=this.#e.get(e);t&&this.wss.emit("should-renew-subscriptions",[...t])};#c=async(e,t,o)=>{if(!e.isRejected){let l=await this.users.login(t,o,this.#s(e));l&&this.setSession(e,l)}};#a=async e=>{e.session&&(await this.users.logout(e.session),this.setSession(e,null))};#u=async e=>{await e.session?.offline(),this.setSession(e,null)};static init(e){return new r(e).whenReady()}};import{WSServerClient as Y}from"insite-ws/server";var H=class extends Y{isRejected;sessionProps;user;lastUserId;session};export{V as UsersServer,H as WSSCWithUser};
|
|
1
|
+
import{Users as D}from"insite-users-server";import{Err as h,includesAll as g,isEmpty as q}from"@nesvet/n";import{AbilityError as p,RolesError as m,SubordinationError as b}from"insite-users-server";var R={email:/^[^\s@]{1,63}@[^\s@]{1,63}\.[^\s@]{1,63}$/,role:/^[\d_a-z-]{1,64}$/};function W({wss:l,users:i}){let{roles:o,sessions:a,avatars:r,orgs:u,abilities:n}=i;l.onRequest("users.people.check-email",({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!R.email.test(e))throw new h("Not email","email.not");if(i.byEmail.has(e))throw new h("Email already exists","email.exists")}),l.onRequest("users.people.create",async({user:s},{roles:e,org:t,...c})=>{if(!s?.abilities.inSite?.users)throw new p;if(!e.length||!g(s.slaveRoleIds,e))throw new m(e);if(t&&!s.slaveIds.includes(t))throw new b("slaveIds",t);await i.create({roles:e,org:t,...c})}),l.onRequest("users.people.change-password",async({user:s},e,t)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);if(typeof t!="string")throw new h("Type of password is incorrect","password.wrong-type");if(!t)throw new h("Password can't be empty","password.empty");await i.changePassword(e,t)}),l.onRequest("users.people.update",async({user:s},e,t)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);if(t.roles&&(!t.roles.length||!g(s.slaveRoleIds,t.roles)))throw new m(t.roles);if(t.org&&!s.slaveIds.includes(t.org))throw new b("slaveIds",t.org);if(q(t))throw new h("Empty updates","updates.empty");await i.updateUser(e,t,s)}),l.onRequest("users.people.delete",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveIds.includes(e))throw new b("slaveIds",e);await i.deleteUser(e)}),l.onRequest("users.sessions.destroy",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(i.bySessionId.get(e)?._id))throw new b("permissiveIds",i.bySessionId.get(e)?._id);await a.destroySession(e)}),l.onTransfer?.("users.avatars.upload",{begin({user:s},{metadata:{_id:e,type:t,size:c}}){if(!s||s._id!==e&&!s.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);if(!r.TYPES_ACCEPTED.includes(t))throw new h(`Unacceptable avatar format: ${t}`,"avatar.unacceptable-format");if(c>r.MAX_SIZE)throw new h(`Avatar size exceeds limit of ${r.MAX_SIZE}: ${c}`,"avatar.size-exceeds-limit")},async end(s,{data:e,metadata:{_id:t,type:c}}){await r.save(t,c,e)}}),l.onRequest("users.avatars.delete",async({user:s},e)=>{if(!s||s._id!==e&&!s.abilities.inSite?.users)throw new p;if(!s.permissiveIds.includes(e))throw new b("permissiveIds",e);await r.deleteAvatar(e)}),l.onRequest("users.orgs.create",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!e.title)throw new h("Title can't be empty","title.empty");await u.create({...e,owners:[s._id]})}),l.onRequest("users.orgs.update",async({user:s},e,t)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveIds.includes(e))throw new b("slaveIds",e);if(t.title==="")throw new h("Title can't be empty","title.empty");if(t.owners&&!g(s.slaveIds,t.owners))throw new b("slaveIds",t.owners);if(q(t))throw new h("Empty updates","updates.empty");await u.updateOrg(e,t,s)}),l.onRequest("users.orgs.delete",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveIds.includes(e))throw new b("slaveIds",e);await u.deleteOrg(e)}),l.onRequest("users.roles.check-id",({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!R.role.test(e))throw new h("Role ID is incorrect","role.not-id");if(o.has(e))throw new h("Role ID already exists","role.exists")}),l.onRequest("users.roles.create",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;await o.create(e)}),l.onRequest("users.roles.update",async({user:s},e,{abilities:t,...c})=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveRoleIds.includes(e))throw new m(e);if(c.involves&&!g(s.slaveRoleIds,c.involves))throw new m(c.involves);await o.updateRole(e,c)}),l.onRequest("users.roles.set-ability",async({user:s},e,t,c)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveRoleIds.includes(e))throw new m(e);if(!n.hasAbility(s.abilities,t))throw new p(t);await o.setAbility(e,t,c)}),l.onRequest("users.roles.set-ability-param",async({user:s},e,t,c,S)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveRoleIds.includes(e))throw new m(e);if(!n.hasAbility(s.abilities,t))throw new p(t);if(!n.isParamFits(t,c,S,n.getParam(s.abilities,t,c)))throw new h("Wrong param value","ability.wrong-param");await o.setAbilityParam(e,t,c,S)}),l.onRequest("users.roles.delete",async({user:s},e)=>{if(!s?.abilities.inSite?.users)throw new p;if(!s.slaveRoleIds.includes(e))throw new m(e);await o.deleteRole(e)})}import{_ids as E,includesAny as L,intersection as j,pick as _}from"@nesvet/n";import{CollectionMapPublication as f,Publication as I}from"insite-subscriptions-server/ws";var A=class extends I{constructor(i){super("abilities",{fetch({user:o}){return o?.abilities.inSite?.users?.roles?{abilities:i.getSchemeFor(o.abilities)}:null}})}},w=class extends f{constructor(i,o={}){let{projection:a={title:1,description:1},sort:r={_o:1},transform:u}=o;Object.assign(a,{involves:1,abilities:1}),super(i.collection,"roles",({user:n})=>n?.abilities.inSite?.users&&{query:{_id:{$in:n.slaveRoleIds}},projection:a,sort:r},n=>{let{involves:s,abilities:e,inheritedAbilities:t,displayTitle:c,_o:S}=i.get(n._id);Object.assign(n,{...n.involves?{ownInvolves:n.involves,involves:E(s),abilities:e,inheritedAbilities:t}:{},...a.title?{displayTitle:c}:{},_o:S}),u?.(n)})}},C=new WeakMap,y=class extends I{constructor(i,o={}){let{fieldsToUpdate:a=[],projection:r,transform:u,public:n}=o;for(let e of["email","name","name.first","name.middle","name.last","org","job","avatar"])(!r||r[e]!==0)&&a.push(e);let s=["_id","email","name","initials","displayLabel","job","avatarUrl","abilities"];n||s.push("slaveIds"),super("user",{onSubscribe(e){let[{user:t}]=e.args;if(t){let{_id:c}=t,S=d=>{if("documentKey"in d&&d.documentKey._id===c)switch(d.operationType){case"update":if(!L(Object.keys(d.updateDescription.updatedFields),a))break;case"replace":case"delete":e.changed(d)}};i.collection.onChange(S),C.set(e,S)}},fetch({user:e,session:t},c){if(e){let S=_(e,s);if(n||Object.assign(S,{orgId:e.org._id,sessionId:c?t?._id:void 0,isOnline:!0}),r)for(let d in r)r[d]&&d in e?Object.assign(S,{[d]:e[d]}):delete S[d];return u?.(S),S}return null},onUnsubscribe(e){let t=C.get(e);t&&i.collection.removeChangeListener(t)}})}},v=class extends f{constructor(i,o={}){let{projection:a={email:1,name:1,org:1,job:1,avatar:1},sort:r={"name.last":1},transform:u}=o;super(i.collection,"users",n=>n.user?.abilities.login&&{query:{},projection:a,sort:r},n=>{let s=i.get(n._id);Object.assign(n,_(s,["initials","displayLabel","avatarUrl","isOnline"]),{orgId:n.org}),delete n.org,delete n.avatar,u?.(n)})}},O=class extends f{constructor(i,o={}){let{projection:a={_id:1},sort:r,triggers:u=[],transform:n}=o;u.includes("roles")||u.push("roles"),super(i.collection,"users.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:a,sort:r,triggers:u},(s,[e])=>{let t=i.get(s._id);Object.assign(s,{roleIds:j(t.ownRoleIds,e.user.slaveRoleIds)}),n?.(s)})}},P=class extends f{constructor(i){super(i.collection,"users.people.sessions",({user:o},a)=>o?.abilities.inSite?.users&&o.permissiveIds.includes(a)&&{query:{user:a},projection:{remoteAddress:1,isOnline:1,prolongedAt:1},sort:{prolongedAt:-1}})}},U=class extends f{constructor(i,o={}){let{projection:a={title:1},sort:r={title:1},transform:u}=o;super(i.collection,"orgs",n=>n.user?.abilities.login&&{query:{},projection:a,sort:r},n=>{let s=i.get(n._id);Object.assign(n,_(s,["initials","displayLabel"])),u?.(n)})}},x=class extends f{constructor(i,o={}){let{projection:a={note:1},sort:r={_o:1},triggers:u=[],transform:n}=o;u.includes("owners")||u.push("owners"),super(i.collection,"orgs.extended",({user:s})=>s?.abilities.inSite?.users&&{query:{_id:{$in:s.slaveIds}},projection:a,sort:r,triggers:u},(s,[{user:e}])=>{let t=i.get(s._id),{ownerIds:c,slaveOrgs:S,_o:d}=t;Object.assign(s,{owners:j(c,e.slaveIds),slaveOrgs:E(j(S,e.slaveOrgs)),_o:d}),n?.(s)})}};var k=class l{constructor(i){this.#i=this.init(i)}#e=new WeakMap;#s=new WeakMap;wss;users;incomingTransport;abilitiesPublication;rolesPublication;usersPublication;usersExtendedPublication;userPublication;orgsPublication;orgsExtendedPublication;sessionsPublication;init=async i=>{let{wss:o,collections:a,users:r,public:u,publication:n,extendedPublication:s,userPublication:e,roles:t={},orgs:c={},incomingTransport:S}=i,{publication:d}=t,{publication:M,extendedPublication:$}=c;this.wss=o,this.users=r instanceof D?r:await D.init(a,r),this.incomingTransport=S;for(let F of this.users.values())this.#o(F);return u||(this.abilitiesPublication=new A(this.users.abilities),this.rolesPublication=new w(this.users.roles,d),this.usersPublication=new v(this.users,n),this.usersExtendedPublication=new O(this.users,s),this.orgsPublication=new U(this.users.orgs,M),this.orgsExtendedPublication=new x(this.users.orgs,$),this.sessionsPublication=new P(this.users.sessions),this.users.on("user-is-online",this.#n),W(this)),this.userPublication=new y(this.users,{public:u,...e}),this.users.on("user-create",this.#o),this.users.on("session-delete",this.#r),this.users.on("user-permissions-change",this.#a),this.wss.onRequest("login",this.#l),this.wss.onRequest("logout",this.#c),this.wss.on("client-close",this.#u),this};#i;whenReady(){return this.#i}#t({userAgent:i,remoteAddress:o,sessionProps:a}){return{userAgent:i,remoteAddress:o,...a,isOnline:!0}}setSession(i,o,a){o===null?o=void 0:typeof o=="string"&&(o=this.users.sessions.get(o)),i.session!==o&&(i.session&&this.#s.delete(i.session),o&&!i.isRejected?(i.session=o,i.user=o.user,i.lastUserId=o.user._id,this.#e.get(o.user)?.add(i),this.#s.set(o,i),a&&o.prolong(this.#t(i))):(delete i.session,delete i.user,this.#e.get(i.user)?.delete(i)),this.wss.emit("client-session",i,a))}#o=i=>this.#e.set(i,new Set);#n=({_id:i,isOnline:o})=>{let a={_id:i,isOnline:o};for(let r of this.usersPublication.subscriptions){let[u]=r.args;u.user&&u.user._id!==i&&r.handler([["u",a,!0]])}};#r=i=>{let o=this.#s.get(i);o&&this.setSession(o,null)};#a=i=>{let o=this.#e.get(i);o&&this.wss.emit("should-renew-subscriptions",[...o])};#l=async(i,o,a)=>{if(!i.isRejected){let r=await this.users.login(o,a,this.#t(i));r&&this.setSession(i,r)}};#c=async i=>{i.session&&(await this.users.logout(i.session),this.setSession(i,null))};#u=async i=>{await i.session?.offline(),this.setSession(i,null)};static init(i){return new l(i).whenReady()}};import{WSServerClient as z}from"insite-ws/server";var T=class extends z{isRejected;sessionProps;user;lastUserId;session};export{k as UsersServer,T as WSSCWithUser};
|
|
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", "
|
|
4
|
-
"sourcesContent": ["import type { AbilitiesSchema } from \"insite-common\";\nimport { Users, type Session, type User } from \"insite-users-server\";\nimport { setupHandlers } from \"./handlers\";\nimport {\n\tAbilitiesPublication,\n\tOrgsExtendedPublication,\n\tOrgsPublication,\n\tRolesPublication,\n\tSessionsPublication,\n\tUserPublication,\n\tUsersExtendedPublication,\n\tUsersPublication\n} from \"./publications\";\nimport type { OmitRedundant, Options } from \"./types\";\nimport type { WSSCWithUser } from \"./WSSCWithUser\";\n\n\nexport class UsersServer<AS extends AbilitiesSchema> {\n\tconstructor(options: Options<AS>) {\n\t\tthis.#initPromise = this.init!(options);\n\t\t\n\t}\n\t\n\t#userWsMap = new WeakMap<User<AS>, Set<WSSCWithUser<AS>>>();\n\t#sessionsWsMap = new WeakMap<Session<AS>, WSSCWithUser<AS>>();\n\t\n\twss!: Options<AS>[\"wss\"];\n\tusers!: Users<AS>;\n\tincomingTransport!: Options<AS>[\"incomingTransport\"];\n\t\n\tabilitiesPublication!: AbilitiesPublication<AS>;\n\trolesPublication!: RolesPublication<AS>;\n\tusersPublication!: UsersPublication<AS>;\n\tusersExtendedPublication!: UsersExtendedPublication<AS>;\n\tuserPublication!: UserPublication<AS>;\n\torgsPublication!: OrgsPublication<AS>;\n\torgsExtendedPublication!: OrgsExtendedPublication<AS>;\n\tsessionsPublication!: SessionsPublication<AS>;\n\t\n\tinit? = async (options: Options<AS>) => {\n\t\t\n\t\tconst {\n\t\t\twss,\n\t\t\tcollections,\n\t\t\tusers,\n\t\t\tpublic: isPublic,\n\t\t\tpublication: publicationOptions,\n\t\t\textendedPublication: extendedPublicationOptions,\n\t\t\tuserPublication: userPublicationOptions,\n\t\t\troles: rolesOptions = {},\n\t\t\torgs: orgsOptions = {},\n\t\t\tincomingTransport\n\t\t} = options;\n\t\t\n\t\tconst {\n\t\t\tpublication: rolesPublicationOptions\n\t\t} = rolesOptions;\n\t\t\n\t\tconst {\n\t\t\tpublication: orgsPublicationOptions,\n\t\t\textendedPublication: orgsExtendedPublicationOptions\n\t\t} = orgsOptions;\n\t\t\n\t\tthis.wss = wss;\n\t\tthis.users = users instanceof Users ? users : await Users.init(collections!, users);\n\t\tthis.incomingTransport = incomingTransport;\n\t\t\n\t\tfor (const user of this.users.values())\n\t\t\tthis.#handleUserCreate(user);\n\t\t\n\t\tif (!isPublic) {\n\t\t\tthis.abilitiesPublication = new AbilitiesPublication<AS>(this.users.abilities);\n\t\t\tthis.rolesPublication = new RolesPublication<AS>(this.users.roles, rolesPublicationOptions);\n\t\t\tthis.usersPublication = new UsersPublication<AS>(this.users, publicationOptions);\n\t\t\tthis.usersExtendedPublication = new UsersExtendedPublication<AS>(this.users, extendedPublicationOptions);\n\t\t\tthis.orgsPublication = new OrgsPublication<AS>(this.users.orgs, orgsPublicationOptions);\n\t\t\tthis.orgsExtendedPublication = new OrgsExtendedPublication<AS>(this.users.orgs, orgsExtendedPublicationOptions);\n\t\t\tthis.sessionsPublication = new SessionsPublication<AS>(this.users.sessions);\n\t\t\t\n\t\t\tthis.users.on(\"user-is-online\", this.#handleUserIsOnline);\n\t\t\t\n\t\t\tsetupHandlers<AS>(this);\n\t\t}\n\t\t\n\t\tthis.userPublication = new UserPublication<AS>(this.users, {\n\t\t\tpublic: isPublic,\n\t\t\t...userPublicationOptions\n\t\t});\n\t\t\n\t\tthis.users.on(\"user-create\", this.#handleUserCreate);\n\t\tthis.users.on(\"session-delete\", this.#handleSessionDelete);\n\t\tthis.users.on(\"user-permissions-change\", this.#handleUserPermissionsChange);\n\t\t\n\t\tthis.wss.onRequest(\"login\", this.#handleClientRequestLogin);\n\t\tthis.wss.onRequest(\"logout\", this.#handleClientRequestLogout);\n\t\tthis.wss.on(\"client-close\", this.#handleClientClosed);\n\t\t\n\t\treturn this;\n\t};\n\t\n\t#initPromise;\n\t\n\twhenReady() {\n\t\treturn this.#initPromise;\n\t}\n\t\n\t#makeSessionProps({ userAgent, remoteAddress, sessionProps }: WSSCWithUser<AS>) {\n\t\treturn {\n\t\t\tuserAgent,\n\t\t\tremoteAddress,\n\t\t\t...sessionProps,\n\t\t\tisOnline: true\n\t\t};\n\t}\n\t\n\tsetSession(wssc: WSSCWithUser<AS>, session: Session<AS> | string | null | undefined, shouldProlong?: boolean) {\n\t\tif (session === null)\n\t\t\tsession = undefined;\n\t\telse if (typeof session == \"string\")\n\t\t\tsession = this.users.sessions.get(session);\n\t\t\n\t\tif (wssc.session !== session) {\n\t\t\tif (wssc.session)\n\t\t\t\tthis.#sessionsWsMap.delete(wssc.session);\n\t\t\t\n\t\t\tif (session && !wssc.isRejected) {\n\t\t\t\twssc.session = session;\n\t\t\t\twssc.user = session.user;\n\t\t\t\twssc.lastUserId = session.user._id;\n\t\t\t\t\n\t\t\t\tthis.#userWsMap.get(session.user)?.add(wssc);\n\t\t\t\tthis.#sessionsWsMap.set(session, wssc);\n\t\t\t\t\n\t\t\t\tif (shouldProlong)\n\t\t\t\t\tvoid session.prolong(this.#makeSessionProps(wssc));\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tdelete wssc.session;\n\t\t\t\tdelete wssc.user;\n\t\t\t\t\n\t\t\t\tthis.#userWsMap.get(wssc.user!)?.delete(wssc);\n\t\t\t}\n\t\t\t\n\t\t\tthis.wss.emit(\"client-session\", wssc, shouldProlong);\n\t\t}\n\t\t\n\t}\n\t\n\t#handleUserCreate = (user: User<AS>) =>\n\t\tthis.#userWsMap.set(user, new Set<WSSCWithUser<AS>>());\n\t\n\t#handleUserIsOnline = ({ _id, isOnline }: User<AS>) => {\n\t\tconst updates = { _id, isOnline };\n\t\t\n\t\tfor (const usersSubscription of this.usersPublication.subscriptions) {\n\t\t\tconst [ wssc ] = usersSubscription.args;\n\t\t\tif (wssc.user && wssc.user._id !== _id)\n\t\t\t\tusersSubscription.handler([ [ \"u\"/* update */, updates, true ] ]);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleSessionDelete = (session: Session<AS>) => {\n\t\tconst wssc = this.#sessionsWsMap.get(session);\n\t\t\n\t\tif (wssc)\n\t\t\tthis.setSession(wssc, null);\n\t\t\n\t};\n\t\n\t#handleUserPermissionsChange = (user: User<AS>) => {\n\t\tconst webSockets = this.#userWsMap.get(user);\n\t\t\n\t\tif (webSockets)\n\t\t\tthis.wss.emit(\"should-renew-subscriptions\", [ ...webSockets ]);\n\t\t\n\t};\n\t\n\t#handleClientRequestLogin = async (wssc: WSSCWithUser<AS>, email: string, password: string) => {\n\t\tif (!wssc.isRejected) {\n\t\t\tconst session = await this.users.login(email, password, this.#makeSessionProps(wssc));\n\t\t\t\n\t\t\tif (session)\n\t\t\t\tthis.setSession(wssc, session);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleClientRequestLogout = async (wssc: WSSCWithUser<AS>) => {\n\t\tif (wssc.session) {\n\t\t\tawait this.users.logout(wssc.session);\n\t\t\t\n\t\t\tthis.setSession(wssc, null);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleClientClosed = async (wssc: WSSCWithUser<AS>) => {\n\t\tawait wssc.session?.offline();\n\t\tthis.setSession(wssc, null);\n\t\t\n\t};\n\t\n\t\n\tstatic init<IAS extends AbilitiesSchema, IO extends Options<IAS>, IUS extends UsersServer<IAS>>(options: IO): Promise<OmitRedundant<IUS, IO>> {\n\t\tconst usersServer = new UsersServer(options) as IUS;\n\t\t\n\t\treturn usersServer.whenReady();\n\t}\n\t\n}\n", "export function _ids<T extends { _id: string }>(iterable: Set<T> | T[]): string[] {\n\tif (iterable instanceof Set) {\n\t\tconst ids = [];\n\t\t\n\t\tfor (const object of iterable)\n\t\t\tids.push(object._id);\n\t\t\n\t\treturn ids;\n\t}\n\t\n\treturn iterable.map(object => object._id);\n}\n", "export function noop() { /**/ }\n", "/* eslint-disable @typescript-eslint/no-explicit-any */\n\ntype Value<T> = PromiseLike<T> | T;\ntype Resolve<T> = (value: Value<T>) => void;\ntype Reject = (reason?: any) => void;\n\ntype Options = {\n\tsignal?: AbortSignal;\n\ttimeout?: number;\n};\n\nconst nativesMap = new WeakMap<StatefulPromise<any>, { resolve: Resolve<any>; reject: Reject }>();\n\n\nexport class StatefulPromise<T> extends Promise<T> {\n\tconstructor(\n\t\texecutor?: (resolve: Resolve<T>, reject: Reject) => void,\n\t\toptions?: Options\n\t) {\n\t\tlet nativeResolve: Resolve<T>;\n\t\tlet nativeReject: Reject;\n\t\t\n\t\tsuper((resolve, reject) => {\n\t\t\tnativeResolve = resolve;\n\t\t\tnativeReject = reject;\n\t\t\t\n\t\t});\n\t\t\n\t\tnativesMap.set(this, { resolve: nativeResolve!, reject: nativeReject! });\n\t\t\n\t\tif (options?.signal)\n\t\t\tif (options.signal.aborted)\n\t\t\t\tthis.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\telse {\n\t\t\t\tconst abortListener = () => this.reject(new DOMException(\"Aborted\", \"AbortError\"));\n\t\t\t\t\n\t\t\t\toptions.signal.addEventListener(\"abort\", abortListener);\n\t\t\t\t\n\t\t\t\tthis.finally(() => options.signal?.removeEventListener(\"abort\", abortListener));\n\t\t\t}\n\t\t\n\t\tif (typeof options?.timeout === \"number\" && Number.isFinite(options.timeout)) {\n\t\t\tconst timeout = setTimeout(() => this.reject(new DOMException(\"Timeout exceeded\", \"TimeoutError\")), options.timeout);\n\t\t\t\n\t\t\tthis.finally(() => clearTimeout(timeout));\n\t\t}\n\t\t\n\t\texecutor?.(this.resolve, this.reject);\n\t\t\n\t}\n\t\n\tisPending = true;\n\tisFulfilled = false;\n\tisRejected = false;\n\t\n\tstate: \"fulfilled\" | \"pending\" | \"rejected\" = \"pending\";\n\t\n\tresult?: T | unknown;\n\t\n\treadonly resolve = (value: Value<T>) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isFulfilled = true;\n\t\t\tthis.state = \"fulfilled\";\n\t\t\tthis.result = value;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.resolve.call(this, value);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\treadonly reject = (reason?: any) => {\n\t\t\n\t\tif (this.isPending) {\n\t\t\tthis.isPending = false;\n\t\t\tthis.isRejected = true;\n\t\t\tthis.state = \"rejected\";\n\t\t\tthis.result = reason;\n\t\t\t\n\t\t\tconst native = nativesMap.get(this);\n\t\t\t\n\t\t\tif (native) {\n\t\t\t\tnative.reject.call(this, reason);\n\t\t\t\tnativesMap.delete(this);\n\t\t\t}\n\t\t}\n\t\t\n\t};\n\t\n\t\n\tstatic resolved<U>(value: U): StatefulPromise<U> {\n\t\treturn new StatefulPromise<U>(resolve => resolve(value));\n\t}\n\t\n\tstatic rejected(reason: unknown): StatefulPromise<never> {\n\t\treturn new StatefulPromise((_, reject) => reject(reason));\n\t}\n\t\n}\n", "import { noop } from \"./noop.js\";\nimport { StatefulPromise } from \"./StatefulPromise.js\";\n\n\ntype Callback = (...args: any[]) => unknown;// eslint-disable-line @typescript-eslint/no-explicit-any\ntype FunctionOrBoolean = (() => unknown) | boolean;\ntype Options = { leading?: FunctionOrBoolean; maxWait?: number; trailing?: FunctionOrBoolean };\n\ntype DebouncedFunction<C extends Callback> = {\n\t(this: ThisParameterType<C>, ...args: Parameters<C>): Promise<Awaited<ReturnType<C>>>;\n};\n\nexport type Debounced<C extends Callback, R extends ReturnType<C>> = DebouncedFunction<C> & {\n\tcallback: C;\n\tpromise: StatefulPromise<R>;\n\tresolve: (value: R) => void;\n\treject: (reason?: unknown) => void;\n\trun(): Promise<R>;\n\tclear(shouldRun?: boolean): Promise<void>;\n};\n\n\nexport function debounce<C extends Callback, R extends ReturnType<C>>(callback: C, limit = 0, options: Options = {}) {\n\tlet { leading = false, trailing = true } = options;\n\tconst { maxWait = Infinity } = options;\n\t\n\tlet timeout: ReturnType<typeof setTimeout> | undefined;\n\tlet maxWaitTimeout: ReturnType<typeof setTimeout> | undefined;\n\tlet end: number | undefined;\n\tlet context: ThisParameterType<C>;\n\tlet args: unknown[];\n\tlet initial: FunctionOrBoolean;\n\tlet final: FunctionOrBoolean;\n\tlet result: R;\n\t\n\tconst expired = async () => {\n\t\t\n\t\tconst n = Date.now();\n\t\t\n\t\tif (n >= end!) {\n\t\t\ttimeout = undefined;\n\t\t\tend = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tmaxWaitTimeout = undefined;\n\t\t\t\n\t\t\tif (typeof final == \"function\")\n\t\t\t\tawait final();\n\t\t\t\n\t\t\tdebounced.resolve(result);\n\t\t\t\n\t\t\tinitial = leading;\n\t\t} else {\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = setTimeout(expired, end! - n);\n\t\t}\n\t\t\n\t};\n\t\n\tconst maxWaitExpired = Number.isFinite(maxWait) ? () => {\n\t\t\n\t\tif (final === run)\n\t\t\tfinal = false;\n\t\t\n\t\trun();\n\t\t\n\t\tmaxWaitTimeout = setTimeout(maxWaitExpired as TimerHandler, maxWait);\n\t\t\n\t} : null;\n\t\n\tasync function run() {\n\t\ttry {\n\t\t\tresult = await callback.apply(context, args) as R;\n\t\t\t\n\t\t\treturn result;\n\t\t} catch (error) {\n\t\t\tdebounced.reject(error);\n\t\t\t\n\t\t\tthrow error;\n\t\t}\n\t}\n\t\n\tif (leading && typeof leading == \"boolean\")\n\t\tleading = run;\n\tinitial = leading;\n\t\n\tif (trailing && typeof trailing == \"boolean\")\n\t\ttrailing = run;\n\tfinal = trailing;\n\t\n\tconst debounced: Debounced<C, R> = Object.assign(function (..._args) {\n\t\targs = _args;\n\t\tcontext = this;// eslint-disable-line no-invalid-this\n\t\t\n\t\tend = Date.now() + limit;\n\t\tfinal = trailing;\n\t\t\n\t\tif (!debounced.promise.isPending)\n\t\t\tdebounced.promise = new StatefulPromise<R>((resolve, reject) => {\n\t\t\t\tdebounced.resolve = resolve;\n\t\t\t\tdebounced.reject = reject;\n\t\t\t\t\n\t\t\t\tif (typeof initial == \"function\") {\n\t\t\t\t\tinitial();\n\t\t\t\t\t\n\t\t\t\t\tinitial = false;\n\t\t\t\t\t\n\t\t\t\t\tif (final === run)\n\t\t\t\t\t\tfinal = false;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!timeout) {\n\t\t\t\t\ttimeout = setTimeout(expired, limit);\n\t\t\t\t\t\n\t\t\t\t\tif (maxWaitExpired)\n\t\t\t\t\t\tmaxWaitTimeout = setTimeout(maxWaitExpired, maxWait);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t});\n\t\t\n\t\treturn debounced.promise;\n\t} as DebouncedFunction<C>, {\n\t\tcallback,\n\t\tpromise: StatefulPromise.resolved(undefined as unknown as R),\n\t\tresolve: noop,\n\t\treject: noop,\n\t\trun,\n\t\tclear: async (shouldRun?: boolean) => {\n\t\t\t\n\t\t\tclearTimeout(timeout);\n\t\t\ttimeout = undefined;\n\t\t\t\n\t\t\tclearTimeout(maxWaitTimeout);\n\t\t\tmaxWaitTimeout = undefined;\n\t\t\t\n\t\t\tdebounced.resolve(shouldRun ? await run() : result);\n\t\t\t\n\t\t}\n\t});\n\t\n\treturn debounced;\n}\n\n\ndebounce.noop = Object.assign(() => { /**/ }, {\n\tcallback: noop,\n\tpromise: StatefulPromise.resolved(undefined), // eslint-disable-line unicorn/no-useless-undefined\n\tresolve: noop,\n\treject: noop,\n\trun: noop,\n\tclear: noop\n}) as Debounced<() => void, void>;\n\n\nexport function throttle(callback: Callback, limit?: number, options?: Options) {\n\treturn debounce(callback, limit, {\n\t\tmaxWait: limit,\n\t\tleading: true,\n\t\ttrailing: true,\n\t\t...options\n\t});\n}\n", "export function isEmpty(object: object) {\n\tfor (const _ in object)// eslint-disable-line guard-for-in, no-unreachable-loop\n\t\treturn false;\n\t\n\treturn true;\n}\n", "/* eslint-disable unicorn/prevent-abbreviations, unicorn/custom-error-definition */\n\n\ntype Payload = Record<string, unknown>;\n\ntype PayloadWithMessage = Payload & {\n\tmessage: string;\n};\n\n\nexport class Err extends Error {\n\tconstructor(payload: PayloadWithMessage);\n\tconstructor(message: string, tag: string | null, payload?: Payload);\n\tconstructor(message: string, payload?: Payload);\n\tconstructor(message: PayloadWithMessage | string, tag: Payload | string | null = null, payload?: Payload) {\n\t\tif (typeof message == \"object\") {\n\t\t\tpayload = message;\n\t\t\tmessage = payload.message as string;\n\t\t\tdelete payload.message;\n\t\t\ttag = null;\n\t\t} else if (tag && typeof tag == \"object\") {\n\t\t\tpayload = tag;\n\t\t\ttag = null;\n\t\t}\n\t\t\n\t\tsuper(message);\n\t\t\n\t\tthis.tag = tag;\n\t\t\n\t\tif (payload)\n\t\t\tObject.assign(this, payload);\n\t\t\n\t}\n\t\n\tname = \"Err-or\";\n\t\n\ttag: string | null;\n\t\n}\n", "export function howmuch(number: [] | number, one: string, two: string, five: boolean | string, shouldPrintNumber = true) {\n\tif (Array.isArray(number))\n\t\tnumber = number.length;\n\t\n\tif (typeof five != \"string\") {\n\t\tshouldPrintNumber = five ?? true;\n\t\tfive = two;\n\t}\n\t\n\t\n\treturn (shouldPrintNumber ? `${number}\u00A0` : \"\") + howmuch.raw(number, one, two, five);\n}\n\nhowmuch.raw = (number: number, one: string, two: string, five = two) => {\n\tnumber = Math.abs(number);\n\tconst u = number % 10;\n\tconst d = number % 100;\n\t\n\treturn (\n\t\t(u === 1 && d !== 11) ?\n\t\t\tone :\n\t\t\t((u >= 2 && u <= 4) && !(d >= 12 && d <= 15)) ?\n\t\t\t\ttwo :\n\t\t\t\tfive\n\t);\n};\n", "export function includesAll<I>(iterable: I[] | Set<I>, items: I[] | Set<I>) {\n\treturn (\n\t\t(items instanceof Set ? [ ...items ] : items)\n\t\t\t.every(\n\t\t\t\titerable instanceof Set ?\n\t\t\t\t\titem => iterable.has(item) :\n\t\t\t\t\titem => iterable.includes(item)\n\t\t\t)\n\t);\n}\n", "export function includesAny<I>(iterable: I[] | Set<I>, items: I[] | Set<I>) {\n\treturn (\n\t\t(items instanceof Set ? [ ...items ] : items)\n\t\t\t.some(\n\t\t\t\titerable instanceof Set ?\n\t\t\t\t\titem => iterable.has(item) :\n\t\t\t\t\titem => iterable.includes(item)\n\t\t\t)\n\t);\n}\n", "export function intersection<I>(...iterables: (I[] | Set<I>)[]): I[] {\n\t\n\tconst intersectionArray = [];\n\t\n\tif (iterables.length) {\n\t\tconst [ firstIterable, ...otherIterables ] = iterables;\n\t\t\n\t\tmainLoop: for (const item of firstIterable) {\n\t\t\tfor (const otherIterable of otherIterables)\n\t\t\t\tif (otherIterable instanceof Set ? !otherIterable.has(item) : !otherIterable.includes(item))\n\t\t\t\t\tcontinue mainLoop;\n\t\t\tintersectionArray.push(item);\n\t\t}\n\t}\n\t\n\treturn intersectionArray;\n}\n", "export function pick<O extends object, K extends keyof O>(object: O, keys: K[]) {\n\t\n\tconst picked: Partial<Pick<O, K>> = {};\n\t\n\tfor (const key of keys)\n\t\tif (key in object)\n\t\t\tpicked[key] = object[key];\n\t\n\treturn picked as Pick<O, K>;\n}\n", "import {\n\t_ids,\n\tErr,\n\tincludesAll,\n\tisEmpty\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport {\n\tAbilityError,\n\tRolesError,\n\tSubordinationError,\n\ttype AbilityParam,\n\ttype OrgDoc,\n\ttype RoleDoc,\n\ttype UserDoc\n} from \"insite-users-server\";\nimport { regexps } from \"./regexps\";\nimport type { UsersServer } from \"./UsersServer\";\n\n\nexport function setupHandlers<AS extends AbilitiesSchema>({ wss, users }: UsersServer<AS>) {\n\t\n\tconst {\n\t\troles,\n\t\tsessions,\n\t\tavatars,\n\t\torgs,\n\t\tabilities\n\t} = users;\n\t\n\t\n\t/* Users */\n\t\n\twss.onRequest(\"users.people.check-email\", ({ user }, email: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!regexps.email.test(email))\n\t\t\tthrow new Err(\"Not email\", \"email.not\");\n\t\t\n\t\tif (users.byEmail.has(email))\n\t\t\tthrow new Err(\"Email already exists\", \"email.exists\");\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.create\", async ({ user }, { roles: roleIds, org: orgId, ...rest }: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!roleIds.length || !includesAll(user.slaveRoleIds, roleIds))\n\t\t\tthrow new RolesError(roleIds);\n\t\t\n\t\tif (orgId && !user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tawait users.create({ roles: roleIds, org: orgId, ...rest });\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.change-password\", async ({ user }, userId: string, newPassword: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", userId);\n\t\t\n\t\tif (typeof newPassword != \"string\")\n\t\t\tthrow new Err(\"Type of password is incorrect\", \"password.wrong-type\");\n\t\t\n\t\tif (!newPassword)\n\t\t\tthrow new Err(\"Password can't be empty\", \"password.empty\");\n\t\t\n\t\tawait users.changePassword(userId, newPassword);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.update\", async ({ user }, userId: string, updates: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", userId);\n\t\t\n\t\tif (updates.roles && (!updates.roles.length || !includesAll(user.slaveRoleIds, updates.roles)))\n\t\t\tthrow new RolesError(updates.roles);\n\t\t\n\t\tif (updates.org && !user.slaveIds.includes(updates.org))\n\t\t\tthrow new SubordinationError(\"slaveIds\", updates.org);\n\t\t\n\t\tif (isEmpty(updates))\n\t\t\tthrow new Err(\"Empty updates\", \"updates.empty\");\n\t\t\n\t\tawait users.updateUser(userId, updates, user);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.delete\", async ({ user }, userId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", userId);\n\t\t\n\t\tawait users.deleteUser(userId);\n\t\t\n\t});\n\t\n\t\n\t/* Sessions */\n\t\n\twss.onRequest(\"users.sessions.destroy\", async ({ user }, sessionId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(users.bySessionId.get(sessionId)?._id))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", users.bySessionId.get(sessionId)?._id);\n\t\t\n\t\tawait sessions.destroySession(sessionId);\n\t\t\n\t});\n\t\n\t\n\t/* Avatars */\n\t\n\twss.onTransfer?.(\"users.avatars.upload\", {\n\t\t\n\t\tbegin({ user }, { metadata: { _id, type, size } }) {\n\t\t\tif (!user || (user._id !== _id && !user.abilities.inSite?.users))\n\t\t\t\tthrow new AbilityError();\n\t\t\t\n\t\t\tif (!user.permissiveIds.includes(_id as string))\n\t\t\t\tthrow new SubordinationError(\"permissiveIds\", _id as string);\n\t\t\t\n\t\t\tif (!avatars.TYPES_ACCEPTED.includes(type as string))\n\t\t\t\tthrow new Err(`Unacceptable avatar format: ${type as string}`, \"avatar.unacceptable-format\");\n\t\t\t\n\t\t\tif (size as number > avatars.MAX_SIZE)\n\t\t\t\tthrow new Err(`Avatar size exceeds limit of ${avatars.MAX_SIZE}: ${size as number}`, \"avatar.size-exceeds-limit\");\n\t\t\t\n\t\t},\n\t\t\n\t\tasync end(_, { data, metadata: { _id, type } }) {\n\t\t\tawait avatars.save(_id as string, type as string, data as string);\n\t\t\t\n\t\t}\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.avatars.delete\", async ({ user }, _id: string) => {\n\t\tif (!user || (user._id !== _id && !user.abilities.inSite?.users))\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(_id))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", _id);\n\t\t\n\t\tawait avatars.deleteAvatar(_id);\n\t\t\n\t});\n\t\n\t\n\t/* Orgs */\n\t\n\twss.onRequest(\"users.orgs.create\", async ({ user }, org: Omit<OrgDoc, \"_id\" | \"createdAt\" | \"owners\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!org.title)\n\t\t\tthrow new Err(\"Title can't be empty\", \"title.empty\");\n\t\t\n\t\tawait orgs.create({ ...org, owners: [ user._id ] });\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.orgs.update\", async ({ user }, orgId, updates: Omit<OrgDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tif (updates.title === \"\")\n\t\t\tthrow new Err(\"Title can't be empty\", \"title.empty\");\n\t\t\n\t\tif (updates.owners && !includesAll(user.slaveIds, updates.owners))\n\t\t\tthrow new SubordinationError(\"slaveIds\", updates.owners);\n\t\t\n\t\tif (isEmpty(updates))\n\t\t\tthrow new Err(\"Empty updates\", \"updates.empty\");\n\t\t\n\t\tawait orgs.updateOrg(orgId, updates, user);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.orgs.delete\", async ({ user }, orgId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tawait orgs.deleteOrg(orgId);\n\t\t\n\t});\n\t\n\t\n\t/* Roles */\n\t\n\twss.onRequest(\"users.roles.check-id\", ({ user }, roleId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!regexps.role.test(roleId))\n\t\t\tthrow new Err(\"Role ID is incorrect\", \"role.not-id\");\n\t\t\n\t\tif (roles.has(roleId))\n\t\t\tthrow new Err(\"Role ID already exists\", \"role.exists\");\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.create\", async ({ user }, role: Omit<RoleDoc, \"abilities\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tawait roles.create(role);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.update\", async ({ user }, roleId: string, { abilities: _abilities, ...updates }: Omit<RoleDoc, \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (updates.involves && !includesAll(user.slaveRoleIds, updates.involves))\n\t\t\tthrow new RolesError(updates.involves);\n\t\t\n\t\tawait roles.updateRole(roleId, updates);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.set-ability\", async ({ user }, roleId: string, abilityLongId: string, set: boolean) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (!abilities.hasAbility(user.abilities, abilityLongId))\n\t\t\tthrow new AbilityError(abilityLongId);\n\t\t\n\t\tawait roles.setAbility(roleId, abilityLongId, set);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.set-ability-param\", async ({ user }, roleId: string, abilityLongId: string, paramId: string, value: AbilityParam) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (!abilities.hasAbility(user.abilities, abilityLongId))\n\t\t\tthrow new AbilityError(abilityLongId);\n\t\t\n\t\tif (!abilities.isParamFits(abilityLongId, paramId, value, abilities.getParam(user.abilities, abilityLongId, paramId)))\n\t\t\tthrow new Err(\"Wrong param value\", \"ability.wrong-param\");\n\t\t\n\t\tawait roles.setAbilityParam(roleId, abilityLongId, paramId, value);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.delete\", async ({ user }, roleId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tawait roles.deleteRole(roleId);\n\t\t\n\t});\n\t\n}\n", "export const regexps = {\n\temail: /^[^\\s@]{1,63}@[^\\s@]{1,63}\\.[^\\s@]{1,63}$/,\n\trole: /^[\\d_a-z-]{1,64}$/\n};\n", "import {\n\t_ids,\n\tincludesAny,\n\tintersection,\n\tpick\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport { ChangeStreamDocument, Sort } from \"insite-db\";\nimport {\n\tCollectionMapPublication,\n\tProjection,\n\tPublication,\n\tSubscriptionHandle\n} from \"insite-subscriptions-server/ws\";\nimport type {\n\tAbilitiesMap,\n\tOrgDoc,\n\tOrgs,\n\tRoleDoc,\n\tRoles,\n\tSessionDoc,\n\tSessions,\n\tUser,\n\tUserDoc,\n\tUsers\n} from \"insite-users-server\";\n\n\nexport class AbilitiesPublication<AS extends AbilitiesSchema> extends Publication<AS> {\n\tconstructor(abilities: AbilitiesMap<AS>) {\n\t\tsuper(\"abilities\", {\n\t\t\t\n\t\t\tfetch({ user }) {\n\t\t\t\tif (user?.abilities.inSite?.users?.roles)\n\t\t\t\t\treturn { abilities: abilities.getSchemeFor(user.abilities) };\n\t\t\t\t\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t});\n\t}\n}\n\n\nexport type RolesPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (roleDoc: object) => void;\n};\n\nexport class RolesPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, RoleDoc> {\n\tconstructor(roles: Roles<AS>, options: RolesPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { title: 1, description: 1 },\n\t\t\tsort = { _o: 1 },\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tObject.assign(projection, { involves: 1, abilities: 1 });\n\t\t\n\t\tsuper(roles.collection, \"roles\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveRoleIds } },\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, roleDoc => {\n\t\t\tconst { involves, abilities, inheritedAbilities, displayTitle, _o } = roles.get(roleDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(roleDoc, {\n\t\t\t\t...roleDoc.involves ? {\n\t\t\t\t\townInvolves: roleDoc.involves,\n\t\t\t\t\tinvolves: _ids(involves),\n\t\t\t\t\tabilities,\n\t\t\t\t\tinheritedAbilities\n\t\t\t\t} : {},\n\t\t\t\t...projection.title ? { displayTitle } : {},\n\t\t\t\t_o\n\t\t\t});\n\t\t\t\n\t\t\ttransform?.(roleDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n\t\n}\n\n\nconst userSubscriptionChangeListenerMap = new WeakMap<SubscriptionHandle, (next: ChangeStreamDocument<UserDoc>) => void>();\n\nexport type UserPublicationOptions = {\n\tfieldsToUpdate?: string[];\n\tprojection?: Projection;\n\ttransform?: (userDoc: object) => void;\n\tpublic?: boolean;\n};\n\nexport class UserPublication<AS extends AbilitiesSchema> extends Publication<AS> {\n\tconstructor(users: Users<AS>, options: UserPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tfieldsToUpdate = [],\n\t\t\tprojection,\n\t\t\ttransform,\n\t\t\tpublic: isPublic\n\t\t} = options;\n\t\t\n\t\tfor (const key of [\n\t\t\t\"email\",\n\t\t\t\"name\",\n\t\t\t\"name.first\",\n\t\t\t\"name.middle\",\n\t\t\t\"name.last\",\n\t\t\t\"org\",\n\t\t\t\"job\",\n\t\t\t\"avatar\"\n\t\t] as const)\n\t\t\tif (!projection || projection[key] !== 0)\n\t\t\t\tfieldsToUpdate.push(key);\n\t\t\n\t\tconst fieldsToPick: (keyof User<AS>)[] = [\n\t\t\t\"_id\",\n\t\t\t\"email\",\n\t\t\t\"name\",\n\t\t\t\"initials\",\n\t\t\t\"displayLabel\",\n\t\t\t\"job\",\n\t\t\t\"avatarUrl\",\n\t\t\t\"abilities\"\n\t\t];\n\t\t\n\t\tif (!isPublic)\n\t\t\tfieldsToPick.push(\"slaveIds\");\n\t\t\n\t\tsuper(\"user\", {\n\t\t\t\n\t\t\tonSubscribe(subscription) {\n\t\t\t\tconst [ { user } ] = subscription.args;\n\t\t\t\t\n\t\t\t\tif (user) {\n\t\t\t\t\tconst { _id } = user;\n\t\t\t\t\t\n\t\t\t\t\tconst changeListener = (next: ChangeStreamDocument<UserDoc>) => {\n\t\t\t\t\t\tif (\"documentKey\" in next && next.documentKey._id === _id)\n\t\t\t\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\t\t\t\tif (!includesAny(Object.keys(next.updateDescription.updatedFields!), fieldsToUpdate))\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tcase \"replace\":// eslint-disable-line no-fallthrough\n\t\t\t\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\t\t\t\tvoid subscription.changed(next);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\tusers.collection.onChange(changeListener);\n\t\t\t\t\t\n\t\t\t\t\tuserSubscriptionChangeListenerMap.set(subscription, changeListener);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tfetch({ user, session }, isSessionIdRequired) {\n\t\t\t\tif (user) {\n\t\t\t\t\tconst userDoc = pick(user, fieldsToPick);\n\t\t\t\t\t\n\t\t\t\t\tif (!isPublic)\n\t\t\t\t\t\tObject.assign(userDoc, {\n\t\t\t\t\t\t\torgId: user.org._id,\n\t\t\t\t\t\t\tsessionId: isSessionIdRequired ? session?._id : undefined,\n\t\t\t\t\t\t\tisOnline: true\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tif (projection)\n\t\t\t\t\t\tfor (const key in projection)\n\t\t\t\t\t\t\tif (projection[key] && key in user)\n\t\t\t\t\t\t\t\tObject.assign(userDoc, { [key]: user[key as keyof typeof user] });\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdelete userDoc[key as keyof typeof userDoc];\n\t\t\t\t\t\n\t\t\t\t\ttransform?.(userDoc);\n\t\t\t\t\t\n\t\t\t\t\treturn userDoc;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t\n\t\t\tonUnsubscribe(subscription) {\n\t\t\t\tconst changeListener = userSubscriptionChangeListenerMap.get(subscription);\n\t\t\t\t\n\t\t\t\tif (changeListener)\n\t\t\t\t\tusers.collection.removeChangeListener(changeListener);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\n\nexport type UsersPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (userDoc: object) => void;\n};\n\nexport class UsersPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc> {\n\tconstructor(users: Users<AS>, options: UsersPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { email: 1, name: 1, org: 1, job: 1, avatar: 1 },\n\t\t\tsort = { \"name.last\": 1 },\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tsuper(users.collection, \"users\", wssc => wssc.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, userDoc => {\n\t\t\t\n\t\t\tconst user = users.get(userDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(\n\t\t\t\tuserDoc,\n\t\t\t\tpick(user, [\n\t\t\t\t\t\"initials\",\n\t\t\t\t\t\"displayLabel\",\n\t\t\t\t\t\"avatarUrl\",\n\t\t\t\t\t\"isOnline\"\n\t\t\t\t]),\n\t\t\t\t{ orgId: userDoc.org }\n\t\t\t);\n\t\t\t\n\t\t\tdelete userDoc.org;\n\t\t\tdelete userDoc.avatar;\n\t\t\t\n\t\t\ttransform?.(userDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\n\nexport type UsersExtendedPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttriggers?: string[];\n\ttransform?: (userDoc: object) => void;\n};\n\nexport class UsersExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc> {\n\tconstructor(users: Users<AS>, options: UsersExtendedPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { _id: 1 },\n\t\t\tsort,\n\t\t\ttriggers = [],\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tif (!triggers.includes(\"roles\"))\n\t\t\ttriggers.push(\"roles\");\n\t\t\n\t\tsuper(users.collection, \"users.extended\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (userDoc, [ wssc ]) => {\n\t\t\tconst user = users.get(userDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(userDoc, {\n\t\t\t\troleIds: intersection(user.ownRoleIds, wssc.user!.slaveRoleIds)\n\t\t\t});\n\t\t\t\n\t\t\ttransform?.(userDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\n\nexport class SessionsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, SessionDoc, [ userId: string ]> {\n\tconstructor(sessions: Sessions<AS>) {\n\t\tsuper(sessions.collection, \"users.people.sessions\", ({ user }, userId) =>\n\t\t\tuser?.abilities.inSite?.users && user.permissiveIds.includes(userId) && {\n\t\t\t\tquery: { user: userId },\n\t\t\t\tprojection: { remoteAddress: 1, isOnline: 1, prolongedAt: 1 },\n\t\t\t\tsort: { prolongedAt: -1 }\n\t\t\t}\n\t\t);\n\t}\n}\n\n\nexport type OrgsPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (orgDoc: object) => void;\n};\n\nexport class OrgsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc> {\n\tconstructor(orgs: Orgs<AS>, options: OrgsPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { title: 1 },\n\t\t\tsort = { title: 1 },\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tsuper(orgs.collection, \"orgs\", wssc => wssc.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, orgDoc => {\n\t\t\tconst org = orgs.get(orgDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(orgDoc, pick(org, [ \"initials\", \"displayLabel\" ]));\n\t\t\t\n\t\t\ttransform?.(orgDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n\t\n}\n\n\nexport type OrgsExtendedPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttriggers?: string[];\n\ttransform?: (orgDoc: object) => void;\n};\n\nexport class OrgsExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc> {\n\tconstructor(orgs: Orgs<AS>, options: OrgsExtendedPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { note: 1 },\n\t\t\tsort = { _o: 1 },\n\t\t\ttriggers = [],\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tif (!triggers.includes(\"owners\"))\n\t\t\ttriggers.push(\"owners\");\n\t\t\n\t\tsuper(orgs.collection, \"orgs.extended\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (orgDoc, [ { user } ]) => {\n\t\t\tconst org = orgs.get(orgDoc._id)!;\n\t\t\t\n\t\t\tconst { ownerIds, slaveOrgs, _o } = org;\n\t\t\t\n\t\t\tObject.assign(orgDoc, {\n\t\t\t\towners: intersection(ownerIds, user!.slaveIds),\n\t\t\t\tslaveOrgs: _ids(intersection(slaveOrgs, user!.slaveOrgs)),\n\t\t\t\t_o\n\t\t\t});\n\t\t\t\n\t\t\ttransform?.(orgDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n\t\n}\n", "import type { AbilitiesSchema } from \"insite-common\";\nimport type { Session, SessionDoc, User } from \"insite-users-server\";\nimport { WSServerClient } from \"insite-ws/server\";\n\n\nexport class WSSCWithUser<AS extends AbilitiesSchema> extends WSServerClient {\n\tisRejected?: boolean;\n\tsessionProps?: Partial<SessionDoc>;\n\tuser?: User<AS>;\n\tlastUserId?: string;\n\tsession?: Session<AS>;\n}\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["Users", "
|
|
3
|
+
"sources": ["../src/UsersServer.ts", "../src/handlers.ts", "../src/regexps.ts", "../src/publications.ts", "../src/WSSCWithUser.ts"],
|
|
4
|
+
"sourcesContent": ["import type { AbilitiesSchema } from \"insite-common\";\nimport { Users, type Session, type User } from \"insite-users-server\";\nimport { setupHandlers } from \"./handlers\";\nimport {\n\tAbilitiesPublication,\n\tOrgsExtendedPublication,\n\tOrgsPublication,\n\tRolesPublication,\n\tSessionsPublication,\n\tUserPublication,\n\tUsersExtendedPublication,\n\tUsersPublication\n} from \"./publications\";\nimport type { OmitRedundant, Options } from \"./types\";\nimport type { WSSCWithUser } from \"./WSSCWithUser\";\n\n\nexport class UsersServer<AS extends AbilitiesSchema> {\n\tconstructor(options: Options<AS>) {\n\t\tthis.#initPromise = this.init!(options);\n\t\t\n\t}\n\t\n\t#userWsMap = new WeakMap<User<AS>, Set<WSSCWithUser<AS>>>();\n\t#sessionsWsMap = new WeakMap<Session<AS>, WSSCWithUser<AS>>();\n\t\n\twss!: Options<AS>[\"wss\"];\n\tusers!: Users<AS>;\n\tincomingTransport!: Options<AS>[\"incomingTransport\"];\n\t\n\tabilitiesPublication!: AbilitiesPublication<AS>;\n\trolesPublication!: RolesPublication<AS>;\n\tusersPublication!: UsersPublication<AS>;\n\tusersExtendedPublication!: UsersExtendedPublication<AS>;\n\tuserPublication!: UserPublication<AS>;\n\torgsPublication!: OrgsPublication<AS>;\n\torgsExtendedPublication!: OrgsExtendedPublication<AS>;\n\tsessionsPublication!: SessionsPublication<AS>;\n\t\n\tinit? = async (options: Options<AS>) => {\n\t\t\n\t\tconst {\n\t\t\twss,\n\t\t\tcollections,\n\t\t\tusers,\n\t\t\tpublic: isPublic,\n\t\t\tpublication: publicationOptions,\n\t\t\textendedPublication: extendedPublicationOptions,\n\t\t\tuserPublication: userPublicationOptions,\n\t\t\troles: rolesOptions = {},\n\t\t\torgs: orgsOptions = {},\n\t\t\tincomingTransport\n\t\t} = options;\n\t\t\n\t\tconst {\n\t\t\tpublication: rolesPublicationOptions\n\t\t} = rolesOptions;\n\t\t\n\t\tconst {\n\t\t\tpublication: orgsPublicationOptions,\n\t\t\textendedPublication: orgsExtendedPublicationOptions\n\t\t} = orgsOptions;\n\t\t\n\t\tthis.wss = wss;\n\t\tthis.users = users instanceof Users ? users : await Users.init(collections!, users);\n\t\tthis.incomingTransport = incomingTransport;\n\t\t\n\t\tfor (const user of this.users.values())\n\t\t\tthis.#handleUserCreate(user);\n\t\t\n\t\tif (!isPublic) {\n\t\t\tthis.abilitiesPublication = new AbilitiesPublication<AS>(this.users.abilities);\n\t\t\tthis.rolesPublication = new RolesPublication<AS>(this.users.roles, rolesPublicationOptions);\n\t\t\tthis.usersPublication = new UsersPublication<AS>(this.users, publicationOptions);\n\t\t\tthis.usersExtendedPublication = new UsersExtendedPublication<AS>(this.users, extendedPublicationOptions);\n\t\t\tthis.orgsPublication = new OrgsPublication<AS>(this.users.orgs, orgsPublicationOptions);\n\t\t\tthis.orgsExtendedPublication = new OrgsExtendedPublication<AS>(this.users.orgs, orgsExtendedPublicationOptions);\n\t\t\tthis.sessionsPublication = new SessionsPublication<AS>(this.users.sessions);\n\t\t\t\n\t\t\tthis.users.on(\"user-is-online\", this.#handleUserIsOnline);\n\t\t\t\n\t\t\tsetupHandlers<AS>(this);\n\t\t}\n\t\t\n\t\tthis.userPublication = new UserPublication<AS>(this.users, {\n\t\t\tpublic: isPublic,\n\t\t\t...userPublicationOptions\n\t\t});\n\t\t\n\t\tthis.users.on(\"user-create\", this.#handleUserCreate);\n\t\tthis.users.on(\"session-delete\", this.#handleSessionDelete);\n\t\tthis.users.on(\"user-permissions-change\", this.#handleUserPermissionsChange);\n\t\t\n\t\tthis.wss.onRequest(\"login\", this.#handleClientRequestLogin);\n\t\tthis.wss.onRequest(\"logout\", this.#handleClientRequestLogout);\n\t\tthis.wss.on(\"client-close\", this.#handleClientClosed);\n\t\t\n\t\treturn this;\n\t};\n\t\n\t#initPromise;\n\t\n\twhenReady() {\n\t\treturn this.#initPromise;\n\t}\n\t\n\t#makeSessionProps({ userAgent, remoteAddress, sessionProps }: WSSCWithUser<AS>) {\n\t\treturn {\n\t\t\tuserAgent,\n\t\t\tremoteAddress,\n\t\t\t...sessionProps,\n\t\t\tisOnline: true\n\t\t};\n\t}\n\t\n\tsetSession(wssc: WSSCWithUser<AS>, session: Session<AS> | string | null | undefined, shouldProlong?: boolean) {\n\t\tif (session === null)\n\t\t\tsession = undefined;\n\t\telse if (typeof session == \"string\")\n\t\t\tsession = this.users.sessions.get(session);\n\t\t\n\t\tif (wssc.session !== session) {\n\t\t\tif (wssc.session)\n\t\t\t\tthis.#sessionsWsMap.delete(wssc.session);\n\t\t\t\n\t\t\tif (session && !wssc.isRejected) {\n\t\t\t\twssc.session = session;\n\t\t\t\twssc.user = session.user;\n\t\t\t\twssc.lastUserId = session.user._id;\n\t\t\t\t\n\t\t\t\tthis.#userWsMap.get(session.user)?.add(wssc);\n\t\t\t\tthis.#sessionsWsMap.set(session, wssc);\n\t\t\t\t\n\t\t\t\tif (shouldProlong)\n\t\t\t\t\tvoid session.prolong(this.#makeSessionProps(wssc));\n\t\t\t\t\n\t\t\t} else {\n\t\t\t\tdelete wssc.session;\n\t\t\t\tdelete wssc.user;\n\t\t\t\t\n\t\t\t\tthis.#userWsMap.get(wssc.user!)?.delete(wssc);\n\t\t\t}\n\t\t\t\n\t\t\tthis.wss.emit(\"client-session\", wssc, shouldProlong);\n\t\t}\n\t\t\n\t}\n\t\n\t#handleUserCreate = (user: User<AS>) =>\n\t\tthis.#userWsMap.set(user, new Set<WSSCWithUser<AS>>());\n\t\n\t#handleUserIsOnline = ({ _id, isOnline }: User<AS>) => {\n\t\tconst updates = { _id, isOnline };\n\t\t\n\t\tfor (const usersSubscription of this.usersPublication.subscriptions) {\n\t\t\tconst [ wssc ] = usersSubscription.args;\n\t\t\tif (wssc.user && wssc.user._id !== _id)\n\t\t\t\tusersSubscription.handler([ [ \"u\"/* update */, updates, true ] ]);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleSessionDelete = (session: Session<AS>) => {\n\t\tconst wssc = this.#sessionsWsMap.get(session);\n\t\t\n\t\tif (wssc)\n\t\t\tthis.setSession(wssc, null);\n\t\t\n\t};\n\t\n\t#handleUserPermissionsChange = (user: User<AS>) => {\n\t\tconst webSockets = this.#userWsMap.get(user);\n\t\t\n\t\tif (webSockets)\n\t\t\tthis.wss.emit(\"should-renew-subscriptions\", [ ...webSockets ]);\n\t\t\n\t};\n\t\n\t#handleClientRequestLogin = async (wssc: WSSCWithUser<AS>, email: string, password: string) => {\n\t\tif (!wssc.isRejected) {\n\t\t\tconst session = await this.users.login(email, password, this.#makeSessionProps(wssc));\n\t\t\t\n\t\t\tif (session)\n\t\t\t\tthis.setSession(wssc, session);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleClientRequestLogout = async (wssc: WSSCWithUser<AS>) => {\n\t\tif (wssc.session) {\n\t\t\tawait this.users.logout(wssc.session);\n\t\t\t\n\t\t\tthis.setSession(wssc, null);\n\t\t}\n\t\t\n\t};\n\t\n\t#handleClientClosed = async (wssc: WSSCWithUser<AS>) => {\n\t\tawait wssc.session?.offline();\n\t\tthis.setSession(wssc, null);\n\t\t\n\t};\n\t\n\t\n\tstatic init<IAS extends AbilitiesSchema, IO extends Options<IAS>, IUS extends UsersServer<IAS>>(options: IO): Promise<OmitRedundant<IUS, IO>> {\n\t\tconst usersServer = new UsersServer(options) as IUS;\n\t\t\n\t\treturn usersServer.whenReady();\n\t}\n\t\n}\n", "import {\n\t_ids,\n\tErr,\n\tincludesAll,\n\tisEmpty\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport {\n\tAbilityError,\n\tRolesError,\n\tSubordinationError,\n\ttype AbilityParam,\n\ttype OrgDoc,\n\ttype RoleDoc,\n\ttype UserDoc\n} from \"insite-users-server\";\nimport { regexps } from \"./regexps\";\nimport type { UsersServer } from \"./UsersServer\";\n\n\nexport function setupHandlers<AS extends AbilitiesSchema>({ wss, users }: UsersServer<AS>) {\n\t\n\tconst {\n\t\troles,\n\t\tsessions,\n\t\tavatars,\n\t\torgs,\n\t\tabilities\n\t} = users;\n\t\n\t\n\t/* Users */\n\t\n\twss.onRequest(\"users.people.check-email\", ({ user }, email: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!regexps.email.test(email))\n\t\t\tthrow new Err(\"Not email\", \"email.not\");\n\t\t\n\t\tif (users.byEmail.has(email))\n\t\t\tthrow new Err(\"Email already exists\", \"email.exists\");\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.create\", async ({ user }, { roles: roleIds, org: orgId, ...rest }: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!roleIds.length || !includesAll(user.slaveRoleIds, roleIds))\n\t\t\tthrow new RolesError(roleIds);\n\t\t\n\t\tif (orgId && !user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tawait users.create({ roles: roleIds, org: orgId, ...rest });\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.change-password\", async ({ user }, userId: string, newPassword: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", userId);\n\t\t\n\t\tif (typeof newPassword != \"string\")\n\t\t\tthrow new Err(\"Type of password is incorrect\", \"password.wrong-type\");\n\t\t\n\t\tif (!newPassword)\n\t\t\tthrow new Err(\"Password can't be empty\", \"password.empty\");\n\t\t\n\t\tawait users.changePassword(userId, newPassword);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.update\", async ({ user }, userId: string, updates: Omit<UserDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", userId);\n\t\t\n\t\tif (updates.roles && (!updates.roles.length || !includesAll(user.slaveRoleIds, updates.roles)))\n\t\t\tthrow new RolesError(updates.roles);\n\t\t\n\t\tif (updates.org && !user.slaveIds.includes(updates.org))\n\t\t\tthrow new SubordinationError(\"slaveIds\", updates.org);\n\t\t\n\t\tif (isEmpty(updates))\n\t\t\tthrow new Err(\"Empty updates\", \"updates.empty\");\n\t\t\n\t\tawait users.updateUser(userId, updates, user);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.people.delete\", async ({ user }, userId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(userId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", userId);\n\t\t\n\t\tawait users.deleteUser(userId);\n\t\t\n\t});\n\t\n\t\n\t/* Sessions */\n\t\n\twss.onRequest(\"users.sessions.destroy\", async ({ user }, sessionId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(users.bySessionId.get(sessionId)?._id))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", users.bySessionId.get(sessionId)?._id);\n\t\t\n\t\tawait sessions.destroySession(sessionId);\n\t\t\n\t});\n\t\n\t\n\t/* Avatars */\n\t\n\twss.onTransfer?.(\"users.avatars.upload\", {\n\t\t\n\t\tbegin({ user }, { metadata: { _id, type, size } }) {\n\t\t\tif (!user || (user._id !== _id && !user.abilities.inSite?.users))\n\t\t\t\tthrow new AbilityError();\n\t\t\t\n\t\t\tif (!user.permissiveIds.includes(_id as string))\n\t\t\t\tthrow new SubordinationError(\"permissiveIds\", _id as string);\n\t\t\t\n\t\t\tif (!avatars.TYPES_ACCEPTED.includes(type as string))\n\t\t\t\tthrow new Err(`Unacceptable avatar format: ${type as string}`, \"avatar.unacceptable-format\");\n\t\t\t\n\t\t\tif (size as number > avatars.MAX_SIZE)\n\t\t\t\tthrow new Err(`Avatar size exceeds limit of ${avatars.MAX_SIZE}: ${size as number}`, \"avatar.size-exceeds-limit\");\n\t\t\t\n\t\t},\n\t\t\n\t\tasync end(_, { data, metadata: { _id, type } }) {\n\t\t\tawait avatars.save(_id as string, type as string, data as string);\n\t\t\t\n\t\t}\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.avatars.delete\", async ({ user }, _id: string) => {\n\t\tif (!user || (user._id !== _id && !user.abilities.inSite?.users))\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.permissiveIds.includes(_id))\n\t\t\tthrow new SubordinationError(\"permissiveIds\", _id);\n\t\t\n\t\tawait avatars.deleteAvatar(_id);\n\t\t\n\t});\n\t\n\t\n\t/* Orgs */\n\t\n\twss.onRequest(\"users.orgs.create\", async ({ user }, org: Omit<OrgDoc, \"_id\" | \"createdAt\" | \"owners\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!org.title)\n\t\t\tthrow new Err(\"Title can't be empty\", \"title.empty\");\n\t\t\n\t\tawait orgs.create({ ...org, owners: [ user._id ] });\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.orgs.update\", async ({ user }, orgId, updates: Omit<OrgDoc, \"_id\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tif (updates.title === \"\")\n\t\t\tthrow new Err(\"Title can't be empty\", \"title.empty\");\n\t\t\n\t\tif (updates.owners && !includesAll(user.slaveIds, updates.owners))\n\t\t\tthrow new SubordinationError(\"slaveIds\", updates.owners);\n\t\t\n\t\tif (isEmpty(updates))\n\t\t\tthrow new Err(\"Empty updates\", \"updates.empty\");\n\t\t\n\t\tawait orgs.updateOrg(orgId, updates, user);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.orgs.delete\", async ({ user }, orgId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveIds.includes(orgId))\n\t\t\tthrow new SubordinationError(\"slaveIds\", orgId);\n\t\t\n\t\tawait orgs.deleteOrg(orgId);\n\t\t\n\t});\n\t\n\t\n\t/* Roles */\n\t\n\twss.onRequest(\"users.roles.check-id\", ({ user }, roleId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!regexps.role.test(roleId))\n\t\t\tthrow new Err(\"Role ID is incorrect\", \"role.not-id\");\n\t\t\n\t\tif (roles.has(roleId))\n\t\t\tthrow new Err(\"Role ID already exists\", \"role.exists\");\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.create\", async ({ user }, role: Omit<RoleDoc, \"abilities\" | \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tawait roles.create(role);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.update\", async ({ user }, roleId: string, { abilities: _abilities, ...updates }: Omit<RoleDoc, \"createdAt\">) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (updates.involves && !includesAll(user.slaveRoleIds, updates.involves))\n\t\t\tthrow new RolesError(updates.involves);\n\t\t\n\t\tawait roles.updateRole(roleId, updates);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.set-ability\", async ({ user }, roleId: string, abilityLongId: string, set: boolean) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (!abilities.hasAbility(user.abilities, abilityLongId))\n\t\t\tthrow new AbilityError(abilityLongId);\n\t\t\n\t\tawait roles.setAbility(roleId, abilityLongId, set);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.set-ability-param\", async ({ user }, roleId: string, abilityLongId: string, paramId: string, value: AbilityParam) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tif (!abilities.hasAbility(user.abilities, abilityLongId))\n\t\t\tthrow new AbilityError(abilityLongId);\n\t\t\n\t\tif (!abilities.isParamFits(abilityLongId, paramId, value, abilities.getParam(user.abilities, abilityLongId, paramId)))\n\t\t\tthrow new Err(\"Wrong param value\", \"ability.wrong-param\");\n\t\t\n\t\tawait roles.setAbilityParam(roleId, abilityLongId, paramId, value);\n\t\t\n\t});\n\t\n\twss.onRequest(\"users.roles.delete\", async ({ user }, roleId: string) => {\n\t\tif (!user?.abilities.inSite?.users)\n\t\t\tthrow new AbilityError();\n\t\t\n\t\tif (!user.slaveRoleIds.includes(roleId))\n\t\t\tthrow new RolesError(roleId);\n\t\t\n\t\tawait roles.deleteRole(roleId);\n\t\t\n\t});\n\t\n}\n", "export const regexps = {\n\temail: /^[^\\s@]{1,63}@[^\\s@]{1,63}\\.[^\\s@]{1,63}$/,\n\trole: /^[\\d_a-z-]{1,64}$/\n};\n", "import {\n\t_ids,\n\tincludesAny,\n\tintersection,\n\tpick\n} from \"@nesvet/n\";\nimport type { AbilitiesSchema } from \"insite-common\";\nimport { ChangeStreamDocument, Sort } from \"insite-db\";\nimport { CollectionMapPublication, Projection, Publication } from \"insite-subscriptions-server/ws\";\nimport type {\n\tAbilitiesMap,\n\tOrgDoc,\n\tOrgs,\n\tRoleDoc,\n\tRoles,\n\tSession,\n\tSessionDoc,\n\tSessions,\n\tUser,\n\tUserDoc,\n\tUsers\n} from \"insite-users-server\";\n\n\nexport class AbilitiesPublication<AS extends AbilitiesSchema> extends Publication<AS, [], User<AS>, Session<AS>> {\n\tconstructor(abilities: AbilitiesMap<AS>) {\n\t\tsuper(\"abilities\", {\n\t\t\t\n\t\t\tfetch({ user }) {\n\t\t\t\tif (user?.abilities.inSite?.users?.roles)\n\t\t\t\t\treturn { abilities: abilities.getSchemeFor(user.abilities) };\n\t\t\t\t\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t\n\t\t});\n\t}\n}\n\n\nexport type RolesPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (roleDoc: object) => void;\n};\n\nexport class RolesPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, RoleDoc, [], User<AS>, Session<AS>> {\n\tconstructor(roles: Roles<AS>, options: RolesPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { title: 1, description: 1 },\n\t\t\tsort = { _o: 1 },\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tObject.assign(projection, { involves: 1, abilities: 1 });\n\t\t\n\t\tsuper(roles.collection, \"roles\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveRoleIds } },\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, roleDoc => {\n\t\t\tconst { involves, abilities, inheritedAbilities, displayTitle, _o } = roles.get(roleDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(roleDoc, {\n\t\t\t\t...roleDoc.involves ? {\n\t\t\t\t\townInvolves: roleDoc.involves,\n\t\t\t\t\tinvolves: _ids(involves),\n\t\t\t\t\tabilities,\n\t\t\t\t\tinheritedAbilities\n\t\t\t\t} : {},\n\t\t\t\t...projection.title ? { displayTitle } : {},\n\t\t\t\t_o\n\t\t\t});\n\t\t\t\n\t\t\ttransform?.(roleDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n\t\n}\n\n\nconst userSubscriptionChangeListenerMap = new WeakMap<object, (next: ChangeStreamDocument<UserDoc>) => void>();\n\nexport type UserPublicationOptions = {\n\tfieldsToUpdate?: string[];\n\tprojection?: Projection;\n\ttransform?: (userDoc: object) => void;\n\tpublic?: boolean;\n};\n\nexport class UserPublication<AS extends AbilitiesSchema> extends Publication<AS, [ boolean ], User<AS>, Session<AS>> {\n\tconstructor(users: Users<AS>, options: UserPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tfieldsToUpdate = [],\n\t\t\tprojection,\n\t\t\ttransform,\n\t\t\tpublic: isPublic\n\t\t} = options;\n\t\t\n\t\tfor (const key of [\n\t\t\t\"email\",\n\t\t\t\"name\",\n\t\t\t\"name.first\",\n\t\t\t\"name.middle\",\n\t\t\t\"name.last\",\n\t\t\t\"org\",\n\t\t\t\"job\",\n\t\t\t\"avatar\"\n\t\t] as const)\n\t\t\tif (!projection || projection[key] !== 0)\n\t\t\t\tfieldsToUpdate.push(key);\n\t\t\n\t\tconst fieldsToPick: (keyof User<AS>)[] = [\n\t\t\t\"_id\",\n\t\t\t\"email\",\n\t\t\t\"name\",\n\t\t\t\"initials\",\n\t\t\t\"displayLabel\",\n\t\t\t\"job\",\n\t\t\t\"avatarUrl\",\n\t\t\t\"abilities\"\n\t\t];\n\t\t\n\t\tif (!isPublic)\n\t\t\tfieldsToPick.push(\"slaveIds\");\n\t\t\n\t\tsuper(\"user\", {\n\t\t\t\n\t\t\tonSubscribe(subscription) {\n\t\t\t\tconst [ { user } ] = subscription.args;\n\t\t\t\t\n\t\t\t\tif (user) {\n\t\t\t\t\tconst { _id } = user;\n\t\t\t\t\t\n\t\t\t\t\tconst changeListener = (next: ChangeStreamDocument<UserDoc>) => {\n\t\t\t\t\t\tif (\"documentKey\" in next && next.documentKey._id === _id)\n\t\t\t\t\t\t\tswitch (next.operationType) {\n\t\t\t\t\t\t\t\tcase \"update\":\n\t\t\t\t\t\t\t\t\tif (!includesAny(Object.keys(next.updateDescription.updatedFields!), fieldsToUpdate))\n\t\t\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\tcase \"replace\":// eslint-disable-line no-fallthrough\n\t\t\t\t\t\t\t\tcase \"delete\":\n\t\t\t\t\t\t\t\t\tvoid subscription.changed(next);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\tusers.collection.onChange(changeListener);\n\t\t\t\t\t\n\t\t\t\t\tuserSubscriptionChangeListenerMap.set(subscription, changeListener);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t},\n\t\t\t\n\t\t\tfetch({ user, session }, isSessionIdRequired) {\n\t\t\t\tif (user) {\n\t\t\t\t\tconst userDoc = pick(user, fieldsToPick);\n\t\t\t\t\t\n\t\t\t\t\tif (!isPublic)\n\t\t\t\t\t\tObject.assign(userDoc, {\n\t\t\t\t\t\t\torgId: user.org._id,\n\t\t\t\t\t\t\tsessionId: isSessionIdRequired ? session?._id : undefined,\n\t\t\t\t\t\t\tisOnline: true\n\t\t\t\t\t\t});\n\t\t\t\t\t\n\t\t\t\t\tif (projection)\n\t\t\t\t\t\tfor (const key in projection)\n\t\t\t\t\t\t\tif (projection[key] && key in user)\n\t\t\t\t\t\t\t\tObject.assign(userDoc, { [key]: user[key as keyof typeof user] });\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdelete userDoc[key as keyof typeof userDoc];\n\t\t\t\t\t\n\t\t\t\t\ttransform?.(userDoc);\n\t\t\t\t\t\n\t\t\t\t\treturn userDoc;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn null;\n\t\t\t},\n\t\t\t\n\t\t\tonUnsubscribe(subscription) {\n\t\t\t\tconst changeListener = userSubscriptionChangeListenerMap.get(subscription);\n\t\t\t\t\n\t\t\t\tif (changeListener)\n\t\t\t\t\tusers.collection.removeChangeListener(changeListener);\n\t\t\t\t\n\t\t\t}\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\n\nexport type UsersPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (userDoc: object) => void;\n};\n\nexport class UsersPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc, [], User<AS>, Session<AS>> {\n\tconstructor(users: Users<AS>, options: UsersPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { email: 1, name: 1, org: 1, job: 1, avatar: 1 },\n\t\t\tsort = { \"name.last\": 1 },\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tsuper(users.collection, \"users\", wssc => wssc.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, userDoc => {\n\t\t\t\n\t\t\tconst user = users.get(userDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(\n\t\t\t\tuserDoc,\n\t\t\t\tpick(user, [\n\t\t\t\t\t\"initials\",\n\t\t\t\t\t\"displayLabel\",\n\t\t\t\t\t\"avatarUrl\",\n\t\t\t\t\t\"isOnline\"\n\t\t\t\t]),\n\t\t\t\t{ orgId: userDoc.org }\n\t\t\t);\n\t\t\t\n\t\t\tdelete userDoc.org;\n\t\t\tdelete userDoc.avatar;\n\t\t\t\n\t\t\ttransform?.(userDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\n\nexport type UsersExtendedPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttriggers?: string[];\n\ttransform?: (userDoc: object) => void;\n};\n\nexport class UsersExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc, [], User<AS>, Session<AS>> {\n\tconstructor(users: Users<AS>, options: UsersExtendedPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { _id: 1 },\n\t\t\tsort,\n\t\t\ttriggers = [],\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tif (!triggers.includes(\"roles\"))\n\t\t\ttriggers.push(\"roles\");\n\t\t\n\t\tsuper(users.collection, \"users.extended\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (userDoc, [ wssc ]) => {\n\t\t\tconst user = users.get(userDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(userDoc, {\n\t\t\t\troleIds: intersection(user.ownRoleIds, wssc.user!.slaveRoleIds)\n\t\t\t});\n\t\t\t\n\t\t\ttransform?.(userDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n}\n\n\nexport class SessionsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, SessionDoc, [ string ], User<AS>, Session<AS>> {\n\tconstructor(sessions: Sessions<AS>) {\n\t\tsuper(sessions.collection, \"users.people.sessions\", ({ user }, userId) =>\n\t\t\tuser?.abilities.inSite?.users && user.permissiveIds.includes(userId) && {\n\t\t\t\tquery: { user: userId },\n\t\t\t\tprojection: { remoteAddress: 1, isOnline: 1, prolongedAt: 1 },\n\t\t\t\tsort: { prolongedAt: -1 }\n\t\t\t}\n\t\t);\n\t}\n}\n\n\nexport type OrgsPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttransform?: (orgDoc: object) => void;\n};\n\nexport class OrgsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc, [], User<AS>, Session<AS>> {\n\tconstructor(orgs: Orgs<AS>, options: OrgsPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { title: 1 },\n\t\t\tsort = { title: 1 },\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tsuper(orgs.collection, \"orgs\", wssc => wssc.user?.abilities.login && {\n\t\t\tquery: {},\n\t\t\tprojection,\n\t\t\tsort\n\t\t}, orgDoc => {\n\t\t\tconst org = orgs.get(orgDoc._id)!;\n\t\t\t\n\t\t\tObject.assign(orgDoc, pick(org, [ \"initials\", \"displayLabel\" ]));\n\t\t\t\n\t\t\ttransform?.(orgDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n\t\n}\n\n\nexport type OrgsExtendedPublicationOptions = {\n\tprojection?: Projection;\n\tsort?: Sort;\n\ttriggers?: string[];\n\ttransform?: (orgDoc: object) => void;\n};\n\nexport class OrgsExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc, [], User<AS>, Session<AS>> {\n\tconstructor(orgs: Orgs<AS>, options: OrgsExtendedPublicationOptions = {}) {\n\t\t\n\t\tconst {\n\t\t\tprojection = { note: 1 },\n\t\t\tsort = { _o: 1 },\n\t\t\ttriggers = [],\n\t\t\ttransform\n\t\t} = options;\n\t\t\n\t\tif (!triggers.includes(\"owners\"))\n\t\t\ttriggers.push(\"owners\");\n\t\t\n\t\tsuper(orgs.collection, \"orgs.extended\", ({ user }) => user?.abilities.inSite?.users && {\n\t\t\tquery: { _id: { $in: user.slaveIds } },\n\t\t\tprojection,\n\t\t\tsort,\n\t\t\ttriggers\n\t\t}, (orgDoc, [ { user } ]) => {\n\t\t\tconst org = orgs.get(orgDoc._id)!;\n\t\t\t\n\t\t\tconst { ownerIds, slaveOrgs, _o } = org;\n\t\t\t\n\t\t\tObject.assign(orgDoc, {\n\t\t\t\towners: intersection(ownerIds, user!.slaveIds),\n\t\t\t\tslaveOrgs: _ids(intersection(slaveOrgs, user!.slaveOrgs)),\n\t\t\t\t_o\n\t\t\t});\n\t\t\t\n\t\t\ttransform?.(orgDoc);\n\t\t\t\n\t\t});\n\t\t\n\t}\n\t\n}\n", "import type { AbilitiesSchema } from \"insite-common\";\nimport type { Session, SessionDoc, User } from \"insite-users-server\";\nimport { WSServerClient } from \"insite-ws/server\";\n\n\nexport class WSSCWithUser<AS extends AbilitiesSchema> extends WSServerClient {\n\tisRejected?: boolean;\n\tsessionProps?: Partial<SessionDoc>;\n\tuser?: User<AS>;\n\tlastUserId?: string;\n\tsession?: Session<AS>;\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["Users", "Err", "includesAll", "isEmpty", "AbilityError", "RolesError", "SubordinationError", "regexps", "setupHandlers", "wss", "users", "roles", "sessions", "avatars", "orgs", "abilities", "user", "email", "AbilityError", "regexps", "Err", "roleIds", "orgId", "rest", "includesAll", "RolesError", "SubordinationError", "userId", "newPassword", "updates", "isEmpty", "sessionId", "_id", "type", "size", "_", "data", "org", "roleId", "role", "_abilities", "abilityLongId", "set", "paramId", "value", "_ids", "includesAny", "intersection", "pick", "CollectionMapPublication", "Publication", "AbilitiesPublication", "abilities", "user", "RolesPublication", "roles", "options", "projection", "sort", "transform", "roleDoc", "involves", "inheritedAbilities", "displayTitle", "_o", "userSubscriptionChangeListenerMap", "UserPublication", "users", "fieldsToUpdate", "isPublic", "key", "fieldsToPick", "subscription", "_id", "changeListener", "next", "session", "isSessionIdRequired", "userDoc", "UsersPublication", "wssc", "UsersExtendedPublication", "triggers", "SessionsPublication", "sessions", "userId", "OrgsPublication", "orgs", "orgDoc", "org", "OrgsExtendedPublication", "ownerIds", "slaveOrgs", "UsersServer", "_UsersServer", "options", "#initPromise", "#userWsMap", "#sessionsWsMap", "wss", "collections", "users", "isPublic", "publicationOptions", "extendedPublicationOptions", "userPublicationOptions", "rolesOptions", "orgsOptions", "incomingTransport", "rolesPublicationOptions", "orgsPublicationOptions", "orgsExtendedPublicationOptions", "Users", "user", "#handleUserCreate", "AbilitiesPublication", "RolesPublication", "UsersPublication", "UsersExtendedPublication", "OrgsPublication", "OrgsExtendedPublication", "SessionsPublication", "#handleUserIsOnline", "setupHandlers", "UserPublication", "#handleSessionDelete", "#handleUserPermissionsChange", "#handleClientRequestLogin", "#handleClientRequestLogout", "#handleClientClosed", "#makeSessionProps", "userAgent", "remoteAddress", "sessionProps", "wssc", "session", "shouldProlong", "_id", "isOnline", "updates", "usersSubscription", "webSockets", "email", "password", "WSServerClient", "WSSCWithUser"]
|
|
7
7
|
}
|
package/dist/publications.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import type { AbilitiesSchema } from "insite-common";
|
|
2
2
|
import { Sort } from "insite-db";
|
|
3
3
|
import { CollectionMapPublication, Projection, Publication } from "insite-subscriptions-server/ws";
|
|
4
|
-
import type { AbilitiesMap, OrgDoc, Orgs, RoleDoc, Roles, SessionDoc, Sessions, UserDoc, Users } from "insite-users-server";
|
|
5
|
-
export declare class AbilitiesPublication<AS extends AbilitiesSchema> extends Publication<AS
|
|
4
|
+
import type { AbilitiesMap, OrgDoc, Orgs, RoleDoc, Roles, Session, SessionDoc, Sessions, User, UserDoc, Users } from "insite-users-server";
|
|
5
|
+
export declare class AbilitiesPublication<AS extends AbilitiesSchema> extends Publication<AS, [], User<AS>, Session<AS>> {
|
|
6
6
|
constructor(abilities: AbilitiesMap<AS>);
|
|
7
7
|
}
|
|
8
8
|
export type RolesPublicationOptions = {
|
|
@@ -10,7 +10,7 @@ export type RolesPublicationOptions = {
|
|
|
10
10
|
sort?: Sort;
|
|
11
11
|
transform?: (roleDoc: object) => void;
|
|
12
12
|
};
|
|
13
|
-
export declare class RolesPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, RoleDoc
|
|
13
|
+
export declare class RolesPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, RoleDoc, [], User<AS>, Session<AS>> {
|
|
14
14
|
constructor(roles: Roles<AS>, options?: RolesPublicationOptions);
|
|
15
15
|
}
|
|
16
16
|
export type UserPublicationOptions = {
|
|
@@ -19,7 +19,7 @@ export type UserPublicationOptions = {
|
|
|
19
19
|
transform?: (userDoc: object) => void;
|
|
20
20
|
public?: boolean;
|
|
21
21
|
};
|
|
22
|
-
export declare class UserPublication<AS extends AbilitiesSchema> extends Publication<AS
|
|
22
|
+
export declare class UserPublication<AS extends AbilitiesSchema> extends Publication<AS, [boolean], User<AS>, Session<AS>> {
|
|
23
23
|
constructor(users: Users<AS>, options?: UserPublicationOptions);
|
|
24
24
|
}
|
|
25
25
|
export type UsersPublicationOptions = {
|
|
@@ -27,7 +27,7 @@ export type UsersPublicationOptions = {
|
|
|
27
27
|
sort?: Sort;
|
|
28
28
|
transform?: (userDoc: object) => void;
|
|
29
29
|
};
|
|
30
|
-
export declare class UsersPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc
|
|
30
|
+
export declare class UsersPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc, [], User<AS>, Session<AS>> {
|
|
31
31
|
constructor(users: Users<AS>, options?: UsersPublicationOptions);
|
|
32
32
|
}
|
|
33
33
|
export type UsersExtendedPublicationOptions = {
|
|
@@ -36,10 +36,10 @@ export type UsersExtendedPublicationOptions = {
|
|
|
36
36
|
triggers?: string[];
|
|
37
37
|
transform?: (userDoc: object) => void;
|
|
38
38
|
};
|
|
39
|
-
export declare class UsersExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc
|
|
39
|
+
export declare class UsersExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, UserDoc, [], User<AS>, Session<AS>> {
|
|
40
40
|
constructor(users: Users<AS>, options?: UsersExtendedPublicationOptions);
|
|
41
41
|
}
|
|
42
|
-
export declare class SessionsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, SessionDoc, [
|
|
42
|
+
export declare class SessionsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, SessionDoc, [string], User<AS>, Session<AS>> {
|
|
43
43
|
constructor(sessions: Sessions<AS>);
|
|
44
44
|
}
|
|
45
45
|
export type OrgsPublicationOptions = {
|
|
@@ -47,7 +47,7 @@ export type OrgsPublicationOptions = {
|
|
|
47
47
|
sort?: Sort;
|
|
48
48
|
transform?: (orgDoc: object) => void;
|
|
49
49
|
};
|
|
50
|
-
export declare class OrgsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc
|
|
50
|
+
export declare class OrgsPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc, [], User<AS>, Session<AS>> {
|
|
51
51
|
constructor(orgs: Orgs<AS>, options?: OrgsPublicationOptions);
|
|
52
52
|
}
|
|
53
53
|
export type OrgsExtendedPublicationOptions = {
|
|
@@ -56,7 +56,7 @@ export type OrgsExtendedPublicationOptions = {
|
|
|
56
56
|
triggers?: string[];
|
|
57
57
|
transform?: (orgDoc: object) => void;
|
|
58
58
|
};
|
|
59
|
-
export declare class OrgsExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc
|
|
59
|
+
export declare class OrgsExtendedPublication<AS extends AbilitiesSchema> extends CollectionMapPublication<AS, OrgDoc, [], User<AS>, Session<AS>> {
|
|
60
60
|
constructor(orgs: Orgs<AS>, options?: OrgsExtendedPublicationOptions);
|
|
61
61
|
}
|
|
62
62
|
//# sourceMappingURL=publications.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"publications.d.ts","sourceRoot":"","sources":["../src/publications.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AACrD,OAAO,EAAwB,IAAI,EAAE,MAAM,WAAW,CAAC;AACvD,OAAO,
|
|
1
|
+
{"version":3,"file":"publications.d.ts","sourceRoot":"","sources":["../src/publications.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,42 +1,54 @@
|
|
|
1
1
|
{
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
2
|
+
"name": "insite-users-server-ws",
|
|
3
|
+
"version": "2.4.0",
|
|
4
|
+
"description": "WebSocket API for users in inSite",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"insite",
|
|
7
|
+
"users",
|
|
8
|
+
"websocket",
|
|
9
|
+
"server"
|
|
10
|
+
],
|
|
11
|
+
"homepage": "https://github.com/nesvet/insite#readme",
|
|
12
|
+
"bugs": {
|
|
13
|
+
"url": "https://github.com/nesvet/insite/issues"
|
|
14
|
+
},
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/nesvet/insite.git",
|
|
18
|
+
"directory": "packages/users-server-ws"
|
|
19
|
+
},
|
|
20
|
+
"funding": {
|
|
21
|
+
"type": "patreon",
|
|
22
|
+
"url": "https://www.patreon.com/nesvet"
|
|
23
|
+
},
|
|
24
|
+
"license": "MIT",
|
|
25
|
+
"author": "Eugene Nesvetaev <dev@nesvet.dev> (https://nesvet.dev/)",
|
|
26
|
+
"type": "module",
|
|
27
|
+
"main": "./dist/index.js",
|
|
28
|
+
"module": "./dist/index.js",
|
|
29
|
+
"files": [
|
|
30
|
+
"dist",
|
|
31
|
+
"README.md",
|
|
32
|
+
"LICENSE"
|
|
33
|
+
],
|
|
34
|
+
"scripts": {
|
|
35
|
+
"build": "bun .conveyer.js",
|
|
36
|
+
"postbuild": "tsc -p .",
|
|
37
|
+
"clean": "rm -rf dist",
|
|
38
|
+
"test": "echo \"Error: no test specified\" && exit 1",
|
|
39
|
+
"typecheck": "tsc --noEmit"
|
|
40
|
+
},
|
|
41
|
+
"dependencies": {
|
|
42
|
+
"@nesvet/n": "^1.2.1",
|
|
43
|
+
"insite-common": "^2.4.0",
|
|
44
|
+
"insite-db": "^2.4.0",
|
|
45
|
+
"insite-subscriptions-server": "^2.4.0",
|
|
46
|
+
"insite-users-server": "^2.4.0",
|
|
47
|
+
"insite-ws": "^2.4.0",
|
|
48
|
+
"insite-ws-transfers": "^2.4.0"
|
|
49
|
+
},
|
|
50
|
+
"packageManager": "bun@1.3.9",
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">=20.0.0"
|
|
53
|
+
}
|
|
42
54
|
}
|