From 693db7817b63f3383be51baf4bedf7d4194311ca Mon Sep 17 00:00:00 2001 From: Thomas Belin Date: Mon, 28 Feb 2022 18:05:32 +0100 Subject: [PATCH] feat(api-client): Send federated broadcast messages --- packages/api-client/src/APIClient.ts | 5 ++-- .../api-client/src/broadcast/BroadcastAPI.ts | 27 ++++++++++++++++++- .../conversation/message/MessageService.ts | 3 +-- 3 files changed, 29 insertions(+), 6 deletions(-) diff --git a/packages/api-client/src/APIClient.ts b/packages/api-client/src/APIClient.ts index f06d4d3334..d73654cd49 100644 --- a/packages/api-client/src/APIClient.ts +++ b/packages/api-client/src/APIClient.ts @@ -185,6 +185,7 @@ export class APIClient extends EventEmitter { } private configureApis(backendFeatures: BackendFeatures): Apis { + this.logger.info('configuring APIs with config', backendFeatures); return { account: new AccountAPI(this.transport.http), asset: new AssetAPI(this.transport.http), @@ -242,9 +243,7 @@ export class APIClient extends EventEmitter { } let backendVersions: BackendVersionResponse = {supported: [0]}; try { - backendVersions = await ( - await this.transport.http.sendRequest({url: '/api-version'}) - ).data; + backendVersions = (await this.transport.http.sendRequest({url: '/api-version'})).data; } catch (error) {} const highestCommonVersion = backendVersions.supported .sort() diff --git a/packages/api-client/src/broadcast/BroadcastAPI.ts b/packages/api-client/src/broadcast/BroadcastAPI.ts index 729c9e32e0..d66ec39bce 100644 --- a/packages/api-client/src/broadcast/BroadcastAPI.ts +++ b/packages/api-client/src/broadcast/BroadcastAPI.ts @@ -21,7 +21,7 @@ import {proteus as ProtobufOTR} from '@wireapp/protocol-messaging/web/otr'; import type {AxiosRequestConfig} from 'axios'; import {ValidationError} from '../validation/'; -import type {ClientMismatch, NewOTRMessage} from '../conversation/'; +import type {ClientMismatch, MessageSendingStatus, NewOTRMessage} from '../conversation/'; import type {HttpClient} from '../http/'; export class BroadcastAPI { @@ -29,6 +29,7 @@ export class BroadcastAPI { public static readonly URL = { BROADCAST: '/broadcast/otr/messages', + BROADCAST_FEDERATED: '/broadcast/proteus/messages', }; /** @@ -114,4 +115,28 @@ export class BroadcastAPI { const response = await this.client.sendProtocolBuffer(config); return response.data; } + + /** + * Broadcast an encrypted message to all team members and all contacts in federated environments + * @param sendingClientId The sender's client ID + * @param messageData The message content + * @see https://staging-nginz-https.zinfra.io/swagger-ui/tab.html#!/postOtrBroadcast + */ + public async postBroadcastFederatedMessage( + sendingClientId: string, + messageData: ProtobufOTR.QualifiedNewOtrMessage, + ): Promise { + if (!sendingClientId) { + throw new ValidationError('Unable to send OTR message without client ID.'); + } + + const config: AxiosRequestConfig = { + data: ProtobufOTR.QualifiedNewOtrMessage.encode(messageData).finish().slice(), + method: 'post', + url: BroadcastAPI.URL.BROADCAST_FEDERATED, + }; + + const response = await this.client.sendProtocolBuffer(config); + return response.data; + } } diff --git a/packages/core/src/main/conversation/message/MessageService.ts b/packages/core/src/main/conversation/message/MessageService.ts index a590ec5619..5cde76f4cc 100644 --- a/packages/core/src/main/conversation/message/MessageService.ts +++ b/packages/core/src/main/conversation/message/MessageService.ts @@ -211,8 +211,7 @@ export class MessageService { } if (!options.conversationId) { - //TODO implement federated broadcast sending - throw new Error('Unimplemented federated broadcast'); + return this.apiClient.api.broadcast.postBroadcastFederatedMessage(sendingClientId, protoMessage); } const {id, domain} = options.conversationId;