@wireapp/core 44.0.10 → 44.0.12

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.
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationService.d.ts","sourceRoot":"","sources":["../../../src/conversation/ConversationService/ConversationService.ts"],"names":[],"mappings":"AAmBA,OAAO,EACL,YAAY,EACZ,2BAA2B,EAC3B,WAAW,EACX,eAAe,EACf,oBAAoB,EAEpB,mBAAmB,EACnB,sBAAsB,EACtB,eAAe,EACf,kBAAkB,EAEnB,MAAM,sCAAsC,CAAC;AAE9C,OAAO,EACL,YAAY,EAIZ,4BAA4B,EAE7B,MAAM,+BAA+B,CAAC;AAEvC,OAAO,EAAC,WAAW,EAAC,MAAM,8BAA8B,CAAC;AACzD,OAAO,EAAC,GAAG,EAAC,MAAM,oCAAoC,CAAC;AAIvD,OAAO,EAAC,SAAS,EAAC,MAAM,qBAAqB,CAAC;AAC9C,OAAO,EAAC,iBAAiB,EAAC,MAAM,kBAAkB,CAAC;AAGnD,OAAO,EAEL,cAAc,EAEd,6BAA6B,EAC7B,oBAAoB,EACpB,UAAU,EACX,MAAM,6BAA6B,CAAC;AAErC,OAAO,EAAC,YAAY,EAAuB,iBAAiB,EAAC,MAAM,qBAAqB,CAAC;AAEzF,OAAO,EAAC,UAAU,EAAC,MAAM,8BAA8B,CAAC;AAGxD,OAAO,EAAkC,cAAc,EAAC,MAAM,kCAAkC,CAAC;AACjG,OAAO,EACL,mCAAmC,EACnC,wBAAwB,EACzB,MAAM,sEAAsE,CAAC;AAC9E,OAAO,EAAsB,kBAAkB,EAAC,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EAAC,YAAY,EAAC,MAAM,sBAAsB,CAAC;AAGlD,OAAO,EAAC,UAAU,EAAC,MAAM,YAAY,CAAC;AAEtC,OAAO,EAAC,sBAAsB,EAAC,MAAM,kDAAkD,CAAC;AAExF,KAAK,MAAM,GAAG;IACZ,wBAAwB,EAAE;QAAC,cAAc,EAAE,WAAW,CAAA;KAAC,CAAC;CACzD,CAAC;AAEF,qBAAa,mBAAoB,SAAQ,iBAAiB,CAAC,MAAM,CAAC;IAK9D,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAI1C,OAAO,CAAC,QAAQ,CAAC,sBAAsB;IACvC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;IAZ/B,SAAgB,YAAY,EAAE,YAAY,CAAC;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgD;gBAGpD,SAAS,EAAE,SAAS,EACpB,cAAc,EAAE,cAAc,EAC9B,YAAY,EAAE,YAAY,EAC1B,yBAAyB,EAAE,CAC1C,cAAc,EAAE,WAAW,EAC3B,iBAAiB,CAAC,EAAE,kBAAkB,KACnC,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,EACf,sBAAsB,EAAE,sBAAsB,EAC9C,WAAW,CAAC,wBAAY;IAM3C,IAAI,UAAU,IAAI,UAAU,CAK3B;IAED;;;;;OAKG;IACU,2BAA2B,CAAC,cAAc,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAkBpG;;;;;;;;;;OAUG;IACU,yBAAyB,CAAC,gBAAgB,EAAE,eAAe;IAI3D,eAAe,CAAC,cAAc,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAInE,gBAAgB,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAQ/E,QAAQ,CAAC,EAAC,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAC,EAAE,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IAWhF,mBAAmB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAK/E,6BAA6B,CAAC,MAAM,EAAE,mCAAmC;IAIzE,0BAA0B,CACrC,cAAc,EAAE,WAAW,EAC3B,MAAM,EAAE,WAAW,GAClB,OAAO,CAAC,4BAA4B,CAAC;IAIxC;;;OAGG;IACU,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,oBAAoB,EAAE,wBAAwB,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;IAO5F,eAAe,CAAC,cAAc,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3D,cAAc,CAAC,cAAc,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAIjE;;;;OAIG;IACH,SAAgB,qBAAqB,mBAA0B,WAAW,KAAG,QAAQ,IAAI,CAAC,CAExF;IAEF;;;OAGG;IACH,SAAgB,+BAA+B,mBAA0B,WAAW,KAAG,QAAQ,IAAI,CAAC,CAElG;IAEF;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAIpB,0BAA0B,CAC/B,cAAc,EAAE,WAAW,EAC3B,MAAM,EAAE,WAAW,EACnB,aAAa,EAAE,MAAM,GAAG,IAAI,GAC3B,OAAO,CAAC,IAAI,CAAC;IAaT,yBAAyB,CAC9B,cAAc,EAAE,WAAW,EAC3B,QAAQ,EAAE,OAAO,EACjB,gBAAgB,GAAE,MAAM,GAAG,IAAiB,GAC3C,OAAO,CAAC,IAAI,CAAC;IAaT,yBAAyB,CAC9B,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,MAAM,EACd,gBAAgB,EAAE,2BAA2B,GAAG,MAAM,GACrD,OAAO,CAAC,IAAI,CAAC;IAMhB;;;;OAIG;IAEH;;;OAGG;IACU,qBAAqB,CAChC,gBAAgB,EAAE,eAAe,EACjC,UAAU,EAAE,WAAW,EACvB,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,6BAA6B,CAAC;YAqC3B,cAAc;IA2C5B;;;;;;OAMG;IACU,yBAAyB,CAAC,EACrC,cAAc,EACd,OAAO,EACP,cAAc,GACf,EAAE,QAAQ,CAAC,cAAc,CAAC,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAuBvD,8BAA8B,CAAC,EAC1C,OAAO,EACP,cAAc,EACd,gBAAgB,GACjB,EAAE,iBAAiB,GAAG,OAAO,CAAC,6BAA6B,CAAC;IAoBhD,oBAAoB,CAAC,cAAc,EAAE,WAAW;IAI7D;;;OAGG;IACU,qBAAqB,CAAC,OAAO,EAAE,MAAM;IAIlD;;;;OAIG;IACU,4BAA4B,CAAC,OAAO,EAAE,MAAM;IAI5C,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;YAIlD,YAAY;IAYb,gCAAgC;IAe7C;;;OAGG;YACW,kCAAkC;IA2BhD;;;OAGG;YACW,+BAA+B;IAqB7C;;;;;;;OAOG;YACW,gBAAgB;IAQ9B;;;OAGG;IACG,sBAAsB,CAAC,MAAM,EAAE,WAAW;IAIhD;;;;;;;OAOG;IACH,SAAgB,4BAA4B,YACjC,MAAM,YACL;QAAC,IAAI,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAC,eAChC,WAAW,4BAEvB,QAAQ,eAAe,CAAC,CAoDzB;IAEF;;;;;;;;OAQG;IACU,uBAAuB,CAAC,EACnC,OAAO,EACP,cAAc,EACd,UAAU,EACV,cAAc,GACf,EAAE;QACD,OAAO,EAAE,MAAM,CAAC;QAChB,cAAc,EAAE,WAAW,CAAC;QAC5B,UAAU,EAAE,WAAW,CAAC;QACxB,cAAc,EAAE,WAAW,EAAE,CAAC;KAC/B,GAAG,OAAO,CAAC,IAAI,CAAC;YA4BH,wBAAwB;YAsBxB,gCAAgC;YAyBhC,4BAA4B;YAI5B,wBAAwB;YAIxB,yBAAyB;IAKvC;;;;OAIG;IACU,WAAW,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,kBAAkB,CAAC;CAoB3E"}
1
+ {"version":3,"file":"ConversationService.d.ts","sourceRoot":"","sources":["../../../src/conversation/ConversationService/ConversationService.ts"],"names":[],"mappings":"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"}
@@ -30,7 +30,6 @@ const bazinga64_1 = require("bazinga64");
30
30
  const logdown_1 = __importDefault(require("logdown"));
31
31
  const commons_1 = require("@wireapp/commons");
32
32
  const protocol_messaging_1 = require("@wireapp/protocol-messaging");
33
- const ConversationService_types_1 = require("./ConversationService.types");
34
33
  const conversation_2 = require("../../conversation/");
35
34
  const AssetCryptography_1 = require("../../cryptography/AssetCryptography");
36
35
  const conversationRejoinQueue_1 = require("../../messagingProtocols/mls/conversationRejoinQueue");
@@ -247,7 +246,7 @@ class ConversationService extends commons_1.TypedEventEmitter {
247
246
  if (!groupId) {
248
247
  throw new Error('No group_id found in response which is required for creating MLS conversations.');
249
248
  }
250
- const response = await this.mlsService.registerConversation(groupId, qualifiedUsers.concat(selfUserId), {
249
+ const { events, failures } = await this.mlsService.registerConversation(groupId, qualifiedUsers.concat(selfUserId), {
251
250
  creator: {
252
251
  user: selfUserId,
253
252
  client: selfClientId,
@@ -256,11 +255,9 @@ class ConversationService extends commons_1.TypedEventEmitter {
256
255
  // We fetch the fresh version of the conversation created on backend with the newly added users
257
256
  const conversation = await this.apiClient.api.conversation.getConversation(qualifiedId);
258
257
  return {
259
- events: response.events,
258
+ events,
260
259
  conversation,
261
- failedToAdd: response.failed
262
- ? { users: response.failed, backends: [], reason: ConversationService_types_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS }
263
- : undefined,
260
+ failedToAdd: failures,
264
261
  };
265
262
  }
266
263
  async sendMLSMessage(params, shouldRetry = true) {
@@ -307,19 +304,17 @@ class ConversationService extends commons_1.TypedEventEmitter {
307
304
  * @param conversationId Id of the conversation to which we want to add users
308
305
  */
309
306
  async addUsersToMLSConversation({ qualifiedUsers, groupId, conversationId, }) {
310
- const { coreCryptoKeyPackagesPayload, failedToFetchKeyPackages } = await this.mlsService.getKeyPackagesPayload(qualifiedUsers);
311
- const response = coreCryptoKeyPackagesPayload.length > 0
312
- ? await this.mlsService.addUsersToExistingConversation(groupId, coreCryptoKeyPackagesPayload)
313
- : { events: [] };
307
+ const { keyPackages, failures: keysClaimingFailures } = await this.mlsService.getKeyPackagesPayload(qualifiedUsers);
308
+ const { events, failures } = keyPackages.length > 0
309
+ ? await this.mlsService.addUsersToExistingConversation(groupId, keyPackages)
310
+ : { events: [], failures: [] };
314
311
  const conversation = await this.getConversation(conversationId);
315
312
  //We store the info when user was added (and key material was created), so we will know when to renew it
316
313
  await this.mlsService.resetKeyMaterialRenewal(groupId);
317
314
  return {
318
- events: response.events,
315
+ events,
319
316
  conversation,
320
- failedToAdd: failedToFetchKeyPackages.length > 0
321
- ? { users: failedToFetchKeyPackages, backends: [], reason: ConversationService_types_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS }
322
- : undefined,
317
+ failedToAdd: [...keysClaimingFailures, ...failures],
323
318
  };
324
319
  }
325
320
  async removeUsersFromMLSConversation({ groupId, conversationId, qualifiedUserIds, }) {
@@ -480,16 +480,14 @@ describe('ConversationService', () => {
480
480
  .map(() => ({ id: PayloadHelper.getUUID(), domain: 'local.wire.com' }));
481
481
  const selfUserToAdd = { id: 'self-user-id', domain: 'local.wire.com', skipOwnClientId: apiClient.clientId };
482
482
  const qualifiedUsers = [...otherUsersToAdd, selfUserToAdd];
483
- jest
484
- .spyOn(mlsService, 'getKeyPackagesPayload')
485
- .mockResolvedValueOnce({ coreCryptoKeyPackagesPayload: [], failedToFetchKeyPackages: [] });
483
+ jest.spyOn(mlsService, 'getKeyPackagesPayload').mockResolvedValueOnce({ keyPackages: [], failures: [] });
486
484
  jest.spyOn(apiClient.api.conversation, 'getConversation').mockResolvedValueOnce({
487
485
  qualified_id: mockConversationId,
488
486
  protocol: conversation_1.ConversationProtocol.MLS,
489
487
  epoch: 1,
490
488
  group_id: mockGroupId,
491
489
  });
492
- const mlsMessage = { events: [], time: '' };
490
+ const mlsMessage = { events: [], time: '', failures: [] };
493
491
  jest.spyOn(mlsService, 'addUsersToExistingConversation').mockResolvedValueOnce(mlsMessage);
494
492
  await conversationService.addUsersToMLSConversation({
495
493
  qualifiedUsers,
@@ -499,6 +497,43 @@ describe('ConversationService', () => {
499
497
  expect(mlsService.getKeyPackagesPayload).toHaveBeenCalledWith(qualifiedUsers);
500
498
  expect(mlsService.resetKeyMaterialRenewal).toHaveBeenCalledWith(mockGroupId);
501
499
  });
500
+ it('should return failure reasons for users it was not possible to claim keys for', async () => {
501
+ const [conversationService, { apiClient, mlsService }] = await buildConversationService();
502
+ const mockGroupId = 'groupId';
503
+ const mockConversationId = { id: PayloadHelper.getUUID(), domain: 'local.wire.com' };
504
+ const otherUsersToAdd = Array(3)
505
+ .fill(0)
506
+ .map(() => ({ id: PayloadHelper.getUUID(), domain: 'local.wire.com' }));
507
+ const selfUserToAdd = { id: 'self-user-id', domain: 'local.wire.com', skipOwnClientId: apiClient.clientId };
508
+ const qualifiedUsers = [...otherUsersToAdd, selfUserToAdd];
509
+ const keysClaimingFailure = {
510
+ reason: __1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG,
511
+ users: [otherUsersToAdd[0]],
512
+ };
513
+ const addUsersFailure = {
514
+ reason: __1.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
515
+ users: [otherUsersToAdd[1]],
516
+ backends: [otherUsersToAdd[1].domain],
517
+ };
518
+ jest.spyOn(mlsService, 'getKeyPackagesPayload').mockResolvedValueOnce({
519
+ keyPackages: [new Uint8Array(0)],
520
+ failures: [keysClaimingFailure],
521
+ });
522
+ jest.spyOn(apiClient.api.conversation, 'getConversation').mockResolvedValueOnce({
523
+ qualified_id: mockConversationId,
524
+ protocol: conversation_1.ConversationProtocol.MLS,
525
+ epoch: 1,
526
+ group_id: mockGroupId,
527
+ });
528
+ const mlsMessage = { events: [], time: '', failures: [addUsersFailure] };
529
+ jest.spyOn(mlsService, 'addUsersToExistingConversation').mockResolvedValueOnce(mlsMessage);
530
+ const { failedToAdd } = await conversationService.addUsersToMLSConversation({
531
+ qualifiedUsers,
532
+ groupId: mockGroupId,
533
+ conversationId: mockConversationId,
534
+ });
535
+ expect(failedToAdd).toEqual([keysClaimingFailure, addUsersFailure]);
536
+ });
502
537
  });
503
538
  describe('tryEstablishingMLSGroup', () => {
504
539
  it('should add all the users to a MLS group after group was established by the self client', async () => {
@@ -79,32 +79,39 @@ export type RemoveUsersParams = {
79
79
  };
80
80
  export declare enum AddUsersFailureReasons {
81
81
  NON_FEDERATING_BACKENDS = "NON_FEDERATING_BACKENDS",
82
- UNREACHABLE_BACKENDS = "UNREACHABLE_BACKENDS"
82
+ UNREACHABLE_BACKENDS = "UNREACHABLE_BACKENDS",
83
+ OFFLINE_FOR_TOO_LONG = "OFFLINE_FOR_TOO_LONG"
83
84
  }
84
85
  /**
85
86
  * List of users that were originaly requested to be in the conversation
86
87
  * but could not be added due to their backend not being available
87
88
  * @note Added since version 4: https://staging-nginz-https.z
88
- ra.io/v4/api/swagger-ui/#/default/post_conversations
89
- * @note Federation only
90
- */
89
+ ra.io/v4/api/swagger-ui/#/default/post_conversations
90
+ * @note Federation only
91
+ */
91
92
  export type AddUsersFailure = {
93
+ reason: AddUsersFailureReasons.NON_FEDERATING_BACKENDS;
94
+ users: QualifiedId[];
95
+ backends: string[];
96
+ } | {
97
+ reason: AddUsersFailureReasons.UNREACHABLE_BACKENDS;
92
98
  users: QualifiedId[];
93
- reason: AddUsersFailureReasons;
94
- /** the backends that caused the failure */
95
99
  backends: string[];
100
+ } | {
101
+ reason: AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG;
102
+ users: QualifiedId[];
96
103
  };
97
104
  /**
98
105
  * The backend response of any method that will create (or add users to) a conversation
99
106
  */
100
107
  export interface BaseCreateConversationResponse {
101
108
  conversation: Conversation;
102
- failedToAdd?: AddUsersFailure;
109
+ failedToAdd?: AddUsersFailure[];
103
110
  }
104
111
  export type ProteusCreateConversationResponse = BaseCreateConversationResponse;
105
112
  export type ProteusAddUsersResponse = {
106
113
  event?: ConversationMemberJoinEvent;
107
- failedToAdd?: AddUsersFailure;
114
+ failedToAdd?: AddUsersFailure[];
108
115
  };
109
116
  export interface MLSCreateConversationResponse extends BaseCreateConversationResponse {
110
117
  events: ConversationEvent[];
@@ -1 +1 @@
1
- {"version":3,"file":"ConversationService.types.d.ts","sourceRoot":"","sources":["../../../src/conversation/ConversationService/ConversationService.types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ConversationService.types.d.ts","sourceRoot":"","sources":["../../../src/conversation/ConversationService/ConversationService.types.ts"],"names":[],"mappings":"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"}
@@ -29,4 +29,5 @@ var AddUsersFailureReasons;
29
29
  (function (AddUsersFailureReasons) {
30
30
  AddUsersFailureReasons["NON_FEDERATING_BACKENDS"] = "NON_FEDERATING_BACKENDS";
31
31
  AddUsersFailureReasons["UNREACHABLE_BACKENDS"] = "UNREACHABLE_BACKENDS";
32
+ AddUsersFailureReasons["OFFLINE_FOR_TOO_LONG"] = "OFFLINE_FOR_TOO_LONG";
32
33
  })(AddUsersFailureReasons || (exports.AddUsersFailureReasons = AddUsersFailureReasons = {}));
@@ -7,7 +7,7 @@ import { APIClient } from '@wireapp/api-client';
7
7
  import { TypedEventEmitter } from '@wireapp/commons';
8
8
  import { AddProposalArgs, ConversationId, CoreCrypto, DecryptedMessage, ProposalArgs, ProposalType, RemoveProposalArgs } from '@wireapp/core-crypto';
9
9
  import { MLSServiceConfig } from './MLSService.types';
10
- import { KeyPackageClaimUser } from '../../../conversation';
10
+ import { AddUsersFailure, KeyPackageClaimUser } from '../../../conversation';
11
11
  import { CoreDatabase } from '../../../storage/CoreDB';
12
12
  import { RecurringTaskScheduler } from '../../../util/RecurringTaskScheduler';
13
13
  import { AcmeChallenge, User } from '../E2EIdentityService';
@@ -61,10 +61,12 @@ export declare class MLSService extends TypedEventEmitter<Events> {
61
61
  * @param groupId - the group id of the MLS group
62
62
  * @param keyPackages - the list of keys of clients to add to the MLS group
63
63
  */
64
- addUsersToExistingConversation(groupId: string, keyPackages: Uint8Array[]): Promise<PostMlsMessageResponse>;
64
+ addUsersToExistingConversation(groupId: string, keyPackages: Uint8Array[]): Promise<PostMlsMessageResponse & {
65
+ failures: AddUsersFailure[];
66
+ }>;
65
67
  getKeyPackagesPayload(qualifiedUsers: KeyPackageClaimUser[]): Promise<{
66
- coreCryptoKeyPackagesPayload: Uint8Array[];
67
- failedToFetchKeyPackages: QualifiedId[];
68
+ keyPackages: Uint8Array[];
69
+ failures: AddUsersFailure[];
68
70
  }>;
69
71
  getEpoch(groupId: string | Uint8Array): Promise<number>;
70
72
  newProposal(proposalType: ProposalType, args: ProposalArgs | AddProposalArgs | RemoveProposalArgs): Promise<import("@wireapp/core-crypto").ProposalBundle>;
@@ -105,7 +107,9 @@ export declare class MLSService extends TypedEventEmitter<Events> {
105
107
  client?: string;
106
108
  };
107
109
  parentGroupId?: string;
108
- }): Promise<PostMlsMessageResponse>;
110
+ }): Promise<PostMlsMessageResponse & {
111
+ failures: AddUsersFailure[];
112
+ }>;
109
113
  /**
110
114
  * Will try to register mls group and send an empty commit to establish it.
111
115
  *
@@ -1 +1 @@
1
- {"version":3,"file":"MLSService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/MLSService/MLSService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MLSService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/mls/MLSService/MLSService.ts"],"names":[],"mappings":"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"}
@@ -41,6 +41,7 @@ const logdown_1 = __importDefault(require("logdown"));
41
41
  const commons_1 = require("@wireapp/commons");
42
42
  const core_crypto_1 = require("@wireapp/core-crypto");
43
43
  const CoreCryptoMLSError_1 = require("./CoreCryptoMLSError");
44
+ const conversation_1 = require("../../../conversation");
44
45
  const messageSender_1 = require("../../../conversation/message/messageSender");
45
46
  const fullyQualifiedClientIdUtils_1 = require("../../../util/fullyQualifiedClientIdUtils");
46
47
  const numberToHex_1 = require("../../../util/numberToHex");
@@ -199,16 +200,28 @@ class MLSService extends commons_1.TypedEventEmitter {
199
200
  * @param groupId - the group id of the MLS group
200
201
  * @param keyPackages - the list of keys of clients to add to the MLS group
201
202
  */
202
- addUsersToExistingConversation(groupId, keyPackages) {
203
+ async addUsersToExistingConversation(groupId, keyPackages) {
203
204
  const groupIdBytes = bazinga64_1.Decoder.fromBase64(groupId).asBytes;
204
205
  if (keyPackages.length < 1) {
205
206
  throw new Error('Empty list of keys provided to addUsersToExistingConversation');
206
207
  }
207
- return this.processCommitAction(groupIdBytes, async () => {
208
+ //TODO: handle federation error when sending a commit bundle to backend like we do in ProteusService
209
+ const response = await this.processCommitAction(groupIdBytes, async () => {
208
210
  const commitBundle = await this.coreCryptoClient.addClientsToConversation(groupIdBytes, keyPackages);
209
211
  this.dispatchNewCrlDistributionPoints(commitBundle);
210
212
  return commitBundle;
211
213
  });
214
+ const failedUsers = response.failed;
215
+ const failures = failedUsers
216
+ ? [
217
+ {
218
+ users: failedUsers,
219
+ backends: failedUsers.map(({ domain }) => domain),
220
+ reason: conversation_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
221
+ },
222
+ ]
223
+ : [];
224
+ return Object.assign(Object.assign({}, response), { failures });
212
225
  }
213
226
  async getKeyPackagesPayload(qualifiedUsers) {
214
227
  /**
@@ -217,13 +230,23 @@ class MLSService extends commons_1.TypedEventEmitter {
217
230
  * includes self user too.
218
231
  */
219
232
  const failedToFetchKeyPackages = [];
220
- const keyPackagesSettledResult = await Promise.allSettled(qualifiedUsers.map(({ id, domain, skipOwnClientId }) => this.apiClient.api.client
221
- .claimMLSKeyPackages(id, domain, (0, numberToHex_1.numberToHex)(this.config.cipherSuite), skipOwnClientId)
222
- .catch(error => {
223
- failedToFetchKeyPackages.push({ id, domain });
224
- // Throw the error so we don't get {status: 'fulfilled', value: undefined}
225
- throw error;
226
- })));
233
+ const emptyKeyPackagesUsers = [];
234
+ const keyPackagesSettledResult = await Promise.allSettled(qualifiedUsers.map(async ({ id, domain, skipOwnClientId }) => {
235
+ try {
236
+ const keys = await this.apiClient.api.client.claimMLSKeyPackages(id, domain, (0, numberToHex_1.numberToHex)(this.config.cipherSuite), skipOwnClientId);
237
+ // It's possible that user's backend is reachable but they have not uploaded their MLS key packages (or all of them have been claimed already)
238
+ if (keys.key_packages.length === 0) {
239
+ this.logger.warn(`User ${id} has no key packages uploaded`);
240
+ emptyKeyPackagesUsers.push({ id, domain });
241
+ }
242
+ return keys;
243
+ }
244
+ catch (error) {
245
+ failedToFetchKeyPackages.push({ id, domain });
246
+ // Throw the error so we don't get {status: 'fulfilled', value: undefined}
247
+ throw error;
248
+ }
249
+ }));
227
250
  /**
228
251
  * @note We are filtering failed requests for key packages
229
252
  * this is required because on federation environments it is possible
@@ -243,7 +266,18 @@ class MLSService extends commons_1.TypedEventEmitter {
243
266
  }
244
267
  return previousValue;
245
268
  }, []);
246
- return { coreCryptoKeyPackagesPayload, failedToFetchKeyPackages };
269
+ const failures = [];
270
+ if (emptyKeyPackagesUsers.length > 0) {
271
+ failures.push({ reason: conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG, users: emptyKeyPackagesUsers });
272
+ }
273
+ if (failedToFetchKeyPackages.length > 0) {
274
+ failures.push({
275
+ reason: conversation_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
276
+ users: failedToFetchKeyPackages,
277
+ backends: failedToFetchKeyPackages.map(({ domain }) => domain),
278
+ });
279
+ }
280
+ return { keyPackages: coreCryptoKeyPackagesPayload, failures };
247
281
  }
248
282
  getEpoch(groupId) {
249
283
  const groupIdBytes = typeof groupId === 'string' ? bazinga64_1.Decoder.fromBase64(groupId).asBytes : groupId;
@@ -365,7 +399,7 @@ class MLSService extends commons_1.TypedEventEmitter {
365
399
  async registerConversation(groupId, users, options) {
366
400
  await this.registerEmptyConversation(groupId, options === null || options === void 0 ? void 0 : options.parentGroupId);
367
401
  const creator = options === null || options === void 0 ? void 0 : options.creator;
368
- const { coreCryptoKeyPackagesPayload: keyPackages, failedToFetchKeyPackages } = await this.getKeyPackagesPayload(users.map(user => {
402
+ const { keyPackages, failures: keysClaimingFailures } = await this.getKeyPackagesPayload(users.map(user => {
369
403
  if (user.id === (creator === null || creator === void 0 ? void 0 : creator.user.id)) {
370
404
  /**
371
405
  * we should skip fetching key packages for current self client,
@@ -375,17 +409,20 @@ class MLSService extends commons_1.TypedEventEmitter {
375
409
  }
376
410
  return user;
377
411
  }));
378
- const response = keyPackages.length > 0
379
- ? await this.addUsersToExistingConversation(groupId, keyPackages)
380
- : // If there are no clients to add, just update the keying material
381
- await this.updateKeyingMaterial(groupId);
412
+ if (keyPackages.length <= 0) {
413
+ // If there are no clients to add, just update the keying material
414
+ const response = await this.updateKeyingMaterial(groupId);
415
+ await this.scheduleKeyMaterialRenewal(groupId);
416
+ return Object.assign(Object.assign({}, response), { failures: keysClaimingFailures });
417
+ }
418
+ const response = await this.addUsersToExistingConversation(groupId, keyPackages);
382
419
  // We schedule a periodic key material renewal
383
420
  await this.scheduleKeyMaterialRenewal(groupId);
384
421
  /**
385
422
  * @note If we can't fetch a user's key packages then we can not add them to mls conversation
386
423
  * so we're adding them to the list of failed users.
387
424
  */
388
- response.failed = response.failed ? [...response.failed, ...failedToFetchKeyPackages] : failedToFetchKeyPackages;
425
+ response.failures = [...keysClaimingFailures, ...response.failures];
389
426
  return response;
390
427
  }
391
428
  /**
@@ -25,6 +25,7 @@ const crypto_1 = require("crypto");
25
25
  const api_client_1 = require("@wireapp/api-client");
26
26
  const CoreCryptoMLSError_1 = require("./CoreCryptoMLSError");
27
27
  const MLSService_1 = require("./MLSService");
28
+ const conversation_1 = require("../../../conversation");
28
29
  const CoreDB_1 = require("../../../storage/CoreDB");
29
30
  const RecurringTaskScheduler_1 = require("../../../util/RecurringTaskScheduler");
30
31
  const TaskScheduler_1 = require("../../../util/TaskScheduler");
@@ -99,6 +100,78 @@ describe('MLSService', () => {
99
100
  await mlsService.registerConversation(groupId, [createUserId(), createUserId()]);
100
101
  expect(mlsService.scheduleKeyMaterialRenewal).toHaveBeenCalledWith(groupId);
101
102
  });
103
+ it('returns a list of failure reasons if it was not possible to claim keys for intended users', async () => {
104
+ const groupId = 'mXOagqRIX/RFd7QyXJA8/Ed8X+hvQgLXIiwYHm3OQFc=';
105
+ const selfUser = createUserId();
106
+ const creator = { user: selfUser, client: 'client-1' };
107
+ const users = [createUserId(), createUserId()];
108
+ const failure = { reason: conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG, users };
109
+ jest.spyOn(mlsService, 'getKeyPackagesPayload').mockResolvedValueOnce({
110
+ keyPackages: [],
111
+ failures: [failure],
112
+ });
113
+ const { failures } = await mlsService.registerConversation(groupId, [...users, selfUser], { creator });
114
+ expect(failures).toEqual([failure]);
115
+ expect(mlsService.scheduleKeyMaterialRenewal).toHaveBeenCalledWith(groupId);
116
+ });
117
+ it("returns a list of failure reasons if it was not possible to upload users' keys", async () => {
118
+ const groupId = 'mXOagqRIX/RFd7QyXJA8/Ed8X+hvQgLXIiwYHm3OQFc=';
119
+ const selfUser = createUserId();
120
+ const creator = { user: selfUser, client: 'client-1' };
121
+ const users = [createUserId(), createUserId()];
122
+ const failureKeysClaiming = {
123
+ reason: conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG,
124
+ users: [users[0]],
125
+ };
126
+ const failureKeysUpload = {
127
+ reason: conversation_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
128
+ users: [users[1]],
129
+ backends: [users[1].domain],
130
+ };
131
+ jest.spyOn(mlsService, 'getKeyPackagesPayload').mockResolvedValueOnce({
132
+ keyPackages: [new Uint8Array()],
133
+ failures: [failureKeysClaiming],
134
+ });
135
+ jest.spyOn(mlsService, 'addUsersToExistingConversation').mockResolvedValueOnce({
136
+ failures: [failureKeysUpload],
137
+ events: [],
138
+ time: '',
139
+ });
140
+ const { failures } = await mlsService.registerConversation(groupId, [...users, selfUser], { creator });
141
+ expect(failures).toEqual([failureKeysClaiming, failureKeysUpload]);
142
+ expect(mlsService.scheduleKeyMaterialRenewal).toHaveBeenCalledWith(groupId);
143
+ });
144
+ });
145
+ describe('getKeyPackagesPayload', () => {
146
+ it('succesfully claims keys for all users', async () => {
147
+ const [mlsService, { apiClient }] = await createMLSService();
148
+ const users = [createUserId(), createUserId()];
149
+ jest.spyOn(apiClient.api.client, 'claimMLSKeyPackages').mockImplementation(async (userId) => ({
150
+ key_packages: [{ client: 'client-1', domain: 'domain-1', key_package: '', key_package_ref: '', user: userId }],
151
+ }));
152
+ const { failures, keyPackages } = await mlsService.getKeyPackagesPayload(users);
153
+ expect(failures).toEqual([]);
154
+ expect(keyPackages).toHaveLength(2);
155
+ });
156
+ it('returns failure reasons list if it was not possible to claim user keys', async () => {
157
+ const [mlsService, { apiClient }] = await createMLSService();
158
+ const users = [createUserId(), createUserId(), createUserId()];
159
+ jest.spyOn(apiClient.api.client, 'claimMLSKeyPackages').mockRejectedValueOnce(undefined);
160
+ jest.spyOn(apiClient.api.client, 'claimMLSKeyPackages').mockResolvedValueOnce({
161
+ key_packages: [],
162
+ });
163
+ jest.spyOn(apiClient.api.client, 'claimMLSKeyPackages').mockResolvedValueOnce({
164
+ key_packages: [
165
+ { client: 'client-1', domain: 'domain-1', key_package: '', key_package_ref: '', user: users[2].id },
166
+ ],
167
+ });
168
+ const { failures, keyPackages } = await mlsService.getKeyPackagesPayload(users);
169
+ expect(failures).toEqual([
170
+ { reason: conversation_1.AddUsersFailureReasons.OFFLINE_FOR_TOO_LONG, users: [users[1]] },
171
+ { reason: conversation_1.AddUsersFailureReasons.UNREACHABLE_BACKENDS, users: [users[0]], backends: [users[1].domain] },
172
+ ]);
173
+ expect(keyPackages).toHaveLength(1);
174
+ });
102
175
  });
103
176
  describe('isConversationEstablished', () => {
104
177
  it('returns false if conversation does not exist locally', async () => {
@@ -403,7 +476,7 @@ describe('MLSService', () => {
403
476
  const [mlsService] = await createMLSService();
404
477
  const mockGroupId = 'mock-group-id2';
405
478
  jest.spyOn(mlsService, 'conversationExists').mockResolvedValueOnce(false);
406
- jest.spyOn(mlsService, 'registerConversation').mockResolvedValueOnce({ events: [], time: '' });
479
+ jest.spyOn(mlsService, 'registerConversation').mockResolvedValueOnce({ events: [], time: '', failures: [] });
407
480
  jest.spyOn(mlsService, 'wipeConversation').mockImplementation(jest.fn());
408
481
  const wasConversationEstablished = await mlsService.tryEstablishingMLSGroup(mockGroupId);
409
482
  expect(mlsService.registerConversation).toHaveBeenCalledWith(mockGroupId, []);
@@ -1 +1 @@
1
- {"version":3,"file":"ProteusService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/ProteusService.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,mCAAmC,CAAC;AACjE,OAAO,KAAK,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAGL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAC,8BAA8B,EAAC,MAAM,+BAA+B,CAAC;AAClF,OAAO,KAAK,EAAC,WAAW,EAAE,4BAA4B,EAAC,MAAM,8BAA8B,CAAC;AAG5F,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAI5C,OAAO,KAAK,EACV,mCAAmC,EACnC,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EAEL,iCAAiC,EAEjC,UAAU,EACV,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAY1D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wEAAwE;IACxE,QAAQ,EAAE,sBAAsB,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,sGAAsG;IACtG,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAG/C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,oBAAoB;IAKlC,wBAAwB,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO7F,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;IA2B1D,YAAY,CAAC,OAAO,CAAC,EAAE,UAAU;IAIxC;;OAEG;IACI,mBAAmB;IAInB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIxE;;;;;;OAMG;IACU,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAQ3E,kBAAkB,CAAC,gBAAgB,EAAE,eAAe,GAAG,OAAO,CAAC,iCAAiC,CAAC;IAwC9G;;;OAGG;IACU,sBAAsB,CAAC,EAClC,cAAc,EACd,cAAc,GACf,EAAE,mCAAmC,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAkD5D,WAAW,CAAC,EACvB,OAAO,EACP,cAAc,EACd,UAAU,EACV,UAAU,EACV,OAAO,EACP,gBAAgB,GACjB,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6CpC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM;IAuB9E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM;IAQ7C,OAAO,CAClB,SAAS,EAAE,UAAU,EACrB,UAAU,EAAE,4BAA4B,GAAG,oBAAoB,GAC9D,OAAO,CAAC,gBAAgB,CAAC;IAiBtB,IAAI,CAAC,WAAW,CAAC,EAAE,UAAU;CAMpC"}
1
+ {"version":3,"file":"ProteusService.d.ts","sourceRoot":"","sources":["../../../../src/messagingProtocols/proteus/ProteusService/ProteusService.ts"],"names":[],"mappings":"AAmBA,OAAO,KAAK,EAAC,SAAS,EAAC,MAAM,mCAAmC,CAAC;AACjE,OAAO,KAAK,EAAC,MAAM,EAAE,OAAO,EAAC,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAGL,eAAe,EACf,sBAAsB,EACtB,oBAAoB,EACrB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,KAAK,EAAC,8BAA8B,EAAC,MAAM,+BAA+B,CAAC;AAClF,OAAO,KAAK,EAAC,WAAW,EAAE,4BAA4B,EAAC,MAAM,8BAA8B,CAAC;AAG5F,OAAO,EAAC,UAAU,EAAC,MAAM,uBAAuB,CAAC;AAEjD,OAAO,EAAC,YAAY,EAAC,MAAM,gBAAgB,CAAC;AAI5C,OAAO,KAAK,EACV,mCAAmC,EACnC,oBAAoB,EACpB,wBAAwB,EACzB,MAAM,wBAAwB,CAAC;AAIhC,OAAO,EAEL,iCAAiC,EAEjC,UAAU,EACV,uBAAuB,EACxB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAAC,mBAAmB,EAAC,MAAM,uBAAuB,CAAC;AAY1D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wEAAwE;IACxE,QAAQ,EAAE,sBAAsB,CAAC;IACjC,wEAAwE;IACxE,QAAQ,CAAC,EAAE,oBAAoB,CAAC;IAChC,sGAAsG;IACtG,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB,CAAC;AAEF,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANzB,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2C;gBAG/C,SAAS,EAAE,SAAS,EACpB,YAAY,EAAE,YAAY,EAC1B,MAAM,EAAE,oBAAoB;IAKlC,wBAAwB,CAAC,KAAK,EAAE,8BAA8B,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAO7F,UAAU,CAAC,WAAW,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO;IA2B1D,YAAY,CAAC,OAAO,CAAC,EAAE,UAAU;IAIxC;;OAEG;IACI,mBAAmB;IAInB,kBAAkB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM;IAIxE;;;;;;OAMG;IACU,oBAAoB,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM;IAQ3E,kBAAkB,CAAC,gBAAgB,EAAE,eAAe,GAAG,OAAO,CAAC,iCAAiC,CAAC;IAwC9G;;;OAGG;IACU,sBAAsB,CAAC,EAClC,cAAc,EACd,cAAc,GACf,EAAE,mCAAmC,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAoD5D,WAAW,CAAC,EACvB,OAAO,EACP,cAAc,EACd,UAAU,EACV,UAAU,EACV,OAAO,EACP,gBAAgB,GACjB,EAAE,wBAAwB,GAAG,OAAO,CAAC,UAAU,CAAC;IA6CpC,OAAO,CAAC,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM;IAuB9E,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC;IAI9B,aAAa,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM;IAQ7C,OAAO,CAClB,SAAS,EAAE,UAAU,EACrB,UAAU,EAAE,4BAA4B,GAAG,oBAAoB,GAC9D,OAAO,CAAC,gBAAgB,CAAC;IAiBtB,IAAI,CAAC,WAAW,CAAC,EAAE,UAAU;CAMpC"}
@@ -126,7 +126,7 @@ class ProteusService {
126
126
  // on a succesfull conversation creation with the available users,
127
127
  // we append the users from an unreachable backend to the response
128
128
  unreachableUsers.length > 0
129
- ? { reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS, backends, users: unreachableUsers }
129
+ ? [{ reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS, backends, users: unreachableUsers }]
130
130
  : undefined,
131
131
  };
132
132
  }
@@ -155,7 +155,7 @@ class ProteusService {
155
155
  const { backends } = error;
156
156
  const { excludedUsers: unreachableUsers, includedUsers: availableUsers } = (0, userDomainFilters_1.filterUsersFromDomains)(qualifiedUsers, backends);
157
157
  if (availableUsers.length === 0) {
158
- return { failedToAdd: { reason: failureReasonsMap[error.label], backends, users: unreachableUsers } };
158
+ return { failedToAdd: [{ reason: failureReasonsMap[error.label], backends, users: unreachableUsers }] };
159
159
  }
160
160
  // In case the request to add users failed with a `UNREACHABLE_BACKENDS` or `NOT_CONNECTED_BACKENDS` errors, we try again with the users from available backends
161
161
  try {
@@ -163,18 +163,20 @@ class ProteusService {
163
163
  return {
164
164
  event: response,
165
165
  failedToAdd: unreachableUsers.length > 0
166
- ? { reason: failureReasonsMap[error.label], backends, users: unreachableUsers }
166
+ ? [{ reason: failureReasonsMap[error.label], backends, users: unreachableUsers }]
167
167
  : undefined,
168
168
  };
169
169
  }
170
170
  catch (error) {
171
171
  if ((0, conversation_1.isFederatedBackendsError)(error)) {
172
172
  return {
173
- failedToAdd: {
174
- reason: failureReasonsMap[error.label],
175
- backends: error.backends,
176
- users: qualifiedUsers,
177
- },
173
+ failedToAdd: [
174
+ {
175
+ reason: failureReasonsMap[error.label],
176
+ backends: error.backends,
177
+ users: qualifiedUsers,
178
+ },
179
+ ],
178
180
  };
179
181
  }
180
182
  throw error;
@@ -502,7 +502,7 @@ describe('ProteusService', () => {
502
502
  expect(event).toEqual(baseResponse);
503
503
  });
504
504
  it('partially add users if some backends are unreachable', async () => {
505
- var _a, _b;
505
+ var _a, _b, _c, _d;
506
506
  const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
507
507
  const postMembersSpy = jest
508
508
  .spyOn(apiClient.api.conversation, 'postMembers')
@@ -515,11 +515,11 @@ describe('ProteusService', () => {
515
515
  expect(postMembersSpy).toHaveBeenCalledTimes(2);
516
516
  expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining([...usersDomain1, ...usersDomain2]));
517
517
  expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining(usersDomain2));
518
- expect((_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a.reason).toBe(conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS);
519
- expect((_b = result.failedToAdd) === null || _b === void 0 ? void 0 : _b.users).toEqual([...usersDomain1]);
518
+ expect((_b = (_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.reason).toBe(conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS);
519
+ expect((_d = (_c = result.failedToAdd) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.users).toEqual([...usersDomain1]);
520
520
  });
521
521
  it('completely fails to add users if some backends are unreachable', async () => {
522
- var _a, _b;
522
+ var _a, _b, _c, _d;
523
523
  const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
524
524
  const allUsers = [...usersDomain1, ...usersDomain2];
525
525
  const postMembersSpy = jest
@@ -532,11 +532,11 @@ describe('ProteusService', () => {
532
532
  expect(postMembersSpy).toHaveBeenCalledTimes(2);
533
533
  expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining(allUsers));
534
534
  expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining(usersDomain2));
535
- expect((_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a.reason).toBe(conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS);
536
- expect((_b = result.failedToAdd) === null || _b === void 0 ? void 0 : _b.users).toEqual(allUsers);
535
+ expect((_b = (_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.reason).toBe(conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS);
536
+ expect((_d = (_c = result.failedToAdd) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.users).toEqual(allUsers);
537
537
  });
538
538
  it('partially add users if some users are part of not-connected backends', async () => {
539
- var _a, _b;
539
+ var _a, _b, _c, _d;
540
540
  const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
541
541
  const postMembersSpy = jest
542
542
  .spyOn(apiClient.api.conversation, 'postMembers')
@@ -549,8 +549,8 @@ describe('ProteusService', () => {
549
549
  expect(postMembersSpy).toHaveBeenCalledTimes(2);
550
550
  expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining([...usersDomain1, ...usersDomain2]));
551
551
  expect(postMembersSpy).toHaveBeenCalledWith(conversationId, expect.arrayContaining(usersDomain1));
552
- expect((_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a.reason).toBe(conversation_2.AddUsersFailureReasons.NON_FEDERATING_BACKENDS);
553
- expect((_b = result.failedToAdd) === null || _b === void 0 ? void 0 : _b.users).toEqual([...usersDomain2, ...usersDomain3]);
552
+ expect((_b = (_a = result.failedToAdd) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.reason).toBe(conversation_2.AddUsersFailureReasons.NON_FEDERATING_BACKENDS);
553
+ expect((_d = (_c = result.failedToAdd) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.users).toEqual([...usersDomain2, ...usersDomain3]);
554
554
  });
555
555
  });
556
556
  describe('createConversation', () => {
@@ -600,11 +600,13 @@ describe('ProteusService', () => {
600
600
  expect(postConversationSpy).toHaveBeenCalledTimes(2);
601
601
  expect(postConversationSpy).toHaveBeenCalledWith(expect.objectContaining({ qualified_users: [...usersDomain1, ...usersDomain2] }));
602
602
  expect(postConversationSpy).toHaveBeenCalledWith(expect.objectContaining({ qualified_users: usersDomain2 }));
603
- expect(failedToAdd).toEqual({
604
- reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
605
- backends: ['domain1'],
606
- users: expect.arrayContaining([...usersDomain1, ...usersDomain1]),
607
- });
603
+ expect(failedToAdd).toEqual([
604
+ {
605
+ reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
606
+ backends: ['domain1'],
607
+ users: expect.arrayContaining([...usersDomain1, ...usersDomain1]),
608
+ },
609
+ ]);
608
610
  });
609
611
  it('creates an empty conversation if no backend is reachable', async () => {
610
612
  const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
@@ -619,11 +621,13 @@ describe('ProteusService', () => {
619
621
  expect(postConversationSpy).toHaveBeenCalledTimes(2);
620
622
  expect(postConversationSpy).toHaveBeenCalledWith(expect.objectContaining({ qualified_users: [...usersDomain1, ...usersDomain2] }));
621
623
  expect(postConversationSpy).toHaveBeenCalledWith(expect.objectContaining({ qualified_users: [] }));
622
- expect(failedToAdd).toEqual({
623
- reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
624
- backends: [domain1, domain2],
625
- users: expect.arrayContaining([...usersDomain1, ...usersDomain1]),
626
- });
624
+ expect(failedToAdd).toEqual([
625
+ {
626
+ reason: conversation_2.AddUsersFailureReasons.UNREACHABLE_BACKENDS,
627
+ backends: [domain1, domain2],
628
+ users: expect.arrayContaining([...usersDomain1, ...usersDomain1]),
629
+ },
630
+ ]);
627
631
  });
628
632
  it('fails to create a conversation if there are users from non-connected backends', async () => {
629
633
  const [proteusService, { apiClient }] = await (0, ProteusService_mocks_1.buildProteusService)();
package/package.json CHANGED
@@ -13,7 +13,7 @@
13
13
  "dependencies": {
14
14
  "@wireapp/api-client": "^26.10.10",
15
15
  "@wireapp/commons": "^5.2.5",
16
- "@wireapp/core-crypto": "1.0.0-rc.40",
16
+ "@wireapp/core-crypto": "1.0.0-rc.41",
17
17
  "@wireapp/cryptobox": "12.8.0",
18
18
  "@wireapp/promise-queue": "^2.2.10",
19
19
  "@wireapp/protocol-messaging": "1.44.0",
@@ -60,6 +60,6 @@
60
60
  "test:coverage": "jest --coverage",
61
61
  "watch": "tsc --watch"
62
62
  },
63
- "version": "44.0.10",
64
- "gitHead": "c0e114cbb561508a05f5ff32412bfbe6d1d246ab"
63
+ "version": "44.0.12",
64
+ "gitHead": "c8a44e6e0a6f47c0d18011655de84d20d6847101"
65
65
  }