@lilaquadrat/studio 11.4.1 → 11.4.2
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/lib/src/services/jetstream.service.js +2 -1
- package/lib/src/services/jetstream.service.js.map +1 -1
- package/lib/src/services/memory-cache.service.d.ts +6 -1
- package/lib/src/services/memory-cache.service.js +8 -1
- package/lib/src/services/memory-cache.service.js.map +1 -1
- package/lib/src/services/participants.service.js +25 -5
- package/lib/src/services/participants.service.js.map +1 -1
- package/lib/tests/memoryCache.spec.d.ts +1 -0
- package/lib/tests/memoryCache.spec.js +32 -0
- package/lib/tests/memoryCache.spec.js.map +1 -0
- package/lib/tests/participantsCheckAccess.spec.d.ts +1 -0
- package/lib/tests/participantsCheckAccess.spec.js +42 -0
- package/lib/tests/participantsCheckAccess.spec.js.map +1 -0
- package/package.json +1 -1
|
@@ -126,7 +126,8 @@ export class JetStreamService {
|
|
|
126
126
|
catch (error) {
|
|
127
127
|
logger.error(`jetstream.message.error.${options.streamName}.${options.consumerName}`, error);
|
|
128
128
|
message.ack();
|
|
129
|
-
|
|
129
|
+
// skip only this message; leaving the loop would stop the consumer for the process lifetime
|
|
130
|
+
continue;
|
|
130
131
|
}
|
|
131
132
|
try {
|
|
132
133
|
const messageWithDecoded = { data: decodedData, subject: message.subject };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"jetstream.service.js","sourceRoot":"","sources":["../../../src/services/jetstream.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAyC,MAAM,yBAAyB,CAAC;AAC7G,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,eAAe,EAGf,iBAAiB,EACjB,iBAAiB,GAKlB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,MAAM,MAAM,cAAc,CAAC;AAElC,MAAM,OAAO,gBAAgB;IAA7B;QAEU,eAAU,GAA0B,IAAI,CAAC;QAEzC,OAAE,GAA2B,IAAI,CAAC;QAElC,QAAG,GAA4B,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"jetstream.service.js","sourceRoot":"","sources":["../../../src/services/jetstream.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,7 +19,12 @@ declare class MemoryCache {
|
|
|
19
19
|
static clearUsers(users: string[]): void;
|
|
20
20
|
static upsert(cacheKey: string, data: unknown, lifetime?: number): void;
|
|
21
21
|
static get(cacheKey: string): unknown;
|
|
22
|
-
|
|
22
|
+
/**
|
|
23
|
+
* Pass a function: it only runs on a miss. The promise form is kept for older consumers, but
|
|
24
|
+
* that query has already started, so a hit does not save it — and its rejection must be
|
|
25
|
+
* observed here, or a database error on a hit becomes an unhandled rejection that ends the process.
|
|
26
|
+
*/
|
|
27
|
+
static use<T>(cacheKeyOptions: CacheKeyOptions, fetchFunction: (() => Promise<T>) | Promise<T>): Promise<T>;
|
|
23
28
|
static getCacheKey(options: CacheKeyOptions): string;
|
|
24
29
|
}
|
|
25
30
|
export default MemoryCache;
|
|
@@ -33,15 +33,22 @@ class MemoryCache {
|
|
|
33
33
|
}
|
|
34
34
|
return entry.data;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Pass a function: it only runs on a miss. The promise form is kept for older consumers, but
|
|
38
|
+
* that query has already started, so a hit does not save it — and its rejection must be
|
|
39
|
+
* observed here, or a database error on a hit becomes an unhandled rejection that ends the process.
|
|
40
|
+
*/
|
|
36
41
|
static async use(cacheKeyOptions, fetchFunction) {
|
|
37
42
|
const cacheKey = MemoryCache.getCacheKey(cacheKeyOptions);
|
|
38
43
|
const cached = MemoryCache.get(cacheKey);
|
|
39
44
|
if (cached) {
|
|
45
|
+
if (fetchFunction instanceof Promise)
|
|
46
|
+
fetchFunction.catch(() => undefined);
|
|
40
47
|
logger.debug('cache.hit', { key: cacheKey });
|
|
41
48
|
return cached;
|
|
42
49
|
}
|
|
43
50
|
logger.debug('cache.miss', { key: cacheKey });
|
|
44
|
-
const fetchedData = await fetchFunction;
|
|
51
|
+
const fetchedData = await (typeof fetchFunction === 'function' ? fetchFunction() : fetchFunction);
|
|
45
52
|
MemoryCache.upsert(cacheKey, fetchedData, cacheKeyOptions.lifetime);
|
|
46
53
|
return fetchedData;
|
|
47
54
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"memory-cache.service.js","sourceRoot":"","sources":["../../../src/services/memory-cache.service.ts"],"names":[],"mappings":"AAEA,OAAO,MAAM,MAAM,cAAc,CAAC;AAalC,MAAM,WAAW;IAIf,MAAM,CAAC,KAAK;QAEV,WAAW,CAAC,KAAK,GAAG,EAAE,CAAC;IAEzB,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,eAAgC;QAE5C,OAAO,WAAW,CAAC,KAAK,CAAC,WAAW,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC,CAAC;IAErE,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,IAAY;QAE3B,MAAM,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QAC1B,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAE3C,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAEzB,OAAO,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAEhC,CAAC;QAEH,CAAC,CAAC,CAAC;IAEL,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,KAAe;QAE/B,KAAK,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC;IAE3D,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,QAAgB,EAAE,IAAa,EAAE,QAAiB;QAE9D,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG;YACvC,IAAI;YACJ,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SAC1D,CAAC;IAEJ,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,QAAgB;QAEzB,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QAErD,IAAI,CAAC,KAAK;YAAE,OAAO,SAAS,CAAC;QAE7B,IAAI,KAAK,CAAC,SAAS,IAAI,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YAEpD,OAAO,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC9C,OAAO,SAAS,CAAC;QAEnB,CAAC;QAED,OAAO,KAAK,CAAC,IAAI,CAAC;IAEpB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,GAAG,CAAI,eAAgC,EAAE,
|
|
1
|
+
{"version":3,"file":"memory-cache.service.js","sourceRoot":"","sources":["../../../src/services/memory-cache.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,18 @@ import supportAccess from './support-access.service.js';
|
|
|
9
9
|
* so entries age out instead of holding revoked access forever.
|
|
10
10
|
*/
|
|
11
11
|
const ACCESS_CACHE_LIFETIME_MS = 30000;
|
|
12
|
+
/**
|
|
13
|
+
* Which support scope grants a participant right. Mirrors studio-chat's supportAgentRights, which
|
|
14
|
+
* derives an agent's stored rights from the same scopes: `read` and `participants` map to
|
|
15
|
+
* themselves, every content right needs `write`, and rename/block are never agent rights.
|
|
16
|
+
*/
|
|
17
|
+
function supportScopeAllows(right, scopes) {
|
|
18
|
+
if (right === 'read' || right === 'participants')
|
|
19
|
+
return scopes.has(right);
|
|
20
|
+
if (right === 'rename' || right === 'block')
|
|
21
|
+
return false;
|
|
22
|
+
return scopes.has('write');
|
|
23
|
+
}
|
|
12
24
|
/**
|
|
13
25
|
* participant collection and conversation access.
|
|
14
26
|
*
|
|
@@ -109,8 +121,8 @@ export class ParticipantsService extends Immutable {
|
|
|
109
121
|
const { conversationId, user } = settings;
|
|
110
122
|
// Fetch both in parallel with distinct cache keys to avoid collisions
|
|
111
123
|
const [conversation, participant] = await Promise.all([
|
|
112
|
-
MemoryCache.use({ type: "conversation", id: conversationId, lifetime: ACCESS_CACHE_LIFETIME_MS }, ConversationModel.db.findOne({ _id: conversationId })),
|
|
113
|
-
MemoryCache.use({ type: "participant", id: conversationId, user, lifetime: ACCESS_CACHE_LIFETIME_MS }, this.getByConversationAndUser(conversationId, user))
|
|
124
|
+
MemoryCache.use({ type: "conversation", id: conversationId, lifetime: ACCESS_CACHE_LIFETIME_MS }, () => ConversationModel.db.findOne({ _id: conversationId })),
|
|
125
|
+
MemoryCache.use({ type: "participant", id: conversationId, user, lifetime: ACCESS_CACHE_LIFETIME_MS }, () => this.getByConversationAndUser(conversationId, user))
|
|
114
126
|
]);
|
|
115
127
|
if (!participant)
|
|
116
128
|
return false;
|
|
@@ -128,9 +140,17 @@ export class ParticipantsService extends Immutable {
|
|
|
128
140
|
* `role: 'agent'` is only ever set on support participants (participantsService
|
|
129
141
|
* .markSupportAgents), so this touches nobody else — least of all a support agent's own
|
|
130
142
|
* support conversation, where they are the customer and carry no role.
|
|
143
|
+
*
|
|
144
|
+
* The same goes for a *reduced* scope set: an agent's rights are written once, from the
|
|
145
|
+
* scopes they held when they joined, so the stored rights are capped by the current scopes.
|
|
131
146
|
*/
|
|
132
|
-
|
|
133
|
-
|
|
147
|
+
let rights = participant.rights ?? [];
|
|
148
|
+
if (conversation.operationMode === 'support' && participant.role === 'agent') {
|
|
149
|
+
const scopes = await supportAccess.scopes(user);
|
|
150
|
+
if (!scopes.size)
|
|
151
|
+
return false;
|
|
152
|
+
rights = rights.filter((right) => supportScopeAllows(right, scopes));
|
|
153
|
+
}
|
|
134
154
|
// Validate participant membership (cheap array includes)
|
|
135
155
|
if (!conversation.participants?.includes(user) && !requiredAnyStatus.some((single) => ['left', 'removed'].includes(single)))
|
|
136
156
|
return false;
|
|
@@ -138,7 +158,7 @@ export class ParticipantsService extends Immutable {
|
|
|
138
158
|
if (!requiredAnyStatus.includes(participant.state))
|
|
139
159
|
return false;
|
|
140
160
|
// Rights check (all required must be present)
|
|
141
|
-
if (requiredRights && !requiredRights.every(r =>
|
|
161
|
+
if (requiredRights && !requiredRights.every(r => rights.includes(r)))
|
|
142
162
|
return false;
|
|
143
163
|
return true;
|
|
144
164
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"participants.service.js","sourceRoot":"","sources":["../../../src/services/participants.service.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,gBAAgB,MAAM,gCAAgC,CAAC;AAC9D,OAAO,iBAAiB,MAAM,iCAAiC,CAAC;AAEhE,OAAO,WAAW,MAAM,2BAA2B,CAAC;AACpD,OAAO,aAAa,MAAM,6BAA6B,CAAC;AAExD;;;;GAIG;AACH,MAAM,wBAAwB,GAAG,KAAK,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,OAAO,mBAAoB,SAAQ,SAAsB;IAA/D;;QAEE,UAAK,GAAG,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"participants.service.js","sourceRoot":"","sources":["../../../src/services/participants.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { jest, describe, it, expect, beforeEach } from '@jest/globals';
|
|
2
|
+
import MemoryCache from '../src/services/memory-cache.service';
|
|
3
|
+
describe('MemoryCache.use', () => {
|
|
4
|
+
beforeEach(() => MemoryCache.clear());
|
|
5
|
+
it('runs a fetch function only on a miss', async () => {
|
|
6
|
+
const fetch = jest.fn(async () => ({ name: 'conversation' }));
|
|
7
|
+
await MemoryCache.use({ type: 'conversation', id: 'a' }, fetch);
|
|
8
|
+
const cached = await MemoryCache.use({ type: 'conversation', id: 'a' }, fetch);
|
|
9
|
+
expect(cached).toEqual({ name: 'conversation' });
|
|
10
|
+
expect(fetch).toHaveBeenCalledTimes(1);
|
|
11
|
+
});
|
|
12
|
+
it('observes the rejection of a started promise on a hit', async () => {
|
|
13
|
+
await MemoryCache.use({ type: 'conversation', id: 'a' }, Promise.resolve({ name: 'conversation' }));
|
|
14
|
+
const unhandled = jest.fn();
|
|
15
|
+
process.on('unhandledRejection', unhandled);
|
|
16
|
+
const cached = await MemoryCache.use({ type: 'conversation', id: 'a' }, Promise.reject(new Error('database down')));
|
|
17
|
+
await new Promise((resolve) => setImmediate(resolve));
|
|
18
|
+
process.off('unhandledRejection', unhandled);
|
|
19
|
+
expect(cached).toEqual({ name: 'conversation' });
|
|
20
|
+
expect(unhandled).not.toHaveBeenCalled();
|
|
21
|
+
});
|
|
22
|
+
it('fetches again once the lifetime has passed', async () => {
|
|
23
|
+
const fetch = jest.fn(async () => ({ name: 'conversation' }));
|
|
24
|
+
const now = jest.spyOn(Date, 'now').mockReturnValue(1000);
|
|
25
|
+
await MemoryCache.use({ type: 'conversation', id: 'a', lifetime: 100 }, fetch);
|
|
26
|
+
now.mockReturnValue(1200);
|
|
27
|
+
await MemoryCache.use({ type: 'conversation', id: 'a', lifetime: 100 }, fetch);
|
|
28
|
+
now.mockRestore();
|
|
29
|
+
expect(fetch).toHaveBeenCalledTimes(2);
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=memoryCache.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memoryCache.spec.js","sourceRoot":"","sources":["../../tests/memoryCache.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { jest, describe, it, expect, beforeEach, afterEach } from '@jest/globals';
|
|
2
|
+
import { ObjectId } from 'mongodb';
|
|
3
|
+
import participantsService from '../src/services/participants.service';
|
|
4
|
+
import supportAccess from '../src/services/support-access.service';
|
|
5
|
+
import MemoryCache from '../src/services/memory-cache.service';
|
|
6
|
+
const CONVERSATION_ID = new ObjectId('507f1f77bcf86cd799439011');
|
|
7
|
+
const AGENT = 'agent-1';
|
|
8
|
+
const agentParticipant = {
|
|
9
|
+
user: AGENT,
|
|
10
|
+
conversation: CONVERSATION_ID,
|
|
11
|
+
state: 'active',
|
|
12
|
+
role: 'agent',
|
|
13
|
+
rights: ['read', 'write', 'files', 'participants'],
|
|
14
|
+
};
|
|
15
|
+
describe('ParticipantsService.checkAccess for support agents', () => {
|
|
16
|
+
beforeEach(() => {
|
|
17
|
+
MemoryCache.clear();
|
|
18
|
+
MemoryCache.upsert(MemoryCache.getCacheKey({ type: 'conversation', id: CONVERSATION_ID }), { _id: CONVERSATION_ID, operationMode: 'support', participants: [AGENT, 'customer'] });
|
|
19
|
+
jest.spyOn(participantsService, 'getByConversationAndUser').mockResolvedValue(agentParticipant);
|
|
20
|
+
});
|
|
21
|
+
afterEach(() => {
|
|
22
|
+
jest.restoreAllMocks();
|
|
23
|
+
});
|
|
24
|
+
it('caps stored rights by the current scopes', async () => {
|
|
25
|
+
jest.spyOn(supportAccess, 'scopes').mockResolvedValue(new Set(['read']));
|
|
26
|
+
const settings = { conversationId: CONVERSATION_ID, user: AGENT };
|
|
27
|
+
await expect(participantsService.checkAccess(['active'], ['read'], settings)).resolves.toBe(true);
|
|
28
|
+
await expect(participantsService.checkAccess(['active'], ['write'], settings)).resolves.toBe(false);
|
|
29
|
+
await expect(participantsService.checkAccess(['active'], ['participants'], settings)).resolves.toBe(false);
|
|
30
|
+
});
|
|
31
|
+
it('keeps stored rights the scopes still grant', async () => {
|
|
32
|
+
jest.spyOn(supportAccess, 'scopes').mockResolvedValue(new Set(['read', 'write', 'participants']));
|
|
33
|
+
const settings = { conversationId: CONVERSATION_ID, user: AGENT };
|
|
34
|
+
await expect(participantsService.checkAccess(['active'], ['write'], settings)).resolves.toBe(true);
|
|
35
|
+
await expect(participantsService.checkAccess(['active'], ['participants'], settings)).resolves.toBe(true);
|
|
36
|
+
});
|
|
37
|
+
it('denies an agent without any support scope', async () => {
|
|
38
|
+
jest.spyOn(supportAccess, 'scopes').mockResolvedValue(new Set());
|
|
39
|
+
await expect(participantsService.checkAccess(['active'], undefined, { conversationId: CONVERSATION_ID, user: AGENT })).resolves.toBe(false);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=participantsCheckAccess.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"participantsCheckAccess.spec.js","sourceRoot":"","sources":["../../tests/participantsCheckAccess.spec.ts"],"names":[],"mappings":"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"}
|