@wireapp/core 46.46.6-beta.10.d7a6c4c53 → 46.46.6-beta.14.f6fd03fe6
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/Account.d.ts +51 -168
- package/lib/Account.d.ts.map +1 -1
- package/lib/Account.js +127 -517
- package/lib/Account.test.js +147 -158
- package/lib/broadcast/AvailabilityType.d.ts +1 -1
- package/lib/broadcast/AvailabilityType.d.ts.map +1 -1
- package/lib/broadcast/BroadcastService.d.ts +1 -1
- package/lib/broadcast/BroadcastService.d.ts.map +1 -1
- package/lib/broadcast/BroadcastService.js +1 -1
- package/lib/client/ClientService.d.ts +3 -4
- package/lib/client/ClientService.d.ts.map +1 -1
- package/lib/client/ClientService.js +5 -19
- package/lib/conversation/AbortReason.d.ts +1 -1
- package/lib/conversation/AbortReason.d.ts.map +1 -1
- package/lib/conversation/AssetService/AssetService.d.ts +30 -12
- package/lib/conversation/AssetService/AssetService.d.ts.map +1 -1
- package/lib/conversation/AssetService/AssetService.js +10 -1
- package/lib/conversation/AssetService/AssetService.test.js +3 -8
- package/lib/conversation/ClientActionType.d.ts +1 -1
- package/lib/conversation/ClientActionType.d.ts.map +1 -1
- package/lib/conversation/ClientActionType.js +1 -1
- package/lib/conversation/ConversationService/ConversationService.d.ts +14 -98
- package/lib/conversation/ConversationService/ConversationService.d.ts.map +1 -1
- package/lib/conversation/ConversationService/ConversationService.js +101 -314
- package/lib/conversation/ConversationService/ConversationService.test.js +47 -441
- package/lib/conversation/ConversationService/ConversationService.types.d.ts +4 -5
- package/lib/conversation/ConversationService/ConversationService.types.d.ts.map +1 -1
- package/lib/conversation/ConversationService/Utility/getConversationQualifiedMembers.d.ts.map +1 -1
- package/lib/conversation/ConversationService/Utility/getConversationQualifiedMembers.js +3 -6
- package/lib/conversation/SubconversationService/SubconversationService.d.ts.map +1 -1
- package/lib/conversation/SubconversationService/SubconversationService.js +11 -158
- package/lib/conversation/SubconversationService/SubconversationService.test.js +2 -8
- package/lib/conversation/content/AssetContent.d.ts +1 -1
- package/lib/conversation/content/AssetContent.d.ts.map +1 -1
- package/lib/conversation/content/ButtonActionConfirmationContent.d.ts +1 -1
- package/lib/conversation/content/ButtonActionConfirmationContent.d.ts.map +1 -1
- package/lib/conversation/content/ButtonActionContent.d.ts +1 -1
- package/lib/conversation/content/ButtonActionContent.d.ts.map +1 -1
- package/lib/conversation/content/ClearedContent.d.ts +1 -1
- package/lib/conversation/content/ClearedContent.d.ts.map +1 -1
- package/lib/conversation/content/ClientActionContent.d.ts +1 -1
- package/lib/conversation/content/ClientActionContent.d.ts.map +1 -1
- package/lib/conversation/content/CompositeContent.d.ts +1 -1
- package/lib/conversation/content/CompositeContent.d.ts.map +1 -1
- package/lib/conversation/content/ConfirmationContent.d.ts +1 -1
- package/lib/conversation/content/ConfirmationContent.d.ts.map +1 -1
- package/lib/conversation/content/DeletedContent.d.ts +1 -1
- package/lib/conversation/content/DeletedContent.d.ts.map +1 -1
- package/lib/conversation/content/HiddenContent.d.ts +1 -1
- package/lib/conversation/content/HiddenContent.d.ts.map +1 -1
- package/lib/conversation/content/KnockContent.d.ts +1 -1
- package/lib/conversation/content/KnockContent.d.ts.map +1 -1
- package/lib/conversation/content/LinkPreviewContent.d.ts +1 -1
- package/lib/conversation/content/LinkPreviewContent.d.ts.map +1 -1
- package/lib/conversation/content/MentionContent.d.ts +1 -1
- package/lib/conversation/content/MentionContent.d.ts.map +1 -1
- package/lib/conversation/content/MultipartContent.d.ts +1 -1
- package/lib/conversation/content/MultipartContent.d.ts.map +1 -1
- package/lib/conversation/content/QuoteContent.d.ts +1 -1
- package/lib/conversation/content/QuoteContent.d.ts.map +1 -1
- package/lib/conversation/content/TweetContent.d.ts +1 -1
- package/lib/conversation/content/TweetContent.d.ts.map +1 -1
- package/lib/conversation/content/index.d.ts +1 -1
- package/lib/conversation/content/index.d.ts.map +1 -1
- package/lib/conversation/content/index.js +1 -1
- package/lib/conversation/message/MessageBuilder.d.ts +1 -1
- package/lib/conversation/message/MessageBuilder.d.ts.map +1 -1
- package/lib/conversation/message/MessageBuilder.js +1 -1
- package/lib/conversation/message/MessageService.d.ts.map +1 -1
- package/lib/conversation/message/MessageService.js +1 -1
- package/lib/conversation/message/MessageService.test.js +1 -7
- package/lib/conversation/message/MessageToProtoMapper.d.ts +1 -1
- package/lib/conversation/message/MessageToProtoMapper.d.ts.map +1 -1
- package/lib/conversation/message/MessageToProtoMapper.js +1 -1
- package/lib/conversation/message/messageSender.js +2 -2
- package/lib/cryptography/AssetCryptography/EncryptedAsset.d.ts +2 -2
- package/lib/cryptography/AssetCryptography/EncryptedAsset.d.ts.map +1 -1
- package/lib/messagingProtocols/common.types.d.ts +0 -9
- package/lib/messagingProtocols/common.types.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIService.types.d.ts +2 -2
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIService.types.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIService.types.js +1 -2
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIServiceExternal.d.ts +1 -1
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIServiceExternal.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIServiceExternal.js +11 -13
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIServiceExternal.test.js +16 -21
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIServiceInternal.d.ts +3 -9
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIServiceInternal.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/E2EIdentityService/E2EIServiceInternal.js +12 -31
- package/lib/messagingProtocols/mls/E2EIdentityService/Helper/index.d.ts +0 -6
- package/lib/messagingProtocols/mls/E2EIdentityService/Helper/index.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/E2EIdentityService/Helper/index.js +1 -19
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/IncomingMessagesQueue/IncomingMesssagesQueue.d.ts +4 -0
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/IncomingMessagesQueue/IncomingMesssagesQueue.d.ts.map +1 -0
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/IncomingMessagesQueue/IncomingMesssagesQueue.js +69 -0
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/IncomingMessagesQueue/index.d.ts +2 -0
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/{IncomingProposalsQueue → IncomingMessagesQueue}/index.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/{IncomingProposalsQueue → IncomingMessagesQueue}/index.js +1 -1
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/index.d.ts +1 -0
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/index.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/index.js +1 -0
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/messageAdd.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/messageAdd.js +14 -23
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/messageAdd.test.d.ts +2 -0
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/messageAdd.test.d.ts.map +1 -0
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/messageAdd.test.js +98 -0
- package/lib/messagingProtocols/mls/EventHandler/events/welcomeMessage/welcomeMessage.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/EventHandler/events/welcomeMessage/welcomeMessage.js +2 -5
- package/lib/messagingProtocols/mls/EventHandler/events/welcomeMessage/welcomeMessage.test.js +3 -13
- package/lib/messagingProtocols/mls/MLSService/CoreCryptoMLSError.d.ts +2 -38
- package/lib/messagingProtocols/mls/MLSService/CoreCryptoMLSError.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/MLSService/CoreCryptoMLSError.js +6 -41
- package/lib/messagingProtocols/mls/MLSService/MLSService.d.ts +34 -38
- package/lib/messagingProtocols/mls/MLSService/MLSService.d.ts.map +1 -1
- package/lib/messagingProtocols/mls/MLSService/MLSService.js +208 -267
- package/lib/messagingProtocols/mls/MLSService/MLSService.test.js +160 -157
- package/lib/messagingProtocols/mls/MLSService/commitBundleUtil.js +3 -3
- package/lib/messagingProtocols/mls/MLSService/commitBundleUtil.test.js +5 -5
- package/lib/messagingProtocols/mls/conversationRejoinQueue.js +2 -2
- package/lib/messagingProtocols/mls/types.d.ts +8 -0
- package/lib/messagingProtocols/mls/types.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/EventHandler/events/otrMessageAdd/otrMessageAdd.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/EventHandler/events/otrMessageAdd/otrMessageAdd.js +1 -7
- package/lib/messagingProtocols/proteus/ProteusService/CryptoClient/CoreCryptoWrapper/CoreCryptoWrapper.d.ts +15 -8
- package/lib/messagingProtocols/proteus/ProteusService/CryptoClient/CoreCryptoWrapper/CoreCryptoWrapper.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/ProteusService/CryptoClient/CoreCryptoWrapper/CoreCryptoWrapper.js +62 -97
- package/lib/messagingProtocols/proteus/ProteusService/CryptoClient/CryptoClient.types.d.ts +6 -0
- package/lib/messagingProtocols/proteus/ProteusService/CryptoClient/CryptoClient.types.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/ProteusService/DecryptionErrorGenerator/DecryptionErrorGenerator.d.ts +6 -1
- package/lib/messagingProtocols/proteus/ProteusService/DecryptionErrorGenerator/DecryptionErrorGenerator.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/ProteusService/DecryptionErrorGenerator/DecryptionErrorGenerator.js +22 -19
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.d.ts +3 -5
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.js +24 -11
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.mocks.d.ts +0 -1
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.mocks.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.mocks.js +2 -11
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.test.js +9 -13
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.types.d.ts +2 -3
- package/lib/messagingProtocols/proteus/ProteusService/ProteusService.types.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/ProteusService/WithMockedGenerics.test.js +4 -11
- package/lib/messagingProtocols/proteus/ProteusService/cryptoMigrationStateStore.d.ts +4 -0
- package/lib/messagingProtocols/proteus/ProteusService/cryptoMigrationStateStore.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/ProteusService/cryptoMigrationStateStore.js +5 -0
- package/lib/messagingProtocols/proteus/ProteusService/identityClearer.d.ts +1 -2
- package/lib/messagingProtocols/proteus/ProteusService/identityClearer.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/ProteusService/identityClearer.js +2 -8
- package/lib/messagingProtocols/proteus/Utility/SessionHandler/SessionHandler.test.js +0 -4
- package/lib/messagingProtocols/proteus/Utility/getGenericMessageParams.d.ts +1 -1
- package/lib/messagingProtocols/proteus/Utility/getGenericMessageParams.d.ts.map +1 -1
- package/lib/messagingProtocols/proteus/Utility/getGenericMessageParams.js +1 -1
- package/lib/notification/NotificationService.d.ts +6 -20
- package/lib/notification/NotificationService.d.ts.map +1 -1
- package/lib/notification/NotificationService.js +14 -23
- package/lib/notification/NotificationService.test.js +0 -8
- package/lib/secretStore/secretKeyGenerator.d.ts +0 -1
- package/lib/secretStore/secretKeyGenerator.d.ts.map +1 -1
- package/lib/secretStore/secretKeyGenerator.js +1 -3
- package/lib/self/SelfService.d.ts +2 -2
- package/lib/self/SelfService.d.ts.map +1 -1
- package/lib/self/SelfService.test.js +2 -5
- package/lib/team/TeamService.d.ts +2 -5
- package/lib/team/TeamService.d.ts.map +1 -1
- package/lib/team/TeamService.js +2 -12
- package/lib/user/UserService.d.ts +2 -2
- package/lib/user/UserService.d.ts.map +1 -1
- package/lib/user/UserService.js +3 -3
- package/lib/util/TypePredicateUtil.d.ts.map +1 -1
- package/lib/util/TypePredicateUtil.js +2 -2
- package/package.json +3 -3
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/IncomingProposalsQueue/IncomingProposalsQueue.d.ts +0 -7
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/IncomingProposalsQueue/IncomingProposalsQueue.d.ts.map +0 -1
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/IncomingProposalsQueue/IncomingProposalsQueue.js +0 -48
- package/lib/messagingProtocols/mls/EventHandler/events/messageAdd/IncomingProposalsQueue/index.d.ts +0 -2
- package/lib/messagingProtocols/mls/MLSService/CoreCryptoMLSError.test.d.ts +0 -2
- package/lib/messagingProtocols/mls/MLSService/CoreCryptoMLSError.test.d.ts.map +0 -1
- package/lib/messagingProtocols/mls/MLSService/CoreCryptoMLSError.test.js +0 -124
- package/lib/messagingProtocols/mls/recovery/MlsErrorMapper.d.ts +0 -78
- package/lib/messagingProtocols/mls/recovery/MlsErrorMapper.d.ts.map +0 -1
- package/lib/messagingProtocols/mls/recovery/MlsErrorMapper.js +0 -173
- package/lib/messagingProtocols/mls/recovery/MlsErrorMapper.test.d.ts +0 -2
- package/lib/messagingProtocols/mls/recovery/MlsErrorMapper.test.d.ts.map +0 -1
- package/lib/messagingProtocols/mls/recovery/MlsErrorMapper.test.js +0 -117
- package/lib/messagingProtocols/mls/recovery/MlsRecoveryOrchestrator.d.ts +0 -167
- package/lib/messagingProtocols/mls/recovery/MlsRecoveryOrchestrator.d.ts.map +0 -1
- package/lib/messagingProtocols/mls/recovery/MlsRecoveryOrchestrator.js +0 -317
- package/lib/messagingProtocols/mls/recovery/MlsRecoveryOrchestrator.test.d.ts +0 -2
- package/lib/messagingProtocols/mls/recovery/MlsRecoveryOrchestrator.test.d.ts.map +0 -1
- package/lib/messagingProtocols/mls/recovery/MlsRecoveryOrchestrator.test.js +0 -248
- package/lib/messagingProtocols/mls/recovery/index.d.ts +0 -5
- package/lib/messagingProtocols/mls/recovery/index.d.ts.map +0 -1
- package/lib/messagingProtocols/mls/recovery/index.js +0 -28
- package/lib/test/StoreHelper.d.ts +0 -2
- package/lib/test/StoreHelper.d.ts.map +0 -1
- package/lib/test/StoreHelper.js +0 -27
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProteusService.mocks.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/ProteusService.mocks.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"ProteusService.mocks.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/ProteusService.mocks.ts"],"names":[],"mappings":"AAqBA,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAE9C,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAE5C,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAIhD,eAAO,MAAM,mBAAmB,QAAa,OAAO,CAClD,CAAC,cAAc,EAAE;IAAC,SAAS,EAAE,SAAS,CAAC;IAAC,YAAY,EAAE,YAAY,CAAA;CAAC,CAAC,CAgBrE,CAAC"}
|
|
@@ -18,32 +18,23 @@
|
|
|
18
18
|
*
|
|
19
19
|
*/
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
exports.
|
|
21
|
+
exports.buildProteusService = void 0;
|
|
22
22
|
const client_1 = require("@wireapp/api-client/lib/client");
|
|
23
23
|
const api_client_1 = require("@wireapp/api-client");
|
|
24
24
|
const CoreCryptoWrapper_1 = require("./CryptoClient/CoreCryptoWrapper/CoreCryptoWrapper");
|
|
25
25
|
const ProteusService_1 = require("./ProteusService");
|
|
26
26
|
const PayloadHelper_1 = require("../../../test/PayloadHelper");
|
|
27
|
-
const StoreHelper_1 = require("../../../test/StoreHelper");
|
|
28
|
-
const createdApiClients = [];
|
|
29
27
|
const buildProteusService = async () => {
|
|
30
28
|
const apiClient = new api_client_1.APIClient({ urls: api_client_1.APIClient.BACKEND.STAGING });
|
|
31
|
-
createdApiClients.push(apiClient);
|
|
32
29
|
apiClient.context = {
|
|
33
30
|
clientType: client_1.ClientType.NONE,
|
|
34
31
|
userId: (0, PayloadHelper_1.getUUID)(),
|
|
35
32
|
clientId: (0, PayloadHelper_1.getUUID)(),
|
|
36
33
|
};
|
|
37
34
|
const cryptoClient = new CoreCryptoWrapper_1.CoreCryptoWrapper({}, {});
|
|
38
|
-
const storeEngine = await (0, StoreHelper_1.createMemoryEngine)('proteus-service-test');
|
|
39
35
|
const proteusService = new ProteusService_1.ProteusService(apiClient, cryptoClient, {
|
|
40
36
|
nbPrekeys: 0,
|
|
41
|
-
}
|
|
37
|
+
});
|
|
42
38
|
return [proteusService, { apiClient, cryptoClient }];
|
|
43
39
|
};
|
|
44
40
|
exports.buildProteusService = buildProteusService;
|
|
45
|
-
const cleanupProteusServiceMocks = () => {
|
|
46
|
-
createdApiClients.forEach(client => client.disconnect());
|
|
47
|
-
createdApiClients.length = 0;
|
|
48
|
-
};
|
|
49
|
-
exports.cleanupProteusServiceMocks = cleanupProteusServiceMocks;
|
|
@@ -49,10 +49,9 @@ const MessageBuilder_1 = require("../../../conversation/message/MessageBuilder")
|
|
|
49
49
|
const ProteusService_mocks_1 = require("./ProteusService.mocks");
|
|
50
50
|
const SessionHandler_1 = require("../Utility/SessionHandler");
|
|
51
51
|
const event_1 = require("@wireapp/api-client/lib/event");
|
|
52
|
-
const protocol_messaging_1 = require("@
|
|
52
|
+
const protocol_messaging_1 = require("@pydio/protocol-messaging");
|
|
53
53
|
const errors_1 = require("../../../errors");
|
|
54
54
|
const testUtils_1 = require("../../../testUtils");
|
|
55
|
-
const team_1 = require("@wireapp/api-client/lib/team");
|
|
56
55
|
jest.mock('./CryptoClient/CoreCryptoWrapper/PrekeysTracker', () => {
|
|
57
56
|
return {
|
|
58
57
|
PrekeyTracker: jest.fn().mockImplementation(() => {
|
|
@@ -128,9 +127,6 @@ const prepareDataForEncryption = async () => {
|
|
|
128
127
|
};
|
|
129
128
|
};
|
|
130
129
|
describe('ProteusService', () => {
|
|
131
|
-
afterAll(() => {
|
|
132
|
-
(0, ProteusService_mocks_1.cleanupProteusServiceMocks)();
|
|
133
|
-
});
|
|
134
130
|
const domain1 = 'domain1';
|
|
135
131
|
const domain2 = 'domain2';
|
|
136
132
|
const domain3 = 'domain3';
|
|
@@ -350,7 +346,7 @@ describe('ProteusService', () => {
|
|
|
350
346
|
const params = {
|
|
351
347
|
conversationId: (0, testUtils_1.generateQualifiedId)('domain'),
|
|
352
348
|
payload: message,
|
|
353
|
-
protocol:
|
|
349
|
+
protocol: conversation_1.ConversationProtocol.PROTEUS,
|
|
354
350
|
targetMode: conversation_2.MessageTargetMode.USERS,
|
|
355
351
|
};
|
|
356
352
|
try {
|
|
@@ -375,7 +371,7 @@ describe('ProteusService', () => {
|
|
|
375
371
|
MockedRecipients.getRecipientsForConversation.mockResolvedValue({});
|
|
376
372
|
jest.spyOn(proteusService['messageService'], 'sendMessage').mockReturnValue(Promise.resolve({}));
|
|
377
373
|
await proteusService.sendMessage({
|
|
378
|
-
protocol:
|
|
374
|
+
protocol: conversation_1.ConversationProtocol.PROTEUS,
|
|
379
375
|
payload: message,
|
|
380
376
|
targetMode: conversation_2.MessageTargetMode.USERS,
|
|
381
377
|
userIds: recipients,
|
|
@@ -402,7 +398,7 @@ describe('ProteusService', () => {
|
|
|
402
398
|
MockedRecipients.getRecipientsForConversation.mockResolvedValue({});
|
|
403
399
|
jest.spyOn(proteusService['messageService'], 'sendMessage').mockResolvedValue({});
|
|
404
400
|
await proteusService.sendMessage({
|
|
405
|
-
protocol:
|
|
401
|
+
protocol: conversation_1.ConversationProtocol.PROTEUS,
|
|
406
402
|
conversationId: { id: 'conv1', domain: 'domain1' },
|
|
407
403
|
payload: message,
|
|
408
404
|
targetMode: conversation_2.MessageTargetMode.USERS,
|
|
@@ -430,7 +426,7 @@ describe('ProteusService', () => {
|
|
|
430
426
|
jest.spyOn(proteusService['messageService'], 'sendMessage').mockReturnValue(Promise.resolve({}));
|
|
431
427
|
await proteusService.sendMessage({
|
|
432
428
|
conversationId: { id: 'conv1', domain: '' },
|
|
433
|
-
protocol:
|
|
429
|
+
protocol: conversation_1.ConversationProtocol.PROTEUS,
|
|
434
430
|
payload: message,
|
|
435
431
|
targetMode: conversation_2.MessageTargetMode.USERS_CLIENTS,
|
|
436
432
|
userIds: recipients,
|
|
@@ -451,7 +447,7 @@ describe('ProteusService', () => {
|
|
|
451
447
|
MockedRecipients.getRecipientsForConversation.mockResolvedValue({});
|
|
452
448
|
jest.spyOn(proteusService['messageService'], 'sendMessage').mockReturnValue(Promise.resolve({}));
|
|
453
449
|
await proteusService.sendMessage({
|
|
454
|
-
protocol:
|
|
450
|
+
protocol: conversation_1.ConversationProtocol.PROTEUS,
|
|
455
451
|
conversationId: { id: 'conv1', domain: 'domain1' },
|
|
456
452
|
payload: message,
|
|
457
453
|
targetMode: conversation_2.MessageTargetMode.USERS_CLIENTS,
|
|
@@ -477,7 +473,7 @@ describe('ProteusService', () => {
|
|
|
477
473
|
deleted: {},
|
|
478
474
|
});
|
|
479
475
|
const result = await proteusService.sendMessage({
|
|
480
|
-
protocol:
|
|
476
|
+
protocol: conversation_1.ConversationProtocol.PROTEUS,
|
|
481
477
|
conversationId: (0, testUtils_1.generateQualifiedId)('domain'),
|
|
482
478
|
payload: message,
|
|
483
479
|
targetMode: conversation_2.MessageTargetMode.USERS_CLIENTS,
|
|
@@ -560,9 +556,9 @@ describe('ProteusService', () => {
|
|
|
560
556
|
describe('createConversation', () => {
|
|
561
557
|
const newConversation = {
|
|
562
558
|
qualified_id: { id: '', domain: '' },
|
|
559
|
+
id: '',
|
|
563
560
|
type: conversation_1.CONVERSATION_TYPE.REGULAR,
|
|
564
561
|
creator: '',
|
|
565
|
-
cells_state: conversation_1.CONVERSATION_CELLS_STATE.DISABLED,
|
|
566
562
|
access: [],
|
|
567
563
|
access_role: [conversation_1.CONVERSATION_ACCESS_ROLE.GUEST],
|
|
568
564
|
members: {
|
|
@@ -579,7 +575,7 @@ describe('ProteusService', () => {
|
|
|
579
575
|
status_time: '',
|
|
580
576
|
},
|
|
581
577
|
},
|
|
582
|
-
protocol:
|
|
578
|
+
protocol: conversation_1.ConversationProtocol.PROTEUS,
|
|
583
579
|
};
|
|
584
580
|
it('adds all requested users to a new conversation', async () => {
|
|
585
581
|
const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
import { QualifiedUserClients, MessageSendingStatus, NewConversation } from '@wireapp/api-client/lib/conversation';
|
|
2
|
-
import { CONVERSATION_PROTOCOL } from '@wireapp/api-client/lib/team';
|
|
1
|
+
import { QualifiedUserClients, MessageSendingStatus, ConversationProtocol, NewConversation } from '@wireapp/api-client/lib/conversation';
|
|
3
2
|
import { QualifiedId } from '@wireapp/api-client/lib/user';
|
|
4
3
|
import { AddUsersParams, MessageSendingOptions, SendCommonParams } from '../../../conversation';
|
|
5
4
|
export interface NewClient {
|
|
@@ -18,7 +17,7 @@ export type SendProteusMessageParams = SendCommonParams & MessageSendingOptions
|
|
|
18
17
|
*/
|
|
19
18
|
userIds?: QualifiedId[] | QualifiedUserClients;
|
|
20
19
|
onClientMismatch?: (status: MessageSendingStatus, wasSent: boolean) => void | boolean | Promise<boolean>;
|
|
21
|
-
protocol:
|
|
20
|
+
protocol: ConversationProtocol.PROTEUS;
|
|
22
21
|
};
|
|
23
22
|
export type CreateProteusConversationParams = {
|
|
24
23
|
conversationData: NewConversation | string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProteusService.types.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/ProteusService.types.ts"],"names":[],"mappings":"AAmBA,OAAO,
|
|
1
|
+
{"version":3,"file":"ProteusService.types.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/ProteusService.types.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,oBAAoB,EACpB,oBAAoB,EACpB,oBAAoB,EACpB,eAAe,EAChB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AAEzD,OAAO,EAAC,cAAc,EAAE,qBAAqB,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAC;AAE9F,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,MAAM,EAAE,WAAW,CAAC;CACrB;AACD,MAAM,MAAM,oBAAoB,GAAG;IACjC,WAAW,CAAC,EAAE,CAAC,MAAM,EAAE,SAAS,KAAK,IAAI,CAAC;IAC1C,SAAS,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG,gBAAgB,GACrD,qBAAqB,GAAG;IACtB;;;;OAIG;IACH,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,oBAAoB,CAAC;IAC/C,gBAAgB,CAAC,EAAE,CAAC,MAAM,EAAE,oBAAoB,EAAE,OAAO,EAAE,OAAO,KAAK,IAAI,GAAG,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACzG,QAAQ,EAAE,oBAAoB,CAAC,OAAO,CAAC;CACxC,CAAC;AAEJ,MAAM,MAAM,+BAA+B,GAAG;IAC5C,gBAAgB,EAAE,eAAe,GAAG,MAAM,CAAC;IAC3C,YAAY,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,mCAAmC,GAAG,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC"}
|
|
@@ -44,8 +44,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
44
44
|
/* eslint-disable import/order */
|
|
45
45
|
const GenericMessageParams = __importStar(require("../Utility/getGenericMessageParams"));
|
|
46
46
|
const client_1 = require("@wireapp/api-client/lib/client");
|
|
47
|
-
const
|
|
48
|
-
const
|
|
47
|
+
const conversation_1 = require("@wireapp/api-client/lib/conversation");
|
|
48
|
+
const conversation_2 = require("../../../conversation");
|
|
49
49
|
const MessageBuilder_1 = require("../../../conversation/message/MessageBuilder");
|
|
50
50
|
const ProteusService_mocks_1 = require("./ProteusService.mocks");
|
|
51
51
|
jest.mock('../Utility/getGenericMessageParams', () => {
|
|
@@ -54,10 +54,8 @@ jest.mock('../Utility/getGenericMessageParams', () => {
|
|
|
54
54
|
};
|
|
55
55
|
});
|
|
56
56
|
const MockedGenericMessageParams = GenericMessageParams;
|
|
57
|
-
const apiClients = [];
|
|
58
57
|
const prepareProteusService = async () => {
|
|
59
58
|
const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
|
|
60
|
-
apiClients.push(apiClient);
|
|
61
59
|
jest.spyOn(apiClient.api.user, 'postListClients').mockImplementation(() => Promise.resolve({
|
|
62
60
|
qualified_user_map: {
|
|
63
61
|
'test-domain': {
|
|
@@ -74,11 +72,6 @@ const prepareProteusService = async () => {
|
|
|
74
72
|
.mockImplementation(data => Promise.resolve(data));
|
|
75
73
|
return proteusService;
|
|
76
74
|
};
|
|
77
|
-
afterAll(() => {
|
|
78
|
-
jest.clearAllTimers();
|
|
79
|
-
apiClients.forEach(client => client.disconnect());
|
|
80
|
-
(0, ProteusService_mocks_1.cleanupProteusServiceMocks)();
|
|
81
|
-
});
|
|
82
75
|
describe('sendGenericMessage', () => {
|
|
83
76
|
describe('targetted messages', () => {
|
|
84
77
|
it(`indicates when sending was canceled`, async () => {
|
|
@@ -93,9 +86,9 @@ describe('sendGenericMessage', () => {
|
|
|
93
86
|
const payloadBundle = await proteusService.sendMessage({
|
|
94
87
|
payload: message,
|
|
95
88
|
conversationId: { id: 'conv1', domain: '' },
|
|
96
|
-
protocol:
|
|
89
|
+
protocol: conversation_1.ConversationProtocol.PROTEUS,
|
|
97
90
|
});
|
|
98
|
-
expect(payloadBundle.state).toBe(
|
|
91
|
+
expect(payloadBundle.state).toBe(conversation_2.MessageSendingState.CANCELED);
|
|
99
92
|
});
|
|
100
93
|
});
|
|
101
94
|
});
|
|
@@ -3,5 +3,9 @@ export declare const cryptoMigrationStore: {
|
|
|
3
3
|
isReady: (dbName: string) => boolean;
|
|
4
4
|
markAsReady: (dbName: string) => void;
|
|
5
5
|
};
|
|
6
|
+
coreCrypto: {
|
|
7
|
+
isReady: (dbName: string) => boolean;
|
|
8
|
+
markAsReady: (dbName: string) => void;
|
|
9
|
+
};
|
|
6
10
|
};
|
|
7
11
|
//# sourceMappingURL=cryptoMigrationStateStore.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cryptoMigrationStateStore.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/cryptoMigrationStateStore.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cryptoMigrationStateStore.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/cryptoMigrationStateStore.ts"],"names":[],"mappings":"AA6CA,eAAO,MAAM,oBAAoB;;0BAPyC,MAAM;8BANJ,MAAM;;;0BAMR,MAAM;8BANJ,MAAM;;CAsBjF,CAAC"}
|
|
@@ -29,6 +29,7 @@ function getLocalStorage() {
|
|
|
29
29
|
}
|
|
30
30
|
const MIGRATION_READY_STATE = '1';
|
|
31
31
|
const getQualifiedSessionsReadyKey = (dbName) => `${dbName}-qualified-sessions-ready`;
|
|
32
|
+
const getCoreCryptoReadyKey = (dbName) => `${dbName}-corecrypto-ready`;
|
|
32
33
|
const markMigrationReady = (getKey) => (dbName) => {
|
|
33
34
|
const key = getKey(dbName);
|
|
34
35
|
const localStorage = getLocalStorage();
|
|
@@ -45,4 +46,8 @@ exports.cryptoMigrationStore = {
|
|
|
45
46
|
isReady: isMigrationReady(getQualifiedSessionsReadyKey),
|
|
46
47
|
markAsReady: markMigrationReady(getQualifiedSessionsReadyKey),
|
|
47
48
|
},
|
|
49
|
+
coreCrypto: {
|
|
50
|
+
isReady: isMigrationReady(getCoreCryptoReadyKey),
|
|
51
|
+
markAsReady: markMigrationReady(getCoreCryptoReadyKey),
|
|
52
|
+
},
|
|
48
53
|
};
|
|
@@ -2,7 +2,6 @@ import { CRUDEngine } from '@wireapp/store-engine';
|
|
|
2
2
|
/**
|
|
3
3
|
* Will remove any information relative to the client identity.
|
|
4
4
|
* @param storeEngine The engine that currently holds the identity information
|
|
5
|
-
* @param spareKeys If true, the keys table will not be deleted
|
|
6
5
|
*/
|
|
7
|
-
export declare function deleteIdentity(storeEngine: CRUDEngine
|
|
6
|
+
export declare function deleteIdentity(storeEngine: CRUDEngine): Promise<boolean[]>;
|
|
8
7
|
//# sourceMappingURL=identityClearer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"identityClearer.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/identityClearer.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAKjD
|
|
1
|
+
{"version":3,"file":"identityClearer.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/identityClearer.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAKjD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAK1E"}
|
|
@@ -24,15 +24,9 @@ const IDENTITY_STORES = ['amplify', 'clients', 'keys', 'prekeys', 'sessions', 'g
|
|
|
24
24
|
/**
|
|
25
25
|
* Will remove any information relative to the client identity.
|
|
26
26
|
* @param storeEngine The engine that currently holds the identity information
|
|
27
|
-
* @param spareKeys If true, the keys table will not be deleted
|
|
28
27
|
*/
|
|
29
|
-
function deleteIdentity(storeEngine
|
|
28
|
+
function deleteIdentity(storeEngine) {
|
|
30
29
|
return Promise.all(
|
|
31
30
|
//make sure we use enum's lowercase values, not uppercase keys
|
|
32
|
-
IDENTITY_STORES.map(store =>
|
|
33
|
-
if (store === 'keys' && spareKeys) {
|
|
34
|
-
return Promise.resolve(true);
|
|
35
|
-
}
|
|
36
|
-
return storeEngine.deleteAll(store);
|
|
37
|
-
}));
|
|
31
|
+
IDENTITY_STORES.map(store => storeEngine.deleteAll(store)));
|
|
38
32
|
}
|
|
@@ -59,10 +59,6 @@ describe('SessionHandler', () => {
|
|
|
59
59
|
beforeAll(() => {
|
|
60
60
|
jest.spyOn(apiClient.api.user, 'postMultiPreKeyBundles').mockImplementation(generatePrekeys);
|
|
61
61
|
});
|
|
62
|
-
afterAll(() => {
|
|
63
|
-
jest.clearAllTimers();
|
|
64
|
-
apiClient.disconnect();
|
|
65
|
-
});
|
|
66
62
|
describe('constructSessionId', () => {
|
|
67
63
|
describe('constructs a session ID', () => {
|
|
68
64
|
it('without a domain', () => {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { GenericMessage } from '@pydio/protocol-messaging';
|
|
1
2
|
import { APIClient } from '@wireapp/api-client/lib/APIClient';
|
|
2
3
|
import { QualifiedUserClients } from '@wireapp/api-client/lib/conversation';
|
|
3
4
|
import { QualifiedId, QualifiedUserPreKeyBundleMap } from '@wireapp/api-client/lib/user';
|
|
4
|
-
import { GenericMessage } from '@wireapp/protocol-messaging';
|
|
5
5
|
import { MessageSendingOptions } from '../../../conversation';
|
|
6
6
|
export type MessageParams = {
|
|
7
7
|
sendingClientId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getGenericMessageParams.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/Utility/getGenericMessageParams.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"getGenericMessageParams.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/Utility/getGenericMessageParams.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAC,SAAS,EAAC,MAAM,mCAAmC,CAAC;AAC5D,OAAO,EAAC,oBAAoB,EAAC,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAC,WAAW,EAAE,4BAA4B,EAAC,MAAM,8BAA8B,CAAC;AAKvF,OAAO,EAAoB,qBAAqB,EAAC,MAAM,uBAAuB,CAAC;AAG/E,MAAM,MAAM,aAAa,GAAG;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,oBAAoB,GAAG,4BAA4B,CAAC;IAChE,SAAS,EAAE,UAAU,CAAC;IACtB,OAAO,EAAE;QACP,cAAc,EAAE,WAAW,CAAC;QAC5B,UAAU,EAAE,OAAO,GAAG,SAAS,CAAC;QAChC,aAAa,EAAE,OAAO,GAAG,WAAW,EAAE,GAAG,SAAS,CAAC;KACpD,CAAC;CACH,CAAC;AACF,UAAU,6BAA6B;IACrC,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,WAAW,CAAC;IAC5B,cAAc,EAAE,cAAc,CAAC;IAC/B,OAAO,EAAE,qBAAqB,CAAC;IAC/B,SAAS,EAAE,SAAS,CAAC;CACtB;AACD,KAAK,iCAAiC,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;AAEhE,QAAA,MAAM,uBAAuB,kHAM1B,6BAA6B,KAAG,iCA0BlC,CAAC;AAEF,OAAO,EAAC,uBAAuB,EAAC,CAAC"}
|
|
@@ -19,7 +19,7 @@
|
|
|
19
19
|
*/
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
21
|
exports.getGenericMessageParams = void 0;
|
|
22
|
-
const protocol_messaging_1 = require("@
|
|
22
|
+
const protocol_messaging_1 = require("@pydio/protocol-messaging");
|
|
23
23
|
const Recipients_1 = require("./Recipients");
|
|
24
24
|
const UserIds_1 = require("./UserIds");
|
|
25
25
|
const conversation_1 = require("../../../conversation");
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { GenericMessage } from '@pydio/protocol-messaging';
|
|
1
2
|
import { BackendEvent } from '@wireapp/api-client/lib/event';
|
|
2
3
|
import { Notification } from '@wireapp/api-client/lib/notification/';
|
|
3
4
|
import { APIClient } from '@wireapp/api-client';
|
|
4
5
|
import { TypedEventEmitter } from '@wireapp/commons';
|
|
5
|
-
import { GenericMessage } from '@wireapp/protocol-messaging';
|
|
6
6
|
import { CRUDEngine } from '@wireapp/store-engine';
|
|
7
7
|
import { NotificationSource } from './Notifications.types';
|
|
8
8
|
import { ConversationService } from '../conversation';
|
|
@@ -49,28 +49,13 @@ export declare class NotificationService extends TypedEventEmitter<Events> {
|
|
|
49
49
|
static readonly TOPIC: typeof TOPIC;
|
|
50
50
|
constructor(apiClient: APIClient, storeEngine: CRUDEngine, conversationService: ConversationService);
|
|
51
51
|
private getAllNotifications;
|
|
52
|
-
/**
|
|
53
|
-
|
|
54
|
-
*
|
|
55
|
-
* @deprecated This method is used to handle legacy notifications from the backend.
|
|
56
|
-
* It can be removed when all clients are capable of handling consumable notifications.
|
|
57
|
-
*/
|
|
58
|
-
legacyInitializeNotificationStream(clientId: string): Promise<string>;
|
|
52
|
+
/** Should only be called with a completely new client. */
|
|
53
|
+
initializeNotificationStream(clientId: string): Promise<string>;
|
|
59
54
|
hasHistory(): Promise<boolean>;
|
|
60
55
|
getNotificationEventList(): Promise<BackendEvent[]>;
|
|
61
56
|
setLastEventDate(eventDate: Date): Promise<Date>;
|
|
62
57
|
private setLastNotificationId;
|
|
63
|
-
|
|
64
|
-
* Processes the notification stream and calls the provided handler for each notification.
|
|
65
|
-
* If there are missed notifications, it will call the onMissedNotifications callback with the missed notification ID.
|
|
66
|
-
*
|
|
67
|
-
* @param notificationHandler - The handler to process each notification.
|
|
68
|
-
* @param onMissedNotifications - Callback to handle missed notifications.
|
|
69
|
-
* @returns An object containing the total number of notifications processed, number of errors, and successes.
|
|
70
|
-
*
|
|
71
|
-
* @deprecated When all client are migrated to the consumable/async notification stream, this method must be removed.
|
|
72
|
-
*/
|
|
73
|
-
legacyProcessNotificationStream(notificationHandler: NotificationHandler, onMissedNotifications: (notificationId: string) => void, abortHandler?: AbortController): Promise<{
|
|
58
|
+
processNotificationStream(notificationHandler: NotificationHandler, onMissedNotifications: (notificationId: string) => void, abortHandler: AbortController): Promise<{
|
|
74
59
|
total: number;
|
|
75
60
|
error: number;
|
|
76
61
|
success: number;
|
|
@@ -84,10 +69,11 @@ export declare class NotificationService extends TypedEventEmitter<Events> {
|
|
|
84
69
|
* @param lastEventDate?
|
|
85
70
|
*/
|
|
86
71
|
private isOutdatedEvent;
|
|
87
|
-
handleNotification(notification: Notification, source: NotificationSource): AsyncGenerator<HandledEventPayload>;
|
|
72
|
+
handleNotification(notification: Notification, source: NotificationSource, dryRun?: boolean): AsyncGenerator<HandledEventPayload>;
|
|
88
73
|
/**
|
|
89
74
|
* Will process one event
|
|
90
75
|
* @param event The backend event to process
|
|
76
|
+
* @param dryRun Will not try to decrypt if true
|
|
91
77
|
* @return event handling status and if event was handled, the payload
|
|
92
78
|
*/
|
|
93
79
|
private handleEvent;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NotificationService.d.ts","sourceRoot":"","sources":["../../src/notification/NotificationService.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,YAAY,EAAC,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;AAEnE,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAa,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"NotificationService.d.ts","sourceRoot":"","sources":["../../src/notification/NotificationService.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,cAAc,EAAC,MAAM,2BAA2B,CAAC;AACzD,OAAO,EAAC,YAAY,EAAC,MAAM,+BAA+B,CAAC;AAC3D,OAAO,EAAC,YAAY,EAAC,MAAM,uCAAuC,CAAC;AAEnE,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAa,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EAAC,UAAU,EAA4B,MAAM,uBAAuB,CAAC;AAI5E,OAAO,EAAC,kBAAkB,EAAC,MAAM,uBAAuB,CAAC;AAEzD,OAAO,EAAC,mBAAmB,EAAC,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAY,iBAAiB,EAAC,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAC,eAAe,EAAC,MAAM,2BAA2B,CAAC;AAE1D,MAAM,MAAM,mBAAmB,GAAG;IAChC,0CAA0C;IAC1C,KAAK,EAAE,YAAY,CAAC;IACpB,kEAAkE;IAClE,aAAa,CAAC,EAAE,cAAc,CAAC;IAC/B,8FAA8F;IAC9F,eAAe,CAAC,EAAE,eAAe,CAAC;CACnC,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAC1B;IAAC,MAAM,EAAE,WAAW,CAAA;CAAC,GACrB;IAAC,MAAM,EAAE,SAAS,CAAA;CAAC,GACnB;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAC,CAAC;AAE7D,aAAK,KAAK;IACR,kBAAkB,iDAAiD;CACpE;AAED,MAAM,MAAM,mBAAmB,GAAG,CAChC,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,QAAQ,EAAE;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAC,KACpC,OAAO,CAAC,IAAI,CAAC,CAAC;AAEnB,KAAK,MAAM,GAAG;IACZ,CAAC,KAAK,CAAC,kBAAkB,CAAC,EAAE,iBAAiB,CAAC;CAC/C,CAAC;AAEF,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,MAAM,CAAC;IAU9D,OAAO,CAAC,QAAQ,CAAC,mBAAmB;IATtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgC;IACxD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAiC;IAC1D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA6D;IACpF,gBAAuB,KAAK,eAAS;gBAGnC,SAAS,EAAE,SAAS,EACpB,WAAW,EAAE,UAAU,EACN,mBAAmB,EAAE,mBAAmB;YAQ7C,mBAAmB;IAKjC,0DAA0D;IAC7C,4BAA4B,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAM/D,UAAU,IAAI,OAAO,CAAC,OAAO,CAAC;IAKpC,wBAAwB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAI7C,gBAAgB,CAAC,SAAS,EAAE,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;YAsB/C,qBAAqB;IAItB,yBAAyB,CACpC,mBAAmB,EAAE,mBAAmB,EACxC,qBAAqB,EAAE,CAAC,cAAc,EAAE,MAAM,KAAK,IAAI,EACvD,YAAY,EAAE,eAAe,GAC5B,OAAO,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,CAAC;IAoC3D;;;;;;;OAOG;IACH,OAAO,CAAC,eAAe;IAYT,kBAAkB,CAC9B,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,kBAAkB,EAC1B,MAAM,GAAE,OAAe,GACtB,cAAc,CAAC,mBAAmB,CAAC;IAmCtC;;;;;OAKG;YACW,WAAW;CAc1B"}
|
|
@@ -47,13 +47,8 @@ class NotificationService extends commons_1.TypedEventEmitter {
|
|
|
47
47
|
const clientId = this.apiClient.clientId;
|
|
48
48
|
return this.backend.getAllNotifications(clientId, since, abortController);
|
|
49
49
|
}
|
|
50
|
-
/**
|
|
51
|
-
|
|
52
|
-
*
|
|
53
|
-
* @deprecated This method is used to handle legacy notifications from the backend.
|
|
54
|
-
* It can be removed when all clients are capable of handling consumable notifications.
|
|
55
|
-
*/
|
|
56
|
-
async legacyInitializeNotificationStream(clientId) {
|
|
50
|
+
/** Should only be called with a completely new client. */
|
|
51
|
+
async initializeNotificationStream(clientId) {
|
|
57
52
|
await this.setLastEventDate(new Date(0));
|
|
58
53
|
const latestNotification = await this.backend.getLastNotification(clientId);
|
|
59
54
|
return this.setLastNotificationId(latestNotification);
|
|
@@ -85,17 +80,7 @@ class NotificationService extends commons_1.TypedEventEmitter {
|
|
|
85
80
|
async setLastNotificationId(lastNotification) {
|
|
86
81
|
return this.database.updateLastNotificationId(lastNotification);
|
|
87
82
|
}
|
|
88
|
-
|
|
89
|
-
* Processes the notification stream and calls the provided handler for each notification.
|
|
90
|
-
* If there are missed notifications, it will call the onMissedNotifications callback with the missed notification ID.
|
|
91
|
-
*
|
|
92
|
-
* @param notificationHandler - The handler to process each notification.
|
|
93
|
-
* @param onMissedNotifications - Callback to handle missed notifications.
|
|
94
|
-
* @returns An object containing the total number of notifications processed, number of errors, and successes.
|
|
95
|
-
*
|
|
96
|
-
* @deprecated When all client are migrated to the consumable/async notification stream, this method must be removed.
|
|
97
|
-
*/
|
|
98
|
-
async legacyProcessNotificationStream(notificationHandler, onMissedNotifications, abortHandler) {
|
|
83
|
+
async processNotificationStream(notificationHandler, onMissedNotifications, abortHandler) {
|
|
99
84
|
const lastNotificationId = await this.database.getLastNotificationId();
|
|
100
85
|
const { notifications, missedNotification } = await this.getAllNotifications(lastNotificationId, abortHandler);
|
|
101
86
|
if (missedNotification) {
|
|
@@ -107,7 +92,7 @@ class NotificationService extends commons_1.TypedEventEmitter {
|
|
|
107
92
|
: `No notification to process from the stream`;
|
|
108
93
|
this.logger.log(logMessage);
|
|
109
94
|
for (const [index, notification] of notifications.entries()) {
|
|
110
|
-
if (abortHandler
|
|
95
|
+
if (abortHandler.signal.aborted) {
|
|
111
96
|
/* Stop handling notifications if the websocket has been disconnected.
|
|
112
97
|
* Upon reconnecting we are going to restart handling the notification stream for where we left of
|
|
113
98
|
*/
|
|
@@ -147,7 +132,7 @@ class NotificationService extends commons_1.TypedEventEmitter {
|
|
|
147
132
|
}
|
|
148
133
|
return false;
|
|
149
134
|
}
|
|
150
|
-
async *handleNotification(notification, source) {
|
|
135
|
+
async *handleNotification(notification, source, dryRun = false) {
|
|
151
136
|
for (const event of notification.payload) {
|
|
152
137
|
this.logger.debug(`Handling event of type "${event.type}"`, event);
|
|
153
138
|
let lastEventDate = undefined;
|
|
@@ -160,7 +145,7 @@ class NotificationService extends commons_1.TypedEventEmitter {
|
|
|
160
145
|
continue;
|
|
161
146
|
}
|
|
162
147
|
try {
|
|
163
|
-
const handledEventResult = await this.handleEvent(event);
|
|
148
|
+
const handledEventResult = await this.handleEvent(event, dryRun);
|
|
164
149
|
if (handledEventResult.status === 'handled' && handledEventResult.payload) {
|
|
165
150
|
yield handledEventResult.payload;
|
|
166
151
|
}
|
|
@@ -175,7 +160,7 @@ class NotificationService extends commons_1.TypedEventEmitter {
|
|
|
175
160
|
this.emit(NotificationService.TOPIC.NOTIFICATION_ERROR, notificationError);
|
|
176
161
|
}
|
|
177
162
|
}
|
|
178
|
-
if (!notification.transient) {
|
|
163
|
+
if (!dryRun && !notification.transient) {
|
|
179
164
|
// keep track of the last handled notification for next time we fetch the notification stream
|
|
180
165
|
await this.setLastNotificationId(notification);
|
|
181
166
|
}
|
|
@@ -183,9 +168,15 @@ class NotificationService extends commons_1.TypedEventEmitter {
|
|
|
183
168
|
/**
|
|
184
169
|
* Will process one event
|
|
185
170
|
* @param event The backend event to process
|
|
171
|
+
* @param dryRun Will not try to decrypt if true
|
|
186
172
|
* @return event handling status and if event was handled, the payload
|
|
187
173
|
*/
|
|
188
|
-
async handleEvent(event) {
|
|
174
|
+
async handleEvent(event, dryRun = false) {
|
|
175
|
+
if (dryRun) {
|
|
176
|
+
// In case of a dry run, we do not want to decrypt messages
|
|
177
|
+
// We just return the raw event to the caller
|
|
178
|
+
return { status: 'handled', payload: { event } };
|
|
179
|
+
}
|
|
189
180
|
const conversationEventResult = await this.conversationService.handleEvent(event);
|
|
190
181
|
if (conversationEventResult.status !== 'unhandled') {
|
|
191
182
|
return conversationEventResult;
|
|
@@ -28,17 +28,12 @@ const MOCK_BACKEND = {
|
|
|
28
28
|
ws: `wss://${BASE_URL}`,
|
|
29
29
|
};
|
|
30
30
|
const mockedConversationService = {};
|
|
31
|
-
const apiClients = [];
|
|
32
31
|
describe('NotificationService', () => {
|
|
33
|
-
afterAll(() => {
|
|
34
|
-
apiClients.forEach(client => client.disconnect());
|
|
35
|
-
});
|
|
36
32
|
describe('handleEvent', () => {
|
|
37
33
|
it('propagates errors to the outer calling function', async () => {
|
|
38
34
|
const storeEngine = new store_engine_1.MemoryEngine();
|
|
39
35
|
await storeEngine.init('NotificationService.test');
|
|
40
36
|
const apiClient = new api_client_1.APIClient({ urls: MOCK_BACKEND });
|
|
41
|
-
apiClients.push(apiClient);
|
|
42
37
|
const notificationService = new _1.NotificationService(apiClient, storeEngine, mockedConversationService);
|
|
43
38
|
jest.spyOn(notificationService, 'handleEvent').mockImplementation(() => {
|
|
44
39
|
throw new Error('Test error');
|
|
@@ -62,7 +57,6 @@ describe('NotificationService', () => {
|
|
|
62
57
|
const storeEngine = new store_engine_1.MemoryEngine();
|
|
63
58
|
await storeEngine.init('NotificationService.test');
|
|
64
59
|
const apiClient = new api_client_1.APIClient({ urls: MOCK_BACKEND });
|
|
65
|
-
apiClients.push(apiClient);
|
|
66
60
|
const notificationService = new _1.NotificationService(apiClient, storeEngine, mockedConversationService);
|
|
67
61
|
jest.spyOn(notificationService, 'handleEvent').mockReturnValue({});
|
|
68
62
|
const spySetLastNotificationId = jest
|
|
@@ -81,7 +75,6 @@ describe('NotificationService', () => {
|
|
|
81
75
|
const storeEngine = new store_engine_1.MemoryEngine();
|
|
82
76
|
await storeEngine.init('NotificationService.test');
|
|
83
77
|
const apiClient = new api_client_1.APIClient({ urls: MOCK_BACKEND });
|
|
84
|
-
apiClients.push(apiClient);
|
|
85
78
|
const notificationService = new _1.NotificationService(apiClient, storeEngine, mockedConversationService);
|
|
86
79
|
jest.spyOn(notificationService, 'handleEvent').mockReturnValue({});
|
|
87
80
|
const spySetLastNotificationId = jest
|
|
@@ -100,7 +93,6 @@ describe('NotificationService', () => {
|
|
|
100
93
|
const storeEngine = new store_engine_1.MemoryEngine();
|
|
101
94
|
await storeEngine.init('NotificationService.test');
|
|
102
95
|
const apiClient = new api_client_1.APIClient({ urls: MOCK_BACKEND });
|
|
103
|
-
apiClients.push(apiClient);
|
|
104
96
|
const notificationService = new _1.NotificationService(apiClient, storeEngine, mockedConversationService);
|
|
105
97
|
notificationService.on(_1.NotificationService.TOPIC.NOTIFICATION_ERROR, notificationError => {
|
|
106
98
|
expect(notificationError.error.message).toBe('Test error');
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secretKeyGenerator.d.ts","sourceRoot":"","sources":["../../src/secretStore/secretKeyGenerator.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAEhD,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAE/C,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"secretKeyGenerator.d.ts","sourceRoot":"","sources":["../../src/secretStore/secretKeyGenerator.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,cAAc,EAAC,MAAM,kBAAkB,CAAC;AAEhD,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAE/C,MAAM,MAAM,YAAY,GAAG;IACzB,GAAG,EAAE,UAAU,CAAC;IAChB,SAAS,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAChC,CAAC;AAEF;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,EACtC,KAAK,EACL,OAAY,EACZ,SAAS,GACV,EAAE;IACD,wGAAwG;IACxG,KAAK,EAAE,MAAM,CAAC;IACd,kCAAkC;IAClC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,sDAAsD;IACtD,SAAS,EAAE,cAAc,CAAC,GAAG,CAAC,CAAC;CAChC,GAAG,OAAO,CAAC,YAAY,CAAC,CA8BxB"}
|
|
@@ -27,7 +27,6 @@ exports.CorruptedKeyError = CorruptedKeyError;
|
|
|
27
27
|
* Will generate (or retrieve) a secret key from the database.
|
|
28
28
|
*/
|
|
29
29
|
async function generateSecretKey({ keyId, keySize = 16, secretsDb, }) {
|
|
30
|
-
let freshlyGenerated = false;
|
|
31
30
|
try {
|
|
32
31
|
let key;
|
|
33
32
|
try {
|
|
@@ -49,9 +48,8 @@ async function generateSecretKey({ keyId, keySize = 16, secretsDb, }) {
|
|
|
49
48
|
}, true, ['encrypt', 'decrypt']);
|
|
50
49
|
key = new Uint8Array(await crypto.subtle.exportKey('raw', key));
|
|
51
50
|
await secretsDb.saveSecretValue(keyId, key);
|
|
52
|
-
freshlyGenerated = true;
|
|
53
51
|
}
|
|
54
|
-
return { key, deleteKey: () => secretsDb.deleteSecretValue(keyId)
|
|
52
|
+
return { key, deleteKey: () => secretsDb.deleteSecretValue(keyId) };
|
|
55
53
|
}
|
|
56
54
|
catch (error) {
|
|
57
55
|
throw error;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
import { ConversationProtocol } from '@wireapp/api-client/lib/conversation';
|
|
1
2
|
import { Self } from '@wireapp/api-client/lib/self/';
|
|
2
|
-
import { CONVERSATION_PROTOCOL } from '@wireapp/api-client/lib/team';
|
|
3
3
|
import { APIClient } from '@wireapp/api-client';
|
|
4
4
|
export declare class SelfService {
|
|
5
5
|
private readonly apiClient;
|
|
@@ -16,6 +16,6 @@ export declare class SelfService {
|
|
|
16
16
|
* Update self user's list of supported-protocols
|
|
17
17
|
* @param supportedProtocols The list of supported protocols
|
|
18
18
|
*/
|
|
19
|
-
putSupportedProtocols(supportedProtocols:
|
|
19
|
+
putSupportedProtocols(supportedProtocols: ConversationProtocol[]): Promise<void>;
|
|
20
20
|
}
|
|
21
21
|
//# sourceMappingURL=SelfService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SelfService.d.ts","sourceRoot":"","sources":["../../src/self/SelfService.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"SelfService.d.ts","sourceRoot":"","sources":["../../src/self/SelfService.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,oBAAoB,EAAC,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAC,IAAI,EAAC,MAAM,+BAA+B,CAAC;AAEnD,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAG9C,qBAAa,WAAW;IAGV,OAAO,CAAC,QAAQ,CAAC,SAAS;IAFtC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqD;gBAE/C,SAAS,EAAE,SAAS;IAEpC,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAKvD,cAAc,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAMhD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC;IAK1B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAKxB,WAAW,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC;IAKhD,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAIpC,WAAW,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD;;;OAGG;IACU,qBAAqB,CAAC,kBAAkB,EAAE,oBAAoB,EAAE;CAY9E"}
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
*
|
|
19
19
|
*/
|
|
20
20
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
-
const
|
|
21
|
+
const conversation_1 = require("@wireapp/api-client/lib/conversation");
|
|
22
22
|
const api_client_1 = require("@wireapp/api-client");
|
|
23
23
|
const SelfService_1 = require("./SelfService");
|
|
24
24
|
const BASE_URL = 'mock-backend.wire.com';
|
|
@@ -31,12 +31,9 @@ describe('SelfService', () => {
|
|
|
31
31
|
describe('putSupportedProtocols', () => {
|
|
32
32
|
const apiClient = new api_client_1.APIClient({ urls: MOCK_BACKEND });
|
|
33
33
|
apiClient.backendFeatures.supportsMLS = true;
|
|
34
|
-
afterAll(() => {
|
|
35
|
-
apiClient.disconnect();
|
|
36
|
-
});
|
|
37
34
|
it('updates the list of self supported protocols', async () => {
|
|
38
35
|
const selfService = new SelfService_1.SelfService(apiClient);
|
|
39
|
-
const supportedProtocols = [
|
|
36
|
+
const supportedProtocols = [conversation_1.ConversationProtocol.PROTEUS, conversation_1.ConversationProtocol.MLS];
|
|
40
37
|
jest.spyOn(apiClient.api.self, 'putSupportedProtocols').mockImplementation(jest.fn());
|
|
41
38
|
await selfService.putSupportedProtocols(supportedProtocols);
|
|
42
39
|
expect(apiClient.api.self.putSupportedProtocols).toHaveBeenCalledWith(supportedProtocols);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { MemberData, Members, NewTeamData, TeamChunkData, TeamData, UpdateTeamData } from '@wireapp/api-client/lib/team/';
|
|
2
2
|
import { APIClient } from '@wireapp/api-client';
|
|
3
3
|
export declare class TeamService {
|
|
4
4
|
private readonly apiClient;
|
|
@@ -12,9 +12,6 @@ export declare class TeamService {
|
|
|
12
12
|
removeMember(teamId: string, userId: string, password: string): Promise<void>;
|
|
13
13
|
updateMember(teamId: string, memberData: MemberData): Promise<void>;
|
|
14
14
|
updateTeam(teamId: string, teamData: UpdateTeamData): Promise<void>;
|
|
15
|
-
|
|
16
|
-
private commonConfigFetchedAt;
|
|
17
|
-
private readonly CACHE_DURATION_MS;
|
|
18
|
-
getCommonFeatureConfig(): Promise<FeatureList>;
|
|
15
|
+
getCommonFeatureConfig(): Promise<import("@wireapp/api-client/lib/team/").FeatureList>;
|
|
19
16
|
}
|
|
20
17
|
//# sourceMappingURL=TeamService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TeamService.d.ts","sourceRoot":"","sources":["../../src/team/TeamService.ts"],"names":[],"mappings":"AAmBA,OAAO,
|
|
1
|
+
{"version":3,"file":"TeamService.d.ts","sourceRoot":"","sources":["../../src/team/TeamService.ts"],"names":[],"mappings":"AAmBA,OAAO,EAAC,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,QAAQ,EAAE,cAAc,EAAC,MAAM,+BAA+B,CAAC;AAExH,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAE9C,qBAAa,WAAW;IACV,OAAO,CAAC,QAAQ,CAAC,SAAS;gBAAT,SAAS,EAAE,SAAS;IAE1C,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhE,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIhD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAI/C,OAAO,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;IAI1C,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC;IAIlC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAI7E,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAInE,sBAAsB;CAG9B"}
|