@@ -27,7 +27,7 @@ import {
2727
2828import { MatrixEvent , IEvent , IContent , EventStatus } from "./models/event" ;
2929import { ISendEventResponse , SendFutureRequestOpts , SendFutureResponse } from "./@types/requests" ;
30- import { EventType } from "./@types/event" ;
30+ import { EventType , StateEvents } from "./@types/event" ;
3131import { logger } from "./logger" ;
3232import {
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