fix: override cancelScheduledDelayedEvent/restart/send in CallWidgetDriver
CI / Build & Quality Checks (push) Successful in 10m34s

The base WidgetDriver throws Failed to override function for these
methods. ClientWidgetApi routes update_delayed_event widget actions to
cancelScheduledDelayedEvent, restartScheduledDelayedEvent, or
sendScheduledDelayedEvent. Without these overrides every delayed-event
refresh from element-call fails, causing MembershipManager to drop the
call after retries.

Also make listenAction auto-call preventDefault so io.element.join and
other custom widget actions return success. Add set_always_on_screen
handler so element-call PiP requests are acknowledged.
This commit is contained in:
Lotus Bot
2026-05-22 21:51:17 -04:00
parent 4a0218682e
commit 2de0b661c8
2 changed files with 22 additions and 1 deletions
+10 -1
View File
@@ -12,6 +12,7 @@ import {
IRoomEvent,
IWidget,
Widget,
WidgetApiFromWidgetAction,
WidgetApiToWidgetAction,
WidgetDriver,
} from 'matrix-widget-api';
@@ -248,6 +249,10 @@ export class CallEmbed {
this.disposables.push(
this.listenAction(ElementWidgetActions.JoinCall, this.onCallJoined.bind(this)),
);
// Acknowledge set_always_on_screen; we manage PiP ourselves so just return success
this.disposables.push(
this.listenAction(WidgetApiFromWidgetAction.UpdateAlwaysOnScreen, () => {}),
);
// Populate the map of "read up to" events for this widget with the current event in every room.
// This is a bit inefficient, but should be okay. We do this for all rooms in case the widget
@@ -460,7 +465,11 @@ export class CallEmbed {
}
public listenAction<T>(type: string, callback: (event: CustomEvent<T>) => void) {
return this.listenEvent(`action:${type}`, callback);
const wrapped = (ev: CustomEvent<T>) => {
ev.preventDefault();
callback(ev);
};
return this.listenEvent(`action:${type}`, wrapped);
}
public listenEvent<T>(type: string, callback: (event: T) => void) {
+12
View File
@@ -148,6 +148,18 @@ export class CallWidgetDriver extends WidgetDriver {
await client._unstable_updateDelayedEvent(delayId, action);
}
public async cancelScheduledDelayedEvent(delayId: string): Promise<void> {
await this.mx._unstable_cancelScheduledDelayedEvent(delayId);
}
public async restartScheduledDelayedEvent(delayId: string): Promise<void> {
await this.mx._unstable_restartScheduledDelayedEvent(delayId);
}
public async sendScheduledDelayedEvent(delayId: string): Promise<void> {
await this.mx._unstable_sendScheduledDelayedEvent(delayId);
}
public async sendToDevice(
eventType: string,
encrypted: boolean,