@@ -26,8 +26,14 @@ import {
2626} from "matrix-widget-api" ;
2727
2828import { 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" ;
3137import { logger } from "./logger" ;
3238import {
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