Skip to content

Commit 7be6b9e

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

File tree

1 file changed

+44
-3
lines changed

1 file changed

+44
-3
lines changed

src/embedded.ts

Lines changed: 44 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ import {
2727

2828
import { MatrixEvent, IEvent, IContent, EventStatus } from "./models/event";
2929
import { ISendEventResponse, SendFutureRequestOpts, SendFutureResponse } from "./@types/requests";
30-
import { EventType } from "./@types/event";
30+
import { EventType, StateEvents } from "./@types/event";
3131
import { logger } from "./logger";
3232
import {
3333
MatrixClient,
@@ -260,8 +260,20 @@ export class RoomWidgetClient extends MatrixClient {
260260
futureOpts?: SendFutureRequestOpts,
261261
): Promise<ISendEventResponse | SendFutureResponse> {
262262
if (futureOpts) {
263-
throw new Error("Future sending via widgets is not implemented");
263+
// TODO: updatePendingEvent for futures?
264+
const response = await this.widgetApi.sendRoomEvent(
265+
event.getType(),
266+
event.getContent(),
267+
room.roomId,
268+
"future_timeout" in futureOpts ? futureOpts.future_timeout : undefined,
269+
"parent_future_id" in futureOpts ? futureOpts.parent_future_id : undefined,
270+
);
271+
if (!response.future_id) {
272+
throw new Error("'future_id' absent from response to a futures request");
273+
}
274+
return { future_id: response.future_id };
264275
}
276+
265277
let response: ISendEventFromWidgetResponseData;
266278
try {
267279
response = await this.widgetApi.sendRoomEvent(event.getType(), event.getContent(), room.roomId);
@@ -271,6 +283,9 @@ export class RoomWidgetClient extends MatrixClient {
271283
}
272284

273285
room.updatePendingEvent(event, EventStatus.SENT, response.event_id);
286+
if (!response.event_id) {
287+
throw new Error("'event_id' absent from response to an event request");
288+
}
274289
return { event_id: response.event_id };
275290
}
276291

@@ -280,7 +295,33 @@ export class RoomWidgetClient extends MatrixClient {
280295
content: any,
281296
stateKey = "",
282297
): Promise<ISendEventResponse> {
283-
return await this.widgetApi.sendStateEvent(eventType, stateKey, content, roomId);
298+
const response = await this.widgetApi.sendStateEvent(eventType, stateKey, content, roomId);
299+
if (response.event_id === undefined) {
300+
throw new Error("'event_id' absent from response to an event request");
301+
}
302+
return { event_id: response.event_id };
303+
}
304+
305+
/**
306+
* @experimental This currently relies on an unstable MSC (MSC4140).
307+
*/
308+
// eslint-disable-next-line
309+
public async _unstable_sendStateFuture<K extends keyof StateEvents>(
310+
roomId: string,
311+
futureOpts: SendFutureRequestOpts,
312+
eventType: K,
313+
content: StateEvents[K],
314+
stateKey = "",
315+
): Promise<SendFutureResponse> {
316+
// TODO: better type checking
317+
return (await this.widgetApi.sendStateEvent(
318+
eventType,
319+
stateKey,
320+
content,
321+
roomId,
322+
"future_timeout" in futureOpts ? futureOpts.future_timeout : undefined,
323+
"parent_future_id" in futureOpts ? futureOpts.parent_future_id : undefined,
324+
)) as SendFutureResponse;
284325
}
285326

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

0 commit comments

Comments
 (0)