@@ -26,8 +26,14 @@ import {
26
26
} from "matrix-widget-api" ;
27
27
28
28
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" ;
31
37
import { logger } from "./logger" ;
32
38
import {
33
39
MatrixClient ,
@@ -254,14 +260,37 @@ export class RoomWidgetClient extends MatrixClient {
254
260
event : MatrixEvent ,
255
261
futureOpts : F ,
256
262
) : Promise < SendFutureResponse < F > > ;
257
- protected async encryptAndSendEvent < F extends SendFutureRequestOpts > (
263
+ protected async encryptAndSendEvent (
258
264
room : Room ,
259
265
event : MatrixEvent ,
260
- futureOpts ?: F ,
261
- ) : Promise < ISendEventResponse | SendFutureResponse < F > > {
266
+ futureOpts ?: SendFutureRequestOpts ,
267
+ ) : Promise < ISendEventResponse | SendTimeoutFutureResponse | SendActionFutureResponse > {
262
268
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
+ } ;
264
292
}
293
+
265
294
let response : ISendEventFromWidgetResponseData ;
266
295
try {
267
296
response = await this . widgetApi . sendRoomEvent ( event . getType ( ) , event . getContent ( ) , room . roomId ) ;
@@ -271,6 +300,9 @@ export class RoomWidgetClient extends MatrixClient {
271
300
}
272
301
273
302
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
+ }
274
306
return { event_id : response . event_id } ;
275
307
}
276
308
@@ -280,7 +312,33 @@ export class RoomWidgetClient extends MatrixClient {
280
312
content : any ,
281
313
stateKey = "" ,
282
314
) : 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 > ;
284
342
}
285
343
286
344
public async sendToDevice ( eventType : string , contentMap : SendToDeviceContentMap ) : Promise < { } > {
0 commit comments