Skip to content

Commit b3c2749

Browse files
committed
Support future sending via Widget API (MSC4157)
Depends on matrix-org/matrix-widget-api#90
1 parent 5cc00ad commit b3c2749

File tree

1 file changed

+65
-7
lines changed

1 file changed

+65
-7
lines changed

src/embedded.ts

+65-7
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,14 @@ import {
2626
} from "matrix-widget-api";
2727

2828
import { MatrixEvent, IEvent, IContent, EventStatus } from "./models/event";
29-
import { ISendEventResponse, SendFutureRequestOpts, SendFutureResponse } from "./@types/requests";
30-
import { EventType } from "./@types/event";
29+
import {
30+
ISendEventResponse,
31+
SendActionFutureResponse,
32+
SendFutureRequestOpts,
33+
SendFutureResponse,
34+
SendTimeoutFutureResponse,
35+
} from "./@types/requests";
36+
import { EventType, StateEvents } from "./@types/event";
3137
import { logger } from "./logger";
3238
import {
3339
MatrixClient,
@@ -254,14 +260,37 @@ export class RoomWidgetClient extends MatrixClient {
254260
event: MatrixEvent,
255261
futureOpts: F,
256262
): Promise<SendFutureResponse<F>>;
257-
protected async encryptAndSendEvent<F extends SendFutureRequestOpts>(
263+
protected async encryptAndSendEvent(
258264
room: Room,
259265
event: MatrixEvent,
260-
futureOpts?: F,
261-
): Promise<ISendEventResponse | SendFutureResponse<F>> {
266+
futureOpts?: SendFutureRequestOpts,
267+
): Promise<ISendEventResponse | SendTimeoutFutureResponse | SendActionFutureResponse> {
262268
if (futureOpts) {
263-
throw new Error("Future sending via widgets is not implemented");
269+
// TODO: updatePendingEvent for futures?
270+
const response = await this.widgetApi.sendRoomEvent(
271+
event.getType(),
272+
event.getContent(),
273+
room.roomId,
274+
"future_timeout" in futureOpts ? futureOpts.future_timeout : undefined,
275+
"future_group_id" in futureOpts ? futureOpts.future_group_id : undefined,
276+
);
277+
if (!response.future_group_id) {
278+
throw new Error("'future_group_id' absent from response to a futures request");
279+
}
280+
if (!response.send_token) {
281+
throw new Error("'send_token' absent from response to a futures request");
282+
}
283+
if (!response.cancel_token) {
284+
throw new Error("'cancel_token' absent from response to a futures request");
285+
}
286+
return {
287+
future_group_id: response.future_group_id,
288+
send_token: response.send_token,
289+
cancel_token: response.cancel_token,
290+
...(response.refresh_token && { refresh_token: response.refresh_token }),
291+
};
264292
}
293+
265294
let response: ISendEventFromWidgetResponseData;
266295
try {
267296
response = await this.widgetApi.sendRoomEvent(event.getType(), event.getContent(), room.roomId);
@@ -271,6 +300,9 @@ export class RoomWidgetClient extends MatrixClient {
271300
}
272301

273302
room.updatePendingEvent(event, EventStatus.SENT, response.event_id);
303+
if (!response.event_id) {
304+
throw new Error("'event_id' absent from response to an event request");
305+
}
274306
return { event_id: response.event_id };
275307
}
276308

@@ -280,7 +312,33 @@ export class RoomWidgetClient extends MatrixClient {
280312
content: any,
281313
stateKey = "",
282314
): Promise<ISendEventResponse> {
283-
return await this.widgetApi.sendStateEvent(eventType, stateKey, content, roomId);
315+
const response = await this.widgetApi.sendStateEvent(eventType, stateKey, content, roomId);
316+
if (response.event_id === undefined) {
317+
throw new Error("'event_id' absent from response to an event request");
318+
}
319+
return { event_id: response.event_id };
320+
}
321+
322+
/**
323+
* @experimental This currently relies on an unstable MSC (MSC4140).
324+
*/
325+
// eslint-disable-next-line
326+
public async _unstable_sendStateFuture<K extends keyof StateEvents, F extends SendFutureRequestOpts>(
327+
roomId: string,
328+
futureOpts: F,
329+
eventType: K,
330+
content: StateEvents[K],
331+
stateKey = "",
332+
): Promise<SendFutureResponse<F>> {
333+
// TODO: better type checking
334+
return (await this.widgetApi.sendStateEvent(
335+
eventType,
336+
stateKey,
337+
content,
338+
roomId,
339+
"future_timeout" in futureOpts ? futureOpts.future_timeout : undefined,
340+
"future_group_id" in futureOpts ? futureOpts.future_group_id : undefined,
341+
)) as unknown as SendFutureResponse<F>;
284342
}
285343

286344
public async sendToDevice(eventType: string, contentMap: SendToDeviceContentMap): Promise<{}> {

0 commit comments

Comments
 (0)