1
0
mirror of https://github.com/matrix-org/matrix-js-sdk.git synced 2025-07-31 15:24:23 +03:00

Fix threads ending up with chunks of their timelines missing (#3618)

* Fix threads ending up with chunks of their timelines missing

* delint
This commit is contained in:
Michael Telatynski
2023-07-25 16:28:52 +01:00
committed by GitHub
parent de7959de6c
commit 8a80886358
4 changed files with 35 additions and 16 deletions

View File

@ -2026,6 +2026,25 @@ describe("MatrixClient event timelines", function () {
.respond(200, function () { .respond(200, function () {
return THREAD_ROOT; return THREAD_ROOT;
}); });
httpBackend
.when("GET", "/rooms/!foo%3Abar/event/" + encodeURIComponent(THREAD_ROOT.event_id!))
.respond(200, function () {
return THREAD_ROOT;
});
httpBackend
.when(
"GET",
"/_matrix/client/v1/rooms/!foo%3Abar/relations/" +
encodeURIComponent(THREAD_ROOT.event_id!) +
"/" +
encodeURIComponent(THREAD_RELATION_TYPE.name) +
buildRelationPaginationQuery({ dir: Direction.Backward, limit: 1 }),
)
.respond(200, function () {
return {
chunk: [THREAD_REPLY],
};
});
await Promise.all([httpBackend.flushAllExpected(), utils.syncPromise(client)]); await Promise.all([httpBackend.flushAllExpected(), utils.syncPromise(client)]);
const room = client.getRoom(roomId)!; const room = client.getRoom(roomId)!;

View File

@ -703,7 +703,11 @@ async function createThread(client: MatrixClient, user: string, roomId: string):
root.setThreadId(root.getId()); root.setThreadId(root.getId());
await room.addLiveEvents([root]); await room.addLiveEvents([root]);
return room.createThread(root.getId()!, root, [], false); // Create the thread and wait for it to be initialised
const thread = room.createThread(root.getId()!, root, [], false);
await new Promise<void>((res) => thread.once(RoomEvent.TimelineReset, () => res()));
return thread;
} }
/** /**

View File

@ -2556,7 +2556,7 @@ describe("Room", function () {
next_batch: "start_token", next_batch: "start_token",
}); });
let prom = emitPromise(room, ThreadEvent.New); const prom = emitPromise(room, ThreadEvent.New);
await room.addLiveEvents([randomMessage, threadRoot, threadResponse]); await room.addLiveEvents([randomMessage, threadRoot, threadResponse]);
const thread: Thread = await prom; const thread: Thread = await prom;
await emitPromise(room, ThreadEvent.Update); await emitPromise(room, ThreadEvent.Update);
@ -2583,9 +2583,11 @@ describe("Room", function () {
}, },
}); });
prom = emitPromise(room, ThreadEvent.Update); // XXX: If we add the relation to the thread response before the thread finishes fetching via /relations
await room.addLiveEvents([threadResponseEdit]); // then the test will fail
await prom; await emitPromise(room, ThreadEvent.Update);
await emitPromise(room, ThreadEvent.Update);
await Promise.all([emitPromise(room, ThreadEvent.Update), room.addLiveEvents([threadResponseEdit])]);
expect(thread.replyToEvent!.getContent().body).toBe(threadResponseEdit.getContent()["m.new_content"].body); expect(thread.replyToEvent!.getContent().body).toBe(threadResponseEdit.getContent()["m.new_content"].body);
}); });
@ -2765,7 +2767,7 @@ describe("Room", function () {
"m.relations": { "m.relations": {
"m.thread": { "m.thread": {
latest_event: threadResponse2.event, latest_event: threadResponse2.event,
count: 2, count: 1,
current_user_participated: true, current_user_participated: true,
}, },
}, },
@ -2787,10 +2789,10 @@ describe("Room", function () {
let prom = emitPromise(room, ThreadEvent.New); let prom = emitPromise(room, ThreadEvent.New);
await room.addLiveEvents([threadRoot, threadResponse1]); await room.addLiveEvents([threadRoot, threadResponse1]);
const thread: Thread = await prom; const thread: Thread = await prom;
await emitPromise(room, ThreadEvent.Update);
expect(thread.initialEventsFetched).toBeTruthy(); expect(thread.initialEventsFetched).toBeTruthy();
await room.addLiveEvents([threadResponse2]); await room.addLiveEvents([threadResponse2]);
await emitPromise(room, ThreadEvent.Update);
expect(thread).toHaveLength(2); expect(thread).toHaveLength(2);
expect(thread.replyToEvent!.getId()).toBe(threadResponse2.getId()); expect(thread.replyToEvent!.getId()).toBe(threadResponse2.getId());
@ -2809,11 +2811,10 @@ describe("Room", function () {
}, },
}); });
prom = emitPromise(room, ThreadEvent.Update);
const threadResponse2Redaction = mkRedaction(threadResponse2);
await room.addLiveEvents([threadResponse2Redaction]);
await prom;
await emitPromise(room, ThreadEvent.Update); await emitPromise(room, ThreadEvent.Update);
const threadResponse2Redaction = mkRedaction(threadResponse2);
await emitPromise(room, ThreadEvent.Update);
await room.addLiveEvents([threadResponse2Redaction]);
expect(thread).toHaveLength(1); expect(thread).toHaveLength(1);
expect(thread.replyToEvent!.getId()).toBe(threadResponse1.getId()); expect(thread.replyToEvent!.getId()).toBe(threadResponse1.getId());

View File

@ -326,11 +326,6 @@ export class Thread extends ReadReceipt<ThreadEmittedEvents, ThreadEventHandlerM
public async addEvent(event: MatrixEvent, toStartOfTimeline: boolean, emit = true): Promise<void> { public async addEvent(event: MatrixEvent, toStartOfTimeline: boolean, emit = true): Promise<void> {
this.setEventMetadata(event); this.setEventMetadata(event);
if (!this.initialEventsFetched && !toStartOfTimeline && event.getId() === this.id) {
// We're loading the thread organically
this.initialEventsFetched = true;
}
const lastReply = this.lastReply(); const lastReply = this.lastReply();
const isNewestReply = !lastReply || event.localTimestamp >= lastReply!.localTimestamp; const isNewestReply = !lastReply || event.localTimestamp >= lastReply!.localTimestamp;