diff --git a/package.json b/package.json index d1a8985256b..b3ac2263a0c 100644 --- a/package.json +++ b/package.json @@ -132,7 +132,7 @@ "matrix-encrypt-attachment": "^1.0.3", "matrix-events-sdk": "0.0.1", "matrix-js-sdk": "github:matrix-org/matrix-js-sdk#develop", - "matrix-widget-api": "^1.10.0", + "matrix-widget-api": "^1.15.0", "memoize-one": "^6.0.0", "mime": "^4.0.4", "oidc-client-ts": "^3.0.1", diff --git a/src/stores/widgets/StopGapWidget.ts b/src/stores/widgets/StopGapWidget.ts index c8de3bf0f13..d43fd140fc8 100644 --- a/src/stores/widgets/StopGapWidget.ts +++ b/src/stores/widgets/StopGapWidget.ts @@ -522,10 +522,8 @@ export class StopGapWidget extends EventEmitter { }); }; - private onToDeviceMessage = async (payload: ReceivedToDeviceMessage): Promise => { - const { message, encryptionInfo } = payload; - // TODO: Update the widget API to use a proper IToDeviceMessage instead of a IRoomEvent - await this.messaging?.feedToDevice(message as IRoomEvent, encryptionInfo != null); + private onToDeviceMessage = async ({ message, encryptionInfo }: ReceivedToDeviceMessage): Promise => { + await this.messaging?.feedToDevice(message, encryptionInfo != null); }; /** diff --git a/src/stores/widgets/StopGapWidgetDriver.ts b/src/stores/widgets/StopGapWidgetDriver.ts index afd0a85cfc5..a4263d716ff 100644 --- a/src/stores/widgets/StopGapWidgetDriver.ts +++ b/src/stores/widgets/StopGapWidgetDriver.ts @@ -122,6 +122,7 @@ export class StopGapWidgetDriver extends WidgetDriver { this.allowedCapabilities.add(`org.matrix.msc2762.timeline:${inRoomId}`); this.allowedCapabilities.add(MatrixCapabilities.MSC4157SendDelayedEvent); this.allowedCapabilities.add(MatrixCapabilities.MSC4157UpdateDelayedEvent); + this.allowedCapabilities.add(MatrixCapabilities.MSC4354SendStickyEvent); this.allowedCapabilities.add( WidgetEventCapability.forStateEvent(EventDirection.Receive, EventType.RoomName).raw, @@ -345,6 +346,31 @@ export class StopGapWidgetDriver extends WidgetDriver { return { roomId, eventId: r.event_id }; } + /** + * @experimental Part of MSC4354 + * @see {@link WidgetDriver#sendStickyEvent} + */ + public async sendStickyEvent( + stickyDurationMs: number, + eventType: string, + content: unknown, + targetRoomId?: string | null, + ): Promise { + const client = MatrixClientPeg.get(); + const roomId = targetRoomId || SdkContextClass.instance.roomViewStore.getRoomId(); + + if (!client || !roomId) throw new Error("Not in a room or not attached to a client"); + + const r = await client._unstable_sendStickyEvent( + roomId, + stickyDurationMs, + null, + eventType as keyof TimelineEvents, + content as TimelineEvents[keyof TimelineEvents] & { msc4354_sticky_key: string }, + ); + return { roomId, eventId: r.event_id }; + } + /** * @experimental Part of MSC4140 & MSC4157 * @see {@link WidgetDriver#sendDelayedEvent} @@ -422,6 +448,48 @@ export class StopGapWidgetDriver extends WidgetDriver { }; } + /** + * @experimental Part of MSC4354 + * @see {@link WidgetDriver#sendStickyEvent} + */ + public async sendDelayedStickyEvent( + delay: number | null, + parentDelayId: string | null, + stickyDurationMs: number, + eventType: string, + content: unknown, + targetRoomId?: string | null, + ): Promise { + const client = MatrixClientPeg.get(); + const roomId = targetRoomId || SdkContextClass.instance.roomViewStore.getRoomId(); + + if (!client || !roomId) throw new Error("Not in a room or not attached to a client"); + + let delayOpts; + if (delay !== null) { + delayOpts = { + delay, + ...(parentDelayId !== null && { parent_delay_id: parentDelayId }), + }; + } else if (parentDelayId !== null) { + delayOpts = { + parent_delay_id: parentDelayId, + }; + } else { + throw new Error("Must provide at least one of delay or parentDelayId"); + } + + const r = await client._unstable_sendStickyDelayedEvent( + roomId, + stickyDurationMs, + delayOpts, + null, + eventType as keyof TimelineEvents, + content as TimelineEvents[keyof TimelineEvents] & { msc4354_sticky_key: string }, + ); + return { roomId, delayId: r.delay_id }; + } + /** * @experimental Part of MSC4140 & MSC4157 */ diff --git a/yarn.lock b/yarn.lock index 09f10b19e6a..776cdf75127 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4218,7 +4218,7 @@ classnames "^2.5.1" vaul "^1.0.0" -"@vector-im/matrix-wysiwyg-wasm@link:../../Library/Caches/Yarn/v6/npm-@vector-im-matrix-wysiwyg-2.40.0-53c9ca5ea907d91e4515da64f20a82e5586b882c-integrity/node_modules/bindings/wysiwyg-wasm": +"@vector-im/matrix-wysiwyg-wasm@link:../../../.cache/yarn/v6/npm-@vector-im-matrix-wysiwyg-2.40.0-53c9ca5ea907d91e4515da64f20a82e5586b882c-integrity/node_modules/bindings/wysiwyg-wasm": version "0.0.0" "@vector-im/matrix-wysiwyg@2.40.0": @@ -9695,6 +9695,14 @@ matrix-widget-api@^1.10.0: "@types/events" "^3.0.0" events "^3.2.0" +matrix-widget-api@^1.15.0: + version "1.15.0" + resolved "https://registry.yarnpkg.com/matrix-widget-api/-/matrix-widget-api-1.15.0.tgz#a508f72a5993a95382bdf890bd9e54525295b321" + integrity sha512-Yu9rX9wyF3A1sqviKgiYHz8aGgL3HhJe9OXKi/lccr1eZnNb6y+ELdbshTjs+VLKM4rkTWt6CE3THsw3f/CZhg== + dependencies: + "@types/events" "^3.0.0" + events "^3.2.0" + mdn-data@2.0.28: version "2.0.28" resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba"