@wireapp/core 17.22.1 → 17.24.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/CHANGELOG.md +46 -0
  2. package/package.json +2 -2
  3. package/src/main/Account.d.ts +10 -1
  4. package/src/main/Account.js +8 -2
  5. package/src/main/Account.js.map +1 -1
  6. package/src/main/Account.ts +15 -2
  7. package/src/main/broadcast/BroadcastService.js +3 -4
  8. package/src/main/broadcast/BroadcastService.js.map +1 -1
  9. package/src/main/broadcast/BroadcastService.ts +3 -5
  10. package/src/main/conversation/ConversationService.d.ts +4 -6
  11. package/src/main/conversation/ConversationService.js +26 -59
  12. package/src/main/conversation/ConversationService.js.map +1 -1
  13. package/src/main/conversation/ConversationService.test.node.js +0 -38
  14. package/src/main/conversation/ConversationService.test.node.js.map +1 -1
  15. package/src/main/conversation/ConversationService.test.node.ts +1 -50
  16. package/src/main/conversation/ConversationService.ts +32 -116
  17. package/src/main/conversation/message/MessageService.d.ts +42 -12
  18. package/src/main/conversation/message/MessageService.js +147 -275
  19. package/src/main/conversation/message/MessageService.js.map +1 -1
  20. package/src/main/conversation/message/MessageService.test.node.js +117 -10
  21. package/src/main/conversation/message/MessageService.test.node.js.map +1 -1
  22. package/src/main/conversation/message/MessageService.test.node.ts +183 -40
  23. package/src/main/conversation/message/MessageService.ts +209 -354
  24. package/src/main/conversation/message/UserClientsUtil.d.ts +22 -0
  25. package/src/main/conversation/message/UserClientsUtil.js +38 -0
  26. package/src/main/conversation/message/UserClientsUtil.js.map +1 -0
  27. package/src/main/conversation/message/UserClientsUtil.ts +44 -0
  28. package/src/main/conversation/message/UserClientsUtils.test.node.d.ts +1 -0
  29. package/src/main/conversation/message/UserClientsUtils.test.node.js +42 -0
  30. package/src/main/conversation/message/UserClientsUtils.test.node.js.map +1 -0
  31. package/src/main/conversation/message/UserClientsUtils.test.node.ts +44 -0
  32. package/src/main/cryptography/CryptographyService.d.ts +6 -1
  33. package/src/main/cryptography/CryptographyService.js +14 -2
  34. package/src/main/cryptography/CryptographyService.js.map +1 -1
  35. package/src/main/cryptography/CryptographyService.test.node.js +2 -2
  36. package/src/main/cryptography/CryptographyService.test.node.js.map +1 -1
  37. package/src/main/cryptography/CryptographyService.test.node.ts +5 -4
  38. package/src/main/cryptography/CryptographyService.ts +22 -4
  39. package/src/main/util/TypePredicateUtil.js +3 -9
  40. package/src/main/util/TypePredicateUtil.js.map +1 -1
  41. package/src/main/util/TypePredicateUtil.ts +3 -9
@@ -24,8 +24,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
24
24
  const uuidjs_1 = __importDefault(require("uuidjs"));
25
25
  const http_status_codes_1 = require("http-status-codes");
26
26
  const api_client_1 = require("@wireapp/api-client");
27
+ const protocol_messaging_1 = require("@wireapp/protocol-messaging");
27
28
  const cryptography_1 = require("../../cryptography");
28
29
  const MessageService_1 = require("./MessageService");
30
+ const PayloadHelper_1 = require("../../test/PayloadHelper");
29
31
  const baseMessageSendingStatus = {
30
32
  deleted: {},
31
33
  missing: {},
@@ -33,8 +35,16 @@ const baseMessageSendingStatus = {
33
35
  redundant: {},
34
36
  time: new Date().toISOString(),
35
37
  };
36
- const user1 = { id: uuidjs_1.default.genV4().toString(), domain: '1.wire.test', clients: ['client1.1', 'client1.2'] };
37
- const user2 = { id: uuidjs_1.default.genV4().toString(), domain: '2.wire.test', clients: ['client2.1', 'client2.2'] };
38
+ const user1 = {
39
+ id: uuidjs_1.default.genV4().toString(),
40
+ domain: '1.wire.test',
41
+ clients: ['client1.1', 'client1.2', 'client1.3', 'client1.4'],
42
+ };
43
+ const user2 = {
44
+ id: uuidjs_1.default.genV4().toString(),
45
+ domain: '2.wire.test',
46
+ clients: ['client2.1', 'client2.2', 'client2.3', 'client2.4'],
47
+ };
38
48
  function generateQualifiedRecipients(users) {
39
49
  const payload = {};
40
50
  users.forEach(({ id, domain, clients }) => {
@@ -43,21 +53,45 @@ function generateQualifiedRecipients(users) {
43
53
  });
44
54
  return payload;
45
55
  }
56
+ function generateRecipients(users) {
57
+ return users.reduce((acc, { id, clients }) => {
58
+ acc[id] = clients;
59
+ return acc;
60
+ }, {});
61
+ }
62
+ function fakeEncrypt(_, recipients) {
63
+ const encryptedPayload = Object.entries(recipients).reduce((acc, [domain, users]) => {
64
+ acc[domain] = Object.entries(users).reduce((userClients, [userId, clients]) => {
65
+ userClients[userId] = clients.reduce((payloads, client) => {
66
+ payloads[client] = new Uint8Array();
67
+ return payloads;
68
+ }, {});
69
+ return userClients;
70
+ }, {});
71
+ return acc;
72
+ }, {});
73
+ return Promise.resolve(encryptedPayload);
74
+ }
46
75
  describe('MessageService', () => {
47
76
  const apiClient = new api_client_1.APIClient();
48
77
  const cryptographyService = new cryptography_1.CryptographyService(apiClient, {});
49
78
  const messageService = new MessageService_1.MessageService(apiClient, cryptographyService);
79
+ beforeEach(() => {
80
+ spyOn(cryptographyService, 'encryptQualified').and.callFake(fakeEncrypt);
81
+ });
50
82
  describe('sendFederatedMessage', () => {
51
83
  it('sends a message', async () => {
52
84
  spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.returnValue(Promise.resolve(baseMessageSendingStatus));
53
85
  const recipients = generateQualifiedRecipients([user1, user2]);
54
- await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array());
86
+ await messageService.sendFederatedMessage('senderclientid', recipients, new Uint8Array(), {
87
+ conversationId: { id: 'convid', domain: '' },
88
+ });
55
89
  expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalled();
56
90
  });
57
91
  describe('client mismatch', () => {
58
92
  it('handles client mismatch internally if no onClientMismatch is given', async () => {
59
93
  let spyCounter = 0;
60
- const clientMismatch = Object.assign(Object.assign({}, baseMessageSendingStatus), { missing: { '2.wire.test': { [user2.id]: ['client22'] } } });
94
+ const clientMismatch = Object.assign(Object.assign({}, baseMessageSendingStatus), { deleted: { [user1.domain]: { [user1.id]: [user1.clients[0]] } }, missing: { '2.wire.test': { [user2.id]: ['client22'] } } });
61
95
  spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.callFake(() => {
62
96
  spyCounter++;
63
97
  if (spyCounter === 1) {
@@ -71,9 +105,11 @@ describe('MessageService', () => {
71
105
  return Promise.resolve(baseMessageSendingStatus);
72
106
  });
73
107
  spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
74
- spyOn(cryptographyService, 'encryptQualified').and.returnValue(Promise.resolve({ '2.wire.test': { [user2.id]: { client22: new Uint8Array() } } }));
75
108
  const recipients = generateQualifiedRecipients([user1, user2]);
76
- await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array(), { reportMissing: true });
109
+ await messageService.sendFederatedMessage('senderclientid', recipients, new Uint8Array(), {
110
+ reportMissing: true,
111
+ conversationId: { id: 'convid', domain: '' },
112
+ });
77
113
  expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(2);
78
114
  });
79
115
  it('continues message sending if onClientMismatch returns true', async () => {
@@ -93,9 +129,12 @@ describe('MessageService', () => {
93
129
  return Promise.resolve(baseMessageSendingStatus);
94
130
  });
95
131
  spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
96
- spyOn(cryptographyService, 'encryptQualified').and.returnValue(Promise.resolve({ '2.wire.test': { [user2.id]: { client22: new Uint8Array() } } }));
97
132
  const recipients = generateQualifiedRecipients([user1, user2]);
98
- await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array(), { reportMissing: true, onClientMismatch });
133
+ await messageService.sendFederatedMessage('senderclientid', recipients, new Uint8Array(), {
134
+ reportMissing: true,
135
+ onClientMismatch,
136
+ conversationId: { id: 'convid', domain: '' },
137
+ });
99
138
  expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(2);
100
139
  expect(onClientMismatch).toHaveBeenCalledWith(clientMismatch);
101
140
  });
@@ -111,13 +150,81 @@ describe('MessageService', () => {
111
150
  return Promise.reject(error);
112
151
  });
113
152
  spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
114
- spyOn(cryptographyService, 'encryptQualified').and.returnValue(Promise.resolve({ '2.wire.test': { [user2.id]: { client22: new Uint8Array() } } }));
115
153
  const recipients = generateQualifiedRecipients([user1, user2]);
116
- await messageService.sendFederatedOTRMessage('senderclientid', { id: 'convid', domain: '' }, recipients, new Uint8Array(), { reportMissing: true, onClientMismatch });
154
+ await messageService.sendFederatedMessage('senderclientid', recipients, new Uint8Array(), {
155
+ reportMissing: true,
156
+ onClientMismatch,
157
+ conversationId: { id: 'convid', domain: '' },
158
+ });
117
159
  expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(1);
118
160
  expect(onClientMismatch).toHaveBeenCalledWith(clientMismatch);
119
161
  });
120
162
  });
121
163
  });
164
+ describe('sendMessage', () => {
165
+ const generateUsers = (userCount, clientsPerUser) => {
166
+ return Array.from(Array(userCount)).map((_, i) => ({
167
+ id: `user${i}`,
168
+ domain: `${i}.domain`,
169
+ clients: Array.from(Array(clientsPerUser)).map((_, j) => `client${i}${j}`),
170
+ }));
171
+ };
172
+ const clientId = 'sendingClient';
173
+ const conversationId = 'conv1';
174
+ const createMessage = (content) => {
175
+ const customTextMessage = protocol_messaging_1.GenericMessage.create({
176
+ messageId: (0, PayloadHelper_1.getUUID)(),
177
+ text: protocol_messaging_1.Text.create({ content }),
178
+ });
179
+ return protocol_messaging_1.GenericMessage.encode(customTextMessage).finish();
180
+ };
181
+ it('should send regular to conversation', async () => {
182
+ const message = 'Lorem ipsum dolor sit amet';
183
+ spyOn(apiClient.conversation.api, 'postOTRMessage').and.returnValue(Promise.resolve({}));
184
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message), {
185
+ conversationId,
186
+ });
187
+ expect(apiClient.conversation.api.postOTRMessage).toHaveBeenCalledWith(clientId, conversationId, jasmine.any(Object), true);
188
+ });
189
+ it('should send protobuf message to conversation', async () => {
190
+ const message = 'Lorem ipsum dolor sit amet';
191
+ spyOn(apiClient.conversation.api, 'postOTRProtobufMessage').and.returnValue(Promise.resolve({}));
192
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message), {
193
+ conversationId,
194
+ sendAsProtobuf: true,
195
+ });
196
+ expect(apiClient.conversation.api.postOTRProtobufMessage).toHaveBeenCalledWith(clientId, conversationId, jasmine.any(Object), true);
197
+ });
198
+ it('should broadcast regular message if no conversationId is given', async () => {
199
+ const message = 'Lorem ipsum dolor sit amet';
200
+ spyOn(apiClient.broadcast.api, 'postBroadcastMessage').and.returnValue(Promise.resolve({}));
201
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message));
202
+ expect(apiClient.broadcast.api.postBroadcastMessage).toHaveBeenCalledWith(clientId, jasmine.any(Object), true);
203
+ });
204
+ it('should broadcast protobuf message if no conversationId is given', async () => {
205
+ const message = 'Lorem ipsum dolor sit amet';
206
+ spyOn(apiClient.broadcast.api, 'postBroadcastProtobufMessage').and.returnValue(Promise.resolve({}));
207
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message), {
208
+ sendAsProtobuf: true,
209
+ });
210
+ expect(apiClient.broadcast.api.postBroadcastProtobufMessage).toHaveBeenCalledWith(clientId, jasmine.any(Object), true);
211
+ });
212
+ it('should not send as external if payload small', async () => {
213
+ const message = 'Lorem ipsum dolor sit amet';
214
+ spyOn(apiClient.conversation.api, 'postOTRMessage').and.returnValue(Promise.resolve({}));
215
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message), {
216
+ conversationId,
217
+ });
218
+ expect(apiClient.conversation.api.postOTRMessage).toHaveBeenCalledWith(clientId, conversationId, jasmine.objectContaining({ data: undefined }), true);
219
+ });
220
+ it('should send as external if payload is big', async () => {
221
+ const longMessage = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem';
222
+ spyOn(apiClient.conversation.api, 'postOTRMessage').and.returnValue(Promise.resolve({}));
223
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(30, 10)), createMessage(longMessage), {
224
+ conversationId,
225
+ });
226
+ expect(apiClient.conversation.api.postOTRMessage).toHaveBeenCalledWith(clientId, conversationId, jasmine.objectContaining({ data: jasmine.any(String) }), true);
227
+ });
228
+ });
122
229
  });
123
230
  //# sourceMappingURL=MessageService.test.node.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"MessageService.test.node.js","sourceRoot":"","sources":["MessageService.test.node.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MessageService.test.node.js","sourceRoot":"","sources":["MessageService.test.node.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;GAiBG;;;;;AAEH,oDAA0B;AAC1B,yDAA8C;AAC9C,oDAA8C;AAS9C,oEAAiE;AACjE,qDAAuD;AACvD,qDAAgD;AAChD,4DAAiD;AAEjD,MAAM,wBAAwB,GAAyB;IACrD,OAAO,EAAE,EAAE;IACX,OAAO,EAAE,EAAE;IACX,cAAc,EAAE,EAAE;IAClB,SAAS,EAAE,EAAE;IACb,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;CAC/B,CAAC;AAGF,MAAM,KAAK,GAAa;IACtB,EAAE,EAAE,gBAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;IAC3B,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;CAC9D,CAAC;AACF,MAAM,KAAK,GAAa;IACtB,EAAE,EAAE,gBAAI,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE;IAC3B,MAAM,EAAE,aAAa;IACrB,OAAO,EAAE,CAAC,WAAW,EAAE,WAAW,EAAE,WAAW,EAAE,WAAW,CAAC;CAC9D,CAAC;AAEF,SAAS,2BAA2B,CAAC,KAAiB;IACpD,MAAM,OAAO,GAAyB,EAAE,CAAC;IACzC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAC,EAAE,EAAE;QACtC,OAAO,CAAC,MAAM,MAAd,OAAO,CAAC,MAAM,IAAM,EAAE,EAAC;QACvB,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;IAChC,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAiB;IAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAC,EAAE,EAAE,OAAO,EAAC,EAAE,EAAE;QACzC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC;QAClB,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAiB,CAAC,CAAC;AACxB,CAAC;AAED,SAAS,WAAW,CAAC,CAAU,EAAE,UAAgC;IAC/D,MAAM,gBAAgB,GAAG,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC,EAAE,EAAE;QAClF,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE;YAC5E,WAAW,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE;gBACxD,QAAQ,CAAC,MAAM,CAAC,GAAG,IAAI,UAAU,EAAE,CAAC;gBACpC,OAAO,QAAQ,CAAC;YAClB,CAAC,EAAE,EAAS,CAAC,CAAC;YACd,OAAO,WAAW,CAAC;QACrB,CAAC,EAAE,EAA+B,CAAC,CAAC;QACpC,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAA4B,CAAC,CAAC;IACjC,OAAO,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;AAC3C,CAAC;AAED,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,MAAM,SAAS,GAAG,IAAI,sBAAS,EAAE,CAAC;IAClC,MAAM,mBAAmB,GAAG,IAAI,kCAAmB,CAAC,SAAS,EAAE,EAAS,CAAC,CAAC;IAC1E,MAAM,cAAc,GAAG,IAAI,+BAAc,CAAC,SAAS,EAAE,mBAAmB,CAAC,CAAC;IAE1E,UAAU,CAAC,GAAG,EAAE;QACd,KAAK,CAAC,mBAAmB,EAAE,kBAAkB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC3E,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;QACpC,EAAE,CAAC,iBAAiB,EAAE,KAAK,IAAI,EAAE;YAC/B,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC;YACjH,MAAM,UAAU,GAAG,2BAA2B,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;YAE/D,MAAM,cAAc,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,UAAU,EAAE,EAAE;gBACxF,cAAc,EAAE,EAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAC;aAC3C,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,gBAAgB,EAAE,CAAC;QACzE,CAAC,CAAC,CAAC;QAEH,QAAQ,CAAC,iBAAiB,EAAE,GAAG,EAAE;YAC/B,EAAE,CAAC,oEAAoE,EAAE,KAAK,IAAI,EAAE;gBAClF,IAAI,UAAU,GAAG,CAAC,CAAC;gBACnB,MAAM,cAAc,mCACf,wBAAwB,KAC3B,OAAO,EAAE,EAAC,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,EAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAC,EAAC,EAC3D,OAAO,EAAE,EAAC,aAAa,EAAE,EAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAC,EAAC,GACrD,CAAC;gBACF,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;oBACtE,UAAU,EAAE,CAAC;oBACb,IAAI,UAAU,KAAK,CAAC,EAAE;wBACpB,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;wBACzB,KAAa,CAAC,QAAQ,GAAG;4BACxB,MAAM,EAAE,+BAAW,CAAC,mBAAmB;4BACvC,IAAI,EAAE,cAAc;yBACrB,CAAC;wBACF,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;qBAC9B;oBACD,OAAO,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBAElG,MAAM,UAAU,GAAG,2BAA2B,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBAE/D,MAAM,cAAc,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,UAAU,EAAE,EAAE;oBACxF,aAAa,EAAE,IAAI;oBACnB,cAAc,EAAE,EAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAC;iBAC3C,CAAC,CAAC;gBACH,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;YAC/E,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,4DAA4D,EAAE,KAAK,IAAI,EAAE;gBAC1E,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;gBACpF,MAAM,cAAc,mCAAO,wBAAwB,KAAE,OAAO,EAAE,EAAC,aAAa,EAAE,EAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAC,EAAC,GAAC,CAAC;gBAC3G,IAAI,UAAU,GAAG,CAAC,CAAC;gBACnB,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;oBACtE,UAAU,EAAE,CAAC;oBACb,IAAI,UAAU,KAAK,CAAC,EAAE;wBACpB,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;wBACzB,KAAa,CAAC,QAAQ,GAAG;4BACxB,MAAM,EAAE,+BAAW,CAAC,mBAAmB;4BACvC,IAAI,EAAE,cAAc;yBACrB,CAAC;wBACF,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;qBAC9B;oBACD,OAAO,OAAO,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;gBACnD,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBAElG,MAAM,UAAU,GAAG,2BAA2B,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBAE/D,MAAM,cAAc,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,UAAU,EAAE,EAAE;oBACxF,aAAa,EAAE,IAAI;oBACnB,gBAAgB;oBAChB,cAAc,EAAE,EAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAC;iBAC3C,CAAC,CAAC;gBACH,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBAC7E,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;YAEH,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;gBACvE,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBACrF,MAAM,cAAc,mCAAO,wBAAwB,KAAE,OAAO,EAAE,EAAC,aAAa,EAAE,EAAC,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,EAAC,EAAC,GAAC,CAAC;gBAC3G,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,kBAAkB,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE;oBACtE,MAAM,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;oBACzB,KAAa,CAAC,QAAQ,GAAG;wBACxB,MAAM,EAAE,+BAAW,CAAC,mBAAmB;wBACvC,IAAI,EAAE,cAAc;qBACrB,CAAC;oBACF,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;gBAC/B,CAAC,CAAC,CAAC;gBACH,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,iCAAiC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBAElG,MAAM,UAAU,GAAG,2BAA2B,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;gBAE/D,MAAM,cAAc,CAAC,oBAAoB,CAAC,gBAAgB,EAAE,UAAU,EAAE,IAAI,UAAU,EAAE,EAAE;oBACxF,aAAa,EAAE,IAAI;oBACnB,gBAAgB;oBAChB,cAAc,EAAE,EAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAC;iBAC3C,CAAC,CAAC;gBACH,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC;gBAC7E,MAAM,CAAC,gBAAgB,CAAC,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC;YAChE,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;QAC3B,MAAM,aAAa,GAAG,CAAC,SAAiB,EAAE,cAAsB,EAAc,EAAE;YAC9E,OAAO,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,CAAW,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC3D,EAAE,EAAE,OAAO,CAAC,EAAE;gBACd,MAAM,EAAE,GAAG,CAAC,SAAS;gBACrB,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC;aAC3E,CAAC,CAAC,CAAC;QACN,CAAC,CAAC;QAEF,MAAM,QAAQ,GAAG,eAAe,CAAC;QACjC,MAAM,cAAc,GAAG,OAAO,CAAC;QAC/B,MAAM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE;YACxC,MAAM,iBAAiB,GAAG,mCAAc,CAAC,MAAM,CAAC;gBAC9C,SAAS,EAAE,IAAA,uBAAO,GAAE;gBACpB,IAAI,EAAE,yBAAI,CAAC,MAAM,CAAC,EAAC,OAAO,EAAC,CAAC;aAC7B,CAAC,CAAC;YAEH,OAAO,mCAAc,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,MAAM,EAAE,CAAC;QAC3D,CAAC,CAAC;QAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;YACnD,MAAM,OAAO,GAAG,4BAA4B,CAAC;YAC7C,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAoB,CAAC,CAAC,CAAC;YAE3G,MAAM,cAAc,CAAC,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE;gBAC1G,cAAc;aACf,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACpE,QAAQ,EACR,cAAc,EACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EACnB,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,GAAG,4BAA4B,CAAC;YAC7C,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,wBAAwB,CAAC,CAAC,GAAG,CAAC,WAAW,CACzE,OAAO,CAAC,OAAO,CAAC,EAAoB,CAAC,CACtC,CAAC;YAEF,MAAM,cAAc,CAAC,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE;gBAC1G,cAAc;gBACd,cAAc,EAAE,IAAI;aACrB,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC,oBAAoB,CAC5E,QAAQ,EACR,cAAc,EACd,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EACnB,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,gEAAgE,EAAE,KAAK,IAAI,EAAE;YAC9E,MAAM,OAAO,GAAG,4BAA4B,CAAC;YAC7C,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAoB,CAAC,CAAC,CAAC;YAE9G,MAAM,cAAc,CAAC,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;YAC5G,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,oBAAoB,CAAC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QACjH,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;YAC/E,MAAM,OAAO,GAAG,4BAA4B,CAAC;YAC7C,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,EAAE,8BAA8B,CAAC,CAAC,GAAG,CAAC,WAAW,CAC5E,OAAO,CAAC,OAAO,CAAC,EAAoB,CAAC,CACtC,CAAC;YAEF,MAAM,cAAc,CAAC,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE;gBAC1G,cAAc,EAAE,IAAI;aACrB,CAAC,CAAC;YAEH,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC,oBAAoB,CAC/E,QAAQ,EACR,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EACnB,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;YAC5D,MAAM,OAAO,GAAG,4BAA4B,CAAC;YAC7C,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAoB,CAAC,CAAC,CAAC;YAE3G,MAAM,cAAc,CAAC,WAAW,CAAC,QAAQ,EAAE,kBAAkB,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,aAAa,CAAC,OAAO,CAAC,EAAE;gBAC1G,cAAc;aACf,CAAC,CAAC;YACH,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACpE,QAAQ,EACR,cAAc,EACd,OAAO,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,SAAS,EAAC,CAAC,EAC3C,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;YACzD,MAAM,WAAW,GACf,uwDAAuwD,CAAC;YAC1wD,KAAK,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC,EAAoB,CAAC,CAAC,CAAC;YAE3G,MAAM,cAAc,CAAC,WAAW,CAC9B,QAAQ,EACR,kBAAkB,CAAC,aAAa,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EACzC,aAAa,CAAC,WAAW,CAAC,EAC1B;gBACE,cAAc;aACf,CACF,CAAC;YACF,MAAM,CAAC,SAAS,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,oBAAoB,CACpE,QAAQ,EACR,cAAc,EACd,OAAO,CAAC,gBAAgB,CAAC,EAAC,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,EAAC,CAAC,EACrD,IAAI,CACL,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -20,9 +20,18 @@
20
20
  import UUID from 'uuidjs';
21
21
  import {StatusCodes} from 'http-status-codes';
22
22
  import {APIClient} from '@wireapp/api-client';
23
- import {MessageSendingStatus, QualifiedUserClients} from '@wireapp/api-client/src/conversation';
23
+ import {
24
+ ClientMismatch,
25
+ MessageSendingStatus,
26
+ OTRRecipients,
27
+ QualifiedOTRRecipients,
28
+ QualifiedUserClients,
29
+ UserClients,
30
+ } from '@wireapp/api-client/src/conversation';
31
+ import {GenericMessage, Text} from '@wireapp/protocol-messaging';
24
32
  import {CryptographyService} from '../../cryptography';
25
33
  import {MessageService} from './MessageService';
34
+ import {getUUID} from '../../test/PayloadHelper';
26
35
 
27
36
  const baseMessageSendingStatus: MessageSendingStatus = {
28
37
  deleted: {},
@@ -33,8 +42,16 @@ const baseMessageSendingStatus: MessageSendingStatus = {
33
42
  };
34
43
 
35
44
  type TestUser = {id: string; domain: string; clients: string[]};
36
- const user1: TestUser = {id: UUID.genV4().toString(), domain: '1.wire.test', clients: ['client1.1', 'client1.2']};
37
- const user2: TestUser = {id: UUID.genV4().toString(), domain: '2.wire.test', clients: ['client2.1', 'client2.2']};
45
+ const user1: TestUser = {
46
+ id: UUID.genV4().toString(),
47
+ domain: '1.wire.test',
48
+ clients: ['client1.1', 'client1.2', 'client1.3', 'client1.4'],
49
+ };
50
+ const user2: TestUser = {
51
+ id: UUID.genV4().toString(),
52
+ domain: '2.wire.test',
53
+ clients: ['client2.1', 'client2.2', 'client2.3', 'client2.4'],
54
+ };
38
55
 
39
56
  function generateQualifiedRecipients(users: TestUser[]): QualifiedUserClients {
40
57
  const payload: QualifiedUserClients = {};
@@ -45,28 +62,55 @@ function generateQualifiedRecipients(users: TestUser[]): QualifiedUserClients {
45
62
  return payload;
46
63
  }
47
64
 
65
+ function generateRecipients(users: TestUser[]): UserClients {
66
+ return users.reduce((acc, {id, clients}) => {
67
+ acc[id] = clients;
68
+ return acc;
69
+ }, {} as UserClients);
70
+ }
71
+
72
+ function fakeEncrypt(_: unknown, recipients: QualifiedUserClients): Promise<QualifiedOTRRecipients> {
73
+ const encryptedPayload = Object.entries(recipients).reduce((acc, [domain, users]) => {
74
+ acc[domain] = Object.entries(users).reduce((userClients, [userId, clients]) => {
75
+ userClients[userId] = clients.reduce((payloads, client) => {
76
+ payloads[client] = new Uint8Array();
77
+ return payloads;
78
+ }, {} as any);
79
+ return userClients;
80
+ }, {} as OTRRecipients<Uint8Array>);
81
+ return acc;
82
+ }, {} as QualifiedOTRRecipients);
83
+ return Promise.resolve(encryptedPayload);
84
+ }
85
+
48
86
  describe('MessageService', () => {
49
87
  const apiClient = new APIClient();
50
88
  const cryptographyService = new CryptographyService(apiClient, {} as any);
51
89
  const messageService = new MessageService(apiClient, cryptographyService);
90
+
91
+ beforeEach(() => {
92
+ spyOn(cryptographyService, 'encryptQualified').and.callFake(fakeEncrypt);
93
+ });
94
+
52
95
  describe('sendFederatedMessage', () => {
53
96
  it('sends a message', async () => {
54
97
  spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.returnValue(Promise.resolve(baseMessageSendingStatus));
55
98
  const recipients = generateQualifiedRecipients([user1, user2]);
56
99
 
57
- await messageService.sendFederatedOTRMessage(
58
- 'senderclientid',
59
- {id: 'convid', domain: ''},
60
- recipients,
61
- new Uint8Array(),
62
- );
100
+ await messageService.sendFederatedMessage('senderclientid', recipients, new Uint8Array(), {
101
+ conversationId: {id: 'convid', domain: ''},
102
+ });
63
103
  expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalled();
64
104
  });
65
105
 
66
106
  describe('client mismatch', () => {
67
107
  it('handles client mismatch internally if no onClientMismatch is given', async () => {
68
108
  let spyCounter = 0;
69
- const clientMismatch = {...baseMessageSendingStatus, missing: {'2.wire.test': {[user2.id]: ['client22']}}};
109
+ const clientMismatch = {
110
+ ...baseMessageSendingStatus,
111
+ deleted: {[user1.domain]: {[user1.id]: [user1.clients[0]]}},
112
+ missing: {'2.wire.test': {[user2.id]: ['client22']}},
113
+ };
70
114
  spyOn(apiClient.conversation.api, 'postOTRMessageV2').and.callFake(() => {
71
115
  spyCounter++;
72
116
  if (spyCounter === 1) {
@@ -80,19 +124,13 @@ describe('MessageService', () => {
80
124
  return Promise.resolve(baseMessageSendingStatus);
81
125
  });
82
126
  spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
83
- spyOn(cryptographyService, 'encryptQualified').and.returnValue(
84
- Promise.resolve({'2.wire.test': {[user2.id]: {client22: new Uint8Array()}}}),
85
- );
86
127
 
87
128
  const recipients = generateQualifiedRecipients([user1, user2]);
88
129
 
89
- await messageService.sendFederatedOTRMessage(
90
- 'senderclientid',
91
- {id: 'convid', domain: ''},
92
- recipients,
93
- new Uint8Array(),
94
- {reportMissing: true},
95
- );
130
+ await messageService.sendFederatedMessage('senderclientid', recipients, new Uint8Array(), {
131
+ reportMissing: true,
132
+ conversationId: {id: 'convid', domain: ''},
133
+ });
96
134
  expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(2);
97
135
  });
98
136
 
@@ -113,19 +151,14 @@ describe('MessageService', () => {
113
151
  return Promise.resolve(baseMessageSendingStatus);
114
152
  });
115
153
  spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
116
- spyOn(cryptographyService, 'encryptQualified').and.returnValue(
117
- Promise.resolve({'2.wire.test': {[user2.id]: {client22: new Uint8Array()}}}),
118
- );
119
154
 
120
155
  const recipients = generateQualifiedRecipients([user1, user2]);
121
156
 
122
- await messageService.sendFederatedOTRMessage(
123
- 'senderclientid',
124
- {id: 'convid', domain: ''},
125
- recipients,
126
- new Uint8Array(),
127
- {reportMissing: true, onClientMismatch},
128
- );
157
+ await messageService.sendFederatedMessage('senderclientid', recipients, new Uint8Array(), {
158
+ reportMissing: true,
159
+ onClientMismatch,
160
+ conversationId: {id: 'convid', domain: ''},
161
+ });
129
162
  expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(2);
130
163
  expect(onClientMismatch).toHaveBeenCalledWith(clientMismatch);
131
164
  });
@@ -142,22 +175,132 @@ describe('MessageService', () => {
142
175
  return Promise.reject(error);
143
176
  });
144
177
  spyOn(apiClient.user.api, 'postQualifiedMultiPreKeyBundles').and.returnValue(Promise.resolve({}));
145
- spyOn(cryptographyService, 'encryptQualified').and.returnValue(
146
- Promise.resolve({'2.wire.test': {[user2.id]: {client22: new Uint8Array()}}}),
147
- );
148
178
 
149
179
  const recipients = generateQualifiedRecipients([user1, user2]);
150
180
 
151
- await messageService.sendFederatedOTRMessage(
152
- 'senderclientid',
153
- {id: 'convid', domain: ''},
154
- recipients,
155
- new Uint8Array(),
156
- {reportMissing: true, onClientMismatch},
157
- );
181
+ await messageService.sendFederatedMessage('senderclientid', recipients, new Uint8Array(), {
182
+ reportMissing: true,
183
+ onClientMismatch,
184
+ conversationId: {id: 'convid', domain: ''},
185
+ });
158
186
  expect(apiClient.conversation.api.postOTRMessageV2).toHaveBeenCalledTimes(1);
159
187
  expect(onClientMismatch).toHaveBeenCalledWith(clientMismatch);
160
188
  });
161
189
  });
162
190
  });
191
+
192
+ describe('sendMessage', () => {
193
+ const generateUsers = (userCount: number, clientsPerUser: number): TestUser[] => {
194
+ return Array.from(Array(userCount)).map<TestUser>((_, i) => ({
195
+ id: `user${i}`,
196
+ domain: `${i}.domain`,
197
+ clients: Array.from(Array(clientsPerUser)).map((_, j) => `client${i}${j}`),
198
+ }));
199
+ };
200
+
201
+ const clientId = 'sendingClient';
202
+ const conversationId = 'conv1';
203
+ const createMessage = (content: string) => {
204
+ const customTextMessage = GenericMessage.create({
205
+ messageId: getUUID(),
206
+ text: Text.create({content}),
207
+ });
208
+
209
+ return GenericMessage.encode(customTextMessage).finish();
210
+ };
211
+
212
+ it('should send regular to conversation', async () => {
213
+ const message = 'Lorem ipsum dolor sit amet';
214
+ spyOn(apiClient.conversation.api, 'postOTRMessage').and.returnValue(Promise.resolve({} as ClientMismatch));
215
+
216
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message), {
217
+ conversationId,
218
+ });
219
+ expect(apiClient.conversation.api.postOTRMessage).toHaveBeenCalledWith(
220
+ clientId,
221
+ conversationId,
222
+ jasmine.any(Object),
223
+ true,
224
+ );
225
+ });
226
+
227
+ it('should send protobuf message to conversation', async () => {
228
+ const message = 'Lorem ipsum dolor sit amet';
229
+ spyOn(apiClient.conversation.api, 'postOTRProtobufMessage').and.returnValue(
230
+ Promise.resolve({} as ClientMismatch),
231
+ );
232
+
233
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message), {
234
+ conversationId,
235
+ sendAsProtobuf: true,
236
+ });
237
+ expect(apiClient.conversation.api.postOTRProtobufMessage).toHaveBeenCalledWith(
238
+ clientId,
239
+ conversationId,
240
+ jasmine.any(Object),
241
+ true,
242
+ );
243
+ });
244
+
245
+ it('should broadcast regular message if no conversationId is given', async () => {
246
+ const message = 'Lorem ipsum dolor sit amet';
247
+ spyOn(apiClient.broadcast.api, 'postBroadcastMessage').and.returnValue(Promise.resolve({} as ClientMismatch));
248
+
249
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message));
250
+ expect(apiClient.broadcast.api.postBroadcastMessage).toHaveBeenCalledWith(clientId, jasmine.any(Object), true);
251
+ });
252
+
253
+ it('should broadcast protobuf message if no conversationId is given', async () => {
254
+ const message = 'Lorem ipsum dolor sit amet';
255
+ spyOn(apiClient.broadcast.api, 'postBroadcastProtobufMessage').and.returnValue(
256
+ Promise.resolve({} as ClientMismatch),
257
+ );
258
+
259
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message), {
260
+ sendAsProtobuf: true,
261
+ });
262
+
263
+ expect(apiClient.broadcast.api.postBroadcastProtobufMessage).toHaveBeenCalledWith(
264
+ clientId,
265
+ jasmine.any(Object),
266
+ true,
267
+ );
268
+ });
269
+
270
+ it('should not send as external if payload small', async () => {
271
+ const message = 'Lorem ipsum dolor sit amet';
272
+ spyOn(apiClient.conversation.api, 'postOTRMessage').and.returnValue(Promise.resolve({} as ClientMismatch));
273
+
274
+ await messageService.sendMessage(clientId, generateRecipients(generateUsers(3, 3)), createMessage(message), {
275
+ conversationId,
276
+ });
277
+ expect(apiClient.conversation.api.postOTRMessage).toHaveBeenCalledWith(
278
+ clientId,
279
+ conversationId,
280
+ jasmine.objectContaining({data: undefined}),
281
+ true,
282
+ );
283
+ });
284
+
285
+ it('should send as external if payload is big', async () => {
286
+ const longMessage =
287
+ 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Duis autem';
288
+ spyOn(apiClient.conversation.api, 'postOTRMessage').and.returnValue(Promise.resolve({} as ClientMismatch));
289
+
290
+ await messageService.sendMessage(
291
+ clientId,
292
+ generateRecipients(generateUsers(30, 10)),
293
+ createMessage(longMessage),
294
+ {
295
+ conversationId,
296
+ },
297
+ );
298
+ expect(apiClient.conversation.api.postOTRMessage).toHaveBeenCalledWith(
299
+ clientId,
300
+ conversationId,
301
+ jasmine.objectContaining({data: jasmine.any(String)}),
302
+ true,
303
+ );
304
+ });
305
+ });
163
306
  });