diff --git a/src/rust-crypto/OutgoingRequestProcessor.ts b/src/rust-crypto/OutgoingRequestProcessor.ts index e551c0dbaa4..16954736d2d 100644 --- a/src/rust-crypto/OutgoingRequestProcessor.ts +++ b/src/rust-crypto/OutgoingRequestProcessor.ts @@ -31,6 +31,7 @@ import { IHttpOpts, MatrixHttpApi, Method } from "../http-api"; import { QueryDict } from "../utils"; import { IAuthDict, UIAuthCallback } from "../interactive-auth"; import { UIAResponse } from "../@types/uia"; +import { ToDeviceMessageId } from "../@types/event"; /** * Common interface for all the request types returned by `OlmMachine.outgoingRequests`. @@ -82,10 +83,7 @@ export class OutgoingRequestProcessor { msg.body, ); } else if (msg instanceof ToDeviceRequest) { - const path = - `/_matrix/client/v3/sendToDevice/${encodeURIComponent(msg.event_type)}/` + - encodeURIComponent(msg.txn_id); - resp = await this.rawJsonRequest(Method.Put, path, {}, msg.body); + resp = await this.sendToDeviceRequest(msg); } else if (msg instanceof RoomMessageRequest) { const path = `/_matrix/client/v3/rooms/${encodeURIComponent(msg.room_id)}/send/` + @@ -122,6 +120,34 @@ export class OutgoingRequestProcessor { } } + /** + * Send the HTTP request for a `ToDeviceRequest` + * + * @param request request to send + * @returns JSON-serialized body of the response, if successful + */ + private async sendToDeviceRequest(request: ToDeviceRequest): Promise { + // a bit of extra logging, to help trace to-device messages through the system + const parsedBody: { messages: Record>> } = JSON.parse(request.body); + + const messageList = []; + for (const [userId, perUserMessages] of Object.entries(parsedBody.messages)) { + for (const [deviceId, message] of Object.entries(perUserMessages)) { + messageList.push(`${userId}/${deviceId} (msgid ${message[ToDeviceMessageId]})`); + } + } + + logger.info( + `Sending batch of to-device messages. type=${request.event_type} txnid=${request.txn_id}`, + messageList, + ); + + const path = + `/_matrix/client/v3/sendToDevice/${encodeURIComponent(request.event_type)}/` + + encodeURIComponent(request.txn_id); + return await this.rawJsonRequest(Method.Put, path, {}, request.body); + } + private async makeRequestWithUIA( method: Method, path: string,