From 6e641a28c030d7d652a97de776ce162ded94f677 Mon Sep 17 00:00:00 2001 From: Joel Date: Thu, 4 Jul 2024 14:14:14 +0200 Subject: [PATCH] Add ability to choose how many timeline events to sync when peeking (#4300) * Add ability to choose how many timeline events to sync when peeking. * Add a test that covers the new method parameter. * Formatting. --------- Co-authored-by: Joel --- spec/integ/matrix-client-syncing.spec.ts | 111 ++++++++++++----------- src/client.ts | 5 +- src/sync.ts | 5 +- 3 files changed, 63 insertions(+), 58 deletions(-) diff --git a/spec/integ/matrix-client-syncing.spec.ts b/spec/integ/matrix-client-syncing.spec.ts index 3e97c648b..e2d7fe3f2 100644 --- a/spec/integ/matrix-client-syncing.spec.ts +++ b/spec/integ/matrix-client-syncing.spec.ts @@ -2281,67 +2281,70 @@ describe("MatrixClient syncing", () => { httpBackend!.expectedRequests = []; }); - it("should return a room based on the room initialSync API", async () => { - httpBackend!.when("GET", `/rooms/${encodeURIComponent(roomOne)}/initialSync`).respond(200, { - room_id: roomOne, - membership: KnownMembership.Leave, - messages: { - start: "start", - end: "end", - chunk: [ + it.each([undefined, 100])( + "should return a room based on the room initialSync API with limit %s", + async (limit) => { + httpBackend!.when("GET", `/rooms/${encodeURIComponent(roomOne)}/initialSync`).respond(200, { + room_id: roomOne, + membership: KnownMembership.Leave, + messages: { + start: "start", + end: "end", + chunk: [ + { + content: { body: "Message 1" }, + type: "m.room.message", + event_id: "$eventId1", + sender: userA, + origin_server_ts: 12313525, + room_id: roomOne, + }, + { + content: { body: "Message 2" }, + type: "m.room.message", + event_id: "$eventId2", + sender: userB, + origin_server_ts: 12315625, + room_id: roomOne, + }, + ], + }, + state: [ { - content: { body: "Message 1" }, - type: "m.room.message", - event_id: "$eventId1", + content: { name: "Room Name" }, + type: "m.room.name", + event_id: "$eventId", sender: userA, - origin_server_ts: 12313525, - room_id: roomOne, - }, - { - content: { body: "Message 2" }, - type: "m.room.message", - event_id: "$eventId2", - sender: userB, - origin_server_ts: 12315625, + origin_server_ts: 12314525, + state_key: "", room_id: roomOne, }, ], - }, - state: [ - { - content: { name: "Room Name" }, - type: "m.room.name", - event_id: "$eventId", - sender: userA, - origin_server_ts: 12314525, - state_key: "", - room_id: roomOne, - }, - ], - presence: [ - { - content: {}, - type: "m.presence", - sender: userA, - }, - ], - }); - httpBackend!.when("GET", "/events").respond(200, { chunk: [] }); + presence: [ + { + content: {}, + type: "m.presence", + sender: userA, + }, + ], + }); + httpBackend!.when("GET", "/events").respond(200, { chunk: [] }); - const prom = client!.peekInRoom(roomOne); - await httpBackend!.flushAllExpected(); - const room = await prom; + const prom = client!.peekInRoom(roomOne, limit); + await httpBackend!.flushAllExpected(); + const room = await prom; - expect(room.roomId).toBe(roomOne); - expect(room.getMyMembership()).toBe(KnownMembership.Leave); - expect(room.name).toBe("Room Name"); - expect(room.currentState.getStateEvents("m.room.name", "")?.getId()).toBe("$eventId"); - expect(room.timeline[0].getContent().body).toBe("Message 1"); - expect(room.timeline[1].getContent().body).toBe("Message 2"); - client?.stopPeeking(); - httpBackend!.when("GET", "/events").respond(200, { chunk: [] }); - await httpBackend!.flushAllExpected(); - }); + expect(room.roomId).toBe(roomOne); + expect(room.getMyMembership()).toBe(KnownMembership.Leave); + expect(room.name).toBe("Room Name"); + expect(room.currentState.getStateEvents("m.room.name", "")?.getId()).toBe("$eventId"); + expect(room.timeline[0].getContent().body).toBe("Message 1"); + expect(room.timeline[1].getContent().body).toBe("Message 2"); + client?.stopPeeking(); + httpBackend!.when("GET", "/events").respond(200, { chunk: [] }); + await httpBackend!.flushAllExpected(); + }, + ); }); describe("user account data", () => { diff --git a/src/client.ts b/src/client.ts index 46bc38610..32ce1b268 100644 --- a/src/client.ts +++ b/src/client.ts @@ -6603,13 +6603,14 @@ export class MatrixClient extends TypedEventEmitter { + public peekInRoom(roomId: string, limit: number = 20): Promise { this.peekSync?.stopPeeking(); this.peekSync = new SyncApi(this, this.clientOpts, this.buildSyncApiOptions()); - return this.peekSync.peek(roomId); + return this.peekSync.peek(roomId, limit); } /** diff --git a/src/sync.ts b/src/sync.ts index 82dae75af..26b2ac1d1 100644 --- a/src/sync.ts +++ b/src/sync.ts @@ -401,17 +401,18 @@ export class SyncApi { * Peek into a room. This will result in the room in question being synced so it * is accessible via getRooms(). Live updates for the room will be provided. * @param roomId - The room ID to peek into. + * @param limit - The number of timeline events to initially retrieve. * @returns A promise which resolves once the room has been added to the * store. */ - public peek(roomId: string): Promise { + public peek(roomId: string, limit: number = 20): Promise { if (this._peekRoom?.roomId === roomId) { return Promise.resolve(this._peekRoom); } const client = this.client; this._peekRoom = this.createRoom(roomId); - return this.client.roomInitialSync(roomId, 20).then((response) => { + return this.client.roomInitialSync(roomId, limit).then((response) => { if (this._peekRoom?.roomId !== roomId) { throw new Error("Peeking aborted"); }