Skip to content

Commit 1a56b93

Browse files
authored
MSC4157 / MSC4140: remove parent delay IDs (#162)
* MSC4157 / MSC4140: remove parent delay IDs Drop support for sending delayed events that are sent upon the scheduled sending of another delayed event. This feature has been absent from the delayed event MSC for some time now, and is not known to have been implemented in any server. * Run prettier * Keep supporting parent delay IDs in WidgetApi Do this to avoid having to declare a breaking change, as the affected WidgetApi methods are non-experimental. However, don't add support back for them back to the WidgetDriver, because its affected methods _are_ marked as experimental, meaning that API-compatible changes to them shouldn't be considered as breaking. To achieve this, simply have the ClientWidgetApi not send parent delay IDs to the driver.
1 parent 0e2b21c commit 1a56b93

6 files changed

Lines changed: 209 additions & 231 deletions

File tree

src/ClientWidgetApi.ts

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -626,8 +626,12 @@ export class ClientWidgetApi extends EventEmitter {
626626
});
627627
}
628628

629-
const isDelayedEvent = request.data.delay !== undefined || request.data.parent_delay_id !== undefined;
630-
if (isDelayedEvent && !this.hasCapability(MatrixCapabilities.MSC4157SendDelayedEvent)) {
629+
if (request.data.parent_delay_id !== undefined) {
630+
console.warn("Data includes parent_delay_id, but the widgetDriver ignores it");
631+
}
632+
633+
const delay = request.data.delay;
634+
if (delay !== undefined && !this.hasCapability(MatrixCapabilities.MSC4157SendDelayedEvent)) {
631635
return this.transport.reply<IWidgetApiErrorResponseData>(request, {
632636
error: { message: `Missing capability for ${MatrixCapabilities.MSC4157SendDelayedEvent}` },
633637
});
@@ -653,10 +657,9 @@ export class ClientWidgetApi extends EventEmitter {
653657
});
654658
}
655659

656-
if (isDelayedEvent) {
660+
if (delay !== undefined) {
657661
sendEventPromise = this.driver.sendDelayedEvent(
658-
request.data.delay ?? null,
659-
request.data.parent_delay_id ?? null,
662+
delay,
660663
request.data.type,
661664
request.data.content || {},
662665
request.data.state_key,
@@ -690,21 +693,16 @@ export class ClientWidgetApi extends EventEmitter {
690693
request.data.room_id,
691694
];
692695

693-
if (isDelayedEvent && request.data.sticky_duration_ms) {
696+
if (delay !== undefined && request.data.sticky_duration_ms) {
694697
sendEventPromise = this.driver.sendDelayedStickyEvent(
695-
request.data.delay ?? null,
696-
request.data.parent_delay_id ?? null,
698+
delay,
697699
request.data.sticky_duration_ms,
698700
request.data.type,
699701
content,
700702
request.data.room_id,
701703
);
702-
} else if (isDelayedEvent) {
703-
sendEventPromise = this.driver.sendDelayedEvent(
704-
request.data.delay ?? null,
705-
request.data.parent_delay_id ?? null,
706-
...params,
707-
);
704+
} else if (delay !== undefined) {
705+
sendEventPromise = this.driver.sendDelayedEvent(delay, ...params);
708706
} else if (request.data.sticky_duration_ms) {
709707
sendEventPromise = this.driver.sendStickyEvent(
710708
request.data.sticky_duration_ms,

src/WidgetApi.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,17 +435,63 @@ export class WidgetApi extends EventEmitter {
435435
return this.transport.send<IModalWidgetReturnData>(WidgetApiFromWidgetAction.CloseModalWidget, data).then();
436436
}
437437

438+
public sendRoomEvent(
439+
eventType: string,
440+
content: unknown,
441+
roomId?: string,
442+
delay?: number,
443+
stickyDurationMs?: number,
444+
): Promise<ISendEventFromWidgetResponseData>;
445+
446+
/**
447+
* @deprecated Use the overload of this function without {@link parentDelayId} instead.
448+
*/
438449
public sendRoomEvent(
439450
eventType: string,
440451
content: unknown,
441452
roomId?: string,
442453
delay?: number,
443454
parentDelayId?: string,
444455
stickyDurationMs?: number,
456+
): Promise<ISendEventFromWidgetResponseData>;
457+
458+
public sendRoomEvent(
459+
eventType: string,
460+
content: unknown,
461+
roomId?: string,
462+
delay?: number,
463+
parentDelayIdOrStickyDurationMs?: string | number,
464+
stickyDurationMs?: number,
445465
): Promise<ISendEventFromWidgetResponseData> {
466+
let parentDelayId: string | undefined;
467+
if (typeof parentDelayIdOrStickyDurationMs === "number") {
468+
stickyDurationMs = parentDelayIdOrStickyDurationMs;
469+
} else {
470+
parentDelayId = parentDelayIdOrStickyDurationMs;
471+
}
446472
return this.sendEvent(eventType, undefined, content, roomId, delay, parentDelayId, stickyDurationMs);
447473
}
448474

475+
public sendStateEvent(
476+
eventType: string,
477+
stateKey: string,
478+
content: unknown,
479+
roomId?: string,
480+
delay?: number,
481+
): Promise<ISendEventFromWidgetResponseData>;
482+
483+
/**
484+
* @deprecated Use the overload of this function without {@link parentDelayId} instead.
485+
*/
486+
public sendStateEvent(
487+
eventType: string,
488+
stateKey: string,
489+
content: unknown,
490+
roomId?: string,
491+
delay?: number,
492+
parentDelayId?: string,
493+
): Promise<ISendEventFromWidgetResponseData>;
494+
449495
public sendStateEvent(
450496
eventType: string,
451497
stateKey: string,

src/driver/WidgetDriver.ts

Lines changed: 4 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -138,10 +138,7 @@ export abstract class WidgetDriver {
138138
* Sends a delayed event into a room. If `roomId` is falsy, the client should send it
139139
* into the room the user is currently looking at. The widget API will have already
140140
* verified that the widget is capable of sending the event to that room.
141-
* @param {number|null} delay How much later to send the event, or null to not send the
142-
* event automatically. May not be null if {@link parentDelayId} is null.
143-
* @param {string|null} parentDelayId The ID of the delayed event this one is grouped with,
144-
* or null if it will be put in a new group. May not be null if {@link delay} is null.
141+
* @param {number} delay How much later to send the event.
145142
* @param {string} eventType The event type of the event to be sent.
146143
* @param {*} content The content for the event to be sent.
147144
* @param {string|null} stateKey The state key if the event to be sent a state event,
@@ -153,8 +150,7 @@ export abstract class WidgetDriver {
153150
* @throws Rejected when the delayed event could not be sent.
154151
*/
155152
public sendDelayedEvent(
156-
delay: number | null,
157-
parentDelayId: string | null,
153+
delay: number,
158154
eventType: string,
159155
content: unknown,
160156
stateKey: string | null = null,
@@ -169,10 +165,7 @@ export abstract class WidgetDriver {
169165
* into the room the user is currently looking at. The widget API will have already
170166
* verified that the widget is capable of sending the event to that room.
171167
* @param {number} stickyDurationMs The length of time a sticky event may remain sticky, in milliseconds.
172-
* @param {number|null} delay How much later to send the event, or null to not send the
173-
* event automatically. May not be null if {@link parentDelayId} is null.
174-
* @param {string|null} parentDelayId The ID of the delayed event this one is grouped with,
175-
* or null if it will be put in a new group. May not be null if {@link delay} is null.
168+
* @param {number} delay How much later to send the event.
176169
* @param {string} eventType The event type to be sent.
177170
* @param {*} content The content for the event.
178171
* @param {string|null} roomId The room ID to send the event to. If falsy, the room the
@@ -182,8 +175,7 @@ export abstract class WidgetDriver {
182175
* @throws Rejected when the event could not be sent.
183176
*/
184177
public sendDelayedStickyEvent(
185-
delay: number | null,
186-
parentDelayId: string | null,
178+
delay: number,
187179
stickyDurationMs: number,
188180
eventType: string,
189181
content: unknown,

src/interfaces/SendEventAction.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export interface ISendEventFromWidgetRequestData extends IWidgetApiRequestData {
2727

2828
// MSC4157
2929
delay?: number; // eslint-disable-line camelcase
30+
/** @deprecated */
3031
parent_delay_id?: string; // eslint-disable-line camelcase
3132

3233
// MSC4407

0 commit comments

Comments
 (0)