Skip to content

Commit 2731e20

Browse files
authored
MSC4140: support filters on delayed event lookup (#5038)
* MSC4140: support filters on delayed event lookup Support looking up scheduled/finalised delayed events, and looking up a single delayed event. * Add test coverage for delayed event lookup filters * Prettier * Use it.each for test loop * Support multiple delayIds * Support single or multiple delayIds As it may be more common to look up a single delayed event than to look up many of them, support passing a single delayID in the lookup function instead of needing to pass a single-element array.
1 parent 502a513 commit 2731e20

File tree

3 files changed

+48
-18
lines changed

3 files changed

+48
-18
lines changed

spec/unit/matrix-client.spec.ts

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1053,17 +1053,28 @@ describe("MatrixClient", function () {
10531053
);
10541054
});
10551055

1056-
it("can look up delayed events", async () => {
1057-
httpLookups = [
1058-
{
1059-
method: "GET",
1060-
prefix: unstableMSC4140Prefix,
1061-
path: "/delayed_events",
1062-
data: [],
1063-
},
1064-
];
1056+
describe("lookups", () => {
1057+
const statuses = [undefined, "scheduled" as const, "finalised" as const];
1058+
const delayIds = [undefined, "dxyz", ["d123"], ["d456", "d789"]];
1059+
const inputs = statuses.flatMap((status) =>
1060+
delayIds.map((delayId) => [status, delayId] as [(typeof statuses)[0], (typeof delayIds)[0]]),
1061+
);
1062+
it.each(inputs)("can look up delayed events (status = %s, delayId = %s)", async (status, delayId) => {
1063+
httpLookups = [
1064+
{
1065+
method: "GET",
1066+
prefix: unstableMSC4140Prefix,
1067+
path: "/delayed_events",
1068+
expectQueryParams: {
1069+
status,
1070+
delay_id: delayId,
1071+
},
1072+
data: [],
1073+
},
1074+
];
10651075

1066-
await client._unstable_getDelayedEvents();
1076+
await client._unstable_getDelayedEvents(status, delayId);
1077+
});
10671078
});
10681079

10691080
it("can update delayed events", async () => {

src/@types/requests.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ import { type IEventWithRoomId, type SearchKey } from "./search.ts";
2020
import { type IRoomEventFilter } from "../filter.ts";
2121
import { type Direction } from "../models/event-timeline.ts";
2222
import { type PushRuleAction } from "./PushRules.ts";
23+
import { type MatrixError } from "../matrix.ts";
2324
import { type IRoomEvent } from "../sync-accumulator.ts";
2425
import { type EventType, type RelationType, type RoomType } from "./event.ts";
2526

@@ -136,12 +137,22 @@ type DelayedPartialStateEvent = DelayedPartialTimelineEvent & {
136137

137138
type DelayedPartialEvent = DelayedPartialTimelineEvent | DelayedPartialStateEvent;
138139

140+
export type DelayedEventInfoItem = DelayedPartialEvent &
141+
SendDelayedEventResponse &
142+
SendDelayedEventRequestOpts & {
143+
running_since: number;
144+
};
145+
139146
export type DelayedEventInfo = {
140-
delayed_events: (DelayedPartialEvent &
141-
SendDelayedEventResponse &
142-
SendDelayedEventRequestOpts & {
143-
running_since: number;
144-
})[];
147+
scheduled?: DelayedEventInfoItem[];
148+
finalised?: {
149+
delayed_event: DelayedEventInfoItem;
150+
outcome: "send" | "cancel";
151+
reason: "error" | "action" | "delay";
152+
error?: MatrixError["data"];
153+
event_id?: string;
154+
origin_server_ts?: number;
155+
}[];
145156
next_batch?: string;
146157
};
147158

src/client.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3537,21 +3537,29 @@ export class MatrixClient extends TypedEventEmitter<EmittedEvents, ClientEventHa
35373537
}
35383538

35393539
/**
3540-
* Get all pending delayed events for the calling user.
3540+
* Get information about delayed events owned by the requesting user.
35413541
*
35423542
* Note: This endpoint is unstable, and can throw an `Error`.
35433543
* Check progress on [MSC4140](https://github.com/matrix-org/matrix-spec-proposals/pull/4140) for more details.
35443544
*/
35453545
// eslint-disable-next-line
3546-
public async _unstable_getDelayedEvents(fromToken?: string): Promise<DelayedEventInfo> {
3546+
public async _unstable_getDelayedEvents(
3547+
status?: "scheduled" | "finalised",
3548+
delayId?: string | string[],
3549+
fromToken?: string,
3550+
): Promise<DelayedEventInfo> {
35473551
if (!(await this.doesServerSupportUnstableFeature(UNSTABLE_MSC4140_DELAYED_EVENTS))) {
35483552
throw new UnsupportedDelayedEventsEndpointError(
35493553
"Server does not support the delayed events API",
35503554
"getDelayedEvents",
35513555
);
35523556
}
35533557

3554-
const queryDict = fromToken ? { from: fromToken } : undefined;
3558+
const queryDict = {
3559+
from: fromToken,
3560+
status,
3561+
delay_id: delayId,
3562+
};
35553563
return await this.http.authedRequest(Method.Get, "/delayed_events", queryDict, undefined, {
35563564
prefix: `${ClientPrefix.Unstable}/${UNSTABLE_MSC4140_DELAYED_EVENTS}`,
35573565
});

0 commit comments

Comments
 (0)